diff options
4 files changed, 33 insertions, 0 deletions
diff --git a/core/java/android/window/IWindowOrganizerController.aidl b/core/java/android/window/IWindowOrganizerController.aidl index 36eaf4966165..57e0ce8ce8ed 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 2a80d021abd6..930aaa2b291b 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 89205a6dfb01..519ec140a276 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<Transitions> { } 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 3590e9c27a9e..741537629dcb 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) { |