/* * Copyright (C) 2016 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 android.server.wm; import static android.server.wm.ComponentNameUtils.getActivityName; import static android.server.wm.app.Components.TEST_ACTIVITY; import static android.view.Display.DEFAULT_DISPLAY; import static androidx.test.platform.app.InstrumentationRegistry.getInstrumentation; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; import static org.junit.Assume.assumeFalse; import static org.junit.Assume.assumeTrue; import android.content.Context; import android.content.res.Configuration; import android.hardware.display.DisplayManager; import android.platform.test.annotations.Presubmit; import android.server.wm.WindowManagerState.DisplayContent; import android.util.Size; import android.view.Display; import org.junit.Test; import java.util.List; /** * Build/Install/Run: * atest CtsWindowManagerDeviceTestCases:DisplayTests */ @Presubmit @android.server.wm.annotation.Group3 public class DisplayTests extends MultiDisplayTestBase { /** * Tests that the global configuration is equal to the default display's override configuration. */ @Test public void testDefaultDisplayOverrideConfiguration() throws Exception { final List reportedDisplays = getDisplaysStates(); final DisplayContent primaryDisplay = getDisplayState(reportedDisplays, DEFAULT_DISPLAY); assertEquals("Primary display's configuration should be equal to global configuration.", primaryDisplay.mOverrideConfiguration, primaryDisplay.mFullConfiguration); assertEquals("Primary display's configuration should be equal to global configuration.", primaryDisplay.mOverrideConfiguration, primaryDisplay.mMergedOverrideConfiguration); } /** * Tests that config_remoteInsetsControllerControlsSystemBars is not set to true for * non-automotive devices. */ @Test public void testRemoteInsetsControllerNotControlSystemBarsForNonAutoDevies() { assumeFalse(isCar()); assertFalse("Non auto devices should not set config_remoteInsetsControllerControlsSystemBars", remoteInsetsControllerControlsSystemBars()); } /** * Tests that secondary display has override configuration set. */ @Test public void testCreateVirtualDisplayWithCustomConfig() throws Exception { final DisplayContent newDisplay = createManagedVirtualDisplaySession().createDisplay(); // Find the density of created display. final int newDensityDpi = newDisplay.mFullConfiguration.densityDpi; assertEquals(CUSTOM_DENSITY_DPI, newDensityDpi); } @Test public void testNonDefaultDisplayResourcesConfiguration() throws Exception { final int smallDisplaySize = 1000; final int longDisplaySize = 1920; // Get land-sized display's resources configuration. final int smallestScreenWidthForLandDisplay = getDisplayResourcesConfiguration( longDisplaySize, smallDisplaySize).smallestScreenWidthDp; // Get port-sized display's resources configuration. final int smallestScreenWidthForPortDisplay = getDisplayResourcesConfiguration( smallDisplaySize, longDisplaySize).smallestScreenWidthDp; // Check whether smallestScreenWidthDp configuration is proper. assertEquals("smallestScreenWidthDp configuration should be set to smallest possible size.", smallestScreenWidthForLandDisplay, smallestScreenWidthForPortDisplay); } /** * Tests that launch on secondary display is not permitted if device has the feature disabled. * Activities requested to be launched on a secondary display in this case should land on the * default display. */ @Test public void testMultiDisplayDisabled() throws Exception { // Only check devices with the feature disabled. assumeFalse(supportsMultiDisplay()); // Create new virtual display. final DisplayContent newDisplay = createManagedVirtualDisplaySession().createDisplay(); // Launch activity on new secondary display. launchActivityOnDisplay(TEST_ACTIVITY, newDisplay.mId); mWmState.computeState(TEST_ACTIVITY); mWmState.assertFocusedActivity("Launched activity must be focused", TEST_ACTIVITY); // Check that activity is on the right display. final int frontStackId = mWmState.getFrontRootTaskId(DEFAULT_DISPLAY); final WindowManagerState.ActivityTask frontStack = mWmState.getRootTask(frontStackId); assertEquals("Launched activity must be resumed", getActivityName(TEST_ACTIVITY), frontStack.mResumedActivity); assertEquals("Front stack must be on the default display", DEFAULT_DISPLAY, frontStack.mDisplayId); mWmState.assertFocusedStack("Focus must be on the default display", frontStackId); } @Test public void testCreateMultipleVirtualDisplays() throws Exception { final List originalDs = getDisplaysStates(); try (final VirtualDisplaySession virtualDisplaySession = new VirtualDisplaySession()) { // Create new virtual displays virtualDisplaySession.createDisplays(3); getDisplayStateAfterChange(originalDs.size() + 3); } getDisplayStateAfterChange(originalDs.size()); } /** * Test that display overrides apply correctly and won't be affected by display changes. * This sets overrides to display size and density, initiates a display changed event by locking * and unlocking the phone and verifies that overrides are kept. */ @Test public void testForceDisplayMetrics() { assumeTrue(supportsLockScreen()); launchHomeActivity(); final DisplayMetricsSession displayMetricsSession = createManagedDisplayMetricsSession(DEFAULT_DISPLAY); final LockScreenSession lockScreenSession = createManagedLockScreenSession(); // Read initial sizes. final ReportedDisplayMetrics originalDisplayMetrics = displayMetricsSession.getInitialDisplayMetrics(); // Apply new override values that don't match the physical metrics. final Size overrideSize = new Size( (int) (originalDisplayMetrics.physicalSize.getWidth() * 1.5), (int) (originalDisplayMetrics.physicalSize.getHeight() * 1.5)); final Integer overrideDensity = (int) (originalDisplayMetrics.physicalDensity * 1.1); displayMetricsSession.overrideDisplayMetrics(overrideSize, overrideDensity); // Check if overrides applied correctly. ReportedDisplayMetrics displayMetrics = displayMetricsSession.getDisplayMetrics(); assertEquals(overrideSize, displayMetrics.overrideSize); assertEquals(overrideDensity, displayMetrics.overrideDensity); // Lock and unlock device. This will cause a DISPLAY_CHANGED event to be triggered and // might update the metrics. lockScreenSession.sleepDevice() .wakeUpDevice() .unlockDevice(); mWmState.waitForHomeActivityVisible(); // Check if overrides are still applied. displayMetrics = displayMetricsSession.getDisplayMetrics(); assertEquals(overrideSize, displayMetrics.overrideSize); assertEquals(overrideDensity, displayMetrics.overrideDensity); } private Configuration getDisplayResourcesConfiguration(int displayWidth, int displayHeight) throws Exception { final Context context = getInstrumentation().getContext(); try (final VirtualDisplaySession virtualDisplaySession = new VirtualDisplaySession()) { final DisplayContent displayContent = virtualDisplaySession .setSimulateDisplay(true) .setSimulationDisplaySize(displayWidth, displayHeight) .createDisplay(); final Display display = mDm.getDisplay(displayContent.mId); Configuration config = context.createDisplayContext(display) .getResources().getConfiguration(); return config; } } }