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

Commit 0d0b77a0 authored by Jason Chang's avatar Jason Chang
Browse files

Refactor to use WindowManager#getCurrentWindowMetrics()

instead of using Display#getRealSize()

Since Display#getRealSize / getRealMetrics will be deprecated soon
in ag/13474172, and we also found an once issue b/180833541 that
related with it, so refactoring it.

Bug: 180833541
Test: atest WMShellUnitTests
Change-Id: I14220768b0c470ca3bdec410a107347000e9d511
parent 6ba3501f
Loading
Loading
Loading
Loading
+6 −9
Original line number Diff line number Diff line
@@ -16,17 +16,14 @@

package com.android.wm.shell.onehanded;

import static android.view.Display.DEFAULT_DISPLAY;

import android.content.Context;
import android.content.res.Resources;
import android.graphics.PixelFormat;
import android.graphics.Point;
import android.graphics.Rect;
import android.os.Handler;
import android.util.Log;
import android.view.SurfaceControl;
import android.view.SurfaceSession;
import android.view.WindowManager;
import android.window.DisplayAreaAppearedInfo;
import android.window.DisplayAreaInfo;
import android.window.DisplayAreaOrganizer;
@@ -57,7 +54,7 @@ public class OneHandedBackgroundPanelOrganizer extends DisplayAreaOrganizer
    private final float mAlpha;
    private final Rect mRect;
    private final Executor mMainExecutor;
    private final Point mDisplaySize = new Point();
    private final Rect mDisplaySize;
    private final OneHandedSurfaceTransactionHelper.SurfaceControlTransactionFactory
            mSurfaceControlTransactionFactory;

