Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 15d85546 authored by Jay Aliomer's avatar Jay Aliomer
Browse files

Custom dark theme scheduling

allows the use to set the start and end automatic dark theme
activation within a day.
Fixes: 147649309
Test: atest UiModeManagerServiceTest UiModeManagerTest
Change-Id: Iaa3593d4e8863412e3703ce9f089b88dd4df1225
parent 310f576b
Loading
Loading
Loading
Loading
+6 −0
Original line number Diff line number Diff line
@@ -6470,7 +6470,11 @@ package android.app {
    method public void disableCarMode(int);
    method public void enableCarMode(int);
    method public int getCurrentModeType();
    method @NonNull public java.time.LocalTime getCustomNightModeEnd();
    method @NonNull public java.time.LocalTime getCustomNightModeStart();
    method public int getNightMode();
    method public void setCustomNightModeEnd(@NonNull java.time.LocalTime);
    method public void setCustomNightModeStart(@NonNull java.time.LocalTime);
    method public void setNightMode(int);
    field public static String ACTION_ENTER_CAR_MODE;
    field public static String ACTION_ENTER_DESK_MODE;
@@ -6480,6 +6484,7 @@ package android.app {
    field public static final int ENABLE_CAR_MODE_ALLOW_SLEEP = 2; // 0x2
    field public static final int ENABLE_CAR_MODE_GO_CAR_HOME = 1; // 0x1
    field public static final int MODE_NIGHT_AUTO = 0; // 0x0
    field public static final int MODE_NIGHT_CUSTOM = 3; // 0x3
    field public static final int MODE_NIGHT_NO = 1; // 0x1
    field public static final int MODE_NIGHT_YES = 2; // 0x2
  }
@@ -50559,6 +50564,7 @@ package android.util {
    method public static java.util.TimeZone getTimeZone(int, boolean, long, String);
    method public static String getTimeZoneDatabaseVersion();
    method @Nullable public static java.util.List<java.lang.String> getTimeZoneIdsForCountryCode(@NonNull String);
    method public static boolean isTimeBetween(@NonNull java.time.LocalTime, @NonNull java.time.LocalTime, @NonNull java.time.LocalTime);
  }
  @Deprecated public class TimingLogger {
+91 −31
Original line number Diff line number Diff line
// Baseline format: 1.0
AcronymName: android.net.NetworkCapabilities#setSSID(String):
    Acronyms should not be capitalized in method names: was `setSSID`, should this be `setSsid`?


ActionValue: android.location.Location#EXTRA_NO_GPS_LOCATION:
    
ActionValue: android.net.wifi.WifiManager#ACTION_LINK_CONFIGURATION_CHANGED:
    Inconsistent action value; expected `android.net.wifi.action.LINK_CONFIGURATION_CHANGED`, was `android.net.wifi.LINK_CONFIGURATION_CHANGED`
    


ArrayReturn: android.bluetooth.BluetoothCodecStatus#BluetoothCodecStatus(android.bluetooth.BluetoothCodecConfig, android.bluetooth.BluetoothCodecConfig[], android.bluetooth.BluetoothCodecConfig[]) parameter #1:
    Method parameter should be Collection<BluetoothCodecConfig> (or subclass) instead of raw array; was `android.bluetooth.BluetoothCodecConfig[]`
ArrayReturn: android.bluetooth.BluetoothCodecStatus#BluetoothCodecStatus(android.bluetooth.BluetoothCodecConfig, android.bluetooth.BluetoothCodecConfig[], android.bluetooth.BluetoothCodecConfig[]) parameter #2:
    Method parameter should be Collection<BluetoothCodecConfig> (or subclass) instead of raw array; was `android.bluetooth.BluetoothCodecConfig[]`
ArrayReturn: android.bluetooth.BluetoothCodecStatus#getCodecsLocalCapabilities():
    Method should return Collection<BluetoothCodecConfig> (or subclass) instead of raw array; was `android.bluetooth.BluetoothCodecConfig[]`
ArrayReturn: android.bluetooth.BluetoothCodecStatus#getCodecsSelectableCapabilities():
    Method should return Collection<BluetoothCodecConfig> (or subclass) instead of raw array; was `android.bluetooth.BluetoothCodecConfig[]`
ArrayReturn: android.bluetooth.BluetoothUuid#containsAnyUuid(android.os.ParcelUuid[], android.os.ParcelUuid[]) parameter #0:
    Method parameter should be Collection<ParcelUuid> (or subclass) instead of raw array; was `android.os.ParcelUuid[]`
ArrayReturn: android.bluetooth.BluetoothUuid#containsAnyUuid(android.os.ParcelUuid[], android.os.ParcelUuid[]) parameter #1:
    Method parameter should be Collection<ParcelUuid> (or subclass) instead of raw array; was `android.os.ParcelUuid[]`
ArrayReturn: android.media.tv.tuner.Tuner.FilterCallback#onFilterEvent(android.media.tv.tuner.Tuner.Filter, android.media.tv.tuner.filter.FilterEvent[]) parameter #1:
    Method parameter should be Collection<FilterEvent> (or subclass) instead of raw array; was `android.media.tv.tuner.filter.FilterEvent[]`
ArrayReturn: android.net.NetworkScoreManager#requestScores(android.net.NetworkKey[]) parameter #0:
    Method parameter should be Collection<NetworkKey> (or subclass) instead of raw array; was `android.net.NetworkKey[]`
ArrayReturn: android.view.contentcapture.ViewNode#getAutofillOptions():
    


ExecutorRegistration: android.net.wifi.p2p.WifiP2pManager#deletePersistentGroup(android.net.wifi.p2p.WifiP2pManager.Channel, int, android.net.wifi.p2p.WifiP2pManager.ActionListener):
    Registration methods should have overload that accepts delivery Executor: `deletePersistentGroup`
    
ExecutorRegistration: android.net.wifi.p2p.WifiP2pManager#factoryReset(android.net.wifi.p2p.WifiP2pManager.Channel, android.net.wifi.p2p.WifiP2pManager.ActionListener):
    Registration methods should have overload that accepts delivery Executor: `factoryReset`
    
ExecutorRegistration: android.net.wifi.p2p.WifiP2pManager#listen(android.net.wifi.p2p.WifiP2pManager.Channel, boolean, android.net.wifi.p2p.WifiP2pManager.ActionListener):
    Registration methods should have overload that accepts delivery Executor: `listen`
    
ExecutorRegistration: android.net.wifi.p2p.WifiP2pManager#requestPersistentGroupInfo(android.net.wifi.p2p.WifiP2pManager.Channel, android.net.wifi.p2p.WifiP2pManager.PersistentGroupInfoListener):
    Registration methods should have overload that accepts delivery Executor: `requestPersistentGroupInfo`
    
ExecutorRegistration: android.net.wifi.p2p.WifiP2pManager#setDeviceName(android.net.wifi.p2p.WifiP2pManager.Channel, String, android.net.wifi.p2p.WifiP2pManager.ActionListener):
    Registration methods should have overload that accepts delivery Executor: `setDeviceName`
    
ExecutorRegistration: android.net.wifi.p2p.WifiP2pManager#setWfdInfo(android.net.wifi.p2p.WifiP2pManager.Channel, android.net.wifi.p2p.WifiP2pWfdInfo, android.net.wifi.p2p.WifiP2pManager.ActionListener):
    Registration methods should have overload that accepts delivery Executor: `setWfdInfo`
    
ExecutorRegistration: android.net.wifi.p2p.WifiP2pManager#setWifiP2pChannels(android.net.wifi.p2p.WifiP2pManager.Channel, int, int, android.net.wifi.p2p.WifiP2pManager.ActionListener):
    Registration methods should have overload that accepts delivery Executor: `setWifiP2pChannels`
    
HeavyBitSet: android.net.wifi.wificond.NativeScanResult#getCapabilities():
    Type must not be heavy BitSet (method android.net.wifi.wificond.NativeScanResult.getCapabilities())
PairedRegistration: android.net.wifi.wificond.WifiCondManager#registerApCallback(String, java.util.concurrent.Executor, android.net.wifi.wificond.WifiCondManager.SoftApCallback):
    Found registerApCallback but not unregisterApCallback in android.net.wifi.wificond.WifiCondManager


GenericException: android.app.prediction.AppPredictor#finalize():
@@ -40,13 +55,22 @@ GenericException: android.service.autofill.augmented.FillWindow#finalize():
    


HeavyBitSet: android.net.wifi.wificond.NativeScanResult#getCapabilities():
    


IntentBuilderName: android.content.Context#registerReceiverForAllUsers(android.content.BroadcastReceiver, android.content.IntentFilter, String, android.os.Handler):
    Methods creating an Intent should be named `create<Foo>Intent()`, was `registerReceiverForAllUsers`


KotlinKeyword: android.app.Notification#when:
    


KotlinOperator: android.telephony.CbGeoUtils.Geometry#contains(android.telephony.CbGeoUtils.LatLng):
    Method can be invoked as a "in" operator from Kotlin: `contains` (this is usually desirable; just make sure it makes sense for this type of object)


MissingNullability: android.hardware.soundtrigger.SoundTrigger.ModuleProperties#toString():
    
MissingNullability: android.hardware.soundtrigger.SoundTrigger.ModuleProperties#writeToParcel(android.os.Parcel, int) parameter #0:
@@ -157,43 +181,60 @@ MissingNullability: android.telephony.mbms.DownloadRequest.Builder#setServiceId(
    



MutableBareField: android.net.IpConfiguration#httpProxy:
    Bare field httpProxy must be marked final, or moved behind accessors if mutable
    
MutableBareField: android.net.IpConfiguration#ipAssignment:
    Bare field ipAssignment must be marked final, or moved behind accessors if mutable
    
MutableBareField: android.net.IpConfiguration#proxySettings:
    Bare field proxySettings must be marked final, or moved behind accessors if mutable
    
MutableBareField: android.net.IpConfiguration#staticIpConfiguration:
    Bare field staticIpConfiguration must be marked final, or moved behind accessors if mutable
    
MutableBareField: android.net.wifi.WifiConfiguration#allowAutojoin:
    
MutableBareField: android.net.wifi.WifiConfiguration#apBand:
    Bare field apBand must be marked final, or moved behind accessors if mutable
    
MutableBareField: android.net.wifi.WifiConfiguration#carrierId:
    
MutableBareField: android.net.wifi.WifiConfiguration#fromWifiNetworkSpecifier:
    Bare field fromWifiNetworkSpecifier must be marked final, or moved behind accessors if mutable
    
MutableBareField: android.net.wifi.WifiConfiguration#fromWifiNetworkSuggestion:
    Bare field fromWifiNetworkSuggestion must be marked final, or moved behind accessors if mutable
    
MutableBareField: android.net.wifi.WifiConfiguration#macRandomizationSetting:
    Bare field macRandomizationSetting must be marked final, or moved behind accessors if mutable
    
MutableBareField: android.net.wifi.WifiConfiguration#meteredOverride:
    Bare field meteredOverride must be marked final, or moved behind accessors if mutable
    
MutableBareField: android.net.wifi.WifiConfiguration#requirePMF:
    Bare field requirePMF must be marked final, or moved behind accessors if mutable
    
MutableBareField: android.net.wifi.WifiConfiguration#saePasswordId:
    Bare field saePasswordId must be marked final, or moved behind accessors if mutable
    
MutableBareField: android.net.wifi.WifiConfiguration#shared:
    Bare field shared must be marked final, or moved behind accessors if mutable
    
MutableBareField: android.net.wifi.WifiScanner.ScanSettings#type:
    Bare field type must be marked final, or moved behind accessors if mutable
    


NoClone: android.service.contentcapture.ContentCaptureService#dump(java.io.FileDescriptor, java.io.PrintWriter, String[]) parameter #0:
    


NotCloseable: android.bluetooth.BluetoothA2dpSink:
    Classes that release resources (finalize()) should implement AutoClosable and CloseGuard: class android.bluetooth.BluetoothA2dpSink
NotCloseable: android.bluetooth.BluetoothMap:
    Classes that release resources (finalize()) should implement AutoClosable and CloseGuard: class android.bluetooth.BluetoothMap
NotCloseable: android.bluetooth.BluetoothPan:
    Classes that release resources (finalize()) should implement AutoClosable and CloseGuard: class android.bluetooth.BluetoothPan
NotCloseable: android.bluetooth.BluetoothPbap:
    Classes that release resources (finalize()) should implement AutoClosable and CloseGuard: class android.bluetooth.BluetoothPbap


OnNameExpected: android.content.ContentProvider#checkUriPermission(android.net.Uri, int, int):
    If implemented by developer, should follow the on<Something> style; otherwise consider marking final


PairedRegistration: android.net.wifi.wificond.WifiCondManager#registerApCallback(String, java.util.concurrent.Executor, android.net.wifi.wificond.WifiCondManager.SoftApCallback):
    


ProtectedMember: android.printservice.recommendation.RecommendationService#attachBaseContext(android.content.Context):
    
ProtectedMember: android.service.contentcapture.ContentCaptureService#dump(java.io.FileDescriptor, java.io.PrintWriter, String[]):
@@ -201,6 +242,7 @@ ProtectedMember: android.service.contentcapture.ContentCaptureService#dump(java.
ProtectedMember: android.service.notification.NotificationAssistantService#attachBaseContext(android.content.Context):
    


SamShouldBeLast: android.accounts.AccountManager#addAccount(String, String, String[], android.os.Bundle, android.app.Activity, android.accounts.AccountManagerCallback<android.os.Bundle>, android.os.Handler):
    
SamShouldBeLast: android.accounts.AccountManager#addOnAccountsUpdatedListener(android.accounts.OnAccountsUpdateListener, android.os.Handler, boolean):
@@ -247,6 +289,8 @@ SamShouldBeLast: android.app.AlarmManager#setWindow(int, long, long, String, and
    
SamShouldBeLast: android.app.WallpaperInfo#dump(android.util.Printer, String):
    
SamShouldBeLast: android.app.WallpaperManager#addOnColorsChangedListener(android.app.WallpaperManager.OnColorsChangedListener, android.os.Handler):
    SAM-compatible parameters (such as parameter 1, "listener", in android.app.WallpaperManager.addOnColorsChangedListener) should be last to improve Kotlin interoperability; see https://kotlinlang.org/docs/reference/java-interop.html#sam-conversions
SamShouldBeLast: android.app.admin.DevicePolicyManager#installSystemUpdate(android.content.ComponentName, android.net.Uri, java.util.concurrent.Executor, android.app.admin.DevicePolicyManager.InstallSystemUpdateCallback):
    
SamShouldBeLast: android.content.Context#bindIsolatedService(android.content.Intent, int, String, java.util.concurrent.Executor, android.content.ServiceConnection):
@@ -279,12 +323,20 @@ SamShouldBeLast: android.location.LocationManager#registerGnssNavigationMessageC
    
SamShouldBeLast: android.location.LocationManager#registerGnssStatusCallback(java.util.concurrent.Executor, android.location.GnssStatus.Callback):
    
SamShouldBeLast: android.location.LocationManager#requestLocationUpdates(String, long, float, android.location.LocationListener, android.os.Looper):
    SAM-compatible parameters (such as parameter 4, "listener", in android.location.LocationManager.requestLocationUpdates) should be last to improve Kotlin interoperability; see https://kotlinlang.org/docs/reference/java-interop.html#sam-conversions
SamShouldBeLast: android.location.LocationManager#requestLocationUpdates(String, long, float, java.util.concurrent.Executor, android.location.LocationListener):
    
SamShouldBeLast: android.location.LocationManager#requestLocationUpdates(android.location.LocationRequest, java.util.concurrent.Executor, android.location.LocationListener):
    
SamShouldBeLast: android.location.LocationManager#requestLocationUpdates(long, float, android.location.Criteria, android.location.LocationListener, android.os.Looper):
    SAM-compatible parameters (such as parameter 4, "listener", in android.location.LocationManager.requestLocationUpdates) should be last to improve Kotlin interoperability; see https://kotlinlang.org/docs/reference/java-interop.html#sam-conversions
SamShouldBeLast: android.location.LocationManager#requestLocationUpdates(long, float, android.location.Criteria, java.util.concurrent.Executor, android.location.LocationListener):
    
SamShouldBeLast: android.location.LocationManager#requestSingleUpdate(String, android.location.LocationListener, android.os.Looper):
    SAM-compatible parameters (such as parameter 2, "listener", in android.location.LocationManager.requestSingleUpdate) should be last to improve Kotlin interoperability; see https://kotlinlang.org/docs/reference/java-interop.html#sam-conversions
SamShouldBeLast: android.location.LocationManager#requestSingleUpdate(android.location.Criteria, android.location.LocationListener, android.os.Looper):
    SAM-compatible parameters (such as parameter 2, "listener", in android.location.LocationManager.requestSingleUpdate) should be last to improve Kotlin interoperability; see https://kotlinlang.org/docs/reference/java-interop.html#sam-conversions
SamShouldBeLast: android.media.AudioFocusRequest.Builder#setOnAudioFocusChangeListener(android.media.AudioManager.OnAudioFocusChangeListener, android.os.Handler):
    
SamShouldBeLast: android.media.AudioManager#requestAudioFocus(android.media.AudioManager.OnAudioFocusChangeListener, int, int):
@@ -445,3 +497,11 @@ ServiceName: android.Manifest.permission#REQUEST_NOTIFICATION_ASSISTANT_SERVICE:
    
ServiceName: android.provider.DeviceConfig#NAMESPACE_PACKAGE_MANAGER_SERVICE:
    


UserHandle: android.companion.CompanionDeviceManager#isDeviceAssociated(String, android.net.MacAddress, android.os.UserHandle):
    When a method overload is needed to target a specific UserHandle, callers should be directed to use Context.createPackageContextAsUser() and re-obtain the relevant Manager, and no new API should be added


UserHandleName: android.telephony.CellBroadcastIntents#sendOrderedBroadcastForBackgroundReceivers(android.content.Context, android.os.UserHandle, android.content.Intent, String, String, android.content.BroadcastReceiver, android.os.Handler, int, String, android.os.Bundle):
    Method taking UserHandle should be named `doFooAsUser` or `queryFooForUser`, was `sendOrderedBroadcastForBackgroundReceivers`
+21 −1
Original line number Diff line number Diff line
@@ -70,7 +70,27 @@ interface IUiModeManager {
    boolean isNightModeLocked();

    /**
    * @hide
    * [De]Activates night mode
    */
    boolean setNightModeActivated(boolean active);

    /**
    * Returns custom start clock time
    */
    long getCustomNightModeStart();

    /**
    * Sets custom start clock time
    */
    void setCustomNightModeStart(long time);

    /**
    * Returns custom end clock time
    */
    long getCustomNightModeEnd();

    /**
    * Sets custom end clock time
    */
    void setCustomNightModeEnd(long time);
}
+87 −4
Original line number Diff line number Diff line
@@ -18,6 +18,7 @@ package android.app;

import android.annotation.IntDef;
import android.annotation.IntRange;
import android.annotation.NonNull;
import android.annotation.Nullable;
import android.annotation.RequiresPermission;
import android.annotation.SystemApi;
@@ -32,6 +33,7 @@ import android.os.ServiceManager.ServiceNotFoundException;

import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.time.LocalTime;

/**
 * This class provides access to the system uimode services.  These services
@@ -163,6 +165,7 @@ public class UiModeManager {
    /** @hide */
    @IntDef(prefix = { "MODE_" }, value = {
            MODE_NIGHT_AUTO,
            MODE_NIGHT_CUSTOM,
            MODE_NIGHT_NO,
            MODE_NIGHT_YES
    })
@@ -173,19 +176,25 @@ public class UiModeManager {
     * Constant for {@link #setNightMode(int)} and {@link #getNightMode()}:
     * automatically switch night mode on and off based on the time.
     */
    public static final int MODE_NIGHT_AUTO = Configuration.UI_MODE_NIGHT_UNDEFINED >> 4;
    public static final int MODE_NIGHT_AUTO = 0;

    /**
     * Constant for {@link #setNightMode(int)} and {@link #getNightMode()}:
     * automatically switch night mode on and off based on the time.
     */
    public static final int MODE_NIGHT_CUSTOM = 3;
    
    /**
     * Constant for {@link #setNightMode(int)} and {@link #getNightMode()}:
     * never run in night mode.
     */
    public static final int MODE_NIGHT_NO = Configuration.UI_MODE_NIGHT_NO >> 4;
    public static final int MODE_NIGHT_NO = 1;
    
    /**
     * Constant for {@link #setNightMode(int)} and {@link #getNightMode()}:
     * always run in night mode.
     */
    public static final int MODE_NIGHT_YES = Configuration.UI_MODE_NIGHT_YES >> 4;
    public static final int MODE_NIGHT_YES = 2;

    private IUiModeManager mService;

@@ -377,6 +386,8 @@ public class UiModeManager {
     *       {@code notnight} mode</li>
     *   <li><em>{@link #MODE_NIGHT_YES}</em> sets the device into
     *       {@code night} mode</li>
     *   <li><em>{@link #MODE_NIGHT_CUSTOM}</em> automatically switches between
     *       {@code night} and {@code notnight} based on the custom time set (or default)</li>
     *   <li><em>{@link #MODE_NIGHT_AUTO}</em> automatically switches between
     *       {@code night} and {@code notnight} based on the device's current
     *       location and certain other sensors</li>
@@ -418,6 +429,7 @@ public class UiModeManager {
     *   <li>{@link #MODE_NIGHT_NO}</li>
     *   <li>{@link #MODE_NIGHT_YES}</li>
     *   <li>{@link #MODE_NIGHT_AUTO}</li>
     *   <li>{@link #MODE_NIGHT_CUSTOM}</li>
     *   <li>{@code -1} on error</li>
     * </ul>
     *
@@ -475,7 +487,7 @@ public class UiModeManager {
    }

    /**
     * @hide*
     * @hide
     */
    public boolean setNightModeActivated(boolean active) {
        if (mService != null) {
@@ -487,4 +499,75 @@ public class UiModeManager {
        }
        return false;
    }

    /**
     * Returns the time of the day Dark theme activates
     * <p>
     * When night mode is {@link #MODE_NIGHT_CUSTOM}, the system uses
     * this time set to activate it automatically.
     */
    @NonNull
    public LocalTime getCustomNightModeStart() {
        if (mService != null) {
            try {
                return LocalTime.ofNanoOfDay(mService.getCustomNightModeStart() * 1000);
            } catch (RemoteException e) {
                throw e.rethrowFromSystemServer();
            }
        }
        return LocalTime.MIDNIGHT;
    }

    /**
     * Sets the time of the day Dark theme activates
     * <p>
     * When night mode is {@link #MODE_NIGHT_CUSTOM}, the system uses
     * this time set to activate it automatically
     * @param time The time of the day Dark theme should activate
     */
    public void setCustomNightModeStart(@NonNull LocalTime time) {
        if (mService != null) {
            try {
                mService.setCustomNightModeStart(time.toNanoOfDay() / 1000);
            } catch (RemoteException e) {
                throw e.rethrowFromSystemServer();
            }
        }
    }

    /**
     * Returns the time of the day Dark theme deactivates
     * <p>
     * When night mode is {@link #MODE_NIGHT_CUSTOM}, the system uses
     * this time set to deactivate it automatically.
     */
    @NonNull
    public LocalTime getCustomNightModeEnd() {
        if (mService != null) {
            try {
                return LocalTime.ofNanoOfDay(mService.getCustomNightModeEnd() * 1000);
            } catch (RemoteException e) {
                throw e.rethrowFromSystemServer();
            }
        }
        return LocalTime.MIDNIGHT;
    }

    /**
     * Sets the time of the day Dark theme deactivates
     * <p>
     * When night mode is {@link #MODE_NIGHT_CUSTOM}, the system uses
     * this time set to deactivate it automatically.
     * @param time The time of the day Dark theme should deactivate
     */
    public void setCustomNightModeEnd(@NonNull LocalTime time) {
        if (mService != null) {
            try {
                mService.setCustomNightModeEnd(time.toNanoOfDay() / 1000);
            } catch (RemoteException e) {
                throw e.rethrowFromSystemServer();
            }
        }
    }

}
+24 −0
Original line number Diff line number Diff line
@@ -5882,6 +5882,22 @@ public final class Settings {
        public static final String DARK_MODE_DIALOG_SEEN =
                "dark_mode_dialog_seen";
        /**
         * Custom time when Dark theme is scheduled to activate.
         * Represented as milliseconds from midnight (e.g. 79200000 == 10pm).
         * @hide
         */
        public static final String DARK_THEME_CUSTOM_START_TIME =
                "dark_theme_custom_start_time";
        /**
         * Custom time when Dark theme is scheduled to deactivate.
         * Represented as milliseconds from midnight (e.g. 79200000 == 10pm).
         * @hide
         */
        public static final String DARK_THEME_CUSTOM_END_TIME =
                "dark_theme_custom_end_time";
        /**
         * Defines value returned by {@link android.service.autofill.UserData#getMaxUserDataSize()}.
         *
@@ -7705,6 +7721,14 @@ public final class Settings {
         */
        public static final String UI_NIGHT_MODE = "ui_night_mode";
        /**
         * The current night mode that has been overrided by the system.  Owned
         * and controlled by UiModeManagerService.  Constants are as per
         * UiModeManager.
         * @hide
         */
        public static final String UI_NIGHT_MODE_OVERRIDE = "ui_night_mode_override";
        /**
         * Whether screensavers are enabled.
         * @hide
Loading