summaryrefslogtreecommitdiff
path: root/core/java/android/window/WindowMetricsHelper.java
diff options
context:
space:
mode:
authorCharles Chen <charlesccchen@google.com>2020-02-13 16:41:32 +0800
committerCharles Chen <charlesccchen@google.com>2020-05-04 11:41:13 +0800
commit49f329ca66e3cf06a8c6086b77333c68fef5cf5b (patch)
treee0f253b3b905055bd548bd8490669f667113f990 /core/java/android/window/WindowMetricsHelper.java
parentd827ec8bbd33aec9435575ce55776766e746cdf9 (diff)
Add WindowMetricsHelper
This metrics now is used for calculating the value reported by Display#getSize. It could be extended to have more function later. Also replace getCurrentMetrics usages to make them report Display#getSize value. Bug: 148904274 Test: atest WindowMetricsHelperTest Change-Id: I182b6e63f7c28752eee22839cb9e69f073046c3f
Diffstat (limited to 'core/java/android/window/WindowMetricsHelper.java')
-rw-r--r--core/java/android/window/WindowMetricsHelper.java64
1 files changed, 64 insertions, 0 deletions
diff --git a/core/java/android/window/WindowMetricsHelper.java b/core/java/android/window/WindowMetricsHelper.java
new file mode 100644
index 000000000000..fb8b27e52be1
--- /dev/null
+++ b/core/java/android/window/WindowMetricsHelper.java
@@ -0,0 +1,64 @@
+/*
+ * Copyright (C) 2020 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.window;
+
+import static android.view.ViewRootImpl.NEW_INSETS_MODE_FULL;
+import static android.view.WindowInsets.Type.displayCutout;
+import static android.view.WindowInsets.Type.navigationBars;
+
+import android.annotation.NonNull;
+import android.graphics.Insets;
+import android.graphics.Point;
+import android.graphics.Rect;
+import android.view.Display;
+import android.view.DisplayCutout;
+import android.view.ViewRootImpl;
+import android.view.WindowInsets;
+import android.view.WindowMetrics;
+
+/**
+ * Helper class to calculate size with {@link android.graphics.Insets} based on provided
+ * {@link WindowMetrics}
+ *
+ * @hide
+ */
+public final class WindowMetricsHelper {
+ private WindowMetricsHelper() {}
+
+ /**
+ * Returns bounds excluding navigation bar and display cutout (but including status bar).
+ * This has the same behavior as {@link Display#getSize(Point)}.
+ */
+ public static Rect getBoundsExcludingNavigationBarAndCutout(
+ @NonNull WindowMetrics windowMetrics) {
+ final WindowInsets windowInsets = windowMetrics.getWindowInsets();
+ Insets insets;
+ if (ViewRootImpl.sNewInsetsMode == NEW_INSETS_MODE_FULL) {
+ insets = windowInsets.getInsetsIgnoringVisibility(navigationBars() | displayCutout());
+ } else {
+ final Insets stableInsets = windowInsets.getStableInsets();
+ insets = Insets.of(stableInsets.left, 0 /* top */, stableInsets.right,
+ stableInsets.bottom);
+ final DisplayCutout cutout = windowInsets.getDisplayCutout();
+ insets = (cutout != null) ? Insets.max(insets, Insets.of(cutout.getSafeInsets()))
+ : insets;
+ }
+ final Rect result = new Rect(windowMetrics.getBounds());
+ result.inset(insets);
+ return result;
+ }
+}