diff options
| author | 2024-03-04 13:21:30 +0800 | |
|---|---|---|
| committer | 2024-03-04 13:21:30 +0800 | |
| commit | 7ee4459b48985a3aaa2bc73058fc4914f9ce9314 (patch) | |
| tree | 521098b9c0e39616b0792a14767db30e3fd1d9ed | |
| parent | 71175c173ece23c33004cdd9331c33b9e6fd5190 (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.java | 28 |
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); + } } } |