Loading services/core/java/com/android/server/wm/ConfigurationContainer.java +7 −0 Original line number Diff line number Diff line Loading @@ -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; Loading Loading @@ -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. */ Loading services/core/java/com/android/server/wm/WindowProcessController.java +11 −3 Original line number Diff line number Diff line Loading @@ -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; Loading Loading @@ -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; } Loading Loading @@ -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; } Loading services/tests/wmtests/src/com/android/server/wm/WindowProcessControllerTests.java 0 → 100644 +86 −0 Original line number Diff line number Diff line /* * 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; } } Loading
services/core/java/com/android/server/wm/ConfigurationContainer.java +7 −0 Original line number Diff line number Diff line Loading @@ -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; Loading Loading @@ -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. */ Loading
services/core/java/com/android/server/wm/WindowProcessController.java +11 −3 Original line number Diff line number Diff line Loading @@ -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; Loading Loading @@ -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; } Loading Loading @@ -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; } Loading
services/tests/wmtests/src/com/android/server/wm/WindowProcessControllerTests.java 0 → 100644 +86 −0 Original line number Diff line number Diff line /* * 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; } }