Loading services/core/java/com/android/server/wm/DisplayArea.java +11 −5 Original line number Original line Diff line number Diff line Loading @@ -504,6 +504,17 @@ public class DisplayArea<T extends WindowContainer> extends WindowContainer<T> { return false; return false; } } @Override void removeImmediately() { setOrganizer(null); super.removeImmediately(); } @Override DisplayArea getDisplayArea() { return this; } /** /** * DisplayArea that contains WindowTokens, and orders them according to their type. * DisplayArea that contains WindowTokens, and orders them according to their type. */ */ Loading Loading @@ -584,11 +595,6 @@ public class DisplayArea<T extends WindowContainer> extends WindowContainer<T> { } } } } @Override DisplayArea getDisplayArea() { return this; } /** /** * DisplayArea that can be dimmed. * DisplayArea that can be dimmed. */ */ Loading services/core/java/com/android/server/wm/DisplayAreaOrganizerController.java +6 −0 Original line number Original line Diff line number Diff line Loading @@ -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.internal.protolog.ProtoLogGroup.WM_DEBUG_WINDOW_ORGANIZER; import static com.android.server.wm.DisplayArea.Type.ANY; import static com.android.server.wm.DisplayArea.Type.ANY; import android.annotation.Nullable; import android.content.pm.ParceledListSlice; import android.content.pm.ParceledListSlice; import android.os.Binder; import android.os.Binder; import android.os.IBinder; import android.os.IBinder; Loading Loading @@ -77,6 +78,11 @@ public class DisplayAreaOrganizerController extends IDisplayAreaOrganizerControl mService.enforceTaskPermission(func); mService.enforceTaskPermission(func); } } @Nullable IDisplayAreaOrganizer getOrganizerByFeature(int featureId) { return mOrganizersByFeatureIds.get(featureId); } @Override @Override public ParceledListSlice<DisplayAreaAppearedInfo> registerOrganizer( public ParceledListSlice<DisplayAreaAppearedInfo> registerOrganizer( IDisplayAreaOrganizer organizer, int feature) { IDisplayAreaOrganizer organizer, int feature) { Loading services/core/java/com/android/server/wm/DisplayContent.java +26 −0 Original line number Original line Diff line number Diff line Loading @@ -213,6 +213,7 @@ import android.view.WindowInsets; import android.view.WindowManager; import android.view.WindowManager; import android.view.WindowManager.DisplayImePolicy; import android.view.WindowManager.DisplayImePolicy; import android.view.WindowManagerPolicyConstants.PointerEventListener; import android.view.WindowManagerPolicyConstants.PointerEventListener; import android.window.IDisplayAreaOrganizer; import com.android.internal.annotations.VisibleForTesting; import com.android.internal.annotations.VisibleForTesting; import com.android.internal.logging.MetricsLogger; import com.android.internal.logging.MetricsLogger; Loading Loading @@ -1074,6 +1075,7 @@ class DisplayContent extends RootDisplayArea implements WindowManagerPolicy.Disp // Sets the display content for the children. // Sets the display content for the children. onDisplayChanged(this); onDisplayChanged(this); updateDisplayAreaOrganizers(); mInputMonitor = new InputMonitor(mWmService, this); mInputMonitor = new InputMonitor(mWmService, this); mInsetsPolicy = new InsetsPolicy(mInsetsStateController, this); mInsetsPolicy = new InsetsPolicy(mInsetsStateController, this); Loading Loading @@ -2711,6 +2713,30 @@ class DisplayContent extends RootDisplayArea implements WindowManagerPolicy.Disp return mDisplayAreaPolicy.getDefaultTaskDisplayArea(); return mDisplayAreaPolicy.getDefaultTaskDisplayArea(); } } /** * Checks for all non-organized {@link DisplayArea}s for if there is any existing organizer for * their features. If so, registers them with the matched organizer. */ @VisibleForTesting void updateDisplayAreaOrganizers() { if (!isTrusted()) { // No need to update for untrusted display. return; } forAllDisplayAreas(displayArea -> { if (displayArea.isOrganized()) { return; } // Check if we have a registered organizer for the DA feature. final IDisplayAreaOrganizer organizer = mAtmService.mWindowOrganizerController.mDisplayAreaOrganizerController .getOrganizerByFeature(displayArea.mFeatureId); if (organizer != null) { displayArea.setOrganizer(organizer); } }); } /** /** * Returns true if the input point is within an app window. * Returns true if the input point is within an app window. */ */ Loading services/tests/wmtests/src/com/android/server/wm/DisplayAreaTest.java +41 −0 Original line number Original line Diff line number Diff line Loading @@ -43,11 +43,15 @@ import static com.android.server.wm.testing.Assert.assertThrows; import static com.google.common.truth.Truth.assertThat; import static com.google.common.truth.Truth.assertThat; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNull; import static org.mockito.ArgumentMatchers.any; 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.mock; import static org.mockito.Mockito.times; import static org.mockito.Mockito.times; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.verifyZeroInteractions; import static org.mockito.Mockito.verifyZeroInteractions; import static org.mockito.Mockito.when; import android.content.pm.ActivityInfo; import android.content.pm.ActivityInfo; import android.content.res.Configuration; import android.content.res.Configuration; Loading @@ -57,6 +61,7 @@ import android.platform.test.annotations.Presubmit; import android.view.SurfaceControl; import android.view.SurfaceControl; import android.view.View; import android.view.View; import android.view.WindowManager; import android.view.WindowManager; import android.window.IDisplayAreaOrganizer; import com.google.android.collect.Lists; import com.google.android.collect.Lists; Loading Loading @@ -525,6 +530,42 @@ public class DisplayAreaTest extends WindowTestsBase { assertThat(mDisplayContent.getOrientationRequestingTaskDisplayArea()).isEqualTo(tda); assertThat(mDisplayContent.getOrientationRequestingTaskDisplayArea()).isEqualTo(tda); } } @Test public void testDisplayContentUpdateDisplayAreaOrganizers_onDisplayAreaAppeared() { final DisplayArea<WindowContainer> displayArea = new DisplayArea<>( mWm, BELOW_TASKS, "NewArea", FEATURE_VENDOR_FIRST); final IDisplayAreaOrganizer mockDisplayAreaOrganizer = mock(IDisplayAreaOrganizer.class); spyOn(mWm.mAtmService.mWindowOrganizerController.mDisplayAreaOrganizerController); when(mWm.mAtmService.mWindowOrganizerController.mDisplayAreaOrganizerController .getOrganizerByFeature(FEATURE_VENDOR_FIRST)) .thenReturn(mockDisplayAreaOrganizer); mDisplayContent.addChild(displayArea, 0); mDisplayContent.updateDisplayAreaOrganizers(); assertEquals(mockDisplayAreaOrganizer, displayArea.mOrganizer); verify(mWm.mAtmService.mWindowOrganizerController.mDisplayAreaOrganizerController) .onDisplayAreaAppeared( eq(mockDisplayAreaOrganizer), argThat(it -> it == displayArea && it.getSurfaceControl() != null)); } @Test public void testRemoveImmediately_onDisplayAreaVanished() { final DisplayArea<WindowContainer> displayArea = new DisplayArea<>( mWm, BELOW_TASKS, "NewArea", FEATURE_VENDOR_FIRST); 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 static class TestDisplayArea<T extends WindowContainer> extends DisplayArea<T> { private TestDisplayArea(WindowManagerService wms, Rect bounds) { private TestDisplayArea(WindowManagerService wms, Rect bounds) { super(wms, ANY, "half display area"); super(wms, ANY, "half display area"); Loading Loading
services/core/java/com/android/server/wm/DisplayArea.java +11 −5 Original line number Original line Diff line number Diff line Loading @@ -504,6 +504,17 @@ public class DisplayArea<T extends WindowContainer> extends WindowContainer<T> { return false; return false; } } @Override void removeImmediately() { setOrganizer(null); super.removeImmediately(); } @Override DisplayArea getDisplayArea() { return this; } /** /** * DisplayArea that contains WindowTokens, and orders them according to their type. * DisplayArea that contains WindowTokens, and orders them according to their type. */ */ Loading Loading @@ -584,11 +595,6 @@ public class DisplayArea<T extends WindowContainer> extends WindowContainer<T> { } } } } @Override DisplayArea getDisplayArea() { return this; } /** /** * DisplayArea that can be dimmed. * DisplayArea that can be dimmed. */ */ Loading
services/core/java/com/android/server/wm/DisplayAreaOrganizerController.java +6 −0 Original line number Original line Diff line number Diff line Loading @@ -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.internal.protolog.ProtoLogGroup.WM_DEBUG_WINDOW_ORGANIZER; import static com.android.server.wm.DisplayArea.Type.ANY; import static com.android.server.wm.DisplayArea.Type.ANY; import android.annotation.Nullable; import android.content.pm.ParceledListSlice; import android.content.pm.ParceledListSlice; import android.os.Binder; import android.os.Binder; import android.os.IBinder; import android.os.IBinder; Loading Loading @@ -77,6 +78,11 @@ public class DisplayAreaOrganizerController extends IDisplayAreaOrganizerControl mService.enforceTaskPermission(func); mService.enforceTaskPermission(func); } } @Nullable IDisplayAreaOrganizer getOrganizerByFeature(int featureId) { return mOrganizersByFeatureIds.get(featureId); } @Override @Override public ParceledListSlice<DisplayAreaAppearedInfo> registerOrganizer( public ParceledListSlice<DisplayAreaAppearedInfo> registerOrganizer( IDisplayAreaOrganizer organizer, int feature) { IDisplayAreaOrganizer organizer, int feature) { Loading
services/core/java/com/android/server/wm/DisplayContent.java +26 −0 Original line number Original line Diff line number Diff line Loading @@ -213,6 +213,7 @@ import android.view.WindowInsets; import android.view.WindowManager; import android.view.WindowManager; import android.view.WindowManager.DisplayImePolicy; import android.view.WindowManager.DisplayImePolicy; import android.view.WindowManagerPolicyConstants.PointerEventListener; import android.view.WindowManagerPolicyConstants.PointerEventListener; import android.window.IDisplayAreaOrganizer; import com.android.internal.annotations.VisibleForTesting; import com.android.internal.annotations.VisibleForTesting; import com.android.internal.logging.MetricsLogger; import com.android.internal.logging.MetricsLogger; Loading Loading @@ -1074,6 +1075,7 @@ class DisplayContent extends RootDisplayArea implements WindowManagerPolicy.Disp // Sets the display content for the children. // Sets the display content for the children. onDisplayChanged(this); onDisplayChanged(this); updateDisplayAreaOrganizers(); mInputMonitor = new InputMonitor(mWmService, this); mInputMonitor = new InputMonitor(mWmService, this); mInsetsPolicy = new InsetsPolicy(mInsetsStateController, this); mInsetsPolicy = new InsetsPolicy(mInsetsStateController, this); Loading Loading @@ -2711,6 +2713,30 @@ class DisplayContent extends RootDisplayArea implements WindowManagerPolicy.Disp return mDisplayAreaPolicy.getDefaultTaskDisplayArea(); return mDisplayAreaPolicy.getDefaultTaskDisplayArea(); } } /** * Checks for all non-organized {@link DisplayArea}s for if there is any existing organizer for * their features. If so, registers them with the matched organizer. */ @VisibleForTesting void updateDisplayAreaOrganizers() { if (!isTrusted()) { // No need to update for untrusted display. return; } forAllDisplayAreas(displayArea -> { if (displayArea.isOrganized()) { return; } // Check if we have a registered organizer for the DA feature. final IDisplayAreaOrganizer organizer = mAtmService.mWindowOrganizerController.mDisplayAreaOrganizerController .getOrganizerByFeature(displayArea.mFeatureId); if (organizer != null) { displayArea.setOrganizer(organizer); } }); } /** /** * Returns true if the input point is within an app window. * Returns true if the input point is within an app window. */ */ Loading
services/tests/wmtests/src/com/android/server/wm/DisplayAreaTest.java +41 −0 Original line number Original line Diff line number Diff line Loading @@ -43,11 +43,15 @@ import static com.android.server.wm.testing.Assert.assertThrows; import static com.google.common.truth.Truth.assertThat; import static com.google.common.truth.Truth.assertThat; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNull; import static org.mockito.ArgumentMatchers.any; 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.mock; import static org.mockito.Mockito.times; import static org.mockito.Mockito.times; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.verifyZeroInteractions; import static org.mockito.Mockito.verifyZeroInteractions; import static org.mockito.Mockito.when; import android.content.pm.ActivityInfo; import android.content.pm.ActivityInfo; import android.content.res.Configuration; import android.content.res.Configuration; Loading @@ -57,6 +61,7 @@ import android.platform.test.annotations.Presubmit; import android.view.SurfaceControl; import android.view.SurfaceControl; import android.view.View; import android.view.View; import android.view.WindowManager; import android.view.WindowManager; import android.window.IDisplayAreaOrganizer; import com.google.android.collect.Lists; import com.google.android.collect.Lists; Loading Loading @@ -525,6 +530,42 @@ public class DisplayAreaTest extends WindowTestsBase { assertThat(mDisplayContent.getOrientationRequestingTaskDisplayArea()).isEqualTo(tda); assertThat(mDisplayContent.getOrientationRequestingTaskDisplayArea()).isEqualTo(tda); } } @Test public void testDisplayContentUpdateDisplayAreaOrganizers_onDisplayAreaAppeared() { final DisplayArea<WindowContainer> displayArea = new DisplayArea<>( mWm, BELOW_TASKS, "NewArea", FEATURE_VENDOR_FIRST); final IDisplayAreaOrganizer mockDisplayAreaOrganizer = mock(IDisplayAreaOrganizer.class); spyOn(mWm.mAtmService.mWindowOrganizerController.mDisplayAreaOrganizerController); when(mWm.mAtmService.mWindowOrganizerController.mDisplayAreaOrganizerController .getOrganizerByFeature(FEATURE_VENDOR_FIRST)) .thenReturn(mockDisplayAreaOrganizer); mDisplayContent.addChild(displayArea, 0); mDisplayContent.updateDisplayAreaOrganizers(); assertEquals(mockDisplayAreaOrganizer, displayArea.mOrganizer); verify(mWm.mAtmService.mWindowOrganizerController.mDisplayAreaOrganizerController) .onDisplayAreaAppeared( eq(mockDisplayAreaOrganizer), argThat(it -> it == displayArea && it.getSurfaceControl() != null)); } @Test public void testRemoveImmediately_onDisplayAreaVanished() { final DisplayArea<WindowContainer> displayArea = new DisplayArea<>( mWm, BELOW_TASKS, "NewArea", FEATURE_VENDOR_FIRST); 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 static class TestDisplayArea<T extends WindowContainer> extends DisplayArea<T> { private TestDisplayArea(WindowManagerService wms, Rect bounds) { private TestDisplayArea(WindowManagerService wms, Rect bounds) { super(wms, ANY, "half display area"); super(wms, ANY, "half display area"); Loading