diff options
9 files changed, 66 insertions, 3 deletions
diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardViewConfigurator.kt b/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardViewConfigurator.kt index 017dac200431..20da00ee3daf 100644 --- a/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardViewConfigurator.kt +++ b/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardViewConfigurator.kt @@ -43,6 +43,7 @@ import com.android.systemui.keyguard.ui.viewmodel.KeyguardBlueprintViewModel import com.android.systemui.keyguard.ui.viewmodel.KeyguardIndicationAreaViewModel import com.android.systemui.keyguard.ui.viewmodel.KeyguardRootViewModel import com.android.systemui.keyguard.ui.viewmodel.OccludingAppDeviceEntryMessageViewModel +import com.android.systemui.plugins.FalsingManager import com.android.systemui.res.R import com.android.systemui.shade.NotificationShadeWindowView import com.android.systemui.shade.domain.interactor.ShadeInteractor @@ -81,6 +82,7 @@ constructor( private val interactionJankMonitor: InteractionJankMonitor, private val deviceEntryHapticsInteractor: DeviceEntryHapticsInteractor, private val vibratorHelper: VibratorHelper, + private val falsingManager: FalsingManager, ) : CoreStartable { private var rootViewHandle: DisposableHandle? = null @@ -155,6 +157,7 @@ constructor( interactionJankMonitor, deviceEntryHapticsInteractor, vibratorHelper, + falsingManager, ) } diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/data/repository/KeyguardRepository.kt b/packages/SystemUI/src/com/android/systemui/keyguard/data/repository/KeyguardRepository.kt index 2d6c0e1c13b2..b51edab6dfe8 100644 --- a/packages/SystemUI/src/com/android/systemui/keyguard/data/repository/KeyguardRepository.kt +++ b/packages/SystemUI/src/com/android/systemui/keyguard/data/repository/KeyguardRepository.kt @@ -157,6 +157,9 @@ interface KeyguardRepository { val lastDozeTapToWakePosition: StateFlow<Point?> + /** Last point that [KeyguardRootView] was tapped */ + val lastRootViewTapPosition: MutableStateFlow<Point?> + /** Observable for the [StatusBarState] */ val statusBarState: StateFlow<StatusBarState> @@ -418,6 +421,8 @@ constructor( _lastDozeTapToWakePosition.value = position } + override val lastRootViewTapPosition: MutableStateFlow<Point?> = MutableStateFlow(null) + override val isDreamingWithOverlay: Flow<Boolean> = conflatedCallbackFlow { val callback = diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/KeyguardInteractor.kt b/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/KeyguardInteractor.kt index b8c392591494..702386d3b498 100644 --- a/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/KeyguardInteractor.kt +++ b/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/KeyguardInteractor.kt @@ -171,6 +171,9 @@ constructor( /** Whether the keyguard is going away. */ val isKeyguardGoingAway: Flow<Boolean> = repository.isKeyguardGoingAway + /** Last point that [KeyguardRootView] view was tapped */ + val lastRootViewTapPosition: Flow<Point?> = repository.lastRootViewTapPosition.asStateFlow() + /** Whether the primary bouncer is showing or not. */ val primaryBouncerShowing: Flow<Boolean> = bouncerRepository.primaryBouncerShow @@ -304,6 +307,10 @@ constructor( repository.setClockShouldBeCentered(shouldBeCentered) } + fun setLastRootViewTapPosition(point: Point?) { + repository.lastRootViewTapPosition.value = point + } + companion object { private const val TAG = "KeyguardInteractor" } diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/ui/binder/KeyguardRootViewBinder.kt b/packages/SystemUI/src/com/android/systemui/keyguard/ui/binder/KeyguardRootViewBinder.kt index 02c6f33ffd01..e603ead463f2 100644 --- a/packages/SystemUI/src/com/android/systemui/keyguard/ui/binder/KeyguardRootViewBinder.kt +++ b/packages/SystemUI/src/com/android/systemui/keyguard/ui/binder/KeyguardRootViewBinder.kt @@ -19,6 +19,8 @@ package com.android.systemui.keyguard.ui.binder import android.animation.Animator import android.animation.AnimatorListenerAdapter import android.annotation.DrawableRes +import android.annotation.SuppressLint +import android.graphics.Point import android.view.HapticFeedbackConstants import android.view.View import android.view.View.OnLayoutChangeListener @@ -47,6 +49,7 @@ import com.android.systemui.keyguard.shared.model.TransitionState import com.android.systemui.keyguard.ui.viewmodel.KeyguardRootViewModel import com.android.systemui.keyguard.ui.viewmodel.OccludingAppDeviceEntryMessageViewModel import com.android.systemui.lifecycle.repeatWhenAttached +import com.android.systemui.plugins.FalsingManager import com.android.systemui.plugins.clocks.ClockController import com.android.systemui.res.R import com.android.systemui.shade.domain.interactor.ShadeInteractor @@ -73,6 +76,7 @@ import kotlinx.coroutines.launch @OptIn(ExperimentalCoroutinesApi::class) object KeyguardRootViewBinder { + @SuppressLint("ClickableViewAccessibility") @JvmStatic fun bind( view: ViewGroup, @@ -87,6 +91,7 @@ object KeyguardRootViewBinder { interactionJankMonitor: InteractionJankMonitor?, deviceEntryHapticsInteractor: DeviceEntryHapticsInteractor?, vibratorHelper: VibratorHelper?, + falsingManager: FalsingManager?, ): DisposableHandle { var onLayoutChangeListener: OnLayoutChange? = null val childViews = mutableMapOf<Int, View>() @@ -94,6 +99,16 @@ object KeyguardRootViewBinder { val burnInLayerId = R.id.burn_in_layer val aodNotificationIconContainerId = R.id.aod_notification_icon_container val largeClockId = R.id.lockscreen_clock_view_large + + if (keyguardBottomAreaRefactor()) { + view.setOnTouchListener { _, event -> + if (falsingManager?.isFalseTap(FalsingManager.LOW_PENALTY) == false) { + viewModel.setRootViewLastTapPosition(Point(event.x.toInt(), event.y.toInt())) + } + false + } + } + val disposableHandle = view.repeatWhenAttached { repeatOnLifecycle(Lifecycle.State.CREATED) { diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/ui/binder/KeyguardSettingsViewBinder.kt b/packages/SystemUI/src/com/android/systemui/keyguard/ui/binder/KeyguardSettingsViewBinder.kt index 8514225fda90..11e63e76c289 100644 --- a/packages/SystemUI/src/com/android/systemui/keyguard/ui/binder/KeyguardSettingsViewBinder.kt +++ b/packages/SystemUI/src/com/android/systemui/keyguard/ui/binder/KeyguardSettingsViewBinder.kt @@ -17,6 +17,7 @@ package com.android.systemui.keyguard.ui.binder +import android.graphics.Rect import android.view.View import androidx.core.view.isVisible import androidx.lifecycle.Lifecycle @@ -25,6 +26,8 @@ import com.android.systemui.animation.ActivityLaunchAnimator import com.android.systemui.animation.view.LaunchableLinearLayout import com.android.systemui.common.ui.binder.IconViewBinder import com.android.systemui.common.ui.binder.TextViewBinder +import com.android.systemui.keyguard.ui.viewmodel.KeyguardLongPressViewModel +import com.android.systemui.keyguard.ui.viewmodel.KeyguardRootViewModel import com.android.systemui.keyguard.ui.viewmodel.KeyguardSettingsMenuViewModel import com.android.systemui.keyguard.util.WallpaperPickerIntentUtils import com.android.systemui.keyguard.util.WallpaperPickerIntentUtils.LAUNCH_SOURCE_KEYGUARD @@ -35,12 +38,15 @@ import com.android.systemui.statusbar.VibratorHelper import kotlinx.coroutines.DisposableHandle import kotlinx.coroutines.flow.distinctUntilChanged import kotlinx.coroutines.flow.filter +import kotlinx.coroutines.flow.filterNotNull import kotlinx.coroutines.launch object KeyguardSettingsViewBinder { fun bind( parentView: View, viewModel: KeyguardSettingsMenuViewModel, + longPressViewModel: KeyguardLongPressViewModel, + rootViewModel: KeyguardRootViewModel, vibratorHelper: VibratorHelper, activityStarter: ActivityStarter ): DisposableHandle { @@ -88,6 +94,18 @@ object KeyguardSettingsViewBinder { } } } + + launch { + rootViewModel.lastRootViewTapPosition.filterNotNull().collect { point -> + if (view.isVisible) { + val hitRect = Rect() + view.getHitRect(hitRect) + if (!hitRect.contains(point.x, point.y)) { + longPressViewModel.onTouchedOutside() + } + } + } + } } } return disposableHandle diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/ui/preview/KeyguardPreviewRenderer.kt b/packages/SystemUI/src/com/android/systemui/keyguard/ui/preview/KeyguardPreviewRenderer.kt index 4eecfdefa663..03e45fdbe75f 100644 --- a/packages/SystemUI/src/com/android/systemui/keyguard/ui/preview/KeyguardPreviewRenderer.kt +++ b/packages/SystemUI/src/com/android/systemui/keyguard/ui/preview/KeyguardPreviewRenderer.kt @@ -376,6 +376,7 @@ constructor( null, // jank monitor not required for preview mode null, // device entry haptics not required preview mode null, // device entry haptics not required for preview mode + null, // falsing manager not required for preview mode ) ) } diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/ui/view/layout/sections/DefaultSettingsPopupMenuSection.kt b/packages/SystemUI/src/com/android/systemui/keyguard/ui/view/layout/sections/DefaultSettingsPopupMenuSection.kt index 9a33f08386a3..4bc2d86e6b54 100644 --- a/packages/SystemUI/src/com/android/systemui/keyguard/ui/view/layout/sections/DefaultSettingsPopupMenuSection.kt +++ b/packages/SystemUI/src/com/android/systemui/keyguard/ui/view/layout/sections/DefaultSettingsPopupMenuSection.kt @@ -29,15 +29,15 @@ import androidx.constraintlayout.widget.ConstraintSet.START import androidx.constraintlayout.widget.ConstraintSet.WRAP_CONTENT import androidx.core.view.isVisible import com.android.systemui.Flags.keyguardBottomAreaRefactor -import com.android.systemui.res.R import com.android.systemui.animation.view.LaunchableLinearLayout import com.android.systemui.dagger.qualifiers.Main -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.binder.KeyguardSettingsViewBinder +import com.android.systemui.keyguard.ui.viewmodel.KeyguardLongPressViewModel +import com.android.systemui.keyguard.ui.viewmodel.KeyguardRootViewModel import com.android.systemui.keyguard.ui.viewmodel.KeyguardSettingsMenuViewModel import com.android.systemui.plugins.ActivityStarter +import com.android.systemui.res.R import com.android.systemui.statusbar.VibratorHelper import javax.inject.Inject import kotlinx.coroutines.DisposableHandle @@ -47,6 +47,8 @@ class DefaultSettingsPopupMenuSection constructor( @Main private val resources: Resources, private val keyguardSettingsMenuViewModel: KeyguardSettingsMenuViewModel, + private val keyguardLongPressViewModel: KeyguardLongPressViewModel, + private val keyguardRootViewModel: KeyguardRootViewModel, private val vibratorHelper: VibratorHelper, private val activityStarter: ActivityStarter, ) : KeyguardSection() { @@ -73,6 +75,8 @@ constructor( KeyguardSettingsViewBinder.bind( constraintLayout.requireViewById<View>(R.id.keyguard_settings_button), keyguardSettingsMenuViewModel, + keyguardLongPressViewModel, + keyguardRootViewModel, vibratorHelper, activityStarter, ) diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/ui/viewmodel/KeyguardRootViewModel.kt b/packages/SystemUI/src/com/android/systemui/keyguard/ui/viewmodel/KeyguardRootViewModel.kt index 97ddbb033648..4588e02df10e 100644 --- a/packages/SystemUI/src/com/android/systemui/keyguard/ui/viewmodel/KeyguardRootViewModel.kt +++ b/packages/SystemUI/src/com/android/systemui/keyguard/ui/viewmodel/KeyguardRootViewModel.kt @@ -17,6 +17,7 @@ package com.android.systemui.keyguard.ui.viewmodel +import android.graphics.Point import android.util.MathUtils import android.view.View.VISIBLE import com.android.app.animation.Interpolators @@ -101,6 +102,9 @@ constructor( val goneToAodTransition = keyguardTransitionInteractor.transition(from = GONE, to = AOD) + /** Last point that the root view was tapped */ + val lastRootViewTapPosition: Flow<Point?> = keyguardInteractor.lastRootViewTapPosition + /** the shared notification container bounds *on the lockscreen* */ val notificationBounds: StateFlow<NotificationContainerBounds> = keyguardInteractor.notificationContainerBounds @@ -262,4 +266,8 @@ constructor( } .toAnimatedValueFlow() } + + fun setRootViewLastTapPosition(point: Point) { + keyguardInteractor.setLastRootViewTapPosition(point) + } } diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/data/repository/FakeKeyguardRepository.kt b/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/data/repository/FakeKeyguardRepository.kt index 81a7bec52bb5..0e7c6625264c 100644 --- a/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/data/repository/FakeKeyguardRepository.kt +++ b/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/data/repository/FakeKeyguardRepository.kt @@ -119,6 +119,8 @@ class FakeKeyguardRepository @Inject constructor() : KeyguardRepository { private val _keyguardAlpha = MutableStateFlow(1f) override val keyguardAlpha: StateFlow<Float> = _keyguardAlpha + override val lastRootViewTapPosition: MutableStateFlow<Point?> = MutableStateFlow(null) + override fun setQuickSettingsVisible(isVisible: Boolean) { _isQuickSettingsVisible.value = isVisible } |