1 /*
<lambda>null2  * Copyright (C) 2023 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 
18 package com.android.systemui.keyguard.data.quickaffordance
19 
20 import android.content.Context
21 import android.media.AudioManager
22 import androidx.lifecycle.Observer
23 import com.android.systemui.CoreStartable
24 import com.android.systemui.dagger.SysUISingleton
25 import com.android.systemui.dagger.qualifiers.Application
26 import com.android.systemui.dagger.qualifiers.Background
27 import com.android.systemui.keyguard.data.repository.KeyguardQuickAffordanceRepository
28 import com.android.systemui.settings.UserFileManager
29 import com.android.systemui.settings.UserTracker
30 import com.android.systemui.util.RingerModeTracker
31 import kotlinx.coroutines.CoroutineDispatcher
32 import kotlinx.coroutines.CoroutineScope
33 import kotlinx.coroutines.flow.launchIn
34 import kotlinx.coroutines.flow.map
35 import kotlinx.coroutines.launch
36 import javax.inject.Inject
37 
38 /**
39  * Store previous non-silent Ringer Mode into shared prefs to be used for Mute Lockscreen Shortcut
40  */
41 @SysUISingleton
42 class MuteQuickAffordanceCoreStartable @Inject constructor(
43     private val userTracker: UserTracker,
44     private val ringerModeTracker: RingerModeTracker,
45     private val userFileManager: UserFileManager,
46     private val keyguardQuickAffordanceRepository: KeyguardQuickAffordanceRepository,
47     @Application private val coroutineScope: CoroutineScope,
48     @Background private val backgroundDispatcher: CoroutineDispatcher,
49 ) : CoreStartable {
50 
51     private val observer = Observer(this::updateLastNonSilentRingerMode)
52 
53     override fun start() {
54         // only listen to ringerModeInternal changes when Mute is one of the selected affordances
55         keyguardQuickAffordanceRepository
56             .selections
57             .map { selections ->
58                 // determines if Mute is selected in any lockscreen shortcut position
59                 val muteSelected: Boolean = selections.values.any { configList ->
60                     configList.any { config ->
61                         config.key == BuiltInKeyguardQuickAffordanceKeys.MUTE
62                     }
63                 }
64                 if (muteSelected) {
65                     ringerModeTracker.ringerModeInternal.observeForever(observer)
66                 } else {
67                     ringerModeTracker.ringerModeInternal.removeObserver(observer)
68                 }
69             }
70             .launchIn(coroutineScope)
71     }
72 
73     private fun updateLastNonSilentRingerMode(lastRingerMode: Int) {
74         coroutineScope.launch(backgroundDispatcher) {
75             if (AudioManager.RINGER_MODE_SILENT != lastRingerMode) {
76                 userFileManager.getSharedPreferences(
77                         MuteQuickAffordanceConfig.MUTE_QUICK_AFFORDANCE_PREFS_FILE_NAME,
78                         Context.MODE_PRIVATE,
79                         userTracker.userId
80                 )
81                 .edit()
82                 .putInt(MuteQuickAffordanceConfig.LAST_NON_SILENT_RINGER_MODE_KEY, lastRingerMode)
83                 .apply()
84             }
85         }
86     }
87 }