Loading core/res/res/values/dimens.xml +7 −2 Original line number Diff line number Diff line Loading @@ -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> Loading core/res/res/values/symbols.xml +2 −0 Original line number Diff line number Diff line Loading @@ -1747,6 +1747,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" /> Loading services/core/java/com/android/server/wm/DisplayPolicy.java +54 −31 Original line number Diff line number Diff line Loading @@ -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; Loading @@ -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; Loading Loading @@ -1621,11 +1620,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); Loading @@ -1648,11 +1645,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); Loading @@ -1675,11 +1668,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); Loading Loading @@ -1887,10 +1876,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; Loading Loading @@ -2623,6 +2623,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] = Loading @@ -2646,6 +2647,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] = Loading Loading @@ -2674,16 +2683,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()); Loading Loading @@ -2748,6 +2751,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 Loading services/core/java/com/android/server/wm/NavigationBarExperiments.javadeleted 100644 → 0 +0 −120 Original line number Diff line number Diff line /* * 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; } } } Loading
core/res/res/values/dimens.xml +7 −2 Original line number Diff line number Diff line Loading @@ -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> Loading
core/res/res/values/symbols.xml +2 −0 Original line number Diff line number Diff line Loading @@ -1747,6 +1747,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" /> Loading
services/core/java/com/android/server/wm/DisplayPolicy.java +54 −31 Original line number Diff line number Diff line Loading @@ -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; Loading @@ -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; Loading Loading @@ -1621,11 +1620,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); Loading @@ -1648,11 +1645,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); Loading @@ -1675,11 +1668,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); Loading Loading @@ -1887,10 +1876,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; Loading Loading @@ -2623,6 +2623,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] = Loading @@ -2646,6 +2647,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] = Loading Loading @@ -2674,16 +2683,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()); Loading Loading @@ -2748,6 +2751,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 Loading
services/core/java/com/android/server/wm/NavigationBarExperiments.javadeleted 100644 → 0 +0 −120 Original line number Diff line number Diff line /* * 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; } } }