diff --git a/quickstep/src/com/android/launcher3/taskbar/TaskbarActivityContext.java b/quickstep/src/com/android/launcher3/taskbar/TaskbarActivityContext.java index cb9c329c77..f7f3bfde47 100644 --- a/quickstep/src/com/android/launcher3/taskbar/TaskbarActivityContext.java +++ b/quickstep/src/com/android/launcher3/taskbar/TaskbarActivityContext.java @@ -146,7 +146,7 @@ public class TaskbarActivityContext extends BaseTaskbarContext { private int mLastRequestedNonFullscreenHeight; private NavigationMode mNavMode; - private final boolean mImeDrawsImeNavBar; + private boolean mImeDrawsImeNavBar; private final ViewCache mViewCache = new ViewCache(); private final boolean mIsSafeModeEnabled; @@ -299,6 +299,7 @@ public class TaskbarActivityContext extends BaseTaskbarContext { public void init(@NonNull TaskbarSharedState sharedState) { + mImeDrawsImeNavBar = getBoolByName(IME_DRAWS_IME_NAV_BAR_RES_NAME, getResources(), false); mLastRequestedNonFullscreenHeight = getDefaultTaskbarWindowHeight(); mWindowLayoutParams = createAllWindowParams(); diff --git a/quickstep/src/com/android/launcher3/taskbar/TaskbarInsetsController.kt b/quickstep/src/com/android/launcher3/taskbar/TaskbarInsetsController.kt index 68ea4756f5..a935bac2a0 100644 --- a/quickstep/src/com/android/launcher3/taskbar/TaskbarInsetsController.kt +++ b/quickstep/src/com/android/launcher3/taskbar/TaskbarInsetsController.kt @@ -94,26 +94,12 @@ class TaskbarInsetsController(val context: TaskbarActivityContext) : LoggableTas } else { 0 } - if (context.isGestureNav) { - windowLayoutParams.providedInsets = - arrayOf( - InsetsFrameProvider(insetsOwner, 0, navigationBars()) - .setFlags( - FLAG_SUPPRESS_SCRIM or insetsRoundedCornerFlag, - FLAG_SUPPRESS_SCRIM or FLAG_INSETS_ROUNDED_CORNER - ), - InsetsFrameProvider(insetsOwner, 0, tappableElement()), - InsetsFrameProvider(insetsOwner, 0, mandatorySystemGestures()), - InsetsFrameProvider(insetsOwner, INDEX_LEFT, systemGestures()) - .setSource(SOURCE_DISPLAY), - InsetsFrameProvider(insetsOwner, INDEX_RIGHT, systemGestures()) - .setSource(SOURCE_DISPLAY) - ) - } else { - windowLayoutParams.providedInsets = getButtonNavInsets(insetsRoundedCornerFlag) + + windowLayoutParams.providedInsets = getProvidedInsets(insetsRoundedCornerFlag) + if (!context.isGestureNav) { if (windowLayoutParams.paramsForRotation != null) { for (layoutParams in windowLayoutParams.paramsForRotation) { - layoutParams.providedInsets = getButtonNavInsets(insetsRoundedCornerFlag) + layoutParams.providedInsets = getProvidedInsets(insetsRoundedCornerFlag) } } } @@ -165,15 +151,28 @@ class TaskbarInsetsController(val context: TaskbarActivityContext) : LoggableTas context.notifyUpdateLayoutParams() } - private fun getButtonNavInsets(insetsRoundedCornerFlag: Int): Array { + /** + * The inset types and number of insets provided have to match for both gesture nav and button + * nav. The values and the order of the elements in array are allowed to differ. + * Reason being WM does not allow types and number of insets changing for a given window once it + * is added into the hierarchy for performance reasons. + */ + private fun getProvidedInsets(insetsRoundedCornerFlag: Int): Array { + val navBarsFlag = + (if (context.isGestureNav) FLAG_SUPPRESS_SCRIM else 0) or insetsRoundedCornerFlag return arrayOf( - InsetsFrameProvider(insetsOwner, 0, navigationBars()) + InsetsFrameProvider(insetsOwner, 0, navigationBars()) .setFlags( - insetsRoundedCornerFlag, - (FLAG_SUPPRESS_SCRIM or FLAG_INSETS_ROUNDED_CORNER) + navBarsFlag, + FLAG_SUPPRESS_SCRIM or FLAG_INSETS_ROUNDED_CORNER ), - InsetsFrameProvider(insetsOwner, 0, tappableElement()), - InsetsFrameProvider(insetsOwner, 0, mandatorySystemGestures())) + InsetsFrameProvider(insetsOwner, 0, tappableElement()), + InsetsFrameProvider(insetsOwner, 0, mandatorySystemGestures()), + InsetsFrameProvider(insetsOwner, INDEX_LEFT, systemGestures()) + .setSource(SOURCE_DISPLAY), + InsetsFrameProvider(insetsOwner, INDEX_RIGHT, systemGestures()) + .setSource(SOURCE_DISPLAY) + ) } private fun setProviderInsets(provider: InsetsFrameProvider, gravity: Int) { @@ -181,47 +180,45 @@ class TaskbarInsetsController(val context: TaskbarActivityContext) : LoggableTas val tappableHeight = controllers.taskbarStashController.tappableHeightToReportToApps val res = context.resources if (provider.type == navigationBars() || provider.type == mandatorySystemGestures()) { - provider.insetsSize = getInsetsByNavMode(contentHeight, gravity) + provider.insetsSize = getInsetsForGravity(contentHeight, gravity) } else if (provider.type == tappableElement()) { - provider.insetsSize = getInsetsByNavMode(tappableHeight, gravity) + provider.insetsSize = getInsetsForGravity(tappableHeight, gravity) } else if (provider.type == systemGestures() && provider.index == INDEX_LEFT) { - provider.insetsSize = - Insets.of( - gestureNavSettingsObserver.getLeftSensitivityForCallingUser(res), - 0, - 0, - 0 - ) + val leftIndexInset = + if (context.isThreeButtonNav) 0 + else gestureNavSettingsObserver.getLeftSensitivityForCallingUser(res) + provider.insetsSize = Insets.of(leftIndexInset, 0, 0, 0) } else if (provider.type == systemGestures() && provider.index == INDEX_RIGHT) { - provider.insetsSize = - Insets.of( - 0, - 0, - gestureNavSettingsObserver.getRightSensitivityForCallingUser(res), - 0 - ) + val rightIndexInset = + if (context.isThreeButtonNav) 0 + else gestureNavSettingsObserver.getRightSensitivityForCallingUser(res) + provider.insetsSize = Insets.of(0, 0, rightIndexInset, 0) } - val imeInsetsSize = getInsetsByNavMode(taskbarHeightForIme, gravity) - val insetsSizeOverride = + + val imeInsetsSize = getInsetsForGravity(taskbarHeightForIme, gravity) + val imeInsetsSizeOverride = arrayOf( InsetsFrameProvider.InsetsSizeOverride(TYPE_INPUT_METHOD, imeInsetsSize), ) // Use 0 tappableElement insets for the VoiceInteractionWindow when gesture nav is enabled. - val visInsetsSizeForGestureNavTappableElement = getInsetsByNavMode(0, gravity) - val insetsSizeOverrideForGestureNavTappableElement = + val visInsetsSizeForTappableElement = + if (context.isGestureNav) getInsetsForGravity(0, gravity) + else getInsetsForGravity(tappableHeight, gravity) + val insetsSizeOverrideForTappableElement = arrayOf( InsetsFrameProvider.InsetsSizeOverride(TYPE_INPUT_METHOD, imeInsetsSize), InsetsFrameProvider.InsetsSizeOverride( TYPE_VOICE_INTERACTION, - visInsetsSizeForGestureNavTappableElement + visInsetsSizeForTappableElement ), ) - if (context.isGestureNav && provider.type == tappableElement()) { - provider.insetsSizeOverrides = insetsSizeOverrideForGestureNavTappableElement + if ((context.isGestureNav || TaskbarManager.FLAG_HIDE_NAVBAR_WINDOW) + && provider.type == tappableElement()) { + provider.insetsSizeOverrides = insetsSizeOverrideForTappableElement } else if (provider.type != systemGestures()) { // We only override insets at the bottom of the screen - provider.insetsSizeOverrides = insetsSizeOverride + provider.insetsSizeOverrides = imeInsetsSizeOverride } } @@ -229,14 +226,14 @@ class TaskbarInsetsController(val context: TaskbarActivityContext) : LoggableTas * @return [Insets] where the [inset] is either used as a bottom inset or * right/left inset if using 3 button nav */ - private fun getInsetsByNavMode(inset: Int, gravity: Int): Insets { - if ((gravity and Gravity.BOTTOM) != 0) { + private fun getInsetsForGravity(inset: Int, gravity: Int): Insets { + if ((gravity and Gravity.BOTTOM) == Gravity.BOTTOM) { // Taskbar or portrait phone mode return Insets.of(0, 0, 0, inset) } // TODO(b/230394142): seascape - val isSeascape = (gravity and Gravity.START) != 0 + val isSeascape = (gravity and Gravity.START) == Gravity.START val leftInset = if (isSeascape) inset else 0 val rightInset = if (isSeascape) 0 else inset return Insets.of(leftInset , 0, rightInset, 0) diff --git a/quickstep/src/com/android/launcher3/taskbar/TaskbarStashController.java b/quickstep/src/com/android/launcher3/taskbar/TaskbarStashController.java index 5e37cf4cf5..b5b453be82 100644 --- a/quickstep/src/com/android/launcher3/taskbar/TaskbarStashController.java +++ b/quickstep/src/com/android/launcher3/taskbar/TaskbarStashController.java @@ -338,7 +338,6 @@ public class TaskbarStashController implements TaskbarControllers.LoggableTaskba // us that we're paused until a bit later. This avoids flickering upon recreating taskbar. updateStateForFlag(FLAG_IN_APP, true); applyState(/* duration = */ 0); - notifyStashChange(/* visible */ false, /* stashed */ isStashedInApp()); } @@ -675,7 +674,10 @@ public class TaskbarStashController implements TaskbarControllers.LoggableTaskba .setDuration(duration)); mAnimator.play(mTaskbarImeBgAlpha.animateToValue( hasAnyFlag(FLAG_STASHED_IN_APP_IME) ? 0 : 1).setDuration(duration)); - mAnimator.addListener(AnimatorListeners.forEndCallback(() -> mAnimator = null)); + mAnimator.addListener(AnimatorListeners.forEndCallback(() -> { + mAnimator = null; + mIsStashed = isStashed; + })); return; } diff --git a/quickstep/src/com/android/launcher3/taskbar/navbutton/NavButtonLayoutFactory.kt b/quickstep/src/com/android/launcher3/taskbar/navbutton/NavButtonLayoutFactory.kt index 7db2320216..5c7f2be2e0 100644 --- a/quickstep/src/com/android/launcher3/taskbar/navbutton/NavButtonLayoutFactory.kt +++ b/quickstep/src/com/android/launcher3/taskbar/navbutton/NavButtonLayoutFactory.kt @@ -67,6 +67,7 @@ class NavButtonLayoutFactory { val startContextualContainer = navButtonsView.findViewById(ID_START_CONTEXTUAL_BUTTONS) val isPhoneNavMode = phoneMode && isThreeButtonNav + val isPhoneGestureMode = phoneMode && !isThreeButtonNav return when { isPhoneNavMode -> { if (!deviceProfile.isLandscape) { @@ -92,6 +93,14 @@ class NavButtonLayoutFactory { ) } } + isPhoneGestureMode ->{ + PhoneGestureLayoutter( + resources, + navButtonContainer, + endContextualContainer, + startContextualContainer + ) + } deviceProfile.isTaskbarPresent -> { return when { isInSetup -> { diff --git a/quickstep/src/com/android/launcher3/taskbar/navbutton/PhoneGestureLayoutter.kt b/quickstep/src/com/android/launcher3/taskbar/navbutton/PhoneGestureLayoutter.kt new file mode 100644 index 0000000000..8525c6c90c --- /dev/null +++ b/quickstep/src/com/android/launcher3/taskbar/navbutton/PhoneGestureLayoutter.kt @@ -0,0 +1,41 @@ +/* + * Copyright (C) 2023 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.launcher3.taskbar.navbutton + +import android.content.res.Resources +import android.view.ViewGroup +import android.widget.LinearLayout +import com.android.launcher3.DeviceProfile + +/** Layoutter for showing gesture navigation on phone screen. No buttons here, no-op container */ +class PhoneGestureLayoutter( + resources: Resources, + navBarContainer: LinearLayout, + endContextualContainer: ViewGroup, + startContextualContainer: ViewGroup +) : + AbstractNavButtonLayoutter( + resources, + navBarContainer, + endContextualContainer, + startContextualContainer + ) { + + override fun layoutButtons(dp: DeviceProfile, isContextualButtonShowing: Boolean) { + // no-op + } +}