diff options
-rw-r--r-- | core/res/res/values/dimens.xml | 9 | ||||
-rw-r--r-- | core/res/res/values/symbols.xml | 2 | ||||
-rw-r--r-- | services/core/java/com/android/server/wm/DisplayPolicy.java | 85 | ||||
-rw-r--r-- | services/core/java/com/android/server/wm/NavigationBarExperiments.java | 120 |
4 files changed, 63 insertions, 153 deletions
diff --git a/core/res/res/values/dimens.xml b/core/res/res/values/dimens.xml index b81db158082c..e5bf088f64f0 100644 --- a/core/res/res/values/dimens.xml +++ b/core/res/res/values/dimens.xml @@ -51,18 +51,23 @@ that just start below the notch. --> <dimen name="display_cutout_touchable_region_size">12dp</dimen> - <!-- EXPERIMENT BEGIN --> <!-- Height of the bottom navigation bar frame; this is different than navigation_bar_height where that is the height reported to all the other windows to resize themselves around the navigation bar window but navigation_bar_frame_height is reported to SystemUI navigation bar view's window --> <dimen name="navigation_bar_frame_height">@dimen/navigation_bar_height</dimen> + <!-- Height of the bottom navigation bar frame in landscape --> + <dimen name="navigation_bar_frame_height_landscape">@dimen/navigation_bar_frame_height</dimen> <!-- Width of the left/right navigation bar frame; this is different than navigation_bar_width where that is the width reported to all the other windows to resize themselves around the navigation bar window but navigation_bar_frame_width is reported to SystemUI navigation bar view's window --> <dimen name="navigation_bar_frame_width">@dimen/navigation_bar_width</dimen> - <!-- EXPERIMENT END--> + + <!-- The height of the navigation gesture area; if the size is larger than the navigation bar + frame width/height, then the difference is the spacing from the navigation bar window to + the area that detects gestures. --> + <dimen name="navigation_bar_gesture_height">@dimen/navigation_bar_frame_height</dimen> <!-- Height of the bottom navigation / system bar in car mode. --> <dimen name="navigation_bar_height_car_mode">96dp</dimen> diff --git a/core/res/res/values/symbols.xml b/core/res/res/values/symbols.xml index a6a0c6e50a85..196e2051645c 100644 --- a/core/res/res/values/symbols.xml +++ b/core/res/res/values/symbols.xml @@ -1746,6 +1746,8 @@ <java-symbol type="dimen" name="navigation_bar_height_landscape" /> <java-symbol type="dimen" name="navigation_bar_width" /> <java-symbol type="dimen" name="navigation_bar_frame_height" /> + <java-symbol type="dimen" name="navigation_bar_frame_height_landscape" /> + <java-symbol type="dimen" name="navigation_bar_gesture_height" /> <java-symbol type="dimen" name="navigation_bar_frame_width" /> <java-symbol type="dimen" name="navigation_bar_height_car_mode" /> <java-symbol type="dimen" name="navigation_bar_height_landscape_car_mode" /> diff --git a/services/core/java/com/android/server/wm/DisplayPolicy.java b/services/core/java/com/android/server/wm/DisplayPolicy.java index bd874ba786ed..6f3dee4f53af 100644 --- a/services/core/java/com/android/server/wm/DisplayPolicy.java +++ b/services/core/java/com/android/server/wm/DisplayPolicy.java @@ -268,6 +268,9 @@ public class DisplayPolicy { private int[] mNavigationBarHeightForRotationInCarMode = new int[4]; private int[] mNavigationBarWidthForRotationInCarMode = new int[4]; + /** See {@link #getNavigationBarFrameHeight} */ + private int[] mNavigationBarFrameHeightForRotationDefault = new int[4]; + /** Cached value of {@link ScreenShapeHelper#getWindowOutsetBottomPx} */ @Px private int mWindowOutsetBottom; @@ -286,10 +289,6 @@ public class DisplayPolicy { } }; - // EXPERIMENT TODO(b/113952590): Remove once experiment in bug is completed - private NavigationBarExperiments mExperiments = new NavigationBarExperiments(); - // EXPERIMENT END - @GuardedBy("mHandler") private SleepToken mDreamingSleepToken; @@ -1607,11 +1606,9 @@ public class DisplayPolicy { // It's a system nav bar or a portrait screen; nav bar goes on bottom. final int top = cutoutSafeUnrestricted.bottom - getNavigationBarHeight(rotation, uiMode); - // EXPERIMENT TODO(b/113952590): Remove once experiment in bug is completed final int topNavBar = cutoutSafeUnrestricted.bottom - - mExperiments.getNavigationBarFrameHeight(); + - getNavigationBarFrameHeight(rotation, uiMode); navigationFrame.set(0, topNavBar, displayWidth, displayFrames.mUnrestricted.bottom); - // EXPERIMENT END displayFrames.mStable.bottom = displayFrames.mStableFullscreen.bottom = top; if (transientNavBarShowing) { mNavigationBarController.setBarShowingLw(true); @@ -1634,11 +1631,7 @@ public class DisplayPolicy { // Landscape screen; nav bar goes to the right. final int left = cutoutSafeUnrestricted.right - getNavigationBarWidth(rotation, uiMode); - // EXPERIMENT TODO(b/113952590): Remove once experiment in bug is completed - final int leftNavBar = cutoutSafeUnrestricted.right - - mExperiments.getNavigationBarFrameWidth(); - navigationFrame.set(leftNavBar, 0, displayFrames.mUnrestricted.right, displayHeight); - // EXPERIMENT END + navigationFrame.set(left, 0, displayFrames.mUnrestricted.right, displayHeight); displayFrames.mStable.right = displayFrames.mStableFullscreen.right = left; if (transientNavBarShowing) { mNavigationBarController.setBarShowingLw(true); @@ -1661,11 +1654,7 @@ public class DisplayPolicy { // Seascape screen; nav bar goes to the left. final int right = cutoutSafeUnrestricted.left + getNavigationBarWidth(rotation, uiMode); - // EXPERIMENT TODO(b/113952590): Remove once experiment in bug is completed - final int rightNavBar = cutoutSafeUnrestricted.left - + mExperiments.getNavigationBarFrameWidth(); - navigationFrame.set(displayFrames.mUnrestricted.left, 0, rightNavBar, displayHeight); - // EXPERIMENT END + navigationFrame.set(displayFrames.mUnrestricted.left, 0, right, displayHeight); displayFrames.mStable.left = displayFrames.mStableFullscreen.left = right; if (transientNavBarShowing) { mNavigationBarController.setBarShowingLw(true); @@ -1873,10 +1862,21 @@ public class DisplayPolicy { } } - // EXPERIMENT TODO(b/113952590): Remove once experiment in bug is completed - // Offset the ime to avoid overlapping with the nav bar - mExperiments.offsetWindowFramesForNavBar(mNavigationBarPosition, win); - // EXPERIMENT END + // In case the navigation bar is on the bottom, we use the frame height instead of the + // regular height for the insets we send to the IME as we need some space to show + // additional buttons in SystemUI when the IME is up. + if (mNavigationBarPosition == NAV_BAR_BOTTOM) { + final int rotation = displayFrames.mRotation; + final int uimode = mService.mPolicy.getUiMode(); + final int navHeightOffset = getNavigationBarFrameHeight(rotation, uimode) + - getNavigationBarHeight(rotation, uimode); + if (navHeightOffset > 0) { + cf.bottom -= navHeightOffset; + sf.bottom -= navHeightOffset; + vf.bottom -= navHeightOffset; + dcf.bottom -= navHeightOffset; + } + } // IM dock windows always go to the bottom of the screen. attrs.gravity = Gravity.BOTTOM; @@ -2609,6 +2609,7 @@ public class DisplayPolicy { final int upsideDownRotation = displayRotation.getUpsideDownRotation(); final int landscapeRotation = displayRotation.getLandscapeRotation(); final int seascapeRotation = displayRotation.getSeascapeRotation(); + final int uiMode = mService.mPolicy.getUiMode(); if (hasStatusBar()) { mStatusBarHeightForRotation[portraitRotation] = @@ -2632,6 +2633,14 @@ public class DisplayPolicy { mNavigationBarHeightForRotationDefault[seascapeRotation] = res.getDimensionPixelSize(R.dimen.navigation_bar_height_landscape); + // Height of the navigation bar frame when presented horizontally at bottom + mNavigationBarFrameHeightForRotationDefault[portraitRotation] = + mNavigationBarFrameHeightForRotationDefault[upsideDownRotation] = + res.getDimensionPixelSize(R.dimen.navigation_bar_frame_height); + mNavigationBarFrameHeightForRotationDefault[landscapeRotation] = + mNavigationBarFrameHeightForRotationDefault[seascapeRotation] = + res.getDimensionPixelSize(R.dimen.navigation_bar_frame_height_landscape); + // Width of the navigation bar when presented vertically along one side mNavigationBarWidthForRotationDefault[portraitRotation] = mNavigationBarWidthForRotationDefault[upsideDownRotation] = @@ -2660,16 +2669,10 @@ public class DisplayPolicy { mSideGestureInset = res.getDimensionPixelSize(R.dimen.config_backGestureInset); mNavigationBarLetsThroughTaps = res.getBoolean(R.bool.config_navBarTapThrough); - // EXPERIMENT TODO(b/113952590): Remove once experiment in bug is completed - mExperiments.onConfigurationChanged(uiContext); - // EXPERIMENT END - - // EXPERIMENT: TODO(b/113952590): Replace with real code after experiment. - // This should calculate how much above the frame we accept gestures. Currently, - // we extend the frame to capture the gestures, so this is 0. - mBottomGestureAdditionalInset = mExperiments.getNavigationBarFrameHeight() - - mExperiments.getNavigationBarFrameHeight(); - // EXPERIMENT END + // This should calculate how much above the frame we accept gestures. + mBottomGestureAdditionalInset = Math.max(0, + res.getDimensionPixelSize(R.dimen.navigation_bar_gesture_height) + - getNavigationBarFrameHeight(portraitRotation, uiMode)); updateConfigurationAndScreenSizeDependentBehaviors(); mWindowOutsetBottom = ScreenShapeHelper.getWindowOutsetBottomPx(mContext.getResources()); @@ -2735,6 +2738,26 @@ public class DisplayPolicy { } /** + * Get the Navigation Bar Frame height. This dimension is the height of the navigation bar that + * is used for spacing to show additional buttons on the navigation bar (such as the ime + * switcher when ime is visible) while {@link #getNavigationBarHeight} is used for the visible + * height that we send to the app as content insets that can be smaller. + * <p> + * In car mode it will return the same height as {@link #getNavigationBarHeight} + * + * @param rotation specifies rotation to return dimension from + * @param uiMode to determine if in car mode + * @return navigation bar frame height + */ + private int getNavigationBarFrameHeight(int rotation, int uiMode) { + if (ALTERNATE_CAR_MODE_NAV_SIZE && (uiMode & UI_MODE_TYPE_MASK) == UI_MODE_TYPE_CAR) { + return mNavigationBarHeightForRotationInCarMode[rotation]; + } else { + return mNavigationBarFrameHeightForRotationDefault[rotation]; + } + } + + /** * Return the display height available after excluding any screen * decorations that could never be removed in Honeycomb. That is, system bar or * button bar. diff --git a/services/core/java/com/android/server/wm/NavigationBarExperiments.java b/services/core/java/com/android/server/wm/NavigationBarExperiments.java deleted file mode 100644 index bb3ff5ecc6fa..000000000000 --- a/services/core/java/com/android/server/wm/NavigationBarExperiments.java +++ /dev/null @@ -1,120 +0,0 @@ -/* - * Copyright (C) 2018 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.server.wm; - -import static android.view.WindowManager.LayoutParams.TYPE_INPUT_METHOD; -import static android.view.WindowManagerPolicyConstants.NAV_BAR_BOTTOM; -import static android.view.WindowManagerPolicyConstants.NAV_BAR_LEFT; -import static android.view.WindowManagerPolicyConstants.NAV_BAR_RIGHT; - -import android.content.Context; -import android.graphics.Rect; - -/** - * This class acts as a proxy for Navigation Bar experiments enabled with custom overlays - * {@see OverlayManagerService}. By default with no overlays, this class will essentially do nothing - * and pass the original resource data back. By default the navigation bar height/width is the same - * as the frame height/width and therefore any offsets calculated will cancel out and do nothing. - * TODO(b/113952590): Remove class once experiment in bug is completed - */ -public class NavigationBarExperiments { - - private int mNavigationBarHeight; - private int mNavigationBarWidth; - - /** - * This represents the height of the navigation bar buttons. With no experiments or overlays - * enabled, the frame height is the same as the normal navigation bar height. - */ - private int mNavigationBarFrameHeight; - - /** - * This represents the width of the navigation bar buttons. With no experiments or overlays - * enabled, the frame width is the same as the normal navigation bar width. - */ - private int mNavigationBarFrameWidth; - - /** - * Call when configuration change to refresh resource dimensions - * @param systemUiContext to get the resource values - */ - public void onConfigurationChanged(Context systemUiContext) { - // Cache all the values again - mNavigationBarHeight = systemUiContext.getResources().getDimensionPixelSize( - com.android.internal.R.dimen.navigation_bar_height); - mNavigationBarWidth = systemUiContext.getResources().getDimensionPixelSize( - com.android.internal.R.dimen.navigation_bar_width); - mNavigationBarFrameHeight = systemUiContext.getResources().getDimensionPixelSize( - com.android.internal.R.dimen.navigation_bar_frame_height); - mNavigationBarFrameWidth = systemUiContext.getResources().getDimensionPixelSize( - com.android.internal.R.dimen.navigation_bar_frame_width); - } - - public int getNavigationBarHeight() { - return mNavigationBarHeight; - } - - public int getNavigationBarWidth() { - return mNavigationBarWidth; - } - - public int getNavigationBarFrameHeight() { - return mNavigationBarFrameHeight; - } - - public int getNavigationBarFrameWidth() { - return mNavigationBarFrameWidth; - } - - /** - * If navigation frame width/height is different than navigation bar width/height then only - * offset the ime's and home activity's window rects depending on the navigation bar position to - * add a gap where the navigation bar would have been drawn. With no experiments or overlays - * enabled, the height/width is the same as the frame height/width and the offsets calculated - * will be 0 and this function will do nothing. - * @param navPosition position of navigation bar (left, right or bottom) - * @param w the window that is being offset by experiment - */ - public void offsetWindowFramesForNavBar(int navPosition, WindowState w) { - if (w.getAttrs().type != TYPE_INPUT_METHOD) { - return; - } - - final WindowFrames windowFrames = w.getWindowFrames(); - final Rect cf = windowFrames.mContentFrame; - switch (navPosition) { - case NAV_BAR_BOTTOM: - int navHeight = getNavigationBarFrameHeight() - getNavigationBarHeight(); - if (navHeight > 0) { - cf.bottom -= navHeight; - windowFrames.mStableFrame.bottom -= navHeight; - } - break; - case NAV_BAR_LEFT: - case NAV_BAR_RIGHT: - int navWidth = getNavigationBarFrameWidth() - getNavigationBarWidth(); - if (navWidth > 0) { - if (navPosition == NAV_BAR_LEFT) { - cf.left += navWidth; - } else { - cf.right -= navWidth; - } - } - break; - } - } -} |