Fix falsing in new QS
This reproduces the falsing calls that indicates interactions with QS
from the legacy code.
Flag: com.android.systemui.qs_ui_refactor_compose_fragment
Bug: 379311646
Test: manual, swipe pages and brightness on lockscreen
Change-Id: I071e759ec0db19a23887e1f65ded6f6f827b72b9
diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/brightness/ui/viewmodel/BrightnessSliderViewModelTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/brightness/ui/viewmodel/BrightnessSliderViewModelTest.kt
index 0f148f8..2d093bf 100644
--- a/packages/SystemUI/multivalentTests/src/com/android/systemui/brightness/ui/viewmodel/BrightnessSliderViewModelTest.kt
+++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/brightness/ui/viewmodel/BrightnessSliderViewModelTest.kt
@@ -25,6 +25,7 @@
import com.android.systemui.brightness.domain.interactor.screenBrightnessInteractor
import com.android.systemui.brightness.shared.model.GammaBrightness
import com.android.systemui.brightness.shared.model.LinearBrightness
+import com.android.systemui.classifier.domain.interactor.falsingInteractor
import com.android.systemui.common.shared.model.ContentDescription
import com.android.systemui.common.shared.model.Icon
import com.android.systemui.common.shared.model.Text
@@ -61,6 +62,7 @@
brightnessPolicyEnforcementInteractor,
sliderHapticsViewModelFactory,
brightnessMirrorShowingInteractor,
+ falsingInteractor,
supportsMirroring = true,
brightnessWarningToast,
)
diff --git a/packages/SystemUI/src/com/android/systemui/brightness/ui/compose/BrightnessSlider.kt b/packages/SystemUI/src/com/android/systemui/brightness/ui/compose/BrightnessSlider.kt
index ccd953d..5bad9fc 100644
--- a/packages/SystemUI/src/com/android/systemui/brightness/ui/compose/BrightnessSlider.kt
+++ b/packages/SystemUI/src/com/android/systemui/brightness/ui/compose/BrightnessSlider.kt
@@ -16,6 +16,7 @@
package com.android.systemui.brightness.ui.compose
+import android.view.MotionEvent
import androidx.compose.animation.core.animateFloatAsState
import androidx.compose.foundation.clickable
import androidx.compose.foundation.gestures.Orientation
@@ -41,6 +42,7 @@
import androidx.compose.ui.geometry.Offset
import androidx.compose.ui.geometry.Size
import androidx.compose.ui.graphics.Color
+import androidx.compose.ui.input.pointer.pointerInteropFilter
import androidx.compose.ui.platform.LocalContext
import androidx.compose.ui.res.colorResource
import androidx.compose.ui.res.stringResource
@@ -221,7 +223,16 @@
)
.then(if (viewModel.showMirror) Modifier.drawInOverlay() else Modifier)
.sliderBackground(containerColor)
- .fillMaxWidth(),
+ .fillMaxWidth()
+ .pointerInteropFilter {
+ if (
+ it.actionMasked == MotionEvent.ACTION_UP ||
+ it.actionMasked == MotionEvent.ACTION_CANCEL
+ ) {
+ viewModel.emitBrightnessTouchForFalsing()
+ }
+ false
+ },
formatter = viewModel::formatValue,
hapticsViewModelFactory = viewModel.hapticsViewModelFactory,
)
diff --git a/packages/SystemUI/src/com/android/systemui/brightness/ui/viewmodel/BrightnessSliderViewModel.kt b/packages/SystemUI/src/com/android/systemui/brightness/ui/viewmodel/BrightnessSliderViewModel.kt
index 1630ee5..7df7155 100644
--- a/packages/SystemUI/src/com/android/systemui/brightness/ui/viewmodel/BrightnessSliderViewModel.kt
+++ b/packages/SystemUI/src/com/android/systemui/brightness/ui/viewmodel/BrightnessSliderViewModel.kt
@@ -16,12 +16,14 @@
package com.android.systemui.brightness.ui.viewmodel
-import androidx.compose.runtime.getValue
import android.content.Context
import androidx.annotation.StringRes
+import androidx.compose.runtime.getValue
import com.android.systemui.brightness.domain.interactor.BrightnessPolicyEnforcementInteractor
import com.android.systemui.brightness.domain.interactor.ScreenBrightnessInteractor
import com.android.systemui.brightness.shared.model.GammaBrightness
+import com.android.systemui.classifier.Classifier
+import com.android.systemui.classifier.domain.interactor.FalsingInteractor
import com.android.systemui.common.shared.model.ContentDescription
import com.android.systemui.common.shared.model.Icon
import com.android.systemui.common.shared.model.Text
@@ -52,6 +54,7 @@
private val brightnessPolicyEnforcementInteractor: BrightnessPolicyEnforcementInteractor,
val hapticsViewModelFactory: SliderHapticsViewModel.Factory,
private val brightnessMirrorShowingInteractor: BrightnessMirrorShowingInteractor,
+ private val falsingInteractor: FalsingInteractor,
@Assisted private val supportsMirroring: Boolean,
private val brightnessWarningToast: BrightnessWarningToast,
) : ExclusiveActivatable() {
@@ -87,6 +90,10 @@
brightnessWarningToast.show(viewContext, resId)
}
+ fun emitBrightnessTouchForFalsing() {
+ falsingInteractor.isFalseTouch(Classifier.BRIGHTNESS_SLIDER)
+ }
+
/**
* As a brightness slider is dragged, the corresponding events should be sent using this method.
*/
diff --git a/packages/SystemUI/src/com/android/systemui/qs/composefragment/QSFragmentCompose.kt b/packages/SystemUI/src/com/android/systemui/qs/composefragment/QSFragmentCompose.kt
index 21c45c5..32790be 100644
--- a/packages/SystemUI/src/com/android/systemui/qs/composefragment/QSFragmentCompose.kt
+++ b/packages/SystemUI/src/com/android/systemui/qs/composefragment/QSFragmentCompose.kt
@@ -233,6 +233,7 @@
// Only allow scrolling when we are fully expanded. That way, we don't intercept
// swipes in lockscreen (when somehow QS is receiving touches).
{ (scrollState.canScrollForward && viewModel.isQsFullyExpanded) || isCustomizing },
+ viewModel::emitMotionEventForFalsingSwipeNested,
)
frame.addView(
composeView,
@@ -951,6 +952,7 @@
private val clippingEnabledProvider: () -> Boolean,
private val clippingTopProvider: () -> Int,
private val canScrollForwardQs: () -> Boolean,
+ private val emitMotionEventForFalsing: () -> Unit,
) : FrameLayout(context) {
override fun isTransformedTouchPointInView(
x: Float,
@@ -967,6 +969,32 @@
val touchSlop = ViewConfiguration.get(context).scaledTouchSlop
var downY = 0f
+ var preventingIntercept = false
+
+ override fun onTouchEvent(event: MotionEvent): Boolean {
+ val action = event.actionMasked
+ when (action) {
+ MotionEvent.ACTION_DOWN -> {
+ preventingIntercept = false
+ if (canScrollVertically(1)) {
+ // If we can scroll down, make sure we're not intercepted by the parent
+ preventingIntercept = true
+ parent?.requestDisallowInterceptTouchEvent(true)
+ } else if (!canScrollVertically(-1)) {
+ // Don't pass on the touch to the view, because scrolling will unconditionally
+ // disallow interception even if we can't scroll.
+ // if a user can't scroll at all, we should never listen to the touch.
+ return false
+ }
+ }
+ MotionEvent.ACTION_UP -> {
+ if (preventingIntercept) {
+ emitMotionEventForFalsing()
+ }
+ }
+ }
+ return super.onTouchEvent(event)
+ }
override fun onInterceptTouchEvent(ev: MotionEvent): Boolean {
// If there's a touch on this view and we can scroll down, we don't want to be intercepted
@@ -974,8 +1002,10 @@
when (action) {
MotionEvent.ACTION_DOWN -> {
+ preventingIntercept = false
// If we can scroll down, make sure none of our parents intercepts us.
if (canScrollForwardQs()) {
+ preventingIntercept = true
parent?.requestDisallowInterceptTouchEvent(true)
}
downY = ev.y
diff --git a/packages/SystemUI/src/com/android/systemui/qs/composefragment/dagger/QSFragmentComposeModule.kt b/packages/SystemUI/src/com/android/systemui/qs/composefragment/dagger/QSFragmentComposeModule.kt
index bea0d14..4c9df11 100644
--- a/packages/SystemUI/src/com/android/systemui/qs/composefragment/dagger/QSFragmentComposeModule.kt
+++ b/packages/SystemUI/src/com/android/systemui/qs/composefragment/dagger/QSFragmentComposeModule.kt
@@ -18,7 +18,6 @@
import android.content.Context
import com.android.systemui.dagger.SysUISingleton
-import com.android.systemui.dagger.qualifiers.Application
import com.android.systemui.log.table.TableLogBuffer
import com.android.systemui.log.table.TableLogBufferFactory
import com.android.systemui.qs.flags.QSComposeFragment
diff --git a/packages/SystemUI/src/com/android/systemui/qs/composefragment/viewmodel/QSFragmentComposeViewModel.kt b/packages/SystemUI/src/com/android/systemui/qs/composefragment/viewmodel/QSFragmentComposeViewModel.kt
index 5c582ba..02498d6 100644
--- a/packages/SystemUI/src/com/android/systemui/qs/composefragment/viewmodel/QSFragmentComposeViewModel.kt
+++ b/packages/SystemUI/src/com/android/systemui/qs/composefragment/viewmodel/QSFragmentComposeViewModel.kt
@@ -31,6 +31,8 @@
import com.android.keyguard.BouncerPanelExpansionCalculator
import com.android.systemui.Dumpable
import com.android.systemui.animation.ShadeInterpolation
+import com.android.systemui.classifier.Classifier
+import com.android.systemui.classifier.domain.interactor.FalsingInteractor
import com.android.systemui.common.ui.domain.interactor.ConfigurationInteractor
import com.android.systemui.dagger.qualifiers.Main
import com.android.systemui.deviceentry.domain.interactor.DeviceEntryInteractor
@@ -102,6 +104,7 @@
@ShadeDisplayAware configurationInteractor: ConfigurationInteractor,
private val largeScreenHeaderHelper: LargeScreenHeaderHelper,
private val squishinessInteractor: TileSquishinessInteractor,
+ private val falsingInteractor: FalsingInteractor,
private val inFirstPageViewModel: InFirstPageViewModel,
@QSFragmentComposeLog private val tableLogBuffer: TableLogBuffer,
mediaInRowInLandscapeViewModelFactory: MediaInRowInLandscapeViewModel.Factory,
@@ -437,6 +440,10 @@
}
}
+ fun emitMotionEventForFalsingSwipeNested() {
+ falsingInteractor.isFalseTouch(Classifier.QS_SWIPE_NESTED)
+ }
+
override suspend fun onActivated(): Nothing {
initMediaHosts() // init regardless of using media (same as current QS).
coroutineScope {
diff --git a/packages/SystemUI/src/com/android/systemui/qs/panels/ui/compose/PaginatedGridLayout.kt b/packages/SystemUI/src/com/android/systemui/qs/panels/ui/compose/PaginatedGridLayout.kt
index 789fdeb..32eaba2 100644
--- a/packages/SystemUI/src/com/android/systemui/qs/panels/ui/compose/PaginatedGridLayout.kt
+++ b/packages/SystemUI/src/com/android/systemui/qs/panels/ui/compose/PaginatedGridLayout.kt
@@ -16,6 +16,7 @@
package com.android.systemui.qs.panels.ui.compose
+import android.view.MotionEvent
import androidx.compose.foundation.layout.Arrangement.spacedBy
import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.PaddingValues
@@ -44,6 +45,7 @@
import androidx.compose.runtime.snapshotFlow
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
+import androidx.compose.ui.input.pointer.pointerInteropFilter
import androidx.compose.ui.res.stringResource
import androidx.compose.ui.unit.dp
import com.android.compose.animation.scene.SceneScope
@@ -115,7 +117,13 @@
state = pagerState,
modifier =
Modifier.sysuiResTag("qs_pager")
- .padding(horizontal = { -contentPaddingValue.roundToPx() }),
+ .padding(horizontal = { -contentPaddingValue.roundToPx() })
+ .pointerInteropFilter { event ->
+ if (event.actionMasked == MotionEvent.ACTION_UP) {
+ viewModel.registerSideSwipeGesture()
+ }
+ false
+ },
contentPadding = contentPadding,
pageSpacing = if (pages.size > 1) InterPageSpacing else 0.dp,
beyondViewportPageCount = 1,
diff --git a/packages/SystemUI/src/com/android/systemui/qs/panels/ui/viewmodel/PaginatedGridViewModel.kt b/packages/SystemUI/src/com/android/systemui/qs/panels/ui/viewmodel/PaginatedGridViewModel.kt
index bff330b..b5873be 100644
--- a/packages/SystemUI/src/com/android/systemui/qs/panels/ui/viewmodel/PaginatedGridViewModel.kt
+++ b/packages/SystemUI/src/com/android/systemui/qs/panels/ui/viewmodel/PaginatedGridViewModel.kt
@@ -17,6 +17,8 @@
package com.android.systemui.qs.panels.ui.viewmodel
import androidx.compose.runtime.getValue
+import com.android.systemui.classifier.Classifier.QS_SWIPE_SIDE
+import com.android.systemui.classifier.domain.interactor.FalsingInteractor
import com.android.systemui.development.ui.viewmodel.BuildNumberViewModel
import com.android.systemui.lifecycle.ExclusiveActivatable
import com.android.systemui.lifecycle.Hydrator
@@ -36,6 +38,7 @@
paginatedGridInteractor: PaginatedGridInteractor,
inFirstPageViewModel: InFirstPageViewModel,
val buildNumberViewModelFactory: BuildNumberViewModel.Factory,
+ private val falsingInteractor: FalsingInteractor,
) : IconTilesViewModel by iconTilesViewModel, ExclusiveActivatable() {
private val hydrator = Hydrator("PaginatedGridViewModel")
@@ -53,6 +56,10 @@
val columns: Int
get() = columnsWithMediaViewModel.columns
+ fun registerSideSwipeGesture() {
+ falsingInteractor.isFalseTouch(QS_SWIPE_SIDE)
+ }
+
override suspend fun onActivated(): Nothing {
coroutineScope {
launch { hydrator.activate() }
diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/brightness/ui/viewmodel/BrightnessSliderViewModelKosmos.kt b/packages/SystemUI/tests/utils/src/com/android/systemui/brightness/ui/viewmodel/BrightnessSliderViewModelKosmos.kt
index e36ad42..35e85bb 100644
--- a/packages/SystemUI/tests/utils/src/com/android/systemui/brightness/ui/viewmodel/BrightnessSliderViewModelKosmos.kt
+++ b/packages/SystemUI/tests/utils/src/com/android/systemui/brightness/ui/viewmodel/BrightnessSliderViewModelKosmos.kt
@@ -18,6 +18,7 @@
import com.android.systemui.brightness.domain.interactor.brightnessPolicyEnforcementInteractor
import com.android.systemui.brightness.domain.interactor.screenBrightnessInteractor
+import com.android.systemui.classifier.domain.interactor.falsingInteractor
import com.android.systemui.haptics.slider.sliderHapticsViewModelFactory
import com.android.systemui.kosmos.Kosmos
import com.android.systemui.settings.brightness.domain.interactor.brightnessMirrorShowingInteractor
@@ -33,6 +34,7 @@
hapticsViewModelFactory = sliderHapticsViewModelFactory,
brightnessMirrorShowingInteractor = brightnessMirrorShowingInteractor,
supportsMirroring = allowsMirroring,
+ falsingInteractor = falsingInteractor,
brightnessWarningToast = brightnessWarningToast,
)
}
diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/qs/composefragment/viewmodel/QSFragmentComposeViewModelKosmos.kt b/packages/SystemUI/tests/utils/src/com/android/systemui/qs/composefragment/viewmodel/QSFragmentComposeViewModelKosmos.kt
index 80db0ae..c574463 100644
--- a/packages/SystemUI/tests/utils/src/com/android/systemui/qs/composefragment/viewmodel/QSFragmentComposeViewModelKosmos.kt
+++ b/packages/SystemUI/tests/utils/src/com/android/systemui/qs/composefragment/viewmodel/QSFragmentComposeViewModelKosmos.kt
@@ -18,6 +18,7 @@
import android.content.res.mainResources
import androidx.lifecycle.LifecycleCoroutineScope
+import com.android.systemui.classifier.domain.interactor.falsingInteractor
import com.android.systemui.common.ui.domain.interactor.configurationInteractor
import com.android.systemui.deviceentry.domain.interactor.deviceEntryInteractor
import com.android.systemui.keyguard.domain.interactor.keyguardTransitionInteractor
@@ -58,6 +59,7 @@
configurationInteractor,
largeScreenHeaderHelper,
tileSquishinessInteractor,
+ falsingInteractor,
inFirstPageViewModel,
logcatTableLogBuffer(this@Fixture),
mediaInRowInLandscapeViewModelFactory,
diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/qs/panels/ui/viewmodel/PaginatedGridViewModelKosmos.kt b/packages/SystemUI/tests/utils/src/com/android/systemui/qs/panels/ui/viewmodel/PaginatedGridViewModelKosmos.kt
index 2e80293..d515ad0 100644
--- a/packages/SystemUI/tests/utils/src/com/android/systemui/qs/panels/ui/viewmodel/PaginatedGridViewModelKosmos.kt
+++ b/packages/SystemUI/tests/utils/src/com/android/systemui/qs/panels/ui/viewmodel/PaginatedGridViewModelKosmos.kt
@@ -16,6 +16,7 @@
package com.android.systemui.qs.panels.ui.viewmodel
+import com.android.systemui.classifier.domain.interactor.falsingInteractor
import com.android.systemui.development.ui.viewmodel.buildNumberViewModelFactory
import com.android.systemui.kosmos.Kosmos
import com.android.systemui.qs.panels.domain.interactor.paginatedGridInteractor
@@ -28,5 +29,6 @@
paginatedGridInteractor,
inFirstPageViewModel,
buildNumberViewModelFactory,
+ falsingInteractor,
)
}