Loading core/java/android/service/notification/ZenModeConfig.java +10 −9 Original line number Diff line number Diff line Loading @@ -683,7 +683,7 @@ public class ZenModeConfig implements Parcelable { if (Flags.modesApi()) { rt.zenDeviceEffects = readZenDeviceEffectsXml(parser); rt.allowManualInvocation = safeBoolean(parser, RULE_ATT_ALLOW_MANUAL, false); rt.iconResId = safeInt(parser, RULE_ATT_ICON, 0); rt.iconResName = parser.getAttributeValue(null, RULE_ATT_ICON); rt.triggerDescription = parser.getAttributeValue(null, RULE_ATT_TRIGGER_DESC); rt.type = safeInt(parser, RULE_ATT_TYPE, AutomaticZenRule.TYPE_UNKNOWN); } Loading Loading @@ -725,7 +725,9 @@ public class ZenModeConfig implements Parcelable { out.attributeBoolean(null, RULE_ATT_MODIFIED, rule.modified); if (Flags.modesApi()) { out.attributeBoolean(null, RULE_ATT_ALLOW_MANUAL, rule.allowManualInvocation); out.attributeInt(null, RULE_ATT_ICON, rule.iconResId); if (rule.iconResName != null) { out.attribute(null, RULE_ATT_ICON, rule.iconResName); } if (rule.triggerDescription != null) { out.attribute(null, RULE_ATT_TRIGGER_DESC, rule.triggerDescription); } Loading Loading @@ -1918,8 +1920,7 @@ public class ZenModeConfig implements Parcelable { public String pkg; public int type = AutomaticZenRule.TYPE_UNKNOWN; public String triggerDescription; // TODO (b/308672670): switch to string res name public int iconResId; public String iconResName; public boolean allowManualInvocation; public ZenRule() { } Loading Loading @@ -1950,7 +1951,7 @@ public class ZenModeConfig implements Parcelable { pkg = source.readString(); if (Flags.modesApi()) { allowManualInvocation = source.readBoolean(); iconResId = source.readInt(); iconResName = source.readString(); triggerDescription = source.readString(); type = source.readInt(); } Loading Loading @@ -1997,7 +1998,7 @@ public class ZenModeConfig implements Parcelable { dest.writeString(pkg); if (Flags.modesApi()) { dest.writeBoolean(allowManualInvocation); dest.writeInt(iconResId); dest.writeString(iconResName); dest.writeString(triggerDescription); dest.writeInt(type); } Loading Loading @@ -2026,7 +2027,7 @@ public class ZenModeConfig implements Parcelable { if (Flags.modesApi()) { sb.append(",deviceEffects=").append(zenDeviceEffects) .append(",allowManualInvocation=").append(allowManualInvocation) .append(",iconResId=").append(iconResId) .append(",iconResName=").append(iconResName) .append(",triggerDescription=").append(triggerDescription) .append(",type=").append(type); } Loading Loading @@ -2085,7 +2086,7 @@ public class ZenModeConfig implements Parcelable { return finalEquals && Objects.equals(other.zenDeviceEffects, zenDeviceEffects) && other.allowManualInvocation == allowManualInvocation && other.iconResId == iconResId && Objects.equals(other.iconResName, iconResName) && Objects.equals(other.triggerDescription, triggerDescription) && other.type == type; } Loading @@ -2098,7 +2099,7 @@ public class ZenModeConfig implements Parcelable { if (Flags.modesApi()) { return Objects.hash(enabled, snoozing, name, zenMode, conditionId, condition, component, configurationActivity, pkg, id, enabler, zenPolicy, zenDeviceEffects, modified, allowManualInvocation, iconResId, zenDeviceEffects, modified, allowManualInvocation, iconResName, triggerDescription, type); } return Objects.hash(enabled, snoozing, name, zenMode, conditionId, condition, Loading core/java/android/service/notification/ZenModeDiff.java +3 −3 Original line number Diff line number Diff line Loading @@ -464,7 +464,7 @@ public class ZenModeDiff { public static final String FIELD_MODIFIED = "modified"; public static final String FIELD_PKG = "pkg"; public static final String FIELD_ALLOW_MANUAL = "allowManualInvocation"; public static final String FIELD_ICON_RES = "iconResId"; public static final String FIELD_ICON_RES = "iconResName"; public static final String FIELD_TRIGGER_DESCRIPTION = "triggerDescription"; public static final String FIELD_TYPE = "type"; // NOTE: new field strings must match the variable names in ZenModeConfig.ZenRule Loading Loading @@ -559,8 +559,8 @@ public class ZenModeDiff { addField(FIELD_ALLOW_MANUAL, new FieldDiff<>(from.allowManualInvocation, to.allowManualInvocation)); } if (!Objects.equals(from.iconResId, to.iconResId)) { addField(FIELD_ICON_RES, new FieldDiff<>(from.iconResId, to.iconResId)); if (!Objects.equals(from.iconResName, to.iconResName)) { addField(FIELD_ICON_RES, new FieldDiff<>(from.iconResName, to.iconResName)); } } } Loading services/core/java/com/android/server/notification/ZenModeHelper.java +43 −10 Original line number Diff line number Diff line Loading @@ -28,6 +28,8 @@ import static android.service.notification.NotificationServiceProto.ROOT_CONFIG; import static com.android.internal.util.FrameworkStatsLog.DND_MODE_RULE; import android.annotation.IntDef; import android.annotation.DrawableRes; import android.annotation.NonNull; import android.annotation.Nullable; import android.annotation.SuppressLint; import android.annotation.UserIdInt; Loading Loading @@ -79,6 +81,7 @@ import android.service.notification.ZenModeConfig; import android.service.notification.ZenModeConfig.ZenRule; import android.service.notification.ZenModeProto; import android.service.notification.ZenPolicy; import android.text.TextUtils; import android.util.AndroidRuntimeException; import android.util.ArrayMap; import android.util.Log; Loading Loading @@ -868,7 +871,8 @@ public class ZenModeHelper { return null; } private static void populateZenRule(String pkg, AutomaticZenRule automaticZenRule, ZenRule rule, @VisibleForTesting void populateZenRule(String pkg, AutomaticZenRule automaticZenRule, ZenRule rule, boolean isNew, @ChangeOrigin int origin) { // TODO: b/308671593,b/311406021 - Handle origins more precisely: // - FROM_USER can override anything and updates bitmask of user-modified fields; Loading Loading @@ -902,14 +906,14 @@ public class ZenModeHelper { if (Flags.modesApi()) { rule.allowManualInvocation = automaticZenRule.isManualInvocationAllowed(); rule.iconResId = automaticZenRule.getIconResId(); rule.iconResName = drawableResIdToResName(rule.pkg, automaticZenRule.getIconResId()); rule.triggerDescription = automaticZenRule.getTriggerDescription(); rule.type = automaticZenRule.getType(); } } /** " * Fix" {@link ZenDeviceEffects} that are being stored as part of a new or updated ZenRule. /** * Fix {@link ZenDeviceEffects} that are being stored as part of a new or updated ZenRule. * * <ul> * <li> Apps cannot turn on hidden effects (those tagged as {@code @hide}) since they are Loading Loading @@ -952,13 +956,13 @@ public class ZenModeHelper { } } private static AutomaticZenRule zenRuleToAutomaticZenRule(ZenRule rule) { private AutomaticZenRule zenRuleToAutomaticZenRule(ZenRule rule) { AutomaticZenRule azr; if (Flags.modesApi()) { azr = new AutomaticZenRule.Builder(rule.name, rule.conditionId) .setManualInvocationAllowed(rule.allowManualInvocation) .setCreationTime(rule.creationTime) .setIconResId(rule.iconResId) .setIconResId(drawableResNameToResId(rule.pkg, rule.iconResName)) .setType(rule.type) .setZenPolicy(rule.zenPolicy) .setDeviceEffects(rule.zenDeviceEffects) Loading Loading @@ -1942,6 +1946,35 @@ public class ZenModeHelper { .build(); } private int drawableResNameToResId(String packageName, String resourceName) { if (TextUtils.isEmpty(resourceName)) { return 0; } try { final Resources res = mPm.getResourcesForApplication(packageName); return res.getIdentifier(resourceName, null, null); } catch (PackageManager.NameNotFoundException e) { Slog.w(TAG, "cannot load rule icon for pkg", e); } return 0; } private String drawableResIdToResName(String packageName, @DrawableRes int resId) { if (resId == 0) { return null; } try { final Resources res = mPm.getResourcesForApplication(packageName); final String fullName = res.getResourceName(resId); return fullName; } catch (PackageManager.NameNotFoundException | Resources.NotFoundException e) { Log.e(TAG, "Resource name for ID=" + resId + " not found in package " + packageName + ". Resource IDs may change when the application is upgraded, and the system" + " may not be able to find the correct resource."); return null; } } private final class Metrics extends Callback { private static final String COUNTER_MODE_PREFIX = "dnd_mode_"; private static final String COUNTER_TYPE_PREFIX = "dnd_type_"; Loading services/tests/uiservicestests/src/com/android/server/notification/ZenModeConfigTest.java +5 −5 Original line number Diff line number Diff line Loading @@ -75,7 +75,7 @@ public class ZenModeConfigTest extends UiServiceTestCase { private final String TRIGGER_DESC = "Every Night, 10pm to 6am"; private final int TYPE = TYPE_BEDTIME; private final boolean ALLOW_MANUAL = true; private final int ICON_RES_ID = 1234; private final String ICON_RES_NAME = "icon_res"; private final int INTERRUPTION_FILTER = Settings.Global.ZEN_MODE_ALARMS; private final boolean ENABLED = true; private final int CREATION_TIME = 123; Loading Loading @@ -347,7 +347,7 @@ public class ZenModeConfigTest extends UiServiceTestCase { rule.allowManualInvocation = ALLOW_MANUAL; rule.type = TYPE; rule.iconResId = ICON_RES_ID; rule.iconResName = ICON_RES_NAME; rule.triggerDescription = TRIGGER_DESC; Parcel parcel = Parcel.obtain(); Loading @@ -369,7 +369,7 @@ public class ZenModeConfigTest extends UiServiceTestCase { assertEquals(rule.zenMode, parceled.zenMode); assertEquals(rule.allowManualInvocation, parceled.allowManualInvocation); assertEquals(rule.iconResId, parceled.iconResId); assertEquals(rule.iconResName, parceled.iconResName); assertEquals(rule.type, parceled.type); assertEquals(rule.triggerDescription, parceled.triggerDescription); assertEquals(rule.zenPolicy, parceled.zenPolicy); Loading Loading @@ -448,7 +448,7 @@ public class ZenModeConfigTest extends UiServiceTestCase { rule.allowManualInvocation = ALLOW_MANUAL; rule.type = TYPE; rule.iconResId = ICON_RES_ID; rule.iconResName = ICON_RES_NAME; rule.triggerDescription = TRIGGER_DESC; ByteArrayOutputStream baos = new ByteArrayOutputStream(); Loading Loading @@ -477,7 +477,7 @@ public class ZenModeConfigTest extends UiServiceTestCase { assertEquals(rule.allowManualInvocation, fromXml.allowManualInvocation); assertEquals(rule.type, fromXml.type); assertEquals(rule.triggerDescription, fromXml.triggerDescription); assertEquals(rule.iconResId, fromXml.iconResId); assertEquals(rule.iconResName, fromXml.iconResName); } @Test Loading services/tests/uiservicestests/src/com/android/server/notification/ZenModeDiffTest.java +1 −1 Original line number Diff line number Diff line Loading @@ -299,7 +299,7 @@ public class ZenModeDiffTest extends UiServiceTestCase { if (android.app.Flags.modesApi()) { rule.allowManualInvocation = true; rule.type = AutomaticZenRule.TYPE_SCHEDULE_TIME; rule.iconResId = 123; rule.iconResName = "res"; rule.triggerDescription = "At night"; rule.zenDeviceEffects = new ZenDeviceEffects.Builder() .setShouldDimWallpaper(true) Loading Loading
core/java/android/service/notification/ZenModeConfig.java +10 −9 Original line number Diff line number Diff line Loading @@ -683,7 +683,7 @@ public class ZenModeConfig implements Parcelable { if (Flags.modesApi()) { rt.zenDeviceEffects = readZenDeviceEffectsXml(parser); rt.allowManualInvocation = safeBoolean(parser, RULE_ATT_ALLOW_MANUAL, false); rt.iconResId = safeInt(parser, RULE_ATT_ICON, 0); rt.iconResName = parser.getAttributeValue(null, RULE_ATT_ICON); rt.triggerDescription = parser.getAttributeValue(null, RULE_ATT_TRIGGER_DESC); rt.type = safeInt(parser, RULE_ATT_TYPE, AutomaticZenRule.TYPE_UNKNOWN); } Loading Loading @@ -725,7 +725,9 @@ public class ZenModeConfig implements Parcelable { out.attributeBoolean(null, RULE_ATT_MODIFIED, rule.modified); if (Flags.modesApi()) { out.attributeBoolean(null, RULE_ATT_ALLOW_MANUAL, rule.allowManualInvocation); out.attributeInt(null, RULE_ATT_ICON, rule.iconResId); if (rule.iconResName != null) { out.attribute(null, RULE_ATT_ICON, rule.iconResName); } if (rule.triggerDescription != null) { out.attribute(null, RULE_ATT_TRIGGER_DESC, rule.triggerDescription); } Loading Loading @@ -1918,8 +1920,7 @@ public class ZenModeConfig implements Parcelable { public String pkg; public int type = AutomaticZenRule.TYPE_UNKNOWN; public String triggerDescription; // TODO (b/308672670): switch to string res name public int iconResId; public String iconResName; public boolean allowManualInvocation; public ZenRule() { } Loading Loading @@ -1950,7 +1951,7 @@ public class ZenModeConfig implements Parcelable { pkg = source.readString(); if (Flags.modesApi()) { allowManualInvocation = source.readBoolean(); iconResId = source.readInt(); iconResName = source.readString(); triggerDescription = source.readString(); type = source.readInt(); } Loading Loading @@ -1997,7 +1998,7 @@ public class ZenModeConfig implements Parcelable { dest.writeString(pkg); if (Flags.modesApi()) { dest.writeBoolean(allowManualInvocation); dest.writeInt(iconResId); dest.writeString(iconResName); dest.writeString(triggerDescription); dest.writeInt(type); } Loading Loading @@ -2026,7 +2027,7 @@ public class ZenModeConfig implements Parcelable { if (Flags.modesApi()) { sb.append(",deviceEffects=").append(zenDeviceEffects) .append(",allowManualInvocation=").append(allowManualInvocation) .append(",iconResId=").append(iconResId) .append(",iconResName=").append(iconResName) .append(",triggerDescription=").append(triggerDescription) .append(",type=").append(type); } Loading Loading @@ -2085,7 +2086,7 @@ public class ZenModeConfig implements Parcelable { return finalEquals && Objects.equals(other.zenDeviceEffects, zenDeviceEffects) && other.allowManualInvocation == allowManualInvocation && other.iconResId == iconResId && Objects.equals(other.iconResName, iconResName) && Objects.equals(other.triggerDescription, triggerDescription) && other.type == type; } Loading @@ -2098,7 +2099,7 @@ public class ZenModeConfig implements Parcelable { if (Flags.modesApi()) { return Objects.hash(enabled, snoozing, name, zenMode, conditionId, condition, component, configurationActivity, pkg, id, enabler, zenPolicy, zenDeviceEffects, modified, allowManualInvocation, iconResId, zenDeviceEffects, modified, allowManualInvocation, iconResName, triggerDescription, type); } return Objects.hash(enabled, snoozing, name, zenMode, conditionId, condition, Loading
core/java/android/service/notification/ZenModeDiff.java +3 −3 Original line number Diff line number Diff line Loading @@ -464,7 +464,7 @@ public class ZenModeDiff { public static final String FIELD_MODIFIED = "modified"; public static final String FIELD_PKG = "pkg"; public static final String FIELD_ALLOW_MANUAL = "allowManualInvocation"; public static final String FIELD_ICON_RES = "iconResId"; public static final String FIELD_ICON_RES = "iconResName"; public static final String FIELD_TRIGGER_DESCRIPTION = "triggerDescription"; public static final String FIELD_TYPE = "type"; // NOTE: new field strings must match the variable names in ZenModeConfig.ZenRule Loading Loading @@ -559,8 +559,8 @@ public class ZenModeDiff { addField(FIELD_ALLOW_MANUAL, new FieldDiff<>(from.allowManualInvocation, to.allowManualInvocation)); } if (!Objects.equals(from.iconResId, to.iconResId)) { addField(FIELD_ICON_RES, new FieldDiff<>(from.iconResId, to.iconResId)); if (!Objects.equals(from.iconResName, to.iconResName)) { addField(FIELD_ICON_RES, new FieldDiff<>(from.iconResName, to.iconResName)); } } } Loading
services/core/java/com/android/server/notification/ZenModeHelper.java +43 −10 Original line number Diff line number Diff line Loading @@ -28,6 +28,8 @@ import static android.service.notification.NotificationServiceProto.ROOT_CONFIG; import static com.android.internal.util.FrameworkStatsLog.DND_MODE_RULE; import android.annotation.IntDef; import android.annotation.DrawableRes; import android.annotation.NonNull; import android.annotation.Nullable; import android.annotation.SuppressLint; import android.annotation.UserIdInt; Loading Loading @@ -79,6 +81,7 @@ import android.service.notification.ZenModeConfig; import android.service.notification.ZenModeConfig.ZenRule; import android.service.notification.ZenModeProto; import android.service.notification.ZenPolicy; import android.text.TextUtils; import android.util.AndroidRuntimeException; import android.util.ArrayMap; import android.util.Log; Loading Loading @@ -868,7 +871,8 @@ public class ZenModeHelper { return null; } private static void populateZenRule(String pkg, AutomaticZenRule automaticZenRule, ZenRule rule, @VisibleForTesting void populateZenRule(String pkg, AutomaticZenRule automaticZenRule, ZenRule rule, boolean isNew, @ChangeOrigin int origin) { // TODO: b/308671593,b/311406021 - Handle origins more precisely: // - FROM_USER can override anything and updates bitmask of user-modified fields; Loading Loading @@ -902,14 +906,14 @@ public class ZenModeHelper { if (Flags.modesApi()) { rule.allowManualInvocation = automaticZenRule.isManualInvocationAllowed(); rule.iconResId = automaticZenRule.getIconResId(); rule.iconResName = drawableResIdToResName(rule.pkg, automaticZenRule.getIconResId()); rule.triggerDescription = automaticZenRule.getTriggerDescription(); rule.type = automaticZenRule.getType(); } } /** " * Fix" {@link ZenDeviceEffects} that are being stored as part of a new or updated ZenRule. /** * Fix {@link ZenDeviceEffects} that are being stored as part of a new or updated ZenRule. * * <ul> * <li> Apps cannot turn on hidden effects (those tagged as {@code @hide}) since they are Loading Loading @@ -952,13 +956,13 @@ public class ZenModeHelper { } } private static AutomaticZenRule zenRuleToAutomaticZenRule(ZenRule rule) { private AutomaticZenRule zenRuleToAutomaticZenRule(ZenRule rule) { AutomaticZenRule azr; if (Flags.modesApi()) { azr = new AutomaticZenRule.Builder(rule.name, rule.conditionId) .setManualInvocationAllowed(rule.allowManualInvocation) .setCreationTime(rule.creationTime) .setIconResId(rule.iconResId) .setIconResId(drawableResNameToResId(rule.pkg, rule.iconResName)) .setType(rule.type) .setZenPolicy(rule.zenPolicy) .setDeviceEffects(rule.zenDeviceEffects) Loading Loading @@ -1942,6 +1946,35 @@ public class ZenModeHelper { .build(); } private int drawableResNameToResId(String packageName, String resourceName) { if (TextUtils.isEmpty(resourceName)) { return 0; } try { final Resources res = mPm.getResourcesForApplication(packageName); return res.getIdentifier(resourceName, null, null); } catch (PackageManager.NameNotFoundException e) { Slog.w(TAG, "cannot load rule icon for pkg", e); } return 0; } private String drawableResIdToResName(String packageName, @DrawableRes int resId) { if (resId == 0) { return null; } try { final Resources res = mPm.getResourcesForApplication(packageName); final String fullName = res.getResourceName(resId); return fullName; } catch (PackageManager.NameNotFoundException | Resources.NotFoundException e) { Log.e(TAG, "Resource name for ID=" + resId + " not found in package " + packageName + ". Resource IDs may change when the application is upgraded, and the system" + " may not be able to find the correct resource."); return null; } } private final class Metrics extends Callback { private static final String COUNTER_MODE_PREFIX = "dnd_mode_"; private static final String COUNTER_TYPE_PREFIX = "dnd_type_"; Loading
services/tests/uiservicestests/src/com/android/server/notification/ZenModeConfigTest.java +5 −5 Original line number Diff line number Diff line Loading @@ -75,7 +75,7 @@ public class ZenModeConfigTest extends UiServiceTestCase { private final String TRIGGER_DESC = "Every Night, 10pm to 6am"; private final int TYPE = TYPE_BEDTIME; private final boolean ALLOW_MANUAL = true; private final int ICON_RES_ID = 1234; private final String ICON_RES_NAME = "icon_res"; private final int INTERRUPTION_FILTER = Settings.Global.ZEN_MODE_ALARMS; private final boolean ENABLED = true; private final int CREATION_TIME = 123; Loading Loading @@ -347,7 +347,7 @@ public class ZenModeConfigTest extends UiServiceTestCase { rule.allowManualInvocation = ALLOW_MANUAL; rule.type = TYPE; rule.iconResId = ICON_RES_ID; rule.iconResName = ICON_RES_NAME; rule.triggerDescription = TRIGGER_DESC; Parcel parcel = Parcel.obtain(); Loading @@ -369,7 +369,7 @@ public class ZenModeConfigTest extends UiServiceTestCase { assertEquals(rule.zenMode, parceled.zenMode); assertEquals(rule.allowManualInvocation, parceled.allowManualInvocation); assertEquals(rule.iconResId, parceled.iconResId); assertEquals(rule.iconResName, parceled.iconResName); assertEquals(rule.type, parceled.type); assertEquals(rule.triggerDescription, parceled.triggerDescription); assertEquals(rule.zenPolicy, parceled.zenPolicy); Loading Loading @@ -448,7 +448,7 @@ public class ZenModeConfigTest extends UiServiceTestCase { rule.allowManualInvocation = ALLOW_MANUAL; rule.type = TYPE; rule.iconResId = ICON_RES_ID; rule.iconResName = ICON_RES_NAME; rule.triggerDescription = TRIGGER_DESC; ByteArrayOutputStream baos = new ByteArrayOutputStream(); Loading Loading @@ -477,7 +477,7 @@ public class ZenModeConfigTest extends UiServiceTestCase { assertEquals(rule.allowManualInvocation, fromXml.allowManualInvocation); assertEquals(rule.type, fromXml.type); assertEquals(rule.triggerDescription, fromXml.triggerDescription); assertEquals(rule.iconResId, fromXml.iconResId); assertEquals(rule.iconResName, fromXml.iconResName); } @Test Loading
services/tests/uiservicestests/src/com/android/server/notification/ZenModeDiffTest.java +1 −1 Original line number Diff line number Diff line Loading @@ -299,7 +299,7 @@ public class ZenModeDiffTest extends UiServiceTestCase { if (android.app.Flags.modesApi()) { rule.allowManualInvocation = true; rule.type = AutomaticZenRule.TYPE_SCHEDULE_TIME; rule.iconResId = 123; rule.iconResName = "res"; rule.triggerDescription = "At night"; rule.zenDeviceEffects = new ZenDeviceEffects.Builder() .setShouldDimWallpaper(true) Loading