Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit f6ed4d06 authored by Ioana Alexandru's avatar Ioana Alexandru
Browse files

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
parent 72dcfda9
Loading
Loading
Loading
Loading
+7 −1
Original line number Diff line number Diff line
@@ -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(
+7 −1
Original line number Diff line number Diff line
@@ -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 {
+2 −1
Original line number Diff line number Diff line
@@ -66,13 +66,14 @@ class ModesDialogDelegateTest : SysuiTestCase() {
        whenever(
                mockDialogTransitionAnimator.createActivityTransitionController(
                    any<SystemUIDialog>(),
                    eq(null)
                    eq(null),
                )
            )
            .thenReturn(mockAnimationController)

        underTest =
            ModesDialogDelegate(
                context,
                kosmos.systemUIDialogFactory,
                mockDialogTransitionAnimator,
                activityStarter,
+12 −1
Original line number Diff line number Diff line
@@ -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<ModesTileModel> {
    val longClickIntent = Intent(Settings.ACTION_ZEN_MODE_SETTINGS)

@@ -78,7 +80,16 @@ constructor(
                Log.wtf(TAG, "Triggered DND but it's null!?")
                return
            }

            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()
        }
+26 −0
Original line number Diff line number Diff line
@@ -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)
Loading