Merge "[Large screen] Fix searched Subsettings back navigation bug" into sc-v2-dev
diff --git a/src/com/android/settings/activityembedding/ActivityEmbeddingRulesController.java b/src/com/android/settings/activityembedding/ActivityEmbeddingRulesController.java
index d57c0c2..d3fcd7d 100644
--- a/src/com/android/settings/activityembedding/ActivityEmbeddingRulesController.java
+++ b/src/com/android/settings/activityembedding/ActivityEmbeddingRulesController.java
@@ -63,13 +63,6 @@
 
         // Set a placeholder for home page.
         registerHomepagePlaceholderRule();
-        // Set subsettings rule.
-        registerTwoPanePairRule(mContext,
-                getComponentName(Settings.class),
-                getComponentName(SubSettings.class),
-                null /* secondaryIntentAction */,
-                true /* finishPrimaryWithSecondary */,
-                true /* finishSecondaryWithPrimary */);
     }
 
     /** Register a SplitPairRule for 2-pane. */
@@ -78,7 +71,8 @@
             ComponentName secondaryComponent,
             String secondaryIntentAction,
             boolean finishPrimaryWithSecondary,
-            boolean finishSecondaryWithPrimary) {
+            boolean finishSecondaryWithPrimary,
+            boolean clearTop) {
         final Set<SplitPairFilter> filters = new HashSet<>();
         filters.add(new SplitPairFilter(primaryComponent, secondaryComponent,
                 secondaryIntentAction));
@@ -86,13 +80,28 @@
         SplitController.getInstance().registerRule(new SplitPairRule(filters,
                 finishPrimaryWithSecondary,
                 finishSecondaryWithPrimary,
-                true /* clearTop */,
+                clearTop,
                 ActivityEmbeddingUtils.getMinCurrentScreenSplitWidthPx(context),
                 ActivityEmbeddingUtils.getMinSmallestScreenSplitWidthPx(context),
                 ActivityEmbeddingUtils.SPLIT_RATIO,
                 LayoutDirection.LOCALE));
     }
 
+    /** Register a SplitPairRule for SubSettings if the device supports 2-pane. */
+    public static void registerSubSettingsPairRuleIfNeeded(Context context, boolean clearTop) {
+        if (!ActivityEmbeddingUtils.isEmbeddingActivityEnabled(context)) {
+            return;
+        }
+
+        registerTwoPanePairRule(context,
+                getComponentName(context, Settings.class),
+                getComponentName(context, SubSettings.class),
+                null /* secondaryIntentAction */,
+                true /* finishPrimaryWithSecondary */,
+                true /* finishSecondaryWithPrimary */,
+                clearTop);
+    }
+
     private void registerHomepagePlaceholderRule() {
         final Set<ActivityFilter> activityFilters = new HashSet<>();
         addActivityFilter(activityFilters, SettingsHomepageActivity.class);
@@ -131,6 +140,12 @@
 
     @NonNull
     private ComponentName getComponentName(Class<? extends Activity> activityClass) {
-        return new ComponentName(mContext.getPackageName(), activityClass.getName());
+        return getComponentName(mContext, activityClass);
+    }
+
+    @NonNull
+    private static ComponentName getComponentName(Context context,
+                Class<? extends Activity> activityClass) {
+        return new ComponentName(context.getPackageName(), activityClass.getName());
     }
 }
diff --git a/src/com/android/settings/dashboard/DashboardFeatureProviderImpl.java b/src/com/android/settings/dashboard/DashboardFeatureProviderImpl.java
index 2def817..951eb3c 100644
--- a/src/com/android/settings/dashboard/DashboardFeatureProviderImpl.java
+++ b/src/com/android/settings/dashboard/DashboardFeatureProviderImpl.java
@@ -180,7 +180,10 @@
                                         com.android.settings.Settings.class.getName()),
                                 new ComponentName(tile.getPackageName(),
                                         tile.getComponentName()),
