| /* |
| * Copyright (C) 2020 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.WindowMetricsTestHelper.assertMetricsMatchesLayout; |
| import static android.server.wm.WindowMetricsTestHelper.getBoundsExcludingNavigationBarAndCutout; |
| import static android.view.Display.DEFAULT_DISPLAY; |
| import static android.view.ViewGroup.LayoutParams.MATCH_PARENT; |
| import static android.view.WindowManager.LayoutParams.LAYOUT_IN_DISPLAY_CUTOUT_MODE_ALWAYS; |
| import static android.view.WindowManager.LayoutParams.TYPE_APPLICATION_OVERLAY; |
| |
| import static org.junit.Assert.assertEquals; |
| |
| import android.content.Context; |
| import android.graphics.PixelFormat; |
| import android.graphics.Point; |
| import android.graphics.Rect; |
| import android.hardware.display.DisplayManager; |
| import android.platform.test.annotations.Presubmit; |
| import android.server.wm.WindowMetricsTestHelper.OnLayoutChangeListener; |
| import android.view.Display; |
| import android.view.View; |
| import android.view.WindowManager; |
| import android.view.WindowMetrics; |
| |
| import androidx.test.core.app.ApplicationProvider; |
| import androidx.test.platform.app.InstrumentationRegistry; |
| |
| import org.junit.Test; |
| |
| /** |
| * Tests that verify the behavior of {@link WindowMetrics} and {@link android.app.WindowContext} |
| * APIs |
| * |
| * Build/Install/Run: |
| * atest CtsWindowManagerDeviceTestCases:WindowMetricsWindowContextTests |
| */ |
| @Presubmit |
| public class WindowMetricsWindowContextTests extends WindowManagerTestBase { |
| @Test |
| public void testMetricsMatchesLayoutOnWindowContext() { |
| createAllowSystemAlertWindowAppOpSession(); |
| final WindowContextTestSession mWindowContextSession = |
| mObjectTracker.manage(new WindowContextTestSession()); |
| |
| mWindowContextSession.assertWindowContextMetricsMatchesLayout(); |
| } |
| |
| @Test |
| public void testMetricsMatchesDisplayAreaOnWindowContext() { |
| createAllowSystemAlertWindowAppOpSession(); |
| final WindowContextTestSession mWindowContextSession = |
| mObjectTracker.manage(new WindowContextTestSession()); |
| |
| mWindowContextSession.assertWindowContextMetricsMatchesDisplayArea(); |
| } |
| |
| private class WindowContextTestSession implements AutoCloseable { |
| private static final String TEST_WINDOW_NAME = "WindowMetricsTests"; |
| private View mView; |
| private final Context mWindowContext; |
| private final WindowManager mWm; |
| private final OnLayoutChangeListener mListener = new OnLayoutChangeListener(); |
| |
| private WindowContextTestSession() { |
| final Context appContext = ApplicationProvider.getApplicationContext(); |
| final Display display = appContext.getSystemService(DisplayManager.class) |
| .getDisplay(DEFAULT_DISPLAY); |
| mWindowContext = appContext.createDisplayContext(display) |
| .createWindowContext(TYPE_APPLICATION_OVERLAY, null /* options */); |
| |
| mWm = mWindowContext.getSystemService(WindowManager.class); |
| |
| InstrumentationRegistry.getInstrumentation().runOnMainSync(() -> { |
| mView = new View(mWindowContext); |
| mView.addOnLayoutChangeListener(mListener); |
| final WindowManager.LayoutParams params = getFullscreenOverlayAttributes(); |
| mWm.addView(mView, params); |
| }); |
| } |
| |
| private void assertWindowContextMetricsMatchesLayout() { |
| mListener.waitForLayout(); |
| |
| final WindowMetrics currentMetrics = mWm.getCurrentWindowMetrics(); |
| final WindowMetrics maxMetrics = mWm.getMaximumWindowMetrics(); |
| |
| assertMetricsMatchesLayout(currentMetrics, maxMetrics, |
| mListener.getLayoutBounds(), mListener.getLayoutInsets()); |
| } |
| |
| private void assertWindowContextMetricsMatchesDisplayArea() { |
| // Check window bounds |
| final Point displaySize = new Point(); |
| mWindowContext.getDisplay().getSize(displaySize); |
| final WindowMetrics currentMetrics = mWm.getCurrentWindowMetrics(); |
| final Rect bounds = getBoundsExcludingNavigationBarAndCutout(currentMetrics); |
| |
| assertEquals("Reported display width must match window width", |
| displaySize.x, bounds.width()); |
| assertEquals("Reported display height must match window height", |
| displaySize.y, bounds.height()); |
| |
| |
| mWmState.computeState(); |
| |
| // Check max window bounds |
| final WindowMetrics maxMetrics = mWm.getMaximumWindowMetrics(); |
| WindowManagerState.DisplayArea da = mWmState.getDisplayArea(TEST_WINDOW_NAME); |
| final Rect daBounds = da.mFullConfiguration.windowConfiguration.getBounds(); |
| |
| assertEquals("Display area bounds must match max window size", |
| daBounds, maxMetrics.getBounds()); |
| } |
| |
| @Override |
| public void close() throws Exception { |
| InstrumentationRegistry.getInstrumentation().runOnMainSync(() |
| -> mWm.removeViewImmediate(mView)); |
| mView.removeOnLayoutChangeListener(mListener); |
| } |
| |
| private WindowManager.LayoutParams getFullscreenOverlayAttributes() { |
| final WindowManager.LayoutParams params = new WindowManager.LayoutParams( |
| MATCH_PARENT, MATCH_PARENT, TYPE_APPLICATION_OVERLAY, 0, |
| PixelFormat.TRANSLUCENT); |
| // Used for obtain the attached DisplayArea. |
| params.setTitle(TEST_WINDOW_NAME); |
| params.setFitInsetsTypes(0 /* types */); |
| params.setFitInsetsIgnoringVisibility(true); |
| params.layoutInDisplayCutoutMode = LAYOUT_IN_DISPLAY_CUTOUT_MODE_ALWAYS; |
| return params; |
| } |
| } |
| } |