Merge "Add expansion fraction to ShadeInteractor" into main
diff --git a/packages/SystemUI/src/com/android/systemui/shade/NotificationPanelViewController.java b/packages/SystemUI/src/com/android/systemui/shade/NotificationPanelViewController.java
index 132cd61..90d99b8 100644
--- a/packages/SystemUI/src/com/android/systemui/shade/NotificationPanelViewController.java
+++ b/packages/SystemUI/src/com/android/systemui/shade/NotificationPanelViewController.java
@@ -163,6 +163,7 @@
 import com.android.systemui.plugins.qs.QS;
 import com.android.systemui.plugins.statusbar.StatusBarStateController;
 import com.android.systemui.plugins.statusbar.StatusBarStateController.StateListener;
+import com.android.systemui.shade.domain.interactor.ShadeInteractor;
 import com.android.systemui.shade.transition.ShadeTransitionController;
 import com.android.systemui.shared.system.InteractionJankMonitorWrapper;
 import com.android.systemui.shared.system.QuickStepContract;
@@ -355,6 +356,7 @@
     private final AlternateBouncerInteractor mAlternateBouncerInteractor;
     private final KeyguardRootView mKeyguardRootView;
     private final QuickSettingsController mQsController;
+    private final ShadeInteractor mShadeInteractor;
     private final TouchHandler mTouchHandler = new TouchHandler();
 
     private long mDownTime;
@@ -559,7 +561,6 @@
     private float mHintDistance;
     private float mInitialOffsetOnTouch;
     private boolean mCollapsedAndHeadsUpOnDown;
-    private float mExpandedFraction = 0;
     private float mExpansionDragDownAmountPx = 0;
     private boolean mPanelClosedOnDown;
     private boolean mHasLayoutedSinceDown;
@@ -709,10 +710,12 @@
             VibratorHelper vibratorHelper,
             LatencyTracker latencyTracker,
             PowerManager powerManager,
-            AccessibilityManager accessibilityManager, @DisplayId int displayId,
+            AccessibilityManager accessibilityManager,
+            @DisplayId int displayId,
             KeyguardUpdateMonitor keyguardUpdateMonitor,
             MetricsLogger metricsLogger,
             ShadeLogger shadeLogger,
+            ShadeInteractor shadeInteractor,
             ConfigurationController configurationController,
             Provider<FlingAnimationUtils.Builder> flingAnimationUtilsBuilder,
             StatusBarTouchableRegionManager statusBarTouchableRegionManager,
@@ -785,6 +788,7 @@
         mView = view;
         mStatusBarKeyguardViewManager = statusBarKeyguardViewManager;
         mLockscreenGestureLogger = lockscreenGestureLogger;
+        mShadeInteractor = shadeInteractor;
         mShadeExpansionStateManager = shadeExpansionStateManager;
         mShadeLog = shadeLogger;
         mGutsManager = gutsManager;
