summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--core/java/android/window/IWindowOrganizerController.aidl3
-rw-r--r--core/java/android/window/WindowOrganizer.java21
-rw-r--r--libs/WindowManager/Shell/src/com/android/wm/shell/transition/Transitions.java3
-rw-r--r--services/core/java/com/android/server/wm/WindowOrganizerController.java6
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) {