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();