Depend on support lib preferences

Bug: 24576551
Change-Id: Ic6190bacd3f7582c9bbc8de972da4612bd92421e
This commit is contained in:
Jason Monk
2015-09-10 15:52:51 -04:00
parent 136ed7b6b2
commit 39b467482d
308 changed files with 2684 additions and 1762 deletions

View File

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