diff options
5 files changed, 77 insertions, 2 deletions
diff --git a/packages/SettingsLib/src/com/android/settingslib/notification/data/repository/FakeZenModeRepository.kt b/packages/SettingsLib/src/com/android/settingslib/notification/data/repository/FakeZenModeRepository.kt index 8bd08dea3c60..49b974fa3f00 100644 --- a/packages/SettingsLib/src/com/android/settingslib/notification/data/repository/FakeZenModeRepository.kt +++ b/packages/SettingsLib/src/com/android/settingslib/notification/data/repository/FakeZenModeRepository.kt @@ -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 @@ -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) diff --git a/packages/SettingsLib/src/com/android/settingslib/notification/data/repository/ZenModeRepository.kt b/packages/SettingsLib/src/com/android/settingslib/notification/data/repository/ZenModeRepository.kt index 26b5741d8299..b987cc8d69e2 100644 --- a/packages/SettingsLib/src/com/android/settingslib/notification/data/repository/ZenModeRepository.kt +++ b/packages/SettingsLib/src/com/android/settingslib/notification/data/repository/ZenModeRepository.kt @@ -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 @@ -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( @@ -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) + } } diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/policy/ui/dialog/viewmodel/ModesDialogViewModelTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/policy/ui/dialog/viewmodel/ModesDialogViewModelTest.kt index 0d6f9a38ada1..fdfc7f13abf7 100644 --- a/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/policy/ui/dialog/viewmodel/ModesDialogViewModelTest.kt +++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/policy/ui/dialog/viewmodel/ModesDialogViewModelTest.kt @@ -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() + } } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/policy/domain/interactor/ZenModeInteractor.kt b/packages/SystemUI/src/com/android/systemui/statusbar/policy/domain/interactor/ZenModeInteractor.kt index 89076820ec87..7a521a6ba28f 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/policy/domain/interactor/ZenModeInteractor.kt +++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/domain/interactor/ZenModeInteractor.kt @@ -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 @@ -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> = @@ -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) + } } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/policy/ui/dialog/viewmodel/ModesDialogViewModel.kt b/packages/SystemUI/src/com/android/systemui/statusbar/policy/ui/dialog/viewmodel/ModesDialogViewModel.kt index b63236537c8f..e84c8b61ff54 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/policy/ui/dialog/viewmodel/ModesDialogViewModel.kt +++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/ui/dialog/viewmodel/ModesDialogViewModel.kt @@ -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. |