From 66bf45ffa8a9e0ff2d38c0dfb276fe27f2b7040b Mon Sep 17 00:00:00 2001 From: Vinit Nayak Date: Wed, 6 May 2020 13:44:29 -0700 Subject: [PATCH] Add new callback for when activity rotates Launcher needs to distinguish display changes that result naturally vs apps that launch in a fixed portrait/landscape rotation during the quickstep gesture.This callback helps anticipate if a subseqent onDisplayChanged() will have resulted from a natural rotation or not. Bug: 154580671 Change-Id: I59ee7985a9f367e8fc5826c08476c1a25d1426b0 --- core/java/android/app/ITaskStackListener.aidl | 10 ++++++++++ core/java/android/app/TaskStackListener.java | 4 ++++ .../shared/system/TaskStackChangeListener.java | 3 +++ .../shared/system/TaskStackChangeListeners.java | 12 ++++++++++++ .../wm/TaskChangeNotificationController.java | 15 +++++++++++++++ .../android/server/wm/WindowManagerService.java | 5 +++++ 6 files changed, 49 insertions(+) diff --git a/core/java/android/app/ITaskStackListener.aidl b/core/java/android/app/ITaskStackListener.aidl index 2d06ee8d06bcc..b68639eb9ac6c 100644 --- a/core/java/android/app/ITaskStackListener.aidl +++ b/core/java/android/app/ITaskStackListener.aidl @@ -216,4 +216,14 @@ oneway interface ITaskStackListener { * in {@link android.content.pm.ActivityInfo}. */ void onTaskRequestedOrientationChanged(int taskId, int requestedOrientation); + + /** + * Called when a rotation is about to start on the foreground activity. + * This applies for: + * * free sensor rotation + * * forced rotation + * * rotation settings set through adb command line + * * rotation that occurs when rotation tile is toggled in quick settings + */ + void onActivityRotation(); } diff --git a/core/java/android/app/TaskStackListener.java b/core/java/android/app/TaskStackListener.java index 5d8daf88a8de6..843d1c7414f8e 100644 --- a/core/java/android/app/TaskStackListener.java +++ b/core/java/android/app/TaskStackListener.java @@ -199,4 +199,8 @@ public abstract class TaskStackListener extends ITaskStackListener.Stub { @Override public void onTaskRequestedOrientationChanged(int taskId, int requestedOrientation) { } + + @Override + public void onActivityRotation() { + } } 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 dd5cc7c9bbd49..796aaeefb62fb 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 @@ -114,4 +114,7 @@ public abstract class TaskStackChangeListener { /** @see ITaskStackListener#onRecentTaskListFrozenChanged(boolean) */ public void onRecentTaskListFrozenChanged(boolean frozen) { } + + /** @see ITaskStackListener#onActivityRotation()*/ + public void onActivityRotation() { } } 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 a76a901c5c81e..13f7993f57d4f 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 @@ -237,6 +237,11 @@ public class TaskStackChangeListeners extends TaskStackListener { mHandler.obtainMessage(H.ON_TASK_DESCRIPTION_CHANGED, taskInfo).sendToTarget(); } + @Override + public void onActivityRotation() { + mHandler.obtainMessage(H.ON_ACTIVITY_ROTATION).sendToTarget(); + } + private final class H extends Handler { private static final int ON_TASK_STACK_CHANGED = 1; private static final int ON_TASK_SNAPSHOT_CHANGED = 2; @@ -260,6 +265,7 @@ public class TaskStackChangeListeners extends TaskStackListener { private static final int ON_SINGLE_TASK_DISPLAY_EMPTY = 22; private static final int ON_TASK_LIST_FROZEN_UNFROZEN = 23; private static final int ON_TASK_DESCRIPTION_CHANGED = 24; + private static final int ON_ACTIVITY_ROTATION = 25; public H(Looper looper) { @@ -427,6 +433,12 @@ public class TaskStackChangeListeners extends TaskStackListener { } break; } + case ON_ACTIVITY_ROTATION: { + for (int i = mTaskStackListeners.size() - 1; i >= 0; i--) { + mTaskStackListeners.get(i).onActivityRotation(); + } + break; + } } } if (msg.obj instanceof SomeArgs) { diff --git a/services/core/java/com/android/server/wm/TaskChangeNotificationController.java b/services/core/java/com/android/server/wm/TaskChangeNotificationController.java index df0fa9cc3272a..6e9428ee6976b 100644 --- a/services/core/java/com/android/server/wm/TaskChangeNotificationController.java +++ b/services/core/java/com/android/server/wm/TaskChangeNotificationController.java @@ -61,6 +61,7 @@ class TaskChangeNotificationController { private static final int NOTIFY_TASK_LIST_FROZEN_UNFROZEN_MSG = 26; private static final int NOTIFY_TASK_FOCUS_CHANGED_MSG = 27; private static final int NOTIFY_TASK_REQUESTED_ORIENTATION_CHANGED_MSG = 28; + private static final int NOTIFY_ACTIVITY_ROTATED_MSG = 29; // Delay in notifying task stack change listeners (in millis) private static final int NOTIFY_TASK_STACK_CHANGE_LISTENERS_DELAY = 100; @@ -183,6 +184,10 @@ class TaskChangeNotificationController { l.onTaskRequestedOrientationChanged(m.arg1, m.arg2); }; + private final TaskStackConsumer mNotifyOnActivityRotation = (l, m) -> { + l.onActivityRotation(); + }; + @FunctionalInterface public interface TaskStackConsumer { void accept(ITaskStackListener t, Message m) throws RemoteException; @@ -277,6 +282,9 @@ class TaskChangeNotificationController { case NOTIFY_TASK_REQUESTED_ORIENTATION_CHANGED_MSG: forAllRemoteListeners(mNotifyTaskRequestedOrientationChanged, msg); break; + case NOTIFY_ACTIVITY_ROTATED_MSG: + forAllRemoteListeners(mNotifyOnActivityRotation, msg); + break; } if (msg.obj instanceof SomeArgs) { ((SomeArgs) msg.obj).recycle(); @@ -574,4 +582,11 @@ class TaskChangeNotificationController { forAllLocalListeners(mNotifyTaskRequestedOrientationChanged, msg); msg.sendToTarget(); } + + /** @see android.app.ITaskStackListener#onActivityRotation() */ + void notifyOnActivityRotation() { + final Message msg = mHandler.obtainMessage(NOTIFY_ACTIVITY_ROTATED_MSG); + forAllLocalListeners(mNotifyOnActivityRotation, msg); + msg.sendToTarget(); + } } diff --git a/services/core/java/com/android/server/wm/WindowManagerService.java b/services/core/java/com/android/server/wm/WindowManagerService.java index f34510e2104a3..8934e8f5c2e05 100644 --- a/services/core/java/com/android/server/wm/WindowManagerService.java +++ b/services/core/java/com/android/server/wm/WindowManagerService.java @@ -3848,6 +3848,11 @@ public class WindowManagerService extends IWindowManager.Stub final boolean rotationChanged = displayContent.updateRotationUnchecked(); Trace.traceEnd(TRACE_TAG_WINDOW_MANAGER); + if (rotationChanged) { + mAtmService.getTaskChangeNotificationController() + .notifyOnActivityRotation(); + } + if (!rotationChanged || forceRelayout) { displayContent.setLayoutNeeded(); layoutNeeded = true;