Loading packages/SettingsLib/src/com/android/settingslib/notification/data/repository/FakeZenModeRepository.kt +15 −0 Original line number Diff line number Diff line Loading @@ -20,6 +20,7 @@ import android.app.NotificationManager import android.provider.Settings import com.android.settingslib.notification.modes.TestModeBuilder import com.android.settingslib.notification.modes.ZenMode import java.time.Duration import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.StateFlow Loading Loading @@ -63,6 +64,20 @@ class FakeZenModeRepository : ZenModeRepository { mutableModesFlow.value = mutableModesFlow.value.filter { it.id != id } } override fun activateMode(zenMode: ZenMode, duration: Duration?) { activateMode(zenMode.id) } override fun deactivateMode(zenMode: ZenMode) { deactivateMode(zenMode.id) } fun activateMode(id: String) { val oldMode = mutableModesFlow.value.find { it.id == id } ?: return removeMode(id) mutableModesFlow.value += TestModeBuilder(oldMode).setActive(true).build() } fun deactivateMode(id: String) { val oldMode = mutableModesFlow.value.find { it.id == id } ?: return removeMode(id) Loading packages/SettingsLib/src/com/android/settingslib/notification/data/repository/ZenModeRepository.kt +13 −0 Original line number Diff line number Diff line Loading @@ -29,6 +29,7 @@ import android.provider.Settings import com.android.settingslib.flags.Flags import com.android.settingslib.notification.modes.ZenMode import com.android.settingslib.notification.modes.ZenModesBackend import java.time.Duration import kotlin.coroutines.CoroutineContext import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.channels.awaitClose Loading Loading @@ -56,6 +57,10 @@ interface ZenModeRepository { /** A list of all existing priority modes. */ val modes: Flow<List<ZenMode>> fun activateMode(zenMode: ZenMode, duration: Duration? = null) fun deactivateMode(zenMode: ZenMode) } class ZenModeRepositoryImpl( Loading Loading @@ -177,4 +182,12 @@ class ZenModeRepositoryImpl( flowOf(emptyList()) } } override fun activateMode(zenMode: ZenMode, duration: Duration?) { backend.activateMode(zenMode, duration) } override fun deactivateMode(zenMode: ZenMode) { backend.deactivateMode(zenMode) } } packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/policy/ui/dialog/viewmodel/ModesDialogViewModelTest.kt +33 −0 Original line number Diff line number Diff line Loading @@ -128,4 +128,37 @@ class ModesDialogViewModelTest : SysuiTestCase() { assertThat(this.enabled).isEqualTo(false) } } @Test fun onClick_togglesTileState() = testScope.runTest { val tiles by collectLastValue(underTest.tiles) val modeId = "id" repository.addModes( listOf( TestModeBuilder() .setId(modeId) .setName("Test") .setManualInvocationAllowed(true) .build() ) ) runCurrent() assertThat(tiles?.size).isEqualTo(1) assertThat(tiles?.elementAt(0)?.enabled).isFalse() // Trigger onClick tiles?.first()?.onClick?.let { it() } runCurrent() assertThat(tiles?.first()?.enabled).isTrue() // Trigger onClick tiles?.first()?.onClick?.let { it() } runCurrent() assertThat(tiles?.first()?.enabled).isFalse() } } packages/SystemUI/src/com/android/systemui/statusbar/policy/domain/interactor/ZenModeInteractor.kt +10 −1 Original line number Diff line number Diff line Loading @@ -23,6 +23,7 @@ import com.android.settingslib.notification.data.repository.ZenModeRepository import com.android.settingslib.notification.modes.ZenIconLoader import com.android.settingslib.notification.modes.ZenMode import com.android.systemui.common.shared.model.Icon import java.time.Duration import javax.inject.Inject import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.combine Loading @@ -33,7 +34,7 @@ import kotlinx.coroutines.flow.map * An interactor that performs business logic related to the status and configuration of Zen Mode * (or Do Not Disturb/DND Mode). */ class ZenModeInteractor @Inject constructor(repository: ZenModeRepository) { class ZenModeInteractor @Inject constructor(private val repository: ZenModeRepository) { private val iconLoader: ZenIconLoader = ZenIconLoader.getInstance() val isZenModeEnabled: Flow<Boolean> = Loading Loading @@ -65,4 +66,12 @@ class ZenModeInteractor @Inject constructor(repository: ZenModeRepository) { suspend fun getModeIcon(mode: ZenMode, context: Context): Icon { return Icon.Loaded(mode.getIcon(context, iconLoader).await(), contentDescription = null) } fun activateMode(zenMode: ZenMode, duration: Duration? = null) { repository.activateMode(zenMode, duration) } fun deactivateMode(zenMode: ZenMode) { repository.deactivateMode(zenMode) } } packages/SystemUI/src/com/android/systemui/statusbar/policy/ui/dialog/viewmodel/ModesDialogViewModel.kt +6 −1 Original line number Diff line number Diff line Loading @@ -63,7 +63,12 @@ constructor( // "ON: Do Not Disturb, Until Mon 08:09"; see DndTile. contentDescription = "", onClick = { // TODO(b/346519570): Toggle mode. if (mode.isActive) { zenModeInteractor.deactivateMode(mode) } else { // TODO(b/346519570): Handle duration for DND mode. zenModeInteractor.activateMode(mode) } }, onLongClick = { // TODO(b/346519570): Open settings page for mode. Loading Loading
packages/SettingsLib/src/com/android/settingslib/notification/data/repository/FakeZenModeRepository.kt +15 −0 Original line number Diff line number Diff line Loading @@ -20,6 +20,7 @@ import android.app.NotificationManager import android.provider.Settings import com.android.settingslib.notification.modes.TestModeBuilder import com.android.settingslib.notification.modes.ZenMode import java.time.Duration import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.StateFlow Loading Loading @@ -63,6 +64,20 @@ class FakeZenModeRepository : ZenModeRepository { mutableModesFlow.value = mutableModesFlow.value.filter { it.id != id } } override fun activateMode(zenMode: ZenMode, duration: Duration?) { activateMode(zenMode.id) } override fun deactivateMode(zenMode: ZenMode) { deactivateMode(zenMode.id) } fun activateMode(id: String) { val oldMode = mutableModesFlow.value.find { it.id == id } ?: return removeMode(id) mutableModesFlow.value += TestModeBuilder(oldMode).setActive(true).build() } fun deactivateMode(id: String) { val oldMode = mutableModesFlow.value.find { it.id == id } ?: return removeMode(id) Loading
packages/SettingsLib/src/com/android/settingslib/notification/data/repository/ZenModeRepository.kt +13 −0 Original line number Diff line number Diff line Loading @@ -29,6 +29,7 @@ import android.provider.Settings import com.android.settingslib.flags.Flags import com.android.settingslib.notification.modes.ZenMode import com.android.settingslib.notification.modes.ZenModesBackend import java.time.Duration import kotlin.coroutines.CoroutineContext import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.channels.awaitClose Loading Loading @@ -56,6 +57,10 @@ interface ZenModeRepository { /** A list of all existing priority modes. */ val modes: Flow<List<ZenMode>> fun activateMode(zenMode: ZenMode, duration: Duration? = null) fun deactivateMode(zenMode: ZenMode) } class ZenModeRepositoryImpl( Loading Loading @@ -177,4 +182,12 @@ class ZenModeRepositoryImpl( flowOf(emptyList()) } } override fun activateMode(zenMode: ZenMode, duration: Duration?) { backend.activateMode(zenMode, duration) } override fun deactivateMode(zenMode: ZenMode) { backend.deactivateMode(zenMode) } }
packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/policy/ui/dialog/viewmodel/ModesDialogViewModelTest.kt +33 −0 Original line number Diff line number Diff line Loading @@ -128,4 +128,37 @@ class ModesDialogViewModelTest : SysuiTestCase() { assertThat(this.enabled).isEqualTo(false) } } @Test fun onClick_togglesTileState() = testScope.runTest { val tiles by collectLastValue(underTest.tiles) val modeId = "id" repository.addModes( listOf( TestModeBuilder() .setId(modeId) .setName("Test") .setManualInvocationAllowed(true) .build() ) ) runCurrent() assertThat(tiles?.size).isEqualTo(1) assertThat(tiles?.elementAt(0)?.enabled).isFalse() // Trigger onClick tiles?.first()?.onClick?.let { it() } runCurrent() assertThat(tiles?.first()?.enabled).isTrue() // Trigger onClick tiles?.first()?.onClick?.let { it() } runCurrent() assertThat(tiles?.first()?.enabled).isFalse() } }
packages/SystemUI/src/com/android/systemui/statusbar/policy/domain/interactor/ZenModeInteractor.kt +10 −1 Original line number Diff line number Diff line Loading @@ -23,6 +23,7 @@ import com.android.settingslib.notification.data.repository.ZenModeRepository import com.android.settingslib.notification.modes.ZenIconLoader import com.android.settingslib.notification.modes.ZenMode import com.android.systemui.common.shared.model.Icon import java.time.Duration import javax.inject.Inject import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.combine Loading @@ -33,7 +34,7 @@ import kotlinx.coroutines.flow.map * An interactor that performs business logic related to the status and configuration of Zen Mode * (or Do Not Disturb/DND Mode). */ class ZenModeInteractor @Inject constructor(repository: ZenModeRepository) { class ZenModeInteractor @Inject constructor(private val repository: ZenModeRepository) { private val iconLoader: ZenIconLoader = ZenIconLoader.getInstance() val isZenModeEnabled: Flow<Boolean> = Loading Loading @@ -65,4 +66,12 @@ class ZenModeInteractor @Inject constructor(repository: ZenModeRepository) { suspend fun getModeIcon(mode: ZenMode, context: Context): Icon { return Icon.Loaded(mode.getIcon(context, iconLoader).await(), contentDescription = null) } fun activateMode(zenMode: ZenMode, duration: Duration? = null) { repository.activateMode(zenMode, duration) } fun deactivateMode(zenMode: ZenMode) { repository.deactivateMode(zenMode) } }
packages/SystemUI/src/com/android/systemui/statusbar/policy/ui/dialog/viewmodel/ModesDialogViewModel.kt +6 −1 Original line number Diff line number Diff line Loading @@ -63,7 +63,12 @@ constructor( // "ON: Do Not Disturb, Until Mon 08:09"; see DndTile. contentDescription = "", onClick = { // TODO(b/346519570): Toggle mode. if (mode.isActive) { zenModeInteractor.deactivateMode(mode) } else { // TODO(b/346519570): Handle duration for DND mode. zenModeInteractor.activateMode(mode) } }, onLongClick = { // TODO(b/346519570): Open settings page for mode. Loading