Using the WindowMetrics API instead of display.getRealSize

Bug: 221961069
Bug: 195408476
Bug: 198965093
Test: Verified locally and presubmit
Change-Id: I4dac9c19df4c43e6a38ba5c05f27d25f4cfcb071
diff --git a/quickstep/tests/src/com/android/quickstep/OrientationTouchTransformerTest.java b/quickstep/tests/src/com/android/quickstep/OrientationTouchTransformerTest.java
index 6b3f699..9e5d958 100644
--- a/quickstep/tests/src/com/android/quickstep/OrientationTouchTransformerTest.java
+++ b/quickstep/tests/src/com/android/quickstep/OrientationTouchTransformerTest.java
@@ -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.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 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 @@
 @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 @@
     Resources mResources;
     private DisplayController.Info mInfo;
 
-
     @Before
     public void setup() {
         MockitoAnnotations.initMocks(this);
@@ -296,33 +287,24 @@
         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;
     }
diff --git a/quickstep/tests/src/com/android/quickstep/util/TaskViewSimulatorTest.java b/quickstep/tests/src/com/android/quickstep/util/TaskViewSimulatorTest.java
index c6cdafc..7d414f4 100644
--- a/quickstep/tests/src/com/android/quickstep/util/TaskViewSimulatorTest.java
+++ b/quickstep/tests/src/com/android/quickstep/util/TaskViewSimulatorTest.java
@@ -164,7 +164,7 @@
                 }
 
                 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 =
diff --git a/src/com/android/launcher3/util/DisplayController.java b/src/com/android/launcher3/util/DisplayController.java
index 8b4ff85..d68aab6 100644
--- a/src/com/android/launcher3/util/DisplayController.java
+++ b/src/com/android/launcher3/util/DisplayController.java
@@ -306,7 +306,7 @@
         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;
@@ -372,7 +372,7 @@
         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);
diff --git a/src/com/android/launcher3/util/window/WindowManagerProxy.java b/src/com/android/launcher3/util/window/WindowManagerProxy.java
index ba3d981..96f3ef6 100644
--- a/src/com/android/launcher3/util/window/WindowManagerProxy.java
+++ b/src/com/android/launcher3/util/window/WindowManagerProxy.java
@@ -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 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;
@@ -91,7 +93,10 @@
         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));
             }
@@ -122,7 +127,7 @@
         }
 
         WindowMetrics wm = windowContext.getSystemService(WindowManager.class)
-                .getCurrentWindowMetrics();
+                .getMaximumWindowMetrics();
 
         Rect insets = new Rect();
         normalizeWindowInsets(windowContext, wm.getWindowInsets(), insets);
@@ -268,21 +273,23 @@
      * 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);
     }
 
@@ -305,7 +312,9 @@
                 // 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();
     }
 }