blob: f89ec4d70d4447e7d45c5caf325f53aefbafe845 [file] [log] [blame]
// Copyright 2019 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
package org.chromium.chrome.browser.night_mode;
import android.content.res.Configuration;
import org.chromium.base.ContextUtils;
import org.chromium.base.ObserverList;
import org.chromium.chrome.browser.ChromeApplication;
/**
* Observes and keeps a record of the system night mode state (i.e. the night mode from
* {@link ChromeApplication}).
*/
public class SystemNightModeMonitor {
private static SystemNightModeMonitor sInstance;
/** Interface for callback when system night mode is changed. */
public interface Observer {
/** Called when system night mode is changed. */
void onSystemNightModeChanged();
}
private final ObserverList<Observer> mObservers = new ObserverList<>();
private boolean mSystemNightModeOn;
/**
* @return The {@link SystemNightModeMonitor} that observes the system night mode state
* (i.e. the night mode from {@link ChromeApplication}).
*/
public static SystemNightModeMonitor getInstance() {
if (sInstance == null) {
sInstance = new SystemNightModeMonitor();
}
return sInstance;
}
private SystemNightModeMonitor() {
calculateSystemNightMode();
}
/** @return True if system night mode is on, and false otherwise. */
public boolean isSystemNightModeOn() {
return mSystemNightModeOn;
}
/** @param observer The {@link Observer} to be added for observing system night mode changes. */
public void addObserver(Observer observer) {
mObservers.addObserver(observer);
}
/**
* @param observer The {@link Observer} to be removed from observing system night mode changes.
*/
public void removeObserver(Observer observer) {
mObservers.removeObserver(observer);
}
/**
* Updates the system night mode state, and notifies observers if system night mode changes.
*/
public void onApplicationConfigurationChanged() {
final boolean oldNightMode = mSystemNightModeOn;
calculateSystemNightMode();
if (oldNightMode != mSystemNightModeOn) {
for (Observer observer : mObservers) observer.onSystemNightModeChanged();
}
}
private void calculateSystemNightMode() {
final int uiMode =
ContextUtils.getApplicationContext().getResources().getConfiguration().uiMode;
mSystemNightModeOn =
(uiMode & Configuration.UI_MODE_NIGHT_MASK) == Configuration.UI_MODE_NIGHT_YES;
}
}