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,9 +94,10 @@ class KeyHandler(context: Context) : DeviceKeyHandler {
else -> return else -> return
} }
executorService.submit {
when (mode) { when (mode) {
AudioManager.RINGER_MODE_SILENT -> { AudioManager.RINGER_MODE_SILENT -> {
notificationManager.setZenMode(Settings.Global.ZEN_MODE_OFF, null, TAG) setZenMode(Settings.Global.ZEN_MODE_OFF)
audioManager.setRingerModeInternal(mode) audioManager.setRingerModeInternal(mode)
if (muteMedia) { if (muteMedia) {
audioManager.adjustVolume(AudioManager.ADJUST_MUTE, 0) audioManager.adjustVolume(AudioManager.ADJUST_MUTE, 0)
@@ -100,7 +105,7 @@ class KeyHandler(context: Context) : DeviceKeyHandler {
} }
} }
AudioManager.RINGER_MODE_VIBRATE, AudioManager.RINGER_MODE_NORMAL -> { AudioManager.RINGER_MODE_VIBRATE, AudioManager.RINGER_MODE_NORMAL -> {
notificationManager.setZenMode(Settings.Global.ZEN_MODE_OFF, null, TAG) setZenMode(Settings.Global.ZEN_MODE_OFF)
audioManager.setRingerModeInternal(mode) audioManager.setRingerModeInternal(mode)
if (muteMedia && wasMuted) { if (muteMedia && wasMuted) {
audioManager.adjustVolume(AudioManager.ADJUST_UNMUTE, 0) audioManager.adjustVolume(AudioManager.ADJUST_UNMUTE, 0)
@@ -108,7 +113,7 @@ class KeyHandler(context: Context) : DeviceKeyHandler {
} }
ZEN_PRIORITY_ONLY, ZEN_TOTAL_SILENCE, ZEN_ALARMS_ONLY -> { ZEN_PRIORITY_ONLY, ZEN_TOTAL_SILENCE, ZEN_ALARMS_ONLY -> {
audioManager.setRingerModeInternal(AudioManager.RINGER_MODE_NORMAL) audioManager.setRingerModeInternal(AudioManager.RINGER_MODE_NORMAL)
notificationManager.setZenMode(mode - ZEN_OFFSET, null, TAG) setZenMode(mode - ZEN_OFFSET)
if (muteMedia && wasMuted) { if (muteMedia && wasMuted) {
audioManager.adjustVolume(AudioManager.ADJUST_UNMUTE, 0) audioManager.adjustVolume(AudioManager.ADJUST_UNMUTE, 0)
} }
@@ -116,6 +121,17 @@ class KeyHandler(context: Context) : DeviceKeyHandler {
} }
vibrateIfNeeded(mode) 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)
}
}
companion object { companion object {
private const val TAG = "KeyHandler" private const val TAG = "KeyHandler"