summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--core/java/android/window/WindowMetricsController.java65
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;
}