Loading packages/SystemUI/src/com/android/systemui/shade/NotificationPanelViewController.java +7 −1 Original line number Diff line number Diff line Loading @@ -163,6 +163,7 @@ import com.android.systemui.plugins.FalsingManager.FalsingTapListener; 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.data.repository.ShadeRepository; import com.android.systemui.shade.transition.ShadeTransitionController; import com.android.systemui.shared.system.InteractionJankMonitorWrapper; import com.android.systemui.shared.system.QuickStepContract; Loading Loading @@ -350,6 +351,7 @@ public final class NotificationPanelViewController implements ShadeSurface, Dump private final Interpolator mBounceInterpolator; private final NotificationShadeWindowController mNotificationShadeWindowController; private final ShadeExpansionStateManager mShadeExpansionStateManager; private final ShadeRepository mShadeRepository; private final FalsingTapListener mFalsingTapListener = this::falsingAdditionalTapRequired; private final AccessibilityDelegate mAccessibilityDelegate = new ShadeAccessibilityDelegate(); private final NotificationGutsManager mGutsManager; Loading Loading @@ -710,7 +712,8 @@ public final class NotificationPanelViewController implements ShadeSurface, Dump VibratorHelper vibratorHelper, LatencyTracker latencyTracker, PowerManager powerManager, AccessibilityManager accessibilityManager, @DisplayId int displayId, AccessibilityManager accessibilityManager, @DisplayId int displayId, KeyguardUpdateMonitor keyguardUpdateMonitor, MetricsLogger metricsLogger, ShadeLogger shadeLogger, Loading Loading @@ -746,6 +749,7 @@ public final class NotificationPanelViewController implements ShadeSurface, Dump ScreenOffAnimationController screenOffAnimationController, LockscreenGestureLogger lockscreenGestureLogger, ShadeExpansionStateManager shadeExpansionStateManager, ShadeRepository shadeRepository, Optional<SysUIUnfoldComponent> unfoldComponent, SysUiState sysUiState, Provider<KeyguardBottomAreaViewController> keyguardBottomAreaViewControllerProvider, Loading Loading @@ -788,6 +792,7 @@ public final class NotificationPanelViewController implements ShadeSurface, Dump mStatusBarKeyguardViewManager = statusBarKeyguardViewManager; mLockscreenGestureLogger = lockscreenGestureLogger; mShadeExpansionStateManager = shadeExpansionStateManager; mShadeRepository = shadeRepository; mShadeLog = shadeLogger; mGutsManager = gutsManager; mDreamingToLockscreenTransitionViewModel = dreamingToLockscreenTransitionViewModel; Loading Loading @@ -3952,6 +3957,7 @@ public final class NotificationPanelViewController implements ShadeSurface, Dump } mExpandedFraction = Math.min(1f, maxPanelHeight == 0 ? 0 : mExpandedHeight / maxPanelHeight); mShadeRepository.setLegacyShadeExpansion(mExpandedFraction); mQsController.setShadeExpansion(mExpandedHeight, mExpandedFraction); mExpansionDragDownAmountPx = h; mAmbientState.setExpansionFraction(mExpandedFraction); Loading packages/SystemUI/src/com/android/systemui/shade/data/repository/ShadeRepository.kt +47 −9 Original line number Diff line number Diff line Loading @@ -34,21 +34,48 @@ interface ShadeRepository { /** ShadeModel information regarding shade expansion events */ val shadeModel: Flow<ShadeModel> /** Amount qs has expanded. Quick Settings can be expanded without the full shade expansion. */ /** * Amount qs has expanded, [0-1]. 0 means fully collapsed, 1 means fully expanded. Quick * Settings can be expanded without the full shade expansion. */ val qsExpansion: StateFlow<Float> /** The amount the shade has expanded */ val shadeExpansion: StateFlow<Float> /** * The amount the lockscreen shade has dragged down by the user, [0-1]. 0 means fully collapsed, * 1 means fully expanded. */ val lockscreenShadeExpansion: StateFlow<Float> /** * NotificationPanelViewController.mExpandedFraction as a StateFlow. This nominally represents * the amount the shade has expanded 0-1 like many other flows in this repo, but there are cases * where its value will be 1 and no shade will be rendered, e.g. whenever the keyguard is * visible and when quick settings is expanded. The confusing nature and impending deletion of * this makes it unsuitable for future development, so usage is discouraged. */ @Deprecated("Use ShadeInteractor.shadeExpansion instead") val legacyShadeExpansion: StateFlow<Float> /** Amount shade has expanded with regard to the UDFPS location */ val udfpsTransitionToFullShadeProgress: StateFlow<Float> /** The amount QS has expanded without notifications */ fun setQsExpansion(qsExpansion: Float) fun setUdfpsTransitionToFullShadeProgress(progress: Float) /** The amount the shade has expanded, [0-1]. 0 means fully collapsed, 1 means fully expanded */ fun setShadeExpansion(expansion: Float) /** * Set the amount the shade has dragged down by the user, [0-1]. 0 means fully collapsed, 1 * means fully expanded. */ fun setLockscreenShadeExpansion(lockscreenShadeExpansion: Float) /** * Set the legacy expansion value. This should only be called whenever the value of * NotificationPanelViewController.mExpandedFraction changes or in tests. */ @Deprecated("Should only be called by NPVC and tests") fun setLegacyShadeExpansion(expandedFraction: Float) } /** Business logic for shade interactions */ Loading Loading @@ -84,18 +111,29 @@ constructor(shadeExpansionStateManager: ShadeExpansionStateManager) : ShadeRepos private val _qsExpansion = MutableStateFlow(0f) override val qsExpansion: StateFlow<Float> = _qsExpansion.asStateFlow() private val _shadeExpansion = MutableStateFlow(0f) override val shadeExpansion: StateFlow<Float> = _shadeExpansion.asStateFlow() private val _lockscreenShadeExpansion = MutableStateFlow(0f) override val lockscreenShadeExpansion: StateFlow<Float> = _lockscreenShadeExpansion.asStateFlow() private var _udfpsTransitionToFullShadeProgress = MutableStateFlow(0f) override val udfpsTransitionToFullShadeProgress: StateFlow<Float> = _udfpsTransitionToFullShadeProgress.asStateFlow() private val _legacyShadeExpansion = MutableStateFlow(0f) @Deprecated("Use ShadeInteractor.shadeExpansion instead") override val legacyShadeExpansion: StateFlow<Float> = _legacyShadeExpansion.asStateFlow() override fun setQsExpansion(qsExpansion: Float) { _qsExpansion.value = qsExpansion } override fun setShadeExpansion(expansion: Float) { _shadeExpansion.value = expansion @Deprecated("Should only be called by NPVC and tests") override fun setLegacyShadeExpansion(expandedFraction: Float) { _legacyShadeExpansion.value = expandedFraction } override fun setLockscreenShadeExpansion(lockscreenShadeExpansion: Float) { _lockscreenShadeExpansion.value = lockscreenShadeExpansion } override fun setUdfpsTransitionToFullShadeProgress(progress: Float) { Loading packages/SystemUI/src/com/android/systemui/shade/domain/interactor/ShadeInteractor.kt +26 −8 Original line number Diff line number Diff line Loading @@ -22,6 +22,7 @@ import com.android.systemui.keyguard.data.repository.KeyguardRepository import com.android.systemui.keyguard.shared.model.StatusBarState import com.android.systemui.shade.data.repository.ShadeRepository import com.android.systemui.statusbar.disableflags.data.repository.DisableFlagsRepository import com.android.systemui.statusbar.notification.stack.domain.interactor.SharedNotificationContainerInteractor import com.android.systemui.statusbar.pipeline.mobile.data.repository.UserSetupRepository import com.android.systemui.statusbar.policy.DeviceProvisionedController import com.android.systemui.user.domain.interactor.UserInteractor Loading @@ -31,6 +32,7 @@ import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.SharingStarted import kotlinx.coroutines.flow.StateFlow import kotlinx.coroutines.flow.combine import kotlinx.coroutines.flow.distinctUntilChanged import kotlinx.coroutines.flow.map import kotlinx.coroutines.flow.stateIn Loading @@ -45,6 +47,7 @@ constructor( userSetupRepository: UserSetupRepository, deviceProvisionedController: DeviceProvisionedController, userInteractor: UserInteractor, sharedNotificationContainerInteractor: SharedNotificationContainerInteractor, repository: ShadeRepository, ) { /** Emits true if the shade is currently allowed and false otherwise. */ Loading @@ -53,16 +56,31 @@ constructor( .map { it.isShadeEnabled() } .stateIn(scope, SharingStarted.Eagerly, initialValue = false) /** * Whether split shade, the combined notifications and quick settings shade used for large * screens, is enabled. */ val splitShadeEnabled: Flow<Boolean> = sharedNotificationContainerInteractor.configurationBasedDimensions .map { dimens -> dimens.useSplitShade } .distinctUntilChanged() /** The amount [0-1] that the shade has been opened */ val shadeExpansion: Flow<Float> = combine(repository.shadeExpansion, keyguardRepository.statusBarState) { shadeExpansion, statusBarState -> combine( repository.lockscreenShadeExpansion, keyguardRepository.statusBarState, repository.legacyShadeExpansion, repository.qsExpansion, splitShadeEnabled ) { dragDownAmount, statusBarState, legacyShadeExpansion, qsExpansion, splitShadeEnabled -> when (statusBarState) { // legacyShadeExpansion is 1 instead of 0 when QS is expanded StatusBarState.SHADE -> if (!splitShadeEnabled && qsExpansion > 0f) 0f else legacyShadeExpansion StatusBarState.KEYGUARD -> dragDownAmount // This is required, as shadeExpansion gets reset to 0f even with the shade open if (statusBarState == StatusBarState.SHADE_LOCKED) { 1f } else { shadeExpansion StatusBarState.SHADE_LOCKED -> 1f } } Loading packages/SystemUI/src/com/android/systemui/statusbar/LockscreenShadeTransitionController.kt +7 −7 Original line number Diff line number Diff line Loading @@ -447,7 +447,7 @@ class LockscreenShadeTransitionController @Inject constructor( if (!nsslController.isInLockedDownShade() || field == 0f || forceApplyAmount) { fractionToShade = MathUtils.saturate(dragDownAmount / notificationShelfTransitionDistance) shadeRepository.setShadeExpansion(fractionToShade) shadeRepository.setLockscreenShadeExpansion(fractionToShade) nsslController.setTransitionToFullShadeAmount(fractionToShade) qsTransitionController.dragDownAmount = value Loading Loading @@ -857,8 +857,8 @@ class DragDownHelper( MotionEvent.ACTION_MOVE -> { val h = y - initialTouchY // Adjust the touch slop if another gesture may be being performed. val touchSlop = if (event.classification == MotionEvent.CLASSIFICATION_AMBIGUOUS_GESTURE) { val touchSlop = if (event.classification == MotionEvent.CLASSIFICATION_AMBIGUOUS_GESTURE) { touchSlop * slopMultiplier } else { touchSlop Loading packages/SystemUI/tests/src/com/android/systemui/shade/NotificationPanelViewControllerBaseTest.java +1 −0 Original line number Diff line number Diff line Loading @@ -626,6 +626,7 @@ public class NotificationPanelViewControllerBaseTest extends SysuiTestCase { mScreenOffAnimationController, mLockscreenGestureLogger, mShadeExpansionStateManager, mShadeRepository, mSysUIUnfoldComponent, mSysUiState, () -> mKeyguardBottomAreaViewController, Loading Loading
packages/SystemUI/src/com/android/systemui/shade/NotificationPanelViewController.java +7 −1 Original line number Diff line number Diff line Loading @@ -163,6 +163,7 @@ import com.android.systemui.plugins.FalsingManager.FalsingTapListener; 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.data.repository.ShadeRepository; import com.android.systemui.shade.transition.ShadeTransitionController; import com.android.systemui.shared.system.InteractionJankMonitorWrapper; import com.android.systemui.shared.system.QuickStepContract; Loading Loading @@ -350,6 +351,7 @@ public final class NotificationPanelViewController implements ShadeSurface, Dump private final Interpolator mBounceInterpolator; private final NotificationShadeWindowController mNotificationShadeWindowController; private final ShadeExpansionStateManager mShadeExpansionStateManager; private final ShadeRepository mShadeRepository; private final FalsingTapListener mFalsingTapListener = this::falsingAdditionalTapRequired; private final AccessibilityDelegate mAccessibilityDelegate = new ShadeAccessibilityDelegate(); private final NotificationGutsManager mGutsManager; Loading Loading @@ -710,7 +712,8 @@ public final class NotificationPanelViewController implements ShadeSurface, Dump VibratorHelper vibratorHelper, LatencyTracker latencyTracker, PowerManager powerManager, AccessibilityManager accessibilityManager, @DisplayId int displayId, AccessibilityManager accessibilityManager, @DisplayId int displayId, KeyguardUpdateMonitor keyguardUpdateMonitor, MetricsLogger metricsLogger, ShadeLogger shadeLogger, Loading Loading @@ -746,6 +749,7 @@ public final class NotificationPanelViewController implements ShadeSurface, Dump ScreenOffAnimationController screenOffAnimationController, LockscreenGestureLogger lockscreenGestureLogger, ShadeExpansionStateManager shadeExpansionStateManager, ShadeRepository shadeRepository, Optional<SysUIUnfoldComponent> unfoldComponent, SysUiState sysUiState, Provider<KeyguardBottomAreaViewController> keyguardBottomAreaViewControllerProvider, Loading Loading @@ -788,6 +792,7 @@ public final class NotificationPanelViewController implements ShadeSurface, Dump mStatusBarKeyguardViewManager = statusBarKeyguardViewManager; mLockscreenGestureLogger = lockscreenGestureLogger; mShadeExpansionStateManager = shadeExpansionStateManager; mShadeRepository = shadeRepository; mShadeLog = shadeLogger; mGutsManager = gutsManager; mDreamingToLockscreenTransitionViewModel = dreamingToLockscreenTransitionViewModel; Loading Loading @@ -3952,6 +3957,7 @@ public final class NotificationPanelViewController implements ShadeSurface, Dump } mExpandedFraction = Math.min(1f, maxPanelHeight == 0 ? 0 : mExpandedHeight / maxPanelHeight); mShadeRepository.setLegacyShadeExpansion(mExpandedFraction); mQsController.setShadeExpansion(mExpandedHeight, mExpandedFraction); mExpansionDragDownAmountPx = h; mAmbientState.setExpansionFraction(mExpandedFraction); Loading
packages/SystemUI/src/com/android/systemui/shade/data/repository/ShadeRepository.kt +47 −9 Original line number Diff line number Diff line Loading @@ -34,21 +34,48 @@ interface ShadeRepository { /** ShadeModel information regarding shade expansion events */ val shadeModel: Flow<ShadeModel> /** Amount qs has expanded. Quick Settings can be expanded without the full shade expansion. */ /** * Amount qs has expanded, [0-1]. 0 means fully collapsed, 1 means fully expanded. Quick * Settings can be expanded without the full shade expansion. */ val qsExpansion: StateFlow<Float> /** The amount the shade has expanded */ val shadeExpansion: StateFlow<Float> /** * The amount the lockscreen shade has dragged down by the user, [0-1]. 0 means fully collapsed, * 1 means fully expanded. */ val lockscreenShadeExpansion: StateFlow<Float> /** * NotificationPanelViewController.mExpandedFraction as a StateFlow. This nominally represents * the amount the shade has expanded 0-1 like many other flows in this repo, but there are cases * where its value will be 1 and no shade will be rendered, e.g. whenever the keyguard is * visible and when quick settings is expanded. The confusing nature and impending deletion of * this makes it unsuitable for future development, so usage is discouraged. */ @Deprecated("Use ShadeInteractor.shadeExpansion instead") val legacyShadeExpansion: StateFlow<Float> /** Amount shade has expanded with regard to the UDFPS location */ val udfpsTransitionToFullShadeProgress: StateFlow<Float> /** The amount QS has expanded without notifications */ fun setQsExpansion(qsExpansion: Float) fun setUdfpsTransitionToFullShadeProgress(progress: Float) /** The amount the shade has expanded, [0-1]. 0 means fully collapsed, 1 means fully expanded */ fun setShadeExpansion(expansion: Float) /** * Set the amount the shade has dragged down by the user, [0-1]. 0 means fully collapsed, 1 * means fully expanded. */ fun setLockscreenShadeExpansion(lockscreenShadeExpansion: Float) /** * Set the legacy expansion value. This should only be called whenever the value of * NotificationPanelViewController.mExpandedFraction changes or in tests. */ @Deprecated("Should only be called by NPVC and tests") fun setLegacyShadeExpansion(expandedFraction: Float) } /** Business logic for shade interactions */ Loading Loading @@ -84,18 +111,29 @@ constructor(shadeExpansionStateManager: ShadeExpansionStateManager) : ShadeRepos private val _qsExpansion = MutableStateFlow(0f) override val qsExpansion: StateFlow<Float> = _qsExpansion.asStateFlow() private val _shadeExpansion = MutableStateFlow(0f) override val shadeExpansion: StateFlow<Float> = _shadeExpansion.asStateFlow() private val _lockscreenShadeExpansion = MutableStateFlow(0f) override val lockscreenShadeExpansion: StateFlow<Float> = _lockscreenShadeExpansion.asStateFlow() private var _udfpsTransitionToFullShadeProgress = MutableStateFlow(0f) override val udfpsTransitionToFullShadeProgress: StateFlow<Float> = _udfpsTransitionToFullShadeProgress.asStateFlow() private val _legacyShadeExpansion = MutableStateFlow(0f) @Deprecated("Use ShadeInteractor.shadeExpansion instead") override val legacyShadeExpansion: StateFlow<Float> = _legacyShadeExpansion.asStateFlow() override fun setQsExpansion(qsExpansion: Float) { _qsExpansion.value = qsExpansion } override fun setShadeExpansion(expansion: Float) { _shadeExpansion.value = expansion @Deprecated("Should only be called by NPVC and tests") override fun setLegacyShadeExpansion(expandedFraction: Float) { _legacyShadeExpansion.value = expandedFraction } override fun setLockscreenShadeExpansion(lockscreenShadeExpansion: Float) { _lockscreenShadeExpansion.value = lockscreenShadeExpansion } override fun setUdfpsTransitionToFullShadeProgress(progress: Float) { Loading
packages/SystemUI/src/com/android/systemui/shade/domain/interactor/ShadeInteractor.kt +26 −8 Original line number Diff line number Diff line Loading @@ -22,6 +22,7 @@ import com.android.systemui.keyguard.data.repository.KeyguardRepository import com.android.systemui.keyguard.shared.model.StatusBarState import com.android.systemui.shade.data.repository.ShadeRepository import com.android.systemui.statusbar.disableflags.data.repository.DisableFlagsRepository import com.android.systemui.statusbar.notification.stack.domain.interactor.SharedNotificationContainerInteractor import com.android.systemui.statusbar.pipeline.mobile.data.repository.UserSetupRepository import com.android.systemui.statusbar.policy.DeviceProvisionedController import com.android.systemui.user.domain.interactor.UserInteractor Loading @@ -31,6 +32,7 @@ import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.SharingStarted import kotlinx.coroutines.flow.StateFlow import kotlinx.coroutines.flow.combine import kotlinx.coroutines.flow.distinctUntilChanged import kotlinx.coroutines.flow.map import kotlinx.coroutines.flow.stateIn Loading @@ -45,6 +47,7 @@ constructor( userSetupRepository: UserSetupRepository, deviceProvisionedController: DeviceProvisionedController, userInteractor: UserInteractor, sharedNotificationContainerInteractor: SharedNotificationContainerInteractor, repository: ShadeRepository, ) { /** Emits true if the shade is currently allowed and false otherwise. */ Loading @@ -53,16 +56,31 @@ constructor( .map { it.isShadeEnabled() } .stateIn(scope, SharingStarted.Eagerly, initialValue = false) /** * Whether split shade, the combined notifications and quick settings shade used for large * screens, is enabled. */ val splitShadeEnabled: Flow<Boolean> = sharedNotificationContainerInteractor.configurationBasedDimensions .map { dimens -> dimens.useSplitShade } .distinctUntilChanged() /** The amount [0-1] that the shade has been opened */ val shadeExpansion: Flow<Float> = combine(repository.shadeExpansion, keyguardRepository.statusBarState) { shadeExpansion, statusBarState -> combine( repository.lockscreenShadeExpansion, keyguardRepository.statusBarState, repository.legacyShadeExpansion, repository.qsExpansion, splitShadeEnabled ) { dragDownAmount, statusBarState, legacyShadeExpansion, qsExpansion, splitShadeEnabled -> when (statusBarState) { // legacyShadeExpansion is 1 instead of 0 when QS is expanded StatusBarState.SHADE -> if (!splitShadeEnabled && qsExpansion > 0f) 0f else legacyShadeExpansion StatusBarState.KEYGUARD -> dragDownAmount // This is required, as shadeExpansion gets reset to 0f even with the shade open if (statusBarState == StatusBarState.SHADE_LOCKED) { 1f } else { shadeExpansion StatusBarState.SHADE_LOCKED -> 1f } } Loading
packages/SystemUI/src/com/android/systemui/statusbar/LockscreenShadeTransitionController.kt +7 −7 Original line number Diff line number Diff line Loading @@ -447,7 +447,7 @@ class LockscreenShadeTransitionController @Inject constructor( if (!nsslController.isInLockedDownShade() || field == 0f || forceApplyAmount) { fractionToShade = MathUtils.saturate(dragDownAmount / notificationShelfTransitionDistance) shadeRepository.setShadeExpansion(fractionToShade) shadeRepository.setLockscreenShadeExpansion(fractionToShade) nsslController.setTransitionToFullShadeAmount(fractionToShade) qsTransitionController.dragDownAmount = value Loading Loading @@ -857,8 +857,8 @@ class DragDownHelper( MotionEvent.ACTION_MOVE -> { val h = y - initialTouchY // Adjust the touch slop if another gesture may be being performed. val touchSlop = if (event.classification == MotionEvent.CLASSIFICATION_AMBIGUOUS_GESTURE) { val touchSlop = if (event.classification == MotionEvent.CLASSIFICATION_AMBIGUOUS_GESTURE) { touchSlop * slopMultiplier } else { touchSlop Loading
packages/SystemUI/tests/src/com/android/systemui/shade/NotificationPanelViewControllerBaseTest.java +1 −0 Original line number Diff line number Diff line Loading @@ -626,6 +626,7 @@ public class NotificationPanelViewControllerBaseTest extends SysuiTestCase { mScreenOffAnimationController, mLockscreenGestureLogger, mShadeExpansionStateManager, mShadeRepository, mSysUIUnfoldComponent, mSysUiState, () -> mKeyguardBottomAreaViewController, Loading