summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author Chris Li <lihongyu@google.com> 2024-03-04 13:21:30 +0800
committer Chris Li <lihongyu@google.com> 2024-03-04 13:21:30 +0800
commit7ee4459b48985a3aaa2bc73058fc4914f9ce9314 (patch)
tree521098b9c0e39616b0792a14767db30e3fd1d9ed
parent71175c173ece23c33004cdd9331c33b9e6fd5190 (diff)
Guard onPictureInPictureUiStateChanged with WM lock
The AIDL override needs to be guarded with WM lock before calling into WMS. Fix: 326578999 Test: pass existing Change-Id: I8354d6ef6568e366e8a739401d0cc9acdca35699
-rw-r--r--services/core/java/com/android/server/wm/ActivityTaskManagerService.java28
1 files changed, 15 insertions, 13 deletions
diff --git a/services/core/java/com/android/server/wm/ActivityTaskManagerService.java b/services/core/java/com/android/server/wm/ActivityTaskManagerService.java
index 218b7512b861..e283f3e8ef0e 100644
--- a/services/core/java/com/android/server/wm/ActivityTaskManagerService.java
+++ b/services/core/java/com/android/server/wm/ActivityTaskManagerService.java
@@ -4163,19 +4163,21 @@ public class ActivityTaskManagerService extends IActivityTaskManager.Stub {
@Override
public void onPictureInPictureUiStateChanged(PictureInPictureUiState pipState) {
enforceTaskPermission("onPictureInPictureUiStateChanged");
- // The PictureInPictureUiState is sent to current pip task if there is any
- // -or- the top standard task (state like entering PiP does not require a pinned task).
- final Task task;
- if (mRootWindowContainer.getDefaultTaskDisplayArea().hasPinnedTask()) {
- task = mRootWindowContainer.getDefaultTaskDisplayArea().getRootPinnedTask();
- } else {
- task = mRootWindowContainer.getDefaultTaskDisplayArea().getRootTask(
- t -> t.isActivityTypeStandard());
- }
- if (task != null && task.getTopMostActivity() != null
- && !task.getTopMostActivity().isState(FINISHING, DESTROYING, DESTROYED)) {
- mWindowManager.mAtmService.mActivityClientController.onPictureInPictureUiStateChanged(
- task.getTopMostActivity(), pipState);
+ synchronized (mGlobalLock) {
+ // The PictureInPictureUiState is sent to current pip task if there is any
+ // -or- the top standard task (state like entering PiP does not require a pinned task).
+ final Task task;
+ if (mRootWindowContainer.getDefaultTaskDisplayArea().hasPinnedTask()) {
+ task = mRootWindowContainer.getDefaultTaskDisplayArea().getRootPinnedTask();
+ } else {
+ task = mRootWindowContainer.getDefaultTaskDisplayArea().getRootTask(
+ t -> t.isActivityTypeStandard());
+ }
+ if (task != null && task.getTopMostActivity() != null
+ && !task.getTopMostActivity().isState(FINISHING, DESTROYING, DESTROYED)) {
+ mWindowManager.mAtmService.mActivityClientController
+ .onPictureInPictureUiStateChanged(task.getTopMostActivity(), pipState);
+ }
}
}