From 29f76eeae5b6834636dcd4b1bf27648ba62fec03 Mon Sep 17 00:00:00 2001 From: Jerry Chang Date: Thu, 25 Mar 2021 18:01:32 +0800 Subject: [PATCH] Deal with display insets when layout splits Fix: 175360659 Bug: 174209492 Test: manual check split bounds and divider position Change-Id: I3b8c567a6a8f49d003eedd53a4abc32f53c7208c --- .../wm/shell/common/split/SplitLayout.java | 22 ++++++++++++++----- 1 file changed, 16 insertions(+), 6 deletions(-) diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/common/split/SplitLayout.java b/libs/WindowManager/Shell/src/com/android/wm/shell/common/split/SplitLayout.java index bacff78e6a678..b64c796a1a43d 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/common/split/SplitLayout.java +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/common/split/SplitLayout.java @@ -27,9 +27,10 @@ import android.animation.AnimatorListenerAdapter; import android.animation.ValueAnimator; import android.content.Context; import android.content.res.Configuration; -import android.content.res.Resources; import android.graphics.Rect; import android.view.SurfaceControl; +import android.view.WindowInsets; +import android.view.WindowManager; import androidx.annotation.Nullable; @@ -75,7 +76,7 @@ public class SplitLayout { mDividerSize = mDividerWindowWidth - mDividerInsets * 2; mRootBounds.set(configuration.windowConfiguration.getBounds()); - mDividerSnapAlgorithm = getSnapAlgorithm(context.getResources(), mRootBounds); + mDividerSnapAlgorithm = getSnapAlgorithm(mContext, mRootBounds); resetDividerPosition(); } @@ -114,7 +115,7 @@ public class SplitLayout { mContext = mContext.createConfigurationContext(configuration); mSplitWindowManager.setConfiguration(configuration); mRootBounds.set(rootBounds); - mDividerSnapAlgorithm = getSnapAlgorithm(mContext.getResources(), mRootBounds); + mDividerSnapAlgorithm = getSnapAlgorithm(mContext, mRootBounds); resetDividerPosition(); // Don't inflate divider bar if it is not initialized. @@ -217,15 +218,15 @@ public class SplitLayout { return mDividerSnapAlgorithm.calculateSnapTarget(position, velocity, hardDismiss); } - private DividerSnapAlgorithm getSnapAlgorithm(Resources resources, Rect rootBounds) { + private DividerSnapAlgorithm getSnapAlgorithm(Context context, Rect rootBounds) { final boolean isLandscape = isLandscape(rootBounds); return new DividerSnapAlgorithm( - resources, + context.getResources(), rootBounds.width(), rootBounds.height(), mDividerSize, !isLandscape, - new Rect() /* insets */, + getDisplayInsets(context), isLandscape ? DOCKED_LEFT : DOCKED_TOP /* dockSide */); } @@ -250,6 +251,15 @@ public class SplitLayout { animator.start(); } + private static Rect getDisplayInsets(Context context) { + return context.getSystemService(WindowManager.class) + .getMaximumWindowMetrics() + .getWindowInsets() + .getInsets(WindowInsets.Type.navigationBars() + | WindowInsets.Type.statusBars() + | WindowInsets.Type.displayCutout()).toRect(); + } + private static boolean isLandscape(Rect bounds) { return bounds.width() > bounds.height(); }