summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--packages/SystemUI/src/com/android/systemui/biometrics/UdfpsController.java7
-rw-r--r--packages/SystemUI/src/com/android/systemui/classifier/Classifier.java2
-rw-r--r--packages/SystemUI/src/com/android/systemui/classifier/DistanceClassifier.java4
-rw-r--r--packages/SystemUI/src/com/android/systemui/classifier/TypeClassifier.java2
-rw-r--r--packages/SystemUI/src/com/android/systemui/keyguard/ui/SwipeUpAnywhereGestureHandler.kt45
-rw-r--r--packages/SystemUI/src/com/android/systemui/keyguard/ui/binder/AlternateBouncerViewBinder.kt40
-rw-r--r--packages/SystemUI/src/com/android/systemui/keyguard/ui/view/layout/blueprints/DefaultKeyguardBlueprint.kt6
-rw-r--r--packages/SystemUI/src/com/android/systemui/keyguard/ui/view/layout/blueprints/ShortcutsBesideUdfpsKeyguardBlueprint.kt6
-rw-r--r--packages/SystemUI/src/com/android/systemui/keyguard/ui/view/layout/blueprints/SplitShadeKeyguardBlueprint.kt6
-rw-r--r--packages/SystemUI/src/com/android/systemui/keyguard/ui/view/layout/sections/DefaultDeviceEntrySection.kt (renamed from packages/SystemUI/src/com/android/systemui/keyguard/ui/view/layout/sections/DefaultDeviceEntryIconSection.kt)9
-rw-r--r--packages/SystemUI/src/com/android/systemui/keyguard/ui/viewmodel/AlternateBouncerViewModel.kt26
-rw-r--r--packages/SystemUI/tests/src/com/android/systemui/bouncer/domain/interactor/AlternateBouncerInteractorTest.kt10
-rw-r--r--packages/SystemUI/tests/src/com/android/systemui/keyguard/ui/view/layout/blueprints/DefaultKeyguardBlueprintTest.kt12
-rw-r--r--packages/SystemUI/tests/src/com/android/systemui/keyguard/ui/view/layout/sections/DefaultDeviceEntrySectionTest.kt (renamed from packages/SystemUI/tests/src/com/android/systemui/keyguard/ui/view/layout/sections/DefaultDeviceEntryIconSectionTest.kt)10
-rw-r--r--packages/SystemUI/tests/src/com/android/systemui/keyguard/ui/viewmodel/AlternateBouncerViewModelTest.kt28
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(