Fine tune the homepage scrolling behavior

Scroll to the highlight position before showing homepage.

Bug: 199017944
Bug: 204946469
Test: visual
Change-Id: I11708f42180a3af22855ac7b5f53460f737ed208
diff --git a/AndroidManifest.xml b/AndroidManifest.xml
index bb72e95..638340e 100644
--- a/AndroidManifest.xml
+++ b/AndroidManifest.xml
@@ -1197,6 +1197,8 @@
             </intent-filter>
             <meta-data android:name="com.android.settings.FRAGMENT_CLASS"
                        android:value="com.android.settings.security.LockscreenDashboardFragment" />
+            <meta-data android:name="com.android.settings.HIGHLIGHT_MENU_KEY"
+                       android:value="@string/menu_key_display"/>
             <meta-data android:name="com.android.settings.PRIMARY_PROFILE_CONTROLLED"
                        android:value="true" />
         </activity>
@@ -1223,6 +1225,8 @@
             </intent-filter>
             <meta-data android:name="com.android.settings.FRAGMENT_CLASS"
                        android:value="com.android.settings.deviceinfo.legal.ModuleLicensesDashboard" />
+            <meta-data android:name="com.android.settings.HIGHLIGHT_MENU_KEY"
+                       android:value="@string/menu_key_about_device"/>
             <meta-data android:name="com.android.settings.PRIMARY_PROFILE_CONTROLLED"
                        android:value="true" />
         </activity>
@@ -1243,6 +1247,8 @@
             </intent-filter>
             <meta-data android:name="com.android.settings.FRAGMENT_CLASS"
                 android:value="com.android.settings.applications.manageapplications.ManageApplications" />
+            <meta-data android:name="com.android.settings.HIGHLIGHT_MENU_KEY"
+                       android:value="@string/menu_key_apps"/>
             <meta-data android:name="com.android.settings.PRIMARY_PROFILE_CONTROLLED"
                 android:value="true" />
         </activity>
@@ -1266,6 +1272,8 @@
             </intent-filter>
             <meta-data android:name="com.android.settings.FRAGMENT_CLASS"
                        android:value="com.android.settings.applications.managedomainurls.ManageDomainUrls" />
+            <meta-data android:name="com.android.settings.HIGHLIGHT_MENU_KEY"
+                       android:value="@string/menu_key_apps"/>
         </activity>
 
         <activity android:name="Settings$AppMemoryUsageActivity"
@@ -1278,6 +1286,8 @@
             </intent-filter>
             <meta-data android:name="com.android.settings.FRAGMENT_CLASS"
                        android:value="com.android.settings.applications.ProcessStatsUi" />
+            <meta-data android:name="com.android.settings.HIGHLIGHT_MENU_KEY"
+                       android:value="@string/menu_key_apps"/>
         </activity>
 
         <activity
@@ -1290,6 +1300,8 @@
             </intent-filter>
             <meta-data android:name="com.android.settings.FRAGMENT_CLASS"
                 android:value="com.android.settings.applications.manageapplications.ManageApplications" />
+            <meta-data android:name="com.android.settings.HIGHLIGHT_MENU_KEY"
+                       android:value="@string/menu_key_apps"/>
             <meta-data android:name="com.android.settings.PRIMARY_PROFILE_CONTROLLED"
                 android:value="true" />
         </activity>
@@ -1396,6 +1408,8 @@
             </intent-filter>
             <meta-data android:name="com.android.settings.FRAGMENT_CLASS"
                 android:value="com.android.settings.applications.manageapplications.ManageApplications" />
+            <meta-data android:name="com.android.settings.HIGHLIGHT_MENU_KEY"
+                       android:value="@string/menu_key_apps"/>
             <meta-data android:name="com.android.settings.PRIMARY_PROFILE_CONTROLLED"
                 android:value="true" />
         </activity>
@@ -1417,6 +1431,8 @@
             </intent-filter>
             <meta-data android:name="com.android.settings.FRAGMENT_CLASS"
                 android:value="com.android.settings.applications.manageapplications.ManageApplications" />
+            <meta-data android:name="com.android.settings.HIGHLIGHT_MENU_KEY"
+                       android:value="@string/menu_key_apps"/>
             <meta-data android:name="com.android.settings.PRIMARY_PROFILE_CONTROLLED"
                 android:value="true" />
         </activity>
@@ -2245,6 +2261,8 @@
             </intent-filter>
             <meta-data android:name="com.android.settings.FRAGMENT_CLASS"
                        android:value="com.android.settings.network.apn.ApnEditor" />
+            <meta-data android:name="com.android.settings.HIGHLIGHT_MENU_KEY"
+                       android:value="@string/menu_key_network"/>
         </activity>
 
         <activity
