Loading src/com/android/settings/SettingsInitialize.java +1 −1 Original line number Original line Diff line number Diff line Loading @@ -154,7 +154,7 @@ public class SettingsInitialize extends BroadcastReceiver { DeepLinkHomepageActivity.class); DeepLinkHomepageActivity.class); final ComponentName searchStateReceiver = new ComponentName(context, final ComponentName searchStateReceiver = new ComponentName(context, SearchStateReceiver.class); SearchStateReceiver.class); final int enableState = SplitController.getInstance().isSplitSupported() final int enableState = SplitController.getInstance(context).isSplitSupported() ? PackageManager.COMPONENT_ENABLED_STATE_ENABLED ? PackageManager.COMPONENT_ENABLED_STATE_ENABLED : PackageManager.COMPONENT_ENABLED_STATE_DISABLED; : PackageManager.COMPONENT_ENABLED_STATE_DISABLED; pm.setComponentEnabledSetting(deepLinkHome, enableState, PackageManager.DONT_KILL_APP); pm.setComponentEnabledSetting(deepLinkHome, enableState, PackageManager.DONT_KILL_APP); Loading src/com/android/settings/activityembedding/ActivityEmbeddingRulesController.java +53 −33 Original line number Original line Diff line number Diff line Loading @@ -22,11 +22,11 @@ import android.content.ComponentName; import android.content.Context; import android.content.Context; import android.content.Intent; import android.content.Intent; import android.util.FeatureFlagUtils; import android.util.FeatureFlagUtils; import android.util.LayoutDirection; import android.util.Log; import android.util.Log; import androidx.window.embedding.ActivityFilter; import androidx.window.embedding.ActivityFilter; import androidx.window.embedding.ActivityRule; import androidx.window.embedding.ActivityRule; import androidx.window.embedding.SplitAttributes; import androidx.window.embedding.SplitController; import androidx.window.embedding.SplitController; import androidx.window.embedding.SplitPairFilter; import androidx.window.embedding.SplitPairFilter; import androidx.window.embedding.SplitPairRule; import androidx.window.embedding.SplitPairRule; Loading @@ -46,6 +46,7 @@ import com.android.settings.homepage.SettingsHomepageActivity; import com.android.settings.overlay.FeatureFactory; import com.android.settings.overlay.FeatureFactory; import com.android.settingslib.users.AvatarPickerActivity; import com.android.settingslib.users.AvatarPickerActivity; import java.util.Collection; import java.util.HashSet; import java.util.HashSet; import java.util.Set; import java.util.Set; Loading @@ -60,7 +61,7 @@ public class ActivityEmbeddingRulesController { public ActivityEmbeddingRulesController(Context context) { public ActivityEmbeddingRulesController(Context context) { mContext = context; mContext = context; mSplitController = SplitController.getInstance(); mSplitController = SplitController.getInstance(context); } } /** /** Loading @@ -85,8 +86,8 @@ public class ActivityEmbeddingRulesController { ComponentName primaryComponent, ComponentName primaryComponent, ComponentName secondaryComponent, ComponentName secondaryComponent, String secondaryIntentAction, String secondaryIntentAction, int finishPrimaryWithSecondary, SplitRule.FinishBehavior finishPrimaryWithSecondary, int finishSecondaryWithPrimary, SplitRule.FinishBehavior finishSecondaryWithPrimary, boolean clearTop) { boolean clearTop) { if (!ActivityEmbeddingUtils.isEmbeddingActivityEnabled(context)) { if (!ActivityEmbeddingUtils.isEmbeddingActivityEnabled(context)) { return; return; Loading @@ -95,14 +96,20 @@ public class ActivityEmbeddingRulesController { filters.add(new SplitPairFilter(primaryComponent, secondaryComponent, filters.add(new SplitPairFilter(primaryComponent, secondaryComponent, secondaryIntentAction)); secondaryIntentAction)); SplitController.getInstance().registerRule(new SplitPairRule(filters, SplitAttributes attributes = new SplitAttributes.Builder() finishPrimaryWithSecondary, .setSplitType(SplitAttributes.SplitType.ratio( finishSecondaryWithPrimary, ActivityEmbeddingUtils.getSplitRatio(context))) clearTop, .setLayoutDirection(SplitAttributes.LayoutDirection.LOCALE) ActivityEmbeddingUtils.getMinCurrentScreenSplitWidthPx(context), .build(); ActivityEmbeddingUtils.getMinSmallestScreenSplitWidthPx(context), SplitPairRule splitPairRule = new SplitPairRule.Builder(filters) ActivityEmbeddingUtils.getSplitRatio(context), .setFinishPrimaryWithSecondary(finishPrimaryWithSecondary) LayoutDirection.LOCALE)); .setFinishSecondaryWithPrimary(finishSecondaryWithPrimary) .setClearTop(clearTop) .setMinWidthDp(ActivityEmbeddingUtils.getMinCurrentScreenSplitWidthDp()) .setMinSmallestWidthDp(ActivityEmbeddingUtils.getMinSmallestScreenSplitWidthDp()) .setDefaultSplitAttributes(attributes) .build(); SplitController.getInstance(context).addRule(splitPairRule); } } /** /** Loading @@ -123,8 +130,10 @@ public class ActivityEmbeddingRulesController { new ComponentName(context, Settings.class), new ComponentName(context, Settings.class), secondaryComponent, secondaryComponent, secondaryIntentAction, secondaryIntentAction, finishPrimaryWithSecondary ? SplitRule.FINISH_ADJACENT : SplitRule.FINISH_NEVER, finishPrimaryWithSecondary ? SplitRule.FinishBehavior.ADJACENT finishSecondaryWithPrimary ? SplitRule.FINISH_ADJACENT : SplitRule.FINISH_NEVER, : SplitRule.FinishBehavior.NEVER, finishSecondaryWithPrimary ? SplitRule.FinishBehavior.ADJACENT : SplitRule.FinishBehavior.NEVER, clearTop); clearTop); registerTwoPanePairRule( registerTwoPanePairRule( Loading @@ -132,8 +141,10 @@ public class ActivityEmbeddingRulesController { new ComponentName(context, SettingsHomepageActivity.class), new ComponentName(context, SettingsHomepageActivity.class), secondaryComponent, secondaryComponent, secondaryIntentAction, secondaryIntentAction, finishPrimaryWithSecondary ? SplitRule.FINISH_ADJACENT : SplitRule.FINISH_NEVER, finishPrimaryWithSecondary ? SplitRule.FinishBehavior.ADJACENT finishSecondaryWithPrimary ? SplitRule.FINISH_ADJACENT : SplitRule.FINISH_NEVER, : SplitRule.FinishBehavior.NEVER, finishSecondaryWithPrimary ? SplitRule.FinishBehavior.ADJACENT : SplitRule.FinishBehavior.NEVER, clearTop); clearTop); // We should finish HomePageActivity altogether even if it shows in single pane for all deep // We should finish HomePageActivity altogether even if it shows in single pane for all deep Loading @@ -143,8 +154,10 @@ public class ActivityEmbeddingRulesController { new ComponentName(context, DeepLinkHomepageActivity.class), new ComponentName(context, DeepLinkHomepageActivity.class), secondaryComponent, secondaryComponent, secondaryIntentAction, secondaryIntentAction, finishPrimaryWithSecondary ? SplitRule.FINISH_ALWAYS : SplitRule.FINISH_NEVER, finishPrimaryWithSecondary ? SplitRule.FinishBehavior.ALWAYS finishSecondaryWithPrimary ? SplitRule.FINISH_ALWAYS : SplitRule.FINISH_NEVER, : SplitRule.FinishBehavior.NEVER, finishSecondaryWithPrimary ? SplitRule.FinishBehavior.ALWAYS : SplitRule.FinishBehavior.NEVER, clearTop); clearTop); registerTwoPanePairRule( registerTwoPanePairRule( Loading @@ -152,8 +165,10 @@ public class ActivityEmbeddingRulesController { new ComponentName(context, DeepLinkHomepageActivityInternal.class), new ComponentName(context, DeepLinkHomepageActivityInternal.class), secondaryComponent, secondaryComponent, secondaryIntentAction, secondaryIntentAction, finishPrimaryWithSecondary ? SplitRule.FINISH_ALWAYS : SplitRule.FINISH_NEVER, finishPrimaryWithSecondary ? SplitRule.FinishBehavior.ALWAYS finishSecondaryWithPrimary ? SplitRule.FINISH_ALWAYS : SplitRule.FINISH_NEVER, : SplitRule.FinishBehavior.NEVER, finishSecondaryWithPrimary ? SplitRule.FinishBehavior.ALWAYS : SplitRule.FinishBehavior.NEVER, clearTop); clearTop); } } Loading Loading @@ -204,17 +219,20 @@ public class ActivityEmbeddingRulesController { final Intent intent = new Intent(mContext, Settings.NetworkDashboardActivity.class); final Intent intent = new Intent(mContext, Settings.NetworkDashboardActivity.class); intent.putExtra(SettingsActivity.EXTRA_IS_SECOND_LAYER_PAGE, true); intent.putExtra(SettingsActivity.EXTRA_IS_SECOND_LAYER_PAGE, true); final SplitPlaceholderRule placeholderRule = new SplitPlaceholderRule( SplitAttributes attributes = new SplitAttributes.Builder() activityFilters, .setSplitType(SplitAttributes.SplitType.ratio( intent, ActivityEmbeddingUtils.getSplitRatio(mContext))) false /* stickyPlaceholder */, .build(); SplitRule.FINISH_ADJACENT, final SplitPlaceholderRule placeholderRule = new SplitPlaceholderRule.Builder( ActivityEmbeddingUtils.getMinCurrentScreenSplitWidthPx(mContext), activityFilters, intent) ActivityEmbeddingUtils.getMinSmallestScreenSplitWidthPx(mContext), .setMinWidthDp(ActivityEmbeddingUtils.getMinCurrentScreenSplitWidthDp()) ActivityEmbeddingUtils.getSplitRatio(mContext), .setMinSmallestWidthDp(ActivityEmbeddingUtils.getMinSmallestScreenSplitWidthDp()) LayoutDirection.LOCALE); .setSticky(false) .setFinishPrimaryWithPlaceholder(SplitRule.FinishBehavior.ADJACENT) .setDefaultSplitAttributes(attributes) .build(); mSplitController.registerRule(placeholderRule); mSplitController.addRule(placeholderRule); } } private void registerAlwaysExpandRule() { private void registerAlwaysExpandRule() { Loading @@ -229,14 +247,16 @@ public class ActivityEmbeddingRulesController { addActivityFilter(activityFilters, FingerprintEnrollIntroductionInternal.class); addActivityFilter(activityFilters, FingerprintEnrollIntroductionInternal.class); addActivityFilter(activityFilters, FingerprintEnrollEnrolling.class); addActivityFilter(activityFilters, FingerprintEnrollEnrolling.class); addActivityFilter(activityFilters, AvatarPickerActivity.class); addActivityFilter(activityFilters, AvatarPickerActivity.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<ActivityFilter> activityFilters, Intent intent) { private static void addActivityFilter(Set<ActivityFilter> activityFilters, Intent intent) { activityFilters.add(new ActivityFilter(COMPONENT_NAME_WILDCARD, intent.getAction())); activityFilters.add(new ActivityFilter(COMPONENT_NAME_WILDCARD, intent.getAction())); } } private void addActivityFilter(Set<ActivityFilter> activityFilters, private void addActivityFilter(Collection<ActivityFilter> activityFilters, Class<? extends Activity> activityClass) { Class<? extends Activity> activityClass) { activityFilters.add(new ActivityFilter(new ComponentName(mContext, activityClass), activityFilters.add(new ActivityFilter(new ComponentName(mContext, activityClass), null /* intentAction */)); null /* intentAction */)); Loading src/com/android/settings/activityembedding/ActivityEmbeddingUtils.java +9 −13 Original line number Original line Diff line number Diff line Loading @@ -30,29 +30,25 @@ import com.android.settings.R; /** An util class collecting all common methods for the embedding activity features. */ /** An util class collecting all common methods for the embedding activity features. */ public class ActivityEmbeddingUtils { public class ActivityEmbeddingUtils { // The smallest value of current width of the window when the split should be used. // 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 smallest value of the smallest-width (sw) of the window in any rotation when // the split should be used. // 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. // 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 float MIN_REGULAR_HOMEPAGE_LAYOUT_WIDTH_DP = 380f; private static final String TAG = "ActivityEmbeddingUtils"; private static final String TAG = "ActivityEmbeddingUtils"; /** Get the smallest pixel value of width of the window when the split should be used. */ /** Get the smallest width dp of the window when the split should be used. */ public static int getMinCurrentScreenSplitWidthPx(Context context) { public static int getMinCurrentScreenSplitWidthDp() { final DisplayMetrics dm = context.getResources().getDisplayMetrics(); return MIN_CURRENT_SCREEN_SPLIT_WIDTH_DP; return (int) TypedValue.applyDimension( TypedValue.COMPLEX_UNIT_DIP, MIN_CURRENT_SCREEN_SPLIT_WIDTH_DP, dm); } } /** /** * 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. * the split should be used. */ */ public static int getMinSmallestScreenSplitWidthPx(Context context) { public static int getMinSmallestScreenSplitWidthDp() { final DisplayMetrics dm = context.getResources().getDisplayMetrics(); return MIN_SMALLEST_SCREEN_SPLIT_WIDTH_DP; return (int) TypedValue.applyDimension( TypedValue.COMPLEX_UNIT_DIP, MIN_SMALLEST_SCREEN_SPLIT_WIDTH_DP, dm); } } /** /** Loading @@ -67,7 +63,7 @@ public class ActivityEmbeddingUtils { public static boolean isEmbeddingActivityEnabled(Context context) { public static boolean isEmbeddingActivityEnabled(Context context) { final boolean isFlagEnabled = FeatureFlagUtils.isEnabled(context, final boolean isFlagEnabled = FeatureFlagUtils.isEnabled(context, FeatureFlagUtils.SETTINGS_SUPPORT_LARGE_SCREEN); 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, "isFlagEnabled = " + isFlagEnabled); Log.d(TAG, "isSplitSupported = " + isSplitSupported); Log.d(TAG, "isSplitSupported = " + isSplitSupported); Loading src/com/android/settings/homepage/SettingsHomepageActivity.java +5 −5 Original line number Original line Diff line number Diff line Loading @@ -190,7 +190,7 @@ public class SettingsHomepageActivity extends FragmentActivity implements setupEdgeToEdge(); setupEdgeToEdge(); setContentView(R.layout.settings_homepage_container); setContentView(R.layout.settings_homepage_container); mSplitController = SplitController.getInstance(); mSplitController = SplitController.getInstance(this); mIsTwoPane = mSplitController.isActivityEmbedded(this); mIsTwoPane = mSplitController.isActivityEmbedded(this); updateAppBarMinHeight(); updateAppBarMinHeight(); Loading Loading @@ -518,15 +518,15 @@ public class SettingsHomepageActivity extends FragmentActivity implements new ComponentName(getApplicationContext(), getClass()), new ComponentName(getApplicationContext(), getClass()), targetComponentName, targetComponentName, targetIntent.getAction(), targetIntent.getAction(), SplitRule.FINISH_ALWAYS, SplitRule.FinishBehavior.ALWAYS, SplitRule.FINISH_ALWAYS, SplitRule.FinishBehavior.ALWAYS, true /* clearTop */); true /* clearTop */); ActivityEmbeddingRulesController.registerTwoPanePairRule(this, ActivityEmbeddingRulesController.registerTwoPanePairRule(this, new ComponentName(getApplicationContext(), Settings.class), new ComponentName(getApplicationContext(), Settings.class), targetComponentName, targetComponentName, targetIntent.getAction(), targetIntent.getAction(), SplitRule.FINISH_ALWAYS, SplitRule.FinishBehavior.ALWAYS, SplitRule.FINISH_ALWAYS, SplitRule.FinishBehavior.ALWAYS, true /* clearTop */); true /* clearTop */); final UserHandle user = intent.getParcelableExtra(EXTRA_USER_HANDLE, UserHandle.class); final UserHandle user = intent.getParcelableExtra(EXTRA_USER_HANDLE, UserHandle.class); Loading src/com/android/settings/homepage/TopLevelSettings.java +12 −3 Original line number Original line Diff line number Diff line Loading @@ -65,6 +65,7 @@ public class TopLevelSettings extends DashboardFragment implements SplitLayoutLi private int mPaddingHorizontal; private int mPaddingHorizontal; private boolean mScrollNeeded = true; private boolean mScrollNeeded = true; private boolean mFirstStarted = true; private boolean mFirstStarted = true; private SplitController mSplitController; public TopLevelSettings() { public TopLevelSettings() { final Bundle args = new Bundle(); final Bundle args = new Bundle(); Loading Loading @@ -143,7 +144,7 @@ public class TopLevelSettings extends DashboardFragment implements SplitLayoutLi return; return; } } boolean activityEmbedded = SplitController.getInstance().isActivityEmbedded(getActivity()); boolean activityEmbedded = isActivityEmbedded(); if (icicle != null) { if (icicle != null) { mHighlightMixin = icicle.getParcelable(SAVED_HIGHLIGHT_MIXIN); mHighlightMixin = icicle.getParcelable(SAVED_HIGHLIGHT_MIXIN); mScrollNeeded = !mHighlightMixin.isActivityEmbedded() && activityEmbedded; mScrollNeeded = !mHighlightMixin.isActivityEmbedded() && activityEmbedded; Loading @@ -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 @Override public void onStart() { public void onStart() { if (mFirstStarted) { if (mFirstStarted) { Loading @@ -161,7 +170,7 @@ public class TopLevelSettings extends DashboardFragment implements SplitLayoutLi FeatureFactory.getFactory(getContext()).getSearchFeatureProvider().sendPreIndexIntent( FeatureFactory.getFactory(getContext()).getSearchFeatureProvider().sendPreIndexIntent( getContext()); getContext()); } else if (mIsEmbeddingActivityEnabled && isOnlyOneActivityInTask() } else if (mIsEmbeddingActivityEnabled && isOnlyOneActivityInTask() && !SplitController.getInstance().isActivityEmbedded(getActivity())) { && !isActivityEmbedded()) { // Set default highlight menu key for 1-pane homepage since it will show the placeholder // Set default highlight menu key for 1-pane homepage since it will show the placeholder // page once changing back to 2-pane. // page once changing back to 2-pane. Log.i(TAG, "Set default menu key"); Log.i(TAG, "Set default menu key"); Loading Loading @@ -286,7 +295,7 @@ public class TopLevelSettings extends DashboardFragment implements SplitLayoutLi * 3. the current activity is embedded */ * 3. the current activity is embedded */ return mHighlightMixin != null return mHighlightMixin != null && TextUtils.equals(pref.getKey(), mHighlightMixin.getHighlightPreferenceKey()) && TextUtils.equals(pref.getKey(), mHighlightMixin.getHighlightPreferenceKey()) && SplitController.getInstance().isActivityEmbedded(getActivity()); && isActivityEmbedded(); } } /** Show/hide the highlight on the menu entry for the search page presence */ /** Show/hide the highlight on the menu entry for the search page presence */ Loading Loading
src/com/android/settings/SettingsInitialize.java +1 −1 Original line number Original line Diff line number Diff line Loading @@ -154,7 +154,7 @@ public class SettingsInitialize extends BroadcastReceiver { DeepLinkHomepageActivity.class); DeepLinkHomepageActivity.class); final ComponentName searchStateReceiver = new ComponentName(context, final ComponentName searchStateReceiver = new ComponentName(context, SearchStateReceiver.class); SearchStateReceiver.class); final int enableState = SplitController.getInstance().isSplitSupported() final int enableState = SplitController.getInstance(context).isSplitSupported() ? PackageManager.COMPONENT_ENABLED_STATE_ENABLED ? PackageManager.COMPONENT_ENABLED_STATE_ENABLED : PackageManager.COMPONENT_ENABLED_STATE_DISABLED; : PackageManager.COMPONENT_ENABLED_STATE_DISABLED; pm.setComponentEnabledSetting(deepLinkHome, enableState, PackageManager.DONT_KILL_APP); pm.setComponentEnabledSetting(deepLinkHome, enableState, PackageManager.DONT_KILL_APP); Loading
src/com/android/settings/activityembedding/ActivityEmbeddingRulesController.java +53 −33 Original line number Original line Diff line number Diff line Loading @@ -22,11 +22,11 @@ import android.content.ComponentName; import android.content.Context; import android.content.Context; import android.content.Intent; import android.content.Intent; import android.util.FeatureFlagUtils; import android.util.FeatureFlagUtils; import android.util.LayoutDirection; import android.util.Log; import android.util.Log; import androidx.window.embedding.ActivityFilter; import androidx.window.embedding.ActivityFilter; import androidx.window.embedding.ActivityRule; import androidx.window.embedding.ActivityRule; import androidx.window.embedding.SplitAttributes; import androidx.window.embedding.SplitController; import androidx.window.embedding.SplitController; import androidx.window.embedding.SplitPairFilter; import androidx.window.embedding.SplitPairFilter; import androidx.window.embedding.SplitPairRule; import androidx.window.embedding.SplitPairRule; Loading @@ -46,6 +46,7 @@ import com.android.settings.homepage.SettingsHomepageActivity; import com.android.settings.overlay.FeatureFactory; import com.android.settings.overlay.FeatureFactory; import com.android.settingslib.users.AvatarPickerActivity; import com.android.settingslib.users.AvatarPickerActivity; import java.util.Collection; import java.util.HashSet; import java.util.HashSet; import java.util.Set; import java.util.Set; Loading @@ -60,7 +61,7 @@ public class ActivityEmbeddingRulesController { public ActivityEmbeddingRulesController(Context context) { public ActivityEmbeddingRulesController(Context context) { mContext = context; mContext = context; mSplitController = SplitController.getInstance(); mSplitController = SplitController.getInstance(context); } } /** /** Loading @@ -85,8 +86,8 @@ public class ActivityEmbeddingRulesController { ComponentName primaryComponent, ComponentName primaryComponent, ComponentName secondaryComponent, ComponentName secondaryComponent, String secondaryIntentAction, String secondaryIntentAction, int finishPrimaryWithSecondary, SplitRule.FinishBehavior finishPrimaryWithSecondary, int finishSecondaryWithPrimary, SplitRule.FinishBehavior finishSecondaryWithPrimary, boolean clearTop) { boolean clearTop) { if (!ActivityEmbeddingUtils.isEmbeddingActivityEnabled(context)) { if (!ActivityEmbeddingUtils.isEmbeddingActivityEnabled(context)) { return; return; Loading @@ -95,14 +96,20 @@ public class ActivityEmbeddingRulesController { filters.add(new SplitPairFilter(primaryComponent, secondaryComponent, filters.add(new SplitPairFilter(primaryComponent, secondaryComponent, secondaryIntentAction)); secondaryIntentAction)); SplitController.getInstance().registerRule(new SplitPairRule(filters, SplitAttributes attributes = new SplitAttributes.Builder() finishPrimaryWithSecondary, .setSplitType(SplitAttributes.SplitType.ratio( finishSecondaryWithPrimary, ActivityEmbeddingUtils.getSplitRatio(context))) clearTop, .setLayoutDirection(SplitAttributes.LayoutDirection.LOCALE) ActivityEmbeddingUtils.getMinCurrentScreenSplitWidthPx(context), .build(); ActivityEmbeddingUtils.getMinSmallestScreenSplitWidthPx(context), SplitPairRule splitPairRule = new SplitPairRule.Builder(filters) ActivityEmbeddingUtils.getSplitRatio(context), .setFinishPrimaryWithSecondary(finishPrimaryWithSecondary) LayoutDirection.LOCALE)); .setFinishSecondaryWithPrimary(finishSecondaryWithPrimary) .setClearTop(clearTop) .setMinWidthDp(ActivityEmbeddingUtils.getMinCurrentScreenSplitWidthDp()) .setMinSmallestWidthDp(ActivityEmbeddingUtils.getMinSmallestScreenSplitWidthDp()) .setDefaultSplitAttributes(attributes) .build(); SplitController.getInstance(context).addRule(splitPairRule); } } /** /** Loading @@ -123,8 +130,10 @@ public class ActivityEmbeddingRulesController { new ComponentName(context, Settings.class), new ComponentName(context, Settings.class), secondaryComponent, secondaryComponent, secondaryIntentAction, secondaryIntentAction, finishPrimaryWithSecondary ? SplitRule.FINISH_ADJACENT : SplitRule.FINISH_NEVER, finishPrimaryWithSecondary ? SplitRule.FinishBehavior.ADJACENT finishSecondaryWithPrimary ? SplitRule.FINISH_ADJACENT : SplitRule.FINISH_NEVER, : SplitRule.FinishBehavior.NEVER, finishSecondaryWithPrimary ? SplitRule.FinishBehavior.ADJACENT : SplitRule.FinishBehavior.NEVER, clearTop); clearTop); registerTwoPanePairRule( registerTwoPanePairRule( Loading @@ -132,8 +141,10 @@ public class ActivityEmbeddingRulesController { new ComponentName(context, SettingsHomepageActivity.class), new ComponentName(context, SettingsHomepageActivity.class), secondaryComponent, secondaryComponent, secondaryIntentAction, secondaryIntentAction, finishPrimaryWithSecondary ? SplitRule.FINISH_ADJACENT : SplitRule.FINISH_NEVER, finishPrimaryWithSecondary ? SplitRule.FinishBehavior.ADJACENT finishSecondaryWithPrimary ? SplitRule.FINISH_ADJACENT : SplitRule.FINISH_NEVER, : SplitRule.FinishBehavior.NEVER, finishSecondaryWithPrimary ? SplitRule.FinishBehavior.ADJACENT : SplitRule.FinishBehavior.NEVER, clearTop); clearTop); // We should finish HomePageActivity altogether even if it shows in single pane for all deep // We should finish HomePageActivity altogether even if it shows in single pane for all deep Loading @@ -143,8 +154,10 @@ public class ActivityEmbeddingRulesController { new ComponentName(context, DeepLinkHomepageActivity.class), new ComponentName(context, DeepLinkHomepageActivity.class), secondaryComponent, secondaryComponent, secondaryIntentAction, secondaryIntentAction, finishPrimaryWithSecondary ? SplitRule.FINISH_ALWAYS : SplitRule.FINISH_NEVER, finishPrimaryWithSecondary ? SplitRule.FinishBehavior.ALWAYS finishSecondaryWithPrimary ? SplitRule.FINISH_ALWAYS : SplitRule.FINISH_NEVER, : SplitRule.FinishBehavior.NEVER, finishSecondaryWithPrimary ? SplitRule.FinishBehavior.ALWAYS : SplitRule.FinishBehavior.NEVER, clearTop); clearTop); registerTwoPanePairRule( registerTwoPanePairRule( Loading @@ -152,8 +165,10 @@ public class ActivityEmbeddingRulesController { new ComponentName(context, DeepLinkHomepageActivityInternal.class), new ComponentName(context, DeepLinkHomepageActivityInternal.class), secondaryComponent, secondaryComponent, secondaryIntentAction, secondaryIntentAction, finishPrimaryWithSecondary ? SplitRule.FINISH_ALWAYS : SplitRule.FINISH_NEVER, finishPrimaryWithSecondary ? SplitRule.FinishBehavior.ALWAYS finishSecondaryWithPrimary ? SplitRule.FINISH_ALWAYS : SplitRule.FINISH_NEVER, : SplitRule.FinishBehavior.NEVER, finishSecondaryWithPrimary ? SplitRule.FinishBehavior.ALWAYS : SplitRule.FinishBehavior.NEVER, clearTop); clearTop); } } Loading Loading @@ -204,17 +219,20 @@ public class ActivityEmbeddingRulesController { final Intent intent = new Intent(mContext, Settings.NetworkDashboardActivity.class); final Intent intent = new Intent(mContext, Settings.NetworkDashboardActivity.class); intent.putExtra(SettingsActivity.EXTRA_IS_SECOND_LAYER_PAGE, true); intent.putExtra(SettingsActivity.EXTRA_IS_SECOND_LAYER_PAGE, true); final SplitPlaceholderRule placeholderRule = new SplitPlaceholderRule( SplitAttributes attributes = new SplitAttributes.Builder() activityFilters, .setSplitType(SplitAttributes.SplitType.ratio( intent, ActivityEmbeddingUtils.getSplitRatio(mContext))) false /* stickyPlaceholder */, .build(); SplitRule.FINISH_ADJACENT, final SplitPlaceholderRule placeholderRule = new SplitPlaceholderRule.Builder( ActivityEmbeddingUtils.getMinCurrentScreenSplitWidthPx(mContext), activityFilters, intent) ActivityEmbeddingUtils.getMinSmallestScreenSplitWidthPx(mContext), .setMinWidthDp(ActivityEmbeddingUtils.getMinCurrentScreenSplitWidthDp()) ActivityEmbeddingUtils.getSplitRatio(mContext), .setMinSmallestWidthDp(ActivityEmbeddingUtils.getMinSmallestScreenSplitWidthDp()) LayoutDirection.LOCALE); .setSticky(false) .setFinishPrimaryWithPlaceholder(SplitRule.FinishBehavior.ADJACENT) .setDefaultSplitAttributes(attributes) .build(); mSplitController.registerRule(placeholderRule); mSplitController.addRule(placeholderRule); } } private void registerAlwaysExpandRule() { private void registerAlwaysExpandRule() { Loading @@ -229,14 +247,16 @@ public class ActivityEmbeddingRulesController { addActivityFilter(activityFilters, FingerprintEnrollIntroductionInternal.class); addActivityFilter(activityFilters, FingerprintEnrollIntroductionInternal.class); addActivityFilter(activityFilters, FingerprintEnrollEnrolling.class); addActivityFilter(activityFilters, FingerprintEnrollEnrolling.class); addActivityFilter(activityFilters, AvatarPickerActivity.class); addActivityFilter(activityFilters, AvatarPickerActivity.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<ActivityFilter> activityFilters, Intent intent) { private static void addActivityFilter(Set<ActivityFilter> activityFilters, Intent intent) { activityFilters.add(new ActivityFilter(COMPONENT_NAME_WILDCARD, intent.getAction())); activityFilters.add(new ActivityFilter(COMPONENT_NAME_WILDCARD, intent.getAction())); } } private void addActivityFilter(Set<ActivityFilter> activityFilters, private void addActivityFilter(Collection<ActivityFilter> activityFilters, Class<? extends Activity> activityClass) { Class<? extends Activity> activityClass) { activityFilters.add(new ActivityFilter(new ComponentName(mContext, activityClass), activityFilters.add(new ActivityFilter(new ComponentName(mContext, activityClass), null /* intentAction */)); null /* intentAction */)); Loading
src/com/android/settings/activityembedding/ActivityEmbeddingUtils.java +9 −13 Original line number Original line Diff line number Diff line Loading @@ -30,29 +30,25 @@ import com.android.settings.R; /** An util class collecting all common methods for the embedding activity features. */ /** An util class collecting all common methods for the embedding activity features. */ public class ActivityEmbeddingUtils { public class ActivityEmbeddingUtils { // The smallest value of current width of the window when the split should be used. // 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 smallest value of the smallest-width (sw) of the window in any rotation when // the split should be used. // 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. // 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 float MIN_REGULAR_HOMEPAGE_LAYOUT_WIDTH_DP = 380f; private static final String TAG = "ActivityEmbeddingUtils"; private static final String TAG = "ActivityEmbeddingUtils"; /** Get the smallest pixel value of width of the window when the split should be used. */ /** Get the smallest width dp of the window when the split should be used. */ public static int getMinCurrentScreenSplitWidthPx(Context context) { public static int getMinCurrentScreenSplitWidthDp() { final DisplayMetrics dm = context.getResources().getDisplayMetrics(); return MIN_CURRENT_SCREEN_SPLIT_WIDTH_DP; return (int) TypedValue.applyDimension( TypedValue.COMPLEX_UNIT_DIP, MIN_CURRENT_SCREEN_SPLIT_WIDTH_DP, dm); } } /** /** * 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. * the split should be used. */ */ public static int getMinSmallestScreenSplitWidthPx(Context context) { public static int getMinSmallestScreenSplitWidthDp() { final DisplayMetrics dm = context.getResources().getDisplayMetrics(); return MIN_SMALLEST_SCREEN_SPLIT_WIDTH_DP; return (int) TypedValue.applyDimension( TypedValue.COMPLEX_UNIT_DIP, MIN_SMALLEST_SCREEN_SPLIT_WIDTH_DP, dm); } } /** /** Loading @@ -67,7 +63,7 @@ public class ActivityEmbeddingUtils { public static boolean isEmbeddingActivityEnabled(Context context) { public static boolean isEmbeddingActivityEnabled(Context context) { final boolean isFlagEnabled = FeatureFlagUtils.isEnabled(context, final boolean isFlagEnabled = FeatureFlagUtils.isEnabled(context, FeatureFlagUtils.SETTINGS_SUPPORT_LARGE_SCREEN); 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, "isFlagEnabled = " + isFlagEnabled); Log.d(TAG, "isSplitSupported = " + isSplitSupported); Log.d(TAG, "isSplitSupported = " + isSplitSupported); Loading
src/com/android/settings/homepage/SettingsHomepageActivity.java +5 −5 Original line number Original line Diff line number Diff line Loading @@ -190,7 +190,7 @@ public class SettingsHomepageActivity extends FragmentActivity implements setupEdgeToEdge(); setupEdgeToEdge(); setContentView(R.layout.settings_homepage_container); setContentView(R.layout.settings_homepage_container); mSplitController = SplitController.getInstance(); mSplitController = SplitController.getInstance(this); mIsTwoPane = mSplitController.isActivityEmbedded(this); mIsTwoPane = mSplitController.isActivityEmbedded(this); updateAppBarMinHeight(); updateAppBarMinHeight(); Loading Loading @@ -518,15 +518,15 @@ public class SettingsHomepageActivity extends FragmentActivity implements new ComponentName(getApplicationContext(), getClass()), new ComponentName(getApplicationContext(), getClass()), targetComponentName, targetComponentName, targetIntent.getAction(), targetIntent.getAction(), SplitRule.FINISH_ALWAYS, SplitRule.FinishBehavior.ALWAYS, SplitRule.FINISH_ALWAYS, SplitRule.FinishBehavior.ALWAYS, true /* clearTop */); true /* clearTop */); ActivityEmbeddingRulesController.registerTwoPanePairRule(this, ActivityEmbeddingRulesController.registerTwoPanePairRule(this, new ComponentName(getApplicationContext(), Settings.class), new ComponentName(getApplicationContext(), Settings.class), targetComponentName, targetComponentName, targetIntent.getAction(), targetIntent.getAction(), SplitRule.FINISH_ALWAYS, SplitRule.FinishBehavior.ALWAYS, SplitRule.FINISH_ALWAYS, SplitRule.FinishBehavior.ALWAYS, true /* clearTop */); true /* clearTop */); final UserHandle user = intent.getParcelableExtra(EXTRA_USER_HANDLE, UserHandle.class); final UserHandle user = intent.getParcelableExtra(EXTRA_USER_HANDLE, UserHandle.class); Loading
src/com/android/settings/homepage/TopLevelSettings.java +12 −3 Original line number Original line Diff line number Diff line Loading @@ -65,6 +65,7 @@ public class TopLevelSettings extends DashboardFragment implements SplitLayoutLi private int mPaddingHorizontal; private int mPaddingHorizontal; private boolean mScrollNeeded = true; private boolean mScrollNeeded = true; private boolean mFirstStarted = true; private boolean mFirstStarted = true; private SplitController mSplitController; public TopLevelSettings() { public TopLevelSettings() { final Bundle args = new Bundle(); final Bundle args = new Bundle(); Loading Loading @@ -143,7 +144,7 @@ public class TopLevelSettings extends DashboardFragment implements SplitLayoutLi return; return; } } boolean activityEmbedded = SplitController.getInstance().isActivityEmbedded(getActivity()); boolean activityEmbedded = isActivityEmbedded(); if (icicle != null) { if (icicle != null) { mHighlightMixin = icicle.getParcelable(SAVED_HIGHLIGHT_MIXIN); mHighlightMixin = icicle.getParcelable(SAVED_HIGHLIGHT_MIXIN); mScrollNeeded = !mHighlightMixin.isActivityEmbedded() && activityEmbedded; mScrollNeeded = !mHighlightMixin.isActivityEmbedded() && activityEmbedded; Loading @@ -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 @Override public void onStart() { public void onStart() { if (mFirstStarted) { if (mFirstStarted) { Loading @@ -161,7 +170,7 @@ public class TopLevelSettings extends DashboardFragment implements SplitLayoutLi FeatureFactory.getFactory(getContext()).getSearchFeatureProvider().sendPreIndexIntent( FeatureFactory.getFactory(getContext()).getSearchFeatureProvider().sendPreIndexIntent( getContext()); getContext()); } else if (mIsEmbeddingActivityEnabled && isOnlyOneActivityInTask() } else if (mIsEmbeddingActivityEnabled && isOnlyOneActivityInTask() && !SplitController.getInstance().isActivityEmbedded(getActivity())) { && !isActivityEmbedded()) { // Set default highlight menu key for 1-pane homepage since it will show the placeholder // Set default highlight menu key for 1-pane homepage since it will show the placeholder // page once changing back to 2-pane. // page once changing back to 2-pane. Log.i(TAG, "Set default menu key"); Log.i(TAG, "Set default menu key"); Loading Loading @@ -286,7 +295,7 @@ public class TopLevelSettings extends DashboardFragment implements SplitLayoutLi * 3. the current activity is embedded */ * 3. the current activity is embedded */ return mHighlightMixin != null return mHighlightMixin != null && TextUtils.equals(pref.getKey(), mHighlightMixin.getHighlightPreferenceKey()) && TextUtils.equals(pref.getKey(), mHighlightMixin.getHighlightPreferenceKey()) && SplitController.getInstance().isActivityEmbedded(getActivity()); && isActivityEmbedded(); } } /** Show/hide the highlight on the menu entry for the search page presence */ /** Show/hide the highlight on the menu entry for the search page presence */ Loading