Fix the higlighted settings not work properly from search
Since the Andorid S, we introduce the CollapsingToolbarLayout
, the highlighted funcation might break for unkown reason.
I observed that broken cases with overlapping issue on tool bar.
The possible root cause is the interation bwtween
CoordinatorLayout v.s CollapsingToolbarLayout v.s Recycler
view.
This cl is definetly a workaround to prevent this issue.
I try to collapse the tool bar with an animation before
we start to scroll the list. This makes the overall transition smooth
but always collapse the tool bar.
Fix: 177968297
Test: Click a lot of search results, and screen should highlight
settings correctly.
Change-Id: Id9c32b642433dcc39c179a2cc83a06e77cc47888
diff --git a/src/com/android/settings/SettingsPreferenceFragment.java b/src/com/android/settings/SettingsPreferenceFragment.java
index 2c628f6..0c1ace9 100644
--- a/src/com/android/settings/SettingsPreferenceFragment.java
+++ b/src/com/android/settings/SettingsPreferenceFragment.java
@@ -57,6 +57,8 @@
import com.android.settingslib.search.Indexable;
import com.android.settingslib.widget.LayoutPreference;
+import com.google.android.material.appbar.AppBarLayout;
+
import java.util.UUID;
/**
@@ -112,9 +114,8 @@
@VisibleForTesting
ViewGroup mPinnedHeaderFrameLayout;
-
+ private AppBarLayout mAppBarLayout;
private LayoutPreference mHeader;
-
private View mEmptyView;
private LinearLayoutManager mLayoutManager;
private ArrayMap<String, Preference> mPreferenceCache;
@@ -145,6 +146,7 @@
Bundle savedInstanceState) {
final View root = super.onCreateView(inflater, container, savedInstanceState);
mPinnedHeaderFrameLayout = root.findViewById(R.id.pinned_header);
+ mAppBarLayout = getActivity().findViewById(R.id.app_bar);
return root;
}
@@ -250,7 +252,7 @@
return;
}
if (mAdapter != null) {
- mAdapter.requestHighlight(getView(), getListView());
+ mAdapter.requestHighlight(getView(), getListView(), mAppBarLayout);
}
}
diff --git a/src/com/android/settings/widget/HighlightablePreferenceGroupAdapter.java b/src/com/android/settings/widget/HighlightablePreferenceGroupAdapter.java
index e89e793..b3ae609 100644
--- a/src/com/android/settings/widget/HighlightablePreferenceGroupAdapter.java
+++ b/src/com/android/settings/widget/HighlightablePreferenceGroupAdapter.java
@@ -39,10 +39,14 @@
import com.android.settings.R;
import com.android.settings.SettingsPreferenceFragment;
+import com.google.android.material.appbar.AppBarLayout;
+
public class HighlightablePreferenceGroupAdapter extends PreferenceGroupAdapter {
private static final String TAG = "HighlightableAdapter";
@VisibleForTesting
+ static final long DELAY_COLLAPSE_DURATION_MILLIS = 300L;
+ @VisibleForTesting
static final long DELAY_HIGHLIGHT_DURATION_MILLIS = 600L;
private static final long HIGHLIGHT_DURATION = 15000L;
private static final long HIGHLIGHT_FADE_OUT_DURATION = 500L;
@@ -115,7 +119,7 @@
View v = holder.itemView;
if (position == mHighlightPosition
&& (mHighlightKey != null
- && TextUtils.equals(mHighlightKey, getItem(position).getKey()))) {
+ && TextUtils.equals(mHighlightKey, getItem(position).getKey()))) {
// This position should be highlighted. If it's highlighted before - skip animation.
addHighlightBackground(v, !mFadeInAnimated);
} else if (Boolean.TRUE.equals(v.getTag(R.id.preference_highlighted))) {
@@ -124,15 +128,26 @@
}
}
- public void requestHighlight(View root, RecyclerView recyclerView) {
+ /**
+ * A function can highlight a specific setting in recycler view.
+ * note: Before highlighting a setting, screen collapses tool bar with an animation.
+ */
+ public void requestHighlight(View root, RecyclerView recyclerView, AppBarLayout appBarLayout) {
if (mHighlightRequested || recyclerView == null || TextUtils.isEmpty(mHighlightKey)) {
return;
}
+ final int position = getPreferenceAdapterPosition(mHighlightKey);
+ if (position < 0) {
+ return;
+ }
+
+ if (appBarLayout != null) {
+ root.postDelayed(() -> {
+ appBarLayout.setExpanded(false, true);
+ }, DELAY_COLLAPSE_DURATION_MILLIS);
+ }
+
root.postDelayed(() -> {
- final int position = getPreferenceAdapterPosition(mHighlightKey);
- if (position < 0) {
- return;
- }
mHighlightRequested = true;
recyclerView.smoothScrollToPosition(position);
mHighlightPosition = position;