diff options
| -rw-r--r-- | core/java/android/window/WindowMetricsController.java | 65 |
1 files changed, 38 insertions, 27 deletions
diff --git a/core/java/android/window/WindowMetricsController.java b/core/java/android/window/WindowMetricsController.java index 47d532c31dad..5b08879ae266 100644 --- a/core/java/android/window/WindowMetricsController.java +++ b/core/java/android/window/WindowMetricsController.java @@ -22,10 +22,12 @@ import static android.view.WindowManager.LayoutParams.SOFT_INPUT_ADJUST_NOTHING; import android.annotation.NonNull; import android.app.ResourcesManager; +import android.app.WindowConfiguration; import android.content.Context; import android.content.res.Configuration; import android.graphics.Rect; import android.os.RemoteException; +import android.util.DisplayMetrics; import android.view.Display; import android.view.DisplayInfo; import android.view.InsetsState; @@ -57,48 +59,52 @@ public final class WindowMetricsController { /** @see WindowManager#getCurrentWindowMetrics() */ public WindowMetrics getCurrentWindowMetrics() { - final Rect bounds = getCurrentBounds(mContext); - - // TODO(b/187712731): Provide density for WindowMetrics. - return new WindowMetrics(bounds, computeWindowInsets(bounds)); - } - - private static Rect getCurrentBounds(Context context) { - synchronized (ResourcesManager.getInstance()) { - return context.getResources().getConfiguration().windowConfiguration.getBounds(); - } + return getWindowMetricsInternal(false /* isMaximum */); } /** @see WindowManager#getMaximumWindowMetrics() */ public WindowMetrics getMaximumWindowMetrics() { - final Rect maxBounds = getMaximumBounds(mContext); - - // TODO(b/187712731): Provide density for WindowMetrics. - return new WindowMetrics(maxBounds, computeWindowInsets(maxBounds)); + return getWindowMetricsInternal(true /* isMaximum */); } - private static Rect getMaximumBounds(Context context) { + /** + * The core implementation to obtain {@link WindowMetrics} + * + * @param isMaximum {@code true} to obtain {@link WindowManager#getCurrentWindowMetrics()}. + * {@code false} to obtain {@link WindowManager#getMaximumWindowMetrics()}. + */ + private WindowMetrics getWindowMetricsInternal(boolean isMaximum) { + final Rect bounds; + final float density; + final boolean isScreenRound; + final int windowingMode; synchronized (ResourcesManager.getInstance()) { - return context.getResources().getConfiguration().windowConfiguration.getMaxBounds(); + final Configuration config = mContext.getResources().getConfiguration(); + final WindowConfiguration winConfig = config.windowConfiguration; + bounds = (isMaximum) ? winConfig.getMaxBounds() : winConfig.getBounds(); + // Multiply default density scale because WindowMetrics provide the density value with + // the scaling factor for the Density Independent Pixel unit, which is the same unit + // as DisplayMetrics#density + density = config.densityDpi * DisplayMetrics.DENSITY_DEFAULT_SCALE; + isScreenRound = config.isScreenRound(); + windowingMode = winConfig.getWindowingMode(); } + final WindowInsets windowInsets = computeWindowInsets(bounds, isScreenRound, windowingMode); + return new WindowMetrics(bounds, windowInsets, density); } - private WindowInsets computeWindowInsets(Rect bounds) { + private WindowInsets computeWindowInsets(Rect bounds, boolean isScreenRound, + @WindowConfiguration.WindowingMode int windowingMode) { // Initialize params which used for obtaining all system insets. final WindowManager.LayoutParams params = new WindowManager.LayoutParams(); params.token = Context.getToken(mContext); - return getWindowInsetsFromServerForCurrentDisplay(params, bounds); + return getWindowInsetsFromServerForCurrentDisplay(params, bounds, isScreenRound, + windowingMode); } private WindowInsets getWindowInsetsFromServerForCurrentDisplay( - WindowManager.LayoutParams attrs, Rect bounds) { - final boolean isScreenRound; - final int windowingMode; - synchronized (ResourcesManager.getInstance()) { - final Configuration config = mContext.getResources().getConfiguration(); - isScreenRound = config.isScreenRound(); - windowingMode = config.windowConfiguration.getWindowingMode(); - } + WindowManager.LayoutParams attrs, Rect bounds, boolean isScreenRound, + @WindowConfiguration.WindowingMode int windowingMode) { return getWindowInsetsFromServerForDisplay(mContext.getDisplayId(), attrs, bounds, isScreenRound, windowingMode); } @@ -165,7 +171,12 @@ public final class WindowMetricsController { currentDisplayInfo.roundedCorners) .setDisplayCutout(currentDisplayInfo.displayCutout).build(); - maxMetrics.add(new WindowMetrics(maxBounds, windowInsets)); + // Multiply default density scale because WindowMetrics provide the density value with + // the scaling factor for the Density Independent Pixel unit, which is the same unit + // as DisplayMetrics#density + final float density = currentDisplayInfo.logicalDensityDpi + * DisplayMetrics.DENSITY_DEFAULT_SCALE; + maxMetrics.add(new WindowMetrics(maxBounds, windowInsets, density)); } return maxMetrics; } |