diff options
27 files changed, 62 insertions, 32 deletions
diff --git a/packages/SystemUI/compose/features/src/com/android/systemui/bouncer/ui/composable/BouncerScene.kt b/packages/SystemUI/compose/features/src/com/android/systemui/bouncer/ui/composable/BouncerScene.kt index 3a46882c0ab9..aeba67bd121c 100644 --- a/packages/SystemUI/compose/features/src/com/android/systemui/bouncer/ui/composable/BouncerScene.kt +++ b/packages/SystemUI/compose/features/src/com/android/systemui/bouncer/ui/composable/BouncerScene.kt @@ -66,7 +66,7 @@ constructor( override val destinationScenes: Flow<Map<UserAction, UserActionResult>> = actionsViewModel.actions - override suspend fun activate() { + override suspend fun activate(): Nothing { actionsViewModel.activate() } diff --git a/packages/SystemUI/compose/features/src/com/android/systemui/keyguard/ui/composable/LockscreenScene.kt b/packages/SystemUI/compose/features/src/com/android/systemui/keyguard/ui/composable/LockscreenScene.kt index 7fe1b3e619c1..7f059d766307 100644 --- a/packages/SystemUI/compose/features/src/com/android/systemui/keyguard/ui/composable/LockscreenScene.kt +++ b/packages/SystemUI/compose/features/src/com/android/systemui/keyguard/ui/composable/LockscreenScene.kt @@ -49,7 +49,7 @@ constructor( override val destinationScenes: Flow<Map<UserAction, UserActionResult>> = actionsViewModel.actions - override suspend fun activate() { + override suspend fun activate(): Nothing { actionsViewModel.activate() } diff --git a/packages/SystemUI/compose/features/src/com/android/systemui/notifications/ui/composable/NotificationsShadeScene.kt b/packages/SystemUI/compose/features/src/com/android/systemui/notifications/ui/composable/NotificationsShadeScene.kt index 0cb8bd3a7efb..666e324c8d36 100644 --- a/packages/SystemUI/compose/features/src/com/android/systemui/notifications/ui/composable/NotificationsShadeScene.kt +++ b/packages/SystemUI/compose/features/src/com/android/systemui/notifications/ui/composable/NotificationsShadeScene.kt @@ -72,7 +72,7 @@ constructor( override val destinationScenes: Flow<Map<UserAction, UserActionResult>> = actionsViewModel.actions - override suspend fun activate() { + override suspend fun activate(): Nothing { actionsViewModel.activate() } diff --git a/packages/SystemUI/compose/features/src/com/android/systemui/qs/ui/composable/QuickSettingsScene.kt b/packages/SystemUI/compose/features/src/com/android/systemui/qs/ui/composable/QuickSettingsScene.kt index 9db8bf14e5e0..e0647242b7ad 100644 --- a/packages/SystemUI/compose/features/src/com/android/systemui/qs/ui/composable/QuickSettingsScene.kt +++ b/packages/SystemUI/compose/features/src/com/android/systemui/qs/ui/composable/QuickSettingsScene.kt @@ -139,7 +139,7 @@ constructor( override val destinationScenes: Flow<Map<UserAction, UserActionResult>> = actionsViewModel.actions - override suspend fun activate() { + override suspend fun activate(): Nothing { actionsViewModel.activate() } diff --git a/packages/SystemUI/compose/features/src/com/android/systemui/scene/ui/composable/GoneScene.kt b/packages/SystemUI/compose/features/src/com/android/systemui/scene/ui/composable/GoneScene.kt index f15e87b4514d..3e221056c2db 100644 --- a/packages/SystemUI/compose/features/src/com/android/systemui/scene/ui/composable/GoneScene.kt +++ b/packages/SystemUI/compose/features/src/com/android/systemui/scene/ui/composable/GoneScene.kt @@ -58,7 +58,7 @@ constructor( override val destinationScenes: Flow<Map<UserAction, UserActionResult>> = actionsViewModel.actions - override suspend fun activate() { + override suspend fun activate(): Nothing { actionsViewModel.activate() } diff --git a/packages/SystemUI/compose/features/src/com/android/systemui/shade/ui/composable/ShadeScene.kt b/packages/SystemUI/compose/features/src/com/android/systemui/shade/ui/composable/ShadeScene.kt index 7920e74eff01..417c8611f05f 100644 --- a/packages/SystemUI/compose/features/src/com/android/systemui/shade/ui/composable/ShadeScene.kt +++ b/packages/SystemUI/compose/features/src/com/android/systemui/shade/ui/composable/ShadeScene.kt @@ -163,7 +163,7 @@ constructor( actionsViewModelFactory.create() } - override suspend fun activate() { + override suspend fun activate(): Nothing { actionsViewModel.activate() } diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/lifecycle/SysUiViewModelTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/lifecycle/SysUiViewModelTest.kt index 46b370fedf37..976dc52b2602 100644 --- a/packages/SystemUI/multivalentTests/src/com/android/systemui/lifecycle/SysUiViewModelTest.kt +++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/lifecycle/SysUiViewModelTest.kt @@ -154,7 +154,7 @@ class SysUiViewModelTest : SysuiTestCase() { private class FakeViewModel : SysUiViewModel() { var isActivated = false - override suspend fun onActivated() { + override suspend fun onActivated(): Nothing { isActivated = true try { awaitCancellation() diff --git a/packages/SystemUI/src/com/android/systemui/bouncer/ui/viewmodel/AuthMethodBouncerViewModel.kt b/packages/SystemUI/src/com/android/systemui/bouncer/ui/viewmodel/AuthMethodBouncerViewModel.kt index e7dd974c44e5..df50e8fdb90b 100644 --- a/packages/SystemUI/src/com/android/systemui/bouncer/ui/viewmodel/AuthMethodBouncerViewModel.kt +++ b/packages/SystemUI/src/com/android/systemui/bouncer/ui/viewmodel/AuthMethodBouncerViewModel.kt @@ -22,6 +22,7 @@ import com.android.systemui.authentication.domain.interactor.AuthenticationResul import com.android.systemui.authentication.shared.model.AuthenticationMethodModel import com.android.systemui.bouncer.domain.interactor.BouncerInteractor import com.android.systemui.lifecycle.SysUiViewModel +import kotlinx.coroutines.awaitCancellation import kotlinx.coroutines.channels.Channel import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.StateFlow @@ -60,7 +61,7 @@ sealed class AuthMethodBouncerViewModel( private val authenticationRequests = Channel<AuthenticationRequest>(Channel.BUFFERED) - override suspend fun onActivated() { + override suspend fun onActivated(): Nothing { authenticationRequests.receiveAsFlow().collectLatest { request -> if (!isInputEnabled.value) { return@collectLatest @@ -79,6 +80,7 @@ sealed class AuthMethodBouncerViewModel( _animateFailure.value = authenticationResult != AuthenticationResult.SUCCEEDED clearInput() } + awaitCancellation() } /** diff --git a/packages/SystemUI/src/com/android/systemui/bouncer/ui/viewmodel/BouncerMessageViewModel.kt b/packages/SystemUI/src/com/android/systemui/bouncer/ui/viewmodel/BouncerMessageViewModel.kt index c3215b4ada9e..d746220dd7ce 100644 --- a/packages/SystemUI/src/com/android/systemui/bouncer/ui/viewmodel/BouncerMessageViewModel.kt +++ b/packages/SystemUI/src/com/android/systemui/bouncer/ui/viewmodel/BouncerMessageViewModel.kt @@ -50,6 +50,7 @@ import kotlin.math.max import kotlin.time.Duration.Companion.seconds import kotlinx.coroutines.ExperimentalCoroutinesApi import kotlinx.coroutines.Job +import kotlinx.coroutines.awaitCancellation import kotlinx.coroutines.coroutineScope import kotlinx.coroutines.delay import kotlinx.coroutines.flow.Flow @@ -94,9 +95,9 @@ constructor( /** The user-facing message to show in the bouncer. */ val message: MutableStateFlow<MessageViewModel?> = MutableStateFlow(null) - override suspend fun onActivated() { + override suspend fun onActivated(): Nothing { if (!flags.isComposeBouncerOrSceneContainerEnabled()) { - return + return awaitCancellation() } coroutineScope { @@ -110,6 +111,7 @@ constructor( launch { listenForBouncerEvents() } launch { listenForFaceMessages() } launch { listenForFingerprintMessages() } + awaitCancellation() } } diff --git a/packages/SystemUI/src/com/android/systemui/bouncer/ui/viewmodel/BouncerSceneContentViewModel.kt b/packages/SystemUI/src/com/android/systemui/bouncer/ui/viewmodel/BouncerSceneContentViewModel.kt index aede63b0ac23..63b6f0193502 100644 --- a/packages/SystemUI/src/com/android/systemui/bouncer/ui/viewmodel/BouncerSceneContentViewModel.kt +++ b/packages/SystemUI/src/com/android/systemui/bouncer/ui/viewmodel/BouncerSceneContentViewModel.kt @@ -37,6 +37,7 @@ import com.android.systemui.lifecycle.SysUiViewModel import com.android.systemui.user.ui.viewmodel.UserSwitcherViewModel import dagger.assisted.AssistedFactory import dagger.assisted.AssistedInject +import kotlinx.coroutines.awaitCancellation import kotlinx.coroutines.coroutineScope import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.StateFlow @@ -137,7 +138,7 @@ constructor( MutableStateFlow(authenticationInteractor.lockoutEndTimestamp == null) private val isInputEnabled: StateFlow<Boolean> = _isInputEnabled.asStateFlow() - override suspend fun onActivated() { + override suspend fun onActivated(): Nothing { coroutineScope { launch { message.activate() } launch { @@ -214,6 +215,8 @@ constructor( .map { lockoutMessagePresent -> !lockoutMessagePresent } .collectLatest { _isInputEnabled.value = it } } + + awaitCancellation() } } diff --git a/packages/SystemUI/src/com/android/systemui/bouncer/ui/viewmodel/PasswordBouncerViewModel.kt b/packages/SystemUI/src/com/android/systemui/bouncer/ui/viewmodel/PasswordBouncerViewModel.kt index 9ead7a0dcf4d..c91fd6a1a18e 100644 --- a/packages/SystemUI/src/com/android/systemui/bouncer/ui/viewmodel/PasswordBouncerViewModel.kt +++ b/packages/SystemUI/src/com/android/systemui/bouncer/ui/viewmodel/PasswordBouncerViewModel.kt @@ -27,6 +27,7 @@ import dagger.assisted.Assisted import dagger.assisted.AssistedFactory import dagger.assisted.AssistedInject import kotlin.time.Duration.Companion.milliseconds +import kotlinx.coroutines.awaitCancellation import kotlinx.coroutines.channels.Channel import kotlinx.coroutines.coroutineScope import kotlinx.coroutines.delay @@ -81,7 +82,7 @@ constructor( private val requests = Channel<Request>(Channel.BUFFERED) - override suspend fun onActivated() { + override suspend fun onActivated(): Nothing { coroutineScope { launch { super.onActivated() } launch { @@ -125,6 +126,7 @@ constructor( } .collectLatest { _isImeSwitcherButtonVisible.value = it } } + awaitCancellation() } } diff --git a/packages/SystemUI/src/com/android/systemui/bouncer/ui/viewmodel/PatternBouncerViewModel.kt b/packages/SystemUI/src/com/android/systemui/bouncer/ui/viewmodel/PatternBouncerViewModel.kt index b1df04b3f76b..4c029299e16b 100644 --- a/packages/SystemUI/src/com/android/systemui/bouncer/ui/viewmodel/PatternBouncerViewModel.kt +++ b/packages/SystemUI/src/com/android/systemui/bouncer/ui/viewmodel/PatternBouncerViewModel.kt @@ -29,6 +29,7 @@ import kotlin.math.max import kotlin.math.min import kotlin.math.pow import kotlin.math.sqrt +import kotlinx.coroutines.awaitCancellation import kotlinx.coroutines.coroutineScope import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.StateFlow @@ -80,7 +81,7 @@ constructor( override val lockoutMessageId = R.string.kg_too_many_failed_pattern_attempts_dialog_message - override suspend fun onActivated() { + override suspend fun onActivated(): Nothing { coroutineScope { launch { super.onActivated() } launch { @@ -88,6 +89,7 @@ constructor( .map { it.toList() } .collectLatest { selectedDotList.value = it.toList() } } + awaitCancellation() } } diff --git a/packages/SystemUI/src/com/android/systemui/bouncer/ui/viewmodel/PinBouncerViewModel.kt b/packages/SystemUI/src/com/android/systemui/bouncer/ui/viewmodel/PinBouncerViewModel.kt index cb36560545c8..c6119544d2b0 100644 --- a/packages/SystemUI/src/com/android/systemui/bouncer/ui/viewmodel/PinBouncerViewModel.kt +++ b/packages/SystemUI/src/com/android/systemui/bouncer/ui/viewmodel/PinBouncerViewModel.kt @@ -36,6 +36,7 @@ import dagger.assisted.Assisted import dagger.assisted.AssistedFactory import dagger.assisted.AssistedInject import kotlinx.coroutines.ExperimentalCoroutinesApi +import kotlinx.coroutines.awaitCancellation import kotlinx.coroutines.channels.Channel import kotlinx.coroutines.coroutineScope import kotlinx.coroutines.flow.MutableStateFlow @@ -96,7 +97,7 @@ constructor( private val requests = Channel<Request>(Channel.BUFFERED) - override suspend fun onActivated() { + override suspend fun onActivated(): Nothing { coroutineScope { launch { super.onActivated() } launch { @@ -145,6 +146,7 @@ constructor( .map { !it } .collectLatest { _isDigitButtonAnimationEnabled.value = it } } + awaitCancellation() } } diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/ui/viewmodel/LockscreenContentViewModel.kt b/packages/SystemUI/src/com/android/systemui/keyguard/ui/viewmodel/LockscreenContentViewModel.kt index 59cb6e5cef91..666c9f8e243b 100644 --- a/packages/SystemUI/src/com/android/systemui/keyguard/ui/viewmodel/LockscreenContentViewModel.kt +++ b/packages/SystemUI/src/com/android/systemui/keyguard/ui/viewmodel/LockscreenContentViewModel.kt @@ -32,6 +32,7 @@ import com.android.systemui.unfold.domain.interactor.UnfoldTransitionInteractor import dagger.assisted.AssistedFactory import dagger.assisted.AssistedInject import kotlinx.coroutines.CoroutineScope +import kotlinx.coroutines.awaitCancellation import kotlinx.coroutines.coroutineScope import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.MutableStateFlow @@ -72,7 +73,7 @@ constructor( /** Whether the content of the scene UI should be shown. */ val isContentVisible: StateFlow<Boolean> = _isContentVisible.asStateFlow() - override suspend fun onActivated() { + override suspend fun onActivated(): Nothing { coroutineScope { launch { combine( @@ -92,6 +93,8 @@ constructor( .map { !it } .collectLatest { _isContentVisible.value = it } } + + awaitCancellation() } } diff --git a/packages/SystemUI/src/com/android/systemui/lifecycle/Activatable.kt b/packages/SystemUI/src/com/android/systemui/lifecycle/Activatable.kt index ebb0ea62a10c..bd3d40b114e3 100644 --- a/packages/SystemUI/src/com/android/systemui/lifecycle/Activatable.kt +++ b/packages/SystemUI/src/com/android/systemui/lifecycle/Activatable.kt @@ -57,7 +57,7 @@ interface Activatable { * } * ``` */ - suspend fun activate() + suspend fun activate(): Nothing } /** diff --git a/packages/SystemUI/src/com/android/systemui/lifecycle/SafeActivatable.kt b/packages/SystemUI/src/com/android/systemui/lifecycle/SafeActivatable.kt index f080a421d295..4dd76f8c78cb 100644 --- a/packages/SystemUI/src/com/android/systemui/lifecycle/SafeActivatable.kt +++ b/packages/SystemUI/src/com/android/systemui/lifecycle/SafeActivatable.kt @@ -34,7 +34,7 @@ abstract class SafeActivatable : Activatable { _isActive.set(value) } - final override suspend fun activate() { + final override suspend fun activate(): Nothing { val allowed = _isActive.compareAndSet(false, true) check(allowed) { "Cannot activate an already active activatable!" } @@ -57,7 +57,7 @@ abstract class SafeActivatable : Activatable { * * Implementations could follow this pattern: * ```kotlin - * override suspend fun onActivated() { + * override suspend fun onActivated(): Nothing { * coroutineScope { * launch { ... } * launch { ... } @@ -68,5 +68,5 @@ abstract class SafeActivatable : Activatable { * * @see activate */ - protected abstract suspend fun onActivated() + protected abstract suspend fun onActivated(): Nothing } diff --git a/packages/SystemUI/src/com/android/systemui/lifecycle/SysUiViewModel.kt b/packages/SystemUI/src/com/android/systemui/lifecycle/SysUiViewModel.kt index 77314813c34a..2edde4ad046f 100644 --- a/packages/SystemUI/src/com/android/systemui/lifecycle/SysUiViewModel.kt +++ b/packages/SystemUI/src/com/android/systemui/lifecycle/SysUiViewModel.kt @@ -19,12 +19,15 @@ package com.android.systemui.lifecycle import android.view.View import androidx.compose.runtime.Composable import kotlinx.coroutines.CoroutineScope +import kotlinx.coroutines.awaitCancellation import kotlinx.coroutines.launch /** Base class for all System UI view-models. */ abstract class SysUiViewModel : SafeActivatable() { - override suspend fun onActivated() = Unit + override suspend fun onActivated(): Nothing { + awaitCancellation() + } } /** diff --git a/packages/SystemUI/src/com/android/systemui/scene/shared/model/Scene.kt b/packages/SystemUI/src/com/android/systemui/scene/shared/model/Scene.kt index 103b4a5ff7ef..61a06dbff18f 100644 --- a/packages/SystemUI/src/com/android/systemui/scene/shared/model/Scene.kt +++ b/packages/SystemUI/src/com/android/systemui/scene/shared/model/Scene.kt @@ -20,6 +20,7 @@ import com.android.compose.animation.scene.SceneKey import com.android.compose.animation.scene.UserAction import com.android.compose.animation.scene.UserActionResult import com.android.systemui.lifecycle.Activatable +import kotlinx.coroutines.awaitCancellation import kotlinx.coroutines.flow.Flow /** @@ -35,7 +36,9 @@ interface Scene : Activatable { /** Uniquely-identifying key for this scene. The key must be unique within its container. */ val key: SceneKey - override suspend fun activate() = Unit + override suspend fun activate(): Nothing { + awaitCancellation() + } /** * The mapping between [UserAction] and destination [UserActionResult]s. diff --git a/packages/SystemUI/src/com/android/systemui/scene/ui/viewmodel/SceneActionsViewModel.kt b/packages/SystemUI/src/com/android/systemui/scene/ui/viewmodel/SceneActionsViewModel.kt index c2fd65b6d6cb..b5de1b6209bb 100644 --- a/packages/SystemUI/src/com/android/systemui/scene/ui/viewmodel/SceneActionsViewModel.kt +++ b/packages/SystemUI/src/com/android/systemui/scene/ui/viewmodel/SceneActionsViewModel.kt @@ -41,7 +41,7 @@ abstract class SceneActionsViewModel : SysUiViewModel() { */ val actions: StateFlow<Map<UserAction, UserActionResult>> = _actions.asStateFlow() - final override suspend fun onActivated() { + final override suspend fun onActivated(): Nothing { try { hydrateActions { state -> _actions.value = state } awaitCancellation() diff --git a/packages/SystemUI/src/com/android/systemui/scene/ui/viewmodel/SceneContainerViewModel.kt b/packages/SystemUI/src/com/android/systemui/scene/ui/viewmodel/SceneContainerViewModel.kt index 2d02f5a5b79d..0b4fb32eaf5b 100644 --- a/packages/SystemUI/src/com/android/systemui/scene/ui/viewmodel/SceneContainerViewModel.kt +++ b/packages/SystemUI/src/com/android/systemui/scene/ui/viewmodel/SceneContainerViewModel.kt @@ -57,7 +57,7 @@ constructor( /** Whether the container is visible. */ val isVisible: StateFlow<Boolean> = sceneInteractor.isVisible - override suspend fun onActivated() { + override suspend fun onActivated(): Nothing { try { // Sends a MotionEventHandler to the owner of the view-model so they can report // MotionEvents into the view-model. diff --git a/packages/SystemUI/src/com/android/systemui/shade/ui/viewmodel/OverlayShadeViewModel.kt b/packages/SystemUI/src/com/android/systemui/shade/ui/viewmodel/OverlayShadeViewModel.kt index 566bc166ed40..00c023540da3 100644 --- a/packages/SystemUI/src/com/android/systemui/shade/ui/viewmodel/OverlayShadeViewModel.kt +++ b/packages/SystemUI/src/com/android/systemui/shade/ui/viewmodel/OverlayShadeViewModel.kt @@ -24,6 +24,7 @@ import com.android.systemui.scene.shared.model.Scenes import com.android.systemui.shade.domain.interactor.ShadeInteractor import dagger.assisted.AssistedFactory import dagger.assisted.AssistedInject +import kotlinx.coroutines.awaitCancellation import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.StateFlow import kotlinx.coroutines.flow.asStateFlow @@ -44,10 +45,11 @@ constructor(private val sceneInteractor: SceneInteractor, shadeInteractor: Shade /** Dictates the alignment of the overlay shade panel on the screen. */ val panelAlignment = shadeInteractor.shadeAlignment - override suspend fun onActivated() { + override suspend fun onActivated(): Nothing { sceneInteractor.resolveSceneFamily(SceneFamilies.Home).collectLatest { sceneKey -> _backgroundScene.value = sceneKey } + awaitCancellation() } /** Notifies that the user has clicked the semi-transparent background scrim. */ diff --git a/packages/SystemUI/src/com/android/systemui/shade/ui/viewmodel/ShadeHeaderViewModel.kt b/packages/SystemUI/src/com/android/systemui/shade/ui/viewmodel/ShadeHeaderViewModel.kt index 03fdfa9aaa6c..f0e9d41c0fe7 100644 --- a/packages/SystemUI/src/com/android/systemui/shade/ui/viewmodel/ShadeHeaderViewModel.kt +++ b/packages/SystemUI/src/com/android/systemui/shade/ui/viewmodel/ShadeHeaderViewModel.kt @@ -41,6 +41,7 @@ import dagger.assisted.AssistedFactory import dagger.assisted.AssistedInject import java.util.Date import java.util.Locale +import kotlinx.coroutines.awaitCancellation import kotlinx.coroutines.coroutineScope import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.StateFlow @@ -104,7 +105,7 @@ constructor( private val _longerDateText: MutableStateFlow<String> = MutableStateFlow("") val longerDateText: StateFlow<String> = _longerDateText.asStateFlow() - override suspend fun onActivated() { + override suspend fun onActivated(): Nothing { coroutineScope { launch { broadcastDispatcher @@ -137,6 +138,8 @@ constructor( launch { shadeInteractor.isQsEnabled.map { !it }.collectLatest { _isDisabled.value = it } } + + awaitCancellation() } } diff --git a/packages/SystemUI/src/com/android/systemui/shade/ui/viewmodel/ShadeSceneContentViewModel.kt b/packages/SystemUI/src/com/android/systemui/shade/ui/viewmodel/ShadeSceneContentViewModel.kt index a4d34163ba68..fe3bcb5c326c 100644 --- a/packages/SystemUI/src/com/android/systemui/shade/ui/viewmodel/ShadeSceneContentViewModel.kt +++ b/packages/SystemUI/src/com/android/systemui/shade/ui/viewmodel/ShadeSceneContentViewModel.kt @@ -35,6 +35,7 @@ import dagger.assisted.AssistedFactory import dagger.assisted.AssistedInject import java.util.concurrent.atomic.AtomicBoolean import kotlinx.coroutines.ExperimentalCoroutinesApi +import kotlinx.coroutines.awaitCancellation import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.StateFlow @@ -73,10 +74,12 @@ constructor( private val footerActionsControllerInitialized = AtomicBoolean(false) - override suspend fun onActivated() { + override suspend fun onActivated(): Nothing { deviceEntryInteractor.isDeviceEntered.collectLatest { isDeviceEntered -> _isEmptySpaceClickable.value = !isDeviceEntered } + + awaitCancellation() } /** diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/ui/viewmodel/NotificationScrollViewModel.kt b/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/ui/viewmodel/NotificationScrollViewModel.kt index bfb624a9287b..a20517981f77 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/ui/viewmodel/NotificationScrollViewModel.kt +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/ui/viewmodel/NotificationScrollViewModel.kt @@ -59,7 +59,7 @@ constructor( ActivatableFlowDumper by ActivatableFlowDumperImpl(dumpManager, "NotificationScrollViewModel"), SysUiViewModel() { - override suspend fun onActivated() { + override suspend fun onActivated(): Nothing { activateFlowDumper() } diff --git a/packages/SystemUI/src/com/android/systemui/util/kotlin/FlowDumper.kt b/packages/SystemUI/src/com/android/systemui/util/kotlin/FlowDumper.kt index ade6c3df2e0f..ef9f8ff9de0d 100644 --- a/packages/SystemUI/src/com/android/systemui/util/kotlin/FlowDumper.kt +++ b/packages/SystemUI/src/com/android/systemui/util/kotlin/FlowDumper.kt @@ -170,7 +170,7 @@ abstract class FlowDumperImpl( * [Activatable.activate()][com.android.systemui.lifecycle.Activatable.activate]. */ interface ActivatableFlowDumper : FlowDumper { - suspend fun activateFlowDumper() + suspend fun activateFlowDumper(): Nothing } /** @@ -190,7 +190,7 @@ class ActivatableFlowDumperImpl( private val registration = object : SafeActivatable() { - override suspend fun onActivated() { + override suspend fun onActivated(): Nothing { try { dumpManager.registerCriticalDumpable( dumpManagerName, @@ -205,7 +205,7 @@ class ActivatableFlowDumperImpl( private val dumpManagerName = "[$idString] $tag" - override suspend fun activateFlowDumper() { + override suspend fun activateFlowDumper(): Nothing { registration.activate() } } diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/lifecycle/FakeActivatable.kt b/packages/SystemUI/tests/utils/src/com/android/systemui/lifecycle/FakeActivatable.kt index e8b2dd232c1c..bcc73935de61 100644 --- a/packages/SystemUI/tests/utils/src/com/android/systemui/lifecycle/FakeActivatable.kt +++ b/packages/SystemUI/tests/utils/src/com/android/systemui/lifecycle/FakeActivatable.kt @@ -25,7 +25,7 @@ class FakeActivatable( var activationCount = 0 var cancellationCount = 0 - override suspend fun onActivated() { + override suspend fun onActivated(): Nothing { activationCount++ onActivation() try { diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/lifecycle/FakeSysUiViewModel.kt b/packages/SystemUI/tests/utils/src/com/android/systemui/lifecycle/FakeSysUiViewModel.kt index 9a56f2419669..c0bb9a6fbe14 100644 --- a/packages/SystemUI/tests/utils/src/com/android/systemui/lifecycle/FakeSysUiViewModel.kt +++ b/packages/SystemUI/tests/utils/src/com/android/systemui/lifecycle/FakeSysUiViewModel.kt @@ -25,7 +25,7 @@ class FakeSysUiViewModel( var activationCount = 0 var cancellationCount = 0 - override suspend fun onActivated() { + override suspend fun onActivated(): Nothing { activationCount++ onActivation() try { |