Android - How to detect if night mode is on when using AppCompatDelegate.MODE_NIGHT_AUTO

AndroidAndroid Night-Mode

Android Problem Overview


I'm using Androids built in day/night mode functionality and I'd like to add an option to my app for AppCompatDelegate.MODE_NIGHT_AUTO

I'm having a problem though because my app requires certain things to be colored programmatically, and I can't figure out how to check if the app considers itself in night or day mode. Without that, I can't set a flag to choose the right colors.

Calling AppCompatDelegate.getDefaultNightMode() just returns AppCompatDelegate.MODE_NIGHT_AUTO which is useless.

I don't see anything else that would tell me, but there must be something?

Android Solutions


Solution 1 - Android

int nightModeFlags =
    getContext().getResources().getConfiguration().uiMode &
    Configuration.UI_MODE_NIGHT_MASK;
switch (nightModeFlags) {
    case Configuration.UI_MODE_NIGHT_YES:
         doStuff();
         break;

    case Configuration.UI_MODE_NIGHT_NO:
         doStuff();
         break;

    case Configuration.UI_MODE_NIGHT_UNDEFINED:
         doStuff();
         break;
}

Solution 2 - Android

If you are kotlin developer then you can use below code to judge dark mode.

when (context.resources?.configuration?.uiMode?.and(Configuration.UI_MODE_NIGHT_MASK)) {
    Configuration.UI_MODE_NIGHT_YES -> {}
    Configuration.UI_MODE_NIGHT_NO -> {}
    Configuration.UI_MODE_NIGHT_UNDEFINED -> {}
}

For more about dark theme mode

> https://github.com/android/user-interface-samples/tree/main/DarkTheme

Solution 3 - Android

A very simple solution is to add a string resource like this.

res/values/strings.xml

<string name="mode">Day</string>

res/values-night/strings.xml

<string name="mode">Night</string>

And then wherever you need to check it:

if (resources.getString(R.string.mode) == "Day") {
    // Do Day stuff here
} else {
    // Do night stuff here
}

But you CAN NOT call this before super.onCreate() in an activity's life-cycle. It will always return "Day" before onCreate.

Solution 4 - Android

The bitwise operator in Java (which is used in @ephemient 's answer) is different in kotlin so the code might not be easily convertible for beginners. Here is the kotlin version just in case someone needs it:

    private fun isUsingNightModeResources(): Boolean {
        return when (resources.configuration.uiMode and 
Configuration.UI_MODE_NIGHT_MASK) {
            Configuration.UI_MODE_NIGHT_YES -> true
            Configuration.UI_MODE_NIGHT_NO -> false
            Configuration.UI_MODE_NIGHT_UNDEFINED -> false
            else -> false
    }
}

Solution 5 - Android

to check for night mode you can do as below:

public boolean isNightMode(Context context) {
    int nightModeFlags = context.getResources().getConfiguration().uiMode & Configuration.UI_MODE_NIGHT_MASK;
    return nightModeFlags == Configuration.UI_MODE_NIGHT_YES;
}

Solution 6 - Android

For Xamarin.Android

if (Build.VERSION.SdkInt >= BuildVersionCodes.Froyo)
{
	var uiModeFlags = Application.Context.Resources.Configuration.UiMode & UiMode.NightMask;
	switch (uiModeFlags)
	{
		case UiMode.NightYes:
			// dark mode
			break;
		case UiMode.NightNo:
			// default mode
			break;
		default:
			// default mode
			break;
	}
}
else
{
// default mode
}

Solution 7 - Android

Maybe just a property that will actually tell you if you have Dark Mode ?

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

Solution 8 - Android

I had problems with my UI tests, when try to get current theme in every answer code. It every time return the same value.

So I create static variable in application class and get theme for UI tests throw it:

@Theme
fun Context.getAppTheme(): Int? {
    val theme = when (resources.configuration.uiMode and Configuration.UI_MODE_NIGHT_MASK) {
        Configuration.UI_MODE_NIGHT_NO -> Theme.LIGHT
        Configuration.UI_MODE_NIGHT_YES -> Theme.DARK
        else -> null
    }

    Application.theme = theme

    return theme
}

In Application class:

companion object {
    @Theme
    @RunNone var theme: Int? = null
}

May be it will be usefull for someone!

Solution 9 - Android

Kotlin Version :->

fun isDarkMode(context: Context): Boolean {
    val darkModeFlag = context.resources.configuration.uiMode and Configuration.UI_MODE_NIGHT_MASK
    return darkModeFlag == Configuration.UI_MODE_NIGHT_YES
}

Solution 10 - Android

I found nothing of this to be working after changing the the app to dark theme with

AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_YES);

Is there any way to know the system setting after changing the app with this method?
Thanks,
FF

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionBen987654View Question on Stackoverflow
Solution 1 - AndroidephemientView Answer on Stackoverflow
Solution 2 - AndroidSaurabh KhareView Answer on Stackoverflow
Solution 3 - Androidjust_userView Answer on Stackoverflow
Solution 4 - AndroidAli NemView Answer on Stackoverflow
Solution 5 - AndroidMustafa PoyaView Answer on Stackoverflow
Solution 6 - Androiduser5959404View Answer on Stackoverflow
Solution 7 - AndroidRenetikView Answer on Stackoverflow
Solution 8 - AndroidSerjantArbuzView Answer on Stackoverflow
Solution 9 - AndroidabhiView Answer on Stackoverflow
Solution 10 - AndroidFerFigView Answer on Stackoverflow