From 9071563b830c7c4c61329dcc3f12b0f4e9889323 Mon Sep 17 00:00:00 2001 From: Evan Rosky Date: Mon, 31 Oct 2022 16:44:09 +0000 Subject: [PATCH] Share apply token between WMCore and WMShell This means WMShell/Core/Launcher are using the same apply token. Barring alternatives, this is necessary to make sure that transitions work properly (since surface operations span multiple process). Otherwise, even if transactions are received by SF in the correct order, they can be applied in a different order. Bug: 256046837 Test: atest PipRotationTest_ShellTransit and check for leaked tasks in surface dump. Change-Id: I0424e66ed347576718f62b1e598ae116720aa70d --- .../window/IWindowOrganizerController.aidl | 3 +++ core/java/android/window/WindowOrganizer.java | 21 +++++++++++++++++++ .../wm/shell/transition/Transitions.java | 3 +++ .../server/wm/WindowOrganizerController.java | 6 ++++++ 4 files changed, 33 insertions(+) diff --git a/core/java/android/window/IWindowOrganizerController.aidl b/core/java/android/window/IWindowOrganizerController.aidl index 36eaf4966165b..57e0ce8ce8ed5 100644 --- a/core/java/android/window/IWindowOrganizerController.aidl +++ b/core/java/android/window/IWindowOrganizerController.aidl @@ -105,4 +105,7 @@ interface IWindowOrganizerController { /** @return An interface enabling the transition players to report its metrics. */ ITransitionMetricsReporter getTransitionMetricsReporter(); + + /** @return The transaction queue token used by WM. */ + IBinder getApplyToken(); } diff --git a/core/java/android/window/WindowOrganizer.java b/core/java/android/window/WindowOrganizer.java index 2a80d021abd69..930aaa2b291b6 100644 --- a/core/java/android/window/WindowOrganizer.java +++ b/core/java/android/window/WindowOrganizer.java @@ -26,6 +26,7 @@ import android.os.IBinder; import android.os.RemoteException; import android.util.Singleton; import android.view.RemoteAnimationAdapter; +import android.view.SurfaceControl; /** * Base class for organizing specific types of windows like Tasks and DisplayAreas @@ -184,6 +185,26 @@ public class WindowOrganizer { } } + /** + * Use WM's transaction-queue instead of Shell's independent one. This is necessary + * if WM and Shell need to coordinate transactions (eg. for shell transitions). + * @return true if successful, false otherwise. + * @hide + */ + public boolean shareTransactionQueue() { + final IBinder wmApplyToken; + try { + wmApplyToken = getWindowOrganizerController().getApplyToken(); + } catch (RemoteException e) { + throw e.rethrowFromSystemServer(); + } + if (wmApplyToken == null) { + return false; + } + SurfaceControl.Transaction.setDefaultApplyToken(wmApplyToken); + return true; + } + static IWindowOrganizerController getWindowOrganizerController() { return IWindowOrganizerControllerSingleton.get(); } diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/transition/Transitions.java b/libs/WindowManager/Shell/src/com/android/wm/shell/transition/Transitions.java index 89205a6dfb01d..519ec140a2767 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/transition/Transitions.java +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/transition/Transitions.java @@ -175,6 +175,9 @@ public class Transitions implements RemoteCallable { } private void onInit() { + if (Transitions.ENABLE_SHELL_TRANSITIONS) { + mOrganizer.shareTransactionQueue(); + } mShellController.addExternalInterface(KEY_EXTRA_SHELL_SHELL_TRANSITIONS, this::createExternalInterface, this); diff --git a/services/core/java/com/android/server/wm/WindowOrganizerController.java b/services/core/java/com/android/server/wm/WindowOrganizerController.java index 3590e9c27a9e7..741537629dcb2 100644 --- a/services/core/java/com/android/server/wm/WindowOrganizerController.java +++ b/services/core/java/com/android/server/wm/WindowOrganizerController.java @@ -1547,6 +1547,12 @@ class WindowOrganizerController extends IWindowOrganizerController.Stub return mTransitionController.mTransitionMetricsReporter; } + @Override + public IBinder getApplyToken() { + enforceTaskPermission("getApplyToken()"); + return SurfaceControl.Transaction.getDefaultApplyToken(); + } + /** Whether the configuration changes are important to report back to an organizer. */ static boolean configurationsAreEqualForOrganizer( Configuration newConfig, @Nullable Configuration oldConfig) {