summaryrefslogtreecommitdiffstats
path: root/src/com/android/settings/SettingsPreferenceFragment.java
diff options
context:
space:
mode:
authorFabrice Di Meglio <fdimeglio@google.com>2014-04-17 17:20:27 -0700
committerFabrice Di Meglio <fdimeglio@google.com>2014-04-18 13:42:46 -0700
commitf2a5226c1e981ebb0c34aaf39524c382f996196a (patch)
treec8500a2dd5a195bad64fca35045040ce77d51742 /src/com/android/settings/SettingsPreferenceFragment.java
parent5035ec6944d907864977c19f356a11d39c41e0c5 (diff)
downloadpackages_apps_Settings-f2a5226c1e981ebb0c34aaf39524c382f996196a.zip
packages_apps_Settings-f2a5226c1e981ebb0c34aaf39524c382f996196a.tar.gz
packages_apps_Settings-f2a5226c1e981ebb0c34aaf39524c382f996196a.tar.bz2
Improve Preference highlighting
- use PreferenceFragment.onBindPreferences() to launch highlighting - improve SettingsPreferenceFragment code for highlighting: now we can find the View to highlight thru its Tag if there is no ListAdapter available - add HighlightingFragment for highlighting a View from its tag/key. This is dealing with cases when the content is custom and not relying on SettingsPreferenceFragment (like DataUsageSummary) Also: - improve DataUsageSummary so that onResume() is not recreating the Tabs all the time - add missing "android:keys" on some Security Settings preference files Change-Id: Ib1dd8238fe2fb57c151d584c0810a0e0a5ad97c4
Diffstat (limited to 'src/com/android/settings/SettingsPreferenceFragment.java')
-rw-r--r--src/com/android/settings/SettingsPreferenceFragment.java150
1 files changed, 105 insertions, 45 deletions
diff --git a/src/com/android/settings/SettingsPreferenceFragment.java b/src/com/android/settings/SettingsPreferenceFragment.java
index e27c9ed..5e0c06d 100644
--- a/src/com/android/settings/SettingsPreferenceFragment.java
+++ b/src/com/android/settings/SettingsPreferenceFragment.java
@@ -33,6 +33,8 @@ import android.util.Log;
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;
@@ -45,7 +47,7 @@ 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 = 300;
+ private static final int DELAY_HIGHLIGHT_DURATION_MILLIS = 300;
private static final String SAVE_HIGHLIGHTED_KEY = "android:preference_highlighted";
@@ -56,6 +58,7 @@ public class SettingsPreferenceFragment extends PreferenceFragment implements Di
// Cache the content resolver for async callbacks
private ContentResolver mContentResolver;
+ private String mPreferenceKey;
private boolean mPreferenceHighlighted = false;
@Override
@@ -89,69 +92,126 @@ public class SettingsPreferenceFragment extends PreferenceFragment implements Di
final Bundle args = getArguments();
if (args != null) {
- final String key = args.getString(SettingsActivity.EXTRA_FRAGMENT_ARG_KEY);
- if (hasListView() && !TextUtils.isEmpty(key)) {
- highlightPreference(key);
- }
+ mPreferenceKey = args.getString(SettingsActivity.EXTRA_FRAGMENT_ARG_KEY);
+ highlightPreferenceIfNeeded();
+ }
+ }
+
+ @Override
+ protected void onBindPreferences() {
+ highlightPreferenceIfNeeded();
+ }
+
+ public void highlightPreferenceIfNeeded() {
+ if (!mPreferenceHighlighted &&!TextUtils.isEmpty(mPreferenceKey)) {
+ highlightPreference(mPreferenceKey);
}
}
+ private Drawable getHighlightDrawable() {
+ return getResources().getDrawable(R.drawable.preference_highlight);
+ }
+
+ /**
+ * Return a valid ListView position or -1 if none is found
+ */
+ private int canUseListViewForHighLighting(String key) {
+ if (!hasListView()) {
+ return -1;
+ }
+
+ ListView listView = getListView();
+ ListAdapter adapter = listView.getAdapter();
+
+ if (adapter != null && adapter instanceof PreferenceGroupAdapter) {
+ return findListPositionFromKey(adapter, key);
+ }
+
+ return -1;
+ }
+
private void highlightPreference(String key) {
- final int position = findPositionFromKey(key);
+ final Drawable highlight = getHighlightDrawable();
+
+ final int position = canUseListViewForHighLighting(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;
+ ((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 centerX = listView.getWidth() / 2;
+ final int centerY = listView.getChildAt(0).getHeight() / 2;
+ highlight.setHotspot(0, centerX, centerY);
+ highlight.clearHotspots();
+ ((PreferenceGroupAdapter) adapter).setHighlighted(-1);
}
- }
- });
+ }, DELAY_HIGHLIGHT_DURATION_MILLIS);
+
+ mPreferenceHighlighted = true;
+ }
+ });
+ } else {
+ // Try locating the Preference View thru its tag
+ View preferenceView = findPreferenceViewForKey(getView(), key);
+ if (preferenceView != null ) {
+ preferenceView.setBackground(highlight);
+ final int centerX = preferenceView.getWidth() / 2;
+ final int centerY = preferenceView.getHeight() / 2;
+ highlight.setHotspot(0, centerX, centerY);
+ highlight.clearHotspots();
}
}
-
}
- private Drawable getHighlightDrawable() {
- return getResources().getDrawable(R.drawable.preference_highlight);
+ private int findListPositionFromKey(ListAdapter adapter, String key) {
+ final int count = adapter.getCount();
+ 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;
+ }
+ }
+ }
+ return -1;
}
- private int findPositionFromKey(String key) {
- final ListAdapter adapter = getListView().getAdapter();
- if (adapter != null) {
- final int count = adapter.getCount();
+ private View findPreferenceViewForKey(View root, String key) {
+ if (checkTag(root, key)) {
+ return root;
+ }
+ if (root instanceof ViewGroup) {
+ final ViewGroup group = (ViewGroup) root;
+ final int count = group.getChildCount();
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;
- }
+ final View child = group.getChildAt(n);
+ final View view = findPreferenceViewForKey(child, key);
+ if (view != null) {
+ return view;
}
}
}
- return -1;
+ return null;
+ }
+
+ private boolean checkTag(View view, String key) {
+ final Object tag = view.getTag();
+ if (tag == null || !(tag instanceof String)) {
+ return false;
+ }
+ final String prefKey = (String) tag;
+ return (!TextUtils.isEmpty(prefKey) && prefKey.equals(key));
}
protected void removePreference(String key) {