Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit d3c939a9 authored by Justin Weir's avatar Justin Weir
Browse files

Move tracking booleans to ShadeRepository

Bug: 300254715
Test: updated and ran affected tests
Test: manually checked shade CUJs
Change-Id: I9ec1ed388b7022f6b6723ec0ee9555c3d97e21b6
parent 7922ca8b
Loading
Loading
Loading
Loading
+25 −25
Original line number Diff line number Diff line
@@ -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();
        }
    }

+17 −15
Original line number Diff line number Diff line
@@ -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=");
+42 −0
Original line number Diff line number Diff line
@@ -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
    }
+3 −1
Original line number Diff line number Diff line
@@ -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,
+18 −0
Original line number Diff line number Diff line
@@ -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