summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author Alejandro Nijamkin <nijamkin@google.com> 2023-03-24 17:39:55 -0700
committer Alejandro Nijamkin <nijamkin@google.com> 2023-03-24 17:43:45 -0700
commit546b4dbf323b87ef69f8d7288cd909bfcd8a94e4 (patch)
tree9e1477320fb6122ef2b2e84582e9ebedff402293
parent58cd612694eff84cb86fc161e9afa7afa78f9d8e (diff)
[multi-shade] Fixes issue where NSWV was still visible after unlock.
For reasons that are not yet understood, the NotificationShadeWindowView remaines visible after unlocking the device. The solution here simply removes the bouncer-showing logic from our MultiShadeMotionEventInteractor but keeps the logic that checks the direction of drag. If the user drags up the screen, our system does not intercept the touch, allowing the legacy code to show the bouncer in its own, correct way - which gets rid of the NSWV visibility bug. If the user drags down the screen, we intercept touch and show the shade(s). Bug: 274159734 Flag: DUAL_SHADE Test: unit tests updated Test: manually verified that, after unlocking the device, touch goes through and I can click app icons on the launcher. Also made sure that dragging up on the lock screen brings up the bouncer and I can unlock the device from it. Change-Id: I9f0d02f403007946b6911a5057fac9ffa316a9c7
-rw-r--r--packages/SystemUI/src/com/android/systemui/multishade/domain/interactor/MultiShadeMotionEventInteractor.kt95
-rw-r--r--packages/SystemUI/src/com/android/systemui/shade/NotificationPanelViewController.java8
-rw-r--r--packages/SystemUI/tests/src/com/android/systemui/multishade/domain/interactor/MultiShadeMotionEventInteractorTest.kt26
-rw-r--r--packages/SystemUI/tests/src/com/android/systemui/shade/NotificationShadeWindowViewControllerTest.kt1
-rw-r--r--packages/SystemUI/tests/src/com/android/systemui/shade/NotificationShadeWindowViewTest.kt1
5 files changed, 37 insertions, 94 deletions
diff --git a/packages/SystemUI/src/com/android/systemui/multishade/domain/interactor/MultiShadeMotionEventInteractor.kt b/packages/SystemUI/src/com/android/systemui/multishade/domain/interactor/MultiShadeMotionEventInteractor.kt
index 33b3087678e1..3a4ea3ec3614 100644
--- a/packages/SystemUI/src/com/android/systemui/multishade/domain/interactor/MultiShadeMotionEventInteractor.kt
+++ b/packages/SystemUI/src/com/android/systemui/multishade/domain/interactor/MultiShadeMotionEventInteractor.kt
@@ -22,7 +22,6 @@ import android.view.ViewConfiguration
import com.android.systemui.classifier.Classifier
import com.android.systemui.dagger.qualifiers.Application
import com.android.systemui.keyguard.domain.interactor.KeyguardTransitionInteractor
-import com.android.systemui.keyguard.domain.interactor.PrimaryBouncerInteractor
import com.android.systemui.keyguard.shared.model.KeyguardState
import com.android.systemui.multishade.shared.math.isZero
import com.android.systemui.multishade.shared.model.ProxiedInputModel
@@ -48,7 +47,6 @@ constructor(
@Application private val applicationScope: CoroutineScope,
private val multiShadeInteractor: MultiShadeInteractor,
keyguardTransitionInteractor: KeyguardTransitionInteractor,
- private val bouncerInteractor: PrimaryBouncerInteractor,
private val falsingManager: FalsingManager,
) {
@@ -98,7 +96,7 @@ constructor(
currentY = event.y,
pointerId = event.getPointerId(0),
isDraggingHorizontally = false,
- draggedVertically = Dragged.NONE,
+ isDraggingShade = false,
)
false
@@ -108,38 +106,28 @@ constructor(
val pointerIndex = event.findPointerIndex(it.pointerId)
val currentX = event.getX(pointerIndex)
val currentY = event.getY(pointerIndex)
- if (!it.isDraggingHorizontally && it.draggedVertically == Dragged.NONE) {
+ if (!it.isDraggingHorizontally && !it.isDraggingShade) {
val xDistanceTravelled = currentX - it.initialX
val yDistanceTravelled = currentY - it.initialY
val touchSlop = ViewConfiguration.get(applicationContext).scaledTouchSlop
interactionState =
when {
- abs(yDistanceTravelled) > touchSlop ->
- it.copy(
- draggedVertically =
- if (yDistanceTravelled > 0) {
- Dragged.SHADE
- } else {
- Dragged.BOUNCER
- }
- )
+ yDistanceTravelled > touchSlop -> it.copy(isDraggingShade = true)
abs(xDistanceTravelled) > touchSlop ->
- it.copy(
- isDraggingHorizontally = true,
- )
+ it.copy(isDraggingHorizontally = true)
else -> interactionState
}
}
}
- // We want to intercept the rest of the gesture if we're dragging.
- interactionState.isDraggingVertically()
+ // We want to intercept the rest of the gesture if we're dragging the shade.
+ isDraggingShade()
}
MotionEvent.ACTION_UP,
MotionEvent.ACTION_CANCEL ->
- // Make sure that we intercept the up or cancel if we're dragging, to handle drag
- // end and cancel.
- interactionState.isDraggingVertically()
+ // Make sure that we intercept the up or cancel if we're dragging the shade, to
+ // handle drag end or cancel.
+ isDraggingShade()
else -> false
}
}
@@ -156,35 +144,23 @@ constructor(
return when (event.actionMasked) {
MotionEvent.ACTION_MOVE -> {
interactionState?.let {
- if (it.draggedVertically != Dragged.NONE) {
+ if (it.isDraggingShade) {
val pointerIndex = event.findPointerIndex(it.pointerId)
val previousY = it.currentY
val currentY = event.getY(pointerIndex)
- interactionState =
- it.copy(
- currentY = currentY,
- )
+ interactionState = it.copy(currentY = currentY)
- when (it.draggedVertically) {
- Dragged.SHADE -> {
- val yDragAmountPx = currentY - previousY
+ val yDragAmountPx = currentY - previousY
- if (yDragAmountPx != 0f) {
- multiShadeInteractor.sendProxiedInput(
- ProxiedInputModel.OnDrag(
- xFraction = event.x / viewWidthPx,
- yDragAmountPx = yDragAmountPx,
- )
- )
- }
- true
- }
- Dragged.BOUNCER -> {
- bouncerInteractor.show(isScrimmed = true)
- false
- }
- else -> false
+ if (yDragAmountPx != 0f) {
+ multiShadeInteractor.sendProxiedInput(
+ ProxiedInputModel.OnDrag(
+ xFraction = event.x / viewWidthPx,
+ yDragAmountPx = yDragAmountPx,
+ )
+ )
}
+ true
} else {
false
}
@@ -192,9 +168,10 @@ constructor(
?: false
}
MotionEvent.ACTION_UP -> {
- if (interactionState?.draggedVertically == Dragged.SHADE) {
- // We finished dragging. Record that so the multi-shade framework can issue a
- // fling, if the velocity reached in the drag was high enough, for example.
+ if (isDraggingShade()) {
+ // We finished dragging the shade. Record that so the multi-shade framework can
+ // issue a fling, if the velocity reached in the drag was high enough, for
+ // example.
multiShadeInteractor.sendProxiedInput(ProxiedInputModel.OnDragEnd)
if (falsingManager.isFalseTouch(Classifier.SHADE_DRAG)) {
@@ -206,7 +183,7 @@ constructor(
true
}
MotionEvent.ACTION_CANCEL -> {
- if (interactionState?.draggedVertically == Dragged.SHADE) {
+ if (isDraggingShade()) {
// Our drag gesture was canceled by the system. This happens primarily in one of
// two occasions: (a) the parent view has decided to intercept the gesture
// itself and/or route it to a different child view or (b) the pointer has
@@ -219,10 +196,6 @@ constructor(
if (falsingManager.isFalseTouch(Classifier.SHADE_DRAG)) {
multiShadeInteractor.collapseAll()
}
- } else if (interactionState?.draggedVertically == Dragged.BOUNCER) {
- if (falsingManager.isFalseTouch(Classifier.BOUNCER_UNLOCK)) {
- bouncerInteractor.hide()
- }
}
interactionState = null
@@ -239,21 +212,11 @@ constructor(
val pointerId: Int,
/** Whether the current gesture is dragging horizontally. */
val isDraggingHorizontally: Boolean,
- /** The UI component that is being dragged vertically, if any. */
- val draggedVertically: Dragged,
+ /** Whether the current gesture is dragging the shade vertically. */
+ val isDraggingShade: Boolean,
)
- /** Enumerates the UI components that can be dragged by the user. */
- private enum class Dragged {
- /** The bouncer is being dragged by the user. */
- BOUNCER,
- /** A shade is being dragged by the user. */
- SHADE,
- /** No UI component is being dragged by the user. */
- NONE,
- }
-
- private fun InteractionState?.isDraggingVertically(): Boolean {
- return this?.draggedVertically != Dragged.NONE
+ private fun isDraggingShade(): Boolean {
+ return interactionState?.isDraggingShade ?: false
}
}
diff --git a/packages/SystemUI/src/com/android/systemui/shade/NotificationPanelViewController.java b/packages/SystemUI/src/com/android/systemui/shade/NotificationPanelViewController.java
index 9bfa1b32d355..b986562d5617 100644
--- a/packages/SystemUI/src/com/android/systemui/shade/NotificationPanelViewController.java
+++ b/packages/SystemUI/src/com/android/systemui/shade/NotificationPanelViewController.java
@@ -388,7 +388,6 @@ public final class NotificationPanelViewController implements Dumpable {
private KeyguardBottomAreaView mKeyguardBottomArea;
private boolean mExpanding;
private boolean mSplitShadeEnabled;
- private final boolean mMultiShadeEnabled;
/** The bottom padding reserved for elements of the keyguard measuring notifications. */
private float mKeyguardNotificationBottomPadding;
/**
@@ -853,7 +852,6 @@ public final class NotificationPanelViewController implements Dumpable {
mFeatureFlags = featureFlags;
mAnimateBack = mFeatureFlags.isEnabled(Flags.WM_SHADE_ANIMATE_BACK_GESTURE);
mTrackpadGestureBack = mFeatureFlags.isEnabled(Flags.TRACKPAD_GESTURE_FEATURES);
- mMultiShadeEnabled = mFeatureFlags.isEnabled(Flags.DUAL_SHADE);
mFalsingCollector = falsingCollector;
mPowerManager = powerManager;
mWakeUpCoordinator = coordinator;
@@ -4021,10 +4019,8 @@ public final class NotificationPanelViewController implements Dumpable {
* {@link #updateVisibility()}? That would allow us to make this method private.
*/
public void updatePanelExpansionAndVisibility() {
- if (!mMultiShadeEnabled) {
- mShadeExpansionStateManager.onPanelExpansionChanged(
- mExpandedFraction, isExpanded(), mTracking, mExpansionDragDownAmountPx);
- }
+ mShadeExpansionStateManager.onPanelExpansionChanged(
+ mExpandedFraction, isExpanded(), mTracking, mExpansionDragDownAmountPx);
updateVisibility();
}
diff --git a/packages/SystemUI/tests/src/com/android/systemui/multishade/domain/interactor/MultiShadeMotionEventInteractorTest.kt b/packages/SystemUI/tests/src/com/android/systemui/multishade/domain/interactor/MultiShadeMotionEventInteractorTest.kt
index c6db565d7954..acde887818aa 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/multishade/domain/interactor/MultiShadeMotionEventInteractorTest.kt
+++ b/packages/SystemUI/tests/src/com/android/systemui/multishade/domain/interactor/MultiShadeMotionEventInteractorTest.kt
@@ -24,7 +24,6 @@ import com.android.systemui.classifier.FalsingManagerFake
import com.android.systemui.coroutines.collectLastValue
import com.android.systemui.keyguard.data.repository.FakeKeyguardTransitionRepository
import com.android.systemui.keyguard.domain.interactor.KeyguardTransitionInteractor
-import com.android.systemui.keyguard.domain.interactor.PrimaryBouncerInteractor
import com.android.systemui.keyguard.shared.model.KeyguardState
import com.android.systemui.keyguard.shared.model.TransitionState
import com.android.systemui.keyguard.shared.model.TransitionStep
@@ -43,18 +42,12 @@ import org.junit.Before
import org.junit.Test
import org.junit.runner.RunWith
import org.junit.runners.JUnit4
-import org.mockito.Mock
-import org.mockito.Mockito.never
-import org.mockito.Mockito.verify
-import org.mockito.MockitoAnnotations
@OptIn(ExperimentalCoroutinesApi::class)
@SmallTest
@RunWith(JUnit4::class)
class MultiShadeMotionEventInteractorTest : SysuiTestCase() {
- @Mock private lateinit var bouncerInteractor: PrimaryBouncerInteractor
-
private lateinit var underTest: MultiShadeMotionEventInteractor
private lateinit var testScope: TestScope
@@ -67,8 +60,6 @@ class MultiShadeMotionEventInteractorTest : SysuiTestCase() {
@Before
fun setUp() {
- MockitoAnnotations.initMocks(this)
-
testScope = TestScope()
motionEvents = mutableSetOf()
@@ -95,7 +86,6 @@ class MultiShadeMotionEventInteractorTest : SysuiTestCase() {
KeyguardTransitionInteractor(
repository = keyguardTransitionRepository,
),
- bouncerInteractor = bouncerInteractor,
falsingManager = falsingManager,
)
}
@@ -400,7 +390,7 @@ class MultiShadeMotionEventInteractorTest : SysuiTestCase() {
}
@Test
- fun dragBouncerAboveTouchSlopAndUp_showsBouncer() =
+ fun dragUp_withUp_doesNotShowShade() =
testScope.runTest {
val leftShadeProxiedInput by collectLastValue(interactor.proxiedInput(ShadeId.LEFT))
val rightShadeProxiedInput by collectLastValue(interactor.proxiedInput(ShadeId.RIGHT))
@@ -423,24 +413,22 @@ class MultiShadeMotionEventInteractorTest : SysuiTestCase() {
x = 100f, // left shade
y = yDragAmountPx,
)
- assertThat(underTest.shouldIntercept(moveEvent)).isTrue()
+ assertThat(underTest.shouldIntercept(moveEvent)).isFalse()
underTest.onTouchEvent(moveEvent, viewWidthPx = 1000)
- verify(bouncerInteractor).show(isScrimmed = true)
assertThat(leftShadeProxiedInput).isNull()
assertThat(rightShadeProxiedInput).isNull()
assertThat(singleShadeProxiedInput).isNull()
val upEvent = motionEvent(MotionEvent.ACTION_UP)
- assertThat(underTest.shouldIntercept(upEvent)).isTrue()
+ assertThat(underTest.shouldIntercept(upEvent)).isFalse()
underTest.onTouchEvent(upEvent, viewWidthPx = 1000)
- verify(bouncerInteractor, never()).hide()
assertThat(leftShadeProxiedInput).isNull()
assertThat(rightShadeProxiedInput).isNull()
assertThat(singleShadeProxiedInput).isNull()
}
@Test
- fun dragBouncerAboveTouchSlopAndCancel_falseTouch_showsThenHidesBouncer() =
+ fun dragUp_withCancel_falseTouch_showsThenHidesBouncer() =
testScope.runTest {
val leftShadeProxiedInput by collectLastValue(interactor.proxiedInput(ShadeId.LEFT))
val rightShadeProxiedInput by collectLastValue(interactor.proxiedInput(ShadeId.RIGHT))
@@ -463,18 +451,16 @@ class MultiShadeMotionEventInteractorTest : SysuiTestCase() {
x = 900f, // right shade
y = yDragAmountPx,
)
- assertThat(underTest.shouldIntercept(moveEvent)).isTrue()
+ assertThat(underTest.shouldIntercept(moveEvent)).isFalse()
underTest.onTouchEvent(moveEvent, viewWidthPx = 1000)
- verify(bouncerInteractor).show(isScrimmed = true)
assertThat(leftShadeProxiedInput).isNull()
assertThat(rightShadeProxiedInput).isNull()
assertThat(singleShadeProxiedInput).isNull()
falsingManager.setIsFalseTouch(true)
val cancelEvent = motionEvent(MotionEvent.ACTION_CANCEL)
- assertThat(underTest.shouldIntercept(cancelEvent)).isTrue()
+ assertThat(underTest.shouldIntercept(cancelEvent)).isFalse()
underTest.onTouchEvent(cancelEvent, viewWidthPx = 1000)
- verify(bouncerInteractor).hide()
assertThat(leftShadeProxiedInput).isNull()
assertThat(rightShadeProxiedInput).isNull()
assertThat(singleShadeProxiedInput).isNull()
diff --git a/packages/SystemUI/tests/src/com/android/systemui/shade/NotificationShadeWindowViewControllerTest.kt b/packages/SystemUI/tests/src/com/android/systemui/shade/NotificationShadeWindowViewControllerTest.kt
index 006a7c735550..2a108239bac5 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/shade/NotificationShadeWindowViewControllerTest.kt
+++ b/packages/SystemUI/tests/src/com/android/systemui/shade/NotificationShadeWindowViewControllerTest.kt
@@ -177,7 +177,6 @@ class NotificationShadeWindowViewControllerTest : SysuiTestCase() {
KeyguardTransitionInteractor(
repository = FakeKeyguardTransitionRepository(),
),
- bouncerInteractor = com.android.systemui.util.mockito.mock(),
falsingManager = FalsingManagerFake(),
)
},
diff --git a/packages/SystemUI/tests/src/com/android/systemui/shade/NotificationShadeWindowViewTest.kt b/packages/SystemUI/tests/src/com/android/systemui/shade/NotificationShadeWindowViewTest.kt
index 1a52067e8306..86660a462c59 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/shade/NotificationShadeWindowViewTest.kt
+++ b/packages/SystemUI/tests/src/com/android/systemui/shade/NotificationShadeWindowViewTest.kt
@@ -189,7 +189,6 @@ class NotificationShadeWindowViewTest : SysuiTestCase() {
KeyguardTransitionInteractor(
repository = FakeKeyguardTransitionRepository(),
),
- bouncerInteractor = mock(),
falsingManager = FalsingManagerFake(),
)
},