diff options
author | Fabrice Di Meglio <fdimeglio@google.com> | 2014-04-15 16:45:20 -0700 |
---|---|---|
committer | Fabrice Di Meglio <fdimeglio@google.com> | 2014-04-16 16:16:45 -0700 |
commit | 6602d02f57ec7375115da26a42357485ff1a778f (patch) | |
tree | 0d75cf3c99456fa01e7c0c35e5849690ee3b957a /src/com/android/settings/SettingsPreferenceFragment.java | |
parent | d471e80fd7c00a0f62603f69bb72cba8b451ec75 (diff) | |
download | packages_apps_Settings-6602d02f57ec7375115da26a42357485ff1a778f.zip packages_apps_Settings-6602d02f57ec7375115da26a42357485ff1a778f.tar.gz packages_apps_Settings-6602d02f57ec7375115da26a42357485ff1a778f.tar.bz2 |
Improve Preference highlighting from a Search result
- fix computation of the Preference position in its PreferenceScreen
- use "highlight" (scrolling and Ripple effect) for showing the result
- "highlight" is only done once
Change-Id: I232d79d795b0983beac5a9fec3dfbe9da329c98f
Diffstat (limited to 'src/com/android/settings/SettingsPreferenceFragment.java')
-rw-r--r-- | src/com/android/settings/SettingsPreferenceFragment.java | 96 |
1 files changed, 69 insertions, 27 deletions
diff --git a/src/com/android/settings/SettingsPreferenceFragment.java b/src/com/android/settings/SettingsPreferenceFragment.java index d575153..ad924d6 100644 --- a/src/com/android/settings/SettingsPreferenceFragment.java +++ b/src/com/android/settings/SettingsPreferenceFragment.java @@ -23,10 +23,11 @@ import android.content.ContentResolver; import android.content.Context; import android.content.DialogInterface; import android.content.pm.PackageManager; +import android.content.res.TypedArray; +import android.graphics.drawable.Drawable; import android.os.Bundle; import android.preference.Preference; import android.preference.PreferenceFragment; -import android.preference.PreferenceGroup; import android.preference.PreferenceGroupAdapter; import android.text.TextUtils; import android.util.Log; @@ -35,6 +36,7 @@ import android.view.MenuInflater; import android.view.MenuItem; import android.widget.Button; import android.widget.ListAdapter; +import android.widget.ListView; /** * Base class for Settings fragments, with some helper functions and dialog management. @@ -44,7 +46,9 @@ public class SettingsPreferenceFragment extends PreferenceFragment implements Di private static final String TAG = "SettingsPreferenceFragment"; private static final int MENU_HELP = Menu.FIRST + 100; - private static final int HIGHLIGHT_DURATION_MILLIS = 750; + private static final int HIGHLIGHT_DURATION_MILLIS = 300; + + private static final String SAVE_HIGHLIGHTED_KEY = "android:preference_highlighted"; private SettingsDialogFragment mDialogFragment; @@ -53,10 +57,16 @@ public class SettingsPreferenceFragment extends PreferenceFragment implements Di // Cache the content resolver for async callbacks private ContentResolver mContentResolver; + private boolean mPreferenceHighlighted = false; + @Override public void onCreate(Bundle icicle) { super.onCreate(icicle); + if (icicle != null) { + mPreferenceHighlighted = icicle.getBoolean(SAVE_HIGHLIGHTED_KEY); + } + // Prepare help url and enable menu if necessary int helpResource = getHelpResource(); if (helpResource != 0) { @@ -65,6 +75,13 @@ public class SettingsPreferenceFragment extends PreferenceFragment implements Di } @Override + public void onSaveInstanceState(Bundle outState) { + super.onSaveInstanceState(outState); + + outState.putBoolean(SAVE_HIGHLIGHTED_KEY, mPreferenceHighlighted); + } + + @Override public void onActivityCreated(Bundle savedInstanceState) { super.onActivityCreated(savedInstanceState); if (!TextUtils.isEmpty(mHelpUrl)) { @@ -74,40 +91,65 @@ public class SettingsPreferenceFragment extends PreferenceFragment implements Di final Bundle args = getArguments(); if (args != null) { final String key = args.getString(SettingsActivity.EXTRA_FRAGMENT_ARG_KEY); - final int position = findPositionFromKey(getPreferenceScreen(), key); - if (position >= 0) { - final ListAdapter adapter = getListView().getAdapter(); - if (adapter instanceof PreferenceGroupAdapter) { - ((PreferenceGroupAdapter) adapter).setActivated(position); - - getListView().postDelayed(new Runnable() { - @Override - public void run() { - ((PreferenceGroupAdapter) adapter).setActivated(-1); - ((PreferenceGroupAdapter) adapter).notifyDataSetChanged(); + if (hasListView() && !TextUtils.isEmpty(key)) { + highlightPreference(key); + } + } + } + + private void highlightPreference(String key) { + final int position = findPositionFromKey(key); + if (position >= 0) { + final ListView listView = getListView(); + final ListAdapter adapter = listView.getAdapter(); + + if (adapter instanceof PreferenceGroupAdapter) { + final Drawable drawable = getHighlightDrawable(); + ((PreferenceGroupAdapter) adapter).setHighlightedDrawable(drawable); + ((PreferenceGroupAdapter) adapter).setHighlighted(position); + + listView.post(new Runnable() { + @Override + public void run() { + listView.setSelection(position); + if (!mPreferenceHighlighted) { + listView.postDelayed(new Runnable() { + @Override + public void run() { + final int centerX = listView.getWidth() / 2; + final int centerY = listView.getChildAt(0).getHeight() / 2; + drawable.setHotspot(0, centerX, centerY); + drawable.clearHotspots(); + ((PreferenceGroupAdapter) adapter).setHighlighted(-1); + } + }, HIGHLIGHT_DURATION_MILLIS); + + mPreferenceHighlighted = true; } - }, HIGHLIGHT_DURATION_MILLIS); - } + } + }); } } + } - private int findPositionFromKey(PreferenceGroup group, String key) { - if (group != null) { - int count = group.getPreferenceCount(); - for (int n = 0; n < count; n++) { - final Preference preference = group.getPreference(n); + private Drawable getHighlightDrawable() { + final int[] attrs = new int[] { android.R.attr.selectableItemBackground }; + TypedArray ta = getActivity().getTheme().obtainStyledAttributes(attrs); + return ta.getDrawable(0); + } + + private int findPositionFromKey(String key) { + final ListAdapter adapter = getListView().getAdapter(); + final int count = adapter.getCount(); + for (int n = 0; n < count; n++) { + 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; } - if (preference instanceof PreferenceGroup) { - PreferenceGroup nestedGroup = (PreferenceGroup) preference; - final int nestedPosition = findPositionFromKey(nestedGroup, key); - if (nestedPosition >= 0) { - return n + 1 + nestedPosition; - } - } } } return -1; |