Merge "Restart or finish HomepageActivity when it's launched unexpectedly" into main
diff --git a/src/com/android/settings/homepage/SettingsHomepageActivity.java b/src/com/android/settings/homepage/SettingsHomepageActivity.java
index 8016799..48d918c 100644
--- a/src/com/android/settings/homepage/SettingsHomepageActivity.java
+++ b/src/com/android/settings/homepage/SettingsHomepageActivity.java
@@ -194,8 +194,12 @@
         if (unprovisioned) {
             Log.e(TAG, "Device is not provisioned, exiting Settings");
             finish();
+            return;
         }
 
+        // Settings homepage should be the task root, otherwise there will be UI issues.
+        boolean isTaskRoot = isTaskRoot();
+
         mIsEmbeddingActivityEnabled = ActivityEmbeddingUtils.isEmbeddingActivityEnabled(this);
         if (mIsEmbeddingActivityEnabled) {
             final UserManager um = getSystemService(UserManager.class);
@@ -211,13 +215,34 @@
                 } else {
                     intent.setPackage(getPackageName());
                 }
-                intent.removeFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
+                if (!isTaskRoot) {
+                    intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
+                } else {
+                    intent.removeFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
+                }
                 startActivityAsUser(intent, um.getProfileParent(userInfo.id).getUserHandle());
                 finish();
                 return;
             }
         }
 
+        if (!isTaskRoot) {
+            if ((getIntent().getFlags() & Intent.FLAG_ACTIVITY_NEW_TASK) != 0) {
+                Log.i(TAG, "Activity has been started, finishing");
+            } else {
+                Log.i(TAG, "Homepage should be started with FLAG_ACTIVITY_NEW_TASK, restarting");
+                Intent intent = new Intent(getIntent())
+                        .setPackage(getPackageName())
+                        .addFlags(Intent.FLAG_ACTIVITY_NEW_TASK
+                                | Intent.FLAG_ACTIVITY_FORWARD_RESULT)
+                        .putExtra(EXTRA_USER_HANDLE, getUser())
+                        .putExtra(EXTRA_INITIAL_REFERRER, getCurrentReferrer());
+                startActivity(intent);
+            }
+            finish();
+            return;
+        }
+
         setupEdgeToEdge();
         setContentView(R.layout.settings_homepage_container);
 
diff --git a/tests/robotests/src/com/android/settings/homepage/SettingsHomepageActivityTest.java b/tests/robotests/src/com/android/settings/homepage/SettingsHomepageActivityTest.java
index 0d1ee9c..4c2d745 100644
--- a/tests/robotests/src/com/android/settings/homepage/SettingsHomepageActivityTest.java
+++ b/tests/robotests/src/com/android/settings/homepage/SettingsHomepageActivityTest.java
@@ -24,11 +24,13 @@
 import static org.junit.Assert.assertFalse;
 import static org.junit.Assert.assertNotEquals;
 import static org.junit.Assert.assertTrue;
+import static org.mockito.ArgumentMatchers.any;
 import static org.mockito.ArgumentMatchers.anyInt;
 import static org.mockito.ArgumentMatchers.anyString;
 import static org.mockito.ArgumentMatchers.eq;
 import static org.mockito.Mockito.doReturn;
 import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.never;
 import static org.mockito.Mockito.spy;
 import static org.mockito.Mockito.verify;
 import static org.mockito.Mockito.when;
@@ -241,6 +243,42 @@
                 & SYSTEM_FLAG_HIDE_NON_SYSTEM_OVERLAY_WINDOWS).isEqualTo(0);
     }
 
+    @Test
+    public void onCreate_TaskRoot_shouldNotFinish() {
+        SettingsHomepageActivity activity =
+                spy(Robolectric.buildActivity(SettingsHomepageActivity.class).get());
+        doReturn(true).when(activity).isTaskRoot();
+
+        activity.onCreate(/* savedInstanceState */ null);
+
+        verify(activity, never()).finish();
+    }
+
+    @Test
+    public void onCreate_notTaskRoot_shouldRestartActivity() {
+        SettingsHomepageActivity activity =
+                spy(Robolectric.buildActivity(SettingsHomepageActivity.class).get());
+        doReturn(false).when(activity).isTaskRoot();
+
+        activity.onCreate(/* savedInstanceState */ null);
+
+        verify(activity).finish();
+        verify(activity).startActivity(any(Intent.class));
+    }
+
+    @Test
+    public void onCreate_notTaskRoot_flagNewTask_shouldOnlyFinish() {
+        SettingsHomepageActivity activity =
+                spy(Robolectric.buildActivity(SettingsHomepageActivity.class).get());
+        doReturn(false).when(activity).isTaskRoot();
+        activity.setIntent(new Intent().addFlags(Intent.FLAG_ACTIVITY_NEW_TASK));
+
+        activity.onCreate(/* savedInstanceState */ null);
+
+        verify(activity).finish();
+        verify(activity, never()).startActivity(any(Intent.class));
+    }
+
     /** This test is for large screen devices Activity embedding. */
     @Test
     @Config(shadows = ShadowActivityEmbeddingUtils.class)