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

Commit c294bbc6 authored by Matías Hernández's avatar Matías Hernández Committed by Android (Google) Code Review
Browse files

Merge changes from topic "device-effect-night" into main

* changes:
  Use new UiModeManager APIs for toggling night mode
  Adds UiModeManager APIs for Attention Modes
parents 6c3fc758 d1f726a9
Loading
Loading
Loading
Loading
+5 −0
Original line number Diff line number Diff line
@@ -483,10 +483,15 @@ package android.app {
  }

  public class UiModeManager {
    method @FlaggedApi("android.app.modes_api") @RequiresPermission(android.Manifest.permission.MODIFY_DAY_NIGHT_MODE) public int getAttentionModeThemeOverlay();
    method public boolean isNightModeLocked();
    method public boolean isUiModeLocked();
    method @RequiresPermission(value=android.Manifest.permission.TOGGLE_AUTOMOTIVE_PROJECTION, conditional=true) public boolean releaseProjection(int);
    method @RequiresPermission(value=android.Manifest.permission.TOGGLE_AUTOMOTIVE_PROJECTION, conditional=true) public boolean requestProjection(int);
    field @FlaggedApi("android.app.modes_api") public static final int MODE_ATTENTION_THEME_OVERLAY_DAY = 1002; // 0x3ea
    field @FlaggedApi("android.app.modes_api") public static final int MODE_ATTENTION_THEME_OVERLAY_NIGHT = 1001; // 0x3e9
    field @FlaggedApi("android.app.modes_api") public static final int MODE_ATTENTION_THEME_OVERLAY_OFF = 1000; // 0x3e8
    field @FlaggedApi("android.app.modes_api") public static final int MODE_ATTENTION_THEME_OVERLAY_UNKNOWN = -1; // 0xffffffff
    field public static final int PROJECTION_TYPE_ALL = -1; // 0xffffffff
    field public static final int PROJECTION_TYPE_AUTOMOTIVE = 1; // 0x1
    field public static final int PROJECTION_TYPE_NONE = 0; // 0x0
+28 −0
Original line number Diff line number Diff line
@@ -94,6 +94,34 @@ interface IUiModeManager {
    @JavaPassthrough(annotation="@android.annotation.RequiresPermission(android.Manifest.permission.MODIFY_DAY_NIGHT_MODE)")
    int getNightModeCustomType();

    /**
     * Overlays current Night Mode value.
     * {@code attentionModeThemeOverlayType}.
     *
     * @param attentionModeThemeOverlayType
     * @hide
     */
    @EnforcePermission("MODIFY_DAY_NIGHT_MODE")
    @JavaPassthrough(annotation="@android.annotation.RequiresPermission(android.Manifest.permission.MODIFY_DAY_NIGHT_MODE)")
    void setAttentionModeThemeOverlay(int attentionModeThemeOverlayType);


    /**
     * Returns current Attention Mode overlay type.
     * <p>
     * returns
     *  <ul>
     *    <li>{@link #MODE_ATTENTION_OFF}</li>
     *    <li>{@link #MODE_ATTENTION_NIGHT}</li>
     *    <li>{@link #MODE_ATTENTION_DAY}</li>
     *  </ul>
     * </p>
     * @hide
     */
    @EnforcePermission("MODIFY_DAY_NIGHT_MODE")
    @JavaPassthrough(annotation="@android.annotation.RequiresPermission(android.Manifest.permission.MODIFY_DAY_NIGHT_MODE)")
    int getAttentionModeThemeOverlay();

    /**
     * Sets the dark mode for the given application. This setting is persisted and will override the
     * system configuration for this application.
+104 −0
Original line number Diff line number Diff line
@@ -17,6 +17,7 @@
package android.app;

import android.annotation.CallbackExecutor;
import android.annotation.FlaggedApi;
import android.annotation.FloatRange;
import android.annotation.IntDef;
import android.annotation.IntRange;
@@ -265,6 +266,60 @@ public class UiModeManager {
     */
    public static final int MODE_NIGHT_YES = 2;

    /** @hide */
    @IntDef(prefix = { "MODE_ATTENTION_THEME_OVERLAY_" }, value = {
            MODE_ATTENTION_THEME_OVERLAY_OFF,
            MODE_ATTENTION_THEME_OVERLAY_NIGHT,
            MODE_ATTENTION_THEME_OVERLAY_DAY
    })
    @Retention(RetentionPolicy.SOURCE)
    public @interface AttentionModeThemeOverlayType {}

    /** @hide */
    @IntDef(prefix = { "MODE_ATTENTION_THEME_OVERLAY_" }, value = {
            MODE_ATTENTION_THEME_OVERLAY_OFF,
            MODE_ATTENTION_THEME_OVERLAY_NIGHT,
            MODE_ATTENTION_THEME_OVERLAY_DAY,
            MODE_ATTENTION_THEME_OVERLAY_UNKNOWN
    })
    @Retention(RetentionPolicy.SOURCE)
    public @interface AttentionModeThemeOverlayReturnType {}

    /**
     * Constant for {@link #setAttentionModeThemeOverlay(int)} (int)} and {@link
     * #getAttentionModeThemeOverlay()}: Keeps night mode as set by {@link #setNightMode(int)}.
     * @hide
     */
    @FlaggedApi(Flags.FLAG_MODES_API)
    @TestApi
    public static final int MODE_ATTENTION_THEME_OVERLAY_OFF = 1000;

    /**
     * Constant for {@link #setAttentionModeThemeOverlay(int)} (int)} and {@link
     * #getAttentionModeThemeOverlay()}: Maintains night mode always on.
     * @hide
     */
    @FlaggedApi(Flags.FLAG_MODES_API)
    @TestApi
    public static final int MODE_ATTENTION_THEME_OVERLAY_NIGHT = 1001;

    /**
     * Constant for {@link #setAttentionModeThemeOverlay(int)} (int)} and {@link
     * #getAttentionModeThemeOverlay()}: Maintains night mode always off (Light).
     * @hide
     */
    @FlaggedApi(Flags.FLAG_MODES_API)
    @TestApi
    public static final int MODE_ATTENTION_THEME_OVERLAY_DAY = 1002;

    /**
     * Constant for {@link #getAttentionModeThemeOverlay()}: Error communication with server.
     * @hide
     */
    @FlaggedApi(Flags.FLAG_MODES_API)
    @TestApi
    public static final int MODE_ATTENTION_THEME_OVERLAY_UNKNOWN = -1;

    /**
     * Granular types for {@link #setNightModeCustomType(int)}
     * @hide
@@ -732,6 +787,55 @@ public class UiModeManager {
        return MODE_NIGHT_CUSTOM_TYPE_UNKNOWN;
    }

    /**
     * Overlays current Attention mode Night Mode overlay.
     * {@code attentionModeThemeOverlayType}.
     *
     * @throws IllegalArgumentException if passed an unsupported type to
     *                                  {@code AttentionModeThemeOverlayType}.
     * @hide
     */
    @FlaggedApi(Flags.FLAG_MODES_API)
    @RequiresPermission(android.Manifest.permission.MODIFY_DAY_NIGHT_MODE)
    public void setAttentionModeThemeOverlay(
            @AttentionModeThemeOverlayType int attentionModeThemeOverlayType) {
        if (sGlobals != null) {
            try {
                sGlobals.mService.setAttentionModeThemeOverlay(attentionModeThemeOverlayType);
            } catch (RemoteException e) {
                throw e.rethrowFromSystemServer();
            }
        }
    }

    /**
     * Returns the currently configured Attention Mode theme overlay.
     * <p>
     * May be one of:
     *   <ul>
     *     <li>{@link #MODE_ATTENTION_THEME_OVERLAY_OFF}</li>
     *     <li>{@link #MODE_ATTENTION_THEME_OVERLAY_NIGHT}</li>
     *     <li>{@link #MODE_ATTENTION_THEME_OVERLAY_DAY}</li>
     *     <li>{@link #MODE_ATTENTION_THEME_OVERLAY_UNKNOWN}</li>
     *   </ul>
     * </p>
     *
     * @hide
     */
    @FlaggedApi(Flags.FLAG_MODES_API)
    @TestApi
    @RequiresPermission(android.Manifest.permission.MODIFY_DAY_NIGHT_MODE)
    public @AttentionModeThemeOverlayReturnType int getAttentionModeThemeOverlay() {
        if (sGlobals != null) {
            try {
                return sGlobals.mService.getAttentionModeThemeOverlay();
            } catch (RemoteException e) {
                throw e.rethrowFromSystemServer();
            }
        }
        return MODE_ATTENTION_THEME_OVERLAY_UNKNOWN;
    }

    /**
     * Sets and persist the night mode for this application.
     * <p>
+50 −13
Original line number Diff line number Diff line
@@ -16,8 +16,10 @@

package com.android.server;

import static android.app.Flags.modesApi;
import static android.app.UiModeManager.ContrastUtils.CONTRAST_DEFAULT_VALUE;
import static android.app.UiModeManager.DEFAULT_PRIORITY;
import static android.app.UiModeManager.MODE_ATTENTION_THEME_OVERLAY_OFF;
import static android.app.UiModeManager.MODE_NIGHT_AUTO;
import static android.app.UiModeManager.MODE_NIGHT_CUSTOM;
import static android.app.UiModeManager.MODE_NIGHT_CUSTOM_TYPE_BEDTIME;
@@ -50,6 +52,7 @@ import android.app.NotificationManager;
import android.app.PendingIntent;
import android.app.StatusBarManager;
import android.app.UiModeManager;
import android.app.UiModeManager.AttentionModeThemeOverlayType;
import android.app.UiModeManager.NightModeCustomReturnType;
import android.app.UiModeManager.NightModeCustomType;
import android.content.BroadcastReceiver;
@@ -134,6 +137,7 @@ final class UiModeManagerService extends SystemService {
    private int mLastBroadcastState = Intent.EXTRA_DOCK_STATE_UNDOCKED;
    private int mNightMode = UiModeManager.MODE_NIGHT_NO;
    private int mNightModeCustomType = UiModeManager.MODE_NIGHT_CUSTOM_TYPE_UNKNOWN;
    private int mAttentionModeThemeOverlay = UiModeManager.MODE_ATTENTION_THEME_OVERLAY_OFF;
    private final LocalTime DEFAULT_CUSTOM_NIGHT_START_TIME = LocalTime.of(22, 0);
    private final LocalTime DEFAULT_CUSTOM_NIGHT_END_TIME = LocalTime.of(6, 0);
    private LocalTime mCustomAutoNightModeStartMilliseconds = DEFAULT_CUSTOM_NIGHT_START_TIME;
@@ -839,6 +843,8 @@ final class UiModeManagerService extends SystemService {
                                ? customModeType
                                : MODE_NIGHT_CUSTOM_TYPE_UNKNOWN;
                        mNightMode = mode;
                        //deactivates AttentionMode if user toggles DarkTheme
                        mAttentionModeThemeOverlay = MODE_ATTENTION_THEME_OVERLAY_OFF;
                        resetNightModeOverrideLocked();
                        persistNightMode(user);
                        // on screen off will update configuration instead
@@ -879,6 +885,29 @@ final class UiModeManagerService extends SystemService {
            }
        }

        @android.annotation.EnforcePermission(android.Manifest.permission.MODIFY_DAY_NIGHT_MODE)
        @Override
            public void setAttentionModeThemeOverlay(
                @AttentionModeThemeOverlayType int attentionModeThemeOverlayType) {
            setAttentionModeThemeOverlay_enforcePermission();

            synchronized (mLock) {
                if (mAttentionModeThemeOverlay != attentionModeThemeOverlayType) {
                    mAttentionModeThemeOverlay = attentionModeThemeOverlayType;
                    Binder.withCleanCallingIdentity(()-> updateLocked(0, 0));
                }
            }
        }

        @android.annotation.EnforcePermission(android.Manifest.permission.MODIFY_DAY_NIGHT_MODE)
        @Override
        public @AttentionModeThemeOverlayType int getAttentionModeThemeOverlay() {
            getAttentionModeThemeOverlay_enforcePermission();
            synchronized (mLock) {
                return mAttentionModeThemeOverlay;
            }
        }

        @Override
        public void setApplicationNightMode(@UiModeManager.NightMode int mode) {
            switch (mode) {
@@ -1406,7 +1435,7 @@ final class UiModeManagerService extends SystemService {
            pw.print(Shell.nightModeToStr(mNightMode, mNightModeCustomType)); pw.print(") ");
            pw.print(" mOverrideOn/Off="); pw.print(mOverrideNightModeOn);
            pw.print("/"); pw.print(mOverrideNightModeOff);

            pw.print("  mAttentionModeThemeOverlay="); pw.print(mAttentionModeThemeOverlay);
            pw.print(" mNightModeLocked="); pw.println(mNightModeLocked);

            pw.print("  mCarModeEnabled="); pw.print(mCarModeEnabled);
@@ -1685,7 +1714,7 @@ final class UiModeManagerService extends SystemService {
    }

    @UiModeManager.NightMode
    private int getComputedUiModeConfiguration(@UiModeManager.NightMode int uiMode) {
    private int getComputedUiModeConfiguration(int uiMode) {
        uiMode |= mComputedNightMode ? Configuration.UI_MODE_NIGHT_YES
                : Configuration.UI_MODE_NIGHT_NO;
        uiMode &= mComputedNightMode ? ~Configuration.UI_MODE_NIGHT_NO
@@ -1980,18 +2009,26 @@ final class UiModeManagerService extends SystemService {
    }

    private void updateComputedNightModeLocked(boolean activate) {
        mComputedNightMode = activate;
        if (mNightMode == MODE_NIGHT_YES || mNightMode == UiModeManager.MODE_NIGHT_NO) {
            return;
        boolean newComputedValue = activate;
        if (mNightMode != MODE_NIGHT_YES && mNightMode != UiModeManager.MODE_NIGHT_NO) {
            if (mOverrideNightModeOn && !newComputedValue) {
                newComputedValue = true;
            } else if (mOverrideNightModeOff && newComputedValue) {
                newComputedValue = false;
            }
        if (mOverrideNightModeOn && !mComputedNightMode) {
            mComputedNightMode = true;
            return;
        }
        if (mOverrideNightModeOff && mComputedNightMode) {
            mComputedNightMode = false;
            return;

        if (modesApi()) {
            // Computes final night mode values based on Attention Mode.
            mComputedNightMode = switch (mAttentionModeThemeOverlay) {
                case (UiModeManager.MODE_ATTENTION_THEME_OVERLAY_NIGHT) -> true;
                case (UiModeManager.MODE_ATTENTION_THEME_OVERLAY_DAY) -> false;
                default -> newComputedValue; // case OFF
            };
        } else {
            mComputedNightMode = newComputedValue;
        }

        if (mNightMode != MODE_NIGHT_AUTO || (mTwilightManager != null
                && mTwilightManager.getLastTwilightState() != null)) {
            resetNightModeOverrideLocked();
+5 −5
Original line number Diff line number Diff line
@@ -16,7 +16,8 @@

package com.android.server.notification;

import static android.app.UiModeManager.MODE_NIGHT_CUSTOM_TYPE_BEDTIME;
import static android.app.UiModeManager.MODE_ATTENTION_THEME_OVERLAY_NIGHT;
import static android.app.UiModeManager.MODE_ATTENTION_THEME_OVERLAY_OFF;

import android.app.UiModeManager;
import android.app.WallpaperManager;
@@ -128,10 +129,9 @@ class DefaultDeviceEffectsApplier implements DeviceEffectsApplier {

    private void updateNightModeImmediately(boolean useNightMode) {
        Binder.withCleanCallingIdentity(() -> {
            // TODO: b/314285749 - Placeholder; use real APIs when available.
            mUiModeManager.setNightModeCustomType(MODE_NIGHT_CUSTOM_TYPE_BEDTIME);
            mUiModeManager.setNightModeActivatedForCustomMode(MODE_NIGHT_CUSTOM_TYPE_BEDTIME,
                    useNightMode);
            mUiModeManager.setAttentionModeThemeOverlay(
                    useNightMode ? MODE_ATTENTION_THEME_OVERLAY_NIGHT
                            : MODE_ATTENTION_THEME_OVERLAY_OFF);
        });
    }

Loading