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:
@@ -21,6 +21,8 @@ import android.view.KeyEvent
|
||||
import com.android.internal.os.DeviceKeyHandler
|
||||
|
||||
import java.io.File
|
||||
import java.lang.Thread
|
||||
import java.util.concurrent.Executors
|
||||
|
||||
class KeyHandler(context: Context) : DeviceKeyHandler {
|
||||
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
|
||||
)
|
||||
|
||||
private val executorService = Executors.newSingleThreadExecutor()
|
||||
|
||||
private var wasMuted = false
|
||||
private val broadcastReceiver = object : BroadcastReceiver() {
|
||||
override fun onReceive(context: Context, intent: Intent) {
|
||||
@@ -90,31 +94,43 @@ class KeyHandler(context: Context) : DeviceKeyHandler {
|
||||
else -> return
|
||||
}
|
||||
|
||||
when (mode) {
|
||||
AudioManager.RINGER_MODE_SILENT -> {
|
||||
notificationManager.setZenMode(Settings.Global.ZEN_MODE_OFF, null, TAG)
|
||||
audioManager.setRingerModeInternal(mode)
|
||||
if (muteMedia) {
|
||||
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.setRingerModeInternal(mode)
|
||||
if (muteMedia && wasMuted) {
|
||||
audioManager.adjustVolume(AudioManager.ADJUST_UNMUTE, 0)
|
||||
}
|
||||
}
|
||||
ZEN_PRIORITY_ONLY, ZEN_TOTAL_SILENCE, ZEN_ALARMS_ONLY -> {
|
||||
audioManager.setRingerModeInternal(AudioManager.RINGER_MODE_NORMAL)
|
||||
notificationManager.setZenMode(mode - ZEN_OFFSET, null, TAG)
|
||||
if (muteMedia && wasMuted) {
|
||||
audioManager.adjustVolume(AudioManager.ADJUST_UNMUTE, 0)
|
||||
executorService.submit {
|
||||
when (mode) {
|
||||
AudioManager.RINGER_MODE_SILENT -> {
|
||||
setZenMode(Settings.Global.ZEN_MODE_OFF)
|
||||
audioManager.setRingerModeInternal(mode)
|
||||
if (muteMedia) {
|
||||
audioManager.adjustVolume(AudioManager.ADJUST_MUTE, 0)
|
||||
wasMuted = true
|
||||
}
|
||||
}
|
||||
AudioManager.RINGER_MODE_VIBRATE, AudioManager.RINGER_MODE_NORMAL -> {
|
||||
setZenMode(Settings.Global.ZEN_MODE_OFF)
|
||||
audioManager.setRingerModeInternal(mode)
|
||||
if (muteMedia && wasMuted) {
|
||||
audioManager.adjustVolume(AudioManager.ADJUST_UNMUTE, 0)
|
||||
}
|
||||
}
|
||||
ZEN_PRIORITY_ONLY, ZEN_TOTAL_SILENCE, ZEN_ALARMS_ONLY -> {
|
||||
audioManager.setRingerModeInternal(AudioManager.RINGER_MODE_NORMAL)
|
||||
setZenMode(mode - ZEN_OFFSET)
|
||||
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 {
|
||||
|
||||
Reference in New Issue
Block a user