@@ -2244,7 +2248,7 @@
             if (!isFalseTouch(x, y, interactionType)) {
                 mShadeLog.logFlingExpands(vel, vectorVel, interactionType,
                         this.mFlingAnimationUtils.getMinVelocityPxPerSecond(),
-                        mExpandedFraction > 0.5f, mAllowExpandForSmallExpansion);
+                        getExpandedFraction() > 0.5f, mAllowExpandForSmallExpansion);
                 if (Math.abs(vectorVel) < this.mFlingAnimationUtils.getMinVelocityPxPerSecond()) {
                     expands = shouldExpandWhenNotFlinging();
                 } else {
@@ -2419,7 +2423,7 @@
     void requestScrollerTopPaddingUpdate(boolean animate) {
         mNotificationStackScrollLayoutController.updateTopPadding(
                 mQsController.calculateNotificationsTopPadding(mIsExpandingOrCollapsing,
-                        getKeyguardNotificationStaticPadding(), mExpandedFraction), animate);
+                        getKeyguardNotificationStaticPadding(), getExpandedFraction()), animate);
         if (isKeyguardShowing()
                 && mKeyguardBypassController.getBypassEnabled()) {
             // update the position of the header
@@ -2501,10 +2505,10 @@
     private void onHeightUpdated(float expandedHeight) {
         if (expandedHeight <= 0) {
             mShadeLog.logExpansionChanged("onHeightUpdated: fully collapsed.",
-                    mExpandedFraction, isExpanded(), mTracking, mExpansionDragDownAmountPx);
+                    getExpandedFraction(), isExpanded(), mTracking, mExpansionDragDownAmountPx);
         } else if (isFullyExpanded()) {
             mShadeLog.logExpansionChanged("onHeightUpdated: fully expanded.",
-                    mExpandedFraction, isExpanded(), mTracking, mExpansionDragDownAmountPx);
+                    getExpandedFraction(), isExpanded(), mTracking, mExpansionDragDownAmountPx);
         }
         if (!mQsController.getExpanded() || mQsController.isExpandImmediate()
                 || mIsExpandingOrCollapsing && mQsController.getExpandedWhenExpandingStarted()) {
@@ -3425,7 +3429,7 @@
         ipw.print("mHintDistance="); ipw.println(mHintDistance);
         ipw.print("mInitialOffsetOnTouch="); ipw.println(mInitialOffsetOnTouch);
         ipw.print("mCollapsedAndHeadsUpOnDown="); ipw.println(mCollapsedAndHeadsUpOnDown);
-        ipw.print("mExpandedFraction="); ipw.println(mExpandedFraction);
+        ipw.print("getExpandedFraction()="); ipw.println(getExpandedFraction());
         ipw.print("mExpansionDragDownAmountPx="); ipw.println(mExpansionDragDownAmountPx);
         ipw.print("mPanelClosedOnDown="); ipw.println(mPanelClosedOnDown);
         ipw.print("mHasLayoutedSinceDown="); ipw.println(mHasLayoutedSinceDown);
@@ -3761,7 +3765,7 @@
 
             // don't fling while in keyguard to avoid jump in shade expand animation;
             // touch has been intercepted already so flinging here is redundant
-            if (mBarState == KEYGUARD && mExpandedFraction >= 1.0) {
+            if (mBarState == KEYGUARD && getExpandedFraction() >= 1.0) {
                 mShadeLog.d("NPVC endMotionEvent - skipping fling on keyguard");
             } else {
                 fling(vel, expand, isFalseTouch(x, y, interactionType));
@@ -3857,6 +3861,16 @@
     @VisibleForTesting
     void setExpandedHeight(float height) {
         debugLog("setExpandedHeight(%.1f)", height);
+        int maxPanelTransitionDistance = getMaxPanelTransitionDistance();
+        if (maxPanelTransitionDistance == 0) {
+            setExpandedFracAndHeight(0, height);
+        } else {
+            setExpandedFracAndHeight(height / maxPanelTransitionDistance, height);
+        }
+    }
+
+    private void setExpandedFracAndHeight(float frac, float height) {
+        mShadeInteractor.setExpansion(frac);
         setExpandedHeightInternal(height);
     }
 
@@ -3912,11 +3926,9 @@
                     mHeightAnimator.end();
                 }
             }
-            mExpandedFraction = Math.min(1f,
-                    maxPanelHeight == 0 ? 0 : mExpandedHeight / maxPanelHeight);
-            mQsController.setShadeExpansion(mExpandedHeight, mExpandedFraction);
+            mQsController.setShadeExpansion(mExpandedHeight, getExpandedFraction());
             mExpansionDragDownAmountPx = h;
-            mAmbientState.setExpansionFraction(mExpandedFraction);
+            mAmbientState.setExpansionFraction(getExpandedFraction());
             onHeightUpdated(mExpandedHeight);
             updateExpansionAndVisibility();
         });
@@ -3944,8 +3956,7 @@
     /** Sets the expanded height relative to a number from 0 to 1. */
     @VisibleForTesting
     void setExpandedFraction(float frac) {
-        final int maxDist = getMaxPanelTransitionDistance();
-        setExpandedHeight(maxDist * frac);
+        setExpandedFracAndHeight(frac, getMaxPanelTransitionDistance() * frac);
     }
 
     float getExpandedHeight() {
@@ -3953,7 +3964,7 @@
     }
 
     float getExpandedFraction() {
-        return mExpandedFraction;
+        return mShadeInteractor.getExpansion().getValue();
     }
 
     @Override
