blob: f5ec77b2d4523cf19cfd753e4f27c79f85076edf [file] [log] [blame]
/*
* Copyright (C) 2022 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.display;
import static android.view.Display.DEFAULT_DISPLAY;
import static android.view.RoundedCorner.POSITION_BOTTOM_LEFT;
import static android.view.RoundedCorner.POSITION_TOP_LEFT;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertTrue;
import static org.junit.Assume.assumeNotNull;
import static org.junit.Assume.assumeTrue;
import android.graphics.Path;
import android.graphics.RectF;
import android.hardware.display.DisplayManager;
import android.os.Build;
import android.platform.test.annotations.Presubmit;
import android.server.wm.MultiDisplayTestBase;
import android.server.wm.WindowManagerState;
import android.server.wm.WindowManagerTestBase;
import android.view.Display;
import android.view.DisplayShape;
import android.view.RoundedCorner;
import android.view.View;
import com.android.compatibility.common.util.PropertyUtil;
import org.junit.Before;
import org.junit.Test;
/**
* Build/Install/Run:
* atest CtsWindowManagerDeviceDisplay:DisplayShapeTests
*/
@Presubmit
@android.server.wm.annotation.Group3
public class DisplayShapeTests extends WindowManagerTestBase {
private Display mDisplay;
@Before
public void setUp() throws Exception {
mDisplay = mDm.getDisplay(DEFAULT_DISPLAY);
assumeNotNull(mDisplay);
}
@Test
public void testNonNull() {
final DisplayShape shape = mDisplay.getShape();
assertNotNull(shape);
final Path path = shape.getPath();
assertNotNull(path);
assertFalse(path.isEmpty());
}
@Test
public void testDisplayShapeConfig() {
// Skip the mix build case when the base build < U (e.x. U GSI on T base build) and only
// test for U+ base builds.
assumeTrue("Test does not apply for vendor image with API level lower than U",
PropertyUtil.isVendorApiLevelNewerThan(Build.VERSION_CODES.TIRAMISU));
boolean hasRoundedCorner = false;
for (int i = POSITION_TOP_LEFT; i <= POSITION_BOTTOM_LEFT; i++) {
final RoundedCorner r = mDisplay.getRoundedCorner(i);
if (r != null && r.getRadius() > 0) {
hasRoundedCorner = true;
break;
}
}
if (hasRoundedCorner) {
// If the display shape is not configured, the returned path will be rectangular if the
// display is not round. The config must be set if the display is not round or
// rectangular.
assertFalse("The display has a rounded corner but the shape specifies a rectangle."
+ " Please set the config (config_mainDisplayShape) for the display shape.",
mDisplay.getShape().getPath().isRect(null));
}
}
@Test
public void testDisplayShapeFromWindowInsets() {
DisplayShapeTests.TestActivity activity =
startActivity(DisplayShapeTests.TestActivity.class, DEFAULT_DISPLAY);
final DisplayShape fromDisplay = mDisplay.getShape();
final View decorView = activity.getWindow().getDecorView();
final DisplayShape fromInsets = decorView.getRootWindowInsets().getDisplayShape();
final int[] location = new int[2];
decorView.getLocationOnScreen(location);
final RectF boundsFromDisplay = getBoundsFromPath(fromDisplay.getPath());
boundsFromDisplay.offset(-location[0], -location[1]);
final RectF boundsFromView = getBoundsFromPath(fromInsets.getPath());
assertEquals(boundsFromView, boundsFromDisplay);
}
@Test
public void testDisplayShapeOnVirtualDisplay() {
try (MultiDisplayTestBase.VirtualDisplaySession session =
new MultiDisplayTestBase.VirtualDisplaySession()) {
// Setup a simulated display.
WindowManagerState.DisplayContent dc = session.setSimulateDisplay(true).createDisplay();
Display simulatedDisplay = mContext.getSystemService(DisplayManager.class)
.getDisplay(dc.mId);
final DisplayShape shape = simulatedDisplay.getShape();
assertNotNull(shape);
assertTrue(shape.getPath().isRect(null));
final int displayWidth = dc.getDisplayRect().width();
final int displayHeight = dc.getDisplayRect().height();
final RectF expectRect = new RectF(0, 0, displayWidth, displayHeight);
final RectF actualRect = getBoundsFromPath(shape.getPath());
assertEquals(expectRect, actualRect);
}
}
private static RectF getBoundsFromPath(Path path) {
final RectF rect = new RectF();
path.computeBounds(rect, false);
return rect;
}
public static class TestActivity extends FocusableActivity {
}
}