Loading packages/SystemUI/src/com/android/systemui/shade/NotificationPanelViewController.java +25 −25 Original line number Diff line number Diff line Loading @@ -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; Loading Loading @@ -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; Loading Loading @@ -1001,7 +999,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 Loading Loading @@ -2544,10 +2542,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()) { Loading Loading @@ -2740,7 +2738,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 */); } Loading Loading @@ -2827,7 +2825,7 @@ public final class NotificationPanelViewController implements ShadeSurface, Dump private void onTrackingStarted() { endClosing(); mTracking = true; mShadeRepository.setLegacyShadeTracking(true); mTrackingStartedListener.onTrackingStarted(); notifyExpandingStarted(); updateExpansionAndVisibility(); Loading @@ -2841,7 +2839,7 @@ public final class NotificationPanelViewController implements ShadeSurface, Dump } private void onTrackingStopped(boolean expand) { mTracking = false; mShadeRepository.setLegacyShadeTracking(false); updateExpansionAndVisibility(); if (expand) { Loading Loading @@ -3013,7 +3011,7 @@ public final class NotificationPanelViewController implements ShadeSurface, Dump } private void updateExpandedHeight(float expandedHeight) { if (mTracking) { if (isTracking()) { mNotificationStackScrollLayoutController .setExpandingVelocity(getCurrentExpandVelocity()); } Loading Loading @@ -3102,7 +3100,7 @@ public final class NotificationPanelViewController implements ShadeSurface, Dump mTouchDisabled = disabled; if (mTouchDisabled) { cancelHeightAnimator(); if (mTracking) { if (isTracking()) { onTrackingStopped(true /* expanded */); } notifyExpandingFinished(); Loading Loading @@ -3341,7 +3339,7 @@ public final class NotificationPanelViewController implements ShadeSurface, Dump @Override public void blockExpansionForCurrentTouch() { mBlockingExpansionForCurrentTouch = mTracking; mBlockingExpansionForCurrentTouch = isTracking(); } @Override Loading @@ -3355,7 +3353,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="); Loading Loading @@ -3693,7 +3691,7 @@ public final class NotificationPanelViewController implements ShadeSurface, Dump mQsController.beginJankMonitoring(isFullyCollapsed()); } mInitialOffsetOnTouch = expandedHeight; if (!mTracking || isFullyCollapsed()) { if (!isTracking() || isFullyCollapsed()) { mInitialExpandY = newY; mInitialExpandX = newX; } else { Loading @@ -3711,7 +3709,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) { Loading Loading @@ -3875,7 +3873,7 @@ public final class NotificationPanelViewController implements ShadeSurface, Dump return; } if (mTracking && !(mBlockingExpansionForCurrentTouch if (isTracking() && !(mBlockingExpansionForCurrentTouch || mQsController.isTrackingBlocked())) { return; } Loading @@ -3901,7 +3899,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 */); } Loading Loading @@ -3988,12 +3986,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 Loading Loading @@ -4085,7 +4083,7 @@ public final class NotificationPanelViewController implements ShadeSurface, Dump @Override public void updateExpansionAndVisibility() { mShadeExpansionStateManager.onPanelExpansionChanged( mExpandedFraction, isExpanded(), mTracking, mExpansionDragDownAmountPx); mExpandedFraction, isExpanded(), isTracking(), mExpansionDragDownAmountPx); updateVisibility(); } Loading @@ -4095,7 +4093,7 @@ public final class NotificationPanelViewController implements ShadeSurface, Dump return mExpandedFraction > 0f || mInstantExpanding || isPanelVisibleBecauseOfHeadsUp() || mTracking || isTracking() || mHeightAnimator != null || isPanelVisibleBecauseScrimIsAnimatingOff() && !mIsSpringBackAnimation; Loading Loading @@ -4798,7 +4796,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 { Loading Loading @@ -4975,7 +4973,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 */); } Loading Loading @@ -5101,7 +5099,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; Loading @@ -5116,7 +5116,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, Loading @@ -5142,7 +5142,7 @@ public final class NotificationPanelViewController implements ShadeSurface, Dump } break; } return !mGestureWaitForTouchSlop || mTracking; return !mGestureWaitForTouchSlop || isTracking(); } } Loading packages/SystemUI/src/com/android/systemui/shade/QuickSettingsController.java +17 −15 Original line number Diff line number Diff line Loading @@ -201,8 +201,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; Loading Loading @@ -600,7 +598,7 @@ public class QuickSettingsController implements Dumpable { @VisibleForTesting boolean isTracking() { return mTracking; return mShadeRepository.getLegacyQsTracking().getValue(); } public boolean getFullyExpanded() { Loading @@ -613,10 +611,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; } Loading Loading @@ -1601,7 +1603,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(); Loading @@ -1616,9 +1618,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; Loading Loading @@ -1662,7 +1664,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(); Loading @@ -1688,7 +1690,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; Loading Loading @@ -1725,7 +1727,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(); Loading Loading @@ -1780,7 +1782,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(); } Loading @@ -1799,7 +1801,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. Loading @@ -1819,7 +1821,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(); Loading @@ -1839,7 +1841,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; Loading Loading @@ -2065,7 +2067,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="); Loading packages/SystemUI/src/com/android/systemui/shade/data/repository/ShadeRepository.kt +42 −0 Original line number Diff line number Diff line Loading @@ -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> Loading Loading @@ -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 } Loading packages/SystemUI/tests/src/com/android/systemui/shade/NotificationPanelViewControllerBaseTest.java +3 −1 Original line number Diff line number Diff line Loading @@ -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; Loading Loading @@ -321,7 +322,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; Loading @@ -342,6 +342,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(); Loading @@ -363,6 +364,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, Loading packages/SystemUI/tests/src/com/android/systemui/shade/data/repository/ShadeRepositoryImplTest.kt +18 −0 Original line number Diff line number Diff line Loading @@ -150,6 +150,24 @@ class ShadeRepositoryImplTest : SysuiTestCase() { assertThat(underTest.legacyShadeExpansion.value).isEqualTo(1f) } @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 { Loading Loading
packages/SystemUI/src/com/android/systemui/shade/NotificationPanelViewController.java +25 −25 Original line number Diff line number Diff line Loading @@ -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; Loading Loading @@ -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; Loading Loading @@ -1001,7 +999,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 Loading Loading @@ -2544,10 +2542,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()) { Loading Loading @@ -2740,7 +2738,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 */); } Loading Loading @@ -2827,7 +2825,7 @@ public final class NotificationPanelViewController implements ShadeSurface, Dump private void onTrackingStarted() { endClosing(); mTracking = true; mShadeRepository.setLegacyShadeTracking(true); mTrackingStartedListener.onTrackingStarted(); notifyExpandingStarted(); updateExpansionAndVisibility(); Loading @@ -2841,7 +2839,7 @@ public final class NotificationPanelViewController implements ShadeSurface, Dump } private void onTrackingStopped(boolean expand) { mTracking = false; mShadeRepository.setLegacyShadeTracking(false); updateExpansionAndVisibility(); if (expand) { Loading Loading @@ -3013,7 +3011,7 @@ public final class NotificationPanelViewController implements ShadeSurface, Dump } private void updateExpandedHeight(float expandedHeight) { if (mTracking) { if (isTracking()) { mNotificationStackScrollLayoutController .setExpandingVelocity(getCurrentExpandVelocity()); } Loading Loading @@ -3102,7 +3100,7 @@ public final class NotificationPanelViewController implements ShadeSurface, Dump mTouchDisabled = disabled; if (mTouchDisabled) { cancelHeightAnimator(); if (mTracking) { if (isTracking()) { onTrackingStopped(true /* expanded */); } notifyExpandingFinished(); Loading Loading @@ -3341,7 +3339,7 @@ public final class NotificationPanelViewController implements ShadeSurface, Dump @Override public void blockExpansionForCurrentTouch() { mBlockingExpansionForCurrentTouch = mTracking; mBlockingExpansionForCurrentTouch = isTracking(); } @Override Loading @@ -3355,7 +3353,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="); Loading Loading @@ -3693,7 +3691,7 @@ public final class NotificationPanelViewController implements ShadeSurface, Dump mQsController.beginJankMonitoring(isFullyCollapsed()); } mInitialOffsetOnTouch = expandedHeight; if (!mTracking || isFullyCollapsed()) { if (!isTracking() || isFullyCollapsed()) { mInitialExpandY = newY; mInitialExpandX = newX; } else { Loading @@ -3711,7 +3709,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) { Loading Loading @@ -3875,7 +3873,7 @@ public final class NotificationPanelViewController implements ShadeSurface, Dump return; } if (mTracking && !(mBlockingExpansionForCurrentTouch if (isTracking() && !(mBlockingExpansionForCurrentTouch || mQsController.isTrackingBlocked())) { return; } Loading @@ -3901,7 +3899,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 */); } Loading Loading @@ -3988,12 +3986,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 Loading Loading @@ -4085,7 +4083,7 @@ public final class NotificationPanelViewController implements ShadeSurface, Dump @Override public void updateExpansionAndVisibility() { mShadeExpansionStateManager.onPanelExpansionChanged( mExpandedFraction, isExpanded(), mTracking, mExpansionDragDownAmountPx); mExpandedFraction, isExpanded(), isTracking(), mExpansionDragDownAmountPx); updateVisibility(); } Loading @@ -4095,7 +4093,7 @@ public final class NotificationPanelViewController implements ShadeSurface, Dump return mExpandedFraction > 0f || mInstantExpanding || isPanelVisibleBecauseOfHeadsUp() || mTracking || isTracking() || mHeightAnimator != null || isPanelVisibleBecauseScrimIsAnimatingOff() && !mIsSpringBackAnimation; Loading Loading @@ -4798,7 +4796,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 { Loading Loading @@ -4975,7 +4973,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 */); } Loading Loading @@ -5101,7 +5099,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; Loading @@ -5116,7 +5116,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, Loading @@ -5142,7 +5142,7 @@ public final class NotificationPanelViewController implements ShadeSurface, Dump } break; } return !mGestureWaitForTouchSlop || mTracking; return !mGestureWaitForTouchSlop || isTracking(); } } Loading
packages/SystemUI/src/com/android/systemui/shade/QuickSettingsController.java +17 −15 Original line number Diff line number Diff line Loading @@ -201,8 +201,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; Loading Loading @@ -600,7 +598,7 @@ public class QuickSettingsController implements Dumpable { @VisibleForTesting boolean isTracking() { return mTracking; return mShadeRepository.getLegacyQsTracking().getValue(); } public boolean getFullyExpanded() { Loading @@ -613,10 +611,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; } Loading Loading @@ -1601,7 +1603,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(); Loading @@ -1616,9 +1618,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; Loading Loading @@ -1662,7 +1664,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(); Loading @@ -1688,7 +1690,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; Loading Loading @@ -1725,7 +1727,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(); Loading Loading @@ -1780,7 +1782,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(); } Loading @@ -1799,7 +1801,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. Loading @@ -1819,7 +1821,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(); Loading @@ -1839,7 +1841,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; Loading Loading @@ -2065,7 +2067,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="); Loading
packages/SystemUI/src/com/android/systemui/shade/data/repository/ShadeRepository.kt +42 −0 Original line number Diff line number Diff line Loading @@ -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> Loading Loading @@ -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 } Loading
packages/SystemUI/tests/src/com/android/systemui/shade/NotificationPanelViewControllerBaseTest.java +3 −1 Original line number Diff line number Diff line Loading @@ -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; Loading Loading @@ -321,7 +322,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; Loading @@ -342,6 +342,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(); Loading @@ -363,6 +364,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, Loading
packages/SystemUI/tests/src/com/android/systemui/shade/data/repository/ShadeRepositoryImplTest.kt +18 −0 Original line number Diff line number Diff line Loading @@ -150,6 +150,24 @@ class ShadeRepositoryImplTest : SysuiTestCase() { assertThat(underTest.legacyShadeExpansion.value).isEqualTo(1f) } @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 { Loading