Loading res/color/preference_highligh_color.xml 0 → 100644 +20 −0 Original line number Diff line number Diff line <?xml version="1.0" encoding="utf-8"?> <!-- Copyright (C) 2018 The Android Open Source Project Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. --> <selector xmlns:android="http://schemas.android.com/apk/res/android"> <item android:alpha="0.1" android:color="?android:attr/colorAccent" /> </selector> No newline at end of file res/values/ids.xml +1 −1 Original line number Diff line number Diff line Loading @@ -17,7 +17,7 @@ */ --> <resources> <item type="id" name="preference_highlight_key" /> <item type="id" name="preference_highlighted" /> <item type="id" name="lock_none" /> <item type="id" name="lock_pin" /> Loading res/values/strings.xml +1 −1 Original line number Diff line number Diff line Loading @@ -6145,7 +6145,7 @@ <!-- User settings --> <skip/> <!-- User settings screen title [CHAR LIMIT=25] --> <!-- User settings screen title [CHAR LIMIT=40] --> <string name="user_settings_title">Multiple users</string> <!-- User settings header for list of users and profiles [CHAR LIMIT=40] --> <string name="user_list_title">Users & profiles</string> Loading src/com/android/settings/SettingsPreferenceFragment.java +21 −104 Original line number Diff line number Diff line Loading @@ -30,9 +30,7 @@ import android.support.annotation.VisibleForTesting; import android.support.annotation.XmlRes; import android.support.v7.preference.Preference; import android.support.v7.preference.PreferenceGroup; import android.support.v7.preference.PreferenceGroupAdapter; import android.support.v7.preference.PreferenceScreen; import android.support.v7.preference.PreferenceViewHolder; import android.support.v7.widget.LinearLayoutManager; import android.support.v7.widget.RecyclerView; import android.text.TextUtils; Loading @@ -49,6 +47,7 @@ import com.android.settings.core.instrumentation.InstrumentedDialogFragment; import com.android.settings.search.actionbar.SearchMenuController; import com.android.settings.support.actionbar.HelpMenuController; import com.android.settings.support.actionbar.HelpResourceProvider; import com.android.settings.widget.HighlightablePreferenceGroupAdapter; import com.android.settings.widget.LoadingViewController; import com.android.settingslib.CustomDialogPreference; import com.android.settingslib.CustomEditTextPreference; Loading @@ -65,9 +64,6 @@ public abstract class SettingsPreferenceFragment extends InstrumentedPreferenceF private static final String TAG = "SettingsPreference"; @VisibleForTesting static final int DELAY_HIGHLIGHT_DURATION_MILLIS = 600; private static final String SAVE_HIGHLIGHTED_KEY = "android:preference_highlighted"; protected final FooterPreferenceMixin mFooterPreferenceMixin = Loading @@ -75,14 +71,11 @@ public abstract class SettingsPreferenceFragment extends InstrumentedPreferenceF private static final int ORDER_FIRST = -1; private static final int ORDER_LAST = Integer.MAX_VALUE -1; private SettingsDialogFragment mDialogFragment; // Cache the content resolver for async callbacks private ContentResolver mContentResolver; private String mPreferenceKey; private RecyclerView.Adapter mCurrentRootAdapter; private boolean mIsDataSetObserverRegistered = false; private RecyclerView.AdapterDataObserver mDataSetObserver = Loading Loading @@ -146,8 +139,9 @@ public abstract class SettingsPreferenceFragment extends InstrumentedPreferenceF // Check if we should keep the preferences expanded. if (arguments != null) { mPreferenceKey = arguments.getString(SettingsActivity.EXTRA_FRAGMENT_ARG_KEY); if (!TextUtils.isEmpty(mPreferenceKey)) { final String highlightKey = arguments.getString(SettingsActivity.EXTRA_FRAGMENT_ARG_KEY); if (!TextUtils.isEmpty(highlightKey)) { final PreferenceScreen screen = getPreferenceScreen(); if (screen != null) { screen.setInitialExpandedChildrenCount(Integer.MAX_VALUE); Loading Loading @@ -205,7 +199,9 @@ public abstract class SettingsPreferenceFragment extends InstrumentedPreferenceF public void onSaveInstanceState(Bundle outState) { super.onSaveInstanceState(outState); outState.putBoolean(SAVE_HIGHLIGHTED_KEY, mPreferenceHighlighted); if (mAdapter != null) { outState.putBoolean(SAVE_HIGHLIGHTED_KEY, mAdapter.isHighlightRequested()); } } @Override Loading @@ -217,11 +213,8 @@ public abstract class SettingsPreferenceFragment extends InstrumentedPreferenceF @Override public void onResume() { super.onResume(); if (mPreferenceKey != null) { highlightPreferenceIfNeeded(); } } @Override protected void onBindPreferences() { Loading Loading @@ -263,13 +256,11 @@ public abstract class SettingsPreferenceFragment extends InstrumentedPreferenceF } public void highlightPreferenceIfNeeded() { if (isAdded() && !mPreferenceHighlighted &&!TextUtils.isEmpty(mPreferenceKey)) { getView().postDelayed(new Runnable() { @Override public void run() { highlightPreference(mPreferenceKey); if (!isAdded()) { return; } }, DELAY_HIGHLIGHT_DURATION_MILLIS); if (mAdapter != null) { mAdapter.requestHighlight(getView(), getListView()); } } Loading Loading @@ -340,24 +331,6 @@ public abstract class SettingsPreferenceFragment extends InstrumentedPreferenceF return mEmptyView; } /** * Return a valid ListView position or -1 if none is found */ private int canUseListViewForHighLighting(String key) { if (getListView() == null) { return -1; } RecyclerView listView = getListView(); RecyclerView.Adapter adapter = listView.getAdapter(); if (adapter != null && adapter instanceof PreferenceGroupAdapter) { return findListPositionFromKey((PreferenceGroupAdapter) adapter, key); } return -1; } @Override public RecyclerView.LayoutManager onCreateLayoutManager() { mLayoutManager = new LinearLayoutManager(getContext()); Loading @@ -366,7 +339,9 @@ public abstract class SettingsPreferenceFragment extends InstrumentedPreferenceF @Override protected RecyclerView.Adapter onCreateAdapter(PreferenceScreen preferenceScreen) { mAdapter = new HighlightablePreferenceGroupAdapter(preferenceScreen); mAdapter = new HighlightablePreferenceGroupAdapter(preferenceScreen, getArguments().getString(SettingsActivity.EXTRA_FRAGMENT_ARG_KEY), mPreferenceHighlighted); return mAdapter; } Loading @@ -375,7 +350,7 @@ public abstract class SettingsPreferenceFragment extends InstrumentedPreferenceF } protected void cacheRemoveAllPrefs(PreferenceGroup group) { mPreferenceCache = new ArrayMap<String, Preference>(); mPreferenceCache = new ArrayMap<>(); final int N = group.getPreferenceCount(); for (int i = 0; i < N; i++) { Preference p = group.getPreference(i); Loading @@ -401,29 +376,6 @@ public abstract class SettingsPreferenceFragment extends InstrumentedPreferenceF return mPreferenceCache != null ? mPreferenceCache.size() : 0; } private void highlightPreference(String key) { final int position = canUseListViewForHighLighting(key); if (position < 0) { return; } mPreferenceHighlighted = true; mLayoutManager.scrollToPosition(position); mAdapter.highlight(position); } private int findListPositionFromKey(PreferenceGroupAdapter adapter, String key) { final int count = adapter.getItemCount(); for (int n = 0; n < count; n++) { final Preference preference = adapter.getItem(n); final String preferenceKey = preference.getKey(); if (preferenceKey != null && preferenceKey.equals(key)) { return n; } } return -1; } protected boolean removePreference(String key) { return removePreference(getPreferenceScreen(), key); } Loading Loading @@ -747,39 +699,4 @@ public abstract class SettingsPreferenceFragment extends InstrumentedPreferenceF } } public static class HighlightablePreferenceGroupAdapter extends PreferenceGroupAdapter { @VisibleForTesting(otherwise=VisibleForTesting.NONE) int initialHighlightedPosition = -1; private int mHighlightPosition = -1; public HighlightablePreferenceGroupAdapter(PreferenceGroup preferenceGroup) { super(preferenceGroup); } public void highlight(int position) { mHighlightPosition = position; initialHighlightedPosition = position; notifyDataSetChanged(); } @Override public void onBindViewHolder(PreferenceViewHolder holder, int position) { super.onBindViewHolder(holder, position); if (position == mHighlightPosition) { View v = holder.itemView; v.post(() -> { if (v.getBackground() != null) { final int centerX = v.getWidth() / 2; final int centerY = v.getHeight() / 2; v.getBackground().setHotspot(centerX, centerY); } v.setPressed(true); v.setPressed(false); mHighlightPosition = -1; }); } } } } src/com/android/settings/users/UserSettings.java +1 −1 Original line number Diff line number Diff line Loading @@ -309,7 +309,7 @@ public class UserSettings extends SettingsPreferenceFragment public void onDestroy() { super.onDestroy(); if (!mUserCaps.mEnabled) { if (mUserCaps == null || !mUserCaps.mEnabled) { return; } Loading Loading
res/color/preference_highligh_color.xml 0 → 100644 +20 −0 Original line number Diff line number Diff line <?xml version="1.0" encoding="utf-8"?> <!-- Copyright (C) 2018 The Android Open Source Project Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. --> <selector xmlns:android="http://schemas.android.com/apk/res/android"> <item android:alpha="0.1" android:color="?android:attr/colorAccent" /> </selector> No newline at end of file
res/values/ids.xml +1 −1 Original line number Diff line number Diff line Loading @@ -17,7 +17,7 @@ */ --> <resources> <item type="id" name="preference_highlight_key" /> <item type="id" name="preference_highlighted" /> <item type="id" name="lock_none" /> <item type="id" name="lock_pin" /> Loading
res/values/strings.xml +1 −1 Original line number Diff line number Diff line Loading @@ -6145,7 +6145,7 @@ <!-- User settings --> <skip/> <!-- User settings screen title [CHAR LIMIT=25] --> <!-- User settings screen title [CHAR LIMIT=40] --> <string name="user_settings_title">Multiple users</string> <!-- User settings header for list of users and profiles [CHAR LIMIT=40] --> <string name="user_list_title">Users & profiles</string> Loading
src/com/android/settings/SettingsPreferenceFragment.java +21 −104 Original line number Diff line number Diff line Loading @@ -30,9 +30,7 @@ import android.support.annotation.VisibleForTesting; import android.support.annotation.XmlRes; import android.support.v7.preference.Preference; import android.support.v7.preference.PreferenceGroup; import android.support.v7.preference.PreferenceGroupAdapter; import android.support.v7.preference.PreferenceScreen; import android.support.v7.preference.PreferenceViewHolder; import android.support.v7.widget.LinearLayoutManager; import android.support.v7.widget.RecyclerView; import android.text.TextUtils; Loading @@ -49,6 +47,7 @@ import com.android.settings.core.instrumentation.InstrumentedDialogFragment; import com.android.settings.search.actionbar.SearchMenuController; import com.android.settings.support.actionbar.HelpMenuController; import com.android.settings.support.actionbar.HelpResourceProvider; import com.android.settings.widget.HighlightablePreferenceGroupAdapter; import com.android.settings.widget.LoadingViewController; import com.android.settingslib.CustomDialogPreference; import com.android.settingslib.CustomEditTextPreference; Loading @@ -65,9 +64,6 @@ public abstract class SettingsPreferenceFragment extends InstrumentedPreferenceF private static final String TAG = "SettingsPreference"; @VisibleForTesting static final int DELAY_HIGHLIGHT_DURATION_MILLIS = 600; private static final String SAVE_HIGHLIGHTED_KEY = "android:preference_highlighted"; protected final FooterPreferenceMixin mFooterPreferenceMixin = Loading @@ -75,14 +71,11 @@ public abstract class SettingsPreferenceFragment extends InstrumentedPreferenceF private static final int ORDER_FIRST = -1; private static final int ORDER_LAST = Integer.MAX_VALUE -1; private SettingsDialogFragment mDialogFragment; // Cache the content resolver for async callbacks private ContentResolver mContentResolver; private String mPreferenceKey; private RecyclerView.Adapter mCurrentRootAdapter; private boolean mIsDataSetObserverRegistered = false; private RecyclerView.AdapterDataObserver mDataSetObserver = Loading Loading @@ -146,8 +139,9 @@ public abstract class SettingsPreferenceFragment extends InstrumentedPreferenceF // Check if we should keep the preferences expanded. if (arguments != null) { mPreferenceKey = arguments.getString(SettingsActivity.EXTRA_FRAGMENT_ARG_KEY); if (!TextUtils.isEmpty(mPreferenceKey)) { final String highlightKey = arguments.getString(SettingsActivity.EXTRA_FRAGMENT_ARG_KEY); if (!TextUtils.isEmpty(highlightKey)) { final PreferenceScreen screen = getPreferenceScreen(); if (screen != null) { screen.setInitialExpandedChildrenCount(Integer.MAX_VALUE); Loading Loading @@ -205,7 +199,9 @@ public abstract class SettingsPreferenceFragment extends InstrumentedPreferenceF public void onSaveInstanceState(Bundle outState) { super.onSaveInstanceState(outState); outState.putBoolean(SAVE_HIGHLIGHTED_KEY, mPreferenceHighlighted); if (mAdapter != null) { outState.putBoolean(SAVE_HIGHLIGHTED_KEY, mAdapter.isHighlightRequested()); } } @Override Loading @@ -217,11 +213,8 @@ public abstract class SettingsPreferenceFragment extends InstrumentedPreferenceF @Override public void onResume() { super.onResume(); if (mPreferenceKey != null) { highlightPreferenceIfNeeded(); } } @Override protected void onBindPreferences() { Loading Loading @@ -263,13 +256,11 @@ public abstract class SettingsPreferenceFragment extends InstrumentedPreferenceF } public void highlightPreferenceIfNeeded() { if (isAdded() && !mPreferenceHighlighted &&!TextUtils.isEmpty(mPreferenceKey)) { getView().postDelayed(new Runnable() { @Override public void run() { highlightPreference(mPreferenceKey); if (!isAdded()) { return; } }, DELAY_HIGHLIGHT_DURATION_MILLIS); if (mAdapter != null) { mAdapter.requestHighlight(getView(), getListView()); } } Loading Loading @@ -340,24 +331,6 @@ public abstract class SettingsPreferenceFragment extends InstrumentedPreferenceF return mEmptyView; } /** * Return a valid ListView position or -1 if none is found */ private int canUseListViewForHighLighting(String key) { if (getListView() == null) { return -1; } RecyclerView listView = getListView(); RecyclerView.Adapter adapter = listView.getAdapter(); if (adapter != null && adapter instanceof PreferenceGroupAdapter) { return findListPositionFromKey((PreferenceGroupAdapter) adapter, key); } return -1; } @Override public RecyclerView.LayoutManager onCreateLayoutManager() { mLayoutManager = new LinearLayoutManager(getContext()); Loading @@ -366,7 +339,9 @@ public abstract class SettingsPreferenceFragment extends InstrumentedPreferenceF @Override protected RecyclerView.Adapter onCreateAdapter(PreferenceScreen preferenceScreen) { mAdapter = new HighlightablePreferenceGroupAdapter(preferenceScreen); mAdapter = new HighlightablePreferenceGroupAdapter(preferenceScreen, getArguments().getString(SettingsActivity.EXTRA_FRAGMENT_ARG_KEY), mPreferenceHighlighted); return mAdapter; } Loading @@ -375,7 +350,7 @@ public abstract class SettingsPreferenceFragment extends InstrumentedPreferenceF } protected void cacheRemoveAllPrefs(PreferenceGroup group) { mPreferenceCache = new ArrayMap<String, Preference>(); mPreferenceCache = new ArrayMap<>(); final int N = group.getPreferenceCount(); for (int i = 0; i < N; i++) { Preference p = group.getPreference(i); Loading @@ -401,29 +376,6 @@ public abstract class SettingsPreferenceFragment extends InstrumentedPreferenceF return mPreferenceCache != null ? mPreferenceCache.size() : 0; } private void highlightPreference(String key) { final int position = canUseListViewForHighLighting(key); if (position < 0) { return; } mPreferenceHighlighted = true; mLayoutManager.scrollToPosition(position); mAdapter.highlight(position); } private int findListPositionFromKey(PreferenceGroupAdapter adapter, String key) { final int count = adapter.getItemCount(); for (int n = 0; n < count; n++) { final Preference preference = adapter.getItem(n); final String preferenceKey = preference.getKey(); if (preferenceKey != null && preferenceKey.equals(key)) { return n; } } return -1; } protected boolean removePreference(String key) { return removePreference(getPreferenceScreen(), key); } Loading Loading @@ -747,39 +699,4 @@ public abstract class SettingsPreferenceFragment extends InstrumentedPreferenceF } } public static class HighlightablePreferenceGroupAdapter extends PreferenceGroupAdapter { @VisibleForTesting(otherwise=VisibleForTesting.NONE) int initialHighlightedPosition = -1; private int mHighlightPosition = -1; public HighlightablePreferenceGroupAdapter(PreferenceGroup preferenceGroup) { super(preferenceGroup); } public void highlight(int position) { mHighlightPosition = position; initialHighlightedPosition = position; notifyDataSetChanged(); } @Override public void onBindViewHolder(PreferenceViewHolder holder, int position) { super.onBindViewHolder(holder, position); if (position == mHighlightPosition) { View v = holder.itemView; v.post(() -> { if (v.getBackground() != null) { final int centerX = v.getWidth() / 2; final int centerY = v.getHeight() / 2; v.getBackground().setHotspot(centerX, centerY); } v.setPressed(true); v.setPressed(false); mHighlightPosition = -1; }); } } } }
src/com/android/settings/users/UserSettings.java +1 −1 Original line number Diff line number Diff line Loading @@ -309,7 +309,7 @@ public class UserSettings extends SettingsPreferenceFragment public void onDestroy() { super.onDestroy(); if (!mUserCaps.mEnabled) { if (mUserCaps == null || !mUserCaps.mEnabled) { return; } Loading