diff options
| author | 2021-01-06 18:36:44 +0000 | |
|---|---|---|
| committer | 2021-01-06 18:36:44 +0000 | |
| commit | aee9e562af9abd6515b4d4ad7e7ec71622b7a997 (patch) | |
| tree | e56242663e344693f57e54cb3e14791ea7196ee9 | |
| parent | c06cc308940f1c2375713a43668b1c498aa69c66 (diff) | |
| parent | 2e6a09ef3ccec44137c915cad791637631035a85 (diff) | |
Merge "Invoke organizer events when a display is added / removed."
3 files changed, 62 insertions, 0 deletions
diff --git a/services/core/java/com/android/server/wm/DisplayArea.java b/services/core/java/com/android/server/wm/DisplayArea.java index 15483cb90ce2..1fd6d00ff2b7 100644 --- a/services/core/java/com/android/server/wm/DisplayArea.java +++ b/services/core/java/com/android/server/wm/DisplayArea.java @@ -564,6 +564,22 @@ public class DisplayArea<T extends WindowContainer> extends WindowContainer<T> { } @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 53f700938bf1..38f78c94efc3 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<Integer, IDisplayAreaOrganizer> 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 6f5a874114ea..99ec954926b4 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<WindowContainer> 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<WindowContainer> 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<T extends WindowContainer> extends DisplayArea<T> { private TestDisplayArea(WindowManagerService wms, Rect bounds) { super(wms, ANY, "half display area"); |