diff options
3 files changed, 104 insertions, 3 deletions
diff --git a/services/core/java/com/android/server/wm/ConfigurationContainer.java b/services/core/java/com/android/server/wm/ConfigurationContainer.java index 650d0be76dc5..ce3fb51aa9f5 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.Point; 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 @@ public abstract class ConfigurationContainer<E extends ConfigurationContainer> { 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 c38a974ac774..030ee09554dd 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.Log; 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 @@ public class WindowProcessController extends ConfigurationContainer<Configuratio 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 @@ public class WindowProcessController extends ConfigurationContainer<Configuratio 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 000000000000..a7c84a1c28b4 --- /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; + } +} |