Add test for display configuration listener
To test process controller register and unregister to ActivityDisplay as
a listener.
Test: atest WindowProcessControllerTests
Bug: 113253755
Change-Id: Ife9aeed22b9d8b5faf6cbddb12b28c6b76d4bf87
diff --git a/services/core/java/com/android/server/wm/ConfigurationContainer.java b/services/core/java/com/android/server/wm/ConfigurationContainer.java
index 650d0be..ce3fb51 100644
--- a/services/core/java/com/android/server/wm/ConfigurationContainer.java
+++ b/services/core/java/com/android/server/wm/ConfigurationContainer.java
@@ -41,6 +41,8 @@
import android.graphics.Rect;
import android.util.proto.ProtoOutputStream;
+import com.android.internal.annotations.VisibleForTesting;
+
import java.io.PrintWriter;
import java.util.ArrayList;
@@ -522,6 +524,11 @@
mChangeListeners.remove(listener);
}
+ @VisibleForTesting
+ boolean containsListener(ConfigurationContainerListener listener) {
+ return mChangeListeners.contains(listener);
+ }
+
/**
* Must be called when new parent for the container was set.
*/
diff --git a/services/core/java/com/android/server/wm/WindowProcessController.java b/services/core/java/com/android/server/wm/WindowProcessController.java
index c38a974..030ee09 100644
--- a/services/core/java/com/android/server/wm/WindowProcessController.java
+++ b/services/core/java/com/android/server/wm/WindowProcessController.java
@@ -52,6 +52,7 @@
import android.util.Slog;
import android.util.proto.ProtoOutputStream;
+import com.android.internal.annotations.VisibleForTesting;
import com.android.internal.app.HeavyWeightSwitcherActivity;
import com.android.internal.util.function.pooled.PooledLambda;
import com.android.server.Watchdog;
@@ -330,6 +331,13 @@
return mRequiredAbi;
}
+ /** Returns ID of display overriding the configuration for this process, or
+ * INVALID_DISPLAY if no display is overriding. */
+ @VisibleForTesting
+ int getDisplayId() {
+ return mDisplayId;
+ }
+
public void setDebugging(boolean debugging) {
mDebugging = debugging;
}
@@ -761,15 +769,15 @@
activityDisplay.registerConfigurationChangeListener(this);
}
- private void unregisterDisplayConfigurationListenerLocked() {
+ @VisibleForTesting
+ void unregisterDisplayConfigurationListenerLocked() {
if (mDisplayId == INVALID_DISPLAY) {
return;
}
final ActivityDisplay activityDisplay =
mAtm.mRootActivityContainer.getActivityDisplay(mDisplayId);
if (activityDisplay != null) {
- mAtm.mRootActivityContainer.getActivityDisplay(
- mDisplayId).unregisterConfigurationChangeListener(this);
+ activityDisplay.unregisterConfigurationChangeListener(this);
}
mDisplayId = INVALID_DISPLAY;
}
diff --git a/services/tests/wmtests/src/com/android/server/wm/WindowProcessControllerTests.java b/services/tests/wmtests/src/com/android/server/wm/WindowProcessControllerTests.java
new file mode 100644
index 0000000..a7c84a1
--- /dev/null
+++ b/services/tests/wmtests/src/com/android/server/wm/WindowProcessControllerTests.java
@@ -0,0 +1,86 @@
+/*
+ * Copyright (C) 2019 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.server.wm;
+
+import static android.view.Display.INVALID_DISPLAY;
+
+import static com.android.server.wm.ActivityDisplay.POSITION_TOP;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertTrue;
+import static org.mockito.Mockito.mock;
+
+import android.content.pm.ApplicationInfo;
+import android.platform.test.annotations.Presubmit;
+
+import org.junit.Test;
+
+/**
+ * Tests for the {@link WindowProcessController} class.
+ *
+ * Build/Install/Run:
+ * atest WmTests:WindowProcessControllerTests
+ */
+@Presubmit
+public class WindowProcessControllerTests extends ActivityTestsBase {
+
+ @Test
+ public void testDisplayConfigurationListener() {
+ final WindowProcessController wpc = new WindowProcessController(
+ mService, mock(ApplicationInfo.class), null, 0, -1, null, null);
+ //By default, the process should not listen to any display.
+ assertEquals(INVALID_DISPLAY, wpc.getDisplayId());
+
+ // Register to display 1 as a listener.
+ TestActivityDisplay testActivityDisplay1 = createTestActivityDisplayInContainer();
+ wpc.registerDisplayConfigurationListenerLocked(testActivityDisplay1);
+ assertTrue(testActivityDisplay1.containsListener(wpc));
+ assertEquals(testActivityDisplay1.mDisplayId, wpc.getDisplayId());
+
+ // Move to display 2.
+ TestActivityDisplay testActivityDisplay2 = createTestActivityDisplayInContainer();
+ wpc.registerDisplayConfigurationListenerLocked(testActivityDisplay2);
+ assertFalse(testActivityDisplay1.containsListener(wpc));
+ assertTrue(testActivityDisplay2.containsListener(wpc));
+ assertEquals(testActivityDisplay2.mDisplayId, wpc.getDisplayId());
+
+ // Null ActivityDisplay will not change anything.
+ wpc.registerDisplayConfigurationListenerLocked(null);
+ assertTrue(testActivityDisplay2.containsListener(wpc));
+ assertEquals(testActivityDisplay2.mDisplayId, wpc.getDisplayId());
+
+ // Unregister listener will remove the wpc from registered displays.
+ wpc.unregisterDisplayConfigurationListenerLocked();
+ assertFalse(testActivityDisplay1.containsListener(wpc));
+ assertFalse(testActivityDisplay2.containsListener(wpc));
+ assertEquals(INVALID_DISPLAY, wpc.getDisplayId());
+
+ // Unregistration still work even if the display was removed.
+ wpc.registerDisplayConfigurationListenerLocked(testActivityDisplay1);
+ assertEquals(testActivityDisplay1.mDisplayId, wpc.getDisplayId());
+ mRootActivityContainer.removeChild(testActivityDisplay1);
+ wpc.unregisterDisplayConfigurationListenerLocked();
+ assertEquals(INVALID_DISPLAY, wpc.getDisplayId());
+ }
+
+ private TestActivityDisplay createTestActivityDisplayInContainer() {
+ final TestActivityDisplay testActivityDisplay = createNewActivityDisplay();
+ mRootActivityContainer.addChild(testActivityDisplay, POSITION_TOP);
+ return testActivityDisplay;
+ }
+}