summaryrefslogtreecommitdiffstats
path: root/src/com/android/settings/SettingsPreferenceFragment.java
diff options
context:
space:
mode:
authorFabrice Di Meglio <fdimeglio@google.com>2014-04-15 16:45:20 -0700
committerFabrice Di Meglio <fdimeglio@google.com>2014-04-16 16:16:45 -0700
commit6602d02f57ec7375115da26a42357485ff1a778f (patch)
tree0d75cf3c99456fa01e7c0c35e5849690ee3b957a /src/com/android/settings/SettingsPreferenceFragment.java
parentd471e80fd7c00a0f62603f69bb72cba8b451ec75 (diff)
downloadpackages_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.java96
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;