summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author TreeHugger Robot <treehugger-gerrit@google.com> 2021-01-06 18:36:44 +0000
committer Android (Google) Code Review <android-gerrit@google.com> 2021-01-06 18:36:44 +0000
commitaee9e562af9abd6515b4d4ad7e7ec71622b7a997 (patch)
treee56242663e344693f57e54cb3e14791ea7196ee9
parentc06cc308940f1c2375713a43668b1c498aa69c66 (diff)
parent2e6a09ef3ccec44137c915cad791637631035a85 (diff)
Merge "Invoke organizer events when a display is added / removed."
-rw-r--r--services/core/java/com/android/server/wm/DisplayArea.java16
-rw-r--r--services/core/java/com/android/server/wm/DisplayAreaOrganizerController.java5
-rw-r--r--services/tests/wmtests/src/com/android/server/wm/DisplayAreaTest.java41
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");