diff --git a/src/com/android/settings/SettingsApplication.java b/src/com/android/settings/SettingsApplication.java index fc56e934f01..333fc27a86b 100644 --- a/src/com/android/settings/SettingsApplication.java +++ b/src/com/android/settings/SettingsApplication.java @@ -17,11 +17,19 @@ package com.android.settings; import android.app.Application; +import android.database.ContentObserver; +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.homepage.SettingsHomepageActivity; import com.android.settingslib.applications.AppIconCacheManager; +import com.google.android.setupcompat.util.WizardManagerHelper; + import java.lang.ref.WeakReference; /** Settings application which sets up activity embedding rules for the large screen device. */ @@ -33,9 +41,14 @@ public class SettingsApplication extends Application { public void onCreate() { super.onCreate(); - final ActivityEmbeddingRulesController controller = - new ActivityEmbeddingRulesController(this); - controller.initRules(); + if (FeatureFlagUtils.isEnabled(this, FeatureFlagUtils.SETTINGS_SUPPORT_LARGE_SCREEN) + && SplitController.getInstance().isSplitSupported()) { + if (WizardManagerHelper.isUserSetupComplete(this)) { + new ActivityEmbeddingRulesController(this).initRules(); + } else { + new DeviceProvisionedObserver().registerContentObserver(); + } + } } public void setHomeActivity(SettingsHomepageActivity homeActivity) { @@ -51,4 +64,30 @@ public class SettingsApplication extends Application { super.onLowMemory(); AppIconCacheManager.getInstance().release(); } + + private class DeviceProvisionedObserver extends ContentObserver { + private final Uri mDeviceProvisionedUri = Settings.Secure.getUriFor( + Settings.Secure.USER_SETUP_COMPLETE); + + DeviceProvisionedObserver() { + super(null /* handler */); + } + + @Override + public void onChange(boolean selfChange, Uri uri, int flags) { + if (!mDeviceProvisionedUri.equals(uri)) { + return; + } + + SettingsApplication.this.getContentResolver().unregisterContentObserver(this); + new ActivityEmbeddingRulesController(SettingsApplication.this).initRules(); + } + + public void registerContentObserver() { + SettingsApplication.this.getContentResolver().registerContentObserver( + mDeviceProvisionedUri, + false /* notifyForDescendants */, + this); + } + } } diff --git a/src/com/android/settings/activityembedding/ActivityEmbeddingUtils.java b/src/com/android/settings/activityembedding/ActivityEmbeddingUtils.java index fdf13142cb8..f00542d03a4 100644 --- a/src/com/android/settings/activityembedding/ActivityEmbeddingUtils.java +++ b/src/com/android/settings/activityembedding/ActivityEmbeddingUtils.java @@ -27,6 +27,8 @@ import androidx.window.embedding.SplitController; import com.android.settings.R; +import com.google.android.setupcompat.util.WizardManagerHelper; + /** 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. @@ -65,14 +67,16 @@ public class ActivityEmbeddingUtils { /** Whether to support embedding activity feature. */ public static boolean isEmbeddingActivityEnabled(Context context) { - final boolean isFlagEnabled = FeatureFlagUtils.isEnabled(context, + boolean isFlagEnabled = FeatureFlagUtils.isEnabled(context, FeatureFlagUtils.SETTINGS_SUPPORT_LARGE_SCREEN); - final boolean isSplitSupported = SplitController.getInstance().isSplitSupported(); + boolean isSplitSupported = SplitController.getInstance().isSplitSupported(); + boolean isUserSetupComplete = WizardManagerHelper.isUserSetupComplete(context); Log.d(TAG, "isFlagEnabled = " + isFlagEnabled); Log.d(TAG, "isSplitSupported = " + isSplitSupported); + Log.d(TAG, "isUserSetupComplete = " + isUserSetupComplete); - return isFlagEnabled && isSplitSupported; + return isFlagEnabled && isSplitSupported && 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 8e14c5a44ea..bad4a19c351 100644 --- a/src/com/android/settings/homepage/SettingsHomepageActivity.java +++ b/src/com/android/settings/homepage/SettingsHomepageActivity.java @@ -68,6 +68,8 @@ import com.android.settings.overlay.FeatureFactory; import com.android.settingslib.Utils; import com.android.settingslib.core.lifecycle.HideNonSystemOverlayMixin; +import com.google.android.setupcompat.util.WizardManagerHelper; + import java.net.URISyntaxException; import java.util.Set; @@ -219,7 +221,9 @@ public class SettingsHomepageActivity extends FragmentActivity implements }, R.id.main_content); // Launch the intent from deep link for large screen devices. - launchDeepLinkIntentToRight(); + if (shouldLaunchDeepLinkIntentToRight()) { + launchDeepLinkIntentToRight(); + } updateHomepagePaddings(); updateSplitLayout(); } @@ -242,7 +246,9 @@ public class SettingsHomepageActivity extends FragmentActivity implements return; } // Launch the intent from deep link for large screen devices. - launchDeepLinkIntentToRight(); + if (shouldLaunchDeepLinkIntentToRight()) { + launchDeepLinkIntentToRight(); + } } @Override @@ -390,17 +396,18 @@ public class SettingsHomepageActivity extends FragmentActivity implements return showFragment; } + private boolean shouldLaunchDeepLinkIntentToRight() { + if (!FeatureFlagUtils.isEnabled(this, FeatureFlagUtils.SETTINGS_SUPPORT_LARGE_SCREEN) + || !SplitController.getInstance().isSplitSupported()) { + return false; + } + + Intent intent = getIntent(); + return intent != null && TextUtils.equals(intent.getAction(), + ACTION_SETTINGS_EMBED_DEEP_LINK_ACTIVITY); + } + private void launchDeepLinkIntentToRight() { - if (!mIsEmbeddingActivityEnabled) { - return; - } - - final Intent intent = getIntent(); - if (intent == null || !TextUtils.equals(intent.getAction(), - ACTION_SETTINGS_EMBED_DEEP_LINK_ACTIVITY)) { - return; - } - if (!(this instanceof DeepLinkHomepageActivity || this instanceof DeepLinkHomepageActivityInternal)) { Log.e(TAG, "Not a deep link component"); @@ -408,6 +415,13 @@ public class SettingsHomepageActivity extends FragmentActivity implements return; } + if (!WizardManagerHelper.isUserSetupComplete(this)) { + Log.e(TAG, "Cancel deep link before SUW completed"); + finish(); + return; + } + + final Intent intent = getIntent(); final String intentUriString = intent.getStringExtra( EXTRA_SETTINGS_EMBEDDED_DEEP_LINK_INTENT_URI); if (TextUtils.isEmpty(intentUriString)) {