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

Commit a7f24bca authored by Matthew Ng's avatar Matthew Ng
Browse files

Removed the experimental code for gestural mode

Removing the experimental code that separated the navigation bar window
height/width and the visual height/width. Also added a gesture inset
to calculate the difference between navigation bar window and the
gesture size.

Bug: 113952590
Test: manual
Change-Id: I925bd1a4a412786f5fe1fc48ed756e3699cbaf65
parent 85a99c39
Loading
Loading
Loading
Loading
+7 −2
Original line number Diff line number Diff line
@@ -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>
+2 −0
Original line number Diff line number Diff line
@@ -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" />
+54 −31
Original line number Diff line number Diff line
@@ -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());
@@ -2734,6 +2737,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
+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;
        }
    }
}