blob: e9ad18ad8b7d5ae379a64a0d6d04122cf56a27f0 [file] [log] [blame]
/*
* 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;
}
}
}