From 16496cb5c1f9d5e745099de153de1ed921aab9ff Mon Sep 17 00:00:00 2001 From: Shawn Lin Date: Mon, 26 Jul 2021 08:23:20 +0000 Subject: Add APIs to get system bar heights In multi-display devices, there might be differnt cutout on each display which also causes different status bar height. Now we no longer overlay the status_bar_height dimen and keep it as default value and add APIs to calculate the status bar size. - Add APIs for getting status_bar_height & quick_qs_offset_height in system. - Add APIs for getting split_shade_header_height and qs_header_system_icons_area_height in SystemUI. - Remove all resource overlay for status_bar_height & quick_qs_offset_height. Bug: 186604541 Test: atest SmallClockPositionTest DisplayLayoutTest HideDisplayCutoutOrganizerTest SizeCompatTests NotificationPanelViewControllerTest Change-Id: I5a6dfcc6ff06da8ea0fe119fc9d4c089f13b0dff --- .../android/internal/policy/SystemBarUtils.java | 94 ++++++++++++++++++++++ core/res/res/values-land/dimens.xml | 2 - core/res/res/values/dimens.xml | 22 +++-- .../com/android/wm/shell/common/DisplayLayout.java | 44 +++------- .../HideDisplayCutoutOrganizer.java | 11 +-- .../android/wm/shell/common/DisplayLayoutTest.java | 43 ++++++++-- .../HideDisplayCutoutOrganizerTest.java | 17 ++-- .../res/layout/super_notification_shade.xml | 1 + .../com/android/keyguard/KeyguardMessageArea.java | 22 +++++ .../keyguard/KeyguardMessageAreaController.java | 6 ++ .../keyguard/clock/AnalogClockController.java | 2 +- .../keyguard/clock/BubbleClockController.java | 2 +- .../android/keyguard/clock/SmallClockPosition.java | 13 +-- .../com/android/systemui/qs/QSContainerImpl.java | 4 +- .../src/com/android/systemui/qs/QSDetail.java | 4 +- .../android/systemui/qs/QuickStatusBarHeader.java | 4 +- .../systemui/qs/customize/QSCustomizer.java | 4 +- .../systemui/statusbar/NotificationShelf.java | 3 +- .../stack/NotificationStackScrollLayout.java | 8 +- .../notification/stack/StackScrollAlgorithm.java | 3 +- .../statusbar/phone/HeadsUpManagerPhone.java | 6 +- .../systemui/statusbar/phone/KeyguardBouncer.java | 4 +- .../statusbar/phone/KeyguardStatusBarView.java | 6 +- .../phone/NotificationPanelViewController.java | 17 ++-- .../statusbar/phone/PhoneStatusBarView.java | 3 +- .../phone/StatusBarContentInsetsProvider.kt | 3 +- .../phone/StatusBarTouchableRegionManager.java | 4 +- .../statusbar/phone/StatusBarWindowController.java | 32 +++----- .../src/com/android/systemui/util/Utils.java | 37 +++++++++ .../keyguard/clock/SmallClockPositionTest.kt | 2 +- .../res/values-land/config.xml | 22 ----- .../res/values/config.xml | 8 -- .../res/values-land/config.xml | 22 ----- .../res/values/config.xml | 8 -- .../res/values-land/config.xml | 22 ----- .../res/values/config.xml | 8 -- .../res/values-land/config.xml | 22 ----- .../res/values/config.xml | 8 -- .../res/values-land/config.xml | 22 ----- .../res/values/config.xml | 8 -- .../res/values-land/config.xml | 22 ----- .../res/values/config.xml | 10 --- .../res/values-land/config.xml | 22 ----- .../res/values/config.xml | 8 -- .../overlays/NoCutoutOverlay/res/values/config.xml | 8 -- .../java/com/android/server/wm/DisplayPolicy.java | 15 ++-- .../android/server/wm/DisplayPolicyTestsBase.java | 4 +- .../src/com/android/server/wm/SizeCompatTests.java | 5 +- 48 files changed, 301 insertions(+), 366 deletions(-) create mode 100644 core/java/com/android/internal/policy/SystemBarUtils.java delete mode 100644 packages/overlays/DisplayCutoutEmulationCornerOverlay/res/values-land/config.xml delete mode 100644 packages/overlays/DisplayCutoutEmulationDoubleOverlay/res/values-land/config.xml delete mode 100644 packages/overlays/DisplayCutoutEmulationHoleOverlay/res/values-land/config.xml delete mode 100644 packages/overlays/DisplayCutoutEmulationNarrowOverlay/res/values-land/config.xml delete mode 100644 packages/overlays/DisplayCutoutEmulationTallOverlay/res/values-land/config.xml delete mode 100644 packages/overlays/DisplayCutoutEmulationWaterfallOverlay/res/values-land/config.xml delete mode 100644 packages/overlays/DisplayCutoutEmulationWideOverlay/res/values-land/config.xml diff --git a/core/java/com/android/internal/policy/SystemBarUtils.java b/core/java/com/android/internal/policy/SystemBarUtils.java new file mode 100644 index 000000000000..6bf1333097f7 --- /dev/null +++ b/core/java/com/android/internal/policy/SystemBarUtils.java @@ -0,0 +1,94 @@ +/* + * Copyright (C) 2021 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 com.android.internal.policy; + +import android.content.Context; +import android.content.res.Resources; +import android.graphics.Insets; +import android.util.RotationUtils; +import android.view.DisplayCutout; +import android.view.Surface; + +import com.android.internal.R; + +/** + * Utility functions for system bars used by both window manager and System UI. + * + * @hide + */ +public final class SystemBarUtils { + + /** + * Gets the status bar height. + */ + public static int getStatusBarHeight(Context context) { + return getStatusBarHeight(context.getResources(), context.getDisplay().getCutout()); + } + + /** + * Gets the status bar height with a specific display cutout. + */ + public static int getStatusBarHeight(Resources res, DisplayCutout cutout) { + final int defaultSize = res.getDimensionPixelSize(R.dimen.status_bar_height); + final int safeInsetTop = cutout == null ? 0 : cutout.getSafeInsetTop(); + final int waterfallInsetTop = cutout == null ? 0 : cutout.getWaterfallInsets().top; + // The status bar height should be: + // Max(top cutout size, (status bar default height + waterfall top size)) + return Math.max(safeInsetTop, defaultSize + waterfallInsetTop); + } + + /** + * Gets the status bar height for a specific rotation. + */ + public static int getStatusBarHeightForRotation( + Context context, @Surface.Rotation int targetRot) { + final int rotation = context.getDisplay().getRotation(); + final DisplayCutout cutout = context.getDisplay().getCutout(); + + Insets insets = cutout == null ? Insets.NONE : Insets.of(cutout.getSafeInsets()); + Insets waterfallInsets = cutout == null ? Insets.NONE : cutout.getWaterfallInsets(); + // rotate insets to target rotation if needed. + if (rotation != targetRot) { + if (!insets.equals(Insets.NONE)) { + insets = RotationUtils.rotateInsets( + insets, RotationUtils.deltaRotation(rotation, targetRot)); + } + if (!waterfallInsets.equals(Insets.NONE)) { + waterfallInsets = RotationUtils.rotateInsets( + waterfallInsets, RotationUtils.deltaRotation(rotation, targetRot)); + } + } + final int defaultSize = + context.getResources().getDimensionPixelSize(R.dimen.status_bar_height); + // The status bar height should be: + // Max(top cutout size, (status bar default height + waterfall top size)) + return Math.max(insets.top, defaultSize + waterfallInsets.top); + } + + /** + * Gets the height of area above QQS where battery/time go in notification panel. The height + * equals to status bar height if status bar height is bigger than the + * {@link R.dimen#quick_qs_offset_height}. + */ + public static int getQuickQsOffsetHeight(Context context) { + final int defaultSize = context.getResources().getDimensionPixelSize( + R.dimen.quick_qs_offset_height); + final int statusBarHeight = getStatusBarHeight(context); + // Equals to status bar height if status bar height is bigger. + return Math.max(defaultSize, statusBarHeight); + } +} diff --git a/core/res/res/values-land/dimens.xml b/core/res/res/values-land/dimens.xml index ca549aeba1f5..f1e5888d61b9 100644 --- a/core/res/res/values-land/dimens.xml +++ b/core/res/res/values-land/dimens.xml @@ -27,8 +27,6 @@ 2dip 72dp - - @dimen/status_bar_height_landscape 48dp diff --git a/core/res/res/values/dimens.xml b/core/res/res/values/dimens.xml index ab923d0b8023..0706d8a8e4c6 100644 --- a/core/res/res/values/dimens.xml +++ b/core/res/res/values/dimens.xml @@ -39,15 +39,21 @@ 2dp - - @dimen/status_bar_height_portrait - - 24dp - + + 24dp + + @dimen/status_bar_height + @dimen/status_bar_height_portrait - + 48dp 48dp diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/common/DisplayLayout.java b/libs/WindowManager/Shell/src/com/android/wm/shell/common/DisplayLayout.java index 962aca122b4d..7784665b3031 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/common/DisplayLayout.java +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/common/DisplayLayout.java @@ -48,9 +48,11 @@ import android.view.Gravity; import android.view.InsetsSource; import android.view.InsetsState; import android.view.Surface; -import android.view.WindowInsets; + +import androidx.annotation.VisibleForTesting; import com.android.internal.R; +import com.android.internal.policy.SystemBarUtils; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; @@ -198,12 +200,13 @@ public class DisplayLayout { recalcInsets(res); } - private void recalcInsets(Resources res) { + @VisibleForTesting + void recalcInsets(Resources res) { computeNonDecorInsets(res, mRotation, mWidth, mHeight, mCutout, mInsetsState, mUiMode, mNonDecorInsets, mHasNavigationBar); mStableInsets.set(mNonDecorInsets); if (mHasStatusBar) { - convertNonDecorInsetsToStableInsets(res, mStableInsets, mWidth, mHeight, mHasStatusBar); + convertNonDecorInsetsToStableInsets(res, mStableInsets, mCutout, mHasStatusBar); } mNavBarFrameHeight = getNavigationBarFrameHeight(res, mWidth > mHeight); } @@ -323,12 +326,12 @@ public class DisplayLayout { /** * Calculates the stable insets if we already have the non-decor insets. */ - private static void convertNonDecorInsetsToStableInsets(Resources res, Rect inOutInsets, - int displayWidth, int displayHeight, boolean hasStatusBar) { + private void convertNonDecorInsetsToStableInsets(Resources res, Rect inOutInsets, + DisplayCutout cutout, boolean hasStatusBar) { if (!hasStatusBar) { return; } - int statusBarHeight = getStatusBarHeight(displayWidth > displayHeight, res); + int statusBarHeight = SystemBarUtils.getStatusBarHeight(res, cutout); inOutInsets.top = Math.max(inOutInsets.top, statusBarHeight); } @@ -377,35 +380,6 @@ public class DisplayLayout { } } - /** - * Calculates the stable insets without running a layout. - * - * @param displayRotation the current display rotation - * @param displayWidth the current display width - * @param displayHeight the current display height - * @param displayCutout the current display cutout - * @param outInsets the insets to return - */ - static void computeStableInsets(Resources res, int displayRotation, int displayWidth, - int displayHeight, DisplayCutout displayCutout, InsetsState insetsState, int uiMode, - Rect outInsets, boolean hasNavigationBar, boolean hasStatusBar) { - outInsets.setEmpty(); - - // Navigation bar and status bar. - computeNonDecorInsets(res, displayRotation, displayWidth, displayHeight, displayCutout, - insetsState, uiMode, outInsets, hasNavigationBar); - convertNonDecorInsetsToStableInsets(res, outInsets, displayWidth, displayHeight, - hasStatusBar); - } - - /** Retrieve the statusbar height from resources. */ - static int getStatusBarHeight(boolean landscape, Resources res) { - return landscape ? res.getDimensionPixelSize( - com.android.internal.R.dimen.status_bar_height_landscape) - : res.getDimensionPixelSize( - com.android.internal.R.dimen.status_bar_height_portrait); - } - /** Calculate the DisplayCutout for a particular display size/rotation. */ public static DisplayCutout calculateDisplayCutoutForRotation( DisplayCutout cutout, int rotation, int displayWidth, int displayHeight) { diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/hidedisplaycutout/HideDisplayCutoutOrganizer.java b/libs/WindowManager/Shell/src/com/android/wm/shell/hidedisplaycutout/HideDisplayCutoutOrganizer.java index 75a1ddeccb22..3f7d78dda037 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/hidedisplaycutout/HideDisplayCutoutOrganizer.java +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/hidedisplaycutout/HideDisplayCutoutOrganizer.java @@ -39,7 +39,7 @@ import androidx.annotation.GuardedBy; import androidx.annotation.NonNull; import androidx.annotation.VisibleForTesting; -import com.android.internal.R; +import com.android.internal.policy.SystemBarUtils; import com.android.wm.shell.common.DisplayController; import com.android.wm.shell.common.DisplayLayout; import com.android.wm.shell.common.ShellExecutor; @@ -307,12 +307,9 @@ class HideDisplayCutoutOrganizer extends DisplayAreaOrganizer { t.apply(); } - private int getStatusBarHeight() { - final boolean isLandscape = - mIsDefaultPortrait ? isDisplaySizeFlipped() : !isDisplaySizeFlipped(); - return mContext.getResources().getDimensionPixelSize( - isLandscape ? R.dimen.status_bar_height_landscape - : R.dimen.status_bar_height_portrait); + @VisibleForTesting + int getStatusBarHeight() { + return SystemBarUtils.getStatusBarHeight(mContext); } void dump(@NonNull PrintWriter pw) { diff --git a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/common/DisplayLayoutTest.java b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/common/DisplayLayoutTest.java index 88e754c58792..0ffa5b35331d 100644 --- a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/common/DisplayLayoutTest.java +++ b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/common/DisplayLayoutTest.java @@ -21,9 +21,14 @@ import static android.view.Surface.ROTATION_0; import static android.view.Surface.ROTATION_270; import static android.view.Surface.ROTATION_90; +import static com.android.dx.mockito.inline.extended.ExtendedMockito.mockitoSession; + import static org.junit.Assert.assertEquals; +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.ArgumentMatchers.eq; import static org.mockito.Mockito.doReturn; import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.when; import android.content.res.Configuration; import android.content.res.Resources; @@ -35,8 +40,12 @@ import android.view.DisplayInfo; import androidx.test.filters.SmallTest; import com.android.internal.R; +import com.android.internal.policy.SystemBarUtils; +import org.junit.After; +import org.junit.Before; import org.junit.Test; +import org.mockito.MockitoSession; /** * Tests for {@link DisplayLayout}. @@ -46,29 +55,48 @@ import org.junit.Test; */ @SmallTest public class DisplayLayoutTest { + private MockitoSession mMockitoSession; + + @Before + public void setup() { + mMockitoSession = mockitoSession() + .initMocks(this) + .mockStatic(SystemBarUtils.class) + .startMocking(); + } + + @After + public void tearDown() { + mMockitoSession.finishMocking(); + } @Test public void testInsets() { - Resources res = createResources(40, 50, false, 30, 40); + Resources res = createResources(40, 50, false); // Test empty display, no bars or anything DisplayInfo info = createDisplayInfo(1000, 1500, 0, ROTATION_0); DisplayLayout dl = new DisplayLayout(info, res, false, false); + when(SystemBarUtils.getStatusBarHeight(eq(res), any())).thenReturn(40); + dl.recalcInsets(res); assertEquals(new Rect(0, 0, 0, 0), dl.stableInsets()); assertEquals(new Rect(0, 0, 0, 0), dl.nonDecorInsets()); // Test with bars dl = new DisplayLayout(info, res, true, true); + dl.recalcInsets(res); assertEquals(new Rect(0, 40, 0, 50), dl.stableInsets()); assertEquals(new Rect(0, 0, 0, 50), dl.nonDecorInsets()); // Test just cutout info = createDisplayInfo(1000, 1500, 60, ROTATION_0); dl = new DisplayLayout(info, res, false, false); + dl.recalcInsets(res); assertEquals(new Rect(0, 60, 0, 0), dl.stableInsets()); assertEquals(new Rect(0, 60, 0, 0), dl.nonDecorInsets()); // Test with bars and cutout dl = new DisplayLayout(info, res, true, true); + dl.recalcInsets(res); assertEquals(new Rect(0, 60, 0, 50), dl.stableInsets()); assertEquals(new Rect(0, 60, 0, 50), dl.nonDecorInsets()); } @@ -76,27 +104,30 @@ public class DisplayLayoutTest { @Test public void testRotate() { // Basic rotate utility - Resources res = createResources(40, 50, false, 30, 40); + Resources res = createResources(40, 50, false); DisplayInfo info = createDisplayInfo(1000, 1500, 60, ROTATION_0); DisplayLayout dl = new DisplayLayout(info, res, true, true); + when(SystemBarUtils.getStatusBarHeight(eq(res), any())).thenReturn(40); + dl.recalcInsets(res); assertEquals(new Rect(0, 60, 0, 50), dl.stableInsets()); assertEquals(new Rect(0, 60, 0, 50), dl.nonDecorInsets()); // Rotate to 90 + when(SystemBarUtils.getStatusBarHeight(eq(res), any())).thenReturn(30); dl.rotateTo(res, ROTATION_90); assertEquals(new Rect(60, 30, 0, 40), dl.stableInsets()); assertEquals(new Rect(60, 0, 0, 40), dl.nonDecorInsets()); // Rotate with moving navbar - res = createResources(40, 50, true, 30, 40); + res = createResources(40, 50, true); dl = new DisplayLayout(info, res, true, true); + when(SystemBarUtils.getStatusBarHeight(eq(res), any())).thenReturn(30); dl.rotateTo(res, ROTATION_270); assertEquals(new Rect(40, 30, 60, 0), dl.stableInsets()); assertEquals(new Rect(40, 0, 60, 0), dl.nonDecorInsets()); } - private Resources createResources( - int navLand, int navPort, boolean navMoves, int statusLand, int statusPort) { + private Resources createResources(int navLand, int navPort, boolean navMoves) { Configuration cfg = new Configuration(); cfg.uiMode = UI_MODE_TYPE_NORMAL; Resources res = mock(Resources.class); @@ -108,8 +139,6 @@ public class DisplayLayoutTest { doReturn(navPort).when(res).getDimensionPixelSize(R.dimen.navigation_bar_height); doReturn(navLand).when(res).getDimensionPixelSize(R.dimen.navigation_bar_width); doReturn(navMoves).when(res).getBoolean(R.bool.config_navBarCanMove); - doReturn(statusLand).when(res).getDimensionPixelSize(R.dimen.status_bar_height_landscape); - doReturn(statusPort).when(res).getDimensionPixelSize(R.dimen.status_bar_height_portrait); doReturn(cfg).when(res).getConfiguration(); return res; } diff --git a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/hidedisplaycutout/HideDisplayCutoutOrganizerTest.java b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/hidedisplaycutout/HideDisplayCutoutOrganizerTest.java index 3c124bafc18a..078e2b6cf574 100644 --- a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/hidedisplaycutout/HideDisplayCutoutOrganizerTest.java +++ b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/hidedisplaycutout/HideDisplayCutoutOrganizerTest.java @@ -48,7 +48,6 @@ import android.window.WindowContainerToken; import androidx.test.InstrumentationRegistry; import androidx.test.filters.SmallTest; -import com.android.internal.R; import com.android.wm.shell.common.DisplayController; import com.android.wm.shell.common.DisplayLayout; import com.android.wm.shell.common.ShellExecutor; @@ -124,6 +123,7 @@ public class HideDisplayCutoutOrganizerTest { @Test public void testEnableHideDisplayCutout() { + doReturn(mFakeStatusBarHeightPortrait).when(mOrganizer).getStatusBarHeight(); mOrganizer.enableHideDisplayCutout(); verify(mOrganizer).registerOrganizer(DisplayAreaOrganizer.FEATURE_HIDE_DISPLAY_CUTOUT); @@ -154,8 +154,7 @@ public class HideDisplayCutoutOrganizerTest { doReturn(mFakeDefaultBounds).when(mOrganizer).getDisplayBoundsOfNaturalOrientation(); doReturn(mFakeDefaultCutoutInsets).when(mOrganizer) .getDisplayCutoutInsetsOfNaturalOrientation(); - mContext.getOrCreateTestableResources().addOverride( - R.dimen.status_bar_height_portrait, mFakeStatusBarHeightPortrait); + doReturn(mFakeStatusBarHeightPortrait).when(mOrganizer).getStatusBarHeight(); doReturn(Surface.ROTATION_0).when(mDisplayLayout).rotation(); mOrganizer.enableHideDisplayCutout(); @@ -173,8 +172,7 @@ public class HideDisplayCutoutOrganizerTest { doReturn(mFakeDefaultBounds).when(mOrganizer).getDisplayBoundsOfNaturalOrientation(); doReturn(mFakeDefaultCutoutInsets).when(mOrganizer) .getDisplayCutoutInsetsOfNaturalOrientation(); - mContext.getOrCreateTestableResources().addOverride( - R.dimen.status_bar_height_landscape, mFakeStatusBarHeightLandscape); + doReturn(mFakeStatusBarHeightLandscape).when(mOrganizer).getStatusBarHeight(); doReturn(Surface.ROTATION_90).when(mDisplayLayout).rotation(); mOrganizer.enableHideDisplayCutout(); @@ -192,8 +190,7 @@ public class HideDisplayCutoutOrganizerTest { doReturn(mFakeDefaultBounds).when(mOrganizer).getDisplayBoundsOfNaturalOrientation(); doReturn(mFakeDefaultCutoutInsets).when(mOrganizer) .getDisplayCutoutInsetsOfNaturalOrientation(); - mContext.getOrCreateTestableResources().addOverride( - R.dimen.status_bar_height_landscape, mFakeStatusBarHeightLandscape); + doReturn(mFakeStatusBarHeightLandscape).when(mOrganizer).getStatusBarHeight(); doReturn(Surface.ROTATION_270).when(mDisplayLayout).rotation(); mOrganizer.enableHideDisplayCutout(); @@ -211,8 +208,7 @@ public class HideDisplayCutoutOrganizerTest { doReturn(mFakeDefaultBounds).when(mOrganizer).getDisplayBoundsOfNaturalOrientation(); doReturn(mFakeDefaultCutoutInsets).when(mOrganizer) .getDisplayCutoutInsetsOfNaturalOrientation(); - mContext.getOrCreateTestableResources().addOverride( - R.dimen.status_bar_height_portrait, mFakeStatusBarHeightPortrait); + doReturn(mFakeStatusBarHeightPortrait).when(mOrganizer).getStatusBarHeight(); mOrganizer.enableHideDisplayCutout(); // disable hide display cutout @@ -230,8 +226,7 @@ public class HideDisplayCutoutOrganizerTest { doReturn(200).when(mDisplayLayout).height(); doReturn(mFakeDefaultCutoutInsets).when(mOrganizer) .getDisplayCutoutInsetsOfNaturalOrientation(); - mContext.getOrCreateTestableResources().addOverride( - R.dimen.status_bar_height_portrait, mFakeStatusBarHeightPortrait); + doReturn(mFakeStatusBarHeightPortrait).when(mOrganizer).getStatusBarHeight(); doReturn(Surface.ROTATION_0).when(mDisplayLayout).rotation(); mOrganizer.enableHideDisplayCutout(); assertThat(mOrganizer.mCurrentDisplayBounds).isEqualTo(new Rect(0, 15, 100, 200)); diff --git a/packages/SystemUI/res/layout/super_notification_shade.xml b/packages/SystemUI/res/layout/super_notification_shade.xml index e02a1767a96c..b28cb2f6f483 100644 --- a/packages/SystemUI/res/layout/super_notification_shade.xml +++ b/packages/SystemUI/res/layout/super_notification_shade.xml @@ -81,6 +81,7 @@ displayBounds.height()) { - defaultAndUpsideDownHeight = mContext.getResources().getDimensionPixelSize( - com.android.internal.R.dimen.status_bar_height_landscape); - theOtherHeight = mContext.getResources().getDimensionPixelSize( - com.android.internal.R.dimen.status_bar_height_portrait); - } else { - defaultAndUpsideDownHeight = mContext.getResources().getDimensionPixelSize( - com.android.internal.R.dimen.status_bar_height_portrait); - theOtherHeight = mContext.getResources().getDimensionPixelSize( - com.android.internal.R.dimen.status_bar_height_landscape); - } switch (rotation) { case ROTATION_UNDEFINED: case Surface.ROTATION_0: case Surface.ROTATION_180: - height = defaultAndUpsideDownHeight; + height = SystemBarUtils.getStatusBarHeightForRotation( + mContext, Surface.ROTATION_0); break; case Surface.ROTATION_90: + height = SystemBarUtils.getStatusBarHeightForRotation( + mContext, Surface.ROTATION_90); + break; case Surface.ROTATION_270: - height = theOtherHeight; + height = SystemBarUtils.getStatusBarHeightForRotation( + mContext, Surface.ROTATION_270); break; } } diff --git a/packages/SystemUI/src/com/android/systemui/util/Utils.java b/packages/SystemUI/src/com/android/systemui/util/Utils.java index a1cdfd8201c7..407dc5e2787a 100644 --- a/packages/SystemUI/src/com/android/systemui/util/Utils.java +++ b/packages/SystemUI/src/com/android/systemui/util/Utils.java @@ -24,8 +24,10 @@ import android.content.res.Resources; import android.content.res.TypedArray; import android.provider.Settings; import android.view.ContextThemeWrapper; +import android.view.DisplayCutout; import android.view.View; +import com.android.internal.policy.SystemBarUtils; import com.android.systemui.R; import com.android.systemui.shared.system.QuickStepContract; import com.android.systemui.statusbar.CommandQueue; @@ -186,4 +188,39 @@ public class Utils { return color; } + /** + * Gets the {@link R.dimen#split_shade_header_height}. + * + * Currently, it's the same as {@link com.android.internal.R.dimen#quick_qs_offset_height}. + */ + public static int getSplitShadeStatusBarHeight(Context context) { + return SystemBarUtils.getQuickQsOffsetHeight(context); + } + + /** + * Gets the {@link R.dimen#qs_header_system_icons_area_height}. + * + * It's the same as {@link com.android.internal.R.dimen#quick_qs_offset_height} except for + * sw600dp-land. + */ + public static int getQsHeaderSystemIconsAreaHeight(Context context) { + final Resources res = context.getResources(); + if (Utils.shouldUseSplitNotificationShade(res)) { + return res.getDimensionPixelSize(R.dimen.qs_header_system_icons_area_height); + } else { + return SystemBarUtils.getQuickQsOffsetHeight(context); + } + } + + /** + * Gets the {@link R.dimen#status_bar_header_height_keyguard}. + */ + public static int getStatusBarHeaderHeightKeyguard(Context context) { + final int statusBarHeight = SystemBarUtils.getStatusBarHeight(context); + final DisplayCutout cutout = context.getDisplay().getCutout(); + final int waterfallInsetTop = cutout == null ? 0 : cutout.getWaterfallInsets().top; + final int statusBarHeaderHeightKeyguard = context.getResources() + .getDimensionPixelSize(R.dimen.status_bar_header_height_keyguard); + return Math.max(statusBarHeight, statusBarHeaderHeightKeyguard + waterfallInsetTop); + } } diff --git a/packages/SystemUI/tests/src/com/android/keyguard/clock/SmallClockPositionTest.kt b/packages/SystemUI/tests/src/com/android/keyguard/clock/SmallClockPositionTest.kt index 456f32b4bd40..3a27e356ed84 100644 --- a/packages/SystemUI/tests/src/com/android/keyguard/clock/SmallClockPositionTest.kt +++ b/packages/SystemUI/tests/src/com/android/keyguard/clock/SmallClockPositionTest.kt @@ -43,7 +43,7 @@ class SmallClockPositionTest : SysuiTestCase() { @Test fun loadResources() { // Cover constructor taking Resources object. - position = SmallClockPosition(context.resources) + position = SmallClockPosition(context) position.setDarkAmount(1f) assertThat(position.preferredY).isGreaterThan(0) } diff --git a/packages/overlays/DisplayCutoutEmulationCornerOverlay/res/values-land/config.xml b/packages/overlays/DisplayCutoutEmulationCornerOverlay/res/values-land/config.xml deleted file mode 100644 index bd52901cef95..000000000000 --- a/packages/overlays/DisplayCutoutEmulationCornerOverlay/res/values-land/config.xml +++ /dev/null @@ -1,22 +0,0 @@ - - - - - 28dp - - 156dp - \ No newline at end of file diff --git a/packages/overlays/DisplayCutoutEmulationCornerOverlay/res/values/config.xml b/packages/overlays/DisplayCutoutEmulationCornerOverlay/res/values/config.xml index 9254b4d65b50..c340432b9b8c 100644 --- a/packages/overlays/DisplayCutoutEmulationCornerOverlay/res/values/config.xml +++ b/packages/overlays/DisplayCutoutEmulationCornerOverlay/res/values/config.xml @@ -44,14 +44,6 @@ --> true - - 48dp - 28dp - - 48dp - - 176dp - diff --git a/packages/overlays/DisplayCutoutEmulationDoubleOverlay/res/values-land/config.xml b/packages/overlays/DisplayCutoutEmulationDoubleOverlay/res/values-land/config.xml deleted file mode 100644 index bd52901cef95..000000000000 --- a/packages/overlays/DisplayCutoutEmulationDoubleOverlay/res/values-land/config.xml +++ /dev/null @@ -1,22 +0,0 @@ - - - - - 28dp - - 156dp - \ No newline at end of file diff --git a/packages/overlays/DisplayCutoutEmulationDoubleOverlay/res/values/config.xml b/packages/overlays/DisplayCutoutEmulationDoubleOverlay/res/values/config.xml index 80c997a46264..928d9dfa3ce1 100644 --- a/packages/overlays/DisplayCutoutEmulationDoubleOverlay/res/values/config.xml +++ b/packages/overlays/DisplayCutoutEmulationDoubleOverlay/res/values/config.xml @@ -56,14 +56,6 @@ --> true - - 48dp - 28dp - - 48dp - - 176dp - diff --git a/packages/overlays/DisplayCutoutEmulationHoleOverlay/res/values-land/config.xml b/packages/overlays/DisplayCutoutEmulationHoleOverlay/res/values-land/config.xml deleted file mode 100644 index 2e971ded2256..000000000000 --- a/packages/overlays/DisplayCutoutEmulationHoleOverlay/res/values-land/config.xml +++ /dev/null @@ -1,22 +0,0 @@ - - - - - 28dp - - 156dp - diff --git a/packages/overlays/DisplayCutoutEmulationHoleOverlay/res/values/config.xml b/packages/overlays/DisplayCutoutEmulationHoleOverlay/res/values/config.xml index 9f558d0e2bd5..62f0535a1746 100644 --- a/packages/overlays/DisplayCutoutEmulationHoleOverlay/res/values/config.xml +++ b/packages/overlays/DisplayCutoutEmulationHoleOverlay/res/values/config.xml @@ -48,14 +48,6 @@ --> true - - 136px - 28dp - - 136px - - 488px - diff --git a/packages/overlays/DisplayCutoutEmulationNarrowOverlay/res/values-land/config.xml b/packages/overlays/DisplayCutoutEmulationNarrowOverlay/res/values-land/config.xml deleted file mode 100644 index bd52901cef95..000000000000 --- a/packages/overlays/DisplayCutoutEmulationNarrowOverlay/res/values-land/config.xml +++ /dev/null @@ -1,22 +0,0 @@ - - - - - 28dp - - 156dp - \ No newline at end of file diff --git a/packages/overlays/DisplayCutoutEmulationNarrowOverlay/res/values/config.xml b/packages/overlays/DisplayCutoutEmulationNarrowOverlay/res/values/config.xml index 6fb3c7f51e26..a9f8b4bc6329 100644 --- a/packages/overlays/DisplayCutoutEmulationNarrowOverlay/res/values/config.xml +++ b/packages/overlays/DisplayCutoutEmulationNarrowOverlay/res/values/config.xml @@ -47,14 +47,6 @@ --> true - - 48dp - 28dp - - 48dp - - 176dp - diff --git a/packages/overlays/DisplayCutoutEmulationTallOverlay/res/values-land/config.xml b/packages/overlays/DisplayCutoutEmulationTallOverlay/res/values-land/config.xml deleted file mode 100644 index bd52901cef95..000000000000 --- a/packages/overlays/DisplayCutoutEmulationTallOverlay/res/values-land/config.xml +++ /dev/null @@ -1,22 +0,0 @@ - - - - - 28dp - - 156dp - \ No newline at end of file diff --git a/packages/overlays/DisplayCutoutEmulationTallOverlay/res/values/config.xml b/packages/overlays/DisplayCutoutEmulationTallOverlay/res/values/config.xml index 7c29ffb92f4e..be7d0e48fa3f 100644 --- a/packages/overlays/DisplayCutoutEmulationTallOverlay/res/values/config.xml +++ b/packages/overlays/DisplayCutoutEmulationTallOverlay/res/values/config.xml @@ -47,14 +47,6 @@ --> true - - 48dp - 28dp - - 48dp - - 176dp - diff --git a/packages/overlays/DisplayCutoutEmulationWaterfallOverlay/res/values-land/config.xml b/packages/overlays/DisplayCutoutEmulationWaterfallOverlay/res/values-land/config.xml deleted file mode 100644 index df2f3d19626e..000000000000 --- a/packages/overlays/DisplayCutoutEmulationWaterfallOverlay/res/values-land/config.xml +++ /dev/null @@ -1,22 +0,0 @@ - - - - - 48dp - - 176dp - \ No newline at end of file diff --git a/packages/overlays/DisplayCutoutEmulationWaterfallOverlay/res/values/config.xml b/packages/overlays/DisplayCutoutEmulationWaterfallOverlay/res/values/config.xml index 8d0227eed875..cc51ebee270c 100644 --- a/packages/overlays/DisplayCutoutEmulationWaterfallOverlay/res/values/config.xml +++ b/packages/overlays/DisplayCutoutEmulationWaterfallOverlay/res/values/config.xml @@ -19,16 +19,6 @@ - - 28dp - - 48dp - - 48dp - - 176dp - 20dp 0dp 20dp diff --git a/packages/overlays/DisplayCutoutEmulationWideOverlay/res/values-land/config.xml b/packages/overlays/DisplayCutoutEmulationWideOverlay/res/values-land/config.xml deleted file mode 100644 index bd52901cef95..000000000000 --- a/packages/overlays/DisplayCutoutEmulationWideOverlay/res/values-land/config.xml +++ /dev/null @@ -1,22 +0,0 @@ - - - - - 28dp - - 156dp - \ No newline at end of file diff --git a/packages/overlays/DisplayCutoutEmulationWideOverlay/res/values/config.xml b/packages/overlays/DisplayCutoutEmulationWideOverlay/res/values/config.xml index 5fb8b9e241b8..78cc7e04c7a0 100644 --- a/packages/overlays/DisplayCutoutEmulationWideOverlay/res/values/config.xml +++ b/packages/overlays/DisplayCutoutEmulationWideOverlay/res/values/config.xml @@ -47,14 +47,6 @@ --> true - - 48dp - 28dp - - 48dp - - 176dp - diff --git a/packages/overlays/NoCutoutOverlay/res/values/config.xml b/packages/overlays/NoCutoutOverlay/res/values/config.xml index 91576998cc54..84b91b85350d 100644 --- a/packages/overlays/NoCutoutOverlay/res/values/config.xml +++ b/packages/overlays/NoCutoutOverlay/res/values/config.xml @@ -25,12 +25,4 @@ by shrinking the display such that it does not overlap the cutout area. --> true - - 28dp - 28dp - - - 48dp - - 176dp diff --git a/services/core/java/com/android/server/wm/DisplayPolicy.java b/services/core/java/com/android/server/wm/DisplayPolicy.java index 50c56de49134..6a5a76e455e4 100644 --- a/services/core/java/com/android/server/wm/DisplayPolicy.java +++ b/services/core/java/com/android/server/wm/DisplayPolicy.java @@ -156,6 +156,7 @@ import com.android.internal.R; import com.android.internal.annotations.VisibleForTesting; import com.android.internal.policy.GestureNavigationSettingsObserver; import com.android.internal.policy.ScreenDecorationsUtils; +import com.android.internal.policy.SystemBarUtils; import com.android.internal.protolog.common.ProtoLog; import com.android.internal.util.ScreenshotHelper; import com.android.internal.util.function.TriConsumer; @@ -1330,6 +1331,11 @@ public class DisplayPolicy { return Math.max(statusBarHeight, displayFrames.mDisplayCutoutSafe.top); } + @VisibleForTesting + int getStatusBarHeightForRotation(@Surface.Rotation int rotation) { + return SystemBarUtils.getStatusBarHeightForRotation(mUiContext, rotation); + } + WindowState getStatusBar() { return mStatusBar != null ? mStatusBar : mStatusBarAlt; } @@ -1599,8 +1605,6 @@ public class DisplayPolicy { // For layout, the status bar is always at the top with our fixed height. int statusBarBottom = displayFrames.mUnrestricted.top + mStatusBarHeightForRotation[displayFrames.mRotation]; - // Make sure the status bar covers the entire cutout height - statusBarBottom = Math.max(statusBarBottom, displayFrames.mDisplayCutoutSafe.top); if (displayFrames.mDisplayCutoutSafe.top > displayFrames.mUnrestricted.top) { // Make sure that the zone we're avoiding for the cutout is at least as tall as the @@ -2133,10 +2137,11 @@ public class DisplayPolicy { if (hasStatusBar()) { mStatusBarHeightForRotation[portraitRotation] = mStatusBarHeightForRotation[upsideDownRotation] = - res.getDimensionPixelSize(R.dimen.status_bar_height_portrait); + getStatusBarHeightForRotation(portraitRotation); mStatusBarHeightForRotation[landscapeRotation] = - mStatusBarHeightForRotation[seascapeRotation] = - res.getDimensionPixelSize(R.dimen.status_bar_height_landscape); + getStatusBarHeightForRotation(landscapeRotation); + mStatusBarHeightForRotation[seascapeRotation] = + getStatusBarHeightForRotation(seascapeRotation); mDisplayCutoutTouchableRegionSize = res.getDimensionPixelSize( R.dimen.display_cutout_touchable_region_size); } else { diff --git a/services/tests/wmtests/src/com/android/server/wm/DisplayPolicyTestsBase.java b/services/tests/wmtests/src/com/android/server/wm/DisplayPolicyTestsBase.java index 3982a83d7778..1d2baab934e5 100644 --- a/services/tests/wmtests/src/com/android/server/wm/DisplayPolicyTestsBase.java +++ b/services/tests/wmtests/src/com/android/server/wm/DisplayPolicyTestsBase.java @@ -31,6 +31,7 @@ import static com.android.dx.mockito.inline.extended.ExtendedMockito.spyOn; import static com.android.server.wm.utils.CoordinateTransforms.transformPhysicalToLogicalCoordinates; import static org.junit.Assert.assertEquals; +import static org.mockito.ArgumentMatchers.anyInt; import android.content.Context; import android.content.ContextWrapper; @@ -75,13 +76,12 @@ public class DisplayPolicyTestsBase extends WindowTestsBase { final TestContextWrapper context = new TestContextWrapper( mDisplayPolicy.getContext(), mDisplayPolicy.getCurrentUserResources()); final TestableResources resources = context.getResourceMocker(); - resources.addOverride(R.dimen.status_bar_height_portrait, STATUS_BAR_HEIGHT); - resources.addOverride(R.dimen.status_bar_height_landscape, STATUS_BAR_HEIGHT); resources.addOverride(R.dimen.navigation_bar_height, NAV_BAR_HEIGHT); resources.addOverride(R.dimen.navigation_bar_height_landscape, NAV_BAR_HEIGHT); resources.addOverride(R.dimen.navigation_bar_width, NAV_BAR_HEIGHT); resources.addOverride(R.dimen.navigation_bar_frame_height_landscape, NAV_BAR_HEIGHT); resources.addOverride(R.dimen.navigation_bar_frame_height, NAV_BAR_HEIGHT); + doReturn(STATUS_BAR_HEIGHT).when(mDisplayPolicy).getStatusBarHeightForRotation(anyInt()); doReturn(resources.getResources()).when(mDisplayPolicy).getCurrentUserResources(); doReturn(true).when(mDisplayPolicy).hasNavigationBar(); doReturn(true).when(mDisplayPolicy).hasStatusBar(); diff --git a/services/tests/wmtests/src/com/android/server/wm/SizeCompatTests.java b/services/tests/wmtests/src/com/android/server/wm/SizeCompatTests.java index 6407c92ee2aa..530ee535d529 100644 --- a/services/tests/wmtests/src/com/android/server/wm/SizeCompatTests.java +++ b/services/tests/wmtests/src/com/android/server/wm/SizeCompatTests.java @@ -83,6 +83,8 @@ import android.view.WindowManager; import androidx.test.filters.MediumTest; +import com.android.internal.policy.SystemBarUtils; + import libcore.junit.util.compat.CoreCompatChangeRule.DisableCompatChanges; import libcore.junit.util.compat.CoreCompatChangeRule.EnableCompatChanges; @@ -2126,8 +2128,7 @@ public class SizeCompatTests extends WindowTestsBase { displayContent.mWmService, mock(Session.class), new TestIWindow(), attrs, token); token.addWindow(statusBar); statusBar.setRequestedSize(displayContent.mBaseDisplayWidth, - displayContent.getDisplayUiContext().getResources().getDimensionPixelSize( - com.android.internal.R.dimen.status_bar_height)); + SystemBarUtils.getStatusBarHeight(displayContent.getDisplayUiContext())); displayPolicy.addWindowLw(statusBar, attrs); displayPolicy.layoutWindowLw(statusBar, null, displayContent.mDisplayFrames); -- cgit v1.2.3-59-g8ed1b