diff --git a/core/java/android/view/IDisplayWindowListener.aidl b/core/java/android/view/IDisplayWindowListener.aidl index 610e0f866b43d..f95d6b3492213 100644 --- a/core/java/android/view/IDisplayWindowListener.aidl +++ b/core/java/android/view/IDisplayWindowListener.aidl @@ -32,7 +32,8 @@ import android.content.res.Configuration; oneway interface IDisplayWindowListener { /** - * Called when a display is added to the WM hierarchy. + * Called when a new display is added to the WM hierarchy. The existing display ids are returned + * when this listener is registered with WM via {@link #registerDisplayWindowListener}. */ void onDisplayAdded(int displayId); diff --git a/core/java/android/view/IWindowManager.aidl b/core/java/android/view/IWindowManager.aidl index 9ce412222e2e6..52d57cf0a7f64 100644 --- a/core/java/android/view/IWindowManager.aidl +++ b/core/java/android/view/IWindowManager.aidl @@ -521,9 +521,10 @@ interface IWindowManager void unregisterDisplayFoldListener(IDisplayFoldListener listener); /** - * Registers an IDisplayContainerListener + * Registers an IDisplayContainerListener, and returns the set of existing display ids. The + * listener's onDisplayAdded() will not be called for the displays returned. */ - void registerDisplayWindowListener(IDisplayWindowListener listener); + int[] registerDisplayWindowListener(IDisplayWindowListener listener); /** * Unregisters an IDisplayContainerListener. diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/common/DisplayController.java b/libs/WindowManager/Shell/src/com/android/wm/shell/common/DisplayController.java index 9a3bdab9f4183..a1fb658ccb9d9 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/common/DisplayController.java +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/common/DisplayController.java @@ -67,7 +67,10 @@ public class DisplayController { */ public void initialize() { try { - mWmService.registerDisplayWindowListener(mDisplayContainerListener); + int[] displayIds = mWmService.registerDisplayWindowListener(mDisplayContainerListener); + for (int i = 0; i < displayIds.length; i++) { + onDisplayAdded(displayIds[i]); + } } catch (RemoteException e) { throw new RuntimeException("Unable to register display controller"); } diff --git a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/transition/ShellTransitionTests.java b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/transition/ShellTransitionTests.java index 54eacee8a9c38..b4ef5bf0e30ab 100644 --- a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/transition/ShellTransitionTests.java +++ b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/transition/ShellTransitionTests.java @@ -731,24 +731,12 @@ public class ShellTransitionTests { IWindowManager mockWM = mock(IWindowManager.class); final IDisplayWindowListener[] displayListener = new IDisplayWindowListener[1]; try { - doAnswer(new Answer() { - @Override - public Object answer(InvocationOnMock invocation) { - displayListener[0] = invocation.getArgument(0); - return null; - } - }).when(mockWM).registerDisplayWindowListener(any()); + doReturn(new int[] {DEFAULT_DISPLAY}).when(mockWM).registerDisplayWindowListener(any()); } catch (RemoteException e) { // No remote stuff happening, so this can't be hit } DisplayController out = new DisplayController(mContext, mockWM, mMainExecutor); out.initialize(); - try { - displayListener[0].onDisplayAdded(DEFAULT_DISPLAY); - mMainExecutor.flushAll(); - } catch (RemoteException e) { - // Again, no remote stuff - } return out; } diff --git a/services/core/java/com/android/server/camera/CameraServiceProxy.java b/services/core/java/com/android/server/camera/CameraServiceProxy.java index 6610e8c4392ba..42b676f0d816d 100644 --- a/services/core/java/com/android/server/camera/CameraServiceProxy.java +++ b/services/core/java/com/android/server/camera/CameraServiceProxy.java @@ -692,8 +692,11 @@ public class CameraServiceProxy extends SystemService } try { - WindowManagerGlobal.getWindowManagerService().registerDisplayWindowListener( - mDisplayWindowListener); + int[] displayIds = WindowManagerGlobal.getWindowManagerService() + .registerDisplayWindowListener(mDisplayWindowListener); + for (int i = 0; i < displayIds.length; i++) { + mDisplayWindowListener.onDisplayAdded(displayIds[i]); + } } catch (RemoteException e) { Log.e(TAG, "Failed to register display window listener!"); } diff --git a/services/core/java/com/android/server/wm/DisplayWindowListenerController.java b/services/core/java/com/android/server/wm/DisplayWindowListenerController.java index b627b33c036ed..4141090f7fa04 100644 --- a/services/core/java/com/android/server/wm/DisplayWindowListenerController.java +++ b/services/core/java/com/android/server/wm/DisplayWindowListenerController.java @@ -19,6 +19,7 @@ package com.android.server.wm; import android.content.res.Configuration; import android.os.RemoteCallbackList; import android.os.RemoteException; +import android.util.IntArray; import android.view.IDisplayWindowListener; /** @@ -28,23 +29,20 @@ import android.view.IDisplayWindowListener; class DisplayWindowListenerController { RemoteCallbackList mDisplayListeners = new RemoteCallbackList<>(); -// private final ArrayList mDisplayListeners = new ArrayList<>(); private final WindowManagerService mService; DisplayWindowListenerController(WindowManagerService service) { mService = service; } - void registerListener(IDisplayWindowListener listener) { + int[] registerListener(IDisplayWindowListener listener) { synchronized (mService.mGlobalLock) { mDisplayListeners.register(listener); - try { - for (int i = 0; i < mService.mAtmService.mRootWindowContainer.getChildCount(); - ++i) { - DisplayContent d = mService.mAtmService.mRootWindowContainer.getChildAt(i); - listener.onDisplayAdded(d.mDisplayId); - } - } catch (RemoteException e) { } + final IntArray displayIds = new IntArray(); + mService.mAtmService.mRootWindowContainer.forAllDisplays((displayContent) -> { + displayIds.add(displayContent.mDisplayId); + }); + return displayIds.toArray(); } } diff --git a/services/core/java/com/android/server/wm/WindowManagerService.java b/services/core/java/com/android/server/wm/WindowManagerService.java index 43b555c914bcc..5b24a8ba2cabc 100644 --- a/services/core/java/com/android/server/wm/WindowManagerService.java +++ b/services/core/java/com/android/server/wm/WindowManagerService.java @@ -4340,13 +4340,18 @@ public class WindowManagerService extends IWindowManager.Stub } } - /** Registers a hierarchy listener that gets callbacks when the hierarchy changes. */ + /** + * Registers a hierarchy listener that gets callbacks when the hierarchy changes. The listener's + * onDisplayAdded() will not be called for the displays returned. + * + * @return the displayIds for the existing displays + */ @Override - public void registerDisplayWindowListener(IDisplayWindowListener listener) { + public int[] registerDisplayWindowListener(IDisplayWindowListener listener) { mAtmService.enforceTaskPermission("registerDisplayWindowListener"); final long ident = Binder.clearCallingIdentity(); try { - mDisplayNotificationController.registerListener(listener); + return mDisplayNotificationController.registerListener(listener); } finally { Binder.restoreCallingIdentity(ident); } diff --git a/services/tests/wmtests/src/com/android/server/wm/ActivityTaskManagerServiceTests.java b/services/tests/wmtests/src/com/android/server/wm/ActivityTaskManagerServiceTests.java index 8ca14bc0bb86c..b95d56b58d067 100644 --- a/services/tests/wmtests/src/com/android/server/wm/ActivityTaskManagerServiceTests.java +++ b/services/tests/wmtests/src/com/android/server/wm/ActivityTaskManagerServiceTests.java @@ -173,7 +173,10 @@ public class ActivityTaskManagerServiceTests extends WindowTestsBase { @Override public void onFixedRotationFinished(int displayId) {} }; - mAtm.mWindowManager.registerDisplayWindowListener(listener); + int[] displayIds = mAtm.mWindowManager.registerDisplayWindowListener(listener); + for (int i = 0; i < displayIds.length; i++) { + added.add(displayIds[i]); + } // Check that existing displays call added assertEquals(mRootWindowContainer.getChildCount(), added.size()); assertEquals(0, changed.size());