-                                null, true, true);
+                                null /* secondaryIntentAction */,
+                                true /* finishPrimaryWithSecondary */,
+                                true /* finishSecondaryWithPrimary */,
+                                true /* clearTop */);
 
                         // Highlight preference ui.
                         final TopLevelSettings topLevelSettings = (TopLevelSettings) fragment;
diff --git a/src/com/android/settings/homepage/SettingsHomepageActivity.java b/src/com/android/settings/homepage/SettingsHomepageActivity.java
index a2a6d3c..674f8d8 100644
--- a/src/com/android/settings/homepage/SettingsHomepageActivity.java
+++ b/src/com/android/settings/homepage/SettingsHomepageActivity.java
@@ -239,13 +239,15 @@
                 targetComponentName,
                 targetIntent.getAction(),
                 true /* finishPrimaryWithSecondary */,
-                true /* finishSecondaryWithPrimary */);
+                true /* finishSecondaryWithPrimary */,
+                true /* clearTop*/);
         ActivityEmbeddingRulesController.registerTwoPanePairRule(this,
                 new ComponentName(Settings.class.getPackageName(), Settings.class.getName()),
                 targetComponentName,
                 targetIntent.getAction(),
                 true /* finishPrimaryWithSecondary */,
-                true /* finishSecondaryWithPrimary */);
+                true /* finishSecondaryWithPrimary */,
+                true /* clearTop*/);
         startActivity(targetIntent);
     }
 
diff --git a/src/com/android/settings/homepage/TopLevelSettings.java b/src/com/android/settings/homepage/TopLevelSettings.java
index 38b2baa..d3bfa02 100644
--- a/src/com/android/settings/homepage/TopLevelSettings.java
+++ b/src/com/android/settings/homepage/TopLevelSettings.java
@@ -36,6 +36,7 @@
 import com.android.settings.R;
 import com.android.settings.SettingsActivity;
 import com.android.settings.Utils;
+import com.android.settings.activityembedding.ActivityEmbeddingRulesController;
 import com.android.settings.activityembedding.ActivityEmbeddingUtils;
 import com.android.settings.core.SubSettingLauncher;
 import com.android.settings.dashboard.DashboardFragment;
@@ -98,6 +99,10 @@
 
     @Override
     public boolean onPreferenceTreeClick(Preference preference) {
+        // Register SplitPairRule for SubSettings.
+        ActivityEmbeddingRulesController.registerSubSettingsPairRuleIfNeeded(getContext(),
+                true /* clearTop*/);
+
         setHighlightPreferenceKey(preference.getKey());
         return super.onPreferenceTreeClick(preference);
     }
diff --git a/src/com/android/settings/search/SearchResultTrampoline.java b/src/com/android/settings/search/SearchResultTrampoline.java
index e930473..3414efe 100644
--- a/src/com/android/settings/search/SearchResultTrampoline.java
+++ b/src/com/android/settings/search/SearchResultTrampoline.java
@@ -25,6 +25,7 @@
 
 import com.android.settings.SettingsActivity;
 import com.android.settings.SubSettings;
+import com.android.settings.activityembedding.ActivityEmbeddingRulesController;
 import com.android.settings.overlay.FeatureFactory;
 
 /**
@@ -53,6 +54,11 @@
         args.putInt(EXTRA_SHOW_FRAGMENT_TAB, tab);
         intent.putExtra(EXTRA_SHOW_FRAGMENT_ARGUMENTS, args);
 
+        // Register SplirPairRule for SubSettings, set clearTop false to prevent unexpected back
+        // navigation behavior.
+        ActivityEmbeddingRulesController.registerSubSettingsPairRuleIfNeeded(this /* context */,
+                false /* clearTop*/);
+
         // Reroute request to SubSetting.
         intent.setClass(this /* context */, SubSettings.class)
                 .addFlags(Intent.FLAG_ACTIVITY_FORWARD_RESULT);