@@ -3975,7 +3986,7 @@
 
     @Override
     public boolean isFullyCollapsed() {
-        return mExpandedFraction <= 0.0f;
+        return getExpandedFraction() <= 0.0f;
     }
 
     @Override
@@ -4134,7 +4145,7 @@
                                         animator.getAnimatedFraction()));
                         setOverExpansionInternal(expansion, false /* isFromGesture */);
                     }
-                    setExpandedHeightInternal((float) animation.getAnimatedValue());
+                    setExpandedHeight((float) animation.getAnimatedValue());
                 });
         return animator;
     }
@@ -4148,14 +4159,14 @@
     @Override
     public void updateExpansionAndVisibility() {
         mShadeExpansionStateManager.onPanelExpansionChanged(
-                mExpandedFraction, isExpanded(), mTracking, mExpansionDragDownAmountPx);
+                getExpandedFraction(), isExpanded(), mTracking, mExpansionDragDownAmountPx);
 
         updateVisibility();
     }
 
     @Override
     public boolean isExpanded() {
-        return mExpandedFraction > 0f
+        return getExpandedFraction() > 0f
                 || mInstantExpanding
                 || isPanelVisibleBecauseOfHeadsUp()
                 || mTracking
@@ -4913,7 +4924,7 @@
                     mMotionAborted = false;
                     mPanelClosedOnDown = isFullyCollapsed();
                     mShadeLog.logPanelClosedOnDown("intercept down touch", mPanelClosedOnDown,
-                            mExpandedFraction);
+                            getExpandedFraction());
                     mCollapsedAndHeadsUpOnDown = false;
                     mHasLayoutedSinceDown = false;
                     mUpdateFlingOnLayout = false;
@@ -5132,7 +5143,7 @@
                     mMinExpandHeight = 0.0f;
                     mPanelClosedOnDown = isFullyCollapsed();
                     mShadeLog.logPanelClosedOnDown("handle down touch", mPanelClosedOnDown,
-                            mExpandedFraction);
+                            getExpandedFraction());
                     mHasLayoutedSinceDown = false;
                     mUpdateFlingOnLayout = false;
                     mMotionAborted = false;
@@ -5191,7 +5202,7 @@
                     if (isFullyCollapsed()) {
                         // If panel is fully collapsed, reset haptic effect before adding movement.
                         mHasVibratedOnOpen = false;
-                        mShadeLog.logHasVibrated(mHasVibratedOnOpen, mExpandedFraction);
+                        mShadeLog.logHasVibrated(mHasVibratedOnOpen, getExpandedFraction());
                     }
                     addMovement(event);
                     if (!isFullyCollapsed()) {
@@ -5227,7 +5238,7 @@
                         // otherwise {@link NotificationStackScrollLayout}
                         // wrongly enables stack height updates at the start of lockscreen swipe-up
                         mAmbientState.setSwipingUp(h <= 0);
-                        setExpandedHeightInternal(newHeight);
+                        setExpandedHeight(newHeight);
                     }
                     break;
 
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 ebb9935..76dca4c 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
@@ -34,13 +34,34 @@
     /** ShadeModel information regarding shade expansion events */
     val shadeModel: Flow<ShadeModel>
 
-    /** Amount qs has expanded. Quick Settings can be expanded without the full shade expansion. */
+    /**
+     * Value from `0` to `1` representing the amount the shade has expanded where `1` is fully
+     * expanded and `0` is fully collapsed. Quick Settings can be expanded without a fully expanded
+     * shade.
+     */
     val qsExpansion: StateFlow<Float>
 
+    /**
+     * Value from `0` to `1` representing the amount the shade has expanded where `1` is fully
+     * expanded and `0` is fully collapsed.
+     */
+    val expansion: StateFlow<Float>
+
     /** Amount shade has expanded with regard to the UDFPS location */
     val udfpsTransitionToFullShadeProgress: StateFlow<Float>
 
