script-astra/Android/Sdk/sources/android-35/android/service/notification/ZenDeviceEffects.java
localadmin 4380f00a78 init
2025-01-20 18:15:20 +03:00

594 lines
21 KiB
Java

/*
* Copyright (C) 2023 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.
*/
package android.service.notification;
import android.annotation.FlaggedApi;
import android.annotation.IntDef;
import android.annotation.NonNull;
import android.annotation.Nullable;
import android.annotation.TestApi;
import android.app.Flags;
import android.os.Parcel;
import android.os.Parcelable;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashSet;
import java.util.Objects;
import java.util.Set;
/**
* Represents the set of device effects (affecting display and device behavior in general) that
* are applied whenever an {@link android.app.AutomaticZenRule} is active.
*/
@FlaggedApi(Flags.FLAG_MODES_API)
public final class ZenDeviceEffects implements Parcelable {
/**
* Enum for the user-modifiable fields in this object.
* @hide
*/
@IntDef(flag = true, prefix = { "FIELD_" }, value = {
FIELD_GRAYSCALE,
FIELD_SUPPRESS_AMBIENT_DISPLAY,
FIELD_DIM_WALLPAPER,
FIELD_NIGHT_MODE,
FIELD_DISABLE_AUTO_BRIGHTNESS,
FIELD_DISABLE_TAP_TO_WAKE,
FIELD_DISABLE_TILT_TO_WAKE,
FIELD_DISABLE_TOUCH,
FIELD_MINIMIZE_RADIO_USAGE,
FIELD_MAXIMIZE_DOZE,
FIELD_EXTRA_EFFECTS
})
@Retention(RetentionPolicy.SOURCE)
public @interface ModifiableField {}
/**
* @hide
*/
public static final int FIELD_GRAYSCALE = 1 << 0;
/**
* @hide
*/
public static final int FIELD_SUPPRESS_AMBIENT_DISPLAY = 1 << 1;
/**
* @hide
*/
public static final int FIELD_DIM_WALLPAPER = 1 << 2;
/**
* @hide
*/
public static final int FIELD_NIGHT_MODE = 1 << 3;
/**
* @hide
*/
public static final int FIELD_DISABLE_AUTO_BRIGHTNESS = 1 << 4;
/**
* @hide
*/
public static final int FIELD_DISABLE_TAP_TO_WAKE = 1 << 5;
/**
* @hide
*/
public static final int FIELD_DISABLE_TILT_TO_WAKE = 1 << 6;
/**
* @hide
*/
public static final int FIELD_DISABLE_TOUCH = 1 << 7;
/**
* @hide
*/
public static final int FIELD_MINIMIZE_RADIO_USAGE = 1 << 8;
/**
* @hide
*/
public static final int FIELD_MAXIMIZE_DOZE = 1 << 9;
/**
* @hide
*/
public static final int FIELD_EXTRA_EFFECTS = 1 << 10;
private static final int MAX_EFFECTS_LENGTH = 2_000; // characters
private final boolean mGrayscale;
private final boolean mSuppressAmbientDisplay;
private final boolean mDimWallpaper;
private final boolean mNightMode;
private final boolean mDisableAutoBrightness;
private final boolean mDisableTapToWake;
private final boolean mDisableTiltToWake;
private final boolean mDisableTouch;
private final boolean mMinimizeRadioUsage;
private final boolean mMaximizeDoze;
private final Set<String> mExtraEffects;
private ZenDeviceEffects(boolean grayscale, boolean suppressAmbientDisplay,
boolean dimWallpaper, boolean nightMode, boolean disableAutoBrightness,
boolean disableTapToWake, boolean disableTiltToWake, boolean disableTouch,
boolean minimizeRadioUsage, boolean maximizeDoze, Set<String> extraEffects) {
mGrayscale = grayscale;
mSuppressAmbientDisplay = suppressAmbientDisplay;
mDimWallpaper = dimWallpaper;
mNightMode = nightMode;
mDisableAutoBrightness = disableAutoBrightness;
mDisableTapToWake = disableTapToWake;
mDisableTiltToWake = disableTiltToWake;
mDisableTouch = disableTouch;
mMinimizeRadioUsage = minimizeRadioUsage;
mMaximizeDoze = maximizeDoze;
mExtraEffects = Collections.unmodifiableSet(extraEffects);
}
/** @hide */
@FlaggedApi(Flags.FLAG_MODES_API)
public void validate() {
int extraEffectsLength = 0;
for (String extraEffect : mExtraEffects) {
extraEffectsLength += extraEffect.length();
}
if (extraEffectsLength > MAX_EFFECTS_LENGTH) {
throw new IllegalArgumentException(
"Total size of extra effects must be at most " + MAX_EFFECTS_LENGTH
+ " characters");
}
}
@Override
public boolean equals(Object obj) {
if (!(obj instanceof final ZenDeviceEffects that)) return false;
if (obj == this) return true;
return this.mGrayscale == that.mGrayscale
&& this.mSuppressAmbientDisplay == that.mSuppressAmbientDisplay
&& this.mDimWallpaper == that.mDimWallpaper
&& this.mNightMode == that.mNightMode
&& this.mDisableAutoBrightness == that.mDisableAutoBrightness
&& this.mDisableTapToWake == that.mDisableTapToWake
&& this.mDisableTiltToWake == that.mDisableTiltToWake
&& this.mDisableTouch == that.mDisableTouch
&& this.mMinimizeRadioUsage == that.mMinimizeRadioUsage
&& this.mMaximizeDoze == that.mMaximizeDoze
&& Objects.equals(this.mExtraEffects, that.mExtraEffects);
}
@Override
public int hashCode() {
return Objects.hash(mGrayscale, mSuppressAmbientDisplay, mDimWallpaper, mNightMode,
mDisableAutoBrightness, mDisableTapToWake, mDisableTiltToWake, mDisableTouch,
mMinimizeRadioUsage, mMaximizeDoze, mExtraEffects);
}
@Override
public String toString() {
ArrayList<String> effects = new ArrayList<>(11);
if (mGrayscale) effects.add("grayscale");
if (mSuppressAmbientDisplay) effects.add("suppressAmbientDisplay");
if (mDimWallpaper) effects.add("dimWallpaper");
if (mNightMode) effects.add("nightMode");
if (mDisableAutoBrightness) effects.add("disableAutoBrightness");
if (mDisableTapToWake) effects.add("disableTapToWake");
if (mDisableTiltToWake) effects.add("disableTiltToWake");
if (mDisableTouch) effects.add("disableTouch");
if (mMinimizeRadioUsage) effects.add("minimizeRadioUsage");
if (mMaximizeDoze) effects.add("maximizeDoze");
if (mExtraEffects.size() > 0) {
effects.add("extraEffects=[" + String.join(",", mExtraEffects) + "]");
}
return "[" + String.join(", ", effects) + "]";
}
/** @hide */
public static String fieldsToString(@ModifiableField int bitmask) {
ArrayList<String> modified = new ArrayList<>();
if ((bitmask & FIELD_GRAYSCALE) != 0) {
modified.add("FIELD_GRAYSCALE");
}
if ((bitmask & FIELD_SUPPRESS_AMBIENT_DISPLAY) != 0) {
modified.add("FIELD_SUPPRESS_AMBIENT_DISPLAY");
}
if ((bitmask & FIELD_DIM_WALLPAPER) != 0) {
modified.add("FIELD_DIM_WALLPAPER");
}
if ((bitmask & FIELD_NIGHT_MODE) != 0) {
modified.add("FIELD_NIGHT_MODE");
}
if ((bitmask & FIELD_DISABLE_AUTO_BRIGHTNESS) != 0) {
modified.add("FIELD_DISABLE_AUTO_BRIGHTNESS");
}
if ((bitmask & FIELD_DISABLE_TAP_TO_WAKE) != 0) {
modified.add("FIELD_DISABLE_TAP_TO_WAKE");
}
if ((bitmask & FIELD_DISABLE_TILT_TO_WAKE) != 0) {
modified.add("FIELD_DISABLE_TILT_TO_WAKE");
}
if ((bitmask & FIELD_DISABLE_TOUCH) != 0) {
modified.add("FIELD_DISABLE_TOUCH");
}
if ((bitmask & FIELD_MINIMIZE_RADIO_USAGE) != 0) {
modified.add("FIELD_MINIMIZE_RADIO_USAGE");
}
if ((bitmask & FIELD_MAXIMIZE_DOZE) != 0) {
modified.add("FIELD_MAXIMIZE_DOZE");
}
if ((bitmask & FIELD_EXTRA_EFFECTS) != 0) {
modified.add("FIELD_EXTRA_EFFECTS");
}
return "{" + String.join(",", modified) + "}";
}
/**
* Whether the level of color saturation of the display should be set to minimum, effectively
* switching it to grayscale, while the rule is active.
*/
public boolean shouldDisplayGrayscale() {
return mGrayscale;
}
/**
* Whether the ambient (always-on) display feature should be disabled while the rule is active.
* This will have no effect if the device doesn't support always-on display or if it's not
* generally enabled.
*/
public boolean shouldSuppressAmbientDisplay() {
return mSuppressAmbientDisplay;
}
/** Whether the wallpaper should be dimmed while the rule is active. */
public boolean shouldDimWallpaper() {
return mDimWallpaper;
}
/** Whether night mode (aka dark theme) should be applied while the rule is active. */
public boolean shouldUseNightMode() {
return mNightMode;
}
/**
* Whether the display's automatic brightness adjustment should be disabled while the rule is
* active.
* @hide
*/
public boolean shouldDisableAutoBrightness() {
return mDisableAutoBrightness;
}
/**
* Whether "tap to wake" should be disabled while the rule is active.
* @hide
*/
public boolean shouldDisableTapToWake() {
return mDisableTapToWake;
}
/**
* Whether "tilt to wake" should be disabled while the rule is active.
* @hide
*/
public boolean shouldDisableTiltToWake() {
return mDisableTiltToWake;
}
/**
* Whether touch interactions should be disabled while the rule is active.
* @hide
*/
public boolean shouldDisableTouch() {
return mDisableTouch;
}
/**
* Whether radio (wi-fi, LTE, etc) traffic, and its attendant battery consumption, should be
* minimized while the rule is active.
* @hide
*/
public boolean shouldMinimizeRadioUsage() {
return mMinimizeRadioUsage;
}
/**
* Whether Doze should be enhanced (e.g. with more aggressive activation, or less frequent
* maintenance windows) while the rule is active.
* @hide
*/
public boolean shouldMaximizeDoze() {
return mMaximizeDoze;
}
/**
* (Immutable) set of extra effects to be applied while the rule is active. Extra effects are
* not used in AOSP, but OEMs may add support for them by providing a custom
* {@link DeviceEffectsApplier}.
* @hide
*/
@TestApi
@NonNull
public Set<String> getExtraEffects() {
return mExtraEffects;
}
/**
* Whether any of the effects are set up.
* @hide
*/
public boolean hasEffects() {
return mGrayscale || mSuppressAmbientDisplay || mDimWallpaper || mNightMode
|| mDisableAutoBrightness || mDisableTapToWake || mDisableTiltToWake
|| mDisableTouch || mMinimizeRadioUsage || mMaximizeDoze
|| mExtraEffects.size() > 0;
}
/** {@link Parcelable.Creator} that instantiates {@link ZenDeviceEffects} objects. */
@NonNull
public static final Creator<ZenDeviceEffects> CREATOR = new Creator<ZenDeviceEffects>() {
@Override
public ZenDeviceEffects createFromParcel(Parcel in) {
return new ZenDeviceEffects(in.readBoolean(),
in.readBoolean(), in.readBoolean(), in.readBoolean(), in.readBoolean(),
in.readBoolean(), in.readBoolean(), in.readBoolean(), in.readBoolean(),
in.readBoolean(),
Set.of(in.readArray(String.class.getClassLoader(), String.class)));
}
@Override
public ZenDeviceEffects[] newArray(int size) {
return new ZenDeviceEffects[size];
}
};
@Override
public int describeContents() {
return 0;
}
@Override
public void writeToParcel(@NonNull Parcel dest, int flags) {
dest.writeBoolean(mGrayscale);
dest.writeBoolean(mSuppressAmbientDisplay);
dest.writeBoolean(mDimWallpaper);
dest.writeBoolean(mNightMode);
dest.writeBoolean(mDisableAutoBrightness);
dest.writeBoolean(mDisableTapToWake);
dest.writeBoolean(mDisableTiltToWake);
dest.writeBoolean(mDisableTouch);
dest.writeBoolean(mMinimizeRadioUsage);
dest.writeBoolean(mMaximizeDoze);
dest.writeArray(mExtraEffects.toArray(new String[0]));
}
/** Builder class for {@link ZenDeviceEffects} objects. */
@FlaggedApi(Flags.FLAG_MODES_API)
public static final class Builder {
private boolean mGrayscale;
private boolean mSuppressAmbientDisplay;
private boolean mDimWallpaper;
private boolean mNightMode;
private boolean mDisableAutoBrightness;
private boolean mDisableTapToWake;
private boolean mDisableTiltToWake;
private boolean mDisableTouch;
private boolean mMinimizeRadioUsage;
private boolean mMaximizeDoze;
private final HashSet<String> mExtraEffects = new HashSet<>();
/**
* Instantiates a new {@link ZenPolicy.Builder} with all effects set to default (disabled).
*/
public Builder() {
}
/**
* Instantiates a new {@link ZenPolicy.Builder} with all effects set to their corresponding
* values in the supplied {@link ZenDeviceEffects}.
*/
public Builder(@NonNull ZenDeviceEffects zenDeviceEffects) {
mGrayscale = zenDeviceEffects.shouldDisplayGrayscale();
mSuppressAmbientDisplay = zenDeviceEffects.shouldSuppressAmbientDisplay();
mDimWallpaper = zenDeviceEffects.shouldDimWallpaper();
mNightMode = zenDeviceEffects.shouldUseNightMode();
mDisableAutoBrightness = zenDeviceEffects.shouldDisableAutoBrightness();
mDisableTapToWake = zenDeviceEffects.shouldDisableTapToWake();
mDisableTiltToWake = zenDeviceEffects.shouldDisableTiltToWake();
mDisableTouch = zenDeviceEffects.shouldDisableTouch();
mMinimizeRadioUsage = zenDeviceEffects.shouldMinimizeRadioUsage();
mMaximizeDoze = zenDeviceEffects.shouldMaximizeDoze();
mExtraEffects.addAll(zenDeviceEffects.getExtraEffects());
}
/**
* Sets whether the level of color saturation of the display should be set to minimum,
* effectively switching it to grayscale, while the rule is active.
*/
@NonNull
public Builder setShouldDisplayGrayscale(boolean grayscale) {
mGrayscale = grayscale;
return this;
}
/**
* Sets whether the ambient (always-on) display feature should be disabled while the rule
* is active. This will have no effect if the device doesn't support always-on display or if
* it's not generally enabled.
*/
@NonNull
public Builder setShouldSuppressAmbientDisplay(boolean suppressAmbientDisplay) {
mSuppressAmbientDisplay = suppressAmbientDisplay;
return this;
}
/** Sets whether the wallpaper should be dimmed while the rule is active. */
@NonNull
public Builder setShouldDimWallpaper(boolean dimWallpaper) {
mDimWallpaper = dimWallpaper;
return this;
}
/** Sets whether night mode (aka dark theme) should be applied while the rule is active. */
@NonNull
public Builder setShouldUseNightMode(boolean nightMode) {
mNightMode = nightMode;
return this;
}
/**
* Sets whether the display's automatic brightness adjustment should be disabled while the
* rule is active.
* @hide
*/
@NonNull
public Builder setShouldDisableAutoBrightness(boolean disableAutoBrightness) {
mDisableAutoBrightness = disableAutoBrightness;
return this;
}
/**
* Sets whether "tap to wake" should be disabled while the rule is active.
* @hide
*/
@NonNull
public Builder setShouldDisableTapToWake(boolean disableTapToWake) {
mDisableTapToWake = disableTapToWake;
return this;
}
/**
* Sets whether "tilt to wake" should be disabled while the rule is active.
* @hide
*/
@NonNull
public Builder setShouldDisableTiltToWake(boolean disableTiltToWake) {
mDisableTiltToWake = disableTiltToWake;
return this;
}
/**
* Sets whether touch interactions should be disabled while the rule is active.
* @hide
*/
@NonNull
public Builder setShouldDisableTouch(boolean disableTouch) {
mDisableTouch = disableTouch;
return this;
}
/**
* Sets whether radio (wi-fi, LTE, etc) traffic, and its attendant battery consumption,
* should be minimized while the rule is active.
* @hide
*/
@NonNull
public Builder setShouldMinimizeRadioUsage(boolean minimizeRadioUsage) {
mMinimizeRadioUsage = minimizeRadioUsage;
return this;
}
/**
* Sets whether Doze should be enhanced (e.g. with more aggressive activation, or less
* frequent maintenance windows) while the rule is active.
* @hide
*/
@NonNull
public Builder setShouldMaximizeDoze(boolean maximizeDoze) {
mMaximizeDoze = maximizeDoze;
return this;
}
/**
* Sets the extra effects to be applied while the rule is active. Extra effects are not
* used in AOSP, but OEMs may add support for them by providing a custom
* {@link DeviceEffectsApplier}.
*
* @apiNote The total size of the extra effects (concatenation of strings) is limited.
*
* @hide
*/
@TestApi
@NonNull
public Builder setExtraEffects(@NonNull Set<String> extraEffects) {
Objects.requireNonNull(extraEffects);
mExtraEffects.clear();
mExtraEffects.addAll(extraEffects);
return this;
}
/**
* Adds the supplied extra effects to the set to be applied while the rule is active.
* Extra effects are not used in AOSP, but OEMs may add support for them by providing a
* custom {@link DeviceEffectsApplier}.
*
* @apiNote The total size of the extra effects (concatenation of strings) is limited.
*
* @hide
*/
@NonNull
public Builder addExtraEffects(@NonNull Set<String> extraEffects) {
mExtraEffects.addAll(Objects.requireNonNull(extraEffects));
return this;
}
/**
* Adds the supplied extra effect to the set to be applied while the rule is active.
* Extra effects are not used in AOSP, but OEMs may add support for them by providing a
* custom {@link DeviceEffectsApplier}.
*
* @apiNote The total size of the extra effects (concatenation of strings) is limited.
*
* @hide
*/
@NonNull
public Builder addExtraEffect(@NonNull String extraEffect) {
mExtraEffects.add(Objects.requireNonNull(extraEffect));
return this;
}
/**
* Applies the effects that are {@code true} on the supplied {@link ZenDeviceEffects} to
* this builder (essentially logically-ORing the effect set).
* @hide
*/
@NonNull
public Builder add(@Nullable ZenDeviceEffects effects) {
if (effects == null) return this;
if (effects.shouldDisplayGrayscale()) setShouldDisplayGrayscale(true);
if (effects.shouldSuppressAmbientDisplay()) setShouldSuppressAmbientDisplay(true);
if (effects.shouldDimWallpaper()) setShouldDimWallpaper(true);
if (effects.shouldUseNightMode()) setShouldUseNightMode(true);
if (effects.shouldDisableAutoBrightness()) setShouldDisableAutoBrightness(true);
if (effects.shouldDisableTapToWake()) setShouldDisableTapToWake(true);
if (effects.shouldDisableTiltToWake()) setShouldDisableTiltToWake(true);
if (effects.shouldDisableTouch()) setShouldDisableTouch(true);
if (effects.shouldMinimizeRadioUsage()) setShouldMinimizeRadioUsage(true);
if (effects.shouldMaximizeDoze()) setShouldMaximizeDoze(true);
addExtraEffects(effects.getExtraEffects());
return this;
}
/** Builds a {@link ZenDeviceEffects} object based on the builder's state. */
@NonNull
public ZenDeviceEffects build() {
return new ZenDeviceEffects(mGrayscale,
mSuppressAmbientDisplay, mDimWallpaper, mNightMode, mDisableAutoBrightness,
mDisableTapToWake, mDisableTiltToWake, mDisableTouch, mMinimizeRadioUsage,
mMaximizeDoze, mExtraEffects);
}
}
}