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;