Loading core/java/android/window/WindowMetricsController.java +38 −27 Original line number Diff line number Diff line Loading @@ -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; Loading Loading @@ -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); } Loading Loading @@ -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; } Loading Loading
core/java/android/window/WindowMetricsController.java +38 −27 Original line number Diff line number Diff line Loading @@ -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; Loading Loading @@ -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); } Loading Loading @@ -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; } Loading