Add support for user-selectable night mode

Adds a Material theme that automatically selects light or dark UI based
on the night mode resource qualifier.

Removes restriction that night mode only works when car mode is enabled
or the device is docked, which was applied inconsistently anyway and
only actually worked when in car mode (regardless of docked state).
Night mode is now always applied according to the system preference.

Change-Id: I526807c907eb29a2ab588d15932afe3e6ab180c2
This commit is contained in:
Alan Viverette
2015-02-12 11:01:06 -08:00
parent 5e789f03b2
commit 4cc1e9e707
10 changed files with 311 additions and 42 deletions

View File

@@ -2086,6 +2086,21 @@ package android {
field public static final int Theme_Light_Panel = 16973914; // 0x103005a
field public static final int Theme_Light_WallpaperSettings = 16973922; // 0x1030062
field public static final int Theme_Material = 16974372; // 0x1030224
field public static final int Theme_Material_DayNight = 16974548; // 0x10302d4
field public static final int Theme_Material_DayNight_DarkActionBar = 16974549; // 0x10302d5
field public static final int Theme_Material_DayNight_Dialog = 16974550; // 0x10302d6
field public static final int Theme_Material_DayNight_DialogWhenLarge = 16974556; // 0x10302dc
field public static final int Theme_Material_DayNight_DialogWhenLarge_NoActionBar = 16974557; // 0x10302dd
field public static final int Theme_Material_DayNight_Dialog_Alert = 16974551; // 0x10302d7
field public static final int Theme_Material_DayNight_Dialog_MinWidth = 16974552; // 0x10302d8
field public static final int Theme_Material_DayNight_Dialog_NoActionBar = 16974553; // 0x10302d9
field public static final int Theme_Material_DayNight_Dialog_NoActionBar_MinWidth = 16974554; // 0x10302da
field public static final int Theme_Material_DayNight_Dialog_Presentation = 16974555; // 0x10302db
field public static final int Theme_Material_DayNight_NoActionBar = 16974558; // 0x10302de
field public static final int Theme_Material_DayNight_NoActionBar_Fullscreen = 16974559; // 0x10302df
field public static final int Theme_Material_DayNight_NoActionBar_Overscan = 16974560; // 0x10302e0
field public static final int Theme_Material_DayNight_NoActionBar_TranslucentDecor = 16974561; // 0x10302e1
field public static final int Theme_Material_DayNight_Panel = 16974562; // 0x10302e2
field public static final int Theme_Material_Dialog = 16974373; // 0x1030225
field public static final int Theme_Material_DialogWhenLarge = 16974379; // 0x103022b
field public static final int Theme_Material_DialogWhenLarge_NoActionBar = 16974380; // 0x103022c

View File

@@ -2165,6 +2165,21 @@ package android {
field public static final int Theme_Light_Panel = 16973914; // 0x103005a
field public static final int Theme_Light_WallpaperSettings = 16973922; // 0x1030062
field public static final int Theme_Material = 16974372; // 0x1030224
field public static final int Theme_Material_DayNight = 16974548; // 0x10302d4
field public static final int Theme_Material_DayNight_DarkActionBar = 16974549; // 0x10302d5
field public static final int Theme_Material_DayNight_Dialog = 16974550; // 0x10302d6
field public static final int Theme_Material_DayNight_DialogWhenLarge = 16974556; // 0x10302dc
field public static final int Theme_Material_DayNight_DialogWhenLarge_NoActionBar = 16974557; // 0x10302dd
field public static final int Theme_Material_DayNight_Dialog_Alert = 16974551; // 0x10302d7
field public static final int Theme_Material_DayNight_Dialog_MinWidth = 16974552; // 0x10302d8
field public static final int Theme_Material_DayNight_Dialog_NoActionBar = 16974553; // 0x10302d9
field public static final int Theme_Material_DayNight_Dialog_NoActionBar_MinWidth = 16974554; // 0x10302da
field public static final int Theme_Material_DayNight_Dialog_Presentation = 16974555; // 0x10302db
field public static final int Theme_Material_DayNight_NoActionBar = 16974558; // 0x10302de
field public static final int Theme_Material_DayNight_NoActionBar_Fullscreen = 16974559; // 0x10302df
field public static final int Theme_Material_DayNight_NoActionBar_Overscan = 16974560; // 0x10302e0
field public static final int Theme_Material_DayNight_NoActionBar_TranslucentDecor = 16974561; // 0x10302e1
field public static final int Theme_Material_DayNight_Panel = 16974562; // 0x10302e2
field public static final int Theme_Material_Dialog = 16974373; // 0x1030225
field public static final int Theme_Material_DialogWhenLarge = 16974379; // 0x103022b
field public static final int Theme_Material_DialogWhenLarge_NoActionBar = 16974380; // 0x103022c

View File

@@ -219,10 +219,9 @@ public class UiModeManager {
}
/**
* Returns the currently configured night mode.
*
* @return {@link #MODE_NIGHT_NO}, {@link #MODE_NIGHT_YES}, or
* {@link #MODE_NIGHT_AUTO}. When an error occurred -1 is returned.
* @return the currently configured night mode. May be one of
* {@link #MODE_NIGHT_NO}, {@link #MODE_NIGHT_YES},
* {@link #MODE_NIGHT_AUTO}, or -1 on error.
*/
public int getNightMode() {
if (mService != null) {

View File

@@ -0,0 +1,112 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- Copyright (C) 2015 The Android Open Source Project
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
-->
<!--
===============================================================
PLEASE READ
===============================================================
The Material themes must not be modified in order to pass CTS.
Many related themes and styles depend on other values defined in this file.
If you would like to provide custom themes and styles for your device,
please see themes_device_defaults.xml.
===============================================================
PLEASE READ
===============================================================
-->
<resources>
<!-- Material theme (day/night version) for activities. -->
<style name="Theme.Material.DayNight" parent="Theme.Material" />
<!-- Variant of Material.DayNight that has a solid (opaque) action bar
with an inverse color profile. The dark action bar sharply stands out against
the light content (when applicable). -->
<style name="Theme.Material.DayNight.DarkActionBar" parent="Theme.Material" />
<!-- Variant of Material.DayNight with no action bar. -->
<style name="Theme.Material.DayNight.NoActionBar" parent="Theme.Material.NoActionBar" />
<!-- Variant of Material.DayNight that has no title bar and fills
the entire screen. This theme
sets {@link android.R.attr#windowFullscreen} to true. -->
<style name="Theme.Material.DayNight.NoActionBar.Fullscreen" parent="Theme.Material.NoActionBar.Fullscreen" />
<!-- Variant of Material.DayNight that has no title bar and fills
the entire screen and extends into the display overscan region. This theme
sets {@link android.R.attr#windowFullscreen} and {@link android.R.attr#windowOverscan}
to true. -->
<style name="Theme.Material.DayNight.NoActionBar.Overscan" parent="Theme.Material.NoActionBar.Overscan" />
<!-- Variant of Material.DayNight that has no title bar and translucent
system decor. This theme sets {@link android.R.attr#windowTranslucentStatus} and
{@link android.R.attr#windowTranslucentNavigation} to true. -->
<style name="Theme.Material.DayNight.NoActionBar.TranslucentDecor" parent="Theme.Material.NoActionBar.TranslucentDecor" />
<!-- Default Material.DayNight theme for panel windows. This removes all extraneous
window decorations, so you basically have an empty rectangle in which
to place your content. It makes the window floating, with a transparent
background, and turns off dimming behind the window. -->
<style name="Theme.Material.DayNight.Panel" parent="Theme.Material.Panel" />
<!-- Material theme (day/night version) for dialog windows and activities,
which is used by the {@link android.app.Dialog} class. This changes
the window to be floating (not fill the entire screen), and puts a
frame around its contents. You can set this theme on an activity if
you would like to make an activity that looks like a Dialog. -->
<style name="Theme.Material.DayNight.Dialog" parent="Theme.Material.DayNight.BaseDialog" />
<style name="Theme.Material.DayNight.BaseDialog" parent="Theme.Material.BaseDialog" />
<!-- Variant of Theme.Material.DayNight.Dialog that has a nice minimum width for
a regular dialog. -->
<style name="Theme.Material.DayNight.Dialog.MinWidth" parent="Theme.Material.Dialog.MinWidth" />
<!-- Variant of Theme.Material.DayNight.Dialog that does not include a title bar. -->
<style name="Theme.Material.DayNight.Dialog.NoActionBar" parent="Theme.Material.Dialog.NoActionBar" />
<!-- Variant of Theme.Material.DayNight.Dialog.NoActionBar that has a nice minimum width for
a regular dialog. -->
<style name="Theme.Material.DayNight.Dialog.NoActionBar.MinWidth" parent="Theme.Material.Dialog.NoActionBar.MinWidth" />
<!-- Variant of Theme.Material.DayNight.Dialog that has a fixed size. -->
<style name="Theme.Material.DayNight.Dialog.FixedSize" parent="Theme.Material.Dialog.FixedSize" />
<!-- Variant of Theme.Material.DayNight.Dialog.NoActionBar that has a fixed size. -->
<style name="Theme.Material.DayNight.Dialog.NoActionBar.FixedSize" parent="Theme.Material.Dialog.NoActionBar.FixedSize" />
<!-- Theme for a window that will be displayed either full-screen on
smaller screens (small, normal) or as a dialog on larger screens
(large, xlarge). -->
<style name="Theme.Material.DayNight.DialogWhenLarge" parent="Theme.Material.DialogWhenLarge" />
<!-- Theme for a window without an action bar that will be displayed either full-screen
on smaller screens (small, normal) or as a dialog on larger screens
(large, xlarge). -->
<style name="Theme.Material.DayNight.DialogWhenLarge.NoActionBar" parent="Theme.Material.DialogWhenLarge.NoActionBar" />
<!-- Theme for a presentation window on a secondary display. -->
<style name="Theme.Material.DayNight.Dialog.Presentation" parent="Theme.Material.Dialog.Presentation" />
<!-- Material user theme for alert dialog windows, which is used by the
{@link android.app.AlertDialog} class. -->
<style name="Theme.Material.DayNight.Dialog.Alert" parent="Theme.Material.DayNight.Dialog.BaseAlert" />
<style name="Theme.Material.DayNight.Dialog.BaseAlert" parent="Theme.Material.Dialog.BaseAlert" />
<style name="Theme.Material.DayNight.SearchBar" parent="Theme.Material.SearchBar" />
<style name="Theme.Material.DayNight.CompactMenu" parent="Theme.Material.CompactMenu" />
</resources>

View File

@@ -632,6 +632,14 @@
Any other values will have surprising consequences. -->
<integer name="config_defaultUiModeType">1</integer>
<!-- Control the default night mode to use when there is no other mode override set.
One of the following values (see UiModeManager.java):
0 - MODE_NIGHT_AUTO
1 - MODE_NIGHT_NO
2 - MODE_NIGHT_YES
-->
<integer name="config_defaultNightMode">1</integer>
<!-- Indicate whether to allow the device to suspend when the screen is off
due to the proximity sensor. This resource should only be set to true
if the sensor HAL correctly handles the proximity sensor as a wake-up source.

View File

@@ -2617,4 +2617,20 @@
<public type="style" name="Widget.Material.Button.Colored" />
<public type="style" name="Theme.Material.DayNight" />
<public type="style" name="Theme.Material.DayNight.DarkActionBar" />
<public type="style" name="Theme.Material.DayNight.Dialog" />
<public type="style" name="Theme.Material.DayNight.Dialog.Alert" />
<public type="style" name="Theme.Material.DayNight.Dialog.MinWidth" />
<public type="style" name="Theme.Material.DayNight.Dialog.NoActionBar" />
<public type="style" name="Theme.Material.DayNight.Dialog.NoActionBar.MinWidth" />
<public type="style" name="Theme.Material.DayNight.Dialog.Presentation" />
<public type="style" name="Theme.Material.DayNight.DialogWhenLarge" />
<public type="style" name="Theme.Material.DayNight.DialogWhenLarge.NoActionBar" />
<public type="style" name="Theme.Material.DayNight.NoActionBar" />
<public type="style" name="Theme.Material.DayNight.NoActionBar.Fullscreen" />
<public type="style" name="Theme.Material.DayNight.NoActionBar.Overscan" />
<public type="style" name="Theme.Material.DayNight.NoActionBar.TranslucentDecor" />
<public type="style" name="Theme.Material.DayNight.Panel" />
</resources>

View File

@@ -2167,4 +2167,5 @@
<java-symbol type="xml" name="bookmarks" />
<java-symbol type="integer" name="config_defaultNightMode" />
</resources>

View File

@@ -1238,8 +1238,7 @@ please see themes_device_defaults.xml.
</style>
<!-- Default theme for Settings and activities launched from Settings. -->
<style name="Theme.Material.Settings" parent="Theme.Material.Light.DarkActionBar">
<item name="colorBackground">@color/white</item>
<style name="Theme.Material.Settings" parent="Theme.Material.DayNight.DarkActionBar">
<item name="colorPrimary">@color/material_blue_grey_900</item>
<item name="colorPrimaryDark">@color/material_blue_grey_950</item>
<item name="colorAccent">@color/material_deep_teal_500</item>
@@ -1251,8 +1250,7 @@ please see themes_device_defaults.xml.
<item name="panelMenuListTheme">@style/Theme.Material.Settings.CompactMenu</item>
</style>
<style name="Theme.Material.Settings.BaseDialog" parent="Theme.Material.Light.BaseDialog">
<item name="colorBackground">@color/white</item>
<style name="Theme.Material.Settings.BaseDialog" parent="Theme.Material.DayNight.BaseDialog">
<item name="colorPrimary">@color/material_blue_grey_900</item>
<item name="colorPrimaryDark">@color/material_blue_grey_950</item>
<item name="colorAccent">@color/material_deep_teal_500</item>
@@ -1260,8 +1258,7 @@ please see themes_device_defaults.xml.
<style name="Theme.Material.Settings.Dialog" parent="Theme.Material.Settings.BaseDialog" />
<style name="Theme.Material.Settings.Dialog.BaseAlert" parent="Theme.Material.Light.Dialog.BaseAlert">
<item name="colorBackground">@color/white</item>
<style name="Theme.Material.Settings.Dialog.BaseAlert" parent="Theme.Material.DayNight.Dialog.BaseAlert">
<item name="colorPrimary">@color/material_blue_grey_900</item>
<item name="colorPrimaryDark">@color/material_blue_grey_950</item>
<item name="colorAccent">@color/material_deep_teal_500</item>
@@ -1269,22 +1266,19 @@ please see themes_device_defaults.xml.
<style name="Theme.Material.Settings.Dialog.Alert" parent="Theme.Material.Settings.Dialog.BaseAlert" />
<style name="Theme.Material.Settings.Dialog.Presentation" parent="Theme.Material.Light.Dialog.Presentation">
<item name="colorBackground">@color/white</item>
<style name="Theme.Material.Settings.Dialog.Presentation" parent="Theme.Material.DayNight.Dialog.Presentation">
<item name="colorPrimary">@color/material_blue_grey_900</item>
<item name="colorPrimaryDark">@color/material_blue_grey_950</item>
<item name="colorAccent">@color/material_deep_teal_500</item>
</style>
<style name="Theme.Material.Settings.SearchBar" parent="Theme.Material.Light.SearchBar">
<item name="colorBackground">@color/white</item>
<style name="Theme.Material.Settings.SearchBar" parent="Theme.Material.DayNight.SearchBar">
<item name="colorPrimary">@color/material_blue_grey_900</item>
<item name="colorPrimaryDark">@color/material_blue_grey_950</item>
<item name="colorAccent">@color/material_deep_teal_500</item>
</style>
<style name="Theme.Material.Settings.CompactMenu" parent="Theme.Material.Light.CompactMenu">
<item name="colorBackground">@color/white</item>
<style name="Theme.Material.Settings.CompactMenu" parent="Theme.Material.DayNight.CompactMenu">
<item name="colorPrimary">@color/material_blue_grey_900</item>
<item name="colorPrimaryDark">@color/material_blue_grey_950</item>
<item name="colorAccent">@color/material_deep_teal_500</item>

View File

@@ -0,0 +1,112 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- Copyright (C) 2015 The Android Open Source Project
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
-->
<!--
===============================================================
PLEASE READ
===============================================================
The Material themes must not be modified in order to pass CTS.
Many related themes and styles depend on other values defined in this file.
If you would like to provide custom themes and styles for your device,
please see themes_device_defaults.xml.
===============================================================
PLEASE READ
===============================================================
-->
<resources>
<!-- Material theme (day/night vesion) for activities. -->
<style name="Theme.Material.DayNight" parent="Theme.Material.Light" />
<!-- Variant of Material.DayNight that has a solid (opaque) action bar
with an inverse color profile. The dark action bar sharply stands out against
the light content (when applicable). -->
<style name="Theme.Material.DayNight.DarkActionBar" parent="Theme.Material.Light.DarkActionBar" />
<!-- Variant of Material.DayNight with no action bar. -->
<style name="Theme.Material.DayNight.NoActionBar" parent="Theme.Material.Light.NoActionBar" />
<!-- Variant of Material.DayNight that has no title bar and fills
the entire screen. This theme
sets {@link android.R.attr#windowFullscreen} to true. -->
<style name="Theme.Material.DayNight.NoActionBar.Fullscreen" parent="Theme.Material.Light.NoActionBar.Fullscreen" />
<!-- Variant of Material.DayNight that has no title bar and fills
the entire screen and extends into the display overscan region. This theme
sets {@link android.R.attr#windowFullscreen} and {@link android.R.attr#windowOverscan}
to true. -->
<style name="Theme.Material.DayNight.NoActionBar.Overscan" parent="Theme.Material.Light.NoActionBar.Overscan" />
<!-- Variant of Material.DayNight that has no title bar and translucent
system decor. This theme sets {@link android.R.attr#windowTranslucentStatus} and
{@link android.R.attr#windowTranslucentNavigation} to true. -->
<style name="Theme.Material.DayNight.NoActionBar.TranslucentDecor" parent="Theme.Material.Light.NoActionBar.TranslucentDecor" />
<!-- Default Material.DayNight theme for panel windows. This removes all extraneous
window decorations, so you basically have an empty rectangle in which
to place your content. It makes the window floating, with a transparent
background, and turns off dimming behind the window. -->
<style name="Theme.Material.DayNight.Panel" parent="Theme.Material.Light.Panel" />
<!-- Material theme (day/night vesion) for dialog windows and activities,
which is used by the {@link android.app.Dialog} class. This changes
the window to be floating (not fill the entire screen), and puts a
frame around its contents. You can set this theme on an activity if
you would like to make an activity that looks like a Dialog. -->
<style name="Theme.Material.DayNight.Dialog" parent="Theme.Material.DayNight.BaseDialog" />
<style name="Theme.Material.DayNight.BaseDialog" parent="Theme.Material.Light.BaseDialog" />
<!-- Variant of Theme.Material.DayNight.Dialog that has a nice minimum width for
a regular dialog. -->
<style name="Theme.Material.DayNight.Dialog.MinWidth" parent="Theme.Material.Light.Dialog.MinWidth" />
<!-- Variant of Theme.Material.DayNight.Dialog that does not include a title bar. -->
<style name="Theme.Material.DayNight.Dialog.NoActionBar" parent="Theme.Material.Light.Dialog.NoActionBar" />
<!-- Variant of Theme.Material.DayNight.Dialog.NoActionBar that has a nice minimum width for
a regular dialog. -->
<style name="Theme.Material.DayNight.Dialog.NoActionBar.MinWidth" parent="Theme.Material.Light.Dialog.NoActionBar.MinWidth" />
<!-- Variant of Theme.Material.DayNight.Dialog that has a fixed size. -->
<style name="Theme.Material.DayNight.Dialog.FixedSize" parent="Theme.Material.Light.Dialog.FixedSize" />
<!-- Variant of Theme.Material.DayNight.Dialog.NoActionBar that has a fixed size. -->
<style name="Theme.Material.DayNight.Dialog.NoActionBar.FixedSize" parent="Theme.Material.Light.Dialog.NoActionBar.FixedSize" />
<!-- Theme for a window that will be displayed either full-screen on
smaller screens (small, normal) or as a dialog on larger screens
(large, xlarge). -->
<style name="Theme.Material.DayNight.DialogWhenLarge" parent="Theme.Material.Light.DialogWhenLarge" />
<!-- Theme for a window without an action bar that will be displayed either full-screen
on smaller screens (small, normal) or as a dialog on larger screens
(large, xlarge). -->
<style name="Theme.Material.DayNight.DialogWhenLarge.NoActionBar" parent="Theme.Material.Light.DialogWhenLarge.NoActionBar" />
<!-- Theme for a presentation window on a secondary display. -->
<style name="Theme.Material.DayNight.Dialog.Presentation" parent="Theme.Material.Light.Dialog.Presentation" />
<!-- Material user theme for alert dialog windows, which is used by the
{@link android.app.AlertDialog} class. -->
<style name="Theme.Material.DayNight.Dialog.Alert" parent="Theme.Material.DayNight.Dialog.BaseAlert" />
<style name="Theme.Material.DayNight.Dialog.BaseAlert" parent="Theme.Material.Light.Dialog.BaseAlert" />
<style name="Theme.Material.DayNight.SearchBar" parent="Theme.Material.Light.SearchBar" />
<style name="Theme.Material.DayNight.CompactMenu" parent="Theme.Material.Light.CompactMenu" />
</resources>

View File

@@ -31,6 +31,7 @@ import android.content.Intent;
import android.content.IntentFilter;
import android.content.pm.PackageManager;
import android.content.res.Configuration;
import android.content.res.Resources;
import android.os.BatteryManager;
import android.os.Binder;
import android.os.Handler;
@@ -63,7 +64,7 @@ final class UiModeManagerService extends SystemService {
private int mDockState = Intent.EXTRA_DOCK_STATE_UNDOCKED;
private int mLastBroadcastState = Intent.EXTRA_DOCK_STATE_UNDOCKED;
int mNightMode = UiModeManager.MODE_NIGHT_NO;
private int mNightMode = UiModeManager.MODE_NIGHT_NO;
private boolean mCarModeEnabled = false;
private boolean mCharging = false;
@@ -157,6 +158,7 @@ final class UiModeManagerService extends SystemService {
public void onStart() {
final Context context = getContext();
mTwilightManager = getLocalService(TwilightManager.class);
final PowerManager powerManager =
(PowerManager) context.getSystemService(Context.POWER_SERVICE);
mWakeLock = powerManager.newWakeLock(PowerManager.FULL_WAKE_LOCK, TAG);
@@ -168,20 +170,23 @@ final class UiModeManagerService extends SystemService {
mConfiguration.setToDefaults();
mDefaultUiModeType = context.getResources().getInteger(
final Resources res = context.getResources();
mDefaultUiModeType = res.getInteger(
com.android.internal.R.integer.config_defaultUiModeType);
mCarModeKeepsScreenOn = (context.getResources().getInteger(
mCarModeKeepsScreenOn = (res.getInteger(
com.android.internal.R.integer.config_carDockKeepsScreenOn) == 1);
mDeskModeKeepsScreenOn = (context.getResources().getInteger(
mDeskModeKeepsScreenOn = (res.getInteger(
com.android.internal.R.integer.config_deskDockKeepsScreenOn) == 1);
mTelevision = context.getPackageManager().hasSystemFeature(
PackageManager.FEATURE_TELEVISION) ||
context.getPackageManager().hasSystemFeature(
PackageManager.FEATURE_LEANBACK);
mWatch = context.getPackageManager().hasSystemFeature(PackageManager.FEATURE_WATCH);
final PackageManager pm = context.getPackageManager();
mTelevision = pm.hasSystemFeature(PackageManager.FEATURE_TELEVISION)
|| pm.hasSystemFeature(PackageManager.FEATURE_LEANBACK);
mWatch = pm.hasSystemFeature(PackageManager.FEATURE_WATCH);
final int defaultNightMode = res.getInteger(
com.android.internal.R.integer.config_defaultNightMode);
mNightMode = Settings.Secure.getInt(context.getContentResolver(),
Settings.Secure.UI_NIGHT_MODE, UiModeManager.MODE_NIGHT_AUTO);
Settings.Secure.UI_NIGHT_MODE, defaultNightMode);
mTwilightManager.registerListener(mTwilightListener, mHandler);
@@ -245,7 +250,7 @@ final class UiModeManagerService extends SystemService {
final long ident = Binder.clearCallingIdentity();
try {
synchronized (mLock) {
if (isDoingNightModeLocked() && mNightMode != mode) {
if (mNightMode != mode) {
Settings.Secure.putInt(getContext().getContentResolver(),
Settings.Secure.UI_NIGHT_MODE, mode);
mNightMode = mode;
@@ -309,10 +314,6 @@ final class UiModeManagerService extends SystemService {
}
}
boolean isDoingNightModeLocked() {
return mCarModeEnabled || mDockState != Intent.EXTRA_DOCK_STATE_UNDOCKED;
}
void setCarModeLocked(boolean enabled, int flags) {
if (mCarModeEnabled != enabled) {
mCarModeEnabled = enabled;
@@ -354,17 +355,13 @@ final class UiModeManagerService extends SystemService {
} else if (isDeskDockState(mDockState)) {
uiMode = Configuration.UI_MODE_TYPE_DESK;
}
if (mCarModeEnabled) {
if (mNightMode == UiModeManager.MODE_NIGHT_AUTO) {
updateComputedNightModeLocked();
uiMode |= mComputedNightMode ? Configuration.UI_MODE_NIGHT_YES
: Configuration.UI_MODE_NIGHT_NO;
} else {
uiMode |= mNightMode << 4;
}
if (mNightMode == UiModeManager.MODE_NIGHT_AUTO) {
updateComputedNightModeLocked();
uiMode |= mComputedNightMode ? Configuration.UI_MODE_NIGHT_YES
: Configuration.UI_MODE_NIGHT_NO;
} else {
// Disabling the car mode clears the night mode.
uiMode = (uiMode & ~Configuration.UI_MODE_NIGHT_MASK) | Configuration.UI_MODE_NIGHT_NO;
uiMode |= mNightMode << 4;
}
if (LOG) {
@@ -618,7 +615,7 @@ final class UiModeManagerService extends SystemService {
void updateTwilight() {
synchronized (mLock) {
if (isDoingNightModeLocked() && mNightMode == UiModeManager.MODE_NIGHT_AUTO) {
if (mNightMode == UiModeManager.MODE_NIGHT_AUTO) {
updateComputedNightModeLocked();
updateLocked(0, 0);
}