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

Commit d2b850dd authored by Steve Elliott's avatar Steve Elliott Committed by Android (Google) Code Review
Browse files

Merge "Introduce NICViewModel#animationsEnabled" into main

parents e58722b0 9f25cb02
Loading
Loading
Loading
Loading
+7 −0
Original line number Diff line number Diff line
@@ -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() {
    }
+33 −4
Original line number Diff line number Diff line
@@ -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
@@ -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
@@ -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,
@@ -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(
@@ -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) &&
+20 −19
Original line number Diff line number Diff line
@@ -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
@@ -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()
        }
@@ -171,7 +173,10 @@ constructor(

    override fun setShelfIcons(icons: NotificationIconContainer) {
        if (shelfRefactor.expectEnabled()) {
            NotificationIconContainerViewBinder.bind(icons, shelfIconsViewModel)
            NotificationIconContainerViewBinder.bind(
                icons,
                shelfIconsViewModel,
            )
            shelfIcons = icons
        }
    }
@@ -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() {
@@ -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) {
@@ -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!!
@@ -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"
                )
    }
}
+6 −1
Original line number Diff line number Diff line
@@ -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 {
@@ -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) }
            }
        }
    }
}
+18 −2
Original line number Diff line number Diff line
@@ -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