Loading packages/SystemUI/src/com/android/systemui/classifier/FalsingCollectorFake.java +7 −0 Original line number Diff line number Diff line Loading @@ -18,8 +18,15 @@ package com.android.systemui.classifier; import android.view.MotionEvent; import javax.inject.Inject; /** */ public class FalsingCollectorFake implements FalsingCollector { @Inject public FalsingCollectorFake() { } @Override public void onSuccessfulUnlock() { } Loading packages/SystemUI/src/com/android/systemui/shade/domain/interactor/ShadeInteractor.kt +33 −4 Original line number Diff line number Diff line Loading @@ -19,7 +19,11 @@ package com.android.systemui.shade.domain.interactor 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.keyguard.domain.interactor.KeyguardTransitionInteractor import com.android.systemui.keyguard.shared.model.DozeStateModel import com.android.systemui.keyguard.shared.model.KeyguardState import com.android.systemui.keyguard.shared.model.StatusBarState import com.android.systemui.power.domain.interactor.PowerInteractor import com.android.systemui.scene.domain.interactor.SceneInteractor import com.android.systemui.scene.shared.flag.SceneContainerFlags import com.android.systemui.scene.shared.model.ObservableTransitionState Loading @@ -27,8 +31,9 @@ import com.android.systemui.scene.shared.model.SceneKey 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.phone.DozeParameters import com.android.systemui.statusbar.pipeline.mobile.data.repository.UserSetupRepository import com.android.systemui.statusbar.policy.DeviceProvisionedController import com.android.systemui.statusbar.policy.data.repository.DeviceProvisioningRepository import com.android.systemui.user.domain.interactor.UserInteractor import com.android.systemui.util.kotlin.pairwise import javax.inject.Inject Loading Loading @@ -56,13 +61,16 @@ class ShadeInteractor @Inject constructor( @Application scope: CoroutineScope, deviceProvisioningRepository: DeviceProvisioningRepository, disableFlagsRepository: DisableFlagsRepository, dozeParams: DozeParameters, sceneContainerFlags: SceneContainerFlags, // TODO(b/300258424) convert to direct reference instead of provider sceneInteractorProvider: Provider<SceneInteractor>, keyguardRepository: KeyguardRepository, keyguardTransitionInteractor: KeyguardTransitionInteractor, powerInteractor: PowerInteractor, userSetupRepository: UserSetupRepository, deviceProvisionedController: DeviceProvisionedController, userInteractor: UserInteractor, sharedNotificationContainerInteractor: SharedNotificationContainerInteractor, repository: ShadeRepository, Loading Loading @@ -187,6 +195,26 @@ constructor( combine(isUserInteractingWithShade, isUserInteractingWithShade) { shade, qs -> shade || qs } .distinctUntilChanged() /** Are touches allowed on the notification panel? */ val isShadeTouchable: Flow<Boolean> = combine( powerInteractor.isAsleep, keyguardTransitionInteractor.isInTransitionToStateWhere { it == KeyguardState.AOD }, keyguardRepository.dozeTransitionModel.map { it.to == DozeStateModel.DOZE_PULSING }, deviceProvisioningRepository.isFactoryResetProtectionActive, ) { isAsleep, goingToSleep, isPulsing, isFrpActive -> when { // Touches are disabled when Factory Reset Protection is active isFrpActive -> false // If the device is going to sleep, only accept touches if we're still // animating goingToSleep -> dozeParams.shouldControlScreenOff() // If the device is asleep, only accept touches if there's a pulse isAsleep -> isPulsing else -> true } } /** Emits true if the shade can be expanded from QQS to QS and false otherwise. */ val isExpandToQsEnabled: Flow<Boolean> = combine( Loading @@ -194,8 +222,9 @@ constructor( isShadeEnabled, keyguardRepository.isDozing, userSetupRepository.isUserSetupFlow, ) { disableFlags, isShadeEnabled, isDozing, isUserSetup -> deviceProvisionedController.isDeviceProvisioned && deviceProvisioningRepository.isDeviceProvisioned, ) { disableFlags, isShadeEnabled, isDozing, isUserSetup, isDeviceProvisioned -> isDeviceProvisioned && // Disallow QS during setup if it's a simple user switcher. (The user intends to // use the lock screen user switcher, QS is not needed.) (isUserSetup || !userInteractor.isSimpleUserSwitcher) && Loading packages/SystemUI/src/com/android/systemui/statusbar/notification/icon/ui/viewbinder/NotificationIconAreaControllerViewBinderWrapperImpl.kt +20 −19 Original line number Diff line number Diff line Loading @@ -118,7 +118,6 @@ constructor( private var aodIcons: NotificationIconContainer? = null private var aodBindJob: DisposableHandle? = null private var aodIconAppearTranslation = 0 private var animationsEnabled = false private var aodIconTint = 0 private var aodIconsVisible = false private var showLowPriority = true Loading Loading @@ -157,9 +156,12 @@ constructor( } this.aodIcons = aodIcons this.aodIcons!!.setOnLockScreen(true) aodBindJob = NotificationIconContainerViewBinder.bind(aodIcons, aodIconsViewModel) aodBindJob = NotificationIconContainerViewBinder.bind( aodIcons, aodIconsViewModel, ) updateAodIconsVisibility(animate = false, forceUpdate = changed) updateAnimations() if (changed) { updateAodNotificationIcons() } Loading @@ -171,7 +173,10 @@ constructor( override fun setShelfIcons(icons: NotificationIconContainer) { if (shelfRefactor.expectEnabled()) { NotificationIconContainerViewBinder.bind(icons, shelfIconsViewModel) NotificationIconContainerViewBinder.bind( icons, shelfIconsViewModel, ) shelfIcons = icons } } Loading Loading @@ -252,14 +257,10 @@ constructor( aodIcons!!.setDozing(isDozing, animate, 0) } override fun setAnimationsEnabled(enabled: Boolean) { animationsEnabled = enabled updateAnimations() } override fun setAnimationsEnabled(enabled: Boolean) = unsupported override fun onStateChanged(newState: Int) { updateAodIconsVisibility(animate = false, forceUpdate = false) updateAnimations() } override fun onThemeChanged() { Loading Loading @@ -348,7 +349,10 @@ constructor( val layoutInflater = LayoutInflater.from(context) notificationIconArea = inflateIconArea(layoutInflater) notificationIcons = notificationIconArea?.findViewById(R.id.notificationIcons) NotificationIconContainerViewBinder.bind(notificationIcons!!, statusBarIconsViewModel) NotificationIconContainerViewBinder.bind( notificationIcons!!, statusBarIconsViewModel, ) } private fun updateIconLayoutParams(context: Context) { Loading Loading @@ -598,14 +602,6 @@ constructor( v.setDecorColor(tint) } private fun updateAnimations() { val inShade = statusBarStateController.state == StatusBarState.SHADE if (aodIcons != null) { aodIcons!!.setAnimationsEnabled(animationsEnabled && !inShade) } notificationIcons!!.setAnimationsEnabled(animationsEnabled && inShade) } private fun animateInAodIconTranslation() { if (!statusViewMigrated) { aodIcons!! Loading Loading @@ -702,7 +698,12 @@ constructor( companion object { private const val AOD_ICONS_APPEAR_DURATION: Long = 200 @ColorInt private val DEFAULT_AOD_ICON_COLOR = -0x1 val unsupported: Nothing get() = error( "Code path not supported when NOTIFICATION_ICON_CONTAINER_REFACTOR is disabled" ) } } packages/SystemUI/src/com/android/systemui/statusbar/notification/icon/ui/viewbinder/NotificationIconContainerViewBinder.kt +6 −1 Original line number Diff line number Diff line Loading @@ -21,6 +21,7 @@ import com.android.systemui.lifecycle.repeatWhenAttached import com.android.systemui.statusbar.notification.icon.ui.viewmodel.NotificationIconContainerViewModel import com.android.systemui.statusbar.phone.NotificationIconContainer import kotlinx.coroutines.DisposableHandle import kotlinx.coroutines.launch /** Binds a [NotificationIconContainer] to its [view model][NotificationIconContainerViewModel]. */ object NotificationIconContainerViewBinder { Loading @@ -28,6 +29,10 @@ object NotificationIconContainerViewBinder { view: NotificationIconContainer, viewModel: NotificationIconContainerViewModel, ): DisposableHandle { return view.repeatWhenAttached { repeatOnLifecycle(Lifecycle.State.CREATED) {} } return view.repeatWhenAttached { repeatOnLifecycle(Lifecycle.State.CREATED) { launch { viewModel.animationsEnabled.collect(view::setAnimationsEnabled) } } } } } packages/SystemUI/src/com/android/systemui/statusbar/notification/icon/ui/viewmodel/NotificationIconContainerAlwaysOnDisplayViewModel.kt +18 −2 Original line number Diff line number Diff line Loading @@ -15,8 +15,24 @@ */ package com.android.systemui.statusbar.notification.icon.ui.viewmodel import com.android.systemui.keyguard.domain.interactor.KeyguardInteractor import com.android.systemui.shade.domain.interactor.ShadeInteractor import javax.inject.Inject import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.combine /** View-model for the row of notification icons displayed on the always-on display. */ class NotificationIconContainerAlwaysOnDisplayViewModel @Inject constructor() : NotificationIconContainerViewModel class NotificationIconContainerAlwaysOnDisplayViewModel @Inject constructor( keyguardInteractor: KeyguardInteractor, shadeInteractor: ShadeInteractor, ) : NotificationIconContainerViewModel { override val animationsEnabled: Flow<Boolean> = combine( shadeInteractor.isShadeTouchable, keyguardInteractor.isKeyguardVisible, ) { panelTouchesEnabled, isKeyguardVisible -> panelTouchesEnabled && isKeyguardVisible } } Loading
packages/SystemUI/src/com/android/systemui/classifier/FalsingCollectorFake.java +7 −0 Original line number Diff line number Diff line Loading @@ -18,8 +18,15 @@ package com.android.systemui.classifier; import android.view.MotionEvent; import javax.inject.Inject; /** */ public class FalsingCollectorFake implements FalsingCollector { @Inject public FalsingCollectorFake() { } @Override public void onSuccessfulUnlock() { } Loading
packages/SystemUI/src/com/android/systemui/shade/domain/interactor/ShadeInteractor.kt +33 −4 Original line number Diff line number Diff line Loading @@ -19,7 +19,11 @@ package com.android.systemui.shade.domain.interactor 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.keyguard.domain.interactor.KeyguardTransitionInteractor import com.android.systemui.keyguard.shared.model.DozeStateModel import com.android.systemui.keyguard.shared.model.KeyguardState import com.android.systemui.keyguard.shared.model.StatusBarState import com.android.systemui.power.domain.interactor.PowerInteractor import com.android.systemui.scene.domain.interactor.SceneInteractor import com.android.systemui.scene.shared.flag.SceneContainerFlags import com.android.systemui.scene.shared.model.ObservableTransitionState Loading @@ -27,8 +31,9 @@ import com.android.systemui.scene.shared.model.SceneKey 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.phone.DozeParameters import com.android.systemui.statusbar.pipeline.mobile.data.repository.UserSetupRepository import com.android.systemui.statusbar.policy.DeviceProvisionedController import com.android.systemui.statusbar.policy.data.repository.DeviceProvisioningRepository import com.android.systemui.user.domain.interactor.UserInteractor import com.android.systemui.util.kotlin.pairwise import javax.inject.Inject Loading Loading @@ -56,13 +61,16 @@ class ShadeInteractor @Inject constructor( @Application scope: CoroutineScope, deviceProvisioningRepository: DeviceProvisioningRepository, disableFlagsRepository: DisableFlagsRepository, dozeParams: DozeParameters, sceneContainerFlags: SceneContainerFlags, // TODO(b/300258424) convert to direct reference instead of provider sceneInteractorProvider: Provider<SceneInteractor>, keyguardRepository: KeyguardRepository, keyguardTransitionInteractor: KeyguardTransitionInteractor, powerInteractor: PowerInteractor, userSetupRepository: UserSetupRepository, deviceProvisionedController: DeviceProvisionedController, userInteractor: UserInteractor, sharedNotificationContainerInteractor: SharedNotificationContainerInteractor, repository: ShadeRepository, Loading Loading @@ -187,6 +195,26 @@ constructor( combine(isUserInteractingWithShade, isUserInteractingWithShade) { shade, qs -> shade || qs } .distinctUntilChanged() /** Are touches allowed on the notification panel? */ val isShadeTouchable: Flow<Boolean> = combine( powerInteractor.isAsleep, keyguardTransitionInteractor.isInTransitionToStateWhere { it == KeyguardState.AOD }, keyguardRepository.dozeTransitionModel.map { it.to == DozeStateModel.DOZE_PULSING }, deviceProvisioningRepository.isFactoryResetProtectionActive, ) { isAsleep, goingToSleep, isPulsing, isFrpActive -> when { // Touches are disabled when Factory Reset Protection is active isFrpActive -> false // If the device is going to sleep, only accept touches if we're still // animating goingToSleep -> dozeParams.shouldControlScreenOff() // If the device is asleep, only accept touches if there's a pulse isAsleep -> isPulsing else -> true } } /** Emits true if the shade can be expanded from QQS to QS and false otherwise. */ val isExpandToQsEnabled: Flow<Boolean> = combine( Loading @@ -194,8 +222,9 @@ constructor( isShadeEnabled, keyguardRepository.isDozing, userSetupRepository.isUserSetupFlow, ) { disableFlags, isShadeEnabled, isDozing, isUserSetup -> deviceProvisionedController.isDeviceProvisioned && deviceProvisioningRepository.isDeviceProvisioned, ) { disableFlags, isShadeEnabled, isDozing, isUserSetup, isDeviceProvisioned -> isDeviceProvisioned && // Disallow QS during setup if it's a simple user switcher. (The user intends to // use the lock screen user switcher, QS is not needed.) (isUserSetup || !userInteractor.isSimpleUserSwitcher) && Loading
packages/SystemUI/src/com/android/systemui/statusbar/notification/icon/ui/viewbinder/NotificationIconAreaControllerViewBinderWrapperImpl.kt +20 −19 Original line number Diff line number Diff line Loading @@ -118,7 +118,6 @@ constructor( private var aodIcons: NotificationIconContainer? = null private var aodBindJob: DisposableHandle? = null private var aodIconAppearTranslation = 0 private var animationsEnabled = false private var aodIconTint = 0 private var aodIconsVisible = false private var showLowPriority = true Loading Loading @@ -157,9 +156,12 @@ constructor( } this.aodIcons = aodIcons this.aodIcons!!.setOnLockScreen(true) aodBindJob = NotificationIconContainerViewBinder.bind(aodIcons, aodIconsViewModel) aodBindJob = NotificationIconContainerViewBinder.bind( aodIcons, aodIconsViewModel, ) updateAodIconsVisibility(animate = false, forceUpdate = changed) updateAnimations() if (changed) { updateAodNotificationIcons() } Loading @@ -171,7 +173,10 @@ constructor( override fun setShelfIcons(icons: NotificationIconContainer) { if (shelfRefactor.expectEnabled()) { NotificationIconContainerViewBinder.bind(icons, shelfIconsViewModel) NotificationIconContainerViewBinder.bind( icons, shelfIconsViewModel, ) shelfIcons = icons } } Loading Loading @@ -252,14 +257,10 @@ constructor( aodIcons!!.setDozing(isDozing, animate, 0) } override fun setAnimationsEnabled(enabled: Boolean) { animationsEnabled = enabled updateAnimations() } override fun setAnimationsEnabled(enabled: Boolean) = unsupported override fun onStateChanged(newState: Int) { updateAodIconsVisibility(animate = false, forceUpdate = false) updateAnimations() } override fun onThemeChanged() { Loading Loading @@ -348,7 +349,10 @@ constructor( val layoutInflater = LayoutInflater.from(context) notificationIconArea = inflateIconArea(layoutInflater) notificationIcons = notificationIconArea?.findViewById(R.id.notificationIcons) NotificationIconContainerViewBinder.bind(notificationIcons!!, statusBarIconsViewModel) NotificationIconContainerViewBinder.bind( notificationIcons!!, statusBarIconsViewModel, ) } private fun updateIconLayoutParams(context: Context) { Loading Loading @@ -598,14 +602,6 @@ constructor( v.setDecorColor(tint) } private fun updateAnimations() { val inShade = statusBarStateController.state == StatusBarState.SHADE if (aodIcons != null) { aodIcons!!.setAnimationsEnabled(animationsEnabled && !inShade) } notificationIcons!!.setAnimationsEnabled(animationsEnabled && inShade) } private fun animateInAodIconTranslation() { if (!statusViewMigrated) { aodIcons!! Loading Loading @@ -702,7 +698,12 @@ constructor( companion object { private const val AOD_ICONS_APPEAR_DURATION: Long = 200 @ColorInt private val DEFAULT_AOD_ICON_COLOR = -0x1 val unsupported: Nothing get() = error( "Code path not supported when NOTIFICATION_ICON_CONTAINER_REFACTOR is disabled" ) } }
packages/SystemUI/src/com/android/systemui/statusbar/notification/icon/ui/viewbinder/NotificationIconContainerViewBinder.kt +6 −1 Original line number Diff line number Diff line Loading @@ -21,6 +21,7 @@ import com.android.systemui.lifecycle.repeatWhenAttached import com.android.systemui.statusbar.notification.icon.ui.viewmodel.NotificationIconContainerViewModel import com.android.systemui.statusbar.phone.NotificationIconContainer import kotlinx.coroutines.DisposableHandle import kotlinx.coroutines.launch /** Binds a [NotificationIconContainer] to its [view model][NotificationIconContainerViewModel]. */ object NotificationIconContainerViewBinder { Loading @@ -28,6 +29,10 @@ object NotificationIconContainerViewBinder { view: NotificationIconContainer, viewModel: NotificationIconContainerViewModel, ): DisposableHandle { return view.repeatWhenAttached { repeatOnLifecycle(Lifecycle.State.CREATED) {} } return view.repeatWhenAttached { repeatOnLifecycle(Lifecycle.State.CREATED) { launch { viewModel.animationsEnabled.collect(view::setAnimationsEnabled) } } } } }
packages/SystemUI/src/com/android/systemui/statusbar/notification/icon/ui/viewmodel/NotificationIconContainerAlwaysOnDisplayViewModel.kt +18 −2 Original line number Diff line number Diff line Loading @@ -15,8 +15,24 @@ */ package com.android.systemui.statusbar.notification.icon.ui.viewmodel import com.android.systemui.keyguard.domain.interactor.KeyguardInteractor import com.android.systemui.shade.domain.interactor.ShadeInteractor import javax.inject.Inject import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.combine /** View-model for the row of notification icons displayed on the always-on display. */ class NotificationIconContainerAlwaysOnDisplayViewModel @Inject constructor() : NotificationIconContainerViewModel class NotificationIconContainerAlwaysOnDisplayViewModel @Inject constructor( keyguardInteractor: KeyguardInteractor, shadeInteractor: ShadeInteractor, ) : NotificationIconContainerViewModel { override val animationsEnabled: Flow<Boolean> = combine( shadeInteractor.isShadeTouchable, keyguardInteractor.isKeyguardVisible, ) { panelTouchesEnabled, isKeyguardVisible -> panelTouchesEnabled && isKeyguardVisible } }