From 31eec49217a9e74a47593068e5623ebbd5d2c638 Mon Sep 17 00:00:00 2001 From: Arc Wang Date: Tue, 25 Oct 2022 15:55:59 +0800 Subject: [PATCH] [Activity embedding] Fix unexpected finished 2nd layer problem If Settings is started on an existing task, the existing SplitPairRule may cause an unexpected app finish while navigating back from the 2nd layer page. This change resets SplitPairRule in onCreate(). Bug: 247080168 Test: make RunSettingsRoboTests ROBOTEST_FILTER=SettingsHomepageActivityTest manual 1. Settings app -> 'Connexted device'. 2. Launch Settings app again from Settings icon in quick Settings. 3. Start a 3rd layer from 'Network & internet' 4. Click back and see if the 2nd lay shows. Change-Id: I262327cc49c3a4434a183eb00ac57f47fa598f70 --- .../homepage/SettingsHomepageActivity.java | 14 ++++++++++++++ .../homepage/SettingsHomepageActivityTest.java | 17 +++++++++++++++++ 2 files changed, 31 insertions(+) diff --git a/src/com/android/settings/homepage/SettingsHomepageActivity.java b/src/com/android/settings/homepage/SettingsHomepageActivity.java index 8b6fde71e63..dc1c1f2d77d 100644 --- a/src/com/android/settings/homepage/SettingsHomepageActivity.java +++ b/src/com/android/settings/homepage/SettingsHomepageActivity.java @@ -43,6 +43,7 @@ import android.widget.FrameLayout; import android.widget.ImageView; import android.widget.Toolbar; +import androidx.annotation.VisibleForTesting; import androidx.core.graphics.Insets; import androidx.core.view.ViewCompat; import androidx.core.view.WindowCompat; @@ -223,10 +224,23 @@ public class SettingsHomepageActivity extends FragmentActivity implements if (shouldLaunchDeepLinkIntentToRight()) { launchDeepLinkIntentToRight(); } + + // Settings app may be launched on an existing task. Reset SplitPairRule of SubSettings here + // to prevent SplitPairRule of an existing task applied on a new started Settings app. + if (ActivityEmbeddingUtils.isEmbeddingActivityEnabled(this) + && (getIntent().getFlags() & Intent.FLAG_ACTIVITY_CLEAR_TOP) != 0) { + initSplitPairRules(); + } + updateHomepagePaddings(); updateSplitLayout(); } + @VisibleForTesting + void initSplitPairRules() { + new ActivityEmbeddingRulesController(getApplicationContext()).initRules(); + } + @Override protected void onStart() { ((SettingsApplication) getApplication()).setHomeActivity(this); diff --git a/tests/robotests/src/com/android/settings/homepage/SettingsHomepageActivityTest.java b/tests/robotests/src/com/android/settings/homepage/SettingsHomepageActivityTest.java index 4d203a8a6b0..b3feef413fe 100644 --- a/tests/robotests/src/com/android/settings/homepage/SettingsHomepageActivityTest.java +++ b/tests/robotests/src/com/android/settings/homepage/SettingsHomepageActivityTest.java @@ -20,12 +20,14 @@ import static android.view.WindowManager.LayoutParams.SYSTEM_FLAG_HIDE_NON_SYSTE import static com.google.common.truth.Truth.assertThat; +import static org.mockito.Mockito.doReturn; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.spy; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; import android.app.ActivityManager; +import android.content.Intent; import android.os.Build; import android.view.View; import android.view.Window; @@ -37,6 +39,7 @@ import androidx.fragment.app.Fragment; import com.android.settings.R; import com.android.settings.dashboard.suggestions.SuggestionFeatureProviderImpl; import com.android.settings.homepage.contextualcards.slices.BatteryFixSliceTest; +import com.android.settings.testutils.shadow.ShadowActivityEmbeddingUtils; import com.android.settings.testutils.shadow.ShadowUserManager; import com.android.settingslib.core.lifecycle.HideNonSystemOverlayMixin; @@ -195,6 +198,20 @@ public class SettingsHomepageActivityTest { & SYSTEM_FLAG_HIDE_NON_SYSTEM_OVERLAY_WINDOWS).isEqualTo(0); } + /** This test is for large screen devices Activity embedding. */ + @Test + @Config(shadows = ShadowActivityEmbeddingUtils.class) + public void onCreate_flagClearTop_shouldInitRules() { + ShadowActivityEmbeddingUtils.setIsEmbeddingActivityEnabled(true); + SettingsHomepageActivity activity = + spy(Robolectric.buildActivity(SettingsHomepageActivity.class).get()); + doReturn(new Intent().setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP)).when(activity).getIntent(); + + activity.onCreate(/* savedInstanceState */ null); + + verify(activity).initSplitPairRules(); + } + @Implements(SuggestionFeatureProviderImpl.class) public static class ShadowSuggestionFeatureProviderImpl {