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

Commit ecae5c68 authored by Matías Hernández's avatar Matías Hernández
Browse files

Remove AutomaticZenRule.canUpdate()

Instead, store the user-modified bitmasks directly in the ZenRule, since only ZenModeHelper needs to access them. Updated tests to match. This also re-hides a bunch of TestApis since CTS will no longer verify this.

Also validate that the origins supplied to ZenModeHelper make sense (for the "API" methods, called from NMS, only user/systemui/app is expected).

Test: atest ZenModeHelperTest ZenModeConfigTest
Fixes: 320271785
Fixes: 318506692
Change-Id: Ied6351aa0a4b473145876e80589e5ad16db18553
parent 91367a7d
Loading
Loading
Loading
Loading
+0 −1
Original line number Diff line number Diff line
@@ -5317,7 +5317,6 @@ 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();
+0 −49
Original line number Diff line number Diff line
@@ -284,16 +284,6 @@ 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);
@@ -3021,47 +3011,8 @@ 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);
  }

}
+8 −61
Original line number Diff line number Diff line
@@ -23,7 +23,6 @@ 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;
@@ -113,8 +112,8 @@ 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()}.
    /**
     * Enum for the user-modifiable fields in this object.
     * @hide
     */
    @IntDef(flag = true, prefix = { "FIELD_" }, value = {
@@ -128,13 +127,11 @@ public final class AutomaticZenRule implements Parcelable {
     * @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;
@@ -153,7 +150,6 @@ public final class AutomaticZenRule implements Parcelable {
    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
@@ -256,7 +252,6 @@ public final class AutomaticZenRule implements Parcelable {
            mIconResId = source.readInt();
            mTriggerDescription = getTrimmedString(source.readString(), MAX_DESC_LENGTH);
            mType = source.readInt();
            mUserModifiedFields = source.readInt();
        }
    }

@@ -307,8 +302,7 @@ 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.
    // TODO: b/310620812 - Consider removing completely. Seems not be used anywhere except tests.
    public boolean isModified() {
        return mModified;
    }
@@ -506,32 +500,6 @@ 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;
@@ -560,7 +528,6 @@ public final class AutomaticZenRule implements Parcelable {
            dest.writeInt(mIconResId);
            dest.writeString(mTriggerDescription);
            dest.writeInt(mType);
            dest.writeInt(mUserModifiedFields);
        }
    }

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

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

    @FlaggedApi(Flags.FLAG_MODES_API)
    private String modifiedFieldsToString(int bitmask) {
    /** @hide */
    public static String fieldsToString(@ModifiableField int bitmask) {
        ArrayList<String> modified = new ArrayList<>();
        if ((bitmask & FIELD_NAME) != 0) {
            modified.add("FIELD_NAME");
@@ -623,8 +588,7 @@ public final class AutomaticZenRule implements Parcelable {
                    && other.mAllowManualInvocation == mAllowManualInvocation
                    && other.mIconResId == mIconResId
                    && Objects.equals(other.mTriggerDescription, mTriggerDescription)
                    && other.mType == mType
                    && other.mUserModifiedFields == mUserModifiedFields;
                    && other.mType == mType;
        }
        return finalEquals;
    }
@@ -634,8 +598,7 @@ 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,
                    mUserModifiedFields);
                    mPkg, mAllowManualInvocation, mIconResId, mTriggerDescription, mType);
        }
        return Objects.hash(enabled, name, interruptionFilter, conditionId, owner,
                configurationActivity, mZenPolicy, mModified, creationTime, mPkg);
@@ -704,7 +667,6 @@ 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();
@@ -721,7 +683,6 @@ 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) {
@@ -848,19 +809,6 @@ 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);
@@ -871,7 +819,6 @@ public final class AutomaticZenRule implements Parcelable {
            rule.mIconResId = mIconResId;
            rule.mAllowManualInvocation = mAllowManualInvocation;
            rule.setPackageName(mPkg);
            rule.mUserModifiedFields = mUserModifiedFields;

            return rule;
        }
+10 −50
Original line number Diff line number Diff line
@@ -20,7 +20,6 @@ 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;
@@ -37,8 +36,8 @@ 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()}.
    /**
     * Enum for the user-modifiable fields in this object.
     * @hide
     */
    @IntDef(flag = true, prefix = { "FIELD_" }, value = {
@@ -59,52 +58,42 @@ public final class ZenDeviceEffects implements Parcelable {
    /**
     * @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;
@@ -119,13 +108,10 @@ 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,
            @ModifiableField int userModifiedFields) {
            boolean minimizeRadioUsage, boolean maximizeDoze) {
        mGrayscale = grayscale;
        mSuppressAmbientDisplay = suppressAmbientDisplay;
        mDimWallpaper = dimWallpaper;
@@ -136,7 +122,6 @@ public final class ZenDeviceEffects implements Parcelable {
        mDisableTouch = disableTouch;
        mMinimizeRadioUsage = minimizeRadioUsage;
        mMaximizeDoze = maximizeDoze;
        mUserModifiedFields = userModifiedFields;
    }

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

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

    @Override
@@ -177,11 +161,11 @@ 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) + "]"
                + " userModifiedFields: " + modifiedFieldsToString(mUserModifiedFields);
        return "[" + String.join(", ", effects) + "]";
    }

    private String modifiedFieldsToString(int bitmask) {
    /** @hide */
    public static String fieldsToString(@ModifiableField int bitmask) {
        ArrayList<String> modified = new ArrayList<>();
        if ((bitmask & FIELD_GRAYSCALE) != 0) {
            modified.add("FIELD_GRAYSCALE");
@@ -312,7 +296,7 @@ public final class ZenDeviceEffects implements Parcelable {
            return new ZenDeviceEffects(in.readBoolean(),
                    in.readBoolean(), in.readBoolean(), in.readBoolean(), in.readBoolean(),
                    in.readBoolean(), in.readBoolean(), in.readBoolean(), in.readBoolean(),
                    in.readBoolean(), in.readInt());
                    in.readBoolean());
        }

        @Override
@@ -321,16 +305,6 @@ 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;
@@ -348,7 +322,6 @@ public final class ZenDeviceEffects implements Parcelable {
        dest.writeBoolean(mDisableTouch);
        dest.writeBoolean(mMinimizeRadioUsage);
        dest.writeBoolean(mMaximizeDoze);
        dest.writeInt(mUserModifiedFields);
    }

    /** Builder class for {@link ZenDeviceEffects} objects. */
@@ -365,7 +338,6 @@ 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).
@@ -388,7 +360,6 @@ public final class ZenDeviceEffects implements Parcelable {
            mDisableTouch = zenDeviceEffects.shouldDisableTouch();
            mMinimizeRadioUsage = zenDeviceEffects.shouldMinimizeRadioUsage();
            mMaximizeDoze = zenDeviceEffects.shouldMaximizeDoze();
            mUserModifiedFields = zenDeviceEffects.mUserModifiedFields;
        }

        /**
@@ -510,24 +481,13 @@ 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, mUserModifiedFields);
                    mMaximizeDoze);
        }
    }
}
+42 −13

File changed.

Preview size limit exceeded, changes collapsed.

Loading