From 8e5114623329a17d2aa6d73823c99a28b1f44c6f Mon Sep 17 00:00:00 2001 From: Winson Chung Date: Thu, 3 Sep 2020 14:24:35 -0700 Subject: [PATCH] Remove sysui from having to manually notify pip visibility - Set directly from the system when we enter/leave pip so there's no chance this gets out of sync Bug: 167682726 Test: adb shell input keyevent 171 (ensures this still triggers the menu) Change-Id: I73b4c5b6faebd505bf8e17b4c817b4d600025894 --- core/java/android/view/IWindowManager.aidl | 5 ----- .../shared/system/WindowManagerWrapper.java | 7 ++----- .../android/server/wm/RootWindowContainer.java | 17 ++++++++++++++++- .../core/java/com/android/server/wm/Task.java | 5 +++-- .../android/server/wm/WindowManagerService.java | 13 ------------- 5 files changed, 21 insertions(+), 26 deletions(-) diff --git a/core/java/android/view/IWindowManager.aidl b/core/java/android/view/IWindowManager.aidl index 00fc67214f75e..8e875d7a889d0 100644 --- a/core/java/android/view/IWindowManager.aidl +++ b/core/java/android/view/IWindowManager.aidl @@ -392,11 +392,6 @@ interface IWindowManager */ oneway void setRecentsVisibility(boolean visible); - /** - * Called by System UI to notify of changes to the visibility of PIP. - */ - oneway void setPipVisibility(boolean visible); - /** * Called by System UI to enable or disable haptic feedback on the navigation bar buttons. */ diff --git a/packages/SystemUI/shared/src/com/android/systemui/shared/system/WindowManagerWrapper.java b/packages/SystemUI/shared/src/com/android/systemui/shared/system/WindowManagerWrapper.java index d64bf77ad9d54..067ac9ec7b1e1 100644 --- a/packages/SystemUI/shared/src/com/android/systemui/shared/system/WindowManagerWrapper.java +++ b/packages/SystemUI/shared/src/com/android/systemui/shared/system/WindowManagerWrapper.java @@ -153,12 +153,9 @@ public class WindowManagerWrapper { } } + @Deprecated public void setPipVisibility(final boolean visible) { - try { - WindowManagerGlobal.getWindowManagerService().setPipVisibility(visible); - } catch (RemoteException e) { - Log.e(TAG, "Unable to reach window manager", e); - } + // To be removed } /** diff --git a/services/core/java/com/android/server/wm/RootWindowContainer.java b/services/core/java/com/android/server/wm/RootWindowContainer.java index 6539e1325ec15..80ccf3c29a054 100644 --- a/services/core/java/com/android/server/wm/RootWindowContainer.java +++ b/services/core/java/com/android/server/wm/RootWindowContainer.java @@ -2201,7 +2201,22 @@ class RootWindowContainer extends WindowContainer ensureActivitiesVisible(null, 0, false /* preserveWindows */); resumeFocusedStacksTopActivities(); - mService.getTaskChangeNotificationController().notifyActivityPinned(r); + notifyActivityPipModeChanged(r); + } + + /** + * Notifies when an activity enters or leaves PIP mode. + * @param r indicates the activity currently in PIP, can be null to indicate no activity is + * currently in PIP mode. + */ + void notifyActivityPipModeChanged(@Nullable ActivityRecord r) { + final boolean inPip = r != null; + if (inPip) { + mService.getTaskChangeNotificationController().notifyActivityPinned(r); + } else { + mService.getTaskChangeNotificationController().notifyActivityUnpinned(); + } + mWindowManager.mPolicy.setPipVisibilityLw(inPip); } void executeAppTransitionForAllDisplay() { diff --git a/services/core/java/com/android/server/wm/Task.java b/services/core/java/com/android/server/wm/Task.java index 70fd860f21f22..6e762ca4cb212 100644 --- a/services/core/java/com/android/server/wm/Task.java +++ b/services/core/java/com/android/server/wm/Task.java @@ -1434,7 +1434,7 @@ class Task extends WindowContainer { && (newParent == null || !newParent.inPinnedWindowingMode())) { // Notify if a task from the pinned stack is being removed // (or moved depending on the mode). - mAtmService.getTaskChangeNotificationController().notifyActivityUnpinned(); + mRootWindowContainer.notifyActivityPipModeChanged(null); } } @@ -5102,10 +5102,11 @@ class Task extends WindowContainer { : WINDOWING_MODE_FULLSCREEN; } if (currentMode == WINDOWING_MODE_PINNED) { - mAtmService.getTaskChangeNotificationController().notifyActivityUnpinned(); + mRootWindowContainer.notifyActivityPipModeChanged(null); } if (likelyResolvedMode == WINDOWING_MODE_PINNED && taskDisplayArea.getRootPinnedTask() != null) { + // Can only have 1 pip at a time, so replace an existing pip taskDisplayArea.getRootPinnedTask().dismissPip(); } diff --git a/services/core/java/com/android/server/wm/WindowManagerService.java b/services/core/java/com/android/server/wm/WindowManagerService.java index 19179a808d7c1..fcb8c9fe7d5a8 100644 --- a/services/core/java/com/android/server/wm/WindowManagerService.java +++ b/services/core/java/com/android/server/wm/WindowManagerService.java @@ -5751,19 +5751,6 @@ public class WindowManagerService extends IWindowManager.Stub } } - @Override - public void setPipVisibility(boolean visible) { - if (mContext.checkCallingOrSelfPermission(android.Manifest.permission.STATUS_BAR) - != PackageManager.PERMISSION_GRANTED) { - throw new SecurityException("Caller does not hold permission " - + android.Manifest.permission.STATUS_BAR); - } - - synchronized (mGlobalLock) { - mPolicy.setPipVisibilityLw(visible); - } - } - @Override public void statusBarVisibilityChanged(int displayId, int visibility) { if (mContext.checkCallingOrSelfPermission(android.Manifest.permission.STATUS_BAR)