Disable need to long-press lockscreen shortcuts when device is docked

Bug: b/277761993
Test: atest KeyguardQuickAffordanceInteractorTest
Change-Id: I91efaabeb5cd8adfdfeb6b0ce533827cd666f11c
This commit is contained in:
Brad Hinegardner
2023-04-25 16:28:45 -04:00
parent 5bb61ba05d
commit 5094a5dcc9
8 changed files with 110 additions and 4 deletions

View File

@@ -265,6 +265,7 @@ filegroup {
"tests/src/com/android/systemui/keyguard/ui/viewmodel/OccludedToLockscreenTransitionViewModelTest.kt",
// Keyguard helper
"tests/src/com/android/systemui/keyguard/data/quickaffordance/FakeKeyguardQuickAffordanceConfig.kt",
"tests/src/com/android/systemui/dock/DockManagerFake.java",
"tests/src/com/android/systemui/dump/LogBufferHelper.kt",
"tests/src/com/android/systemui/statusbar/phone/FakeKeyguardStateController.java",
"tests/src/com/android/systemui/keyguard/domain/quickaffordance/FakeKeyguardQuickAffordanceRegistry.kt",

View File

@@ -0,0 +1,34 @@
/*
* 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.systemui.dock
import com.android.systemui.common.coroutine.ConflatedCallbackFlow
import kotlinx.coroutines.channels.awaitClose
import kotlinx.coroutines.flow.Flow
/**
* Retrieves whether or not the device is docked according to DockManager. Emits a starting value
* of isDocked.
*/
fun DockManager.retrieveIsDocked(): Flow<Boolean> =
ConflatedCallbackFlow.conflatedCallbackFlow {
val callback = DockManager.DockEventListener { trySend(isDocked) }
addListener(callback)
trySend(isDocked)
awaitClose { removeListener(callback) }
}

View File

@@ -27,6 +27,8 @@ import com.android.systemui.animation.Expandable
import com.android.systemui.dagger.SysUISingleton
import com.android.systemui.dagger.qualifiers.Background
import com.android.systemui.devicepolicy.areKeyguardShortcutsDisabled
import com.android.systemui.dock.DockManager
import com.android.systemui.dock.retrieveIsDocked
import com.android.systemui.flags.FeatureFlags
import com.android.systemui.flags.Flags
import com.android.systemui.keyguard.data.quickaffordance.KeyguardQuickAffordanceConfig
@@ -71,6 +73,7 @@ constructor(
private val launchAnimator: DialogLaunchAnimator,
private val logger: KeyguardQuickAffordancesMetricsLogger,
private val devicePolicyManager: DevicePolicyManager,
private val dockManager: DockManager,
@Background private val backgroundDispatcher: CoroutineDispatcher,
) {
private val isUsingRepository: Boolean
@@ -81,8 +84,12 @@ constructor(
*
* If `false`, the UI goes back to using single taps.
*/
val useLongPress: Boolean
get() = featureFlags.isEnabled(Flags.CUSTOMIZABLE_LOCK_SCREEN_QUICK_AFFORDANCES)
fun useLongPress(): Flow<Boolean> =
if (featureFlags.isEnabled(Flags.CUSTOMIZABLE_LOCK_SCREEN_QUICK_AFFORDANCES)) {
dockManager.retrieveIsDocked().map { !it }
} else {
flowOf(false)
}
/** Returns an observable for the quick affordance at the given position. */
suspend fun quickAffordance(

View File

@@ -184,7 +184,8 @@ constructor(
bottomAreaInteractor.animateDozingTransitions.distinctUntilChanged(),
areQuickAffordancesFullyOpaque,
selectedPreviewSlotId,
) { model, animateReveal, isFullyOpaque, selectedPreviewSlotId ->
quickAffordanceInteractor.useLongPress(),
) { model, animateReveal, isFullyOpaque, selectedPreviewSlotId, useLongPress ->
val slotId = position.toSlotId()
val isSelected = selectedPreviewSlotId == slotId
model.toViewModel(
@@ -200,6 +201,7 @@ constructor(
!isSelected,
forceInactive = previewMode.isInPreviewMode,
slotId = slotId,
useLongPress = useLongPress,
)
}
.distinctUntilChanged()
@@ -213,6 +215,7 @@ constructor(
isDimmed: Boolean,
forceInactive: Boolean,
slotId: String,
useLongPress: Boolean,
): KeyguardQuickAffordanceViewModel {
return when (this) {
is KeyguardQuickAffordanceModel.Visible ->
@@ -231,7 +234,7 @@ constructor(
isClickable = isClickable,
isActivated = !forceInactive && activationState is ActivationState.Active,
isSelected = isSelected,
useLongPress = quickAffordanceInteractor.useLongPress,
useLongPress = useLongPress,
isDimmed = isDimmed,
slotId = slotId,
)

View File

@@ -33,6 +33,7 @@ import com.android.internal.widget.LockPatternUtils
import com.android.systemui.SystemUIAppComponentFactoryBase
import com.android.systemui.SysuiTestCase
import com.android.systemui.animation.DialogLaunchAnimator
import com.android.systemui.dock.DockManagerFake
import com.android.systemui.flags.FakeFeatureFlags
import com.android.systemui.flags.Flags
import com.android.systemui.keyguard.data.quickaffordance.FakeKeyguardQuickAffordanceConfig
@@ -94,6 +95,8 @@ class CustomizationProviderTest : SysuiTestCase() {
@Mock private lateinit var devicePolicyManager: DevicePolicyManager
@Mock private lateinit var logger: KeyguardQuickAffordancesMetricsLogger
private lateinit var dockManager: DockManagerFake
private lateinit var underTest: CustomizationProvider
private lateinit var testScope: TestScope
@@ -104,6 +107,8 @@ class CustomizationProviderTest : SysuiTestCase() {
whenever(previewRendererFactory.create(any())).thenReturn(previewRenderer)
whenever(backgroundHandler.looper).thenReturn(TestableLooper.get(this).looper)
dockManager = DockManagerFake()
underTest = CustomizationProvider()
val testDispatcher = UnconfinedTestDispatcher()
testScope = TestScope(testDispatcher)
@@ -188,6 +193,7 @@ class CustomizationProviderTest : SysuiTestCase() {
launchAnimator = launchAnimator,
logger = logger,
devicePolicyManager = devicePolicyManager,
dockManager = dockManager,
backgroundDispatcher = testDispatcher,
)
underTest.previewManager =

View File

@@ -28,6 +28,7 @@ import com.android.systemui.animation.DialogLaunchAnimator
import com.android.systemui.animation.Expandable
import com.android.systemui.common.shared.model.ContentDescription
import com.android.systemui.common.shared.model.Icon
import com.android.systemui.dock.DockManagerFake
import com.android.systemui.flags.FakeFeatureFlags
import com.android.systemui.flags.Flags
import com.android.systemui.keyguard.data.quickaffordance.BuiltInKeyguardQuickAffordanceKeys
@@ -237,6 +238,7 @@ class KeyguardQuickAffordanceInteractorParameterizedTest : SysuiTestCase() {
@JvmField @Parameter(3) var needsToUnlockFirst: Boolean = false
@JvmField @Parameter(4) var startActivity: Boolean = false
private lateinit var homeControls: FakeKeyguardQuickAffordanceConfig
private lateinit var dockManager: DockManagerFake
private lateinit var userTracker: UserTracker
@Before
@@ -247,6 +249,7 @@ class KeyguardQuickAffordanceInteractorParameterizedTest : SysuiTestCase() {
userTracker = FakeUserTracker()
homeControls =
FakeKeyguardQuickAffordanceConfig(BuiltInKeyguardQuickAffordanceKeys.HOME_CONTROLS)
dockManager = DockManagerFake()
val quickAccessWallet =
FakeKeyguardQuickAffordanceConfig(
BuiltInKeyguardQuickAffordanceKeys.QUICK_ACCESS_WALLET
@@ -335,6 +338,7 @@ class KeyguardQuickAffordanceInteractorParameterizedTest : SysuiTestCase() {
launchAnimator = launchAnimator,
logger = logger,
devicePolicyManager = devicePolicyManager,
dockManager = dockManager,
backgroundDispatcher = testDispatcher,
)
}

View File

@@ -29,6 +29,8 @@ import com.android.systemui.animation.DialogLaunchAnimator
import com.android.systemui.common.shared.model.ContentDescription
import com.android.systemui.common.shared.model.Icon
import com.android.systemui.coroutines.collectLastValue
import com.android.systemui.dock.DockManager
import com.android.systemui.dock.DockManagerFake
import com.android.systemui.flags.FakeFeatureFlags
import com.android.systemui.flags.Flags
import com.android.systemui.keyguard.data.quickaffordance.BuiltInKeyguardQuickAffordanceKeys
@@ -61,6 +63,7 @@ import com.google.common.truth.Truth.assertThat
import kotlinx.coroutines.ExperimentalCoroutinesApi
import kotlinx.coroutines.test.StandardTestDispatcher
import kotlinx.coroutines.test.TestScope
import kotlinx.coroutines.test.runCurrent
import kotlinx.coroutines.test.runTest
import org.junit.Before
import org.junit.Test
@@ -93,6 +96,7 @@ class KeyguardQuickAffordanceInteractorTest : SysuiTestCase() {
private lateinit var quickAccessWallet: FakeKeyguardQuickAffordanceConfig
private lateinit var qrCodeScanner: FakeKeyguardQuickAffordanceConfig
private lateinit var featureFlags: FakeFeatureFlags
private lateinit var dockManager: DockManagerFake
@Before
fun setUp() {
@@ -112,6 +116,8 @@ class KeyguardQuickAffordanceInteractorTest : SysuiTestCase() {
val testDispatcher = StandardTestDispatcher()
testScope = TestScope(testDispatcher)
dockManager = DockManagerFake()
val localUserSelectionManager =
KeyguardQuickAffordanceLocalUserSelectionManager(
context = context,
@@ -192,6 +198,7 @@ class KeyguardQuickAffordanceInteractorTest : SysuiTestCase() {
launchAnimator = launchAnimator,
logger = logger,
devicePolicyManager = devicePolicyManager,
dockManager = dockManager,
backgroundDispatcher = testDispatcher,
)
}
@@ -589,6 +596,46 @@ class KeyguardQuickAffordanceInteractorTest : SysuiTestCase() {
)
}
@Test
fun useLongPress_whenDocked_isFalse() =
testScope.runTest {
featureFlags.set(Flags.CUSTOMIZABLE_LOCK_SCREEN_QUICK_AFFORDANCES, true)
dockManager.setIsDocked(true)
val useLongPress by collectLastValue(underTest.useLongPress())
assertThat(useLongPress).isFalse()
}
@Test
fun useLongPress_whenNotDocked_isTrue() =
testScope.runTest {
featureFlags.set(Flags.CUSTOMIZABLE_LOCK_SCREEN_QUICK_AFFORDANCES, true)
dockManager.setIsDocked(false)
val useLongPress by collectLastValue(underTest.useLongPress())
assertThat(useLongPress).isTrue()
}
@Test
fun useLongPress_whenNotDocked_isTrue_changedTo_whenDocked_isFalse() =
testScope.runTest {
featureFlags.set(Flags.CUSTOMIZABLE_LOCK_SCREEN_QUICK_AFFORDANCES, true)
dockManager.setIsDocked(false)
val firstUseLongPress by collectLastValue (underTest.useLongPress())
runCurrent()
assertThat(firstUseLongPress).isTrue()
dockManager.setIsDocked(true)
dockManager.setDockEvent(DockManager.STATE_DOCKED)
val secondUseLongPress by collectLastValue(underTest.useLongPress())
runCurrent()
assertThat(secondUseLongPress).isFalse()
}
@Test
fun unselect_all() =
testScope.runTest {

View File

@@ -28,6 +28,7 @@ import com.android.systemui.animation.Expandable
import com.android.systemui.broadcast.BroadcastDispatcher
import com.android.systemui.common.shared.model.Icon
import com.android.systemui.coroutines.collectLastValue
import com.android.systemui.dock.DockManagerFake
import com.android.systemui.doze.util.BurnInHelperWrapper
import com.android.systemui.flags.FakeFeatureFlags
import com.android.systemui.flags.Flags
@@ -108,6 +109,7 @@ class KeyguardBottomAreaViewModelTest : SysuiTestCase() {
private lateinit var homeControlsQuickAffordanceConfig: FakeKeyguardQuickAffordanceConfig
private lateinit var quickAccessWalletAffordanceConfig: FakeKeyguardQuickAffordanceConfig
private lateinit var qrCodeScannerAffordanceConfig: FakeKeyguardQuickAffordanceConfig
private lateinit var dockManager: DockManagerFake
@Before
fun setUp() {
@@ -123,6 +125,7 @@ class KeyguardBottomAreaViewModelTest : SysuiTestCase() {
)
qrCodeScannerAffordanceConfig =
FakeKeyguardQuickAffordanceConfig(BuiltInKeyguardQuickAffordanceKeys.QR_CODE_SCANNER)
dockManager = DockManagerFake()
registry =
FakeKeyguardQuickAffordanceRegistry(
mapOf(
@@ -235,6 +238,7 @@ class KeyguardBottomAreaViewModelTest : SysuiTestCase() {
launchAnimator = launchAnimator,
logger = logger,
devicePolicyManager = devicePolicyManager,
dockManager = dockManager,
backgroundDispatcher = testDispatcher,
),
bottomAreaInteractor = KeyguardBottomAreaInteractor(repository = repository),