+    /**
+     * Set shade expansion to a value from `0` to `1` representing the amount the shade has expanded
+     * where `1` is fully expanded and `0` is fully collapsed.
+     */
+    fun setExpansion(expansion: Float)
+
+    /**
+     * Set quick settings expansion to a value from `0` to `1` representing the amount quick
+     * settings has expanded where `1` is fully expanded and `0` is fully collapsed.
+     */
     fun setQsExpansion(qsExpansion: Float)
+
     fun setUdfpsTransitionToFullShadeProgress(progress: Float)
 }
 
@@ -78,9 +99,17 @@
     private val _qsExpansion = MutableStateFlow(0f)
     override val qsExpansion: StateFlow<Float> = _qsExpansion.asStateFlow()
 
+    private val _expansion = MutableStateFlow(0f)
+    override val expansion: StateFlow<Float> = _expansion.asStateFlow()
+
     private var _udfpsTransitionToFullShadeProgress = MutableStateFlow(0f)
     override val udfpsTransitionToFullShadeProgress: StateFlow<Float> =
         _udfpsTransitionToFullShadeProgress.asStateFlow()
+
+    override fun setExpansion(expansion: Float) {
+        _expansion.value = expansion
+    }
+
     override fun setQsExpansion(qsExpansion: Float) {
         _qsExpansion.value = qsExpansion
     }
diff --git a/packages/SystemUI/src/com/android/systemui/shade/domain/interactor/ShadeInteractor.kt b/packages/SystemUI/src/com/android/systemui/shade/domain/interactor/ShadeInteractor.kt
index 6fde84a..efe3eb4 100644
--- a/packages/SystemUI/src/com/android/systemui/shade/domain/interactor/ShadeInteractor.kt
+++ b/packages/SystemUI/src/com/android/systemui/shade/domain/interactor/ShadeInteractor.kt
@@ -19,6 +19,7 @@
 import com.android.systemui.dagger.SysUISingleton
 import com.android.systemui.dagger.qualifiers.Application
 import com.android.systemui.keyguard.data.repository.KeyguardRepository
+import com.android.systemui.shade.data.repository.ShadeRepository
 import com.android.systemui.statusbar.disableflags.data.repository.DisableFlagsRepository
 import com.android.systemui.statusbar.pipeline.mobile.data.repository.UserSetupRepository
 import com.android.systemui.statusbar.policy.DeviceProvisionedController
