• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (C) 2025 The Android Open Source Project
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *      http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 
17 package com.android.systemui.qs.tiles.impl.modes.domain.interactor
18 
19 import android.content.Intent
20 import android.provider.Settings.ACTION_AUTOMATIC_ZEN_RULE_SETTINGS
21 import android.provider.Settings.EXTRA_AUTOMATIC_ZEN_RULE_ID
22 import android.util.Log
23 import com.android.systemui.animation.Expandable
24 import com.android.systemui.dagger.SysUISingleton
25 import com.android.systemui.dagger.qualifiers.Main
26 import com.android.systemui.qs.shared.QSSettingsPackageRepository
27 import com.android.systemui.qs.tiles.base.domain.actions.QSTileIntentUserInputHandler
28 import com.android.systemui.qs.tiles.base.domain.interactor.QSTileUserActionInteractor
29 import com.android.systemui.qs.tiles.base.domain.model.QSTileInput
30 import com.android.systemui.qs.tiles.base.shared.model.QSTileUserAction
31 import com.android.systemui.qs.tiles.impl.modes.domain.model.ModesDndTileModel
32 import com.android.systemui.statusbar.policy.domain.interactor.ZenModeInteractor
33 import com.android.systemui.statusbar.policy.ui.dialog.ModesDialogDelegate
34 import com.android.systemui.statusbar.policy.ui.dialog.ModesDialogEventLogger
35 import javax.inject.Inject
36 import kotlin.coroutines.CoroutineContext
37 import kotlinx.coroutines.withContext
38 
39 @SysUISingleton
40 class ModesDndTileUserActionInteractor
41 @Inject
42 constructor(
43     @Main private val mainContext: CoroutineContext,
44     private val qsTileIntentUserInputHandler: QSTileIntentUserInputHandler,
45     // TODO(b/353896370): The domain layer should not have to depend on the UI layer.
46     private val dialogDelegate: ModesDialogDelegate,
47     private val zenModeInteractor: ZenModeInteractor,
48     private val dialogEventLogger: ModesDialogEventLogger,
49     private val settingsPackageRepository: QSSettingsPackageRepository,
50 ) : QSTileUserActionInteractor<ModesDndTileModel> {
51 
handleInputnull52     override suspend fun handleInput(input: QSTileInput<ModesDndTileModel>) {
53         with(input) {
54             when (action) {
55                 is QSTileUserAction.Click,
56                 is QSTileUserAction.ToggleClick -> {
57                     handleClick()
58                 }
59                 is QSTileUserAction.LongClick -> {
60                     handleLongClick(action.expandable)
61                 }
62             }
63         }
64     }
65 
handleClicknull66     suspend fun handleClick() {
67         val dnd = zenModeInteractor.dndMode.value
68         if (dnd == null) {
69             Log.wtf(TAG, "No DND!?")
70             return
71         }
72 
73         if (!dnd.isActive) {
74             if (zenModeInteractor.shouldAskForZenDuration(dnd)) {
75                 dialogEventLogger.logOpenDurationDialog(dnd)
76                 withContext(mainContext) {
77                     // NOTE: The dialog handles turning on the mode itself.
78                     val dialog = dialogDelegate.makeDndDurationDialog()
79                     dialog.show()
80                 }
81             } else {
82                 dialogEventLogger.logModeOn(dnd)
83                 zenModeInteractor.activateMode(dnd)
84             }
85         } else {
86             dialogEventLogger.logModeOff(dnd)
87             zenModeInteractor.deactivateMode(dnd)
88         }
89     }
90 
handleLongClicknull91     private fun handleLongClick(expandable: Expandable?) {
92         val intent = getSettingsIntent()
93         if (intent != null) {
94             qsTileIntentUserInputHandler.handle(expandable, intent)
95         }
96     }
97 
getSettingsIntentnull98     fun getSettingsIntent(): Intent? {
99         val dnd = zenModeInteractor.dndMode.value
100         if (dnd == null) {
101             Log.wtf(TAG, "No DND!?")
102             return null
103         }
104 
105         return Intent(ACTION_AUTOMATIC_ZEN_RULE_SETTINGS)
106             .putExtra(EXTRA_AUTOMATIC_ZEN_RULE_ID, dnd.id)
107             .setPackage(settingsPackageRepository.getSettingsPackageName())
108     }
109 
110     companion object {
111         const val TAG = "ModesDndTileUserActionInteractor"
112     }
113 }
114