Depend on support lib preferences

Bug: 24576551
Change-Id: Ic6190bacd3f7582c9bbc8de972da4612bd92421e
diff --git a/src/com/android/settings/SettingsPreferenceFragment.java b/src/com/android/settings/SettingsPreferenceFragment.java
index 61b9753..34c773a 100644
--- a/src/com/android/settings/SettingsPreferenceFragment.java
+++ b/src/com/android/settings/SettingsPreferenceFragment.java
@@ -24,26 +24,26 @@
 import android.content.Context;
 import android.content.DialogInterface;
 import android.content.pm.PackageManager;
-import android.database.DataSetObserver;
 import android.graphics.drawable.Drawable;
 import android.os.Bundle;
-import android.preference.Preference;
-import android.preference.PreferenceActivity;
-import android.preference.PreferenceGroupAdapter;
+import android.support.v7.preference.Preference;
+import android.support.v7.preference.PreferenceGroupAdapter;
+import android.support.v7.preference.PreferenceScreen;
+import android.support.v7.widget.RecyclerView;
 import android.text.TextUtils;
 import android.util.Log;
 import android.view.LayoutInflater;
 import android.view.Menu;
 import android.view.MenuInflater;
-import android.view.MenuItem;
 import android.view.View;
 import android.view.ViewGroup;
 import android.widget.Button;
-import android.widget.ListAdapter;
-import android.widget.ListView;
 
+import com.android.settings.applications.LayoutPreference;
 import com.android.settings.widget.FloatingActionButton;
 
+import java.util.UUID;
+
 /**
  * Base class for Settings fragments, with some helper functions and dialog management.
  */
@@ -67,17 +67,13 @@
     private boolean mPreferenceHighlighted = false;
     private Drawable mHighlightDrawable;
 
-    private ListAdapter mCurrentRootAdapter;
+    private RecyclerView.Adapter mCurrentRootAdapter;
     private boolean mIsDataSetObserverRegistered = false;
