From 1815ba7828802397a3d93345daf42b3b1a2e3611 Mon Sep 17 00:00:00 2001 From: Charles Chen Date: Wed, 26 Apr 2023 17:21:18 +0800 Subject: [PATCH] Disable Settings large-screen optimization Disable the optimization that is automatically enabled when including Window Extensions through Activity Embedding. The optimization causes to launch an additional trampoline activity for deep links, even when the screen size is smaller than required by Activity Embedding rules. This CL also rename isActivityEmbeddingEnabled to shouldEnableLargeScreenOptimization because the method may report false even if the device supports the feature but Settings app doesn't for performance concern. Bug: 267725145 Bug: 279461170 Test: Build, perf metrics Test: atest LauncherIronwoodIntegrationTests:android.platform.test.scenario.launcher.integration_tests.HomescreenCustomizationTests Test: atest SettingsMultiPaneDeepLinkTest.java Change-Id: I38e8c62a61a344eb7a5cbfd1cd2c2137357d1a87 --- .../android/settings/SettingsApplication.java | 5 +-- .../android/settings/SettingsInitialize.java | 4 +- .../ActivityEmbeddingUtils.java | 41 +++++++++++++++++-- .../homepage/SettingsHomepageActivity.java | 3 +- 4 files changed, 42 insertions(+), 11 deletions(-) diff --git a/src/com/android/settings/SettingsApplication.java b/src/com/android/settings/SettingsApplication.java index 49cb85e2392..7d8055d6337 100644 --- a/src/com/android/settings/SettingsApplication.java +++ b/src/com/android/settings/SettingsApplication.java @@ -22,9 +22,8 @@ import android.net.Uri; import android.provider.Settings; import android.util.FeatureFlagUtils; -import androidx.window.embedding.SplitController; - import com.android.settings.activityembedding.ActivityEmbeddingRulesController; +import com.android.settings.activityembedding.ActivityEmbeddingUtils; import com.android.settings.core.instrumentation.ElapsedTimeUtils; import com.android.settings.homepage.SettingsHomepageActivity; import com.android.settings.spa.SettingsSpaEnvironment; @@ -53,7 +52,7 @@ public class SettingsApplication extends Application { setSpaEnvironment(); if (FeatureFlagUtils.isEnabled(this, FeatureFlagUtils.SETTINGS_SUPPORT_LARGE_SCREEN) - && SplitController.getInstance(this).isSplitSupported()) { + && ActivityEmbeddingUtils.isSettingsSplitEnabled(this)) { if (WizardManagerHelper.isUserSetupComplete(this)) { new ActivityEmbeddingRulesController(this).initRules(); } else { diff --git a/src/com/android/settings/SettingsInitialize.java b/src/com/android/settings/SettingsInitialize.java index 1d235233f0e..37a564b7c6a 100644 --- a/src/com/android/settings/SettingsInitialize.java +++ b/src/com/android/settings/SettingsInitialize.java @@ -37,9 +37,9 @@ import android.os.UserManager; import android.util.Log; import androidx.annotation.VisibleForTesting; -import androidx.window.embedding.SplitController; import com.android.settings.Settings.CreateShortcutActivity; +import com.android.settings.activityembedding.ActivityEmbeddingUtils; import com.android.settings.homepage.DeepLinkHomepageActivity; import com.android.settings.search.SearchStateReceiver; import com.android.settingslib.utils.ThreadUtils; @@ -166,7 +166,7 @@ public class SettingsInitialize extends BroadcastReceiver { DeepLinkHomepageActivity.class); final ComponentName searchStateReceiver = new ComponentName(context, SearchStateReceiver.class); - final int enableState = SplitController.getInstance(context).isSplitSupported() + final int enableState = ActivityEmbeddingUtils.isSettingsSplitEnabled(context) ? 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/ActivityEmbeddingUtils.java b/src/com/android/settings/activityembedding/ActivityEmbeddingUtils.java index a0dac5a9ec5..ae890f87632 100644 --- a/src/com/android/settings/activityembedding/ActivityEmbeddingUtils.java +++ b/src/com/android/settings/activityembedding/ActivityEmbeddingUtils.java @@ -18,6 +18,7 @@ package com.android.settings.activityembedding; import android.app.Activity; import android.content.Context; +import android.os.SystemProperties; import android.util.DisplayMetrics; import android.util.FeatureFlagUtils; import android.util.Log; @@ -39,6 +40,21 @@ public class ActivityEmbeddingUtils { 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; + + /** + * Indicates whether to enable large screen optimization if the device supports + * the Activity Embedding split feature. + *

