[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
diff --git a/src/com/android/settings/homepage/SettingsHomepageActivity.java b/src/com/android/settings/homepage/SettingsHomepageActivity.java
index 8b6fde7..dc1c1f2 100644
--- a/src/com/android/settings/homepage/SettingsHomepageActivity.java
+++ b/src/com/android/settings/homepage/SettingsHomepageActivity.java
@@ -43,6 +43,7 @@
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 @@
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 4d203a8..b3feef4 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 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 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 @@
& 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 {