diff options
15 files changed, 139 insertions, 74 deletions
diff --git a/packages/SystemUI/src/com/android/systemui/biometrics/UdfpsController.java b/packages/SystemUI/src/com/android/systemui/biometrics/UdfpsController.java index 85a119c389c1..72d14ba543e2 100644 --- a/packages/SystemUI/src/com/android/systemui/biometrics/UdfpsController.java +++ b/packages/SystemUI/src/com/android/systemui/biometrics/UdfpsController.java @@ -102,8 +102,6 @@ import com.android.systemui.util.concurrency.DelayableExecutor; import com.android.systemui.util.concurrency.Execution; import com.android.systemui.util.time.SystemClock; -import kotlin.Unit; - import java.io.PrintWriter; import java.util.ArrayList; import java.util.HashSet; @@ -113,6 +111,8 @@ import java.util.concurrent.Executor; import javax.inject.Inject; import javax.inject.Provider; +import kotlin.Unit; + import kotlinx.coroutines.ExperimentalCoroutinesApi; /** @@ -588,7 +588,8 @@ public class UdfpsController implements DozeReceiver, Dumpable { // Always pilfer pointers that are within sensor area or when alternate bouncer is showing if (mActivePointerId != MotionEvent.INVALID_POINTER_ID - || mAlternateBouncerInteractor.isVisibleState()) { + || (mAlternateBouncerInteractor.isVisibleState() + && !DeviceEntryUdfpsRefactor.isEnabled())) { shouldPilfer = true; } diff --git a/packages/SystemUI/src/com/android/systemui/classifier/Classifier.java b/packages/SystemUI/src/com/android/systemui/classifier/Classifier.java index 334cf9318322..740e8bb5ff08 100644 --- a/packages/SystemUI/src/com/android/systemui/classifier/Classifier.java +++ b/packages/SystemUI/src/com/android/systemui/classifier/Classifier.java @@ -45,6 +45,7 @@ public abstract class Classifier { public static final int BACK_GESTURE = 16; public static final int QS_SWIPE_NESTED = 17; public static final int MEDIA_SEEKBAR = 18; + public static final int ALTERNATE_BOUNCER_SWIPE = 19; @IntDef({ QUICK_SETTINGS, @@ -65,6 +66,7 @@ public abstract class Classifier { QS_SWIPE_NESTED, BACK_GESTURE, MEDIA_SEEKBAR, + ALTERNATE_BOUNCER_SWIPE, }) @Retention(RetentionPolicy.SOURCE) public @interface InteractionType {} diff --git a/packages/SystemUI/src/com/android/systemui/classifier/DistanceClassifier.java b/packages/SystemUI/src/com/android/systemui/classifier/DistanceClassifier.java index 15e2e9a916b9..b13bf4e051d2 100644 --- a/packages/SystemUI/src/com/android/systemui/classifier/DistanceClassifier.java +++ b/packages/SystemUI/src/com/android/systemui/classifier/DistanceClassifier.java @@ -22,6 +22,7 @@ import static com.android.internal.config.sysui.SystemUiDeviceConfigFlags.BRIGHT import static com.android.internal.config.sysui.SystemUiDeviceConfigFlags.BRIGHTLINE_FALSING_DISTANCE_VELOCITY_TO_DISTANCE; import static com.android.internal.config.sysui.SystemUiDeviceConfigFlags.BRIGHTLINE_FALSING_DISTANCE_VERTICAL_FLING_THRESHOLD_IN; import static com.android.internal.config.sysui.SystemUiDeviceConfigFlags.BRIGHTLINE_FALSING_DISTANCE_VERTICAL_SWIPE_THRESHOLD_IN; +import static com.android.systemui.classifier.Classifier.ALTERNATE_BOUNCER_SWIPE; import static com.android.systemui.classifier.Classifier.BRIGHTNESS_SLIDER; import static com.android.systemui.classifier.Classifier.MEDIA_SEEKBAR; import static com.android.systemui.classifier.Classifier.QS_COLLAPSE; @@ -159,7 +160,8 @@ class DistanceClassifier extends FalsingClassifier { || interactionType == QS_COLLAPSE || interactionType == Classifier.UDFPS_AUTHENTICATION || interactionType == Classifier.QS_SWIPE_SIDE - || interactionType == QS_SWIPE_NESTED) { + || interactionType == QS_SWIPE_NESTED + || interactionType == ALTERNATE_BOUNCER_SWIPE) { return Result.passed(0); } diff --git a/packages/SystemUI/src/com/android/systemui/classifier/TypeClassifier.java b/packages/SystemUI/src/com/android/systemui/classifier/TypeClassifier.java index 2fb6aaf2ec65..93aa27959aae 100644 --- a/packages/SystemUI/src/com/android/systemui/classifier/TypeClassifier.java +++ b/packages/SystemUI/src/com/android/systemui/classifier/TypeClassifier.java @@ -17,6 +17,7 @@ package com.android.systemui.classifier; +import static com.android.systemui.classifier.Classifier.ALTERNATE_BOUNCER_SWIPE; import static com.android.systemui.classifier.Classifier.BOUNCER_UNLOCK; import static com.android.systemui.classifier.Classifier.BRIGHTNESS_SLIDER; import static com.android.systemui.classifier.Classifier.LEFT_AFFORDANCE; @@ -73,6 +74,7 @@ public class TypeClassifier extends FalsingClassifier { case NOTIFICATION_DISMISS: wrongDirection = vertical; break; + case ALTERNATE_BOUNCER_SWIPE: case UNLOCK: case BOUNCER_UNLOCK: wrongDirection = !vertical || !up; diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/ui/SwipeUpAnywhereGestureHandler.kt b/packages/SystemUI/src/com/android/systemui/keyguard/ui/SwipeUpAnywhereGestureHandler.kt new file mode 100644 index 000000000000..3540a0c6f016 --- /dev/null +++ b/packages/SystemUI/src/com/android/systemui/keyguard/ui/SwipeUpAnywhereGestureHandler.kt @@ -0,0 +1,45 @@ +/* + * 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.keyguard.ui + +import android.content.Context +import android.view.MotionEvent +import com.android.systemui.dagger.SysUISingleton +import com.android.systemui.settings.DisplayTracker +import com.android.systemui.statusbar.gesture.SwipeUpGestureHandler +import com.android.systemui.statusbar.gesture.SwipeUpGestureLogger +import javax.inject.Inject + +/** A class to detect when a user swipes up anywhere on the display. */ +@SysUISingleton +class SwipeUpAnywhereGestureHandler +@Inject +constructor( + context: Context, + displayTracker: DisplayTracker, + logger: SwipeUpGestureLogger, +) : + SwipeUpGestureHandler( + context, + displayTracker, + logger, + loggerTag = "SwipeUpAnywhereGestureHandler" + ) { + override fun startOfGestureIsWithinBounds(ev: MotionEvent): Boolean { + return true + } +} diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/ui/binder/AlternateBouncerViewBinder.kt b/packages/SystemUI/src/com/android/systemui/keyguard/ui/binder/AlternateBouncerViewBinder.kt index a6383eb5f785..594865d38600 100644 --- a/packages/SystemUI/src/com/android/systemui/keyguard/ui/binder/AlternateBouncerViewBinder.kt +++ b/packages/SystemUI/src/com/android/systemui/keyguard/ui/binder/AlternateBouncerViewBinder.kt @@ -20,23 +20,21 @@ import android.view.View import android.view.ViewGroup import androidx.lifecycle.Lifecycle import androidx.lifecycle.repeatOnLifecycle +import com.android.systemui.classifier.Classifier import com.android.systemui.deviceentry.shared.DeviceEntryUdfpsRefactor +import com.android.systemui.keyguard.ui.SwipeUpAnywhereGestureHandler import com.android.systemui.keyguard.ui.viewmodel.AlternateBouncerViewModel import com.android.systemui.lifecycle.repeatWhenAttached +import com.android.systemui.plugins.FalsingManager import com.android.systemui.res.R import com.android.systemui.scrim.ScrimView import com.android.systemui.statusbar.NotificationShadeWindowController +import com.android.systemui.statusbar.gesture.TapGestureDetector import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.ExperimentalCoroutinesApi import kotlinx.coroutines.launch -/** - * Binds the alternate bouncer view to its view-model. - * - * To use this properly, users should maintain a one-to-one relationship between the [View] and the - * view-binding, binding each view only once. It is okay and expected for the same instance of the - * view-model to be reused for multiple view/view-binder bindings. - */ +/** Binds the alternate bouncer view to its view-model. */ @ExperimentalCoroutinesApi object AlternateBouncerViewBinder { @@ -47,6 +45,9 @@ object AlternateBouncerViewBinder { viewModel: AlternateBouncerViewModel, scope: CoroutineScope, notificationShadeWindowController: NotificationShadeWindowController, + falsingManager: FalsingManager, + swipeUpAnywhereGestureHandler: SwipeUpAnywhereGestureHandler, + tapGestureDetector: TapGestureDetector, ) { DeviceEntryUdfpsRefactor.isUnexpectedlyInLegacyMode() scope.launch { @@ -64,9 +65,25 @@ object AlternateBouncerViewBinder { scrim.viewAlpha = 0f launch { - viewModel.onClickListener.collect { - // TODO (b/287599719): Support swiping to dismiss altBouncer - alternateBouncerViewContainer.setOnClickListener(it) + viewModel.registerForDismissGestures.collect { registerForDismissGestures -> + if (registerForDismissGestures) { + swipeUpAnywhereGestureHandler.addOnGestureDetectedCallback(swipeTag) { _ + -> + if ( + !falsingManager.isFalseTouch(Classifier.ALTERNATE_BOUNCER_SWIPE) + ) { + viewModel.showPrimaryBouncer() + } + } + tapGestureDetector.addOnGestureDetectedCallback(tapTag) { _ -> + if (!falsingManager.isFalseTap(FalsingManager.LOW_PENALTY)) { + viewModel.showPrimaryBouncer() + } + } + } else { + swipeUpAnywhereGestureHandler.removeOnGestureDetectedCallback(swipeTag) + tapGestureDetector.removeOnGestureDetectedCallback(tapTag) + } } } @@ -83,3 +100,6 @@ object AlternateBouncerViewBinder { } } } + +private const val swipeTag = "AlternateBouncer-SWIPE" +private const val tapTag = "AlternateBouncer-TAP" diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/ui/view/layout/blueprints/DefaultKeyguardBlueprint.kt b/packages/SystemUI/src/com/android/systemui/keyguard/ui/view/layout/blueprints/DefaultKeyguardBlueprint.kt index 27b38c71d2e7..fa27442707a3 100644 --- a/packages/SystemUI/src/com/android/systemui/keyguard/ui/view/layout/blueprints/DefaultKeyguardBlueprint.kt +++ b/packages/SystemUI/src/com/android/systemui/keyguard/ui/view/layout/blueprints/DefaultKeyguardBlueprint.kt @@ -24,7 +24,7 @@ import com.android.systemui.keyguard.shared.model.KeyguardSection import com.android.systemui.keyguard.ui.view.layout.items.ClockSection import com.android.systemui.keyguard.ui.view.layout.sections.AodBurnInSection import com.android.systemui.keyguard.ui.view.layout.sections.AodNotificationIconsSection -import com.android.systemui.keyguard.ui.view.layout.sections.DefaultDeviceEntryIconSection +import com.android.systemui.keyguard.ui.view.layout.sections.DefaultDeviceEntrySection import com.android.systemui.keyguard.ui.view.layout.sections.DefaultIndicationAreaSection import com.android.systemui.keyguard.ui.view.layout.sections.DefaultNotificationStackScrollLayoutSection import com.android.systemui.keyguard.ui.view.layout.sections.DefaultSettingsPopupMenuSection @@ -49,7 +49,7 @@ class DefaultKeyguardBlueprint @Inject constructor( defaultIndicationAreaSection: DefaultIndicationAreaSection, - defaultDeviceEntryIconSection: DefaultDeviceEntryIconSection, + defaultDeviceEntrySection: DefaultDeviceEntrySection, defaultShortcutsSection: DefaultShortcutsSection, @Named(KEYGUARD_AMBIENT_INDICATION_AREA_SECTION) defaultAmbientIndicationAreaSection: Optional<KeyguardSection>, @@ -79,7 +79,7 @@ constructor( communalTutorialIndicatorSection, clockSection, smartspaceSection, - defaultDeviceEntryIconSection, // Add LAST: Intentionally has z-order above other views. + defaultDeviceEntrySection, // Add LAST: Intentionally has z-order above other views. ) companion object { diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/ui/view/layout/blueprints/ShortcutsBesideUdfpsKeyguardBlueprint.kt b/packages/SystemUI/src/com/android/systemui/keyguard/ui/view/layout/blueprints/ShortcutsBesideUdfpsKeyguardBlueprint.kt index 190ad44845d0..bf7068220576 100644 --- a/packages/SystemUI/src/com/android/systemui/keyguard/ui/view/layout/blueprints/ShortcutsBesideUdfpsKeyguardBlueprint.kt +++ b/packages/SystemUI/src/com/android/systemui/keyguard/ui/view/layout/blueprints/ShortcutsBesideUdfpsKeyguardBlueprint.kt @@ -23,7 +23,7 @@ import com.android.systemui.keyguard.shared.model.KeyguardSection import com.android.systemui.keyguard.ui.view.layout.sections.AlignShortcutsToUdfpsSection import com.android.systemui.keyguard.ui.view.layout.sections.AodBurnInSection import com.android.systemui.keyguard.ui.view.layout.sections.AodNotificationIconsSection -import com.android.systemui.keyguard.ui.view.layout.sections.DefaultDeviceEntryIconSection +import com.android.systemui.keyguard.ui.view.layout.sections.DefaultDeviceEntrySection import com.android.systemui.keyguard.ui.view.layout.sections.DefaultIndicationAreaSection import com.android.systemui.keyguard.ui.view.layout.sections.DefaultNotificationStackScrollLayoutSection import com.android.systemui.keyguard.ui.view.layout.sections.DefaultSettingsPopupMenuSection @@ -42,7 +42,7 @@ class ShortcutsBesideUdfpsKeyguardBlueprint @Inject constructor( defaultIndicationAreaSection: DefaultIndicationAreaSection, - defaultDeviceEntryIconSection: DefaultDeviceEntryIconSection, + defaultDeviceEntrySection: DefaultDeviceEntrySection, @Named(KeyguardSectionsModule.KEYGUARD_AMBIENT_INDICATION_AREA_SECTION) defaultAmbientIndicationAreaSection: Optional<KeyguardSection>, defaultSettingsPopupMenuSection: DefaultSettingsPopupMenuSection, @@ -68,7 +68,7 @@ constructor( splitShadeGuidelines, aodNotificationIconsSection, aodBurnInSection, - defaultDeviceEntryIconSection, // Add LAST: Intentionally has z-order above other views. + defaultDeviceEntrySection, // Add LAST: Intentionally has z-order above other views. ) companion object { diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/ui/view/layout/blueprints/SplitShadeKeyguardBlueprint.kt b/packages/SystemUI/src/com/android/systemui/keyguard/ui/view/layout/blueprints/SplitShadeKeyguardBlueprint.kt index acbcf273214b..f890ae612ccc 100644 --- a/packages/SystemUI/src/com/android/systemui/keyguard/ui/view/layout/blueprints/SplitShadeKeyguardBlueprint.kt +++ b/packages/SystemUI/src/com/android/systemui/keyguard/ui/view/layout/blueprints/SplitShadeKeyguardBlueprint.kt @@ -23,7 +23,7 @@ import com.android.systemui.keyguard.shared.model.KeyguardBlueprint import com.android.systemui.keyguard.shared.model.KeyguardSection import com.android.systemui.keyguard.ui.view.layout.sections.AodBurnInSection import com.android.systemui.keyguard.ui.view.layout.sections.AodNotificationIconsSection -import com.android.systemui.keyguard.ui.view.layout.sections.DefaultDeviceEntryIconSection +import com.android.systemui.keyguard.ui.view.layout.sections.DefaultDeviceEntrySection import com.android.systemui.keyguard.ui.view.layout.sections.DefaultIndicationAreaSection import com.android.systemui.keyguard.ui.view.layout.sections.DefaultSettingsPopupMenuSection import com.android.systemui.keyguard.ui.view.layout.sections.DefaultShortcutsSection @@ -47,7 +47,7 @@ class SplitShadeKeyguardBlueprint @Inject constructor( defaultIndicationAreaSection: DefaultIndicationAreaSection, - defaultDeviceEntryIconSection: DefaultDeviceEntryIconSection, + defaultDeviceEntrySection: DefaultDeviceEntrySection, defaultShortcutsSection: DefaultShortcutsSection, @Named(KeyguardSectionsModule.KEYGUARD_AMBIENT_INDICATION_AREA_SECTION) defaultAmbientIndicationAreaSection: Optional<KeyguardSection>, @@ -75,7 +75,7 @@ constructor( aodNotificationIconsSection, aodBurnInSection, communalTutorialIndicatorSection, - defaultDeviceEntryIconSection, // Add LAST: Intentionally has z-order above other views. + defaultDeviceEntrySection, // Add LAST: Intentionally has z-order above other views. ) companion object { diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/ui/view/layout/sections/DefaultDeviceEntryIconSection.kt b/packages/SystemUI/src/com/android/systemui/keyguard/ui/view/layout/sections/DefaultDeviceEntrySection.kt index fac84981577f..77ab9f416910 100644 --- a/packages/SystemUI/src/com/android/systemui/keyguard/ui/view/layout/sections/DefaultDeviceEntryIconSection.kt +++ b/packages/SystemUI/src/com/android/systemui/keyguard/ui/view/layout/sections/DefaultDeviceEntrySection.kt @@ -37,6 +37,7 @@ import com.android.systemui.deviceentry.shared.DeviceEntryUdfpsRefactor import com.android.systemui.flags.FeatureFlags import com.android.systemui.flags.Flags import com.android.systemui.keyguard.shared.model.KeyguardSection +import com.android.systemui.keyguard.ui.SwipeUpAnywhereGestureHandler import com.android.systemui.keyguard.ui.binder.AlternateBouncerViewBinder import com.android.systemui.keyguard.ui.binder.DeviceEntryIconViewBinder import com.android.systemui.keyguard.ui.view.DeviceEntryIconView @@ -48,6 +49,7 @@ import com.android.systemui.plugins.FalsingManager import com.android.systemui.res.R import com.android.systemui.shade.NotificationPanelView import com.android.systemui.statusbar.NotificationShadeWindowController +import com.android.systemui.statusbar.gesture.TapGestureDetector import dagger.Lazy import javax.inject.Inject import kotlinx.coroutines.CoroutineScope @@ -55,7 +57,7 @@ import kotlinx.coroutines.ExperimentalCoroutinesApi /** Includes both the device entry icon and the alternate bouncer scrim. */ @ExperimentalCoroutinesApi -class DefaultDeviceEntryIconSection +class DefaultDeviceEntrySection @Inject constructor( private val keyguardUpdateMonitor: KeyguardUpdateMonitor, @@ -72,6 +74,8 @@ constructor( private val alternateBouncerViewModel: Lazy<AlternateBouncerViewModel>, private val notificationShadeWindowController: Lazy<NotificationShadeWindowController>, @Application private val scope: CoroutineScope, + private val swipeUpAnywhereGestureHandler: Lazy<SwipeUpAnywhereGestureHandler>, + private val tapGestureDetector: Lazy<TapGestureDetector>, ) : KeyguardSection() { private val deviceEntryIconViewId = R.id.device_entry_icon_view private val alternateBouncerViewId = R.id.alternate_bouncer @@ -118,6 +122,9 @@ constructor( alternateBouncerViewModel.get(), scope, notificationShadeWindowController.get(), + falsingManager.get(), + swipeUpAnywhereGestureHandler.get(), + tapGestureDetector.get(), ) } } else { diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/ui/viewmodel/AlternateBouncerViewModel.kt b/packages/SystemUI/src/com/android/systemui/keyguard/ui/viewmodel/AlternateBouncerViewModel.kt index 235a28d4ebc5..bb7bcd99ffb6 100644 --- a/packages/SystemUI/src/com/android/systemui/keyguard/ui/viewmodel/AlternateBouncerViewModel.kt +++ b/packages/SystemUI/src/com/android/systemui/keyguard/ui/viewmodel/AlternateBouncerViewModel.kt @@ -18,12 +18,10 @@ package com.android.systemui.keyguard.ui.viewmodel import android.graphics.Color -import android.view.View import com.android.systemui.keyguard.domain.interactor.FromAlternateBouncerTransitionInteractor.Companion.TRANSITION_DURATION_MS import com.android.systemui.keyguard.domain.interactor.KeyguardTransitionInteractor import com.android.systemui.keyguard.shared.model.KeyguardState.ALTERNATE_BOUNCER import com.android.systemui.keyguard.ui.KeyguardTransitionAnimationFlow -import com.android.systemui.plugins.FalsingManager import com.android.systemui.statusbar.phone.StatusBarKeyguardViewManager import com.android.wm.shell.animation.Interpolators import javax.inject.Inject @@ -38,9 +36,8 @@ import kotlinx.coroutines.flow.merge class AlternateBouncerViewModel @Inject constructor( - statusBarKeyguardViewManager: StatusBarKeyguardViewManager, + private val statusBarKeyguardViewManager: StatusBarKeyguardViewManager, transitionInteractor: KeyguardTransitionInteractor, - falsingManager: FalsingManager, ) { // When we're fully transitioned to the AlternateBouncer, the alpha of the scrim should be: private val alternateBouncerScrimAlpha = .66f @@ -83,21 +80,10 @@ constructor( /** An observable for the scrim color. Change color for easier debugging. */ val scrimColor: Flow<Int> = flowOf(Color.BLACK) - private val clickListener = - View.OnClickListener { - if (!falsingManager.isFalseTap(FalsingManager.LOW_PENALTY)) { - statusBarKeyguardViewManager.showPrimaryBouncer(/* scrimmed */ true) - } - } + val registerForDismissGestures: Flow<Boolean> = + transitionToAlternateBouncerProgress.map { it == 1f }.distinctUntilChanged() - val onClickListener: Flow<View.OnClickListener?> = - transitionToAlternateBouncerProgress - .map { - if (it == 1f) { - clickListener - } else { - null - } - } - .distinctUntilChanged() + fun showPrimaryBouncer() { + statusBarKeyguardViewManager.showPrimaryBouncer(/* scrimmed */ true) + } } diff --git a/packages/SystemUI/tests/src/com/android/systemui/bouncer/domain/interactor/AlternateBouncerInteractorTest.kt b/packages/SystemUI/tests/src/com/android/systemui/bouncer/domain/interactor/AlternateBouncerInteractorTest.kt index 0d44ed30431f..f0d26b6bbb78 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/bouncer/domain/interactor/AlternateBouncerInteractorTest.kt +++ b/packages/SystemUI/tests/src/com/android/systemui/bouncer/domain/interactor/AlternateBouncerInteractorTest.kt @@ -67,6 +67,13 @@ class AlternateBouncerInteractorTest : SysuiTestCase() { ) biometricSettingsRepository = FakeBiometricSettingsRepository() fingerprintPropertyRepository = FakeFingerprintPropertyRepository() + + mSetFlagsRule.disableFlags(Flags.FLAG_DEVICE_ENTRY_UDFPS_REFACTOR) + initializeUnderTest() + } + + private fun initializeUnderTest() { + // Set any feature flags before creating the alternateBouncerInteractor underTest = AlternateBouncerInteractor( statusBarStateController, @@ -161,6 +168,7 @@ class AlternateBouncerInteractorTest : SysuiTestCase() { @Test fun canShowAlternateBouncerForFingerprint_rearFps() { mSetFlagsRule.enableFlags(Flags.FLAG_DEVICE_ENTRY_UDFPS_REFACTOR) + initializeUnderTest() givenCanShowAlternateBouncer() fingerprintPropertyRepository.supportsRearFps() // does not support alternate bouncer @@ -169,7 +177,7 @@ class AlternateBouncerInteractorTest : SysuiTestCase() { @Test fun alternateBouncerUiAvailable_fromMultipleSources() { - mSetFlagsRule.disableFlags(Flags.FLAG_DEVICE_ENTRY_UDFPS_REFACTOR) + initializeUnderTest() assertFalse(bouncerRepository.alternateBouncerUIAvailable.value) // GIVEN there are two different sources indicating the alternate bouncer is available diff --git a/packages/SystemUI/tests/src/com/android/systemui/keyguard/ui/view/layout/blueprints/DefaultKeyguardBlueprintTest.kt b/packages/SystemUI/tests/src/com/android/systemui/keyguard/ui/view/layout/blueprints/DefaultKeyguardBlueprintTest.kt index 15a17827a603..740fce988a68 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/keyguard/ui/view/layout/blueprints/DefaultKeyguardBlueprintTest.kt +++ b/packages/SystemUI/tests/src/com/android/systemui/keyguard/ui/view/layout/blueprints/DefaultKeyguardBlueprintTest.kt @@ -30,7 +30,7 @@ import com.android.systemui.keyguard.ui.view.KeyguardRootView import com.android.systemui.keyguard.ui.view.layout.items.ClockSection import com.android.systemui.keyguard.ui.view.layout.sections.AodBurnInSection import com.android.systemui.keyguard.ui.view.layout.sections.AodNotificationIconsSection -import com.android.systemui.keyguard.ui.view.layout.sections.DefaultDeviceEntryIconSection +import com.android.systemui.keyguard.ui.view.layout.sections.DefaultDeviceEntrySection import com.android.systemui.keyguard.ui.view.layout.sections.DefaultIndicationAreaSection import com.android.systemui.keyguard.ui.view.layout.sections.DefaultNotificationStackScrollLayoutSection import com.android.systemui.keyguard.ui.view.layout.sections.DefaultSettingsPopupMenuSection @@ -57,7 +57,7 @@ class DefaultKeyguardBlueprintTest : SysuiTestCase() { private lateinit var underTest: DefaultKeyguardBlueprint private lateinit var rootView: KeyguardRootView @Mock private lateinit var defaultIndicationAreaSection: DefaultIndicationAreaSection - @Mock private lateinit var mDefaultDeviceEntryIconSection: DefaultDeviceEntryIconSection + @Mock private lateinit var mDefaultDeviceEntrySection: DefaultDeviceEntrySection @Mock private lateinit var defaultShortcutsSection: DefaultShortcutsSection @Mock private lateinit var defaultAmbientIndicationAreaSection: Optional<KeyguardSection> @Mock private lateinit var defaultSettingsPopupMenuSection: DefaultSettingsPopupMenuSection @@ -78,7 +78,7 @@ class DefaultKeyguardBlueprintTest : SysuiTestCase() { underTest = DefaultKeyguardBlueprint( defaultIndicationAreaSection, - mDefaultDeviceEntryIconSection, + mDefaultDeviceEntrySection, defaultShortcutsSection, defaultAmbientIndicationAreaSection, defaultSettingsPopupMenuSection, @@ -105,14 +105,14 @@ class DefaultKeyguardBlueprintTest : SysuiTestCase() { val prevBlueprint = mock(KeyguardBlueprint::class.java) val someSection = mock(KeyguardSection::class.java) whenever(prevBlueprint.sections) - .thenReturn(underTest.sections.minus(mDefaultDeviceEntryIconSection).plus(someSection)) + .thenReturn(underTest.sections.minus(mDefaultDeviceEntrySection).plus(someSection)) val constraintLayout = ConstraintLayout(context, null) underTest.replaceViews(prevBlueprint, constraintLayout) - underTest.sections.minus(mDefaultDeviceEntryIconSection).forEach { + underTest.sections.minus(mDefaultDeviceEntrySection).forEach { verify(it, never())?.addViews(constraintLayout) } - verify(mDefaultDeviceEntryIconSection).addViews(constraintLayout) + verify(mDefaultDeviceEntrySection).addViews(constraintLayout) verify(someSection).removeViews(constraintLayout) } diff --git a/packages/SystemUI/tests/src/com/android/systemui/keyguard/ui/view/layout/sections/DefaultDeviceEntryIconSectionTest.kt b/packages/SystemUI/tests/src/com/android/systemui/keyguard/ui/view/layout/sections/DefaultDeviceEntrySectionTest.kt index d9760456bcef..67fba42aac5b 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/keyguard/ui/view/layout/sections/DefaultDeviceEntryIconSectionTest.kt +++ b/packages/SystemUI/tests/src/com/android/systemui/keyguard/ui/view/layout/sections/DefaultDeviceEntrySectionTest.kt @@ -30,6 +30,7 @@ import com.android.systemui.biometrics.AuthController import com.android.systemui.flags.FakeFeatureFlags import com.android.systemui.flags.FakeFeatureFlagsClassic import com.android.systemui.flags.Flags +import com.android.systemui.keyguard.ui.SwipeUpAnywhereGestureHandler import com.android.systemui.keyguard.ui.viewmodel.AlternateBouncerViewModel import com.android.systemui.keyguard.ui.viewmodel.DeviceEntryBackgroundViewModel import com.android.systemui.keyguard.ui.viewmodel.DeviceEntryForegroundViewModel @@ -38,6 +39,7 @@ import com.android.systemui.plugins.FalsingManager import com.android.systemui.res.R import com.android.systemui.shade.NotificationPanelView import com.android.systemui.statusbar.NotificationShadeWindowController +import com.android.systemui.statusbar.gesture.TapGestureDetector import com.google.common.truth.Truth.assertThat import kotlinx.coroutines.ExperimentalCoroutinesApi import kotlinx.coroutines.test.TestScope @@ -53,7 +55,7 @@ import org.mockito.MockitoAnnotations @ExperimentalCoroutinesApi @RunWith(JUnit4::class) @SmallTest -class DefaultDeviceEntryIconSectionTest : SysuiTestCase() { +class DefaultDeviceEntrySectionTest : SysuiTestCase() { @Mock private lateinit var keyguardUpdateMonitor: KeyguardUpdateMonitor @Mock private lateinit var authController: AuthController @Mock(answer = Answers.RETURNS_DEEP_STUBS) private lateinit var windowManager: WindowManager @@ -61,7 +63,7 @@ class DefaultDeviceEntryIconSectionTest : SysuiTestCase() { private lateinit var featureFlags: FakeFeatureFlags @Mock private lateinit var lockIconViewController: LockIconViewController @Mock private lateinit var falsingManager: FalsingManager - private lateinit var underTest: DefaultDeviceEntryIconSection + private lateinit var underTest: DefaultDeviceEntrySection @Before fun setup() { @@ -72,7 +74,7 @@ class DefaultDeviceEntryIconSectionTest : SysuiTestCase() { featureFlags = FakeFeatureFlagsClassic().apply { set(Flags.LOCKSCREEN_ENABLE_LANDSCAPE, false) } underTest = - DefaultDeviceEntryIconSection( + DefaultDeviceEntrySection( keyguardUpdateMonitor, authController, windowManager, @@ -87,6 +89,8 @@ class DefaultDeviceEntryIconSectionTest : SysuiTestCase() { { mock(AlternateBouncerViewModel::class.java) }, { mock(NotificationShadeWindowController::class.java) }, TestScope().backgroundScope, + { mock(SwipeUpAnywhereGestureHandler::class.java) }, + { mock(TapGestureDetector::class.java) }, ) } diff --git a/packages/SystemUI/tests/src/com/android/systemui/keyguard/ui/viewmodel/AlternateBouncerViewModelTest.kt b/packages/SystemUI/tests/src/com/android/systemui/keyguard/ui/viewmodel/AlternateBouncerViewModelTest.kt index 1768f8c4385b..fc9f54ec74f7 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/keyguard/ui/viewmodel/AlternateBouncerViewModelTest.kt +++ b/packages/SystemUI/tests/src/com/android/systemui/keyguard/ui/viewmodel/AlternateBouncerViewModelTest.kt @@ -27,7 +27,6 @@ import com.android.systemui.keyguard.domain.interactor.KeyguardTransitionInterac import com.android.systemui.keyguard.shared.model.KeyguardState import com.android.systemui.keyguard.shared.model.TransitionState import com.android.systemui.keyguard.shared.model.TransitionStep -import com.android.systemui.plugins.FalsingManager import com.android.systemui.statusbar.phone.StatusBarKeyguardViewManager import com.google.common.collect.Range import com.google.common.truth.Truth.assertThat @@ -50,7 +49,6 @@ class AlternateBouncerViewModelTest : SysuiTestCase() { private lateinit var testScope: TestScope @Mock private lateinit var statusBarKeyguardViewManager: StatusBarKeyguardViewManager - @Mock private lateinit var falsingManager: FalsingManager private lateinit var transitionRepository: FakeKeyguardTransitionRepository private lateinit var transitionInteractor: KeyguardTransitionInteractor @@ -69,7 +67,6 @@ class AlternateBouncerViewModelTest : SysuiTestCase() { AlternateBouncerViewModel( statusBarKeyguardViewManager, transitionInteractor, - falsingManager, ) } @@ -106,46 +103,37 @@ class AlternateBouncerViewModelTest : SysuiTestCase() { } @Test - fun clickListenerUpdate() = + fun forcePluginOpen() = runTest(UnconfinedTestDispatcher()) { - val clickListener by collectLastValue(underTest.onClickListener) - - // keyguard state => ALTERNATE_BOUNCER + val forcePluginOpen by collectLastValue(underTest.forcePluginOpen) transitionRepository.sendTransitionStep( stepToAlternateBouncer(0f, TransitionState.STARTED) ) - assertThat(clickListener).isNull() transitionRepository.sendTransitionStep(stepToAlternateBouncer(.3f)) - assertThat(clickListener).isNull() transitionRepository.sendTransitionStep(stepToAlternateBouncer(.6f)) - assertThat(clickListener).isNull() transitionRepository.sendTransitionStep(stepToAlternateBouncer(1f)) - assertThat(clickListener).isNotNull() + assertThat(forcePluginOpen).isTrue() - // ALTERNATE_BOUNCER -> keyguard state transitionRepository.sendTransitionStep( stepFromAlternateBouncer(0f, TransitionState.STARTED) ) - assertThat(clickListener).isNotNull() transitionRepository.sendTransitionStep(stepFromAlternateBouncer(.3f)) - assertThat(clickListener).isNull() transitionRepository.sendTransitionStep(stepFromAlternateBouncer(.6f)) - assertThat(clickListener).isNull() transitionRepository.sendTransitionStep(stepFromAlternateBouncer(1f)) - assertThat(clickListener).isNull() + assertThat(forcePluginOpen).isFalse() } @Test - fun forcePluginOpen() = + fun registerForDismissGestures() = runTest(UnconfinedTestDispatcher()) { - val forcePluginOpen by collectLastValue(underTest.forcePluginOpen) + val registerForDismissGestures by collectLastValue(underTest.registerForDismissGestures) transitionRepository.sendTransitionStep( stepToAlternateBouncer(0f, TransitionState.STARTED) ) transitionRepository.sendTransitionStep(stepToAlternateBouncer(.3f)) transitionRepository.sendTransitionStep(stepToAlternateBouncer(.6f)) transitionRepository.sendTransitionStep(stepToAlternateBouncer(1f)) - assertThat(forcePluginOpen).isTrue() + assertThat(registerForDismissGestures).isTrue() transitionRepository.sendTransitionStep( stepFromAlternateBouncer(0f, TransitionState.STARTED) @@ -153,7 +141,7 @@ class AlternateBouncerViewModelTest : SysuiTestCase() { transitionRepository.sendTransitionStep(stepFromAlternateBouncer(.3f)) transitionRepository.sendTransitionStep(stepFromAlternateBouncer(.6f)) transitionRepository.sendTransitionStep(stepFromAlternateBouncer(1f)) - assertThat(forcePluginOpen).isFalse() + assertThat(registerForDismissGestures).isFalse() } private fun stepToAlternateBouncer( |