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
diff --git a/src/com/android/settings/SettingsApplication.java b/src/com/android/settings/SettingsApplication.java
index 49cb85e..7d8055d 100644
--- a/src/com/android/settings/SettingsApplication.java
+++ b/src/com/android/settings/SettingsApplication.java
@@ -22,9 +22,8 @@
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 @@
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 1d23523..37a564b 100644
--- a/src/com/android/settings/SettingsInitialize.java
+++ b/src/com/android/settings/SettingsInitialize.java
@@ -37,9 +37,9 @@
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 @@
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 a0dac5a..ae890f8 100644
--- a/src/com/android/settings/activityembedding/ActivityEmbeddingUtils.java
+++ b/src/com/android/settings/activityembedding/ActivityEmbeddingUtils.java
@@ -18,6 +18,7 @@
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 @@
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.
+ * <p>
+ * 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 @@
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:
+ * <ul>
+ * <li>Whether {@link #isSettingsSplitEnabled(Context)}</li>
+ * <li>Whether {@link FeatureFlagUtils#SETTINGS_SUPPORT_LARGE_SCREEN} is enabled</li>
+ * <li>Whether User setup is completed</li>
+ * </ul>
+ */
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 7713e27..03bc1b3 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.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 @@
private boolean shouldLaunchDeepLinkIntentToRight() {
if (!FeatureFlagUtils.isEnabled(this, FeatureFlagUtils.SETTINGS_SUPPORT_LARGE_SCREEN)
- || !SplitController.getInstance(this).isSplitSupported()) {
+ || !ActivityEmbeddingUtils.isSettingsSplitEnabled(this)) {
return false;
}