Merge "Add unit tests for TaskbarKeyguardController" into tm-qpr-dev am: 8d98dd2905

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

Change-Id: Ibef64055af917cd865d364f27a99e319c695bbe7
Signed-off-by: Automerger Merge Worker <android-build-automerger-merge-worker@system.gserviceaccount.com>
This commit is contained in:
Vinit Nayak
2023-01-20 00:37:37 +00:00
committed by Automerger Merge Worker
4 changed files with 257 additions and 8 deletions

View File

@@ -51,7 +51,6 @@ import android.annotation.IdRes;
import android.annotation.LayoutRes;
import android.content.pm.ActivityInfo.Config;
import android.content.res.ColorStateList;
import android.content.res.Configuration;
import android.content.res.Resources;
import android.graphics.Color;
import android.graphics.Point;
@@ -725,13 +724,6 @@ public class NavbarButtonsViewController implements TaskbarControllers.LoggableT
mPropertyHolders.add(new StatePropertyHolder(
mBackButtonAlpha.get(ALPHA_INDEX_SUW),
flags -> (flags & FLAG_IME_VISIBLE) == 0));
// TODO(b/210906568) Dark intensity is currently not propagated during setup, so set
// it based on dark theme for now.
int mode = res.getConfiguration().uiMode
& Configuration.UI_MODE_NIGHT_MASK;
boolean isDarkTheme = mode == Configuration.UI_MODE_NIGHT_YES;
mTaskbarNavButtonDarkIntensity.updateValue(isDarkTheme ? 0 : 1);
} else if (isInKidsMode) {
int iconSize = res.getDimensionPixelSize(
R.dimen.taskbar_icon_size_kids);

View File

@@ -73,6 +73,13 @@ public class TaskbarControllers {
// Roundness property for round corner above taskbar .
private final AnimatedFloat mCornerRoundness = new AnimatedFloat(this::updateCornerRoundness);
/**
* Want to add a new controller? Don't forget to:
* * Call init
* * Call onDestroy
* * Add to mControllersToLog
* * Add tests by adding this controller to TaskbarBaseTestCase.kt and extending that class
*/
public TaskbarControllers(TaskbarActivityContext taskbarActivityContext,
TaskbarDragController taskbarDragController,
TaskbarNavButtonController navButtonController,

View File

@@ -0,0 +1,100 @@
/*
* 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
import com.android.launcher3.taskbar.allapps.TaskbarAllAppsController
import com.android.launcher3.taskbar.overlay.TaskbarOverlayController
import com.android.systemui.shared.rotation.RotationButtonController
import org.junit.Before
import org.mockito.Mock
import org.mockito.MockitoAnnotations
/**
* Helper class to extend to get access to all controllers.
* Gotta be careful of your relationship with this class though, it can be quite... controlling.
*/
abstract class TaskbarBaseTestCase {
@Mock
lateinit var taskbarActivityContext: TaskbarActivityContext
@Mock
lateinit var taskbarDragController: TaskbarDragController
@Mock
lateinit var navButtonController: TaskbarNavButtonController
@Mock
lateinit var navbarButtonsViewController: NavbarButtonsViewController
@Mock
lateinit var rotationButtonController: RotationButtonController
@Mock
lateinit var taskbarDragLayerController: TaskbarDragLayerController
@Mock
lateinit var taskbarScrimViewController: TaskbarScrimViewController
@Mock
lateinit var taskbarViewController: TaskbarViewController
@Mock
lateinit var taskbarUnfoldAnimationController: TaskbarUnfoldAnimationController
@Mock
lateinit var taskbarKeyguardController: TaskbarKeyguardController
@Mock
lateinit var stashedHandleViewController: StashedHandleViewController
@Mock
lateinit var taskbarStashController: TaskbarStashController
@Mock
lateinit var taskbarEduController: TaskbarEduController
@Mock
lateinit var taskbarAutohideSuspendController: TaskbarAutohideSuspendController
@Mock
lateinit var taskbarPopupController: TaskbarPopupController
@Mock
lateinit var taskbarForceVisibleImmersiveController: TaskbarForceVisibleImmersiveController
@Mock
lateinit var taskbarAllAppsController: TaskbarAllAppsController
@Mock
lateinit var taskbarInsetsController: TaskbarInsetsController
@Mock
lateinit var voiceInteractionWindowController: VoiceInteractionWindowController
@Mock
lateinit var taskbarRecentAppsController: TaskbarRecentAppsController
@Mock
lateinit var taskbarTranslationController: TaskbarTranslationController
@Mock
lateinit var taskbarOverlayController: TaskbarOverlayController
lateinit var mTaskbarControllers: TaskbarControllers
@Before
open fun setup() {
/*
* NOTE: Mocking of controllers that are written in Kotlin won't work since their methods
* are final by default (and should not be changed only for tests), meaning unmockable.
* Womp, womp woooommmmppp.
* If you want to mock one of those methods, you need to make a parent interface that
* includes that method to allow mocking it.
*/
MockitoAnnotations.initMocks(this)
mTaskbarControllers = TaskbarControllers(
taskbarActivityContext, taskbarDragController, navButtonController,
navbarButtonsViewController, rotationButtonController, taskbarDragLayerController,
taskbarViewController, taskbarScrimViewController, taskbarUnfoldAnimationController,
taskbarKeyguardController, stashedHandleViewController, taskbarStashController,
taskbarEduController, taskbarAutohideSuspendController, taskbarPopupController,
taskbarForceVisibleImmersiveController, taskbarOverlayController,
taskbarAllAppsController, taskbarInsetsController,
voiceInteractionWindowController, taskbarTranslationController,
taskbarRecentAppsController
)
}
}

View File

@@ -0,0 +1,150 @@
/*
* 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
import android.app.KeyguardManager
import com.android.systemui.shared.system.QuickStepContract.SYSUI_STATE_BACK_DISABLED
import com.android.systemui.shared.system.QuickStepContract.SYSUI_STATE_BOUNCER_SHOWING
import com.android.systemui.shared.system.QuickStepContract.SYSUI_STATE_DEVICE_DOZING
import com.android.systemui.shared.system.QuickStepContract.SYSUI_STATE_HOME_DISABLED
import com.android.systemui.shared.system.QuickStepContract.SYSUI_STATE_OVERVIEW_DISABLED
import com.android.systemui.shared.system.QuickStepContract.SYSUI_STATE_STATUS_BAR_KEYGUARD_SHOWING
import com.android.systemui.shared.system.QuickStepContract.SYSUI_STATE_STATUS_BAR_KEYGUARD_SHOWING_OCCLUDED
import org.junit.Before
import org.junit.Test
import org.mockito.Mock
import org.mockito.Mockito.anyBoolean
import org.mockito.Mockito.never
import org.mockito.Mockito.times
import org.mockito.Mockito.verify
import org.mockito.Mockito.`when` as whenever
class TaskbarKeyguardControllerTest : TaskbarBaseTestCase() {
@Mock
lateinit var baseDragLayer: TaskbarDragLayer
@Mock
lateinit var keyguardManager: KeyguardManager
@Before
override fun setup() {
super.setup()
whenever(taskbarActivityContext.getSystemService(KeyguardManager::class.java))
.thenReturn(keyguardManager)
whenever(baseDragLayer.childCount).thenReturn(0)
whenever(taskbarActivityContext.dragLayer).thenReturn(baseDragLayer)
taskbarKeyguardController = TaskbarKeyguardController(taskbarActivityContext)
taskbarKeyguardController.init(navbarButtonsViewController)
}
@Test
fun uninterestingFlags_noActions() {
setFlags(0)
verify(navbarButtonsViewController, never()).setKeyguardVisible(anyBoolean(), anyBoolean())
}
@Test
fun keyguardShowing() {
setFlags(SYSUI_STATE_STATUS_BAR_KEYGUARD_SHOWING)
verify(navbarButtonsViewController, times(1)).setKeyguardVisible(
true /*isKeyguardVisible*/,
false /*isKeyguardOccluded*/)
}
@Test
fun dozingShowing() {
setFlags(SYSUI_STATE_DEVICE_DOZING)
verify(navbarButtonsViewController, times(1)).setKeyguardVisible(
true /*isKeyguardVisible*/,
false /*isKeyguardOccluded*/)
}
@Test
fun keyguardOccluded() {
setFlags(SYSUI_STATE_STATUS_BAR_KEYGUARD_SHOWING_OCCLUDED)
verify(navbarButtonsViewController, times(1)).setKeyguardVisible(
false /*isKeyguardVisible*/,
true /*isKeyguardOccluded*/)
}
@Test
fun keyguardOccludedAndDozing() {
setFlags(SYSUI_STATE_STATUS_BAR_KEYGUARD_SHOWING_OCCLUDED.or(SYSUI_STATE_DEVICE_DOZING))
verify(navbarButtonsViewController, times(1)).setKeyguardVisible(
true /*isKeyguardVisible*/,
true /*isKeyguardOccluded*/)
}
@Test
fun deviceInsecure_hideBackForBouncer() {
whenever(keyguardManager.isDeviceSecure).thenReturn(false)
setFlags(SYSUI_STATE_OVERVIEW_DISABLED
.or(SYSUI_STATE_HOME_DISABLED)
.or(SYSUI_STATE_BOUNCER_SHOWING))
verify(navbarButtonsViewController, times(1)).setBackForBouncer(false)
}
@Test
fun deviceSecure_showBackForBouncer() {
whenever(keyguardManager.isDeviceSecure).thenReturn(true)
setFlags(SYSUI_STATE_OVERVIEW_DISABLED
.or(SYSUI_STATE_HOME_DISABLED)
.or(SYSUI_STATE_BOUNCER_SHOWING))
verify(navbarButtonsViewController, times(1)).setBackForBouncer(true)
}
@Test
fun homeShowing_hideBackForBouncer() {
whenever(keyguardManager.isDeviceSecure).thenReturn(true)
setFlags(SYSUI_STATE_OVERVIEW_DISABLED
.or(SYSUI_STATE_BOUNCER_SHOWING))
verify(navbarButtonsViewController, times(1)).setBackForBouncer(false)
}
@Test
fun overviewShowing_hideBackForBouncer() {
whenever(keyguardManager.isDeviceSecure).thenReturn(true)
setFlags(SYSUI_STATE_HOME_DISABLED
.or(SYSUI_STATE_BOUNCER_SHOWING))
verify(navbarButtonsViewController, times(1)).setBackForBouncer(false)
}
@Test
fun backDisabled_hideBackForBouncer() {
whenever(keyguardManager.isDeviceSecure).thenReturn(true)
setFlags(SYSUI_STATE_BACK_DISABLED
.or(SYSUI_STATE_BOUNCER_SHOWING))
verify(navbarButtonsViewController, times(1)).setBackForBouncer(false)
// back disabled along with home and overview
setFlags(SYSUI_STATE_BACK_DISABLED
.or(SYSUI_STATE_HOME_DISABLED)
.or(SYSUI_STATE_OVERVIEW_DISABLED)
.or(SYSUI_STATE_BOUNCER_SHOWING))
verify(navbarButtonsViewController, times(2)).setBackForBouncer(false)
}
private fun setFlags(flags: Int) {
taskbarKeyguardController.updateStateForSysuiFlags(flags)
}
}