Merge "Improve Preference highlighting from a Search result"
This commit is contained in:
committed by
Android (Google) Code Review
commit
cd22f27f73
@@ -23,10 +23,11 @@ import android.content.ContentResolver;
|
|||||||
import android.content.Context;
|
import android.content.Context;
|
||||||
import android.content.DialogInterface;
|
import android.content.DialogInterface;
|
||||||
import android.content.pm.PackageManager;
|
import android.content.pm.PackageManager;
|
||||||
|
import android.content.res.TypedArray;
|
||||||
|
import android.graphics.drawable.Drawable;
|
||||||
import android.os.Bundle;
|
import android.os.Bundle;
|
||||||
import android.preference.Preference;
|
import android.preference.Preference;
|
||||||
import android.preference.PreferenceFragment;
|
import android.preference.PreferenceFragment;
|
||||||
import android.preference.PreferenceGroup;
|
|
||||||
import android.preference.PreferenceGroupAdapter;
|
import android.preference.PreferenceGroupAdapter;
|
||||||
import android.text.TextUtils;
|
import android.text.TextUtils;
|
||||||
import android.util.Log;
|
import android.util.Log;
|
||||||
@@ -35,6 +36,7 @@ import android.view.MenuInflater;
|
|||||||
import android.view.MenuItem;
|
import android.view.MenuItem;
|
||||||
import android.widget.Button;
|
import android.widget.Button;
|
||||||
import android.widget.ListAdapter;
|
import android.widget.ListAdapter;
|
||||||
|
import android.widget.ListView;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Base class for Settings fragments, with some helper functions and dialog management.
|
* 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 String TAG = "SettingsPreferenceFragment";
|
||||||
|
|
||||||
private static final int MENU_HELP = Menu.FIRST + 100;
|
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;
|
private SettingsDialogFragment mDialogFragment;
|
||||||
|
|
||||||
@@ -53,10 +57,16 @@ public class SettingsPreferenceFragment extends PreferenceFragment implements Di
|
|||||||
// Cache the content resolver for async callbacks
|
// Cache the content resolver for async callbacks
|
||||||
private ContentResolver mContentResolver;
|
private ContentResolver mContentResolver;
|
||||||
|
|
||||||
|
private boolean mPreferenceHighlighted = false;
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void onCreate(Bundle icicle) {
|
public void onCreate(Bundle icicle) {
|
||||||
super.onCreate(icicle);
|
super.onCreate(icicle);
|
||||||
|
|
||||||
|
if (icicle != null) {
|
||||||
|
mPreferenceHighlighted = icicle.getBoolean(SAVE_HIGHLIGHTED_KEY);
|
||||||
|
}
|
||||||
|
|
||||||
// Prepare help url and enable menu if necessary
|
// Prepare help url and enable menu if necessary
|
||||||
int helpResource = getHelpResource();
|
int helpResource = getHelpResource();
|
||||||
if (helpResource != 0) {
|
if (helpResource != 0) {
|
||||||
@@ -64,6 +74,13 @@ public class SettingsPreferenceFragment extends PreferenceFragment implements Di
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onSaveInstanceState(Bundle outState) {
|
||||||
|
super.onSaveInstanceState(outState);
|
||||||
|
|
||||||
|
outState.putBoolean(SAVE_HIGHLIGHTED_KEY, mPreferenceHighlighted);
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void onActivityCreated(Bundle savedInstanceState) {
|
public void onActivityCreated(Bundle savedInstanceState) {
|
||||||
super.onActivityCreated(savedInstanceState);
|
super.onActivityCreated(savedInstanceState);
|
||||||
@@ -74,40 +91,65 @@ public class SettingsPreferenceFragment extends PreferenceFragment implements Di
|
|||||||
final Bundle args = getArguments();
|
final Bundle args = getArguments();
|
||||||
if (args != null) {
|
if (args != null) {
|
||||||
final String key = args.getString(SettingsActivity.EXTRA_FRAGMENT_ARG_KEY);
|
final String key = args.getString(SettingsActivity.EXTRA_FRAGMENT_ARG_KEY);
|
||||||
final int position = findPositionFromKey(getPreferenceScreen(), key);
|
if (hasListView() && !TextUtils.isEmpty(key)) {
|
||||||
if (position >= 0) {
|
highlightPreference(key);
|
||||||
final ListAdapter adapter = getListView().getAdapter();
|
}
|
||||||
if (adapter instanceof PreferenceGroupAdapter) {
|
}
|
||||||
((PreferenceGroupAdapter) adapter).setActivated(position);
|
}
|
||||||
|
|
||||||
getListView().postDelayed(new Runnable() {
|
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
|
@Override
|
||||||
public void run() {
|
public void run() {
|
||||||
((PreferenceGroupAdapter) adapter).setActivated(-1);
|
listView.setSelection(position);
|
||||||
((PreferenceGroupAdapter) adapter).notifyDataSetChanged();
|
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);
|
}, HIGHLIGHT_DURATION_MILLIS);
|
||||||
|
|
||||||
|
mPreferenceHighlighted = true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private int findPositionFromKey(PreferenceGroup group, String key) {
|
}
|
||||||
if (group != null) {
|
|
||||||
int count = group.getPreferenceCount();
|
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++) {
|
for (int n = 0; n < count; n++) {
|
||||||
final Preference preference = group.getPreference(n);
|
Object item = adapter.getItem(n);
|
||||||
|
if (item instanceof Preference) {
|
||||||
|
Preference preference = (Preference) item;
|
||||||
final String preferenceKey = preference.getKey();
|
final String preferenceKey = preference.getKey();
|
||||||
if (preferenceKey != null && preferenceKey.equals(key)) {
|
if (preferenceKey != null && preferenceKey.equals(key)) {
|
||||||
return n;
|
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;
|
return -1;
|
||||||
|
Reference in New Issue
Block a user