-    private DataSetObserver mDataSetObserver = new DataSetObserver() {
+    private RecyclerView.AdapterDataObserver mDataSetObserver =
+            new RecyclerView.AdapterDataObserver() {
         @Override
         public void onChanged() {
-            highlightPreferenceIfNeeded();
-        }
-
-        @Override
-        public void onInvalidated() {
-            highlightPreferenceIfNeeded();
+            onDataSetChanged();
         }
     };
 
@@ -85,6 +81,11 @@
     private FloatingActionButton mFloatingActionButton;
     private ViewGroup mButtonBar;
 
+    private LayoutPreference mHeader;
+
+    private LayoutPreference mFooter;
+    private View mEmptyView;
+
     @Override
     public void onCreate(Bundle icicle) {
         super.onCreate(icicle);
@@ -110,6 +111,10 @@
         return root;
     }
 
+    @Override
+    public void onCreatePreferences(Bundle savedInstanceState, String rootKey) {
+    }
+
     public FloatingActionButton getFloatingActionButton() {
         return mFloatingActionButton;
     }
@@ -176,16 +181,16 @@
 
     public void showLoadingWhenEmpty() {
         View loading = getView().findViewById(R.id.loading_container);
-        getListView().setEmptyView(loading);
+        setEmptyView(loading);
     }
 
     public void registerObserverIfNeeded() {
         if (!mIsDataSetObserverRegistered) {
             if (mCurrentRootAdapter != null) {
-                mCurrentRootAdapter.unregisterDataSetObserver(mDataSetObserver);
+                mCurrentRootAdapter.unregisterAdapterDataObserver(mDataSetObserver);
             }
-            mCurrentRootAdapter = getPreferenceScreen().getRootAdapter();
-            mCurrentRootAdapter.registerDataSetObserver(mDataSetObserver);
+            mCurrentRootAdapter = getListView().getAdapter();
+            mCurrentRootAdapter.registerAdapterDataObserver(mDataSetObserver);
             mIsDataSetObserverRegistered = true;
         }
     }
@@ -193,7 +198,7 @@
     public void unregisterObserverIfNeeded() {
         if (mIsDataSetObserverRegistered) {
             if (mCurrentRootAdapter != null) {
-                mCurrentRootAdapter.unregisterDataSetObserver(mDataSetObserver);
+                mCurrentRootAdapter.unregisterAdapterDataObserver(mDataSetObserver);
                 mCurrentRootAdapter = null;
             }
             mIsDataSetObserverRegistered = false;
@@ -206,6 +211,11 @@
         }
     }
 
+    private void onDataSetChanged() {
+        highlightPreferenceIfNeeded();
+        updateEmptyView();
+    }
+
     private Drawable getHighlightDrawable() {
         if (mHighlightDrawable == null) {
             mHighlightDrawable = getActivity().getDrawable(R.drawable.preference_highlight);
@@ -213,19 +223,92 @@
         return mHighlightDrawable;
     }
 
+    public LayoutPreference getHeaderView() {
+        return mHeader;
+    }
+
+    public LayoutPreference getFooterView() {
+        return mFooter;
+    }
+
+    protected void setHeaderView(int resource) {
+        mHeader = new LayoutPreference(getPrefContext(), resource);
+        mHeader.setOrder(-1);
+        if (getPreferenceScreen() != null) {
+            getPreferenceScreen().addPreference(mHeader);
+        }
+    }
+
+    protected void setFooterView(int resource) {
+        setFooterView(resource != 0 ? new LayoutPreference(getPrefContext(), resource) : null);
+    }
+
+    protected void setFooterView(View v) {
+        setFooterView(v != null ? new LayoutPreference(getPrefContext(), v) : null);
+    }
+
+    private void setFooterView(LayoutPreference footer) {
+        if (getPreferenceScreen() != null && mFooter != null) {
+            getPreferenceScreen().removePreference(mFooter);
+        }
+        if (footer != null) {
+            mFooter = footer;
+            mFooter.setOrder(Integer.MAX_VALUE);
+            if (getPreferenceScreen() != null) {
+                getPreferenceScreen().addPreference(mFooter);
+            }
+        } else {
+            mFooter = null;
+        }
+    }
+
+    @Override
+    public void setPreferenceScreen(PreferenceScreen preferenceScreen) {
+        super.setPreferenceScreen(preferenceScreen);
+        if (preferenceScreen != null) {
+            if (mHeader != null) {
+                preferenceScreen.addPreference(mHeader);
+            }
+            if (mFooter != null) {
+                preferenceScreen.addPreference(mFooter);
+            }
+        }
+    }
+
+    private void updateEmptyView() {
+        if (mEmptyView == null) return;
+        if (getPreferenceScreen() != null) {
+            boolean show = (getPreferenceScreen().getPreferenceCount()
+                    - (mHeader != null ? 1 : 0)
+                    - (mFooter != null ? 1 : 0)) <= 0;
+            mEmptyView.setVisibility(show ? View.VISIBLE : View.GONE);
+        } else {
+            mEmptyView.setVisibility(View.VISIBLE);
+        }
+    }
+
+    public void setEmptyView(View v) {
+        mEmptyView = v;
+        updateEmptyView();
+    }
+
+    public View getEmptyView() {
+        return mEmptyView;
+    }
+
     /**
      * Return a valid ListView position or -1 if none is found
      */
     private int canUseListViewForHighLighting(String key) {
-        if (!hasListView()) {
+        if (getListView() == null) {
             return -1;
         }
 
-        ListView listView = getListView();
-        ListAdapter adapter = listView.getAdapter();
+        RecyclerView listView = getListView();
+        RecyclerView.Adapter adapter = listView.getAdapter();
 
         if (adapter != null && adapter instanceof PreferenceGroupAdapter) {
-            return findListPositionFromKey(adapter, key);
+            return findListPositionFromKey((PreferenceGroupAdapter) adapter, key);
         }
 
         return -1;
@@ -238,45 +321,44 @@
         if (position >= 0) {
             mPreferenceHighlighted = true;
 
-            final ListView listView = getListView();
-            final ListAdapter adapter = listView.getAdapter();
-
-            ((PreferenceGroupAdapter) adapter).setHighlightedDrawable(highlight);
-            ((PreferenceGroupAdapter) adapter).setHighlighted(position);
-
-            listView.post(new Runnable() {
-                @Override
-                public void run() {
-                    listView.setSelection(position);
-                    listView.postDelayed(new Runnable() {
-                        @Override
-                        public void run() {
-                            final int index = position - listView.getFirstVisiblePosition();
-                            if (index >= 0 && index < listView.getChildCount()) {
-                                final View v = listView.getChildAt(index);
-                                final int centerX = v.getWidth() / 2;
-                                final int centerY = v.getHeight() / 2;
-                                highlight.setHotspot(centerX, centerY);
-                                v.setPressed(true);
-                                v.setPressed(false);
-                            }
-                        }
-                    }, DELAY_HIGHLIGHT_DURATION_MILLIS);
-                }
-            });
+            // TODO: Need to find a way to scroll to and highlight search items now
+            // that we are using RecyclerView instead.
+//            final RecyclerView listView = getListView();
+//            final RecyclerView.Adapter adapter = listView.getAdapter();
+//
+////            ((PreferenceGroupAdapter) adapter).setHighlightedDrawable(highlight);
+////            ((PreferenceGroupAdapter) adapter).setHighlighted(position);
+//
+//            listView.post(new Runnable() {
+//                @Override
+//                public void run() {
+//                    listView.setSelection(position);
+//                    listView.postDelayed(new Runnable() {
+//                        @Override
+//                        public void run() {
+//                            final int index = position - listView.getFirstVisiblePosition();
+//                            if (index >= 0 && index < listView.getChildCount()) {
+//                                final View v = listView.getChildAt(index);
+//                                final int centerX = v.getWidth() / 2;
+//                                final int centerY = v.getHeight() / 2;
+//                                highlight.setHotspot(centerX, centerY);
+//                                v.setPressed(true);
+//                                v.setPressed(false);
+//                            }
+//                        }
+//                    }, DELAY_HIGHLIGHT_DURATION_MILLIS);
+//                }
+//            });
         }
     }
 
-    private int findListPositionFromKey(ListAdapter adapter, String key) {
-        final int count = adapter.getCount();
+    private int findListPositionFromKey(PreferenceGroupAdapter adapter, String key) {
+        final int count = adapter.getItemCount();
         for (int n = 0; n < count; n++) {
-            final Object item = adapter.getItem(n);
-            if (item instanceof Preference) {
-                Preference preference = (Preference) item;
-                final String preferenceKey = preference.getKey();
-                if (preferenceKey != null && preferenceKey.equals(key)) {
-                    return n;
-                }
+            final Preference preference = adapter.getItem(n);
+            final String preferenceKey = preference.getKey();
+            if (preferenceKey != null && preferenceKey.equals(key)) {
+                return n;
             }
         }
         return -1;
@@ -400,6 +482,31 @@
         // override in subclass to attach a dismiss listener, for instance
     }
 
+    @Override
+    public void onDisplayPreferenceDialog(Preference preference) {
+        if (preference.getKey() == null) {
+            // Auto-key preferences that don't have a key, so the dialog can find them.
+            preference.setKey(UUID.randomUUID().toString());
+        }
+        DialogFragment f = null;
+        if (preference instanceof CustomListPreference) {
+            f = CustomListPreference.CustomListPreferenceDialogFragment
+                    .newInstance(preference.getKey());
+        } else if (preference instanceof CustomDialogPreference) {
+            f = CustomDialogPreference.CustomPreferenceDialogFragment
+                    .newInstance(preference.getKey());
+        } else if (preference instanceof CustomEditTextPreference) {
+            f = CustomEditTextPreference.CustomPreferenceDialogFragment
+                    .newInstance(preference.getKey());
+        } else {
+            super.onDisplayPreferenceDialog(preference);
+            return;
+        }
+        f.setTargetFragment(this, 0);
+        f.show(getFragmentManager(), "dialog_preference");
+        onDialogShowing();
+    }
+
     public static class SettingsDialogFragment extends DialogFragment {
         private static final String KEY_DIALOG_ID = "key_dialog_id";
         private static final String KEY_PARENT_FRAGMENT_ID = "key_parent_fragment_id";
@@ -517,6 +624,10 @@
         }
     }
 
+    protected final Context getPrefContext() {
+        return getPreferenceManager().getContext();
+    }
+
     public boolean startFragment(Fragment caller, String fragmentClass, int titleRes,
             int requestCode, Bundle extras) {
         final Activity activity = getActivity();