Merge "Ensure matching insets for taskbar gesture and 3 button nav" into udc-qpr-dev am: 3adfa41951

Original change: https://googleplex-android-review.googlesource.com/c/platform/packages/apps/Launcher3/+/24139629

Change-Id: I7b5fd049ab44f90cb165e92fbdb9e6da43eb7add
Signed-off-by: Automerger Merge Worker <android-build-automerger-merge-worker@system.gserviceaccount.com>
This commit is contained in:
Vinit Nayak
2023-08-03 01:20:44 +00:00
committed by Automerger Merge Worker
5 changed files with 104 additions and 54 deletions

View File

@@ -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();

View File

@@ -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<InsetsFrameProvider> {
/**
* 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<InsetsFrameProvider> {
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)

View File

@@ -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;
}

View File

@@ -67,6 +67,7 @@ class NavButtonLayoutFactory {
val startContextualContainer =
navButtonsView.findViewById<ViewGroup>(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 -> {

View File

@@ -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
}
}