From 2e6a09ef3ccec44137c915cad791637631035a85 Mon Sep 17 00:00:00 2001 From: Daichi Hirono Date: Tue, 22 Dec 2020 08:21:41 +0900 Subject: [PATCH] Invoke organizer events when a display is added / removed. Bug: 175653536 Test: atest DisplayAreaTest Change-Id: Ib1f6899fc952fc07367c7748de5312dedb5f920b --- .../com/android/server/wm/DisplayArea.java | 16 ++++++++ .../wm/DisplayAreaOrganizerController.java | 5 +++ .../android/server/wm/DisplayAreaTest.java | 41 +++++++++++++++++++ 3 files changed, 62 insertions(+) diff --git a/services/core/java/com/android/server/wm/DisplayArea.java b/services/core/java/com/android/server/wm/DisplayArea.java index 15483cb90ce21..1fd6d00ff2b78 100644 --- a/services/core/java/com/android/server/wm/DisplayArea.java +++ b/services/core/java/com/android/server/wm/DisplayArea.java @@ -563,6 +563,22 @@ public class DisplayArea extends WindowContainer { } } + @Override + void onParentChanged(ConfigurationContainer newParent, ConfigurationContainer oldParent) { + super.onParentChanged(newParent, oldParent); + if (mOrganizer != null || newParent == null) { + return; + } + // Check if we have a registered organizer, just after mSurfaceControl is ready. + setOrganizer(mOrganizerController.getOrganizerByFeature(mFeatureId)); + } + + @Override + void removeImmediately() { + setOrganizer(null); + super.removeImmediately(); + } + @Override DisplayArea getDisplayArea() { return this; diff --git a/services/core/java/com/android/server/wm/DisplayAreaOrganizerController.java b/services/core/java/com/android/server/wm/DisplayAreaOrganizerController.java index 53f700938bf17..38f78c94efc33 100644 --- a/services/core/java/com/android/server/wm/DisplayAreaOrganizerController.java +++ b/services/core/java/com/android/server/wm/DisplayAreaOrganizerController.java @@ -21,6 +21,7 @@ import static android.window.DisplayAreaOrganizer.FEATURE_RUNTIME_TASK_CONTAINER import static com.android.internal.protolog.ProtoLogGroup.WM_DEBUG_WINDOW_ORGANIZER; import static com.android.server.wm.DisplayArea.Type.ANY; +import android.annotation.Nullable; import android.content.pm.ParceledListSlice; import android.os.Binder; import android.os.IBinder; @@ -50,6 +51,10 @@ public class DisplayAreaOrganizerController extends IDisplayAreaOrganizerControl private final WindowManagerGlobalLock mGlobalLock; private final HashMap mOrganizersByFeatureIds = new HashMap(); + @Nullable IDisplayAreaOrganizer getOrganizerByFeature(int featureId) { + return mOrganizersByFeatureIds.get(featureId); + } + private class DeathRecipient implements IBinder.DeathRecipient { int mFeature; IDisplayAreaOrganizer mOrganizer; diff --git a/services/tests/wmtests/src/com/android/server/wm/DisplayAreaTest.java b/services/tests/wmtests/src/com/android/server/wm/DisplayAreaTest.java index 6f5a874114eac..99ec954926b4b 100644 --- a/services/tests/wmtests/src/com/android/server/wm/DisplayAreaTest.java +++ b/services/tests/wmtests/src/com/android/server/wm/DisplayAreaTest.java @@ -43,11 +43,15 @@ import static com.android.server.wm.testing.Assert.assertThrows; import static com.google.common.truth.Truth.assertThat; import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNull; import static org.mockito.ArgumentMatchers.any; +import static org.mockito.ArgumentMatchers.argThat; +import static org.mockito.ArgumentMatchers.eq; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.times; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.verifyZeroInteractions; +import static org.mockito.Mockito.when; import android.content.pm.ActivityInfo; import android.graphics.Rect; @@ -56,6 +60,7 @@ import android.platform.test.annotations.Presubmit; import android.view.SurfaceControl; import android.view.View; import android.view.WindowManager; +import android.window.IDisplayAreaOrganizer; import com.google.android.collect.Lists; @@ -498,6 +503,42 @@ public class DisplayAreaTest extends WindowTestsBase { assertThat(mDisplayContent.getOrientationRequestingTaskDisplayArea()).isEqualTo(tda); } + @Test + public void onParentChanged_onDisplayAreaAppeared() { + final DisplayArea displayArea = new DisplayArea<>( + mWm, BELOW_TASKS, "NewArea", FEATURE_DEFAULT_TASK_CONTAINER); + + final IDisplayAreaOrganizer mockDisplayAreaOrganizer = mock(IDisplayAreaOrganizer.class); + spyOn(mWm.mAtmService.mWindowOrganizerController.mDisplayAreaOrganizerController); + when(mWm.mAtmService.mWindowOrganizerController.mDisplayAreaOrganizerController + .getOrganizerByFeature(FEATURE_DEFAULT_TASK_CONTAINER)) + .thenReturn(mockDisplayAreaOrganizer); + + mDisplayContent.addChild(displayArea, 0); + assertEquals(mockDisplayAreaOrganizer, displayArea.mOrganizer); + verify(mWm.mAtmService.mWindowOrganizerController.mDisplayAreaOrganizerController) + .onDisplayAreaAppeared( + eq(mockDisplayAreaOrganizer), + argThat(it -> it == displayArea && it.getSurfaceControl() != null)); + } + + @Test + public void onParentChanged_onDisplayAreaVanished() { + final DisplayArea displayArea = new DisplayArea<>( + mWm, BELOW_TASKS, "NewArea", FEATURE_DEFAULT_TASK_CONTAINER); + + final IDisplayAreaOrganizer mockDisplayAreaOrganizer = mock(IDisplayAreaOrganizer.class); + displayArea.mOrganizer = mockDisplayAreaOrganizer; + spyOn(mWm.mAtmService.mWindowOrganizerController.mDisplayAreaOrganizerController); + + mDisplayContent.addChild(displayArea, 0); + displayArea.removeImmediately(); + + assertNull(displayArea.mOrganizer); + verify(mWm.mAtmService.mWindowOrganizerController.mDisplayAreaOrganizerController) + .onDisplayAreaVanished(mockDisplayAreaOrganizer, displayArea); + } + private static class TestDisplayArea extends DisplayArea { private TestDisplayArea(WindowManagerService wms, Rect bounds) { super(wms, ANY, "half display area");