@@ -2273,6 +2291,8 @@
                        android:value="com.android.settings.development.DevelopmentSettingsDashboardFragment" />
             <meta-data android:name="com.android.settings.PRIMARY_PROFILE_CONTROLLED"
                        android:value="true" />
+            <meta-data android:name="com.android.settings.HIGHLIGHT_MENU_KEY"
+                       android:value="@string/menu_key_system"/>
         </activity>
 
         <!-- The opposite of DevelopmentSettingsActivity, it's no-op and only enabled when the real
@@ -2307,6 +2327,8 @@
             </intent-filter>
             <meta-data android:name="com.android.settings.FRAGMENT_CLASS"
                 android:value="com.android.settings.print.PrintSettingsFragment" />
+            <meta-data android:name="com.android.settings.HIGHLIGHT_MENU_KEY"
+                       android:value="@string/menu_key_connected_devices"/>
         </activity>
 
         <activity android:name="Settings$PrintJobSettingsActivity"
@@ -2319,6 +2341,8 @@
             </intent-filter>
             <meta-data android:name="com.android.settings.FRAGMENT_CLASS"
                 android:value="com.android.settings.print.PrintJobSettingsFragment" />
+            <meta-data android:name="com.android.settings.HIGHLIGHT_MENU_KEY"
+                       android:value="@string/menu_key_connected_devices"/>
         </activity>
 
         <activity android:name=".development.AppPicker"
@@ -2339,7 +2363,10 @@
                   android:label="@string/accessor_info_title" />
 
         <activity android:name="Settings$WebViewAppPickerActivity"
-                  android:label="@string/select_webview_provider_dialog_title" />
+                  android:label="@string/select_webview_provider_dialog_title">
+            <meta-data android:name="com.android.settings.HIGHLIGHT_MENU_KEY"
+                       android:value="@string/menu_key_system"/>
+        </activity>
 
         <activity android:name="Settings$BugReportHandlerPickerActivity"
             android:label="@string/bug_report_handler_title"
@@ -2353,6 +2380,8 @@
                 android:value="true" />
             <meta-data android:name="com.android.settings.FRAGMENT_CLASS"
                 android:value="com.android.settings.bugreporthandler.BugReportHandlerPicker" />
+            <meta-data android:name="com.android.settings.HIGHLIGHT_MENU_KEY"
+                       android:value="@string/menu_key_system"/>
         </activity>
 
         <activity android:name=".bluetooth.BluetoothPairingDialog"
diff --git a/src/com/android/settings/homepage/SettingsHomepageActivity.java b/src/com/android/settings/homepage/SettingsHomepageActivity.java
index 0322cfa..067989e 100644
--- a/src/com/android/settings/homepage/SettingsHomepageActivity.java
+++ b/src/com/android/settings/homepage/SettingsHomepageActivity.java
@@ -95,7 +95,9 @@
         if (mHomepageView == null) {
             return false;
         } else {
-            mLoadedListeners.add(listener);
+            if (!mLoadedListeners.contains(listener)) {
+                mLoadedListeners.add(listener);
+            }
             return true;
         }
     }
@@ -109,11 +111,13 @@
             return;
         }
         Log.i(TAG, "showHomepageWithSuggestion: " + showSuggestion);
+        final View homepageView = mHomepageView;
         mSuggestionView.setVisibility(showSuggestion ? View.VISIBLE : View.GONE);
-        mHomepageView.setVisibility(View.VISIBLE);
         mHomepageView = null;
+
         mLoadedListeners.forEach(listener -> listener.onHomepageLoaded());
         mLoadedListeners.clear();
+        homepageView.setVisibility(View.VISIBLE);
     }
 
     @Override
@@ -195,7 +199,7 @@
         mSuggestionView = findViewById(R.id.suggestion_content);
         mHomepageView = findViewById(R.id.settings_homepage_container);
         // Hide the homepage for preparing the suggestion.
-        mHomepageView.setVisibility(View.GONE);
+        mHomepageView.setVisibility(View.INVISIBLE);
         // Schedule a timer to show the homepage and hide the suggestion on timeout.
         mHomepageView.postDelayed(() -> showHomepageWithSuggestion(false),
                 HOMEPAGE_LOADING_TIMEOUT_MS);
