diff --git a/src/com/android/settings/activityembedding/ActivityEmbeddingRulesController.java b/src/com/android/settings/activityembedding/ActivityEmbeddingRulesController.java index d57c0c28d59..d3fcd7d2764 100644 --- a/src/com/android/settings/activityembedding/ActivityEmbeddingRulesController.java +++ b/src/com/android/settings/activityembedding/ActivityEmbeddingRulesController.java @@ -63,13 +63,6 @@ public class ActivityEmbeddingRulesController { // 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 @@ public class ActivityEmbeddingRulesController { ComponentName secondaryComponent, String secondaryIntentAction, boolean finishPrimaryWithSecondary, - boolean finishSecondaryWithPrimary) { + boolean finishSecondaryWithPrimary, + boolean clearTop) { final Set filters = new HashSet<>(); filters.add(new SplitPairFilter(primaryComponent, secondaryComponent, secondaryIntentAction)); @@ -86,13 +80,28 @@ public class ActivityEmbeddingRulesController { 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 activityFilters = new HashSet<>(); addActivityFilter(activityFilters, SettingsHomepageActivity.class); @@ -131,6 +140,12 @@ public class ActivityEmbeddingRulesController { @NonNull private ComponentName getComponentName(Class activityClass) { - return new ComponentName(mContext.getPackageName(), activityClass.getName()); + return getComponentName(mContext, activityClass); + } + + @NonNull + private static ComponentName getComponentName(Context context, + Class 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 2def817ac22..951eb3c1b40 100644 --- a/src/com/android/settings/dashboard/DashboardFeatureProviderImpl.java +++ b/src/com/android/settings/dashboard/DashboardFeatureProviderImpl.java @@ -180,7 +180,10 @@ public class DashboardFeatureProviderImpl implements DashboardFeatureProvider { 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 a2a6d3cb1ec..674f8d85959 100644 --- a/src/com/android/settings/homepage/SettingsHomepageActivity.java +++ b/src/com/android/settings/homepage/SettingsHomepageActivity.java @@ -239,13 +239,15 @@ public class SettingsHomepageActivity extends FragmentActivity implements 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 38b2baa1694..d3bfa02ae27 100644 --- a/src/com/android/settings/homepage/TopLevelSettings.java +++ b/src/com/android/settings/homepage/TopLevelSettings.java @@ -36,6 +36,7 @@ import androidx.recyclerview.widget.RecyclerView; 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 @@ public class TopLevelSettings extends DashboardFragment implements @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 e9304739460..3414efeda72 100644 --- a/src/com/android/settings/search/SearchResultTrampoline.java +++ b/src/com/android/settings/search/SearchResultTrampoline.java @@ -25,6 +25,7 @@ import android.os.Bundle; 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 @@ public class SearchResultTrampoline extends Activity { 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);