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

Commit 2ba3e989 authored by Alexander Roederer's avatar Alexander Roederer
Browse files

Add bitmask to ZenRule tracking user changes

Modifies AutomaticZenRule/ZenModeConfig.ZenRule, ZenPolicy, and
ZenDeviceEffects to have a bitmask called userModifiedFields. This
bitmask is checked and updated in populateZenRule based on the values
that are modified whenever a ZenRule is Added or modified.

For the check: origins described in doesOriginAlwaysUpdateValues, and
rules that are not isUserModified (which checks if anything in the
bitmask is set) are allowed to update values.
For the bitmask update: UPDATE_ORIGIN_USER will update the bitmask.

The ZenPolicy and ZenDeviceEffects containers track their own bitmasks,
which impact the ultimate value of the top-level AZR.isUserModified.

Bug: 308671593
Bug: 308673679
Test: atest AutomaticZenRuleTest atest ZenPolicyTest atest ZenDeviceEffectsTest atest atest ZenModeConfigTest atest ZenModeHelperTest
Change-Id: I098950169b314266a3ade0855b6dafdc48a60229
parent 2d868874
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -5315,6 +5315,7 @@ package android.app {
    ctor @Deprecated public AutomaticZenRule(String, android.content.ComponentName, android.net.Uri, int, boolean);
    ctor public AutomaticZenRule(@NonNull String, @Nullable android.content.ComponentName, @Nullable android.content.ComponentName, @NonNull android.net.Uri, @Nullable android.service.notification.ZenPolicy, int, boolean);
    ctor public AutomaticZenRule(android.os.Parcel);
    method @FlaggedApi("android.app.modes_api") public boolean canUpdate();
    method public int describeContents();
    method public android.net.Uri getConditionId();
    method @Nullable public android.content.ComponentName getConfigurationActivity();
+53 −0
Original line number Diff line number Diff line
@@ -284,6 +284,16 @@ package android.app {
    method public default void onOpActiveChanged(@NonNull String, int, @NonNull String, @Nullable String, boolean, int, int);
  }

  public final class AutomaticZenRule implements android.os.Parcelable {
    method @FlaggedApi("android.app.modes_api") public int getUserModifiedFields();
    field @FlaggedApi("android.app.modes_api") public static final int FIELD_INTERRUPTION_FILTER = 2; // 0x2
    field @FlaggedApi("android.app.modes_api") public static final int FIELD_NAME = 1; // 0x1
  }

  @FlaggedApi("android.app.modes_api") public static final class AutomaticZenRule.Builder {
    method @FlaggedApi("android.app.modes_api") @NonNull public android.app.AutomaticZenRule.Builder setUserModifiedFields(int);
  }

  public class BroadcastOptions extends android.app.ComponentOptions {
    ctor public BroadcastOptions();
    ctor public BroadcastOptions(@NonNull android.os.Bundle);
@@ -3007,6 +3017,49 @@ package android.service.notification {
    method @Deprecated public boolean isBound();
  }

  @FlaggedApi("android.app.modes_api") public final class ZenDeviceEffects implements android.os.Parcelable {
    method public int getUserModifiedFields();
    field public static final int FIELD_DIM_WALLPAPER = 4; // 0x4
    field public static final int FIELD_DISABLE_AUTO_BRIGHTNESS = 16; // 0x10
    field public static final int FIELD_DISABLE_TAP_TO_WAKE = 32; // 0x20
    field public static final int FIELD_DISABLE_TILT_TO_WAKE = 64; // 0x40
    field public static final int FIELD_DISABLE_TOUCH = 128; // 0x80
    field public static final int FIELD_GRAYSCALE = 1; // 0x1
    field public static final int FIELD_MAXIMIZE_DOZE = 512; // 0x200
    field public static final int FIELD_MINIMIZE_RADIO_USAGE = 256; // 0x100
    field public static final int FIELD_NIGHT_MODE = 8; // 0x8
    field public static final int FIELD_SUPPRESS_AMBIENT_DISPLAY = 2; // 0x2
  }

  @FlaggedApi("android.app.modes_api") public static final class ZenDeviceEffects.Builder {
    method @NonNull public android.service.notification.ZenDeviceEffects.Builder setUserModifiedFields(int);
  }

  public final class ZenPolicy implements android.os.Parcelable {
    method @FlaggedApi("android.app.modes_api") public int getUserModifiedFields();
    field @FlaggedApi("android.app.modes_api") public static final int FIELD_ALLOW_CHANNELS = 8; // 0x8
    field @FlaggedApi("android.app.modes_api") public static final int FIELD_CALLS = 2; // 0x2
    field @FlaggedApi("android.app.modes_api") public static final int FIELD_CONVERSATIONS = 4; // 0x4
    field @FlaggedApi("android.app.modes_api") public static final int FIELD_MESSAGES = 1; // 0x1
    field @FlaggedApi("android.app.modes_api") public static final int FIELD_PRIORITY_CATEGORY_ALARMS = 128; // 0x80
    field @FlaggedApi("android.app.modes_api") public static final int FIELD_PRIORITY_CATEGORY_EVENTS = 32; // 0x20
    field @FlaggedApi("android.app.modes_api") public static final int FIELD_PRIORITY_CATEGORY_MEDIA = 256; // 0x100
    field @FlaggedApi("android.app.modes_api") public static final int FIELD_PRIORITY_CATEGORY_REPEAT_CALLERS = 64; // 0x40
    field @FlaggedApi("android.app.modes_api") public static final int FIELD_PRIORITY_CATEGORY_SYSTEM = 512; // 0x200
    field @FlaggedApi("android.app.modes_api") public static final int FIELD_VISUAL_EFFECT_AMBIENT = 32768; // 0x8000
    field @FlaggedApi("android.app.modes_api") public static final int FIELD_VISUAL_EFFECT_BADGE = 16384; // 0x4000
    field @FlaggedApi("android.app.modes_api") public static final int FIELD_VISUAL_EFFECT_FULL_SCREEN_INTENT = 1024; // 0x400
    field @FlaggedApi("android.app.modes_api") public static final int FIELD_VISUAL_EFFECT_LIGHTS = 2048; // 0x800
    field @FlaggedApi("android.app.modes_api") public static final int FIELD_VISUAL_EFFECT_NOTIFICATION_LIST = 65536; // 0x10000
    field @FlaggedApi("android.app.modes_api") public static final int FIELD_VISUAL_EFFECT_PEEK = 4096; // 0x1000
    field @FlaggedApi("android.app.modes_api") public static final int FIELD_VISUAL_EFFECT_STATUS_BAR = 8192; // 0x2000
  }

  public static final class ZenPolicy.Builder {
    ctor public ZenPolicy.Builder(@Nullable android.service.notification.ZenPolicy);
    method @FlaggedApi("android.app.modes_api") @NonNull public android.service.notification.ZenPolicy.Builder setUserModifiedFields(int);
  }

}

package android.service.quickaccesswallet {
+6 −0
Original line number Diff line number Diff line
@@ -535,6 +535,10 @@ MissingNullability: android.widget.ImageView#isDefaultFocusHighlightNeeded(andro
    Missing nullability on parameter `foreground` in method `isDefaultFocusHighlightNeeded`


OptionalBuilderConstructorArgument: android.service.notification.ZenPolicy.Builder#Builder(android.service.notification.ZenPolicy) parameter #0:
    Builder constructor arguments must be mandatory (i.e. not @Nullable): parameter policy in android.service.notification.ZenPolicy.Builder(android.service.notification.ZenPolicy policy)


ProtectedMember: android.app.AppDetailsActivity#onCreate(android.os.Bundle):
    Protected methods not allowed; must be public: method android.app.AppDetailsActivity.onCreate(android.os.Bundle)}
ProtectedMember: android.view.ViewGroup#resetResolvedDrawables():
@@ -2143,6 +2147,8 @@ UnflaggedApi: android.service.notification.NotificationRankingUpdate#PARCELABLE_
    New API must be flagged with @FlaggedApi: field android.service.notification.NotificationRankingUpdate.PARCELABLE_WRITE_RETURN_VALUE
UnflaggedApi: android.service.notification.NotificationRankingUpdate#isFdNotNullAndClosed():
    New API must be flagged with @FlaggedApi: method android.service.notification.NotificationRankingUpdate.isFdNotNullAndClosed()
UnflaggedApi: android.service.notification.ZenPolicy.Builder#Builder(android.service.notification.ZenPolicy):
    New API must be flagged with @FlaggedApi: constructor android.service.notification.ZenPolicy.Builder(android.service.notification.ZenPolicy)
UnflaggedApi: android.telephony.TelephonyManager#HAL_SERVICE_SATELLITE:
    New API must be flagged with @FlaggedApi: field android.telephony.TelephonyManager.HAL_SERVICE_SATELLITE
UnflaggedApi: android.telephony.ims.feature.MmTelFeature.MmTelCapabilities:
+94 −4
Original line number Diff line number Diff line
@@ -23,6 +23,7 @@ import android.annotation.FlaggedApi;
import android.annotation.IntDef;
import android.annotation.NonNull;
import android.annotation.Nullable;
import android.annotation.TestApi;
import android.app.NotificationManager.InterruptionFilter;
import android.content.ComponentName;
import android.net.Uri;
@@ -35,6 +36,7 @@ import android.view.WindowInsetsController;

import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.util.ArrayList;
import java.util.Objects;

/**
@@ -111,6 +113,30 @@ public final class AutomaticZenRule implements Parcelable {
    @Retention(RetentionPolicy.SOURCE)
    public @interface Type {}

    /** Used to track which rule variables have been modified by the user.
     * Should be checked against the bitmask {@link #getUserModifiedFields()}.
     * @hide
     */
    @IntDef(flag = true, prefix = { "FIELD_" }, value = {
            FIELD_NAME,
            FIELD_INTERRUPTION_FILTER,
    })
    @Retention(RetentionPolicy.SOURCE)
    public @interface ModifiableField {}

    /**
     * @hide
     */
    @FlaggedApi(Flags.FLAG_MODES_API)
    @TestApi
    public static final int FIELD_NAME = 1 << 0;
    /**
     * @hide
     */
    @FlaggedApi(Flags.FLAG_MODES_API)
    @TestApi
    public static final int FIELD_INTERRUPTION_FILTER = 1 << 1;

    private boolean enabled;
    private String name;
    private @InterruptionFilter int interruptionFilter;
@@ -120,12 +146,14 @@ public final class AutomaticZenRule implements Parcelable {
    private long creationTime;
    private ZenPolicy mZenPolicy;
    private ZenDeviceEffects mDeviceEffects;
    // TODO: b/310620812 - Remove this once FLAG_MODES_API is inlined.
    private boolean mModified = false;
    private String mPkg;
    private int mType = TYPE_UNKNOWN;
    private int mType = Flags.modesApi() ? TYPE_UNKNOWN : 0;
    private int mIconResId;
    private String mTriggerDescription;
    private boolean mAllowManualInvocation;
    private @ModifiableField int mUserModifiedFields; // Bitwise representation

    /**
     * The maximum string length for any string contained in this automatic zen rule. This pertains
@@ -228,6 +256,7 @@ public final class AutomaticZenRule implements Parcelable {
            mIconResId = source.readInt();
            mTriggerDescription = getTrimmedString(source.readString(), MAX_DESC_LENGTH);
            mType = source.readInt();
            mUserModifiedFields = source.readInt();
        }
    }

@@ -278,6 +307,8 @@ public final class AutomaticZenRule implements Parcelable {
     * Returns whether this rule's name has been modified by the user.
     * @hide
     */
    // TODO: b/310620812 - Replace with mUserModifiedFields & FIELD_NAME once
    //  FLAG_MODES_API is inlined.
    public boolean isModified() {
        return mModified;
    }
@@ -475,6 +506,32 @@ public final class AutomaticZenRule implements Parcelable {
        return type;
    }

    /**
     * Gets the bitmask representing which fields are user modified. Bits are set using
     * {@link ModifiableField}.
     * @hide
     */
    @FlaggedApi(Flags.FLAG_MODES_API)
    @TestApi
    public @ModifiableField int getUserModifiedFields() {
        return mUserModifiedFields;
    }

    /**
     * Returns {@code true} if the {@link AutomaticZenRule} can be updated.
     * When this returns {@code false}, calls to
     * {@link NotificationManager#updateAutomaticZenRule(String, AutomaticZenRule)}) with this rule
     * will ignore changes to user-configurable fields.
     */
    @FlaggedApi(Flags.FLAG_MODES_API)
    public boolean canUpdate() {
        // The rule is considered updateable if its bitmask has no user modifications, and
        // the bitmasks of the policy and device effects have no modification.
        return mUserModifiedFields == 0
                && (mZenPolicy == null || mZenPolicy.getUserModifiedFields() == 0)
                && (mDeviceEffects == null || mDeviceEffects.getUserModifiedFields() == 0);
    }

    @Override
    public int describeContents() {
        return 0;
@@ -503,6 +560,7 @@ public final class AutomaticZenRule implements Parcelable {
            dest.writeInt(mIconResId);
            dest.writeString(mTriggerDescription);
            dest.writeInt(mType);
            dest.writeInt(mUserModifiedFields);
        }
    }

@@ -524,12 +582,26 @@ public final class AutomaticZenRule implements Parcelable {
                    .append(",allowManualInvocation=").append(mAllowManualInvocation)
                    .append(",iconResId=").append(mIconResId)
                    .append(",triggerDescription=").append(mTriggerDescription)
                    .append(",type=").append(mType);
                    .append(",type=").append(mType)
                    .append(",userModifiedFields=")
                    .append(modifiedFieldsToString(mUserModifiedFields));
        }

        return sb.append(']').toString();
    }

    @FlaggedApi(Flags.FLAG_MODES_API)
    private String modifiedFieldsToString(int bitmask) {
        ArrayList<String> modified = new ArrayList<>();
        if ((bitmask & FIELD_NAME) != 0) {
            modified.add("FIELD_NAME");
        }
        if ((bitmask & FIELD_INTERRUPTION_FILTER) != 0) {
            modified.add("FIELD_INTERRUPTION_FILTER");
        }
        return "{" + String.join(",", modified) + "}";
    }

    @Override
    public boolean equals(@Nullable Object o) {
        if (!(o instanceof AutomaticZenRule)) return false;
@@ -551,7 +623,8 @@ public final class AutomaticZenRule implements Parcelable {
                    && other.mAllowManualInvocation == mAllowManualInvocation
                    && other.mIconResId == mIconResId
                    && Objects.equals(other.mTriggerDescription, mTriggerDescription)
                    && other.mType == mType;
                    && other.mType == mType
                    && other.mUserModifiedFields == mUserModifiedFields;
        }
        return finalEquals;
    }
@@ -561,7 +634,8 @@ public final class AutomaticZenRule implements Parcelable {
        if (Flags.modesApi()) {
            return Objects.hash(enabled, name, interruptionFilter, conditionId, owner,
                    configurationActivity, mZenPolicy, mDeviceEffects, mModified, creationTime,
                    mPkg, mAllowManualInvocation, mIconResId, mTriggerDescription, mType);
                    mPkg, mAllowManualInvocation, mIconResId, mTriggerDescription, mType,
                    mUserModifiedFields);
        }
        return Objects.hash(enabled, name, interruptionFilter, conditionId, owner,
                configurationActivity, mZenPolicy, mModified, creationTime, mPkg);
@@ -630,6 +704,7 @@ public final class AutomaticZenRule implements Parcelable {
        private boolean mAllowManualInvocation;
        private long mCreationTime;
        private String mPkg;
        private @ModifiableField int mUserModifiedFields;

        public Builder(@NonNull AutomaticZenRule rule) {
            mName = rule.getName();
@@ -646,6 +721,7 @@ public final class AutomaticZenRule implements Parcelable {
            mAllowManualInvocation = rule.isManualInvocationAllowed();
            mCreationTime = rule.getCreationTime();
            mPkg = rule.getPackageName();
            mUserModifiedFields = rule.mUserModifiedFields;
        }

        public Builder(@NonNull String name, @NonNull Uri conditionId) {
@@ -772,6 +848,19 @@ public final class AutomaticZenRule implements Parcelable {
            return this;
        }

        /**
         * Sets the bitmask representing which fields have been user-modified.
         * This method should not be used outside of tests. The value of userModifiedFields
         * should be set based on what values are changed when a rule is populated or updated..
         * @hide
         */
        @FlaggedApi(Flags.FLAG_MODES_API)
        @TestApi
        public @NonNull Builder setUserModifiedFields(@ModifiableField int userModifiedFields) {
            mUserModifiedFields = userModifiedFields;
            return this;
        }

        public @NonNull AutomaticZenRule build() {
            AutomaticZenRule rule = new AutomaticZenRule(mName, mOwner, mConfigurationActivity,
                    mConditionId, mPolicy, mInterruptionFilter, mEnabled);
@@ -782,6 +871,7 @@ public final class AutomaticZenRule implements Parcelable {
            rule.mIconResId = mIconResId;
            rule.mAllowManualInvocation = mAllowManualInvocation;
            rule.setPackageName(mPkg);
            rule.mUserModifiedFields = mUserModifiedFields;

            return rule;
        }
+150 −9
Original line number Diff line number Diff line
@@ -17,12 +17,16 @@
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.Objects;

@@ -33,6 +37,76 @@ import java.util.Objects;
@FlaggedApi(Flags.FLAG_MODES_API)
public final class ZenDeviceEffects implements Parcelable {

    /** Used to track which rule variables have been modified by the user.
     * Should be checked against the bitmask {@link #getUserModifiedFields()}.
     * @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,
    })
    @Retention(RetentionPolicy.SOURCE)
    public @interface ModifiableField {}

    /**
     * @hide
     */
    @TestApi
    public static final int FIELD_GRAYSCALE = 1 << 0;
    /**
     * @hide
     */
    @TestApi
    public static final int FIELD_SUPPRESS_AMBIENT_DISPLAY = 1 << 1;
    /**
     * @hide
     */
    @TestApi
    public static final int FIELD_DIM_WALLPAPER = 1 << 2;
    /**
     * @hide
     */
    @TestApi
    public static final int FIELD_NIGHT_MODE = 1 << 3;
    /**
     * @hide
     */
    @TestApi
    public static final int FIELD_DISABLE_AUTO_BRIGHTNESS = 1 << 4;
    /**
     * @hide
     */
    @TestApi
    public static final int FIELD_DISABLE_TAP_TO_WAKE = 1 << 5;
    /**
     * @hide
     */
    @TestApi
    public static final int FIELD_DISABLE_TILT_TO_WAKE = 1 << 6;
    /**
     * @hide
     */
    @TestApi
    public static final int FIELD_DISABLE_TOUCH = 1 << 7;
    /**
     * @hide
     */
    @TestApi
    public static final int FIELD_MINIMIZE_RADIO_USAGE = 1 << 8;
    /**
     * @hide
     */
    @TestApi
    public static final int FIELD_MAXIMIZE_DOZE = 1 << 9;

    private final boolean mGrayscale;
    private final boolean mSuppressAmbientDisplay;
    private final boolean mDimWallpaper;
@@ -45,10 +119,13 @@ public final class ZenDeviceEffects implements Parcelable {
    private final boolean mMinimizeRadioUsage;
    private final boolean mMaximizeDoze;

    private final @ModifiableField int mUserModifiedFields; // Bitwise representation

    private ZenDeviceEffects(boolean grayscale, boolean suppressAmbientDisplay,
            boolean dimWallpaper, boolean nightMode, boolean disableAutoBrightness,
            boolean disableTapToWake, boolean disableTiltToWake, boolean disableTouch,
            boolean minimizeRadioUsage, boolean maximizeDoze) {
            boolean minimizeRadioUsage, boolean maximizeDoze,
            @ModifiableField int userModifiedFields) {
        mGrayscale = grayscale;
        mSuppressAmbientDisplay = suppressAmbientDisplay;
        mDimWallpaper = dimWallpaper;
@@ -59,6 +136,7 @@ public final class ZenDeviceEffects implements Parcelable {
        mDisableTouch = disableTouch;
        mMinimizeRadioUsage = minimizeRadioUsage;
        mMaximizeDoze = maximizeDoze;
        mUserModifiedFields = userModifiedFields;
    }

    @Override
@@ -75,14 +153,15 @@ public final class ZenDeviceEffects implements Parcelable {
                && this.mDisableTiltToWake == that.mDisableTiltToWake
                && this.mDisableTouch == that.mDisableTouch
                && this.mMinimizeRadioUsage == that.mMinimizeRadioUsage
                && this.mMaximizeDoze == that.mMaximizeDoze;
                && this.mMaximizeDoze == that.mMaximizeDoze
                && this.mUserModifiedFields == that.mUserModifiedFields;
    }

    @Override
    public int hashCode() {
        return Objects.hash(mGrayscale, mSuppressAmbientDisplay, mDimWallpaper, mNightMode,
                mDisableAutoBrightness, mDisableTapToWake, mDisableTiltToWake, mDisableTouch,
                mMinimizeRadioUsage, mMaximizeDoze);
                mMinimizeRadioUsage, mMaximizeDoze, mUserModifiedFields);
    }

    @Override
@@ -98,7 +177,43 @@ public final class ZenDeviceEffects implements Parcelable {
        if (mDisableTouch) effects.add("disableTouch");
        if (mMinimizeRadioUsage) effects.add("minimizeRadioUsage");
        if (mMaximizeDoze) effects.add("maximizeDoze");
        return "[" + String.join(", ", effects) + "]";
        return "[" + String.join(", ", effects) + "]"
                + " userModifiedFields: " + modifiedFieldsToString(mUserModifiedFields);
    }

    private String modifiedFieldsToString(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");
        }
        return "{" + String.join(",", modified) + "}";
    }

    /**
@@ -194,9 +309,10 @@ public final class ZenDeviceEffects implements Parcelable {
    public static final Creator<ZenDeviceEffects> CREATOR = new Creator<ZenDeviceEffects>() {
        @Override
        public ZenDeviceEffects createFromParcel(Parcel in) {
            return new ZenDeviceEffects(in.readBoolean(), in.readBoolean(), in.readBoolean(),
            return new ZenDeviceEffects(in.readBoolean(),
                    in.readBoolean(), in.readBoolean(), in.readBoolean(), in.readBoolean(),
                    in.readBoolean(), in.readBoolean(), in.readBoolean());
                    in.readBoolean(), in.readBoolean(), in.readBoolean(), in.readBoolean(),
                    in.readBoolean(), in.readInt());
        }

        @Override
@@ -205,6 +321,16 @@ public final class ZenDeviceEffects implements Parcelable {
        }
    };

    /**
     * Gets the bitmask representing which fields are user modified. Bits are set using
     * {@link ModifiableField}.
     * @hide
     */
    @TestApi
    public @ModifiableField int getUserModifiedFields() {
        return mUserModifiedFields;
    }

    @Override
    public int describeContents() {
        return 0;
@@ -222,6 +348,7 @@ public final class ZenDeviceEffects implements Parcelable {
        dest.writeBoolean(mDisableTouch);
        dest.writeBoolean(mMinimizeRadioUsage);
        dest.writeBoolean(mMaximizeDoze);
        dest.writeInt(mUserModifiedFields);
    }

    /** Builder class for {@link ZenDeviceEffects} objects. */
@@ -238,6 +365,7 @@ public final class ZenDeviceEffects implements Parcelable {
        private boolean mDisableTouch;
        private boolean mMinimizeRadioUsage;
        private boolean mMaximizeDoze;
        private @ModifiableField int mUserModifiedFields;

        /**
         * Instantiates a new {@link ZenPolicy.Builder} with all effects set to default (disabled).
@@ -260,6 +388,7 @@ public final class ZenDeviceEffects implements Parcelable {
            mDisableTouch = zenDeviceEffects.shouldDisableTouch();
            mMinimizeRadioUsage = zenDeviceEffects.shouldMinimizeRadioUsage();
            mMaximizeDoze = zenDeviceEffects.shouldMaximizeDoze();
            mUserModifiedFields = zenDeviceEffects.mUserModifiedFields;
        }

        /**
@@ -381,12 +510,24 @@ public final class ZenDeviceEffects implements Parcelable {
            return this;
        }

        /**
         * Sets the bitmask representing which fields are user modified. See the FIELD_ constants.
         * @hide
         */
        @TestApi
        @NonNull
        public Builder setUserModifiedFields(@ModifiableField int userModifiedFields) {
            mUserModifiedFields = userModifiedFields;
            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);
            return new ZenDeviceEffects(mGrayscale,
                    mSuppressAmbientDisplay, mDimWallpaper, mNightMode, mDisableAutoBrightness,
                    mDisableTapToWake, mDisableTiltToWake, mDisableTouch, mMinimizeRadioUsage,
                    mMaximizeDoze, mUserModifiedFields);
        }
    }
}
Loading