Loading services/core/java/com/android/server/wm/Task.java +5 −10 Original line number Diff line number Diff line Loading @@ -1436,15 +1436,6 @@ class Task extends WindowContainer<WindowContainer> { mAtmService.getTaskChangeNotificationController().notifyTaskStackChanged(); } final boolean isRootTask = isRootTask(); if (isRootTask) { final DisplayContent display = getDisplayContent(); if (display.isSingleTaskInstance()) { mAtmService.notifySingleTaskDisplayEmpty(display.mDisplayId); } display.mDisplayContent.setLayoutNeeded(); } if (hasChild()) { updateEffectiveIntent(); Loading @@ -1465,7 +1456,7 @@ class Task extends WindowContainer<WindowContainer> { } else if (!mReuseTask && !mCreatedByOrganizer) { // Remove entire task if it doesn't have any activity left and it isn't marked for reuse // or created by task organizer. if (!isRootTask) { if (!isRootTask()) { getStack().removeChild(this, reason); } EventLogTags.writeWmTaskRemoved(mTaskId, Loading Loading @@ -2817,6 +2808,10 @@ class Task extends WindowContainer<WindowContainer> { if (DEBUG_STACK) Slog.i(TAG, "removeTask: removing taskId=" + mTaskId); EventLogTags.writeWmTaskRemoved(mTaskId, "removeTask"); if (mDisplayContent != null && mDisplayContent.isSingleTaskInstance()) { mAtmService.notifySingleTaskDisplayEmpty(mDisplayContent.mDisplayId); } // If applicable let the TaskOrganizer know the Task is vanishing. setTaskOrganizer(null); Loading services/tests/wmtests/AndroidManifest.xml +2 −0 Original line number Diff line number Diff line Loading @@ -54,6 +54,8 @@ <activity android:name="com.android.server.wm.TaskStackChangedListenerTest$ActivityViewTestActivity" /> <activity android:name="com.android.server.wm.TaskStackChangedListenerTest$ActivityInActivityView" android:resizeableActivity="true" /> <activity android:name="com.android.server.wm.TaskStackChangedListenerTest$ActivityLaunchesNewActivityInActivityView" android:resizeableActivity="true" /> <activity android:name="com.android.server.wm.TaskStackChangedListenerTest$LandscapeActivity" android:screenOrientation="sensorLandscape" android:showWhenLocked="true" Loading services/tests/wmtests/src/com/android/server/wm/TaskStackChangedListenerTest.java +22 −1 Original line number Diff line number Diff line Loading @@ -299,6 +299,20 @@ public class TaskStackChangedListenerTest { waitForCallback(singleTaskDisplayDrawnLatch); } public static class ActivityLaunchesNewActivityInActivityView extends TestActivity { private boolean mActivityBLaunched = false; @Override protected void onPostResume() { super.onPostResume(); if (mActivityBLaunched) { return; } mActivityBLaunched = true; startActivity(new Intent(this, ActivityB.class)); } } @Test public void testSingleTaskDisplayEmpty() throws Exception { final Instrumentation instrumentation = getInstrumentation(); Loading Loading @@ -335,13 +349,20 @@ public class TaskStackChangedListenerTest { }); waitForCallback(activityViewReadyLatch); // 1. start ActivityLaunchesNewActivityInActivityView in an ActivityView // 2. ActivityLaunchesNewActivityInActivityView launches ActivityB // 3. ActivityB finishes self. // 4. Verify ITaskStackListener#onSingleTaskDisplayEmpty is not called yet. final Context context = instrumentation.getContext(); Intent intent = new Intent(context, ActivityInActivityView.class); Intent intent = new Intent(context, ActivityLaunchesNewActivityInActivityView.class); intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_MULTIPLE_TASK); activityView.startActivity(intent); waitForCallback(singleTaskDisplayDrawnLatch); UiDevice.getInstance(getInstrumentation()).waitForIdle(); assertEquals(1, singleTaskDisplayEmptyLatch.getCount()); // 5. Release the container, and ActivityLaunchesNewActivityInActivityView finishes. // 6. Verify ITaskStackListener#onSingleTaskDisplayEmpty is called. activityView.release(); waitForCallback(activityViewDestroyedLatch); waitForCallback(singleTaskDisplayEmptyLatch); Loading Loading
services/core/java/com/android/server/wm/Task.java +5 −10 Original line number Diff line number Diff line Loading @@ -1436,15 +1436,6 @@ class Task extends WindowContainer<WindowContainer> { mAtmService.getTaskChangeNotificationController().notifyTaskStackChanged(); } final boolean isRootTask = isRootTask(); if (isRootTask) { final DisplayContent display = getDisplayContent(); if (display.isSingleTaskInstance()) { mAtmService.notifySingleTaskDisplayEmpty(display.mDisplayId); } display.mDisplayContent.setLayoutNeeded(); } if (hasChild()) { updateEffectiveIntent(); Loading @@ -1465,7 +1456,7 @@ class Task extends WindowContainer<WindowContainer> { } else if (!mReuseTask && !mCreatedByOrganizer) { // Remove entire task if it doesn't have any activity left and it isn't marked for reuse // or created by task organizer. if (!isRootTask) { if (!isRootTask()) { getStack().removeChild(this, reason); } EventLogTags.writeWmTaskRemoved(mTaskId, Loading Loading @@ -2817,6 +2808,10 @@ class Task extends WindowContainer<WindowContainer> { if (DEBUG_STACK) Slog.i(TAG, "removeTask: removing taskId=" + mTaskId); EventLogTags.writeWmTaskRemoved(mTaskId, "removeTask"); if (mDisplayContent != null && mDisplayContent.isSingleTaskInstance()) { mAtmService.notifySingleTaskDisplayEmpty(mDisplayContent.mDisplayId); } // If applicable let the TaskOrganizer know the Task is vanishing. setTaskOrganizer(null); Loading
services/tests/wmtests/AndroidManifest.xml +2 −0 Original line number Diff line number Diff line Loading @@ -54,6 +54,8 @@ <activity android:name="com.android.server.wm.TaskStackChangedListenerTest$ActivityViewTestActivity" /> <activity android:name="com.android.server.wm.TaskStackChangedListenerTest$ActivityInActivityView" android:resizeableActivity="true" /> <activity android:name="com.android.server.wm.TaskStackChangedListenerTest$ActivityLaunchesNewActivityInActivityView" android:resizeableActivity="true" /> <activity android:name="com.android.server.wm.TaskStackChangedListenerTest$LandscapeActivity" android:screenOrientation="sensorLandscape" android:showWhenLocked="true" Loading
services/tests/wmtests/src/com/android/server/wm/TaskStackChangedListenerTest.java +22 −1 Original line number Diff line number Diff line Loading @@ -299,6 +299,20 @@ public class TaskStackChangedListenerTest { waitForCallback(singleTaskDisplayDrawnLatch); } public static class ActivityLaunchesNewActivityInActivityView extends TestActivity { private boolean mActivityBLaunched = false; @Override protected void onPostResume() { super.onPostResume(); if (mActivityBLaunched) { return; } mActivityBLaunched = true; startActivity(new Intent(this, ActivityB.class)); } } @Test public void testSingleTaskDisplayEmpty() throws Exception { final Instrumentation instrumentation = getInstrumentation(); Loading Loading @@ -335,13 +349,20 @@ public class TaskStackChangedListenerTest { }); waitForCallback(activityViewReadyLatch); // 1. start ActivityLaunchesNewActivityInActivityView in an ActivityView // 2. ActivityLaunchesNewActivityInActivityView launches ActivityB // 3. ActivityB finishes self. // 4. Verify ITaskStackListener#onSingleTaskDisplayEmpty is not called yet. final Context context = instrumentation.getContext(); Intent intent = new Intent(context, ActivityInActivityView.class); Intent intent = new Intent(context, ActivityLaunchesNewActivityInActivityView.class); intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_MULTIPLE_TASK); activityView.startActivity(intent); waitForCallback(singleTaskDisplayDrawnLatch); UiDevice.getInstance(getInstrumentation()).waitForIdle(); assertEquals(1, singleTaskDisplayEmptyLatch.getCount()); // 5. Release the container, and ActivityLaunchesNewActivityInActivityView finishes. // 6. Verify ITaskStackListener#onSingleTaskDisplayEmpty is called. activityView.release(); waitForCallback(activityViewDestroyedLatch); waitForCallback(singleTaskDisplayEmptyLatch); Loading