Depend on support lib preferences
Bug: 24576551 Change-Id: Ic6190bacd3f7582c9bbc8de972da4612bd92421e
This commit is contained in:
@@ -24,26 +24,26 @@ import android.content.ContentResolver;
|
||||
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 @@ public abstract class SettingsPreferenceFragment extends InstrumentedPreferenceF
|
||||
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 @@ public abstract class SettingsPreferenceFragment extends InstrumentedPreferenceF
|
||||
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 @@ public abstract class SettingsPreferenceFragment extends InstrumentedPreferenceF
|
||||
return root;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onCreatePreferences(Bundle savedInstanceState, String rootKey) {
|
||||
}
|
||||
|
||||
public FloatingActionButton getFloatingActionButton() {
|
||||
return mFloatingActionButton;
|
||||
}
|
||||
@@ -176,16 +181,16 @@ public abstract class SettingsPreferenceFragment extends InstrumentedPreferenceF
|
||||
|
||||
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 abstract class SettingsPreferenceFragment extends InstrumentedPreferenceF
|
||||
public void unregisterObserverIfNeeded() {
|
||||
if (mIsDataSetObserverRegistered) {
|
||||
if (mCurrentRootAdapter != null) {
|
||||
mCurrentRootAdapter.unregisterDataSetObserver(mDataSetObserver);
|
||||
mCurrentRootAdapter.unregisterAdapterDataObserver(mDataSetObserver);
|
||||
mCurrentRootAdapter = null;
|
||||
}
|
||||
mIsDataSetObserverRegistered = false;
|
||||
@@ -206,6 +211,11 @@ public abstract class SettingsPreferenceFragment extends InstrumentedPreferenceF
|
||||
}
|
||||
}
|
||||
|
||||
private void onDataSetChanged() {
|
||||
highlightPreferenceIfNeeded();
|
||||
updateEmptyView();
|
||||
}
|
||||
|
||||
private Drawable getHighlightDrawable() {
|
||||
if (mHighlightDrawable == null) {
|
||||
mHighlightDrawable = getActivity().getDrawable(R.drawable.preference_highlight);
|
||||
@@ -213,19 +223,92 @@ public abstract class SettingsPreferenceFragment extends InstrumentedPreferenceF
|
||||
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 @@ public abstract class SettingsPreferenceFragment extends InstrumentedPreferenceF
|
||||
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 @@ public abstract class SettingsPreferenceFragment extends InstrumentedPreferenceF
|
||||
// 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 @@ public abstract class SettingsPreferenceFragment extends InstrumentedPreferenceF
|
||||
}
|
||||
}
|
||||
|
||||
protected final Context getPrefContext() {
|
||||
return getPreferenceManager().getContext();
|
||||
}
|
||||
|
||||
public boolean startFragment(Fragment caller, String fragmentClass, int titleRes,
|
||||
int requestCode, Bundle extras) {
|
||||
final Activity activity = getActivity();
|
||||
|
||||
Reference in New Issue
Block a user