Estoy implementando un cambio de modo oscuro dinámico en la aplicación en la que estoy trabajando y funciona muy bien para MODE_NIGHT_YES y para MODE_NIGHT_NO pero cuando configuro esto en MODE_NIGHT_FOLLOW_SYSTEM , aplica el tema pero no con el modo correcto seleccionado por el usuario en la configuración del teléfono.
Estoy configurando el tema llamando
fun updateThemeSelection(mode: Int) { selectedMode = mode // Saving to shared preference to remember user choice setDefaultNightMode(mode) }La forma en que verificamos si el sistema está configurado en modo oscuro o no es con esta función (también probé otras configuraciones)
fun Configuration.isSystemInDarkMode(): Boolean { val defaultNightMode = AppCompatDelegate.getDefaultNightMode() if (defaultNightMode == AppCompatDelegate.MODE_NIGHT_YES) return true if (defaultNightMode == AppCompatDelegate.MODE_NIGHT_NO) return false return (uiMode and Configuration.UI_MODE_NIGHT_MASK) == Configuration.UI_MODE_NIGHT_YES } Esto funciona bien, excepto por MODE_NIGHT_FOLLOW_SYSTEM que solo funciona después de forzar el cierre de la aplicación; en todos los demás casos, devuelve el último modo conocido.
Lo extraño es que si configuro android:configChanges="uiMode" en la actividad en el manifiesto fun onConfigurationChanged(newConfig: Configuration) se activa cuando alterno la configuración rápida del modo oscuro pero cuando isSystemInDarkMode() en la config que recibo el último modo conocido hasta que se elimina la aplicación...
Incluso depuré los bits de uiMode y Configuration.UI_MODE_NIGHT_MASK y devuelven los últimos valores.
También intenté usar setLocalNightMode(int) y applyDayNight() y recibí el mismo resultado.
No creo que sea un error específico del dispositivo porque lo ejecuto tanto en un emulador como en un OnePlus 7 pro, ambos con Android 11.