Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 49f329ca authored by Charles Chen's avatar Charles Chen
Browse files

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
parent d827ec8b
Loading
Loading
Loading
Loading
+3 −2
Original line number Original line Diff line number Diff line
@@ -90,6 +90,7 @@ import android.widget.FrameLayout;
import android.widget.ImageButton;
import android.widget.ImageButton;
import android.widget.LinearLayout;
import android.widget.LinearLayout;
import android.widget.TextView;
import android.widget.TextView;
import android.window.WindowMetricsHelper;


import com.android.internal.annotations.GuardedBy;
import com.android.internal.annotations.GuardedBy;
import com.android.internal.inputmethod.IInputContentUriToken;
import com.android.internal.inputmethod.IInputContentUriToken;
@@ -1438,8 +1439,8 @@ public class InputMethodService extends AbstractInputMethodService {
     */
     */
    public int getMaxWidth() {
    public int getMaxWidth() {
        final WindowManager windowManager = getSystemService(WindowManager.class);
        final WindowManager windowManager = getSystemService(WindowManager.class);
        final Rect windowBounds = windowManager.getCurrentWindowMetrics().getBounds();
        return WindowMetricsHelper.getBoundsExcludingNavigationBarAndCutout(
        return windowBounds.width();
                windowManager.getCurrentWindowMetrics()).width();
    }
    }
    
    
    /**
    /**
+6 −9
Original line number Original line Diff line number Diff line
@@ -48,22 +48,19 @@ public final class WindowMetrics {
     * and display cutout areas. The value reported by {@link Display#getSize(Point)} can be
     * and display cutout areas. The value reported by {@link Display#getSize(Point)} can be
     * obtained by using:
     * obtained by using:
     * <pre class="prettyprint">
     * <pre class="prettyprint">
     * final WindowMetrics metrics = windowManager.getCurrentMetrics();
     * final WindowMetrics metrics = windowManager.getCurrentWindowMetrics();
     * // Gets all excluding insets
     * // Gets all excluding insets
     * final WindowInsets windowInsets = metrics.getWindowInsets();
     * final WindowInsets windowInsets = metrics.getWindowInsets();
     * Insets insets = windowInsets.getInsets(WindowInsets.Type.navigationBars());
     * Insets insets = windowInsets.getInsetsIgnoreVisibility(WindowInsets.Type.navigationBars()
     * final DisplayCutout cutout = windowInsets.getCutout();
     *         | WindowInsets.Type.displayCutout());
     * if (cutout != null) {
     *     final Insets cutoutSafeInsets = Insets.of(cutout.getSafeInsetsLeft(), ...);
     *     insets = insets.max(insets, cutoutSafeInsets);
     * }
     *
     *
     * int insetsWidth = insets.right + insets.left;
     * int insetsWidth = insets.right + insets.left;
     * int insetsHeight = insets.top + insets.bottom;
     * int insetsHeight = insets.top + insets.bottom;
     *
     *
     * // Legacy size that Display#getSize reports
     * // Legacy size that Display#getSize reports
     * final Size legacySize = new Size(metrics.getWidth() - insetsWidth,
     * final Rect bounds = metrics.getBounds();
     *         metrics.getHeight() - insetsHeight);
     * final Size legacySize = new Size(bounds.width() - insetsWidth,
     *         bounds.height() - insetsHeight);
     * </pre>
     * </pre>
     * </p>
     * </p>
     *
     *
+3 −1
Original line number Original line Diff line number Diff line
@@ -31,6 +31,7 @@ import android.view.ViewTreeObserver;
import android.view.WindowManager;
import android.view.WindowManager;
import android.view.WindowManager.LayoutParams;
import android.view.WindowManager.LayoutParams;
import android.widget.PopupWindow;
import android.widget.PopupWindow;
import android.window.WindowMetricsHelper;


/**
/**
 * Custom {@link PopupWindow} used to isolate its content from the autofilled app - the
 * Custom {@link PopupWindow} used to isolate its content from the autofilled app - the
@@ -128,7 +129,8 @@ public class AutofillPopupWindow extends PopupWindow {
            // Gravity.BOTTOM because PopupWindow base class does not expose computeGravity().
            // Gravity.BOTTOM because PopupWindow base class does not expose computeGravity().
            final WindowManager windowManager = anchor.getContext()
            final WindowManager windowManager = anchor.getContext()
                    .getSystemService(WindowManager.class);
                    .getSystemService(WindowManager.class);
            final Rect windowBounds = windowManager.getCurrentWindowMetrics().getBounds();
            final Rect windowBounds = WindowMetricsHelper.getBoundsExcludingNavigationBarAndCutout(
                    windowManager.getCurrentWindowMetrics());
            width = windowBounds.width();
            width = windowBounds.width();
            if (height != LayoutParams.MATCH_PARENT) {
            if (height != LayoutParams.MATCH_PARENT) {
                offsetY = windowBounds.height() - height;
                offsetY = windowBounds.height() - height;
+1 −5
Original line number Original line Diff line number Diff line
@@ -372,11 +372,7 @@ public class VirtualDisplayTaskEmbedder extends TaskEmbedder {


    /** Get density of the hosting display. */
    /** Get density of the hosting display. */
    private int getBaseDisplayDensity() {
    private int getBaseDisplayDensity() {
        if (mTmpDisplayMetrics == null) {
        return mContext.getResources().getConfiguration().densityDpi;
            mTmpDisplayMetrics = new DisplayMetrics();
        }
        mContext.getDisplayNoVerify().getRealMetrics(mTmpDisplayMetrics);
        return mTmpDisplayMetrics.densityDpi;
    }
    }


    /**
    /**
+64 −0
Original line number Original line Diff line number Diff line
/*
 * 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;
    }
}
Loading