KeyHandler: Wait for zen mode change before setting ringer mode

This makes sure that asynchronous zen mode change does not override our
ringer mode setting.

Change-Id: I8d381d36759108daa3d977d4b78ae438a95f4962
This commit is contained in:
LuK1337
2022-09-10 16:43:17 +02:00
committed by Łukasz Patron
parent aac564e031
commit 6c0ac8d4ca

View File

@@ -21,6 +21,8 @@ import android.view.KeyEvent
import com.android.internal.os.DeviceKeyHandler import com.android.internal.os.DeviceKeyHandler
import java.io.File import java.io.File
import java.lang.Thread
import java.util.concurrent.Executors
class KeyHandler(context: Context) : DeviceKeyHandler { class KeyHandler(context: Context) : DeviceKeyHandler {
private val audioManager = context.getSystemService(AudioManager::class.java) private val audioManager = context.getSystemService(AudioManager::class.java)
@@ -37,6 +39,8 @@ class KeyHandler(context: Context) : DeviceKeyHandler {
Context.MODE_PRIVATE or Context.MODE_MULTI_PROCESS Context.MODE_PRIVATE or Context.MODE_MULTI_PROCESS
) )
private val executorService = Executors.newSingleThreadExecutor()
private var wasMuted = false private var wasMuted = false
private val broadcastReceiver = object : BroadcastReceiver() { private val broadcastReceiver = object : BroadcastReceiver() {
override fun onReceive(context: Context, intent: Intent) { override fun onReceive(context: Context, intent: Intent) {
@@ -90,31 +94,43 @@ class KeyHandler(context: Context) : DeviceKeyHandler {
else -> return else -> return
} }
when (mode) { executorService.submit {
AudioManager.RINGER_MODE_SILENT -> { when (mode) {
notificationManager.setZenMode(Settings.Global.ZEN_MODE_OFF, null, TAG) AudioManager.RINGER_MODE_SILENT -> {
audioManager.setRingerModeInternal(mode) setZenMode(Settings.Global.ZEN_MODE_OFF)
if (muteMedia) { audioManager.setRingerModeInternal(mode)
audioManager.adjustVolume(AudioManager.ADJUST_MUTE, 0) if (muteMedia) {
wasMuted = true audioManager.adjustVolume(AudioManager.ADJUST_MUTE, 0)
} wasMuted = true
} }
AudioManager.RINGER_MODE_VIBRATE, AudioManager.RINGER_MODE_NORMAL -> { }
notificationManager.setZenMode(Settings.Global.ZEN_MODE_OFF, null, TAG) AudioManager.RINGER_MODE_VIBRATE, AudioManager.RINGER_MODE_NORMAL -> {
audioManager.setRingerModeInternal(mode) setZenMode(Settings.Global.ZEN_MODE_OFF)
if (muteMedia && wasMuted) { audioManager.setRingerModeInternal(mode)
audioManager.adjustVolume(AudioManager.ADJUST_UNMUTE, 0) if (muteMedia && wasMuted) {
} audioManager.adjustVolume(AudioManager.ADJUST_UNMUTE, 0)
} }
ZEN_PRIORITY_ONLY, ZEN_TOTAL_SILENCE, ZEN_ALARMS_ONLY -> { }
audioManager.setRingerModeInternal(AudioManager.RINGER_MODE_NORMAL) ZEN_PRIORITY_ONLY, ZEN_TOTAL_SILENCE, ZEN_ALARMS_ONLY -> {
notificationManager.setZenMode(mode - ZEN_OFFSET, null, TAG) audioManager.setRingerModeInternal(AudioManager.RINGER_MODE_NORMAL)
if (muteMedia && wasMuted) { setZenMode(mode - ZEN_OFFSET)
audioManager.adjustVolume(AudioManager.ADJUST_UNMUTE, 0) if (muteMedia && wasMuted) {
audioManager.adjustVolume(AudioManager.ADJUST_UNMUTE, 0)
}
} }
} }
vibrateIfNeeded(mode)
}
}
private fun setZenMode(zenMode: Int) {
// Set zen mode
notificationManager.setZenMode(zenMode, null, TAG)
// Wait until zen mode change is committed
while (notificationManager.getZenMode() != zenMode) {
Thread.sleep(10)
} }
vibrateIfNeeded(mode)
} }
companion object { companion object {