diff options
| author | 2024-11-28 16:09:39 +0100 | |
|---|---|---|
| committer | 2024-12-04 13:33:33 +0100 | |
| commit | e5f1dc5996f6c0c8f038aa57b47b6a25164f9231 (patch) | |
| tree | b32a57f69035a5686bd783275fe97d86abe5d1e8 | |
| parent | 0c312b882f55197470345dbde8d59c25883c41bc (diff) | |
Deactivate all modes from QS toggle
Bug: 380908293
Test: ModesTileUserActionInteractorTest, ZenModeInteractorTest
Test: manually test that the toggle works
Flag: android.app.modes_ui
Flag: com.android.systemui.qs_ui_refactor_compose_fragment
Change-Id: Iead9f8bc93e68bb963afaf68f64acad2a91a665c
5 files changed, 71 insertions, 18 deletions
diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/qs/tiles/impl/modes/domain/interactor/ModesTileUserActionInteractorTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/qs/tiles/impl/modes/domain/interactor/ModesTileUserActionInteractorTest.kt index dc782012e8d0..88b00468573f 100644 --- a/packages/SystemUI/multivalentTests/src/com/android/systemui/qs/tiles/impl/modes/domain/interactor/ModesTileUserActionInteractorTest.kt +++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/qs/tiles/impl/modes/domain/interactor/ModesTileUserActionInteractorTest.kt @@ -62,7 +62,7 @@ class ModesTileUserActionInteractorTest : SysuiTestCase() { ModesTileUserActionInteractor(inputHandler, mockDialogDelegate, zenModeInteractor) @Test - fun handleClick_active() = runTest { + fun handleClick_active_showsDialog() = runTest { val expandable = mock<Expandable>() underTest.handleInput( QSTileInputTestKtx.click(data = modelOf(true, listOf("DND")), expandable = expandable) @@ -72,7 +72,7 @@ class ModesTileUserActionInteractorTest : SysuiTestCase() { } @Test - fun handleClick_inactive() = runTest { + fun handleClick_inactive_showsDialog() = runTest { val expandable = mock<Expandable>() underTest.handleInput( QSTileInputTestKtx.click(data = modelOf(false, emptyList()), expandable = expandable) @@ -83,7 +83,31 @@ class ModesTileUserActionInteractorTest : SysuiTestCase() { @Test @EnableFlags(Flags.FLAG_QS_UI_REFACTOR_COMPOSE_FRAGMENT) - fun handleToggleClick_dndActive() = + fun handleToggleClick_multipleModesActive_deactivatesAll() = + testScope.runTest { + val activeModes by collectLastValue(zenModeInteractor.activeModes) + + zenModeRepository.addModes( + listOf( + TestModeBuilder.MANUAL_DND_ACTIVE, + TestModeBuilder().setName("Mode 1").setActive(true).build(), + TestModeBuilder().setName("Mode 2").setActive(true).build(), + ) + ) + assertThat(activeModes?.modeNames?.count()).isEqualTo(3) + + underTest.handleInput( + QSTileInputTestKtx.toggleClick( + data = modelOf(true, listOf("DND", "Mode 1", "Mode 2")) + ) + ) + + assertThat(activeModes?.isAnyActive()).isFalse() + } + + @Test + @EnableFlags(Flags.FLAG_QS_UI_REFACTOR_COMPOSE_FRAGMENT) + fun handleToggleClick_dndActive_deactivatesDnd() = testScope.runTest { val dndMode by collectLastValue(zenModeInteractor.dndMode) @@ -99,7 +123,7 @@ class ModesTileUserActionInteractorTest : SysuiTestCase() { @Test @EnableFlags(Flags.FLAG_QS_UI_REFACTOR_COMPOSE_FRAGMENT) - fun handleToggleClick_dndInactive() = + fun handleToggleClick_dndInactive_activatesDnd() = testScope.runTest { val dndMode by collectLastValue(zenModeInteractor.dndMode) @@ -107,14 +131,14 @@ class ModesTileUserActionInteractorTest : SysuiTestCase() { assertThat(dndMode?.isActive).isFalse() underTest.handleInput( - QSTileInputTestKtx.toggleClick(data = modelOf(true, listOf("DND"))) + QSTileInputTestKtx.toggleClick(data = modelOf(false, emptyList())) ) assertThat(dndMode?.isActive).isTrue() } @Test - fun handleLongClick_active() = runTest { + fun handleLongClick_active_opensSettings() = runTest { underTest.handleInput(QSTileInputTestKtx.longClick(modelOf(true, listOf("DND")))) QSTileIntentUserInputHandlerSubject.assertThat(inputHandler).handledOneIntentInput { @@ -123,7 +147,7 @@ class ModesTileUserActionInteractorTest : SysuiTestCase() { } @Test - fun handleLongClick_inactive() = runTest { + fun handleLongClick_inactive_opensSettings() = runTest { underTest.handleInput(QSTileInputTestKtx.longClick(modelOf(false, emptyList()))) QSTileIntentUserInputHandlerSubject.assertThat(inputHandler).handledOneIntentInput { diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/policy/domain/interactor/ZenModeInteractorTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/policy/domain/interactor/ZenModeInteractorTest.kt index 4e33a5958a1a..3d6882c3fdaf 100644 --- a/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/policy/domain/interactor/ZenModeInteractorTest.kt +++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/policy/domain/interactor/ZenModeInteractorTest.kt @@ -251,6 +251,22 @@ class ZenModeInteractorTest : SysuiTestCase() { } @Test + fun deactivateAllModes_updatesCorrectModes() = + testScope.runTest { + zenModeRepository.addModes( + listOf( + TestModeBuilder.MANUAL_DND_ACTIVE, + TestModeBuilder().setName("Inactive").setActive(false).build(), + TestModeBuilder().setName("Active").setActive(true).build(), + ) + ) + + underTest.deactivateAllModes() + + assertThat(zenModeRepository.getModes().filter { it.isActive }).isEmpty() + } + + @Test fun activeModes_computesMainActiveMode() = testScope.runTest { val activeModes by collectLastValue(underTest.activeModes) diff --git a/packages/SystemUI/src/com/android/systemui/qs/tiles/ModesTile.kt b/packages/SystemUI/src/com/android/systemui/qs/tiles/ModesTile.kt index 6baeca94b4ef..dc16b6cfbc70 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/tiles/ModesTile.kt +++ b/packages/SystemUI/src/com/android/systemui/qs/tiles/ModesTile.kt @@ -110,7 +110,8 @@ constructor( } override fun handleSecondaryClick(expandable: Expandable?) = runBlocking { - userActionInteractor.handleToggleClick() + val model = dataInteractor.getCurrentTileModel() + userActionInteractor.handleToggleClick(model) } override fun getLongClickIntent(): Intent = userActionInteractor.longClickIntent diff --git a/packages/SystemUI/src/com/android/systemui/qs/tiles/impl/modes/domain/interactor/ModesTileUserActionInteractor.kt b/packages/SystemUI/src/com/android/systemui/qs/tiles/impl/modes/domain/interactor/ModesTileUserActionInteractor.kt index d07d25b2eacb..594394f68d48 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/tiles/impl/modes/domain/interactor/ModesTileUserActionInteractor.kt +++ b/packages/SystemUI/src/com/android/systemui/qs/tiles/impl/modes/domain/interactor/ModesTileUserActionInteractor.kt @@ -49,7 +49,7 @@ constructor( handleClick(action.expandable) } is QSTileUserAction.ToggleClick -> { - handleToggleClick() + handleToggleClick(input.data) } is QSTileUserAction.LongClick -> { qsTileIntentUserInputHandler.handle(action.expandable, longClickIntent) @@ -63,20 +63,24 @@ constructor( dialogDelegate.showDialog(expandable) } - fun handleToggleClick() { + fun handleToggleClick(modesTileModel: ModesTileModel) { if (QSComposeFragment.isUnexpectedlyInLegacyMode()) { return } - val dnd = zenModeInteractor.dndMode.value - if (dnd == null) { - Log.wtf(TAG, "Triggered DND but it's null!?") - return - } - if (dnd.isActive) { - zenModeInteractor.deactivateMode(dnd) - } else { + // If no modes are on, turn on DND since it's the highest-priority mode. Otherwise, turn + // them all off. + // We want this toggle to work as a shortcut to DND in most cases, but it should still + // correctly toggle the tile state to "off" as the user would expect when more modes are on. + if (modesTileModel.activeModes.isEmpty()) { + val dnd = zenModeInteractor.dndMode.value + if (dnd == null) { + Log.wtf(TAG, "Triggered DND but it's null!?") + return + } zenModeInteractor.activateMode(dnd) + } else { + zenModeInteractor.deactivateAllModes() } } 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 3755d1866a3b..12ed647fdee7 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 @@ -209,6 +209,14 @@ constructor( zenModeRepository.deactivateMode(zenMode) } + fun deactivateAllModes() { + for (mode in zenModeRepository.getModes()) { + if (mode.isActive) { + deactivateMode(mode) + } + } + } + private val zenDuration get() = notificationSettingsRepository.zenDuration.value |