How to get AppCompatDelegate current mode if default is auto
You can get the current mode using the following code,
int currentNightMode = getResources().getConfiguration().uiMode
& Configuration.UI_MODE_NIGHT_MASK;
switch (currentNightMode) {
case Configuration.UI_MODE_NIGHT_NO:
// Night mode is not active, we're in day time
case Configuration.UI_MODE_NIGHT_YES:
// Night mode is active, we're at night!
case Configuration.UI_MODE_NIGHT_UNDEFINED:
// We don't know what mode we're in, assume notnight
}
The following article by Chris Banes explains it nicely.
If you are a kotlin developer, then you can use the code below to check which mode your app is in..
val mode = context?.resources?.configuration?.uiMode? and Configuration.UI_MODE_NIGHT_MASK
when (mode) {
Configuration.UI_MODE_NIGHT_YES -> {}
Configuration.UI_MODE_NIGHT_NO -> {}
else -> {} //covers Configuration.UI_MODE_NIGHT_UNDEFINED
}
For more about the dark theme modes see;
https://github.com/googlesamples/android-DarkTheme/
Somehow @harshithdwivedi's answer didn't work for me when the night mode is set from inside the app (using AppCompatDelegate
). Otherwise it works fine.
So I had to add some additional checks like this:
public static boolean isNightModeActive(Context context) {
int defaultNightMode = AppCompatDelegate.getDefaultNightMode();
if (defaultNightMode == AppCompatDelegate.MODE_NIGHT_YES) {
return true;
}
if (defaultNightMode == AppCompatDelegate.MODE_NIGHT_NO) {
return false;
}
int currentNightMode = context.getResources().getConfiguration().uiMode
& Configuration.UI_MODE_NIGHT_MASK;
switch (currentNightMode) {
case Configuration.UI_MODE_NIGHT_NO:
return false;
case Configuration.UI_MODE_NIGHT_YES:
return true;
case Configuration.UI_MODE_NIGHT_UNDEFINED:
return false;
}
return false;
}
More simple way...
val Context.isDarkMode
get() = if (getDefaultNightMode() == MODE_NIGHT_FOLLOW_SYSTEM)
resources.configuration.uiMode and UI_MODE_NIGHT_MASK == UI_MODE_NIGHT_YES
else getDefaultNightMode() == MODE_NIGHT_YES