From f6ed4d0644530d065fac8d23d3144e7737456681 Mon Sep 17 00:00:00 2001 From: Ioana Alexandru Date: Tue, 14 Jan 2025 19:29:16 +0100 Subject: Show duration dialog when pressing new QS toggle When turning on DND, if the user has the setting enabled to "Ask every time", we should show the duration dialog when the new quick toggle in the Modes tile is pressed. This matches the behavior of the old DND tile. Also added logging, and moved the code that creates the dialog to the delegate to reduce code duplication. Fix: 388261320 Flag: android.app.modes_ui Flag: com.android.systemui.qs_ui_refactor_compose_fragment Test: turn on "Ask every time" and check that dialog works correctly Change-Id: I39644c7748974f56ed87cbcc612854c65b471b1c --- .../com/android/systemui/qs/tiles/ModesTileTest.kt | 8 ++++++- .../ModesTileUserActionInteractorTest.kt | 8 ++++++- .../policy/ui/dialog/ModesDialogDelegateTest.kt | 3 ++- .../interactor/ModesTileUserActionInteractor.kt | 13 ++++++++++- .../policy/ui/dialog/ModesDialogDelegate.kt | 26 ++++++++++++++++++++++ .../ui/dialog/viewmodel/ModesDialogViewModel.kt | 23 +------------------ .../ModesTileUserActionInteractorKosmos.kt | 2 ++ .../policy/ui/dialog/ModesDialogDelegateKosmos.kt | 2 ++ 8 files changed, 59 insertions(+), 26 deletions(-) diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/qs/tiles/ModesTileTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/qs/tiles/ModesTileTest.kt index 9173ac969324..f005375a2ef9 100644 --- a/packages/SystemUI/multivalentTests/src/com/android/systemui/qs/tiles/ModesTileTest.kt +++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/qs/tiles/ModesTileTest.kt @@ -48,6 +48,7 @@ import com.android.systemui.res.R import com.android.systemui.statusbar.policy.data.repository.zenModeRepository import com.android.systemui.statusbar.policy.domain.interactor.zenModeInteractor import com.android.systemui.statusbar.policy.ui.dialog.ModesDialogDelegate +import com.android.systemui.statusbar.policy.ui.dialog.modesDialogEventLogger import com.android.systemui.testKosmos import com.android.systemui.util.mockito.any import com.android.systemui.util.settings.FakeSettings @@ -123,7 +124,12 @@ class ModesTileTest : SysuiTestCase() { ) userActionInteractor = - ModesTileUserActionInteractor(inputHandler, dialogDelegate, kosmos.zenModeInteractor) + ModesTileUserActionInteractor( + inputHandler, + dialogDelegate, + kosmos.zenModeInteractor, + kosmos.modesDialogEventLogger, + ) underTest = ModesTile( 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 c8b3aba9b846..89b8e9171076 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 @@ -38,6 +38,7 @@ import com.android.systemui.qs.tiles.impl.modes.domain.model.ModesTileModel import com.android.systemui.statusbar.policy.data.repository.zenModeRepository import com.android.systemui.statusbar.policy.domain.interactor.zenModeInteractor import com.android.systemui.statusbar.policy.ui.dialog.mockModesDialogDelegate +import com.android.systemui.statusbar.policy.ui.dialog.modesDialogEventLogger import com.android.systemui.testKosmos import com.google.common.truth.Truth.assertThat import kotlinx.coroutines.ExperimentalCoroutinesApi @@ -60,7 +61,12 @@ class ModesTileUserActionInteractorTest : SysuiTestCase() { private val zenModeInteractor = kosmos.zenModeInteractor private val underTest = - ModesTileUserActionInteractor(inputHandler, mockDialogDelegate, zenModeInteractor) + ModesTileUserActionInteractor( + inputHandler, + mockDialogDelegate, + zenModeInteractor, + kosmos.modesDialogEventLogger, + ) @Test fun handleClick_active_showsDialog() = runTest { diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/policy/ui/dialog/ModesDialogDelegateTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/policy/ui/dialog/ModesDialogDelegateTest.kt index b2378d2c3aae..2d6315014164 100644 --- a/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/policy/ui/dialog/ModesDialogDelegateTest.kt +++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/policy/ui/dialog/ModesDialogDelegateTest.kt @@ -66,13 +66,14 @@ class ModesDialogDelegateTest : SysuiTestCase() { whenever( mockDialogTransitionAnimator.createActivityTransitionController( any(), - eq(null) + eq(null), ) ) .thenReturn(mockAnimationController) underTest = ModesDialogDelegate( + context, kosmos.systemUIDialogFactory, mockDialogTransitionAnimator, activityStarter, 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 594394f68d48..5ce7f0d039c8 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 @@ -29,6 +29,7 @@ import com.android.systemui.qs.tiles.impl.modes.domain.model.ModesTileModel import com.android.systemui.qs.tiles.viewmodel.QSTileUserAction import com.android.systemui.statusbar.policy.domain.interactor.ZenModeInteractor import com.android.systemui.statusbar.policy.ui.dialog.ModesDialogDelegate +import com.android.systemui.statusbar.policy.ui.dialog.ModesDialogEventLogger import javax.inject.Inject @SysUISingleton @@ -39,6 +40,7 @@ constructor( // TODO(b/353896370): The domain layer should not have to depend on the UI layer. private val dialogDelegate: ModesDialogDelegate, private val zenModeInteractor: ZenModeInteractor, + private val dialogEventLogger: ModesDialogEventLogger, ) : QSTileUserActionInteractor { val longClickIntent = Intent(Settings.ACTION_ZEN_MODE_SETTINGS) @@ -78,7 +80,16 @@ constructor( Log.wtf(TAG, "Triggered DND but it's null!?") return } - zenModeInteractor.activateMode(dnd) + + if (zenModeInteractor.shouldAskForZenDuration(dnd)) { + dialogEventLogger.logOpenDurationDialog(dnd) + // NOTE: The dialog handles turning on the mode itself. + val dialog = dialogDelegate.makeDndDurationDialog() + dialog.show() + } else { + dialogEventLogger.logModeOn(dnd) + zenModeInteractor.activateMode(dnd) + } } else { zenModeInteractor.deactivateAllModes() } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/policy/ui/dialog/ModesDialogDelegate.kt b/packages/SystemUI/src/com/android/systemui/statusbar/policy/ui/dialog/ModesDialogDelegate.kt index 9ff0d18f0e2b..c23508f8ae68 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/policy/ui/dialog/ModesDialogDelegate.kt +++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/ui/dialog/ModesDialogDelegate.kt @@ -16,6 +16,8 @@ package com.android.systemui.statusbar.policy.ui.dialog +import android.app.Dialog +import android.content.Context import android.content.Intent import android.provider.Settings import android.util.Log @@ -36,6 +38,7 @@ import com.android.compose.PlatformOutlinedButton import com.android.compose.theme.PlatformTheme import com.android.internal.annotations.VisibleForTesting import com.android.internal.jank.InteractionJankMonitor +import com.android.settingslib.notification.modes.EnableZenModeDialog import com.android.systemui.animation.DialogCuj import com.android.systemui.animation.DialogTransitionAnimator import com.android.systemui.animation.Expandable @@ -43,6 +46,7 @@ import com.android.systemui.dagger.SysUISingleton import com.android.systemui.dagger.qualifiers.Main import com.android.systemui.dialog.ui.composable.AlertDialogContent import com.android.systemui.plugins.ActivityStarter +import com.android.systemui.qs.tiles.dialog.QSZenModeDialogMetricsLogger import com.android.systemui.res.R import com.android.systemui.shade.domain.interactor.ShadeDialogContextInteractor import com.android.systemui.statusbar.phone.ComponentSystemUIDialog @@ -61,6 +65,7 @@ import kotlinx.coroutines.withContext class ModesDialogDelegate @Inject constructor( + val context: Context, private val sysuiDialogFactory: SystemUIDialogFactory, private val dialogTransitionAnimator: DialogTransitionAnimator, private val activityStarter: ActivityStarter, @@ -72,6 +77,7 @@ constructor( ) : SystemUIDialog.Delegate { // NOTE: This should only be accessed/written from the main thread. @VisibleForTesting var currentDialog: ComponentSystemUIDialog? = null + private val zenDialogMetricsLogger by lazy { QSZenModeDialogMetricsLogger(context) } override fun createDialog(): SystemUIDialog { Assert.isMainThread() @@ -195,6 +201,26 @@ constructor( activityStarter.startActivity(intent, /* dismissShade= */ true, animationController) } + /** + * Special dialog to ask the user for the duration of DND. Not to be confused with the modes + * dialog itself. + */ + fun makeDndDurationDialog(): Dialog { + val dialog = + EnableZenModeDialog( + context, + R.style.Theme_SystemUI_Dialog, + /* cancelIsNeutral= */ true, + zenDialogMetricsLogger, + ) + .createDialog() + SystemUIDialog.applyFlags(dialog) + SystemUIDialog.setShowForAllUsers(dialog, true) + SystemUIDialog.registerDismissListener(dialog) + SystemUIDialog.setDialogSize(dialog) + return dialog + } + companion object { private const val TAG = "ModesDialogDelegate" private val ZEN_MODE_SETTINGS_INTENT = Intent(Settings.ACTION_ZEN_MODE_SETTINGS) 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 1c13a833ef30..07f1c3470c83 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 @@ -16,20 +16,16 @@ package com.android.systemui.statusbar.policy.ui.dialog.viewmodel -import android.app.Dialog import android.content.Context import android.content.Intent import android.provider.Settings.ACTION_AUTOMATIC_ZEN_RULE_SETTINGS import android.provider.Settings.EXTRA_AUTOMATIC_ZEN_RULE_ID -import com.android.settingslib.notification.modes.EnableZenModeDialog import com.android.settingslib.notification.modes.ZenMode import com.android.settingslib.notification.modes.ZenModeDescriptions import com.android.systemui.common.shared.model.asIcon import com.android.systemui.dagger.SysUISingleton import com.android.systemui.dagger.qualifiers.Background -import com.android.systemui.qs.tiles.dialog.QSZenModeDialogMetricsLogger import com.android.systemui.res.R -import com.android.systemui.statusbar.phone.SystemUIDialog import com.android.systemui.statusbar.policy.domain.interactor.ZenModeInteractor import com.android.systemui.statusbar.policy.ui.dialog.ModesDialogDelegate import com.android.systemui.statusbar.policy.ui.dialog.ModesDialogEventLogger @@ -54,7 +50,6 @@ constructor( private val dialogDelegate: ModesDialogDelegate, private val dialogEventLogger: ModesDialogEventLogger, ) { - private val zenDialogMetricsLogger = QSZenModeDialogMetricsLogger(context) private val zenModeDescriptions = ZenModeDescriptions(context) // Modes that should be displayed in the dialog @@ -112,7 +107,7 @@ constructor( if (zenModeInteractor.shouldAskForZenDuration(mode)) { dialogEventLogger.logOpenDurationDialog(mode) // NOTE: The dialog handles turning on the mode itself. - val dialog = makeZenModeDialog() + val dialog = dialogDelegate.makeDndDurationDialog() dialog.show() } else { dialogEventLogger.logModeOn(mode) @@ -173,20 +168,4 @@ constructor( modeDescription ?: context.getString(R.string.zen_mode_off) } } - - private fun makeZenModeDialog(): Dialog { - val dialog = - EnableZenModeDialog( - context, - R.style.Theme_SystemUI_Dialog, - /* cancelIsNeutral= */ true, - zenDialogMetricsLogger, - ) - .createDialog() - SystemUIDialog.applyFlags(dialog) - SystemUIDialog.setShowForAllUsers(dialog, true) - SystemUIDialog.registerDismissListener(dialog) - SystemUIDialog.setDialogSize(dialog) - return dialog - } } diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/qs/tiles/impl/modes/domain/interactor/ModesTileUserActionInteractorKosmos.kt b/packages/SystemUI/tests/utils/src/com/android/systemui/qs/tiles/impl/modes/domain/interactor/ModesTileUserActionInteractorKosmos.kt index 3c37101cfe66..13cbddff8803 100644 --- a/packages/SystemUI/tests/utils/src/com/android/systemui/qs/tiles/impl/modes/domain/interactor/ModesTileUserActionInteractorKosmos.kt +++ b/packages/SystemUI/tests/utils/src/com/android/systemui/qs/tiles/impl/modes/domain/interactor/ModesTileUserActionInteractorKosmos.kt @@ -20,6 +20,7 @@ import com.android.systemui.kosmos.Kosmos import com.android.systemui.qs.tiles.base.actions.qsTileIntentUserInputHandler import com.android.systemui.statusbar.policy.domain.interactor.zenModeInteractor import com.android.systemui.statusbar.policy.ui.dialog.modesDialogDelegate +import com.android.systemui.statusbar.policy.ui.dialog.modesDialogEventLogger import javax.inject.Provider val Kosmos.modesTileUserActionInteractor: ModesTileUserActionInteractor by @@ -28,5 +29,6 @@ val Kosmos.modesTileUserActionInteractor: ModesTileUserActionInteractor by qsTileIntentUserInputHandler, Provider { modesDialogDelegate }.get(), zenModeInteractor, + modesDialogEventLogger, ) } diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/statusbar/policy/ui/dialog/ModesDialogDelegateKosmos.kt b/packages/SystemUI/tests/utils/src/com/android/systemui/statusbar/policy/ui/dialog/ModesDialogDelegateKosmos.kt index 6c98d19db5d7..ef043e0177a5 100644 --- a/packages/SystemUI/tests/utils/src/com/android/systemui/statusbar/policy/ui/dialog/ModesDialogDelegateKosmos.kt +++ b/packages/SystemUI/tests/utils/src/com/android/systemui/statusbar/policy/ui/dialog/ModesDialogDelegateKosmos.kt @@ -16,6 +16,7 @@ package com.android.systemui.statusbar.policy.ui.dialog +import android.content.mockedContext import com.android.systemui.animation.dialogTransitionAnimator import com.android.systemui.kosmos.Kosmos import com.android.systemui.kosmos.mainCoroutineContext @@ -30,6 +31,7 @@ val Kosmos.mockModesDialogDelegate by Kosmos.Fixture { mock var Kosmos.modesDialogDelegate: ModesDialogDelegate by Kosmos.Fixture { ModesDialogDelegate( + mockedContext, systemUIDialogFactory, dialogTransitionAnimator, activityStarter, -- cgit v1.2.3-59-g8ed1b