diff --git a/src/com/android/settings/SettingsInitialize.java b/src/com/android/settings/SettingsInitialize.java index ca136834e14..efbfd368de6 100644 --- a/src/com/android/settings/SettingsInitialize.java +++ b/src/com/android/settings/SettingsInitialize.java @@ -154,7 +154,7 @@ public class SettingsInitialize extends BroadcastReceiver { DeepLinkHomepageActivity.class); final ComponentName searchStateReceiver = new ComponentName(context, SearchStateReceiver.class); - final int enableState = SplitController.getInstance().isSplitSupported() + final int enableState = SplitController.getInstance(context).isSplitSupported() ? PackageManager.COMPONENT_ENABLED_STATE_ENABLED : PackageManager.COMPONENT_ENABLED_STATE_DISABLED; pm.setComponentEnabledSetting(deepLinkHome, enableState, PackageManager.DONT_KILL_APP); diff --git a/src/com/android/settings/activityembedding/ActivityEmbeddingRulesController.java b/src/com/android/settings/activityembedding/ActivityEmbeddingRulesController.java index dfe21829619..d789ce80623 100644 --- a/src/com/android/settings/activityembedding/ActivityEmbeddingRulesController.java +++ b/src/com/android/settings/activityembedding/ActivityEmbeddingRulesController.java @@ -22,11 +22,11 @@ import android.content.ComponentName; import android.content.Context; import android.content.Intent; import android.util.FeatureFlagUtils; -import android.util.LayoutDirection; import android.util.Log; import androidx.window.embedding.ActivityFilter; import androidx.window.embedding.ActivityRule; +import androidx.window.embedding.SplitAttributes; import androidx.window.embedding.SplitController; import androidx.window.embedding.SplitPairFilter; import androidx.window.embedding.SplitPairRule; @@ -49,6 +49,7 @@ import com.android.settings.overlay.FeatureFactory; import com.android.settings.password.ChooseLockPattern; import com.android.settingslib.users.AvatarPickerActivity; +import java.util.Collection; import java.util.HashSet; import java.util.Set; @@ -63,7 +64,7 @@ public class ActivityEmbeddingRulesController { public ActivityEmbeddingRulesController(Context context) { mContext = context; - mSplitController = SplitController.getInstance(); + mSplitController = SplitController.getInstance(context); } /** @@ -88,8 +89,8 @@ public class ActivityEmbeddingRulesController { ComponentName primaryComponent, ComponentName secondaryComponent, String secondaryIntentAction, - int finishPrimaryWithSecondary, - int finishSecondaryWithPrimary, + SplitRule.FinishBehavior finishPrimaryWithSecondary, + SplitRule.FinishBehavior finishSecondaryWithPrimary, boolean clearTop) { if (!ActivityEmbeddingUtils.isEmbeddingActivityEnabled(context)) { return; @@ -98,14 +99,20 @@ public class ActivityEmbeddingRulesController { filters.add(new SplitPairFilter(primaryComponent, secondaryComponent, secondaryIntentAction)); - SplitController.getInstance().registerRule(new SplitPairRule(filters, - finishPrimaryWithSecondary, - finishSecondaryWithPrimary, - clearTop, - ActivityEmbeddingUtils.getMinCurrentScreenSplitWidthPx(context), - ActivityEmbeddingUtils.getMinSmallestScreenSplitWidthPx(context), - ActivityEmbeddingUtils.getSplitRatio(context), - LayoutDirection.LOCALE)); + SplitAttributes attributes = new SplitAttributes.Builder() + .setSplitType(SplitAttributes.SplitType.ratio( + ActivityEmbeddingUtils.getSplitRatio(context))) + .setLayoutDirection(SplitAttributes.LayoutDirection.LOCALE) + .build(); + SplitPairRule splitPairRule = new SplitPairRule.Builder(filters) + .setFinishPrimaryWithSecondary(finishPrimaryWithSecondary) + .setFinishSecondaryWithPrimary(finishSecondaryWithPrimary) + .setClearTop(clearTop) + .setMinWidthDp(ActivityEmbeddingUtils.getMinCurrentScreenSplitWidthDp()) + .setMinSmallestWidthDp(ActivityEmbeddingUtils.getMinSmallestScreenSplitWidthDp()) + .setDefaultSplitAttributes(attributes) + .build(); + SplitController.getInstance(context).addRule(splitPairRule); } /** @@ -126,8 +133,10 @@ public class ActivityEmbeddingRulesController { new ComponentName(context, Settings.class), secondaryComponent, secondaryIntentAction, - finishPrimaryWithSecondary ? SplitRule.FINISH_ADJACENT : SplitRule.FINISH_NEVER, - finishSecondaryWithPrimary ? SplitRule.FINISH_ADJACENT : SplitRule.FINISH_NEVER, + finishPrimaryWithSecondary ? SplitRule.FinishBehavior.ADJACENT + : SplitRule.FinishBehavior.NEVER, + finishSecondaryWithPrimary ? SplitRule.FinishBehavior.ADJACENT + : SplitRule.FinishBehavior.NEVER, clearTop); registerTwoPanePairRule( @@ -135,8 +144,10 @@ public class ActivityEmbeddingRulesController { new ComponentName(context, SettingsHomepageActivity.class), secondaryComponent, secondaryIntentAction, - finishPrimaryWithSecondary ? SplitRule.FINISH_ADJACENT : SplitRule.FINISH_NEVER, - finishSecondaryWithPrimary ? SplitRule.FINISH_ADJACENT : SplitRule.FINISH_NEVER, + finishPrimaryWithSecondary ? SplitRule.FinishBehavior.ADJACENT + : SplitRule.FinishBehavior.NEVER, + finishSecondaryWithPrimary ? SplitRule.FinishBehavior.ADJACENT + : SplitRule.FinishBehavior.NEVER, clearTop); // We should finish HomePageActivity altogether even if it shows in single pane for all deep @@ -146,8 +157,10 @@ public class ActivityEmbeddingRulesController { new ComponentName(context, DeepLinkHomepageActivity.class), secondaryComponent, secondaryIntentAction, - finishPrimaryWithSecondary ? SplitRule.FINISH_ALWAYS : SplitRule.FINISH_NEVER, - finishSecondaryWithPrimary ? SplitRule.FINISH_ALWAYS : SplitRule.FINISH_NEVER, + finishPrimaryWithSecondary ? SplitRule.FinishBehavior.ALWAYS + : SplitRule.FinishBehavior.NEVER, + finishSecondaryWithPrimary ? SplitRule.FinishBehavior.ALWAYS + : SplitRule.FinishBehavior.NEVER, clearTop); registerTwoPanePairRule( @@ -155,8 +168,10 @@ public class ActivityEmbeddingRulesController { new ComponentName(context, DeepLinkHomepageActivityInternal.class), secondaryComponent, secondaryIntentAction, - finishPrimaryWithSecondary ? SplitRule.FINISH_ALWAYS : SplitRule.FINISH_NEVER, - finishSecondaryWithPrimary ? SplitRule.FINISH_ALWAYS : SplitRule.FINISH_NEVER, + finishPrimaryWithSecondary ? SplitRule.FinishBehavior.ALWAYS + : SplitRule.FinishBehavior.NEVER, + finishSecondaryWithPrimary ? SplitRule.FinishBehavior.ALWAYS + : SplitRule.FinishBehavior.NEVER, clearTop); } @@ -207,17 +222,20 @@ public class ActivityEmbeddingRulesController { final Intent intent = new Intent(mContext, Settings.NetworkDashboardActivity.class); intent.putExtra(SettingsActivity.EXTRA_IS_SECOND_LAYER_PAGE, true); - final SplitPlaceholderRule placeholderRule = new SplitPlaceholderRule( - activityFilters, - intent, - false /* stickyPlaceholder */, - SplitRule.FINISH_ADJACENT, - ActivityEmbeddingUtils.getMinCurrentScreenSplitWidthPx(mContext), - ActivityEmbeddingUtils.getMinSmallestScreenSplitWidthPx(mContext), - ActivityEmbeddingUtils.getSplitRatio(mContext), - LayoutDirection.LOCALE); + SplitAttributes attributes = new SplitAttributes.Builder() + .setSplitType(SplitAttributes.SplitType.ratio( + ActivityEmbeddingUtils.getSplitRatio(mContext))) + .build(); + final SplitPlaceholderRule placeholderRule = new SplitPlaceholderRule.Builder( + activityFilters, intent) + .setMinWidthDp(ActivityEmbeddingUtils.getMinCurrentScreenSplitWidthDp()) + .setMinSmallestWidthDp(ActivityEmbeddingUtils.getMinSmallestScreenSplitWidthDp()) + .setSticky(false) + .setFinishPrimaryWithPlaceholder(SplitRule.FinishBehavior.ADJACENT) + .setDefaultSplitAttributes(attributes) + .build(); - mSplitController.registerRule(placeholderRule); + mSplitController.addRule(placeholderRule); } private void registerAlwaysExpandRule() { @@ -235,14 +253,16 @@ public class ActivityEmbeddingRulesController { addActivityFilter(activityFilters, FaceEnrollIntroduction.class); addActivityFilter(activityFilters, AvatarPickerActivity.class); addActivityFilter(activityFilters, ChooseLockPattern.class); - mSplitController.registerRule(new ActivityRule(activityFilters, true /* alwaysExpand */)); + ActivityRule activityRule = new ActivityRule.Builder(activityFilters).setAlwaysExpand(true) + .build(); + mSplitController.addRule(activityRule); } private static void addActivityFilter(Set activityFilters, Intent intent) { activityFilters.add(new ActivityFilter(COMPONENT_NAME_WILDCARD, intent.getAction())); } - private void addActivityFilter(Set activityFilters, + private void addActivityFilter(Collection activityFilters, Class activityClass) { activityFilters.add(new ActivityFilter(new ComponentName(mContext, activityClass), null /* intentAction */)); diff --git a/src/com/android/settings/activityembedding/ActivityEmbeddingUtils.java b/src/com/android/settings/activityembedding/ActivityEmbeddingUtils.java index fdf13142cb8..63ea9cd519d 100644 --- a/src/com/android/settings/activityembedding/ActivityEmbeddingUtils.java +++ b/src/com/android/settings/activityembedding/ActivityEmbeddingUtils.java @@ -30,29 +30,25 @@ import com.android.settings.R; /** An util class collecting all common methods for the embedding activity features. */ public class ActivityEmbeddingUtils { // The smallest value of current width of the window when the split should be used. - private static final float MIN_CURRENT_SCREEN_SPLIT_WIDTH_DP = 720f; + private static final int MIN_CURRENT_SCREEN_SPLIT_WIDTH_DP = 720; // The smallest value of the smallest-width (sw) of the window in any rotation when // the split should be used. - private static final float MIN_SMALLEST_SCREEN_SPLIT_WIDTH_DP = 600f; + private static final int MIN_SMALLEST_SCREEN_SPLIT_WIDTH_DP = 600; // The minimum width of the activity to show the regular homepage layout. private static final float MIN_REGULAR_HOMEPAGE_LAYOUT_WIDTH_DP = 380f; private static final String TAG = "ActivityEmbeddingUtils"; - /** Get the smallest pixel value of width of the window when the split should be used. */ - public static int getMinCurrentScreenSplitWidthPx(Context context) { - final DisplayMetrics dm = context.getResources().getDisplayMetrics(); - return (int) TypedValue.applyDimension( - TypedValue.COMPLEX_UNIT_DIP, MIN_CURRENT_SCREEN_SPLIT_WIDTH_DP, dm); + /** Get the smallest width dp of the window when the split should be used. */ + public static int getMinCurrentScreenSplitWidthDp() { + return MIN_CURRENT_SCREEN_SPLIT_WIDTH_DP; } /** - * Get the smallest pixel value of the smallest-width (sw) of the window in any rotation when + * Get the smallest dp value of the smallest-width (sw) of the window in any rotation when * the split should be used. */ - public static int getMinSmallestScreenSplitWidthPx(Context context) { - final DisplayMetrics dm = context.getResources().getDisplayMetrics(); - return (int) TypedValue.applyDimension( - TypedValue.COMPLEX_UNIT_DIP, MIN_SMALLEST_SCREEN_SPLIT_WIDTH_DP, dm); + public static int getMinSmallestScreenSplitWidthDp() { + return MIN_SMALLEST_SCREEN_SPLIT_WIDTH_DP; } /** @@ -67,7 +63,7 @@ public class ActivityEmbeddingUtils { public static boolean isEmbeddingActivityEnabled(Context context) { final boolean isFlagEnabled = FeatureFlagUtils.isEnabled(context, FeatureFlagUtils.SETTINGS_SUPPORT_LARGE_SCREEN); - final boolean isSplitSupported = SplitController.getInstance().isSplitSupported(); + final boolean isSplitSupported = SplitController.getInstance(context).isSplitSupported(); Log.d(TAG, "isFlagEnabled = " + isFlagEnabled); Log.d(TAG, "isSplitSupported = " + isSplitSupported); diff --git a/src/com/android/settings/homepage/SettingsHomepageActivity.java b/src/com/android/settings/homepage/SettingsHomepageActivity.java index 2961abbd895..67bbcb83c0f 100644 --- a/src/com/android/settings/homepage/SettingsHomepageActivity.java +++ b/src/com/android/settings/homepage/SettingsHomepageActivity.java @@ -190,7 +190,7 @@ public class SettingsHomepageActivity extends FragmentActivity implements setupEdgeToEdge(); setContentView(R.layout.settings_homepage_container); - mSplitController = SplitController.getInstance(); + mSplitController = SplitController.getInstance(this); mIsTwoPane = mSplitController.isActivityEmbedded(this); updateAppBarMinHeight(); @@ -518,15 +518,15 @@ public class SettingsHomepageActivity extends FragmentActivity implements new ComponentName(getApplicationContext(), getClass()), targetComponentName, targetIntent.getAction(), - SplitRule.FINISH_ALWAYS, - SplitRule.FINISH_ALWAYS, + SplitRule.FinishBehavior.ALWAYS, + SplitRule.FinishBehavior.ALWAYS, true /* clearTop */); ActivityEmbeddingRulesController.registerTwoPanePairRule(this, new ComponentName(getApplicationContext(), Settings.class), targetComponentName, targetIntent.getAction(), - SplitRule.FINISH_ALWAYS, - SplitRule.FINISH_ALWAYS, + SplitRule.FinishBehavior.ALWAYS, + SplitRule.FinishBehavior.ALWAYS, true /* clearTop */); final UserHandle user = intent.getParcelableExtra(EXTRA_USER_HANDLE, UserHandle.class); diff --git a/src/com/android/settings/homepage/TopLevelSettings.java b/src/com/android/settings/homepage/TopLevelSettings.java index 8c122ef2ad6..ba1228add6d 100644 --- a/src/com/android/settings/homepage/TopLevelSettings.java +++ b/src/com/android/settings/homepage/TopLevelSettings.java @@ -65,6 +65,7 @@ public class TopLevelSettings extends DashboardFragment implements SplitLayoutLi private int mPaddingHorizontal; private boolean mScrollNeeded = true; private boolean mFirstStarted = true; + private SplitController mSplitController; public TopLevelSettings() { final Bundle args = new Bundle(); @@ -143,7 +144,7 @@ public class TopLevelSettings extends DashboardFragment implements SplitLayoutLi return; } - boolean activityEmbedded = SplitController.getInstance().isActivityEmbedded(getActivity()); + boolean activityEmbedded = isActivityEmbedded(); if (icicle != null) { mHighlightMixin = icicle.getParcelable(SAVED_HIGHLIGHT_MIXIN); mScrollNeeded = !mHighlightMixin.isActivityEmbedded() && activityEmbedded; @@ -154,6 +155,14 @@ public class TopLevelSettings extends DashboardFragment implements SplitLayoutLi } } + /** Wrap SplitController#isActivityEmbedded for testing. */ + public boolean isActivityEmbedded() { + if (mSplitController == null) { + mSplitController = SplitController.getInstance(getActivity()); + } + return mSplitController.isActivityEmbedded(getActivity()); + } + @Override public void onStart() { if (mFirstStarted) { @@ -161,7 +170,7 @@ public class TopLevelSettings extends DashboardFragment implements SplitLayoutLi FeatureFactory.getFactory(getContext()).getSearchFeatureProvider().sendPreIndexIntent( getContext()); } else if (mIsEmbeddingActivityEnabled && isOnlyOneActivityInTask() - && !SplitController.getInstance().isActivityEmbedded(getActivity())) { + && !isActivityEmbedded()) { // Set default highlight menu key for 1-pane homepage since it will show the placeholder // page once changing back to 2-pane. Log.i(TAG, "Set default menu key"); @@ -286,7 +295,7 @@ public class TopLevelSettings extends DashboardFragment implements SplitLayoutLi * 3. the current activity is embedded */ return mHighlightMixin != null && TextUtils.equals(pref.getKey(), mHighlightMixin.getHighlightPreferenceKey()) - && SplitController.getInstance().isActivityEmbedded(getActivity()); + && isActivityEmbedded(); } /** Show/hide the highlight on the menu entry for the search page presence */ diff --git a/src/com/android/settings/widget/HighlightableTopLevelPreferenceAdapter.java b/src/com/android/settings/widget/HighlightableTopLevelPreferenceAdapter.java index 3cc7ef27f7e..c08f79423c7 100644 --- a/src/com/android/settings/widget/HighlightableTopLevelPreferenceAdapter.java +++ b/src/com/android/settings/widget/HighlightableTopLevelPreferenceAdapter.java @@ -250,6 +250,6 @@ public class HighlightableTopLevelPreferenceAdapter extends PreferenceGroupAdapt } private boolean isHighlightNeeded() { - return SplitController.getInstance().isActivityEmbedded(mHomepageActivity); + return SplitController.getInstance(mHomepageActivity).isActivityEmbedded(mHomepageActivity); } }