4

I can get UI_MODE_NIGHT_MASK by calling resources.configuration.uiMode and Configuration.UI_MODE_NIGHT_MASK.

I need to listen to this variable and change my theme on receiving new value.

I think I could add a BroadcastReceiver so I can do a getSystemService(A_CONSTANT_FROM_Context) and registering a theme callback similar to ConnectivityManager.NetworkCallback. But I only found these in docs: extending Theme.MaterialComponents.DayNight on my theme styles and having values-night. Question dark them config which already has an accepted answer refers to this documentation.

mrahimygk
  • 512
  • 5
  • 20

1 Answers1

9

To get informed about the uiMode change add configChanges attribute in your AndroidManifest.xml:

<application
    ...>
    <activity
        android:name=".YourActivity"
        ...
        android:configChanges="uiMode"/>
</application>

And then in you activity listen for the config change:

public class YourActivity extends AppCompatActivity {

    protected Configuration mPrevConfig;


    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        ...
        mPrevConfig = new Configuration(getResources().getConfiguration());
    }

    @Override
    public void onConfigurationChanged(@NonNull Configuration newConfig) {
        super.onConfigurationChanged(newConfig);
        configurationChanged(newConfig);
        mPrevConfig = new Configuration(newConfig);
    }

    protected void configurationChanged(Configuration newConfig) {
        if (isNightConfigChanged(newConfig)) { // night mode has changed
            recreate();
            // do your thing
        }
    }

    protected boolean isNightConfigChanged(Configuration newConfig) {
        return (newConfig.diff(mPrevConfig) & ActivityInfo.CONFIG_UI_MODE) != 0 && isOnDarkMode(newConfig) != isOnDarkMode(mPrevConfig);
    }
    public static boolean isOnDarkMode(Configuration configuration) {
        return (configuration.uiMode & Configuration.UI_MODE_NIGHT_MASK) == Configuration.UI_MODE_NIGHT_YES;
    }
}
Sdghasemi
  • 5,370
  • 1
  • 34
  • 42