@@ -38,18 +39,29 @@
 @Inject
 constructor(
     @Application scope: CoroutineScope,
+    private val shadeRepository: ShadeRepository,
     disableFlagsRepository: DisableFlagsRepository,
     keyguardRepository: KeyguardRepository,
     userSetupRepository: UserSetupRepository,
     deviceProvisionedController: DeviceProvisionedController,
     userInteractor: UserInteractor,
 ) {
+    /**
+     * Value from `0` to `1` representing the amount the shade has expanded where `1` is fully
+     * expanded and `0` is fully collapsed.
+     */
+    val expansion = shadeRepository.expansion
+
     /** Emits true if the shade is currently allowed and false otherwise. */
     val isShadeEnabled: StateFlow<Boolean> =
         disableFlagsRepository.disableFlags
             .map { it.isShadeEnabled() }
             .stateIn(scope, SharingStarted.Eagerly, initialValue = false)
 
+    fun setExpansion(expansion: Float) {
+        shadeRepository.setExpansion(expansion)
+    }
+
     /** Emits true if the shade can be expanded from QQS to QS and false otherwise. */
     val isExpandToQsEnabled: Flow<Boolean> =
         combine(
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 981e44b..5cad9f8 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/shade/NotificationPanelViewControllerBaseTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/shade/NotificationPanelViewControllerBaseTest.java
@@ -73,6 +73,7 @@
 import com.android.keyguard.KeyguardStatusViewController;
 import com.android.keyguard.KeyguardUpdateMonitor;
 import com.android.keyguard.LockIconViewController;
+import com.android.keyguard.TestScopeProvider;
 import com.android.keyguard.dagger.KeyguardQsUserSwitchComponent;
 import com.android.keyguard.dagger.KeyguardStatusBarViewComponent;
 import com.android.keyguard.dagger.KeyguardStatusViewComponent;
@@ -119,6 +120,7 @@
 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;
@@ -134,6 +136,7 @@
 import com.android.systemui.statusbar.StatusBarStateControllerImpl;
 import com.android.systemui.statusbar.SysuiStatusBarStateController;
 import com.android.systemui.statusbar.VibratorHelper;
+import com.android.systemui.statusbar.disableflags.data.repository.FakeDisableFlagsRepository;
 import com.android.systemui.statusbar.notification.ConversationNotificationManager;
 import com.android.systemui.statusbar.notification.DynamicPrivacyController;
 import com.android.systemui.statusbar.notification.NotificationWakeUpCoordinator;
@@ -164,14 +167,17 @@
 import com.android.systemui.statusbar.phone.StatusBarTouchableRegionManager;
 import com.android.systemui.statusbar.phone.TapAgainViewController;
 import com.android.systemui.statusbar.phone.UnlockedScreenOffAnimationController;
+import com.android.systemui.statusbar.pipeline.mobile.data.repository.FakeUserSetupRepository;
 import com.android.systemui.statusbar.policy.CastController;
 import com.android.systemui.statusbar.policy.ConfigurationController;
+import com.android.systemui.statusbar.policy.DeviceProvisionedController;
 import com.android.systemui.statusbar.policy.KeyguardQsUserSwitchController;
 import com.android.systemui.statusbar.policy.KeyguardStateController;
 import com.android.systemui.statusbar.policy.KeyguardUserSwitcherController;
 import com.android.systemui.statusbar.policy.KeyguardUserSwitcherView;
 import com.android.systemui.statusbar.window.StatusBarWindowStateController;
 import com.android.systemui.unfold.SysUIUnfoldComponent;
+import com.android.systemui.user.domain.interactor.UserInteractor;
 import com.android.systemui.util.kotlin.JavaAdapter;
 import com.android.systemui.util.time.FakeSystemClock;
 import com.android.systemui.util.time.SystemClock;
@@ -358,6 +364,16 @@
         mFakeKeyguardRepository = keyguardInteractorDeps.getRepository();
         mKeyguardBottomAreaInteractor = new KeyguardBottomAreaInteractor(mFakeKeyguardRepository);
         mKeyguardInteractor = keyguardInteractorDeps.getKeyguardInteractor();
+        mShadeRepository = new FakeShadeRepository();
+        mShadeInteractor = new ShadeInteractor(
+                TestScopeProvider.getTestScope(),
+                mShadeRepository,
+                new FakeDisableFlagsRepository(),
+                new FakeKeyguardRepository(),
+                new FakeUserSetupRepository(),
+                mock(DeviceProvisionedController.class),
+                mock(UserInteractor.class)
+        );
 
         SystemClock systemClock = new FakeSystemClock();
         mStatusBarStateController = new StatusBarStateControllerImpl(mUiEventLogger, mDumpManager,
@@ -584,19 +600,33 @@
                 mMainHandler,
                 mLayoutInflater,
                 mFeatureFlags,
-                coordinator, expansionHandler, mDynamicPrivacyController, mKeyguardBypassController,
-                mFalsingManager, new FalsingCollectorFake(),
+                coordinator,
+                expansionHandler,
+                mDynamicPrivacyController,
+                mKeyguardBypassController,
+                mFalsingManager,
+                new FalsingCollectorFake(),
                 mKeyguardStateController,
                 mStatusBarStateController,
                 mStatusBarWindowStateController,
                 mNotificationShadeWindowController,
-                mDozeLog, mDozeParameters, mCommandQueue, mVibratorHelper,
-                mLatencyTracker, mPowerManager, mAccessibilityManager, 0, mUpdateMonitor,
+                mDozeLog,
+                mDozeParameters,
+                mCommandQueue,
+                mVibratorHelper,
+                mLatencyTracker,
+                mPowerManager,
+                mAccessibilityManager,
+                0,
+                mUpdateMonitor,
                 mMetricsLogger,
                 mShadeLog,
+                mShadeInteractor,
                 mConfigurationController,
-                () -> flingAnimationUtilsBuilder, mStatusBarTouchableRegionManager,
-                mConversationNotificationManager, mMediaHierarchyManager,
+                () -> flingAnimationUtilsBuilder,
+                mStatusBarTouchableRegionManager,
+                mConversationNotificationManager,
+                mMediaHierarchyManager,
                 mStatusBarKeyguardViewManager,
                 mGutsManager,
                 mNotificationsQSContainerController,
diff --git a/packages/SystemUI/tests/src/com/android/systemui/shade/QuickSettingsControllerBaseTest.java b/packages/SystemUI/tests/src/com/android/systemui/shade/QuickSettingsControllerBaseTest.java
index a2c2912..35a54d1 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/shade/QuickSettingsControllerBaseTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/shade/QuickSettingsControllerBaseTest.java
@@ -49,6 +49,7 @@
 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;
@@ -170,6 +171,7 @@
         mShadeInteractor =
                 new ShadeInteractor(
                         mTestScope.getBackgroundScope(),
+                        new FakeShadeRepository(),
                         mDisableFlagsRepository,
                         mKeyguardRepository,
                         new FakeUserSetupRepository(),
diff --git a/packages/SystemUI/tests/src/com/android/systemui/shade/data/repository/ShadeInteractorTest.kt b/packages/SystemUI/tests/src/com/android/systemui/shade/data/repository/ShadeInteractorTest.kt
index cdcd1a2..9e6c12f 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/shade/data/repository/ShadeInteractorTest.kt
+++ b/packages/SystemUI/tests/src/com/android/systemui/shade/data/repository/ShadeInteractorTest.kt
@@ -67,6 +67,7 @@
     private val featureFlags = FakeFeatureFlags()
     private val userSetupRepository = FakeUserSetupRepository()
     private val userRepository = FakeUserRepository()
+    private val shadeRepository = FakeShadeRepository()
     private val disableFlagsRepository = FakeDisableFlagsRepository()
     private val keyguardRepository = FakeKeyguardRepository()
 
@@ -138,6 +139,7 @@
         underTest =
             ShadeInteractor(
                 testScope.backgroundScope,
+                shadeRepository,
                 disableFlagsRepository,
                 keyguardRepository,
                 userSetupRepository,
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/LockscreenShadeTransitionControllerTest.kt b/packages/SystemUI/tests/src/com/android/systemui/statusbar/LockscreenShadeTransitionControllerTest.kt
index 4a2518a..ec4367c 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/LockscreenShadeTransitionControllerTest.kt
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/LockscreenShadeTransitionControllerTest.kt
@@ -102,8 +102,10 @@
     @Mock lateinit var transitionControllerCallback: LockscreenShadeTransitionController.Callback
     private val disableFlagsRepository = FakeDisableFlagsRepository()
     private val keyguardRepository = FakeKeyguardRepository()
+    private val shadeRepository = FakeShadeRepository()
     private val shadeInteractor = ShadeInteractor(
         testScope.backgroundScope,
+        shadeRepository,
         disableFlagsRepository,
         keyguardRepository,
         userSetupRepository = FakeUserSetupRepository(),
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 492e542..35a3fd0 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
@@ -30,6 +30,9 @@
     private val _qsExpansion = MutableStateFlow(0f)
     override val qsExpansion = _qsExpansion
 
+    private val _expansion = MutableStateFlow(0f)
+    override val expansion = _expansion
+
     private val _udfpsTransitionToFullShadeProgress = MutableStateFlow(0f)
     override val udfpsTransitionToFullShadeProgress = _udfpsTransitionToFullShadeProgress
 
@@ -41,6 +44,10 @@
         _qsExpansion.value = qsExpansion
     }
 
+    override fun setExpansion(expansion: Float) {
+        _expansion.value = expansion
+    }
+
     override fun setUdfpsTransitionToFullShadeProgress(progress: Float) {
         _udfpsTransitionToFullShadeProgress.value = progress
     }