+ * Note that the large screen optimization won't be enabled if the device doesn't support the + * Activity Embedding feature regardless of this property value. + * + * @see androidx.window.embedding.SplitController#getSplitSupportStatus + * @see androidx.window.embedding.SplitController.SplitSupportStatus#SPLIT_AVAILABLE + * @see androidx.window.embedding.SplitController.SplitSupportStatus#SPLIT_UNAVAILABLE + */ + private static final boolean SHOULD_ENABLE_LARGE_SCREEN_OPTIMIZATION = + SystemProperties.getBoolean("persist.settings.large_screen_opt.enabled", true); + private static final String TAG = "ActivityEmbeddingUtils"; /** Get the smallest width dp of the window when the split should be used. */ @@ -62,18 +78,35 @@ public class ActivityEmbeddingUtils { return context.getResources().getFloat(R.dimen.config_activity_embed_split_ratio); } - /** Whether to support embedding activity feature. */ + /** + * Returns {@code true} to indicate that Settings app support the Activity Embedding feature on + * this device. Returns {@code false}, otherwise. + */ + public static boolean isSettingsSplitEnabled(Context context) { + return SHOULD_ENABLE_LARGE_SCREEN_OPTIMIZATION + && SplitController.getInstance(context).getSplitSupportStatus() + == SplitController.SplitSupportStatus.SPLIT_AVAILABLE; + } + + /** + * Checks whether to support embedding activity feature with following conditions: + *

+ */ public static boolean isEmbeddingActivityEnabled(Context context) { boolean isFlagEnabled = FeatureFlagUtils.isEnabled(context, FeatureFlagUtils.SETTINGS_SUPPORT_LARGE_SCREEN); - boolean isSplitSupported = SplitController.getInstance(context).isSplitSupported(); + boolean isSettingsSplitSupported = isSettingsSplitEnabled(context); boolean isUserSetupComplete = WizardManagerHelper.isUserSetupComplete(context); Log.d(TAG, "isFlagEnabled = " + isFlagEnabled); - Log.d(TAG, "isSplitSupported = " + isSplitSupported); + Log.d(TAG, "isSettingsSplitSupported = " + isSettingsSplitSupported); Log.d(TAG, "isUserSetupComplete = " + isUserSetupComplete); - return isFlagEnabled && isSplitSupported && isUserSetupComplete; + return isFlagEnabled && isSettingsSplitSupported && isUserSetupComplete; } /** Whether to show the regular or simplified homepage layout. */ diff --git a/src/com/android/settings/homepage/SettingsHomepageActivity.java b/src/com/android/settings/homepage/SettingsHomepageActivity.java index 7713e270425..03bc1b32fb2 100644 --- a/src/com/android/settings/homepage/SettingsHomepageActivity.java +++ b/src/com/android/settings/homepage/SettingsHomepageActivity.java @@ -58,7 +58,6 @@ import androidx.fragment.app.FragmentActivity; import androidx.fragment.app.FragmentManager; import androidx.fragment.app.FragmentTransaction; import androidx.window.embedding.ActivityEmbeddingController; -import androidx.window.embedding.SplitController; import androidx.window.embedding.SplitRule; import com.android.settings.R; @@ -429,7 +428,7 @@ public class SettingsHomepageActivity extends FragmentActivity implements private boolean shouldLaunchDeepLinkIntentToRight() { if (!FeatureFlagUtils.isEnabled(this, FeatureFlagUtils.SETTINGS_SUPPORT_LARGE_SCREEN) - || !SplitController.getInstance(this).isSplitSupported()) { + || !ActivityEmbeddingUtils.isSettingsSplitEnabled(this)) { return false; }