diff options
6 files changed, 122 insertions, 41 deletions
diff --git a/packages/SystemUI/src/com/android/systemui/shade/NotificationPanelViewController.java b/packages/SystemUI/src/com/android/systemui/shade/NotificationPanelViewController.java index 79b4791259a8..a8deebdc784d 100644 --- a/packages/SystemUI/src/com/android/systemui/shade/NotificationPanelViewController.java +++ b/packages/SystemUI/src/com/android/systemui/shade/NotificationPanelViewController.java @@ -235,7 +235,6 @@ import kotlin.Unit; import java.io.PrintWriter; import java.util.ArrayList; import java.util.Collections; -import java.util.List; import java.util.Optional; import java.util.function.Consumer; @@ -367,7 +366,6 @@ public final class NotificationPanelViewController implements ShadeSurface, Dump private float mExpandedHeight = 0; /** The current squish amount for the predictive back animation */ private float mCurrentBackProgress = 0.0f; - private boolean mTracking; @Deprecated private KeyguardBottomAreaView mKeyguardBottomArea; private boolean mExpanding; @@ -999,7 +997,7 @@ public final class NotificationPanelViewController implements ShadeSurface, Dump // cause blurring. This will eventually be re-enabled by the panel view on // ACTION_UP, since the user's finger might still be down after a swipe to // unlock gesture, and we don't want that to cause blurring either. - mDepthController.setBlursDisabledForUnlock(mTracking); + mDepthController.setBlursDisabledForUnlock(isTracking()); if (playingCannedAnimation && !isWakeAndUnlockNotFromDream) { // Hide the panel so it's not in the way or the surface behind the @@ -2542,10 +2540,10 @@ public final class NotificationPanelViewController implements ShadeSurface, Dump private void onHeightUpdated(float expandedHeight) { if (expandedHeight <= 0) { mShadeLog.logExpansionChanged("onHeightUpdated: fully collapsed.", - mExpandedFraction, isExpanded(), mTracking, mExpansionDragDownAmountPx); + mExpandedFraction, isExpanded(), isTracking(), mExpansionDragDownAmountPx); } else if (isFullyExpanded()) { mShadeLog.logExpansionChanged("onHeightUpdated: fully expanded.", - mExpandedFraction, isExpanded(), mTracking, mExpansionDragDownAmountPx); + mExpandedFraction, isExpanded(), isTracking(), mExpansionDragDownAmountPx); } if (!mQsController.getExpanded() || mQsController.isExpandImmediate() || mIsExpandingOrCollapsing && mQsController.getExpandedWhenExpandingStarted()) { @@ -2738,7 +2736,7 @@ public final class NotificationPanelViewController implements ShadeSurface, Dump mAnimateAfterExpanding = animate; mUpdateFlingOnLayout = false; abortAnimations(); - if (mTracking) { + if (isTracking()) { // The panel is expanded after this call. onTrackingStopped(true /* expands */); } @@ -2825,7 +2823,7 @@ public final class NotificationPanelViewController implements ShadeSurface, Dump private void onTrackingStarted() { endClosing(); - mTracking = true; + mShadeRepository.setLegacyShadeTracking(true); mTrackingStartedListener.onTrackingStarted(); notifyExpandingStarted(); updateExpansionAndVisibility(); @@ -2839,7 +2837,7 @@ public final class NotificationPanelViewController implements ShadeSurface, Dump } private void onTrackingStopped(boolean expand) { - mTracking = false; + mShadeRepository.setLegacyShadeTracking(false); updateExpansionAndVisibility(); if (expand) { @@ -3011,7 +3009,7 @@ public final class NotificationPanelViewController implements ShadeSurface, Dump } private void updateExpandedHeight(float expandedHeight) { - if (mTracking) { + if (isTracking()) { mNotificationStackScrollLayoutController .setExpandingVelocity(getCurrentExpandVelocity()); } @@ -3100,7 +3098,7 @@ public final class NotificationPanelViewController implements ShadeSurface, Dump mTouchDisabled = disabled; if (mTouchDisabled) { cancelHeightAnimator(); - if (mTracking) { + if (isTracking()) { onTrackingStopped(true /* expanded */); } notifyExpandingFinished(); @@ -3339,7 +3337,7 @@ public final class NotificationPanelViewController implements ShadeSurface, Dump @Override public void blockExpansionForCurrentTouch() { - mBlockingExpansionForCurrentTouch = mTracking; + mBlockingExpansionForCurrentTouch = isTracking(); } @Override @@ -3353,7 +3351,7 @@ public final class NotificationPanelViewController implements ShadeSurface, Dump ipw.print("mIsLaunchAnimationRunning="); ipw.println(mIsLaunchAnimationRunning); ipw.print("mOverExpansion="); ipw.println(mOverExpansion); ipw.print("mExpandedHeight="); ipw.println(mExpandedHeight); - ipw.print("mTracking="); ipw.println(mTracking); + ipw.print("isTracking()="); ipw.println(isTracking()); ipw.print("mExpanding="); ipw.println(mExpanding); ipw.print("mSplitShadeEnabled="); ipw.println(mSplitShadeEnabled); ipw.print("mKeyguardNotificationBottomPadding="); @@ -3691,7 +3689,7 @@ public final class NotificationPanelViewController implements ShadeSurface, Dump mQsController.beginJankMonitoring(isFullyCollapsed()); } mInitialOffsetOnTouch = expandedHeight; - if (!mTracking || isFullyCollapsed()) { + if (!isTracking() || isFullyCollapsed()) { mInitialExpandY = newY; mInitialExpandX = newX; } else { @@ -3709,7 +3707,7 @@ public final class NotificationPanelViewController implements ShadeSurface, Dump mShadeLog.logEndMotionEvent("endMotionEvent called", forceCancel, false); mTrackingPointer = -1; mAmbientState.setSwipingUp(false); - if ((mTracking && mTouchSlopExceeded) || Math.abs(x - mInitialExpandX) > mTouchSlop + if ((isTracking() && mTouchSlopExceeded) || Math.abs(x - mInitialExpandX) > mTouchSlop || Math.abs(y - mInitialExpandY) > mTouchSlop || (!isFullyExpanded() && !isFullyCollapsed()) || event.getActionMasked() == MotionEvent.ACTION_CANCEL || forceCancel) { @@ -3873,7 +3871,7 @@ public final class NotificationPanelViewController implements ShadeSurface, Dump return; } - if (mTracking && !(mBlockingExpansionForCurrentTouch + if (isTracking() && !(mBlockingExpansionForCurrentTouch || mQsController.isTrackingBlocked())) { return; } @@ -3899,7 +3897,7 @@ public final class NotificationPanelViewController implements ShadeSurface, Dump float maxPanelHeight = getMaxPanelTransitionDistance(); if (mHeightAnimator == null) { // Split shade has its own overscroll logic - if (mTracking) { + if (isTracking()) { float overExpansionPixels = Math.max(0, h - maxPanelHeight); setOverExpansionInternal(overExpansionPixels, true /* isFromGesture */); } @@ -3986,12 +3984,12 @@ public final class NotificationPanelViewController implements ShadeSurface, Dump } public boolean isTracking() { - return mTracking; + return mShadeRepository.getLegacyShadeTracking().getValue(); } @Override public boolean canBeCollapsed() { - return !isFullyCollapsed() && !mTracking && !mClosing; + return !isFullyCollapsed() && !isTracking() && !mClosing; } @Override @@ -4083,7 +4081,7 @@ public final class NotificationPanelViewController implements ShadeSurface, Dump @Override public void updateExpansionAndVisibility() { mShadeExpansionStateManager.onPanelExpansionChanged( - mExpandedFraction, isExpanded(), mTracking, mExpansionDragDownAmountPx); + mExpandedFraction, isExpanded(), isTracking(), mExpansionDragDownAmountPx); updateVisibility(); } @@ -4093,7 +4091,7 @@ public final class NotificationPanelViewController implements ShadeSurface, Dump return mExpandedFraction > 0f || mInstantExpanding || isPanelVisibleBecauseOfHeadsUp() - || mTracking + || isTracking() || mHeightAnimator != null || isPanelVisibleBecauseScrimIsAnimatingOff() && !mIsSpringBackAnimation; @@ -4796,7 +4794,7 @@ public final class NotificationPanelViewController implements ShadeSurface, Dump + " mAnimatingOnDown: true, mClosing: true"); return true; } - if (!mTracking || isFullyCollapsed()) { + if (!isTracking() || isFullyCollapsed()) { mInitialExpandY = y; mInitialExpandX = x; } else { @@ -4973,7 +4971,7 @@ public final class NotificationPanelViewController implements ShadeSurface, Dump // If dragging should not expand the notifications shade, then return false. if (!mNotificationsDragEnabled) { - if (mTracking) { + if (isTracking()) { // Turn off tracking if it's on or the shade can get stuck in the down position. onTrackingStopped(true /* expand */); } @@ -5099,7 +5097,9 @@ public final class NotificationPanelViewController implements ShadeSurface, Dump && (Math.abs(h) > Math.abs(x - mInitialExpandX) || mIgnoreXTouchSlop)) { mTouchSlopExceeded = true; - if (mGestureWaitForTouchSlop && !mTracking && !mCollapsedAndHeadsUpOnDown) { + if (mGestureWaitForTouchSlop + && !isTracking() + && !mCollapsedAndHeadsUpOnDown) { if (mInitialOffsetOnTouch != 0f) { startExpandMotion(x, y, false /* startTracking */, mExpandedHeight); h = 0; @@ -5114,7 +5114,7 @@ public final class NotificationPanelViewController implements ShadeSurface, Dump mTouchAboveFalsingThreshold = true; mUpwardsWhenThresholdReached = isDirectionUpwards(x, y); } - if ((!mGestureWaitForTouchSlop || mTracking) + if ((!mGestureWaitForTouchSlop || isTracking()) && !(mBlockingExpansionForCurrentTouch || mQsController.isTrackingBlocked())) { // Count h==0 as part of swipe-up, @@ -5140,7 +5140,7 @@ public final class NotificationPanelViewController implements ShadeSurface, Dump } break; } - return !mGestureWaitForTouchSlop || mTracking; + return !mGestureWaitForTouchSlop || isTracking(); } } diff --git a/packages/SystemUI/src/com/android/systemui/shade/QuickSettingsController.java b/packages/SystemUI/src/com/android/systemui/shade/QuickSettingsController.java index b2bbffdb5453..792984360032 100644 --- a/packages/SystemUI/src/com/android/systemui/shade/QuickSettingsController.java +++ b/packages/SystemUI/src/com/android/systemui/shade/QuickSettingsController.java @@ -199,8 +199,6 @@ public class QuickSettingsController implements Dumpable { private float mInitialTouchY; /** whether current touch Y delta is above falsing threshold */ private boolean mTouchAboveFalsingThreshold; - /** whether we are tracking a touch on QS container */ - private boolean mTracking; /** pointerId of the pointer we're currently tracking */ private int mTrackingPointer; @@ -596,7 +594,7 @@ public class QuickSettingsController implements Dumpable { @VisibleForTesting boolean isTracking() { - return mTracking; + return mShadeRepository.getLegacyQsTracking().getValue(); } public boolean getFullyExpanded() { @@ -609,10 +607,14 @@ public class QuickSettingsController implements Dumpable { // split shade as there QS are always expanded so every collapsing motion is motion from // expanded QS to closed panel return mExpandImmediate || (mExpanded - && !mTracking && !isExpansionAnimating() + && !isTracking() && !isExpansionAnimating() && !mExpansionFromOverscroll); } + private void setTracking(boolean tracking) { + mShadeRepository.setLegacyQsTracking(tracking); + } + private boolean isQsFragmentCreated() { return mQs != null; } @@ -1597,7 +1599,7 @@ public class QuickSettingsController implements Dumpable { if (action == MotionEvent.ACTION_DOWN && expandedShadeCollapsedQs) { // Down in the empty area while fully expanded - go to QS. mShadeLog.logMotionEvent(event, "handleQsTouch: down action, QS tracking enabled"); - mTracking = true; + setTracking(true); traceQsJank(true, false); mConflictingExpansionGesture = true; onExpansionStarted(); @@ -1612,9 +1614,9 @@ public class QuickSettingsController implements Dumpable { // as sometimes the qsExpansionFraction can be a tiny value instead of 0 when in QQS. if (!mSplitShadeEnabled && !mLastShadeFlingWasExpanding && computeExpansionFraction() <= 0.01 && mShadeExpandedFraction < 1.0) { - mTracking = false; + setTracking(false); } - if (!isExpandImmediate() && mTracking) { + if (!isExpandImmediate() && isTracking()) { onTouch(event); if (!mConflictingExpansionGesture && !mSplitShadeEnabled) { return true; @@ -1658,7 +1660,7 @@ public class QuickSettingsController implements Dumpable { if (shouldQuickSettingsIntercept(event.getX(), event.getY(), -1)) { mShadeLog.logMotionEvent(event, "handleQsDown: down action, QS tracking enabled"); - mTracking = true; + setTracking(true); onExpansionStarted(); mInitialHeightOnTouch = mExpansionHeight; mInitialTouchY = event.getY(); @@ -1684,7 +1686,7 @@ public class QuickSettingsController implements Dumpable { switch (event.getActionMasked()) { case MotionEvent.ACTION_DOWN: mShadeLog.logMotionEvent(event, "onQsTouch: down action, QS tracking enabled"); - mTracking = true; + setTracking(true); traceQsJank(true, false); mInitialTouchY = y; mInitialTouchX = x; @@ -1721,7 +1723,7 @@ public class QuickSettingsController implements Dumpable { case MotionEvent.ACTION_CANCEL: mShadeLog.logMotionEvent(event, "onQsTouch: up/cancel action, QS tracking disabled"); - mTracking = false; + setTracking(false); mTrackingPointer = -1; trackMovement(event); float fraction = computeExpansionFraction(); @@ -1776,7 +1778,7 @@ public class QuickSettingsController implements Dumpable { mInitialHeightOnTouch = mExpansionHeight; mShadeLog.logMotionEvent(event, "onQsIntercept: down action, QS tracking enabled"); - mTracking = true; + setTracking(true); traceQsJank(true, false); mNotificationStackScrollLayoutController.cancelLongPress(); } @@ -1795,7 +1797,7 @@ public class QuickSettingsController implements Dumpable { case MotionEvent.ACTION_MOVE: final float h = y - mInitialTouchY; trackMovement(event); - if (mTracking) { + if (isTracking()) { // Already tracking because onOverscrolled was called. We need to update here // so we don't stop for a frame until the next touch event gets handled in // onTouchEvent. @@ -1815,7 +1817,7 @@ public class QuickSettingsController implements Dumpable { mInitialTouchX, mInitialTouchY, h)) { mPanelView.getParent().requestDisallowInterceptTouchEvent(true); mShadeLog.onQsInterceptMoveQsTrackingEnabled(h); - mTracking = true; + setTracking(true); traceQsJank(true, false); onExpansionStarted(); mPanelViewControllerLazy.get().notifyExpandingFinished(); @@ -1835,7 +1837,7 @@ public class QuickSettingsController implements Dumpable { case MotionEvent.ACTION_UP: trackMovement(event); mShadeLog.logMotionEvent(event, "onQsIntercept: up action, QS tracking disabled"); - mTracking = false; + setTracking(false); break; } return false; @@ -2061,7 +2063,7 @@ public class QuickSettingsController implements Dumpable { ipw.print("mTouchAboveFalsingThreshold="); ipw.println(mTouchAboveFalsingThreshold); ipw.print("mTracking="); - ipw.println(mTracking); + ipw.println(isTracking()); ipw.print("mTrackingPointer="); ipw.println(mTrackingPointer); ipw.print("mExpanded="); diff --git a/packages/SystemUI/src/com/android/systemui/shade/data/repository/ShadeRepository.kt b/packages/SystemUI/src/com/android/systemui/shade/data/repository/ShadeRepository.kt index 947259a79345..52a99af3eee4 100644 --- a/packages/SystemUI/src/com/android/systemui/shade/data/repository/ShadeRepository.kt +++ b/packages/SystemUI/src/com/android/systemui/shade/data/repository/ShadeRepository.kt @@ -56,6 +56,30 @@ interface ShadeRepository { @Deprecated("Use ShadeInteractor.shadeExpansion instead") val legacyShadeExpansion: StateFlow<Float> + /** + * NotificationPanelViewController.mTracking as a flow. "Tracking" means that the user is moving + * the shade up or down with a pointer. Going forward, this concept will be replaced by checks + * for whether a transition was driven by user input instead of whether a pointer is currently + * touching the screen, i.e. after the user has lifted their finger to fling the shade, these + * values would be different. + */ + @Deprecated("Use ShadeInteractor instead") val legacyShadeTracking: StateFlow<Boolean> + + /** + * QuickSettingsController.mTracking as a flow. "Tracking" means that the user is moving quick + * settings up or down with a pointer. Going forward, this concept will be replaced by checks + * for whether a transition was driven by user input instead of whether a pointer is currently + * touching the screen, i.e. after the user has lifted their finger to fling the QS, these + * values would be different. + */ + @Deprecated("Use ShadeInteractor instead") val legacyQsTracking: StateFlow<Boolean> + + /** Sets whether the user is moving Quick Settings with a pointer */ + fun setLegacyQsTracking(legacyQsTracking: Boolean) + + /** Sets whether the user is moving the shade with a pointer */ + fun setLegacyShadeTracking(tracking: Boolean) + /** Amount shade has expanded with regard to the UDFPS location */ val udfpsTransitionToFullShadeProgress: StateFlow<Float> @@ -123,6 +147,24 @@ constructor(shadeExpansionStateManager: ShadeExpansionStateManager) : ShadeRepos @Deprecated("Use ShadeInteractor.shadeExpansion instead") override val legacyShadeExpansion: StateFlow<Float> = _legacyShadeExpansion.asStateFlow() + private val _legacyShadeTracking = MutableStateFlow(false) + @Deprecated("Use ShadeInteractor instead") + override val legacyShadeTracking: StateFlow<Boolean> = _legacyShadeTracking.asStateFlow() + + private val _legacyQsTracking = MutableStateFlow(false) + @Deprecated("Use ShadeInteractor instead") + override val legacyQsTracking: StateFlow<Boolean> = _legacyQsTracking.asStateFlow() + + @Deprecated("Should only be called by NPVC and tests") + override fun setLegacyQsTracking(legacyQsTracking: Boolean) { + _legacyQsTracking.value = legacyQsTracking + } + + @Deprecated("Should only be called by NPVC and tests") + override fun setLegacyShadeTracking(tracking: Boolean) { + _legacyShadeTracking.value = tracking + } + override fun setQsExpansion(qsExpansion: Float) { _qsExpansion.value = qsExpansion } diff --git a/packages/SystemUI/tests/src/com/android/systemui/shade/NotificationPanelViewControllerBaseTest.java b/packages/SystemUI/tests/src/com/android/systemui/shade/NotificationPanelViewControllerBaseTest.java index 74e917d38f72..0f5f141b6d46 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/shade/NotificationPanelViewControllerBaseTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/shade/NotificationPanelViewControllerBaseTest.java @@ -120,6 +120,7 @@ import com.android.systemui.plugins.FalsingManager; import com.android.systemui.plugins.qs.QS; import com.android.systemui.qs.QSFragment; import com.android.systemui.screenrecord.RecordingController; +import com.android.systemui.shade.data.repository.FakeShadeRepository; import com.android.systemui.shade.data.repository.ShadeRepository; import com.android.systemui.shade.domain.interactor.ShadeInteractor; import com.android.systemui.shade.transition.ShadeTransitionController; @@ -320,7 +321,6 @@ public class NotificationPanelViewControllerBaseTest extends SysuiTestCase { mEmptySpaceClickListenerCaptor; @Mock protected ActivityStarter mActivityStarter; @Mock protected KeyguardFaceAuthInteractor mKeyguardFaceAuthInteractor; - @Mock protected ShadeRepository mShadeRepository; @Mock private ShadeInteractor mShadeInteractor; @Mock private JavaAdapter mJavaAdapter; @Mock private CastController mCastController; @@ -341,6 +341,7 @@ public class NotificationPanelViewControllerBaseTest extends SysuiTestCase { protected Handler mMainHandler; protected View.OnLayoutChangeListener mLayoutChangeListener; protected KeyguardStatusViewController mKeyguardStatusViewController; + protected ShadeRepository mShadeRepository; protected final FalsingManagerFake mFalsingManager = new FalsingManagerFake(); protected final Optional<SysUIUnfoldComponent> mSysUIUnfoldComponent = Optional.empty(); @@ -362,6 +363,7 @@ public class NotificationPanelViewControllerBaseTest extends SysuiTestCase { mFakeKeyguardRepository = keyguardInteractorDeps.getRepository(); mKeyguardBottomAreaInteractor = new KeyguardBottomAreaInteractor(mFakeKeyguardRepository); mKeyguardInteractor = keyguardInteractorDeps.getKeyguardInteractor(); + mShadeRepository = new FakeShadeRepository(); SystemClock systemClock = new FakeSystemClock(); mStatusBarStateController = new StatusBarStateControllerImpl(mUiEventLogger, mDumpManager, diff --git a/packages/SystemUI/tests/src/com/android/systemui/shade/data/repository/ShadeRepositoryImplTest.kt b/packages/SystemUI/tests/src/com/android/systemui/shade/data/repository/ShadeRepositoryImplTest.kt index e086712308b6..19d59fd4f1b1 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/shade/data/repository/ShadeRepositoryImplTest.kt +++ b/packages/SystemUI/tests/src/com/android/systemui/shade/data/repository/ShadeRepositoryImplTest.kt @@ -151,6 +151,24 @@ class ShadeRepositoryImplTest : SysuiTestCase() { } @Test + fun updateLegacyShadeTracking() = + testScope.runTest { + assertThat(underTest.legacyShadeTracking.value).isEqualTo(false) + + underTest.setLegacyShadeTracking(true) + assertThat(underTest.legacyShadeTracking.value).isEqualTo(true) + } + + @Test + fun updateLegacyQsTracking() = + testScope.runTest { + assertThat(underTest.legacyQsTracking.value).isEqualTo(false) + + underTest.setLegacyQsTracking(true) + assertThat(underTest.legacyQsTracking.value).isEqualTo(true) + } + + @Test fun updateUdfpsTransitionToFullShadeProgress() = testScope.runTest { assertThat(underTest.udfpsTransitionToFullShadeProgress.value).isEqualTo(0f) diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/shade/data/repository/FakeShadeRepository.kt b/packages/SystemUI/tests/utils/src/com/android/systemui/shade/data/repository/FakeShadeRepository.kt index 08152a3c49cd..e72544a24740 100644 --- a/packages/SystemUI/tests/utils/src/com/android/systemui/shade/data/repository/FakeShadeRepository.kt +++ b/packages/SystemUI/tests/utils/src/com/android/systemui/shade/data/repository/FakeShadeRepository.kt @@ -40,6 +40,23 @@ class FakeShadeRepository : ShadeRepository { @Deprecated("Use ShadeInteractor instead") override val legacyShadeExpansion = _legacyShadeExpansion + private val _legacyShadeTracking = MutableStateFlow(false) + @Deprecated("Use ShadeInteractor instead") + override val legacyShadeTracking = _legacyShadeTracking + + private val _legacyQsTracking = MutableStateFlow(false) + @Deprecated("Use ShadeInteractor instead") override val legacyQsTracking = _legacyQsTracking + + @Deprecated("Should only be called by NPVC and tests") + override fun setLegacyQsTracking(legacyQsTracking: Boolean) { + _legacyQsTracking.value = legacyQsTracking + } + + @Deprecated("Should only be called by NPVC and tests") + override fun setLegacyShadeTracking(tracking: Boolean) { + _legacyShadeTracking.value = tracking + } + fun setShadeModel(model: ShadeModel) { _shadeModel.value = model } |