diff --git a/src/com/android/settings/homepage/TopLevelSettings.java b/src/com/android/settings/homepage/TopLevelSettings.java
index 2b0f788..548b3c4 100644
--- a/src/com/android/settings/homepage/TopLevelSettings.java
+++ b/src/com/android/settings/homepage/TopLevelSettings.java
@@ -201,7 +201,8 @@
 
     @Override
     protected RecyclerView.Adapter onCreateAdapter(PreferenceScreen preferenceScreen) {
-        if (!ActivityEmbeddingUtils.isEmbeddingActivityEnabled(getContext())) {
+        if (!ActivityEmbeddingUtils.isEmbeddingActivityEnabled(getContext())
+                || !(getActivity() instanceof SettingsHomepageActivity)) {
             return super.onCreateAdapter(preferenceScreen);
         }
 
diff --git a/src/com/android/settings/search/SearchResultTrampoline.java b/src/com/android/settings/search/SearchResultTrampoline.java
index 8805d19..a770126 100644
--- a/src/com/android/settings/search/SearchResultTrampoline.java
+++ b/src/com/android/settings/search/SearchResultTrampoline.java
@@ -94,7 +94,7 @@
 
         if (!ActivityEmbeddingUtils.isEmbeddingActivityEnabled(this)) {
             startActivity(intent);
-        } else if (isFromSettingsIntelligence(callingActivity)) {
+        } else if (isSettingsIntelligence(callingActivity)) {
             // Register SplitPairRule for SubSettings, set clearTop false to prevent unexpected back
             // navigation behavior.
             ActivityEmbeddingRulesController.registerSubSettingsPairRule(this,
@@ -104,7 +104,6 @@
             startActivity(intent);
         } else {
             // Two-pane case
-            intent.setFlags(intent.getFlags() & ~Intent.FLAG_ACTIVITY_NEW_TASK);
             startActivity(SettingsActivity.getTrampolineIntent(intent, highlightMenuKey));
         }
 
@@ -112,7 +111,7 @@
         finish();
     }
 
-    private boolean isFromSettingsIntelligence(ComponentName callingActivity) {
+    private boolean isSettingsIntelligence(ComponentName callingActivity) {
         return callingActivity != null && TextUtils.equals(
                 callingActivity.getPackageName(),
                 FeatureFactory.getFactory(this).getSearchFeatureProvider()
diff --git a/src/com/android/settings/widget/HighlightableTopLevelPreferenceAdapter.java b/src/com/android/settings/widget/HighlightableTopLevelPreferenceAdapter.java
index bf92bbd..bdf0886 100644
--- a/src/com/android/settings/widget/HighlightableTopLevelPreferenceAdapter.java
+++ b/src/com/android/settings/widget/HighlightableTopLevelPreferenceAdapter.java
@@ -38,7 +38,8 @@
 /**
  *  Adapter for highlighting top level preferences
  */
-public class HighlightableTopLevelPreferenceAdapter extends PreferenceGroupAdapter {
+public class HighlightableTopLevelPreferenceAdapter extends PreferenceGroupAdapter implements
+        SettingsHomepageActivity.HomepageLoadedListener {
 
     private static final String TAG = "HighlightableTopLevelAdapter";
 
@@ -60,6 +61,7 @@
     private String mHighlightKey;
     private String mPreviousHighlightKey;
     private int mHighlightPosition = RecyclerView.NO_POSITION;
+    private int mScrollPosition = RecyclerView.NO_POSITION;
     private boolean mHighlightNeeded;
     private boolean mScrolled;
 
@@ -135,9 +137,11 @@
             return;
         }
 
+        // Scroll before highlight if needed.
         final boolean highlightNeeded = isHighlightNeeded();
         if (highlightNeeded) {
-            scrollToPositionIfNeeded(position);
+            mScrollPosition = position;
+            scroll();
         }
 
         // Turn on/off highlight when screen split mode is changed.
@@ -189,26 +193,29 @@
         requestHighlight();
     }
 
-    private void scrollToPositionIfNeeded(int position) {
-        if (mScrolled || position < 0) {
+    @Override
+    public void onHomepageLoaded() {
+        scroll();
+    }
+
+    private void scroll() {
+        if (mScrolled || mScrollPosition < 0) {
             return;
         }
 
-        if (mHomepageActivity.registerHomepageLoadedListenerIfNeeded(
-                () -> scrollToPositionIfNeeded(position))) {
+        if (mHomepageActivity.registerHomepageLoadedListenerIfNeeded(this)) {
             return;
         }
 
         // Only when the recyclerView is loaded, it can be scrolled
-        final View view = mRecyclerView.getChildAt(position);
+        final View view = mRecyclerView.getChildAt(mScrollPosition);
         if (view == null) {
-            mRecyclerView.postDelayed(() -> scrollToPositionIfNeeded(position),
-                    DELAY_HIGHLIGHT_DURATION_MILLIS);
+            mRecyclerView.postDelayed(() -> scroll(), DELAY_HIGHLIGHT_DURATION_MILLIS);
             return;
         }
 
         mScrolled = true;
-        Log.d(TAG, "Scroll to position " + position);
+        Log.d(TAG, "Scroll to position " + mScrollPosition);
         // Scroll to the top to reset the position.
         mRecyclerView.nestedScrollBy(0, -mRecyclerView.getHeight());