diff options
| author | 2025-01-31 03:17:55 -0800 | |
|---|---|---|
| committer | 2025-02-03 02:09:30 -0800 | |
| commit | 57124ba2e98d2d742f1138d50b3dc40925cf55ab (patch) | |
| tree | 8750401bbc105fbd19e25d9ff12eb43f33d09b88 | |
| parent | 53d05392162a5b352d3698f356d87f732f6c0d53 (diff) | |
Open duration dialog from the main thread
Dialogs expect to be created from the main thread, so let's make sure we
switch to main when opening the duration dialog from the quick toggle on
the modes quick settings tile.
Fix: 391385776
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: Ia0b086fd3e92f31a1ba9d5a75ae7a4d9ff7f6734
5 files changed, 18 insertions, 4 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 f005375a2ef9..0b5192f02543 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 @@ -28,6 +28,7 @@ import com.android.internal.logging.MetricsLogger import com.android.systemui.SysuiTestCase import com.android.systemui.classifier.FalsingManagerFake import com.android.systemui.common.shared.model.asIcon +import com.android.systemui.kosmos.mainCoroutineContext import com.android.systemui.kosmos.testDispatcher import com.android.systemui.kosmos.testScope import com.android.systemui.plugins.ActivityStarter @@ -125,6 +126,7 @@ class ModesTileTest : SysuiTestCase() { userActionInteractor = ModesTileUserActionInteractor( + kosmos.mainCoroutineContext, inputHandler, dialogDelegate, kosmos.zenModeInteractor, 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 89b8e9171076..b57dc377b465 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 @@ -30,6 +30,7 @@ import com.android.systemui.SysuiTestCase import com.android.systemui.animation.Expandable import com.android.systemui.common.shared.model.asIcon import com.android.systemui.coroutines.collectLastValue +import com.android.systemui.kosmos.mainCoroutineContext import com.android.systemui.kosmos.testScope import com.android.systemui.qs.tiles.base.actions.QSTileIntentUserInputHandlerSubject import com.android.systemui.qs.tiles.base.actions.qsTileIntentUserInputHandler @@ -62,6 +63,7 @@ class ModesTileUserActionInteractorTest : SysuiTestCase() { private val underTest = ModesTileUserActionInteractor( + kosmos.mainCoroutineContext, inputHandler, mockDialogDelegate, zenModeInteractor, 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 5ce7f0d039c8..14b6ed68060c 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 @@ -21,6 +21,7 @@ import android.provider.Settings import android.util.Log import com.android.systemui.animation.Expandable import com.android.systemui.dagger.SysUISingleton +import com.android.systemui.dagger.qualifiers.Main import com.android.systemui.qs.flags.QSComposeFragment import com.android.systemui.qs.tiles.base.actions.QSTileIntentUserInputHandler import com.android.systemui.qs.tiles.base.interactor.QSTileInput @@ -31,11 +32,14 @@ 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 +import kotlin.coroutines.CoroutineContext +import kotlinx.coroutines.withContext @SysUISingleton class ModesTileUserActionInteractor @Inject constructor( + @Main private val mainContext: CoroutineContext, private val qsTileIntentUserInputHandler: QSTileIntentUserInputHandler, // TODO(b/353896370): The domain layer should not have to depend on the UI layer. private val dialogDelegate: ModesDialogDelegate, @@ -65,7 +69,7 @@ constructor( dialogDelegate.showDialog(expandable) } - fun handleToggleClick(modesTileModel: ModesTileModel) { + suspend fun handleToggleClick(modesTileModel: ModesTileModel) { if (QSComposeFragment.isUnexpectedlyInLegacyMode()) { return } @@ -83,9 +87,11 @@ constructor( if (zenModeInteractor.shouldAskForZenDuration(dnd)) { dialogEventLogger.logOpenDurationDialog(dnd) - // NOTE: The dialog handles turning on the mode itself. - val dialog = dialogDelegate.makeDndDurationDialog() - dialog.show() + withContext(mainContext) { + // NOTE: The dialog handles turning on the mode itself. + val dialog = dialogDelegate.makeDndDurationDialog() + dialog.show() + } } else { dialogEventLogger.logModeOn(dnd) zenModeInteractor.activateMode(dnd) 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 db5f1301823b..2fc22867e702 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,7 @@ package com.android.systemui.statusbar.policy.ui.dialog +import android.annotation.UiThread; import android.app.Dialog import android.content.Context import android.content.Intent @@ -205,6 +206,7 @@ constructor( * Special dialog to ask the user for the duration of DND. Not to be confused with the modes * dialog itself. */ + @UiThread fun makeDndDurationDialog(): Dialog { val dialog = EnableDndDialogFactory( 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 13cbddff8803..3f07d05a4786 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 @@ -17,6 +17,7 @@ package com.android.systemui.qs.tiles.impl.modes.domain.interactor import com.android.systemui.kosmos.Kosmos +import com.android.systemui.kosmos.mainCoroutineContext 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 @@ -26,6 +27,7 @@ import javax.inject.Provider val Kosmos.modesTileUserActionInteractor: ModesTileUserActionInteractor by Kosmos.Fixture { ModesTileUserActionInteractor( + mainCoroutineContext, qsTileIntentUserInputHandler, Provider { modesDialogDelegate }.get(), zenModeInteractor, |