Add tests for TaskbarStashController.

Test: TaskbarStashControllerTest
Bug: 346394503
Flag: TEST_ONLY
Change-Id: I930e745826f2512d04434ad689a3e42cac7e9901
This commit is contained in:
Brian Isganitis
2024-07-15 14:19:01 -04:00
parent c2c7913134
commit 3231ba01e6
4 changed files with 734 additions and 15 deletions
@@ -82,6 +82,8 @@ public class TaskbarStashController implements TaskbarControllers.LoggableTaskba
private static final String TAG = "TaskbarStashController";
private static final boolean DEBUG = false;
private static boolean sEnableSoftwareImeForTests = false;
/**
* Def. value for @param shouldBubblesFollow in
* {@link #updateAndAnimateTransientTaskbar(boolean)} */
@@ -131,19 +133,22 @@ public class TaskbarStashController implements TaskbarControllers.LoggableTaskba
*
* Use {@link #getStashDuration()} to query duration
*/
private static final long TASKBAR_STASH_DURATION = InsetsController.ANIMATION_DURATION_RESIZE;
@VisibleForTesting
static final long TASKBAR_STASH_DURATION = InsetsController.ANIMATION_DURATION_RESIZE;
/**
* How long to stash/unstash transient taskbar.
*
* Use {@link #getStashDuration()} to query duration.
*/
private static final long TRANSIENT_TASKBAR_STASH_DURATION = 417;
@VisibleForTesting
static final long TRANSIENT_TASKBAR_STASH_DURATION = 417;
/**
* How long to stash/unstash when keyboard is appearing/disappearing.
*/
private static final long TASKBAR_STASH_DURATION_FOR_IME = 80;
@VisibleForTesting
static final long TASKBAR_STASH_DURATION_FOR_IME = 80;
/**
* The scale TaskbarView animates to when being stashed.
@@ -164,7 +169,7 @@ public class TaskbarStashController implements TaskbarControllers.LoggableTaskba
/**
* How long the icon/stash handle alpha animation plays.
*/
public static final long TASKBAR_STASH_ALPHA_DURATION = 50;
public static final long TRANSIENT_TASKBAR_STASH_ALPHA_DURATION = 50;
/**
* How long to delay the icon/stash handle alpha for the home to app taskbar animation.
@@ -254,7 +259,7 @@ public class TaskbarStashController implements TaskbarControllers.LoggableTaskba
private boolean mEnableBlockingTimeoutDuringTests = false;
private Animator mTaskbarBackgroundAlphaAnimator;
private long mTaskbarBackgroundDuration;
private final long mTaskbarBackgroundDuration;
private boolean mUserIsNotGoingHome = false;
// Evaluate whether the handle should be stashed
@@ -801,14 +806,14 @@ public class TaskbarStashController implements TaskbarControllers.LoggableTaskba
if (animationType == TRANSITION_HANDLE_FADE) {
// When fading, the handle fades in/out at the beginning of the transition with
// TASKBAR_STASH_ALPHA_DURATION.
backgroundAndHandleAlphaDuration = TASKBAR_STASH_ALPHA_DURATION;
backgroundAndHandleAlphaDuration = TRANSIENT_TASKBAR_STASH_ALPHA_DURATION;
// The iconAlphaDuration must be set to duration for the skippable interpolators
// below to work.
iconAlphaDuration = duration;
} else {
iconAlphaStartDelay = TASKBAR_STASH_ALPHA_START_DELAY;
iconAlphaDuration = TASKBAR_STASH_ALPHA_DURATION;
backgroundAndHandleAlphaDuration = TASKBAR_STASH_ALPHA_DURATION;
iconAlphaDuration = TRANSIENT_TASKBAR_STASH_ALPHA_DURATION;
backgroundAndHandleAlphaDuration = TRANSIENT_TASKBAR_STASH_ALPHA_DURATION;
if (isStashed) {
if (animationType == TRANSITION_HOME_TO_APP) {
@@ -1084,7 +1089,8 @@ public class TaskbarStashController implements TaskbarControllers.LoggableTaskba
/**
* When hiding the IME, delay the unstash animation to align with the end of the transition.
*/
private long getTaskbarStashStartDelayForIme() {
@VisibleForTesting
long getTaskbarStashStartDelayForIme() {
if (mIsImeShowing) {
// Only delay when IME is exiting, not entering.
return 0;
@@ -1144,13 +1150,13 @@ public class TaskbarStashController implements TaskbarControllers.LoggableTaskba
}
// Do not stash if pinned taskbar, hardware keyboard is attached and no IME is docked
if (mActivity.isHardwareKeyboard() && DisplayController.isPinnedTaskbar(mActivity)
if (isHardwareKeyboard() && DisplayController.isPinnedTaskbar(mActivity)
&& !mActivity.isImeDocked()) {
return false;
}
// Do not stash if hardware keyboard is attached, in 3 button nav and desktop windowing mode
if (mActivity.isHardwareKeyboard()
if (isHardwareKeyboard()
&& mActivity.isThreeButtonNav()
&& mControllers.taskbarDesktopModeController.getAreDesktopTasksVisible()) {
return false;
@@ -1164,6 +1170,21 @@ public class TaskbarStashController implements TaskbarControllers.LoggableTaskba
return mIsImeShowing || mIsImeSwitcherShowing;
}
private boolean isHardwareKeyboard() {
return mActivity.isHardwareKeyboard() && !sEnableSoftwareImeForTests;
}
/**
* Overrides {@link #isHardwareKeyboard()} to {@code false} for testing, if enabled.
* <p>
* Virtual devices are sometimes in hardware keyboard mode, leading to an inconsistent
* testing environment.
*/
@VisibleForTesting
static void enableSoftwareImeForTests(boolean enable) {
sEnableSoftwareImeForTests = enable;
}
/**
* Updates the proper flag to indicate whether the task bar should be stashed.
*
@@ -1289,7 +1310,7 @@ public class TaskbarStashController implements TaskbarControllers.LoggableTaskba
/**
* Attempts to start timer to auto hide the taskbar based on time.
*/
public void tryStartTaskbarTimeout() {
private void tryStartTaskbarTimeout() {
if (!DisplayController.isTransientTaskbar(mActivity)
|| mIsStashed
|| mEnableBlockingTimeoutDuringTests) {
@@ -1317,6 +1338,11 @@ public class TaskbarStashController implements TaskbarControllers.LoggableTaskba
updateAndAnimateTransientTaskbarForTimeout();
}
@VisibleForTesting
Alarm getTimeoutAlarm() {
return mTimeoutAlarm;
}
@Override
public void dumpLogs(String prefix, PrintWriter pw) {
pw.println(prefix + "TaskbarStashController:");
@@ -32,8 +32,8 @@ import com.android.launcher3.R
import com.android.launcher3.anim.AnimatedFloat
import com.android.launcher3.anim.SpringAnimationBuilder
import com.android.launcher3.taskbar.TaskbarInsetsController
import com.android.launcher3.taskbar.TaskbarStashController.TASKBAR_STASH_ALPHA_DURATION
import com.android.launcher3.taskbar.TaskbarStashController.TASKBAR_STASH_ALPHA_START_DELAY
import com.android.launcher3.taskbar.TaskbarStashController.TRANSIENT_TASKBAR_STASH_ALPHA_DURATION
import com.android.launcher3.taskbar.bubbles.BubbleBarViewController
import com.android.launcher3.taskbar.bubbles.BubbleStashedHandleViewController
import com.android.launcher3.taskbar.bubbles.stashing.BubbleStashController.Companion.BAR_STASH_DURATION
@@ -305,7 +305,8 @@ class TransientBubbleStashController(
animatorSet.play(
createBackgroundAlphaAnimator(isStashed).apply {
val alphaDuration = if (isStashed) duration else TASKBAR_STASH_ALPHA_DURATION
val alphaDuration =
if (isStashed) duration else TRANSIENT_TASKBAR_STASH_ALPHA_DURATION
val alphaDelay = if (isStashed) TASKBAR_STASH_ALPHA_START_DELAY else 0L
this.duration = max(0L, alphaDuration - alphaDelay)
this.startDelay = alphaDelay
@@ -317,7 +318,7 @@ class TransientBubbleStashController(
bubbleBarBubbleAlpha
.animateToValue(getBarAlphaStart(isStashed), getBarAlphaEnd(isStashed))
.apply {
this.duration = TASKBAR_STASH_ALPHA_DURATION
this.duration = TRANSIENT_TASKBAR_STASH_ALPHA_DURATION
this.startDelay = TASKBAR_STASH_ALPHA_START_DELAY
this.interpolator = LINEAR
}
@@ -0,0 +1,681 @@
/*
* Copyright (C) 2024 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
import android.animation.AnimatorTestRule
import android.platform.test.annotations.EnableFlags
import androidx.test.platform.app.InstrumentationRegistry.getInstrumentation
import com.android.launcher3.R
import com.android.launcher3.taskbar.StashedHandleViewController.ALPHA_INDEX_STASHED
import com.android.launcher3.taskbar.TaskbarAutohideSuspendController.FLAG_AUTOHIDE_SUSPEND_EDU_OPEN
import com.android.launcher3.taskbar.TaskbarStashController.FLAG_IN_APP
import com.android.launcher3.taskbar.TaskbarStashController.FLAG_IN_OVERVIEW
import com.android.launcher3.taskbar.TaskbarStashController.FLAG_IN_STASHED_LAUNCHER_STATE
import com.android.launcher3.taskbar.TaskbarStashController.FLAG_STASHED_DEVICE_LOCKED
import com.android.launcher3.taskbar.TaskbarStashController.FLAG_STASHED_IME
import com.android.launcher3.taskbar.TaskbarStashController.FLAG_STASHED_IN_APP_AUTO
import com.android.launcher3.taskbar.TaskbarStashController.FLAG_STASHED_SMALL_SCREEN
import com.android.launcher3.taskbar.TaskbarStashController.FLAG_STASHED_SYSUI
import com.android.launcher3.taskbar.TaskbarStashController.TASKBAR_STASH_DURATION
import com.android.launcher3.taskbar.TaskbarStashController.TASKBAR_STASH_DURATION_FOR_IME
import com.android.launcher3.taskbar.TaskbarStashController.TRANSIENT_TASKBAR_STASH_ALPHA_DURATION
import com.android.launcher3.taskbar.TaskbarStashController.TRANSIENT_TASKBAR_STASH_DURATION
import com.android.launcher3.taskbar.TaskbarViewController.ALPHA_INDEX_STASH
import com.android.launcher3.taskbar.bubbles.BubbleControllers
import com.android.launcher3.taskbar.rules.TaskbarModeRule
import com.android.launcher3.taskbar.rules.TaskbarModeRule.Mode.PINNED
import com.android.launcher3.taskbar.rules.TaskbarModeRule.Mode.THREE_BUTTONS
import com.android.launcher3.taskbar.rules.TaskbarModeRule.Mode.TRANSIENT
import com.android.launcher3.taskbar.rules.TaskbarModeRule.TaskbarMode
import com.android.launcher3.taskbar.rules.TaskbarPinningPreferenceRule
import com.android.launcher3.taskbar.rules.TaskbarUnitTestRule
import com.android.launcher3.taskbar.rules.TaskbarUnitTestRule.InjectController
import com.android.launcher3.taskbar.rules.TaskbarUnitTestRule.UserSetupMode
import com.android.launcher3.taskbar.rules.TaskbarWindowSandboxContext
import com.android.launcher3.util.LauncherMultivalentJUnit
import com.android.launcher3.util.LauncherMultivalentJUnit.EmulatedDevices
import com.android.systemui.shared.system.QuickStepContract.SYSUI_STATE_BUBBLES_EXPANDED
import com.android.systemui.shared.system.QuickStepContract.SYSUI_STATE_IME_SHOWING
import com.android.wm.shell.Flags.FLAG_ENABLE_BUBBLE_BAR
import com.google.common.truth.Truth.assertThat
import java.util.Optional
import org.junit.After
import org.junit.Before
import org.junit.Rule
import org.junit.Test
import org.junit.runner.RunWith
@RunWith(LauncherMultivalentJUnit::class)
@EmulatedDevices(["pixelTablet2023"])
class TaskbarStashControllerTest {
private val context = TaskbarWindowSandboxContext.create(getInstrumentation().targetContext)
@get:Rule(order = 0) val taskbarModeRule = TaskbarModeRule(context)
@get:Rule(order = 1) val taskbarPinningPreferenceRule = TaskbarPinningPreferenceRule(context)
@get:Rule(order = 2) val animatorTestRule = AnimatorTestRule(this)
@get:Rule(order = 3) val taskbarUnitTestRule = TaskbarUnitTestRule(this, context)
@InjectController lateinit var stashController: TaskbarStashController
@InjectController lateinit var viewController: TaskbarViewController
@InjectController lateinit var stashedHandleViewController: StashedHandleViewController
@InjectController lateinit var dragLayerController: TaskbarDragLayerController
@InjectController lateinit var autohideSuspendController: TaskbarAutohideSuspendController
@InjectController lateinit var bubbleControllers: Optional<BubbleControllers>
private val activityContext by taskbarUnitTestRule::activityContext
// Disable hardware keyboard mode during tests.
@Before fun enableSoftwareIme() = TaskbarStashController.enableSoftwareImeForTests(true)
@After fun resetIme() = TaskbarStashController.enableSoftwareImeForTests(false)
@After fun cancelTimeoutIfExists() = stashController.cancelTimeoutIfExists()
@Test
@TaskbarMode(TRANSIENT)
fun testInit_transientMode_stashedInApp() {
assertThat(stashController.isStashedInApp).isTrue()
}
@Test
@TaskbarMode(PINNED)
fun testInit_pinnedMode_unstashedInApp() {
assertThat(stashController.isStashedInApp).isFalse()
}
@Test
@UserSetupMode
@TaskbarMode(PINNED)
fun testInit_userSetupWithPinnedMode_stashedInApp() {
assertThat(stashController.isStashedInApp).isTrue()
}
@Test
@TaskbarMode(PINNED)
fun testSetSetupUiVisible_true_stashedInApp() {
getInstrumentation().runOnMainSync { stashController.setSetupUIVisible(true) }
assertThat(stashController.isStashedInApp).isTrue()
}
@Test
@TaskbarMode(PINNED)
fun testSetSetupUiVisible_false_unstashedInApp() {
getInstrumentation().runOnMainSync { stashController.setSetupUIVisible(false) }
assertThat(stashController.isStashedInApp).isFalse()
}
@Test
fun testRecreateAsTransient_timeoutStarted() {
taskbarPinningPreferenceRule.isPinned = true
activityContext.controllers.sharedState?.taskbarWasPinned = true
taskbarPinningPreferenceRule.isPinned = false
assertThat(stashController.timeoutAlarm.alarmPending()).isTrue()
}
@Test
@TaskbarMode(TRANSIENT)
fun testSupportsVisualStashing_transientMode_supported() {
assertThat(stashController.supportsVisualStashing()).isTrue()
}
@Test
@TaskbarMode(PINNED)
fun testSupportsVisualStashing_pinnedMode_supported() {
assertThat(stashController.supportsVisualStashing()).isTrue()
}
@Test
@TaskbarMode(THREE_BUTTONS)
fun testSupportsVisualStashing_threeButtonsMode_unsupported() {
assertThat(stashController.supportsVisualStashing()).isFalse()
}
@Test
@TaskbarMode(TRANSIENT)
fun testGetStashDuration_transientMode() {
assertThat(stashController.stashDuration).isEqualTo(TRANSIENT_TASKBAR_STASH_DURATION)
}
@Test
@TaskbarMode(PINNED)
fun testGetStashDuration_pinnedMode() {
assertThat(stashController.stashDuration).isEqualTo(TASKBAR_STASH_DURATION)
}
@Test
@TaskbarMode(PINNED)
fun testIsStashed_pinnedInApp_isUnstashed() {
getInstrumentation().runOnMainSync {
stashController.updateStateForFlag(FLAG_IN_APP, true)
stashController.applyState(0)
}
assertThat(stashController.isStashed).isFalse()
}
@Test
@TaskbarMode(TRANSIENT)
fun testIsStashed_transientInApp_isStashed() {
getInstrumentation().runOnMainSync {
stashController.updateStateForFlag(FLAG_IN_APP, true)
stashController.applyState(0)
}
assertThat(stashController.isStashed).isTrue()
}
@Test
@TaskbarMode(TRANSIENT)
fun testIsStashed_transientNotInApp_isUnstashed() {
getInstrumentation().runOnMainSync {
stashController.updateStateForFlag(FLAG_IN_APP, false)
stashController.applyState(0)
}
assertThat(stashController.isStashed).isFalse()
}
@Test
fun testIsStashed_stashedInLauncherState_isStashed() {
getInstrumentation().runOnMainSync {
stashController.updateStateForFlag(FLAG_IN_APP, false)
stashController.updateStateForFlag(FLAG_IN_STASHED_LAUNCHER_STATE, true)
stashController.applyState(0)
}
assertThat(stashController.isStashed).isTrue()
}
@Test
@TaskbarMode(TRANSIENT)
fun testIsStashed_transientInOverview_isUnstashed() {
getInstrumentation().runOnMainSync {
stashController.updateStateForFlag(FLAG_IN_APP, false)
stashController.updateStateForFlag(FLAG_IN_OVERVIEW, true)
stashController.applyState(0)
}
assertThat(stashController.isStashed).isFalse()
}
@Test
@TaskbarMode(PINNED)
fun testIsStashed_pinnedInOverviewWithIme_isStashed() {
getInstrumentation().runOnMainSync {
stashController.updateStateForFlag(FLAG_IN_APP, false)
stashController.updateStateForFlag(FLAG_IN_OVERVIEW, true)
stashController.updateStateForFlag(FLAG_STASHED_IME, true)
stashController.applyState(0)
}
assertThat(stashController.isStashed).isTrue()
}
@Test
@TaskbarMode(PINNED)
fun testIsStashed_pinnedTaskbarWithPinnedApp_isStashed() {
getInstrumentation().runOnMainSync {
stashController.updateStateForFlag(FLAG_IN_APP, true)
stashController.updateStateForFlag(FLAG_STASHED_SYSUI, true) // App pinned.
stashController.applyState(0)
}
assertThat(stashController.isStashed).isTrue()
}
@Test
fun testIsInStashedLauncherState_flagUnset_false() {
stashController.updateStateForFlag(FLAG_IN_STASHED_LAUNCHER_STATE, false)
assertThat(stashController.isInStashedLauncherState).isFalse()
}
@Test
@TaskbarMode(THREE_BUTTONS)
fun testIsInStashedLauncherState_flagSetInThreeButtonsMode_false() {
stashController.updateStateForFlag(FLAG_IN_STASHED_LAUNCHER_STATE, true)
assertThat(stashController.isInStashedLauncherState).isFalse()
}
@Test
@TaskbarMode(PINNED)
fun testIsInStashedLauncherState_flagSetInPinnedMode_true() {
stashController.updateStateForFlag(FLAG_IN_STASHED_LAUNCHER_STATE, true)
assertThat(stashController.isInStashedLauncherState).isTrue()
}
@Test
@TaskbarMode(PINNED)
fun testIsTaskbarVisibleAndNotStashing_pinnedButNotVisible_false() {
getInstrumentation().runOnMainSync {
viewController.taskbarIconAlpha.get(ALPHA_INDEX_STASH).value = 0f
}
assertThat(stashController.isTaskbarVisibleAndNotStashing).isFalse()
}
@Test
@TaskbarMode(TRANSIENT)
fun testIsTaskbarVisibleAndNotStashing_visibleButStashed_false() {
getInstrumentation().runOnMainSync {
viewController.taskbarIconAlpha.get(ALPHA_INDEX_STASH).value = 1f
}
assertThat(stashController.isTaskbarVisibleAndNotStashing).isFalse()
}
@Test
@TaskbarMode(PINNED)
fun testIsTaskbarVisibleAndNotStashing_pinnedAndVisible_true() {
getInstrumentation().runOnMainSync {
viewController.taskbarIconAlpha.get(ALPHA_INDEX_STASH).value = 1f
}
assertThat(stashController.isTaskbarVisibleAndNotStashing).isTrue()
}
@Test
@TaskbarMode(TRANSIENT)
fun testGetTouchableHeight_isStashed_stashedHeight() {
assertThat(stashController.touchableHeight).isEqualTo(stashController.stashedHeight)
}
@Test
@TaskbarMode(TRANSIENT)
fun testGetTouchableHeight_unstashedTransientMode_heightAndBottomMargin() {
getInstrumentation().runOnMainSync {
stashController.updateStateForFlag(FLAG_STASHED_IN_APP_AUTO, false)
stashController.applyState(0)
}
val expectedHeight =
activityContext.deviceProfile.run { taskbarHeight + taskbarBottomMargin }
assertThat(stashController.touchableHeight).isEqualTo(expectedHeight)
}
@Test
@TaskbarMode(PINNED)
fun testGetTouchableHeight_pinnedMode_taskbarHeight() {
assertThat(stashController.touchableHeight)
.isEqualTo(activityContext.deviceProfile.taskbarHeight)
}
@Test
@TaskbarMode(TRANSIENT)
fun testGetContentHeightToReportToApps_transientMode_stashedHeight() {
assertThat(stashController.contentHeightToReportToApps)
.isEqualTo(stashController.stashedHeight)
}
@Test
@TaskbarMode(THREE_BUTTONS)
fun testGetContentHeightToReportToApps_threeButtonsMode_taskbarHeight() {
assertThat(stashController.contentHeightToReportToApps)
.isEqualTo(activityContext.deviceProfile.taskbarHeight)
}
@Test
@TaskbarMode(PINNED)
fun testGetContentHeightToReportToApps_pinnedMode_taskbarHeight() {
assertThat(stashController.contentHeightToReportToApps)
.isEqualTo(activityContext.deviceProfile.taskbarHeight)
}
@Test
@TaskbarMode(PINNED)
@UserSetupMode
fun testGetContentHeightToReportToApps_pinnedInSetupMode_setupWizardInsets() {
assertThat(stashController.contentHeightToReportToApps)
.isEqualTo(context.resources.getDimensionPixelSize(R.dimen.taskbar_suw_insets))
}
@Test
@TaskbarMode(PINNED)
fun testGetContentHeightToReportToApps_pinnedModeButFolded_stashedHeight() {
getInstrumentation().runOnMainSync {
stashedHandleViewController.stashedHandleAlpha.get(ALPHA_INDEX_STASHED).value = 1f
stashController.updateStateForFlag(FLAG_STASHED_SMALL_SCREEN, true)
}
assertThat(stashController.contentHeightToReportToApps)
.isEqualTo(stashController.stashedHeight)
}
@Test
@TaskbarMode(PINNED)
fun testGetContentHeightToReportToApps_homeDisabledWhenFolded_zeroHeight() {
getInstrumentation().runOnMainSync {
stashedHandleViewController.stashedHandleAlpha.get(ALPHA_INDEX_STASHED).value = 1f
stashedHandleViewController.setIsHomeButtonDisabled(true)
stashController.updateStateForFlag(FLAG_STASHED_SMALL_SCREEN, true)
}
assertThat(stashController.contentHeightToReportToApps).isEqualTo(0)
}
@Test
@TaskbarMode(TRANSIENT)
fun testGetTappableHeightToReportToApps_transientMode_zeroHeight() {
assertThat(stashController.tappableHeightToReportToApps).isEqualTo(0)
}
@Test
@TaskbarMode(PINNED)
fun testGetTappableHeightToReportToApps_pinnedMode_taskbarHeight() {
assertThat(stashController.tappableHeightToReportToApps)
.isEqualTo(activityContext.deviceProfile.taskbarHeight)
}
@Test
@TaskbarMode(TRANSIENT)
fun testUpdateAndAnimateTransientTaskbar_unstashTaskbar_updatesState() {
getInstrumentation().runOnMainSync {
stashController.updateAndAnimateTransientTaskbar(false)
}
assertThat(stashController.isStashed).isFalse()
}
@Test
@TaskbarMode(TRANSIENT)
fun testUpdateAndAnimateTransientTaskbar_runUnstashAnimation_startsTaskbarTimeout() {
getInstrumentation().runOnMainSync {
stashController.updateAndAnimateTransientTaskbar(false)
animatorTestRule.advanceTimeBy(stashController.stashDuration)
}
assertThat(stashController.timeoutAlarm.alarmPending()).isTrue()
}
@Test
@TaskbarMode(TRANSIENT)
fun testUpdateAndAnimateTransientTaskbar_finishTaskbarTimeout_taskbarStashes() {
getInstrumentation().runOnMainSync {
stashController.updateAndAnimateTransientTaskbar(false)
animatorTestRule.advanceTimeBy(stashController.stashDuration)
}
assertThat(stashController.timeoutAlarm.alarmPending()).isTrue()
getInstrumentation().runOnMainSync {
stashController.timeoutAlarm.finishAlarm()
animatorTestRule.advanceTimeBy(stashController.stashDuration)
}
assertThat(stashController.isStashed).isTrue()
}
@Test
@TaskbarMode(TRANSIENT)
fun testUpdateAndAnimateTransientTaskbar_autoHideSuspendedForEdu_remainsUnstashed() {
getInstrumentation().runOnMainSync {
stashController.updateAndAnimateTransientTaskbar(false)
animatorTestRule.advanceTimeBy(stashController.stashDuration)
}
getInstrumentation().runOnMainSync {
autohideSuspendController.updateFlag(FLAG_AUTOHIDE_SUSPEND_EDU_OPEN, true)
stashController.updateAndAnimateTransientTaskbar(true)
animatorTestRule.advanceTimeBy(stashController.stashDuration)
}
assertThat(stashController.isStashed).isFalse()
}
@Test
@EnableFlags(FLAG_ENABLE_BUBBLE_BAR)
@TaskbarMode(TRANSIENT)
fun testUpdateAndAnimateTransientTaskbar_unstashTaskbarWithBubbles_bubbleBarUnstashes() {
getInstrumentation().runOnMainSync {
bubbleControllers.get().bubbleBarViewController.setHiddenForBubbles(false)
bubbleControllers.get().bubbleStashController.stashBubbleBarImmediate()
stashController.updateAndAnimateTransientTaskbar(false, true)
}
assertThat(bubbleControllers.get().bubbleStashController.isStashed).isFalse()
}
@Test
@EnableFlags(FLAG_ENABLE_BUBBLE_BAR)
@TaskbarMode(TRANSIENT)
fun testUpdateAndAnimateTransientTaskbar_unstashTaskbarWithoutBubbles_bubbleBarStashed() {
getInstrumentation().runOnMainSync {
bubbleControllers.get().bubbleBarViewController.setHiddenForBubbles(false)
bubbleControllers.get().bubbleStashController.stashBubbleBarImmediate()
stashController.updateAndAnimateTransientTaskbar(false, false)
}
assertThat(bubbleControllers.get().bubbleStashController.isStashed).isTrue()
}
@Test
@EnableFlags(FLAG_ENABLE_BUBBLE_BAR)
@TaskbarMode(TRANSIENT)
fun testUpdateAndAnimateTransientTaskbar_stashTaskbarWithBubbles_bubbleBarStashes() {
getInstrumentation().runOnMainSync {
bubbleControllers.get().bubbleBarViewController.setHiddenForBubbles(false)
bubbleControllers.get().bubbleStashController.showBubbleBarImmediate()
stashController.updateAndAnimateTransientTaskbar(true, true)
}
assertThat(bubbleControllers.get().bubbleStashController.isStashed).isTrue()
}
@Test
@EnableFlags(FLAG_ENABLE_BUBBLE_BAR)
@TaskbarMode(TRANSIENT)
fun testUpdateAndAnimateTransientTaskbar_stashTaskbarWithoutBubbles_bubbleBarUnstashed() {
getInstrumentation().runOnMainSync {
bubbleControllers.get().bubbleBarViewController.setHiddenForBubbles(false)
bubbleControllers.get().bubbleStashController.showBubbleBarImmediate()
stashController.updateAndAnimateTransientTaskbar(true, false)
}
assertThat(bubbleControllers.get().bubbleStashController.isStashed).isFalse()
}
@Test
@EnableFlags(FLAG_ENABLE_BUBBLE_BAR)
@TaskbarMode(TRANSIENT)
fun testUpdateAndAnimateTransientTaskbar_bubbleBarExpandedBeforeTimeout_expandedAfterwards() {
getInstrumentation().runOnMainSync {
bubbleControllers.get().bubbleBarViewController.setHiddenForBubbles(false)
bubbleControllers.get().bubbleBarViewController.isExpanded = true
stashController.updateAndAnimateTransientTaskbar(false)
animatorTestRule.advanceTimeBy(stashController.stashDuration)
}
assertThat(stashController.timeoutAlarm.alarmPending()).isTrue()
getInstrumentation().runOnMainSync {
stashController.timeoutAlarm.finishAlarm()
animatorTestRule.advanceTimeBy(stashController.stashDuration)
}
assertThat(bubbleControllers.get().bubbleBarViewController.isExpanded).isTrue()
}
@Test
@TaskbarMode(PINNED)
fun testToggleTaskbarStash_pinnedMode_doesNothing() {
getInstrumentation().runOnMainSync { stashController.toggleTaskbarStash() }
assertThat(stashController.isStashed).isFalse()
}
@Test
@TaskbarMode(TRANSIENT)
fun testToggleTaskbarStash_transientMode_unstashesTaskbar() {
getInstrumentation().runOnMainSync { stashController.toggleTaskbarStash() }
assertThat(stashController.isStashed).isFalse()
}
@Test
@TaskbarMode(TRANSIENT)
fun testToggleTaskbarStash_twiceInTransientMode_stashesTaskbar() {
getInstrumentation().runOnMainSync {
stashController.toggleTaskbarStash()
stashController.toggleTaskbarStash()
}
assertThat(stashController.isStashed).isTrue()
}
@Test
@TaskbarMode(TRANSIENT)
fun testToggleTaskbarStash_notInAppWithTransientMode_doesNothing() {
getInstrumentation().runOnMainSync {
stashController.updateStateForFlag(FLAG_IN_APP, false)
stashController.applyState(0)
stashController.toggleTaskbarStash()
}
assertThat(stashController.isStashed).isFalse()
}
@Test
@TaskbarMode(TRANSIENT)
fun testAnimateTransientTaskbar_bubblesShownInOverview_stashesTaskbar() {
// Start in Overview. Should unstash Taskbar.
getInstrumentation().runOnMainSync {
stashController.updateStateForFlag(FLAG_STASHED_IN_APP_AUTO, false)
stashController.updateStateForFlag(FLAG_IN_APP, false)
stashController.updateStateForFlag(FLAG_IN_OVERVIEW, true)
stashController.applyState(0)
}
assertThat(stashController.isStashed).isFalse()
// Expand bubbles. Should stash Taskbar.
getInstrumentation().runOnMainSync {
stashController.updateStateForSysuiFlags(SYSUI_STATE_BUBBLES_EXPANDED, false)
animatorTestRule.advanceTimeBy(TASKBAR_STASH_DURATION)
}
assertThat(stashController.isStashed).isTrue()
}
@Test
@TaskbarMode(PINNED)
fun testAnimatePinnedTaskbar_imeShown_replacesIconsWithHandle() {
getInstrumentation().runOnMainSync {
stashController.updateStateForSysuiFlags(SYSUI_STATE_IME_SHOWING, false)
animatorTestRule.advanceTimeBy(TASKBAR_STASH_DURATION_FOR_IME)
}
assertThat(viewController.areIconsVisible()).isFalse()
assertThat(stashedHandleViewController.isStashedHandleVisible).isTrue()
}
@Test
@TaskbarMode(PINNED)
fun testAnimatePinnedTaskbar_imeHidden_replacesHandleWithIcons() {
getInstrumentation().runOnMainSync {
stashController.updateStateForSysuiFlags(SYSUI_STATE_IME_SHOWING, true)
animatorTestRule.advanceTimeBy(0)
}
getInstrumentation().runOnMainSync {
stashController.updateStateForSysuiFlags(0, true)
animatorTestRule.advanceTimeBy(0)
}
assertThat(stashedHandleViewController.isStashedHandleVisible).isFalse()
assertThat(viewController.areIconsVisible()).isTrue()
}
@Test
@TaskbarMode(PINNED)
fun testAnimatePinnedTaskbar_imeHidden_verifyAnimationDuration() {
// Start with IME shown.
getInstrumentation().runOnMainSync {
stashController.updateStateForSysuiFlags(SYSUI_STATE_IME_SHOWING, true)
animatorTestRule.advanceTimeBy(0)
}
// Hide IME with animation.
getInstrumentation().runOnMainSync {
stashController.updateStateForSysuiFlags(0, false)
// Fast forward without start delay.
animatorTestRule.advanceTimeBy(TASKBAR_STASH_DURATION_FOR_IME)
}
// Icons should not be visible yet due to start delay.
assertThat(viewController.areIconsVisible()).isFalse()
// Advance by start delay retroactively. Animation should complete.
getInstrumentation().runOnMainSync {
animatorTestRule.advanceTimeBy(stashController.taskbarStashStartDelayForIme)
}
assertThat(viewController.areIconsVisible()).isTrue()
}
@Test
@TaskbarMode(THREE_BUTTONS)
fun testAnimateThreeButtonsTaskbar_imeShown_hidesIconsAndBg() {
getInstrumentation().runOnMainSync {
stashController.updateStateForSysuiFlags(SYSUI_STATE_IME_SHOWING, false)
animatorTestRule.advanceTimeBy(TASKBAR_STASH_DURATION_FOR_IME)
}
assertThat(viewController.areIconsVisible()).isFalse()
assertThat(dragLayerController.imeBgTaskbar.value).isEqualTo(0)
}
@Test
@TaskbarMode(THREE_BUTTONS)
fun testAnimateThreeButtonsTaskbar_imeHidden_showsIconsAndBg() {
getInstrumentation().runOnMainSync {
stashController.updateStateForSysuiFlags(SYSUI_STATE_IME_SHOWING, false)
animatorTestRule.advanceTimeBy(TASKBAR_STASH_DURATION_FOR_IME)
}
getInstrumentation().runOnMainSync {
stashController.updateStateForSysuiFlags(0, false)
animatorTestRule.advanceTimeBy(
TASKBAR_STASH_DURATION_FOR_IME + stashController.taskbarStashStartDelayForIme
)
}
assertThat(viewController.areIconsVisible()).isTrue()
assertThat(dragLayerController.imeBgTaskbar.value).isEqualTo(1)
}
@Test
@TaskbarMode(PINNED)
fun testSetSystemGestureInProgress_whileImeShown_unstashesTaskbar() {
getInstrumentation().runOnMainSync {
stashController.updateStateForSysuiFlags(SYSUI_STATE_IME_SHOWING, true)
animatorTestRule.advanceTimeBy(0)
}
getInstrumentation().runOnMainSync {
stashController.setSystemGestureInProgress(true)
animatorTestRule.advanceTimeBy(
TASKBAR_STASH_DURATION_FOR_IME + stashController.taskbarStashStartDelayForIme
)
}
assertThat(stashController.isStashed).isFalse()
}
@Test
@TaskbarMode(PINNED)
fun testUnlockTransition_pinnedMode_fadesOutHandle() {
getInstrumentation().runOnMainSync {
stashController.updateStateForFlag(FLAG_STASHED_DEVICE_LOCKED, true)
stashController.applyState(0)
}
assertThat(stashedHandleViewController.isStashedHandleVisible).isTrue()
getInstrumentation().runOnMainSync {
stashController.updateStateForFlag(FLAG_STASHED_DEVICE_LOCKED, false)
stashController.applyState()
animatorTestRule.advanceTimeBy(stashController.stashDuration)
}
assertThat(stashedHandleViewController.isStashedHandleVisible).isFalse()
}
@Test
@TaskbarMode(TRANSIENT)
fun testUnlockTransition_transientMode_fadesOutHandleEarly() {
getInstrumentation().runOnMainSync {
stashController.updateStateForFlag(FLAG_IN_APP, false)
stashController.updateStateForFlag(FLAG_STASHED_DEVICE_LOCKED, true)
stashController.applyState(0)
}
assertThat(stashedHandleViewController.isStashedHandleVisible).isTrue()
getInstrumentation().runOnMainSync {
stashController.updateStateForFlag(FLAG_STASHED_DEVICE_LOCKED, false)
stashController.applyState()
// Time it takes for just the handle to hide (full stash animation is longer).
animatorTestRule.advanceTimeBy(TRANSIENT_TASKBAR_STASH_ALPHA_DURATION)
}
assertThat(stashedHandleViewController.isStashedHandleVisible).isFalse()
}
}
private fun TaskbarStashController.updateStateForFlag(flag: Int, value: Boolean) {
updateStateForFlag(flag.toLong(), value)
}
+11
View File
@@ -20,6 +20,8 @@ import android.os.Handler;
import android.os.Looper;
import android.os.SystemClock;
import androidx.annotation.VisibleForTesting;
public class Alarm implements Runnable{
// if we reach this time and the alarm hasn't been cancelled, call the listener
private long mAlarmTriggerTime;
@@ -96,4 +98,13 @@ public class Alarm implements Runnable{
public long getLastSetTimeout() {
return mLastSetTimeout;
}
/** Simulates the alarm firing for tests. */
@VisibleForTesting
public void finishAlarm() {
if (!mAlarmPending) return;
mAlarmPending = false;
mHandler.removeCallbacks(this);
mAlarmListener.onAlarm(this);
}
}