@@ -85,15 +82,15 @@ public class OneHandedBackgroundPanelOrganizer extends DisplayAreaOrganizer
        mMainExecutor.execute(() -> removeBackgroundPanelLayer());
    }

    public OneHandedBackgroundPanelOrganizer(Context context, DisplayController displayController,
            Executor executor) {
    public OneHandedBackgroundPanelOrganizer(Context context, WindowManager windowManager,
            DisplayController displayController, Executor executor) {
        super(executor);
        displayController.getDisplay(DEFAULT_DISPLAY).getRealSize(mDisplaySize);
        mDisplaySize = windowManager.getCurrentWindowMetrics().getBounds();
        final Resources res = context.getResources();
        final float defaultRGB = res.getFloat(R.dimen.config_one_handed_background_rgb);
        mColor = new float[]{defaultRGB, defaultRGB, defaultRGB};
        mAlpha = res.getFloat(R.dimen.config_one_handed_background_alpha);
        mRect = new Rect(0, 0, mDisplaySize.x, mDisplaySize.y);
        mRect = new Rect(0, 0, mDisplaySize.width(), mDisplaySize.height());
        mMainExecutor = executor;
        mSurfaceControlTransactionFactory = SurfaceControl.Transaction::new;
    }
+25 −15
Original line number Diff line number Diff line
@@ -17,7 +17,6 @@
package com.android.wm.shell.onehanded;

import static android.os.UserHandle.USER_CURRENT;
import static android.view.Display.DEFAULT_DISPLAY;

import android.content.ComponentName;
import android.content.Context;
@@ -25,7 +24,7 @@ import android.content.om.IOverlayManager;
import android.content.om.OverlayInfo;
import android.content.res.Configuration;
import android.database.ContentObserver;
import android.graphics.Point;
import android.graphics.Rect;
import android.os.Handler;
import android.os.RemoteException;
import android.os.ServiceManager;
@@ -33,6 +32,7 @@ import android.os.SystemProperties;
import android.provider.Settings;
import android.util.Slog;
import android.view.ViewConfiguration;
import android.view.WindowManager;
import android.view.accessibility.AccessibilityManager;

import androidx.annotation.NonNull;
@@ -82,6 +82,7 @@ public class OneHandedController {
    private final ShellExecutor mMainExecutor;
    private final Handler mMainHandler;
    private final OneHandedImpl mImpl = new OneHandedImpl();
    private final WindowManager mWindowManager;

    private OneHandedDisplayAreaOrganizer mDisplayAreaOrganizer;
    private final AccessibilityManager mAccessibilityManager;
@@ -141,7 +142,7 @@ public class OneHandedController {
     */
    @Nullable
    public static OneHandedController create(
            Context context, DisplayController displayController,
            Context context, WindowManager windowManager, DisplayController displayController,
            TaskStackListenerImpl taskStackListener, UiEventLogger uiEventLogger,
            ShellExecutor mainExecutor, Handler mainHandler) {
        if (!SystemProperties.getBoolean(SUPPORT_ONE_HANDED_MODE, false)) {
@@ -151,22 +152,24 @@ public class OneHandedController {

        OneHandedTimeoutHandler timeoutHandler = new OneHandedTimeoutHandler(mainExecutor);
        OneHandedTutorialHandler tutorialHandler = new OneHandedTutorialHandler(context,
                mainExecutor);
                windowManager, mainExecutor);
        OneHandedAnimationController animationController =
                new OneHandedAnimationController(context);
        OneHandedTouchHandler touchHandler = new OneHandedTouchHandler(timeoutHandler,
                mainExecutor);
        OneHandedGestureHandler gestureHandler = new OneHandedGestureHandler(
                context, displayController, ViewConfiguration.get(context), mainExecutor);
                context, windowManager, displayController, ViewConfiguration.get(context),
                mainExecutor);
        OneHandedBackgroundPanelOrganizer oneHandedBackgroundPanelOrganizer =
                new OneHandedBackgroundPanelOrganizer(context, displayController, mainExecutor);
                new OneHandedBackgroundPanelOrganizer(context, windowManager, displayController,
                        mainExecutor);
        OneHandedDisplayAreaOrganizer organizer = new OneHandedDisplayAreaOrganizer(
                context, displayController, animationController, tutorialHandler,
                context, windowManager, displayController, animationController, tutorialHandler,
                oneHandedBackgroundPanelOrganizer, mainExecutor);
        OneHandedUiEventLogger oneHandedUiEventsLogger = new OneHandedUiEventLogger(uiEventLogger);
        IOverlayManager overlayManager = IOverlayManager.Stub.asInterface(
                ServiceManager.getService(Context.OVERLAY_SERVICE));
        return new OneHandedController(context, displayController,
        return new OneHandedController(context, windowManager, displayController,
                oneHandedBackgroundPanelOrganizer, organizer, touchHandler, tutorialHandler,
                gestureHandler, timeoutHandler, oneHandedUiEventsLogger, overlayManager,
                taskStackListener, mainExecutor, mainHandler);
@@ -174,6 +177,7 @@ public class OneHandedController {

    @VisibleForTesting
    OneHandedController(Context context,
            WindowManager windowManager,
            DisplayController displayController,
            OneHandedBackgroundPanelOrganizer backgroundPanelOrganizer,
            OneHandedDisplayAreaOrganizer displayAreaOrganizer,
@@ -187,6 +191,7 @@ public class OneHandedController {
            ShellExecutor mainExecutor,
            Handler mainHandler) {
        mContext = context;
        mWindowManager = windowManager;
        mBackgroundPanelOrganizer = backgroundPanelOrganizer;
        mDisplayAreaOrganizer = displayAreaOrganizer;
        mDisplayController = displayController;
@@ -269,7 +274,7 @@ public class OneHandedController {
            return;
        }
        if (!mDisplayAreaOrganizer.isInOneHanded()) {
            final int yOffSet = Math.round(getDisplaySize().y * mOffSetFraction);
            final int yOffSet = Math.round(getDisplaySize().height() * mOffSetFraction);
            mDisplayAreaOrganizer.scheduleOffset(0, yOffSet);
            mTimeoutHandler.resetTimer();

@@ -426,14 +431,19 @@ public class OneHandedController {
    }

    /**
     * Query the current display real size from {@link DisplayController}
     * Query the current display real size from {@link WindowManager}
     *
     * @return {@link DisplayController#getDisplay(int)#getDisplaySize()}
     * @return {@link WindowManager#getCurrentWindowMetrics()#getBounds()}
     */
    private Point getDisplaySize() {
        Point displaySize = new Point();
        if (mDisplayController != null && mDisplayController.getDisplay(DEFAULT_DISPLAY) != null) {
            mDisplayController.getDisplay(DEFAULT_DISPLAY).getRealSize(displaySize);
    private Rect getDisplaySize() {
        if (mWindowManager == null) {
            Slog.e(TAG, "WindowManager instance is null! Can not get display size!");
            return new Rect();
        }
        final Rect displaySize = mWindowManager.getCurrentWindowMetrics().getBounds();
        if (displaySize.width() == 0 || displaySize.height() == 0) {
            Slog.e(TAG, "Display size error! width = " + displaySize.width()
                    + ", height = " + displaySize.height());
        }
        return displaySize;
    }
+14 −7
Original line number Diff line number Diff line
@@ -16,17 +16,16 @@

package com.android.wm.shell.onehanded;

import static android.view.Display.DEFAULT_DISPLAY;

import static com.android.wm.shell.onehanded.OneHandedAnimationController.TRANSITION_DIRECTION_EXIT;
import static com.android.wm.shell.onehanded.OneHandedAnimationController.TRANSITION_DIRECTION_TRIGGER;

import android.content.Context;
import android.graphics.Point;
import android.graphics.Rect;
import android.os.SystemProperties;
import android.util.ArrayMap;
import android.util.Slog;
import android.view.SurfaceControl;
import android.view.WindowManager;
import android.window.DisplayAreaAppearedInfo;
import android.window.DisplayAreaInfo;
import android.window.DisplayAreaOrganizer;
@@ -60,6 +59,7 @@ public class OneHandedDisplayAreaOrganizer extends DisplayAreaOrganizer {
    private static final String ONE_HANDED_MODE_TRANSLATE_ANIMATION_DURATION =
            "persist.debug.one_handed_translate_animation_duration";

    private final WindowManager mWindowManager;
    private final Rect mLastVisualDisplayBounds = new Rect();
    private final Rect mDefaultDisplayBounds = new Rect();

@@ -110,12 +110,14 @@ public class OneHandedDisplayAreaOrganizer extends DisplayAreaOrganizer {
     * Constructor of OneHandedDisplayAreaOrganizer
     */
    public OneHandedDisplayAreaOrganizer(Context context,
            WindowManager windowManager,
            DisplayController displayController,
            OneHandedAnimationController animationController,
            OneHandedTutorialHandler tutorialHandler,
            OneHandedBackgroundPanelOrganizer oneHandedBackgroundGradientOrganizer,
            ShellExecutor mainExecutor) {
        super(mainExecutor);
        mWindowManager = windowManager;
        mAnimationController = animationController;
        mDisplayController = displayController;
        mLastVisualDisplayBounds.set(getDisplayBounds());
@@ -290,11 +292,16 @@ public class OneHandedDisplayAreaOrganizer extends DisplayAreaOrganizer {

    @Nullable
    private Rect getDisplayBounds() {
        Point realSize = new Point(0, 0);
        if (mDisplayController != null && mDisplayController.getDisplay(DEFAULT_DISPLAY) != null) {
            mDisplayController.getDisplay(DEFAULT_DISPLAY).getRealSize(realSize);
        if (mWindowManager == null) {
            Slog.e(TAG, "WindowManager instance is null! Can not get display size!");
            return new Rect();
        }
        final Rect displayBounds = mWindowManager.getCurrentWindowMetrics().getBounds();
        if (displayBounds.width() == 0 || displayBounds.height() == 0) {
            Slog.e(TAG, "Display size error! width = " + displayBounds.width()
                    + ", height = " + displayBounds.height());
        }
        return new Rect(0, 0, realSize.x, realSize.y);
        return displayBounds;
    }

    @VisibleForTesting
+9 −13
Original line number Diff line number Diff line
@@ -20,7 +20,6 @@ import static android.view.Display.DEFAULT_DISPLAY;

import android.annotation.Nullable;
import android.content.Context;
import android.graphics.Point;
import android.graphics.PointF;
import android.graphics.Rect;
import android.hardware.input.InputManager;
@@ -34,6 +33,7 @@ import android.view.InputMonitor;
import android.view.MotionEvent;
import android.view.Surface;
import android.view.ViewConfiguration;
import android.view.WindowManager;
import android.window.WindowContainerTransaction;

import androidx.annotation.VisibleForTesting;
@@ -59,8 +59,9 @@ public class OneHandedGestureHandler implements OneHandedTransitionCallback,
    private final PointF mDownPos = new PointF();
    private final PointF mLastPos = new PointF();
    private final PointF mStartDragPos = new PointF();
    private boolean mPassedSlop;
    private final WindowManager mWindowManager;

    private boolean mPassedSlop;
    private boolean mAllowGesture;
    private boolean mIsEnabled;
    private int mNavGestureHeight;
@@ -86,9 +87,10 @@ public class OneHandedGestureHandler implements OneHandedTransitionCallback,
     * @param context                  {@link Context}
     * @param displayController        {@link DisplayController}
     */
    public OneHandedGestureHandler(Context context, DisplayController displayController,
            ViewConfiguration viewConfig,
    public OneHandedGestureHandler(Context context, WindowManager windowManager,
            DisplayController displayController, ViewConfiguration viewConfig,
            ShellExecutor mainExecutor) {
        mWindowManager = windowManager;
        mDisplayController = displayController;
        mMainExecutor = mainExecutor;
        displayController.addDisplayChangingController(this);
@@ -210,16 +212,10 @@ public class OneHandedGestureHandler implements OneHandedTransitionCallback,
        disposeInputChannel();

        if (mIsEnabled && mIsThreeButtonModeEnabled) {
            final Point displaySize = new Point();
            if (mDisplayController != null) {
                final Display display = mDisplayController.getDisplay(DEFAULT_DISPLAY);
                if (display != null) {
                    display.getRealSize(displaySize);
                }
            }
            final Rect displaySize = mWindowManager.getCurrentWindowMetrics().getBounds();
            // Register input event receiver to monitor the touch region of NavBar gesture height
            mGestureRegion.set(0, displaySize.y - mNavGestureHeight, displaySize.x,
                    displaySize.y);
            mGestureRegion.set(0, displaySize.height() - mNavGestureHeight, displaySize.width(),
                    displaySize.height());
            mInputMonitor = InputManager.getInstance().monitorGestureInput(
                    "onehanded-gesture-offset", DEFAULT_DISPLAY);
            try {
+15 −12
Original line number Diff line number Diff line
@@ -20,7 +20,6 @@ import android.content.ContentResolver;
import android.content.Context;
import android.content.res.Configuration;
import android.graphics.PixelFormat;
import android.graphics.Point;
import android.graphics.Rect;
import android.os.SystemProperties;
import android.provider.Settings;
@@ -51,14 +50,13 @@ public class OneHandedTutorialHandler implements OneHandedTransitionCallback {
    private static final String ONE_HANDED_MODE_OFFSET_PERCENTAGE =
            "persist.debug.one_handed_offset_percentage";
    private static final int MAX_TUTORIAL_SHOW_COUNT = 2;
    private final Rect mLastUpdatedBounds = new Rect();
    private final WindowManager mWindowManager;
    private final AccessibilityManager mAccessibilityManager;
    private final String mPackageName;
    private final Rect mDisplaySize;

    private Context mContext;
    private View mTutorialView;
    private Point mDisplaySize = new Point();
    private ContentResolver mContentResolver;
    private boolean mCanShowTutorial;
    private String mStartOneHandedDescription;
@@ -101,14 +99,14 @@ public class OneHandedTutorialHandler implements OneHandedTransitionCallback {
        }
    };

    public OneHandedTutorialHandler(Context context, ShellExecutor mainExecutor) {
    public OneHandedTutorialHandler(Context context, WindowManager windowManager,
            ShellExecutor mainExecutor) {
        mContext = context;
        context.getDisplay().getRealSize(mDisplaySize);
        mWindowManager = windowManager;
        mDisplaySize = windowManager.getCurrentWindowMetrics().getBounds();
        mPackageName = context.getPackageName();
        mContentResolver = context.getContentResolver();
        mWindowManager = context.getSystemService(WindowManager.class);
        mAccessibilityManager = AccessibilityManager.getInstance(context);

        mStartOneHandedDescription = context.getResources().getString(
                R.string.accessibility_action_start_one_handed);
        mStopOneHandedDescription = context.getResources().getString(
@@ -121,7 +119,8 @@ public class OneHandedTutorialHandler implements OneHandedTransitionCallback {
                R.fraction.config_one_handed_offset, 1, 1);
        final int sysPropPercentageConfig = SystemProperties.getInt(
                ONE_HANDED_MODE_OFFSET_PERCENTAGE, Math.round(offsetPercentageConfig * 100.0f));
        mTutorialAreaHeight = Math.round(mDisplaySize.y * (sysPropPercentageConfig / 100.0f));
        mTutorialAreaHeight = Math.round(
                mDisplaySize.height() * (sysPropPercentageConfig / 100.0f));

        mainExecutor.execute(() -> {
            recreateTutorialView(mContext);
@@ -214,7 +213,7 @@ public class OneHandedTutorialHandler implements OneHandedTransitionCallback {
     */
    private WindowManager.LayoutParams getTutorialTargetLayoutParams() {
        final WindowManager.LayoutParams lp = new WindowManager.LayoutParams(
                mDisplaySize.x, mTutorialAreaHeight, 0, 0,
                mDisplaySize.width(), mTutorialAreaHeight, 0, 0,
                WindowManager.LayoutParams.TYPE_NAVIGATION_BAR_PANEL,
                WindowManager.LayoutParams.FLAG_LAYOUT_IN_SCREEN
                    | WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE,
@@ -229,8 +228,12 @@ public class OneHandedTutorialHandler implements OneHandedTransitionCallback {
    void dump(@NonNull PrintWriter pw) {
        final String innerPrefix = "  ";
        pw.println(TAG + " states: ");
        pw.print(innerPrefix + "mLastUpdatedBounds=");
        pw.println(mLastUpdatedBounds);
        pw.print(innerPrefix + "mTriggerState=");
        pw.println(mTriggerState);
        pw.print(innerPrefix + "mDisplaySize=");
        pw.println(mDisplaySize);
        pw.print(innerPrefix + "mTutorialAreaHeight=");
        pw.println(mTutorialAreaHeight);
    }

    private boolean canShowTutorial() {
Loading