Merge "Using the WindowMetrics API instead of display.getRealSize" into tm-dev

This commit is contained in:
Alex Chau
2022-03-31 10:58:40 +00:00
committed by Android (Google) Code Review
4 changed files with 49 additions and 58 deletions
@@ -17,8 +17,6 @@
package com.android.quickstep;
import static android.view.Display.DEFAULT_DISPLAY;
import static androidx.test.core.app.ApplicationProvider.getApplicationContext;
import static com.android.launcher3.util.DisplayController.NavigationMode.NO_BUTTON;
@@ -27,17 +25,16 @@ import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertTrue;
import static org.mockito.ArgumentMatchers.any;
import static org.mockito.ArgumentMatchers.anyInt;
import static org.mockito.Mockito.doAnswer;
import static org.mockito.Mockito.doReturn;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.spy;
import static org.mockito.Mockito.when;
import android.content.Context;
import android.content.res.Resources;
import android.graphics.Point;
import android.hardware.display.DisplayManager;
import android.graphics.Rect;
import android.util.ArrayMap;
import android.util.DisplayMetrics;
import android.util.Size;
import android.view.Display;
import android.view.MotionEvent;
import android.view.Surface;
@@ -47,6 +44,10 @@ import androidx.test.filters.SmallTest;
import com.android.launcher3.ResourceUtils;
import com.android.launcher3.util.DisplayController;
import com.android.launcher3.util.RotationUtils;
import com.android.launcher3.util.WindowBounds;
import com.android.launcher3.util.window.CachedDisplayInfo;
import com.android.launcher3.util.window.WindowManagerProxy;
import org.junit.Before;
import org.junit.Test;
@@ -56,18 +57,9 @@ import org.mockito.MockitoAnnotations;
@SmallTest
@RunWith(AndroidJUnit4.class)
public class OrientationTouchTransformerTest {
static class ScreenSize {
int mHeight;
int mWidth;
ScreenSize(int height, int width) {
mHeight = height;
mWidth = width;
}
}
private static final ScreenSize NORMAL_SCREEN_SIZE = new ScreenSize(2280, 1080);
private static final ScreenSize LARGE_SCREEN_SIZE = new ScreenSize(3280, 1080);
private static final Size NORMAL_SCREEN_SIZE = new Size(1080, 2280);
private static final Size LARGE_SCREEN_SIZE = new Size(1080, 3280);
private static final float DENSITY_DISPLAY_METRICS = 3.0f;
private OrientationTouchTransformer mTouchTransformer;
@@ -75,7 +67,6 @@ public class OrientationTouchTransformerTest {
Resources mResources;
private DisplayController.Info mInfo;
@Before
public void setup() {
MockitoAnnotations.initMocks(this);
@@ -296,33 +287,24 @@ public class OrientationTouchTransformerTest {
assertTrue(mTouchTransformer.touchInValidSwipeRegions(inRegion2.getX(), inRegion2.getY()));
}
private DisplayController.Info createDisplayInfo(ScreenSize screenSize, int rotation) {
Context context = getApplicationContext();
Display display = spy(context.getSystemService(DisplayManager.class)
.getDisplay(DEFAULT_DISPLAY));
Point p = new Point(screenSize.mWidth, screenSize.mHeight);
if (rotation == Surface.ROTATION_90 || rotation == Surface.ROTATION_270) {
p.set(screenSize.mHeight, screenSize.mWidth);
}
doReturn(rotation).when(display).getRotation();
doAnswer(i -> {
((Point) i.getArgument(0)).set(p.x, p.y);
return null;
}).when(display).getRealSize(any(Point.class));
doAnswer(i -> {
((Point) i.getArgument(0)).set(p.x, p.y);
((Point) i.getArgument(1)).set(p.x, p.y);
return null;
}).when(display).getCurrentSizeRange(any(Point.class), any(Point.class));
return new DisplayController.Info(context, display);
private DisplayController.Info createDisplayInfo(Size screenSize, int rotation) {
Point displaySize = new Point(screenSize.getWidth(), screenSize.getHeight());
RotationUtils.rotateSize(displaySize, rotation);
CachedDisplayInfo cdi = new CachedDisplayInfo(displaySize, rotation);
WindowBounds wm = new WindowBounds(
new Rect(0, 0, displaySize.x, displaySize.y),
new Rect());
WindowManagerProxy wmProxy = mock(WindowManagerProxy.class);
doReturn(cdi).when(wmProxy).getDisplayInfo(any(), any());
doReturn(wm).when(wmProxy).getRealBounds(any(), any(), any());
return new DisplayController.Info(
getApplicationContext(), mock(Display.class), wmProxy, new ArrayMap<>());
}
private float generateTouchRegionHeight(ScreenSize screenSize, int rotation) {
float height = screenSize.mHeight;
private float generateTouchRegionHeight(Size screenSize, int rotation) {
float height = screenSize.getHeight();
if (rotation == Surface.ROTATION_90 || rotation == Surface.ROTATION_270) {
height = screenSize.mWidth;
height = screenSize.getWidth();
}
return height - ResourceUtils.DEFAULT_NAVBAR_VALUE * DENSITY_DISPLAY_METRICS;
}
@@ -164,7 +164,7 @@ public class TaskViewSimulatorTest {
}
WindowManagerProxy wmProxy = mock(WindowManagerProxy.class);
doReturn(cdi).when(wmProxy).getDisplayInfo(any());
doReturn(cdi).when(wmProxy).getDisplayInfo(any(), any());
doReturn(wm).when(wmProxy).getRealBounds(any(), any(), any());
ArrayMap<String, Pair<CachedDisplayInfo, WindowBounds[]>> perDisplayBoundsCache =
@@ -305,7 +305,7 @@ public class DisplayController implements ComponentCallbacks, SafeCloseable {
public Info(Context context, Display display,
WindowManagerProxy wmProxy,
ArrayMap<String, Pair<CachedDisplayInfo, WindowBounds[]>> perDisplayBoundsCache) {
CachedDisplayInfo displayInfo = wmProxy.getDisplayInfo(display);
CachedDisplayInfo displayInfo = wmProxy.getDisplayInfo(context, display);
rotation = displayInfo.rotation;
currentSize = displayInfo.size;
displayId = displayInfo.id;
@@ -364,7 +364,7 @@ public class DisplayController implements ComponentCallbacks, SafeCloseable {
pw.println(" id=" + info.displayId);
pw.println(" rotation=" + info.rotation);
pw.println(" fontScale=" + info.fontScale);
pw.println(" densityDpi=" + info.displayId);
pw.println(" densityDpi=" + info.densityDpi);
pw.println(" navigationMode=" + info.navigationMode.name());
pw.println(" currentSize=" + info.currentSize);
pw.println(" supportedBounds=" + info.supportedBounds);
@@ -15,6 +15,9 @@
*/
package com.android.launcher3.util.window;
import static android.view.Display.DEFAULT_DISPLAY;
import static android.view.WindowManager.LayoutParams.TYPE_APPLICATION;
import static com.android.launcher3.ResourceUtils.INVALID_RESOURCE_HANDLE;
import static com.android.launcher3.ResourceUtils.NAVBAR_HEIGHT;
import static com.android.launcher3.ResourceUtils.NAVBAR_HEIGHT_LANDSCAPE;
@@ -47,7 +50,6 @@ import android.view.WindowMetrics;
import com.android.launcher3.R;
import com.android.launcher3.ResourceUtils;
import com.android.launcher3.Utilities;
import com.android.launcher3.util.DisplayController;
import com.android.launcher3.util.MainThreadInitializedObject;
import com.android.launcher3.util.ResourceBasedOverride;
import com.android.launcher3.util.WindowBounds;
@@ -90,7 +92,10 @@ public class WindowManagerProxy implements ResourceBasedOverride {
ArrayMap<String, Pair<CachedDisplayInfo, WindowBounds[]>> result = new ArrayMap<>();
for (Display display : displays) {
if (isInternalDisplay(display)) {
CachedDisplayInfo info = getDisplayInfo(display).normalize();
Context displayContext = Utilities.ATLEAST_S
? context.createWindowContext(display, TYPE_APPLICATION, null)
: context.createDisplayContext(display);
CachedDisplayInfo info = getDisplayInfo(displayContext, display).normalize();
WindowBounds[] bounds = estimateWindowBounds(context, info);
result.put(info.id, Pair.create(info, bounds));
}
@@ -121,7 +126,7 @@ public class WindowManagerProxy implements ResourceBasedOverride {
}
WindowMetrics wm = windowContext.getSystemService(WindowManager.class)
.getCurrentWindowMetrics();
.getMaximumWindowMetrics();
Rect insets = new Rect();
normalizeWindowInsets(windowContext, wm.getWindowInsets(), insets);
@@ -267,21 +272,23 @@ public class WindowManagerProxy implements ResourceBasedOverride {
* Returns a CachedDisplayInfo initialized for the current display
*/
@TargetApi(Build.VERSION_CODES.S)
public CachedDisplayInfo getDisplayInfo(Display display) {
int rotation = display.getRotation();
Point size = new Point();
display.getRealSize(size);
public CachedDisplayInfo getDisplayInfo(Context displayContext, Display display) {
int rotation = getRotation(displayContext);
Rect cutoutRect = new Rect();
Point size = new Point();
if (Utilities.ATLEAST_S) {
DisplayCutout cutout = display.getCutout();
WindowMetrics wm = displayContext.getSystemService(WindowManager.class)
.getMaximumWindowMetrics();
DisplayCutout cutout = wm.getWindowInsets().getDisplayCutout();
if (cutout != null) {
cutoutRect.set(cutout.getSafeInsetLeft(), cutout.getSafeInsetTop(),
cutout.getSafeInsetRight(), cutout.getSafeInsetBottom());
}
}
size.set(wm.getBounds().right, wm.getBounds().bottom);
} else {
display.getRealSize(size);
}
return new CachedDisplayInfo(getDisplayId(display), size, rotation, cutoutRect);
}
@@ -304,7 +311,9 @@ public class WindowManagerProxy implements ResourceBasedOverride {
// Ignore
}
}
return d == null ? DisplayController.INSTANCE.get(context).getInfo().rotation
: d.getRotation();
if (d == null) {
d = context.getSystemService(DisplayManager.class).getDisplay(DEFAULT_DISPLAY);
}
return d.getRotation();
}
}