diff options
12 files changed, 76 insertions, 36 deletions
diff --git a/core/java/android/app/ITaskStackListener.aidl b/core/java/android/app/ITaskStackListener.aidl index 145d5139cdc2..1a619bd4475a 100644 --- a/core/java/android/app/ITaskStackListener.aidl +++ b/core/java/android/app/ITaskStackListener.aidl @@ -43,9 +43,10 @@ oneway interface ITaskStackListener { * @param homeVisible whether or not the home task is visible * @param clearedTask whether or not the launch activity also cleared the task as a part of * starting + * @param wasVisible whether the activity was visible before the restart attempt */ void onActivityRestartAttempt(in ActivityManager.RunningTaskInfo task, boolean homeTaskVisible, - boolean clearedTask); + boolean clearedTask, boolean wasVisible); /** * Called when we launched an activity that we forced to be resizable. diff --git a/core/java/android/app/TaskStackListener.java b/core/java/android/app/TaskStackListener.java index 93772de0ba30..bfa91aabc6f5 100644 --- a/core/java/android/app/TaskStackListener.java +++ b/core/java/android/app/TaskStackListener.java @@ -55,7 +55,7 @@ public abstract class TaskStackListener extends ITaskStackListener.Stub { @Override @UnsupportedAppUsage public void onActivityRestartAttempt(RunningTaskInfo task, boolean homeTaskVisible, - boolean clearedTask) throws RemoteException { + boolean clearedTask, boolean wasVisible) throws RemoteException { } @Override diff --git a/packages/SystemUI/shared/src/com/android/systemui/shared/system/TaskStackChangeListener.java b/packages/SystemUI/shared/src/com/android/systemui/shared/system/TaskStackChangeListener.java index 9e9b9dc4f3b0..dd5cc7c9bbd4 100644 --- a/packages/SystemUI/shared/src/com/android/systemui/shared/system/TaskStackChangeListener.java +++ b/packages/SystemUI/shared/src/com/android/systemui/shared/system/TaskStackChangeListener.java @@ -38,7 +38,7 @@ public abstract class TaskStackChangeListener { public void onActivityPinned(String packageName, int userId, int taskId, int stackId) { } public void onActivityUnpinned() { } public void onActivityRestartAttempt(RunningTaskInfo task, boolean homeTaskVisible, - boolean clearedTask) { } + boolean clearedTask, boolean wasVisible) { } public void onActivityForcedResizable(String packageName, int taskId, int reason) { } public void onActivityDismissingDockedStack() { } public void onActivityLaunchOnSecondaryDisplayFailed() { } diff --git a/packages/SystemUI/shared/src/com/android/systemui/shared/system/TaskStackChangeListeners.java b/packages/SystemUI/shared/src/com/android/systemui/shared/system/TaskStackChangeListeners.java index ce9cbabaa5e9..a76a901c5c81 100644 --- a/packages/SystemUI/shared/src/com/android/systemui/shared/system/TaskStackChangeListeners.java +++ b/packages/SystemUI/shared/src/com/android/systemui/shared/system/TaskStackChangeListeners.java @@ -122,11 +122,12 @@ public class TaskStackChangeListeners extends TaskStackListener { @Override public void onActivityRestartAttempt(RunningTaskInfo task, boolean homeTaskVisible, - boolean clearedTask) throws RemoteException { + boolean clearedTask, boolean wasVisible) throws RemoteException { final SomeArgs args = SomeArgs.obtain(); args.arg1 = task; args.argi1 = homeTaskVisible ? 1 : 0; args.argi2 = clearedTask ? 1 : 0; + args.argi3 = wasVisible ? 1 : 0; mHandler.removeMessages(H.ON_ACTIVITY_RESTART_ATTEMPT); mHandler.obtainMessage(H.ON_ACTIVITY_RESTART_ATTEMPT, args).sendToTarget(); } @@ -305,9 +306,10 @@ public class TaskStackChangeListeners extends TaskStackListener { final RunningTaskInfo task = (RunningTaskInfo) args.arg1; final boolean homeTaskVisible = args.argi1 != 0; final boolean clearedTask = args.argi2 != 0; + final boolean wasVisible = args.argi3 != 0; for (int i = mTaskStackListeners.size() - 1; i >= 0; i--) { mTaskStackListeners.get(i).onActivityRestartAttempt(task, - homeTaskVisible, clearedTask); + homeTaskVisible, clearedTask, wasVisible); } break; } diff --git a/packages/SystemUI/src/com/android/systemui/bubbles/BubbleController.java b/packages/SystemUI/src/com/android/systemui/bubbles/BubbleController.java index 4d7eb758f733..89c45f624b48 100644 --- a/packages/SystemUI/src/com/android/systemui/bubbles/BubbleController.java +++ b/packages/SystemUI/src/com/android/systemui/bubbles/BubbleController.java @@ -1236,7 +1236,7 @@ public class BubbleController implements ConfigurationController.ConfigurationLi @Override public void onActivityRestartAttempt(RunningTaskInfo task, boolean homeTaskVisible, - boolean clearedTask) { + boolean clearedTask, boolean wasVisible) { for (Bubble b : mBubbleData.getBubbles()) { if (b.getDisplayId() == task.displayId) { expandStackAndSelectBubble(b.getKey()); diff --git a/packages/SystemUI/src/com/android/systemui/pip/phone/PipManager.java b/packages/SystemUI/src/com/android/systemui/pip/phone/PipManager.java index 78975735ef0f..a86a884c8016 100644 --- a/packages/SystemUI/src/com/android/systemui/pip/phone/PipManager.java +++ b/packages/SystemUI/src/com/android/systemui/pip/phone/PipManager.java @@ -135,8 +135,8 @@ public class PipManager implements BasePipManager, PipTaskOrganizer.PipTransitio @Override public void onActivityRestartAttempt(ActivityManager.RunningTaskInfo task, - boolean homeTaskVisible, boolean clearedTask) { - if (task.configuration.windowConfiguration.getWindowingMode() + boolean homeTaskVisible, boolean clearedTask, boolean wasVisible) { + if (!wasVisible || task.configuration.windowConfiguration.getWindowingMode() != WINDOWING_MODE_PINNED) { return; } diff --git a/packages/SystemUI/src/com/android/systemui/pip/tv/PipManager.java b/packages/SystemUI/src/com/android/systemui/pip/tv/PipManager.java index a692d0bdd1c7..fae8af4f575a 100644 --- a/packages/SystemUI/src/com/android/systemui/pip/tv/PipManager.java +++ b/packages/SystemUI/src/com/android/systemui/pip/tv/PipManager.java @@ -715,8 +715,8 @@ public class PipManager implements BasePipManager, PipTaskOrganizer.PipTransitio @Override public void onActivityRestartAttempt(RunningTaskInfo task, boolean homeTaskVisible, - boolean clearedTask) { - if (task.configuration.windowConfiguration.getWindowingMode() + boolean clearedTask, boolean wasVisible) { + if (!wasVisible || task.configuration.windowConfiguration.getWindowingMode() != WINDOWING_MODE_PINNED) { return; } diff --git a/packages/SystemUI/src/com/android/systemui/recents/OverviewProxyRecentsImpl.java b/packages/SystemUI/src/com/android/systemui/recents/OverviewProxyRecentsImpl.java index 8051998e2530..f3e2f104621e 100644 --- a/packages/SystemUI/src/com/android/systemui/recents/OverviewProxyRecentsImpl.java +++ b/packages/SystemUI/src/com/android/systemui/recents/OverviewProxyRecentsImpl.java @@ -20,8 +20,6 @@ import static android.app.WindowConfiguration.ACTIVITY_TYPE_HOME; import static android.app.WindowConfiguration.ACTIVITY_TYPE_RECENTS; import static android.app.WindowConfiguration.ACTIVITY_TYPE_UNDEFINED; -import static com.android.systemui.shared.system.WindowManagerWrapper.WINDOWING_MODE_SPLIT_SCREEN_PRIMARY; - import android.annotation.Nullable; import android.app.ActivityManager; import android.app.trust.TrustManager; @@ -39,7 +37,6 @@ import com.android.systemui.Dependency; import com.android.systemui.R; import com.android.systemui.shared.recents.IOverviewProxy; import com.android.systemui.shared.system.ActivityManagerWrapper; -import com.android.systemui.shared.system.TaskStackChangeListener; import com.android.systemui.stackdivider.Divider; import com.android.systemui.statusbar.phone.StatusBar; @@ -66,22 +63,6 @@ public class OverviewProxyRecentsImpl implements RecentsImplementation { private TrustManager mTrustManager; private OverviewProxyService mOverviewProxyService; - private TaskStackChangeListener mListener = new TaskStackChangeListener() { - @Override - public void onActivityRestartAttempt(ActivityManager.RunningTaskInfo task, - boolean homeTaskVisible, boolean clearedTask) { - if (task.configuration.windowConfiguration.getWindowingMode() - != WINDOWING_MODE_SPLIT_SCREEN_PRIMARY || !mDividerOptional.isPresent()) { - return; - } - - final Divider divider = mDividerOptional.get(); - if (divider.isMinimized()) { - divider.onUndockingTask(); - } - } - }; - @SuppressWarnings("OptionalUsedAsFieldOrParameterType") @Inject public OverviewProxyRecentsImpl(Optional<Lazy<StatusBar>> statusBarLazy, @@ -96,7 +77,6 @@ public class OverviewProxyRecentsImpl implements RecentsImplementation { mHandler = new Handler(); mTrustManager = (TrustManager) context.getSystemService(Context.TRUST_SERVICE); mOverviewProxyService = Dependency.get(OverviewProxyService.class); - ActivityManagerWrapper.getInstance().registerTaskStackListener(mListener); } @Override diff --git a/packages/SystemUI/src/com/android/systemui/stackdivider/Divider.java b/packages/SystemUI/src/com/android/systemui/stackdivider/Divider.java index b71c4ebb5930..f36f8c131848 100644 --- a/packages/SystemUI/src/com/android/systemui/stackdivider/Divider.java +++ b/packages/SystemUI/src/com/android/systemui/stackdivider/Divider.java @@ -21,23 +21,25 @@ import static android.content.res.Configuration.SCREEN_HEIGHT_DP_UNDEFINED; import static android.content.res.Configuration.SCREEN_WIDTH_DP_UNDEFINED; import static android.view.Display.DEFAULT_DISPLAY; +import static com.android.systemui.shared.system.WindowManagerWrapper.WINDOWING_MODE_SPLIT_SCREEN_PRIMARY; + import android.animation.Animator; import android.animation.AnimatorListenerAdapter; import android.animation.ValueAnimator; +import android.app.ActivityManager; import android.app.ActivityTaskManager; import android.content.Context; import android.content.res.Configuration; import android.graphics.Rect; import android.os.Handler; -import android.os.RemoteException; import android.provider.Settings; import android.util.Slog; -import android.window.TaskOrganizer; -import android.window.WindowContainerToken; import android.view.LayoutInflater; import android.view.SurfaceControl; import android.view.SurfaceSession; import android.view.View; +import android.window.TaskOrganizer; +import android.window.WindowContainerToken; import android.window.WindowContainerTransaction; import android.window.WindowOrganizer; @@ -48,6 +50,8 @@ import com.android.systemui.R; import com.android.systemui.SystemUI; import com.android.systemui.TransactionPool; import com.android.systemui.recents.Recents; +import com.android.systemui.shared.system.ActivityManagerWrapper; +import com.android.systemui.shared.system.TaskStackChangeListener; import com.android.systemui.statusbar.policy.KeyguardStateController; import com.android.systemui.wm.DisplayChangeController; import com.android.systemui.wm.DisplayController; @@ -415,6 +419,21 @@ public class Divider extends SystemUI implements DividerView.DividerCallbacks, } private final DividerImeController mImePositionProcessor = new DividerImeController(); + private TaskStackChangeListener mActivityRestartListener = new TaskStackChangeListener() { + @Override + public void onActivityRestartAttempt(ActivityManager.RunningTaskInfo task, + boolean homeTaskVisible, boolean clearedTask, boolean wasVisible) { + if (!wasVisible || task.configuration.windowConfiguration.getWindowingMode() + != WINDOWING_MODE_SPLIT_SCREEN_PRIMARY || !mSplits.isSplitScreenSupported()) { + return; + } + + if (isMinimized()) { + onUndockingTask(); + } + } + }; + public Divider(Context context, Optional<Lazy<Recents>> recentsOptionalLazy, DisplayController displayController, SystemWindows systemWindows, DisplayImeController imeController, Handler handler, @@ -485,6 +504,7 @@ public class Divider extends SystemUI implements DividerView.DividerCallbacks, removeDivider(); return; } + ActivityManagerWrapper.getInstance().registerTaskStackListener(mActivityRestartListener); update(mDisplayController.getDisplayContext(displayId).getResources().getConfiguration()); } diff --git a/services/core/java/com/android/server/wm/ActivityStarter.java b/services/core/java/com/android/server/wm/ActivityStarter.java index 8edc84fc8f37..df53227e27fd 100644 --- a/services/core/java/com/android/server/wm/ActivityStarter.java +++ b/services/core/java/com/android/server/wm/ActivityStarter.java @@ -1384,7 +1384,8 @@ class ActivityStarter { final ActivityStack homeStack = targetTask.getDisplayArea().getRootHomeTask(); final boolean homeTaskVisible = homeStack != null && homeStack.shouldBeVisible(null); mService.getTaskChangeNotificationController().notifyActivityRestartAttempt( - targetTask.getTaskInfo(), homeTaskVisible, clearedTask); + targetTask.getTaskInfo(), homeTaskVisible, clearedTask, + targetTask.getTopNonFinishingActivity().isVisible()); } } diff --git a/services/core/java/com/android/server/wm/TaskChangeNotificationController.java b/services/core/java/com/android/server/wm/TaskChangeNotificationController.java index e4f10d9840b2..4b0e293e831e 100644 --- a/services/core/java/com/android/server/wm/TaskChangeNotificationController.java +++ b/services/core/java/com/android/server/wm/TaskChangeNotificationController.java @@ -123,7 +123,7 @@ class TaskChangeNotificationController { private final TaskStackConsumer mNotifyActivityRestartAttempt = (l, m) -> { SomeArgs args = (SomeArgs) m.obj; l.onActivityRestartAttempt((RunningTaskInfo) args.arg1, args.argi1 != 0, - args.argi2 != 0); + args.argi2 != 0, args.argi3 != 0); }; private final TaskStackConsumer mNotifyActivityForcedResizable = (l, m) -> { @@ -368,12 +368,13 @@ class TaskChangeNotificationController { * running, but the task is either brought to the front or a new Intent is delivered to it. */ void notifyActivityRestartAttempt(RunningTaskInfo task, boolean homeTaskVisible, - boolean clearedTask) { + boolean clearedTask, boolean wasVisible) { mHandler.removeMessages(NOTIFY_ACTIVITY_RESTART_ATTEMPT_LISTENERS_MSG); final SomeArgs args = SomeArgs.obtain(); args.arg1 = task; args.argi1 = homeTaskVisible ? 1 : 0; args.argi2 = clearedTask ? 1 : 0; + args.argi3 = wasVisible ? 1 : 0; final Message msg = mHandler.obtainMessage(NOTIFY_ACTIVITY_RESTART_ATTEMPT_LISTENERS_MSG, args); forAllLocalListeners(mNotifyActivityRestartAttempt, msg); diff --git a/services/tests/wmtests/src/com/android/server/wm/ActivityStarterTests.java b/services/tests/wmtests/src/com/android/server/wm/ActivityStarterTests.java index a84a0a2260b2..edc9756d6d0e 100644 --- a/services/tests/wmtests/src/com/android/server/wm/ActivityStarterTests.java +++ b/services/tests/wmtests/src/com/android/server/wm/ActivityStarterTests.java @@ -808,6 +808,41 @@ public class ActivityStarterTests extends ActivityTestsBase { verify(secondaryTaskContainer, times(2)).createStack(anyInt(), anyInt(), anyBoolean()); } + @Test + public void testWasVisibleInRestartAttempt() { + final ActivityStarter starter = prepareStarter( + FLAG_ACTIVITY_RESET_TASK_IF_NEEDED | FLAG_ACTIVITY_SINGLE_TOP, false); + final ActivityRecord reusableActivity = + new ActivityBuilder(mService).setCreateTask(true).build(); + final ActivityRecord topActivity = + new ActivityBuilder(mService).setCreateTask(true).build(); + + // Make sure topActivity is on top + topActivity.getRootTask().moveToFront("testWasVisibleInRestartAttempt"); + reusableActivity.setVisible(false); + + final TaskChangeNotificationController taskChangeNotifier = + mService.getTaskChangeNotificationController(); + spyOn(taskChangeNotifier); + + Task task = topActivity.getTask(); + starter.postStartActivityProcessing( + task.getTopNonFinishingActivity(), START_DELIVERED_TO_TOP, task.getStack()); + + verify(taskChangeNotifier).notifyActivityRestartAttempt( + any(), anyBoolean(), anyBoolean(), anyBoolean()); + verify(taskChangeNotifier).notifyActivityRestartAttempt( + any(), anyBoolean(), anyBoolean(), eq(true)); + + Task task2 = reusableActivity.getTask(); + starter.postStartActivityProcessing( + task2.getTopNonFinishingActivity(), START_TASK_TO_FRONT, task.getStack()); + verify(taskChangeNotifier, times(2)).notifyActivityRestartAttempt( + any(), anyBoolean(), anyBoolean(), anyBoolean()); + verify(taskChangeNotifier).notifyActivityRestartAttempt( + any(), anyBoolean(), anyBoolean(), eq(false)); + } + private ActivityRecord createSingleTaskActivityOn(ActivityStack stack) { final ComponentName componentName = ComponentName.createRelative( DEFAULT_COMPONENT_PACKAGE_NAME, |