diff options
| author | 2024-10-30 16:12:01 +0000 | |
|---|---|---|
| committer | 2024-10-30 16:12:01 +0000 | |
| commit | d9b1b338e4e7f5c02ded8bf8c7bef51459075c1c (patch) | |
| tree | 7a5e2cc537426441ef0d1120953420778e4f7302 | |
| parent | 2df95c98fb264d8145eee85b7015d568b38dcd07 (diff) | |
| parent | f23314872d827e4b015737525abe45c1c5ee20e9 (diff) | |
Merge "Add B&R logging for Modes" into main
8 files changed, 361 insertions, 79 deletions
diff --git a/core/java/android/app/backup/NotificationLoggingConstants.java b/core/java/android/app/backup/NotificationLoggingConstants.java new file mode 100644 index 000000000000..add456286df3 --- /dev/null +++ b/core/java/android/app/backup/NotificationLoggingConstants.java @@ -0,0 +1,33 @@ +/* + * Copyright (C) 2024 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.app.backup; + +/** + * @hide + */ +public class NotificationLoggingConstants { + + // Key under which the payload blob is stored + public static final String KEY_NOTIFICATIONS = "notifications"; + + @BackupRestoreEventLogger.BackupRestoreDataType + public static final String DATA_TYPE_ZEN_CONFIG = KEY_NOTIFICATIONS + ":zen_config"; + @BackupRestoreEventLogger.BackupRestoreDataType + public static final String DATA_TYPE_ZEN_RULES = KEY_NOTIFICATIONS + ":zen_rules"; + + @BackupRestoreEventLogger.BackupRestoreError + public static final String ERROR_XML_PARSING = KEY_NOTIFICATIONS + ":invalid_xml_parsing"; +} diff --git a/core/java/android/service/notification/ZenModeConfig.java b/core/java/android/service/notification/ZenModeConfig.java index e1732559e262..24328eb1e825 100644 --- a/core/java/android/service/notification/ZenModeConfig.java +++ b/core/java/android/service/notification/ZenModeConfig.java @@ -24,12 +24,12 @@ import static android.app.NotificationManager.Policy.SUPPRESSED_EFFECT_FULL_SCRE import static android.app.NotificationManager.Policy.SUPPRESSED_EFFECT_LIGHTS; import static android.app.NotificationManager.Policy.SUPPRESSED_EFFECT_PEEK; import static android.app.NotificationManager.Policy.SUPPRESSED_EFFECT_SCREEN_OFF; +import static android.app.backup.NotificationLoggingConstants.DATA_TYPE_ZEN_RULES; import static android.provider.Settings.Global.ZEN_MODE_IMPORTANT_INTERRUPTIONS; import static android.service.notification.SystemZenRules.PACKAGE_ANDROID; import static android.service.notification.ZenAdapters.peopleTypeToPrioritySenders; import static android.service.notification.ZenAdapters.prioritySendersToPeopleType; import static android.service.notification.ZenAdapters.zenPolicyConversationSendersToNotificationPolicy; -import static android.service.notification.ZenModeConfig.EventInfo.REPLY_YES_OR_MAYBE; import static android.service.notification.ZenPolicy.PEOPLE_TYPE_STARRED; import static android.service.notification.ZenPolicy.PRIORITY_CATEGORY_ALARMS; import static android.service.notification.ZenPolicy.PRIORITY_CATEGORY_CALLS; @@ -56,6 +56,7 @@ import android.app.AutomaticZenRule; import android.app.Flags; import android.app.NotificationManager; import android.app.NotificationManager.Policy; +import android.app.backup.BackupRestoreEventLogger; import android.compat.annotation.UnsupportedAppUsage; import android.content.ComponentName; import android.content.Context; @@ -957,8 +958,9 @@ public class ZenModeConfig implements Parcelable { } } - public static ZenModeConfig readXml(TypedXmlPullParser parser) - throws XmlPullParserException, IOException { + public static ZenModeConfig readXml(TypedXmlPullParser parser, + @Nullable BackupRestoreEventLogger logger) throws XmlPullParserException, IOException { + int readRuleCount = 0; int type = parser.getEventType(); if (type != XmlPullParser.START_TAG) return null; String tag = parser.getName(); @@ -1048,6 +1050,8 @@ public class ZenModeConfig implements Parcelable { readManualRule = true; if (rt.manualRule.zenPolicy == null) { readManualRuleWithoutPolicy = true; + } else { + readRuleCount++; } } else if (AUTOMATIC_TAG.equals(tag) || (Flags.modesApi() && AUTOMATIC_DELETED_TAG.equals(tag))) { @@ -1062,6 +1066,7 @@ public class ZenModeConfig implements Parcelable { } } else if (AUTOMATIC_TAG.equals(tag)) { rt.automaticRules.put(id, automaticRule); + readRuleCount++; } } } else if (STATE_TAG.equals(tag)) { @@ -1085,8 +1090,17 @@ public class ZenModeConfig implements Parcelable { } rt.manualRule.condition = new Condition(rt.manualRule.conditionId, "", Condition.STATE_TRUE); + readRuleCount++; } } + + if (!Flags.modesUi()){ + readRuleCount++; + } + + if (logger != null) { + logger.logItemsRestored(DATA_TYPE_ZEN_RULES, readRuleCount); + } return rt; } } @@ -1110,8 +1124,9 @@ public class ZenModeConfig implements Parcelable { * @throws IOException */ - public void writeXml(TypedXmlSerializer out, Integer version, boolean forBackup) - throws IOException { + public void writeXml(TypedXmlSerializer out, Integer version, boolean forBackup, + @Nullable BackupRestoreEventLogger logger) throws IOException { + int writtenRuleCount = 0; int xmlVersion = getCurrentXmlVersion(); out.startTag(null, ZEN_TAG); out.attribute(null, ZEN_ATT_VERSION, version == null @@ -1147,6 +1162,7 @@ public class ZenModeConfig implements Parcelable { writeRuleXml(manualRule, out, forBackup); out.endTag(null, MANUAL_TAG); } + writtenRuleCount++; final int N = automaticRules.size(); for (int i = 0; i < N; i++) { final String id = automaticRules.keyAt(i); @@ -1155,6 +1171,7 @@ public class ZenModeConfig implements Parcelable { out.attribute(null, RULE_ATT_ID, id); writeRuleXml(automaticRule, out, forBackup); out.endTag(null, AUTOMATIC_TAG); + writtenRuleCount++; } if (Flags.modesApi() && !forBackup) { for (int i = 0; i < deletedRules.size(); i++) { @@ -1171,6 +1188,9 @@ public class ZenModeConfig implements Parcelable { out.endTag(null, STATE_TAG); out.endTag(null, ZEN_TAG); + if (logger != null) { + logger.logItemsBackedUp(DATA_TYPE_ZEN_RULES, writtenRuleCount); + } } @NonNull diff --git a/services/core/java/com/android/server/notification/NotificationBackupHelper.java b/services/core/java/com/android/server/notification/NotificationBackupHelper.java index ee9ec159a5e0..9df44a41877f 100644 --- a/services/core/java/com/android/server/notification/NotificationBackupHelper.java +++ b/services/core/java/com/android/server/notification/NotificationBackupHelper.java @@ -16,6 +16,8 @@ package com.android.server.notification; +import static android.app.backup.NotificationLoggingConstants.KEY_NOTIFICATIONS; + import android.app.INotificationManager; import android.app.backup.BlobBackupHelper; import android.os.ServiceManager; @@ -31,9 +33,6 @@ public class NotificationBackupHelper extends BlobBackupHelper { // Current version of the blob schema static final int BLOB_VERSION = 1; - // Key under which the payload blob is stored - static final String KEY_NOTIFICATIONS = "notifications"; - private final int mUserId; private final NotificationManagerInternal mNm; diff --git a/services/core/java/com/android/server/notification/NotificationManagerService.java b/services/core/java/com/android/server/notification/NotificationManagerService.java index bb0aaaff4806..62df825617cd 100644 --- a/services/core/java/com/android/server/notification/NotificationManagerService.java +++ b/services/core/java/com/android/server/notification/NotificationManagerService.java @@ -161,6 +161,8 @@ import static com.android.internal.util.Preconditions.checkNotNull; import static com.android.server.am.PendingIntentRecord.FLAG_ACTIVITY_SENDER; import static com.android.server.am.PendingIntentRecord.FLAG_BROADCAST_SENDER; import static com.android.server.am.PendingIntentRecord.FLAG_SERVICE_SENDER; +import static android.app.backup.NotificationLoggingConstants.DATA_TYPE_ZEN_CONFIG; +import static android.app.backup.NotificationLoggingConstants.ERROR_XML_PARSING; import static com.android.server.notification.Flags.expireBitmaps; import static com.android.server.policy.PhoneWindowManager.TOAST_WINDOW_ANIM_BUFFER; import static com.android.server.policy.PhoneWindowManager.TOAST_WINDOW_TIMEOUT; @@ -1098,7 +1100,7 @@ public class NotificationManagerService extends SystemService { } void readPolicyXml(InputStream stream, boolean forRestore, int userId, - BackupRestoreEventLogger logger) + @Nullable BackupRestoreEventLogger logger) throws XmlPullParserException, NumberFormatException, IOException { final TypedXmlPullParser parser; if (forRestore) { @@ -1114,7 +1116,27 @@ public class NotificationManagerService extends SystemService { int outerDepth = parser.getDepth(); while (XmlUtils.nextElementWithin(parser, outerDepth)) { if (ZenModeConfig.ZEN_TAG.equals(parser.getName())) { - mZenModeHelper.readXml(parser, forRestore, userId); + int successfulReads = 0; + int unsuccessfulReads = 0; + try { + boolean loadedCorrectly = + mZenModeHelper.readXml(parser, forRestore, userId, logger); + if (loadedCorrectly) + successfulReads++; + else + unsuccessfulReads++; + } catch (Exception e) { + Slog.wtf(TAG, "failed to read config", e); + unsuccessfulReads++; + } + if (logger != null) { + logger.logItemsRestored(DATA_TYPE_ZEN_CONFIG, successfulReads); + if (unsuccessfulReads > 0) { + logger.logItemsRestoreFailed( + DATA_TYPE_ZEN_CONFIG, unsuccessfulReads, ERROR_XML_PARSING); + } + } + } else if (PreferencesHelper.TAG_RANKING.equals(parser.getName())){ mPreferencesHelper.readXml(parser, forRestore, userId); } @@ -1246,7 +1268,7 @@ public class NotificationManagerService extends SystemService { } } - private void writePolicyXml(OutputStream stream, boolean forBackup, int userId, + void writePolicyXml(OutputStream stream, boolean forBackup, int userId, BackupRestoreEventLogger logger) throws IOException { final TypedXmlSerializer out; if (forBackup) { @@ -1258,7 +1280,7 @@ public class NotificationManagerService extends SystemService { out.startDocument(null, true); out.startTag(null, TAG_NOTIFICATION_POLICY); out.attributeInt(null, ATTR_VERSION, DB_VERSION); - mZenModeHelper.writeXml(out, forBackup, null, userId); + mZenModeHelper.writeXml(out, forBackup, null, userId, logger); mPreferencesHelper.writeXml(out, forBackup, userId); mListeners.writeXml(out, forBackup, userId); mAssistants.writeXml(out, forBackup, userId); diff --git a/services/core/java/com/android/server/notification/ZenModeHelper.java b/services/core/java/com/android/server/notification/ZenModeHelper.java index 3900870bced3..ce249c6896d0 100644 --- a/services/core/java/com/android/server/notification/ZenModeHelper.java +++ b/services/core/java/com/android/server/notification/ZenModeHelper.java @@ -43,6 +43,8 @@ import static android.service.notification.ZenModeConfig.implicitRuleId; import static com.android.internal.util.FrameworkStatsLog.DND_MODE_RULE; import static com.android.internal.util.Preconditions.checkArgument; +import static android.app.backup.NotificationLoggingConstants.DATA_TYPE_ZEN_CONFIG; +import static android.app.backup.NotificationLoggingConstants.ERROR_XML_PARSING; import static java.util.Objects.requireNonNull; @@ -56,6 +58,7 @@ import android.app.AutomaticZenRule; import android.app.Flags; import android.app.NotificationManager; import android.app.NotificationManager.Policy; +import android.app.backup.BackupRestoreEventLogger; import android.app.compat.CompatChanges; import android.compat.annotation.ChangeId; import android.compat.annotation.EnabledSince; @@ -1759,11 +1762,10 @@ public class ZenModeHelper { pw.println(config); } - public void readXml(TypedXmlPullParser parser, boolean forRestore, int userId) - throws XmlPullParserException, IOException { - ZenModeConfig config = ZenModeConfig.readXml(parser); + public boolean readXml(TypedXmlPullParser parser, boolean forRestore, int userId, + @Nullable BackupRestoreEventLogger logger) throws XmlPullParserException, IOException { + ZenModeConfig config = ZenModeConfig.readXml(parser, logger); String reason = "readXml"; - if (config != null) { if (forRestore) { config.user = userId; @@ -1855,22 +1857,38 @@ public class ZenModeHelper { if (DEBUG) Log.d(TAG, reason); synchronized (mConfigLock) { - setConfigLocked(config, null, + return setConfigLocked(config, null, forRestore ? ORIGIN_RESTORE_BACKUP : ORIGIN_INIT, reason, Process.SYSTEM_UID); } } + return false; } - public void writeXml(TypedXmlSerializer out, boolean forBackup, Integer version, int userId) - throws IOException { + public void writeXml(TypedXmlSerializer out, boolean forBackup, Integer version, int userId, + @Nullable BackupRestoreEventLogger logger) throws IOException { synchronized (mConfigLock) { + int successfulWrites = 0; + int unsuccessfulWrites = 0; final int n = mConfigs.size(); for (int i = 0; i < n; i++) { if (forBackup && mConfigs.keyAt(i) != userId) { continue; } - mConfigs.valueAt(i).writeXml(out, version, forBackup); + try { + mConfigs.valueAt(i).writeXml(out, version, forBackup, logger); + successfulWrites++; + } catch (Exception e) { + Slog.e(TAG, "failed to write config", e); + unsuccessfulWrites++; + } + } + if (logger != null) { + logger.logItemsBackedUp(DATA_TYPE_ZEN_CONFIG, successfulWrites); + if (unsuccessfulWrites > 0) { + logger.logItemsBackupFailed(DATA_TYPE_ZEN_CONFIG, + unsuccessfulWrites, ERROR_XML_PARSING); + } } } } @@ -2501,7 +2519,8 @@ public class ZenModeHelper { try { parser = resources.getXml(R.xml.default_zen_mode_config); while (parser.next() != XmlPullParser.END_DOCUMENT) { - final ZenModeConfig config = ZenModeConfig.readXml(XmlUtils.makeTyped(parser)); + final ZenModeConfig config = + ZenModeConfig.readXml(XmlUtils.makeTyped(parser), null); if (config != null) return config; } } catch (Exception e) { diff --git a/services/tests/uiservicestests/src/com/android/server/notification/NotificationManagerServiceTest.java b/services/tests/uiservicestests/src/com/android/server/notification/NotificationManagerServiceTest.java index f60ec99edf00..b99ab0595c9d 100644 --- a/services/tests/uiservicestests/src/com/android/server/notification/NotificationManagerServiceTest.java +++ b/services/tests/uiservicestests/src/com/android/server/notification/NotificationManagerServiceTest.java @@ -77,6 +77,8 @@ import static android.app.PendingIntent.FLAG_MUTABLE; import static android.app.PendingIntent.FLAG_ONE_SHOT; import static android.app.StatusBarManager.ACTION_KEYGUARD_PRIVATE_NOTIFICATIONS_CHANGED; import static android.app.StatusBarManager.EXTRA_KM_PRIVATE_NOTIFS_ALLOWED; +import static android.app.backup.NotificationLoggingConstants.DATA_TYPE_ZEN_CONFIG; +import static android.app.backup.NotificationLoggingConstants.DATA_TYPE_ZEN_RULES; import static android.content.pm.ActivityInfo.RESIZE_MODE_RESIZEABLE; import static android.content.pm.PackageManager.FEATURE_TELECOM; import static android.content.pm.PackageManager.FEATURE_WATCH; @@ -92,6 +94,7 @@ import static android.os.PowerWhitelistManager.REASON_NOTIFICATION_SERVICE; import static android.os.PowerWhitelistManager.TEMPORARY_ALLOWLIST_TYPE_FOREGROUND_SERVICE_ALLOWED; import static android.os.UserHandle.USER_SYSTEM; import static android.os.UserManager.USER_TYPE_FULL_SECONDARY; +import static android.os.UserManager.USER_TYPE_FULL_SYSTEM; import static android.os.UserManager.USER_TYPE_PROFILE_CLONE; import static android.os.UserManager.USER_TYPE_PROFILE_MANAGED; import static android.os.UserManager.USER_TYPE_PROFILE_PRIVATE; @@ -361,6 +364,7 @@ import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.File; import java.io.FileOutputStream; +import java.io.OutputStream; import java.time.Duration; import java.util.ArrayList; import java.util.Arrays; @@ -6499,6 +6503,35 @@ public class NotificationManagerServiceTest extends UiServiceTestCase { } @Test + @EnableFlags(android.app.Flags.FLAG_BACKUP_RESTORE_LOGGING) + public void testReadPolicyXml_backupRestoreLogging() throws Exception { + BackupRestoreEventLogger logger = mock(BackupRestoreEventLogger.class); + + UserInfo ui = new UserInfo(ActivityManager.getCurrentUser(), "Clone", UserInfo.FLAG_FULL); + ui.userType = USER_TYPE_FULL_SYSTEM; + when(mUmInternal.getUserInfo(ActivityManager.getCurrentUser())).thenReturn(ui); + when(mPermissionHelper.getNotificationPermissionValues(0)).thenReturn(new ArrayMap<>()); + TypedXmlSerializer serializer = Xml.newFastSerializer(); + ByteArrayOutputStream baos = new ByteArrayOutputStream(); + serializer.setOutput(new BufferedOutputStream(baos), "utf-8"); + serializer.startDocument(null, true); + mService.writePolicyXml(baos, true, ActivityManager.getCurrentUser(), logger); + serializer.flush(); + + mService.readPolicyXml( + new BufferedInputStream(new ByteArrayInputStream(baos.toByteArray())), + true, ActivityManager.getCurrentUser(), logger); + + verify(logger).logItemsBackedUp(DATA_TYPE_ZEN_CONFIG, 1); + verify(logger, never()) + .logItemsBackupFailed(eq(DATA_TYPE_ZEN_CONFIG), anyInt(), anyString()); + + verify(logger).logItemsRestored(DATA_TYPE_ZEN_CONFIG, 1); + verify(logger, never()) + .logItemsRestoreFailed(eq(DATA_TYPE_ZEN_CONFIG), anyInt(), anyString()); + } + + @Test public void testLocaleChangedCallsUpdateDefaultZenModeRules() throws Exception { ZenModeHelper mZenModeHelper = mock(ZenModeHelper.class); mService.mZenModeHelper = mZenModeHelper; diff --git a/services/tests/uiservicestests/src/com/android/server/notification/ZenModeConfigTest.java b/services/tests/uiservicestests/src/com/android/server/notification/ZenModeConfigTest.java index 5709d884d427..bdf146fa94a8 100644 --- a/services/tests/uiservicestests/src/com/android/server/notification/ZenModeConfigTest.java +++ b/services/tests/uiservicestests/src/com/android/server/notification/ZenModeConfigTest.java @@ -17,6 +17,8 @@ package com.android.server.notification; import static android.app.AutomaticZenRule.TYPE_BEDTIME; +import static android.app.Flags.FLAG_BACKUP_RESTORE_LOGGING; +import static android.app.Flags.FLAG_MODES_API; import static android.app.Flags.FLAG_MODES_UI; import static android.app.Flags.modesUi; import static android.app.NotificationManager.Policy.SUPPRESSED_EFFECT_AMBIENT; @@ -24,6 +26,8 @@ import static android.app.NotificationManager.Policy.SUPPRESSED_EFFECT_FULL_SCRE import static android.app.NotificationManager.Policy.SUPPRESSED_EFFECT_LIGHTS; import static android.app.NotificationManager.Policy.SUPPRESSED_EFFECT_PEEK; import static android.app.NotificationManager.Policy.suppressedEffectsToString; +import static android.app.backup.NotificationLoggingConstants.DATA_TYPE_ZEN_CONFIG; +import static android.app.backup.NotificationLoggingConstants.DATA_TYPE_ZEN_RULES; import static android.provider.Settings.Global.ZEN_MODE_IMPORTANT_INTERRUPTIONS; import static android.provider.Settings.Global.ZEN_MODE_OFF; import static android.service.notification.Condition.SOURCE_UNKNOWN; @@ -52,17 +56,22 @@ import static junit.framework.TestCase.assertTrue; import static org.mockito.ArgumentMatchers.any; import static org.mockito.ArgumentMatchers.anyInt; import static org.mockito.ArgumentMatchers.anyString; +import static org.mockito.ArgumentMatchers.eq; import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.never; +import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; import android.app.AutomaticZenRule; import android.app.Flags; import android.app.NotificationManager.Policy; +import android.app.backup.BackupRestoreEventLogger; import android.content.ComponentName; import android.content.pm.ApplicationInfo; import android.content.pm.PackageManager; import android.net.Uri; import android.os.Parcel; +import android.os.UserHandle; import android.platform.test.annotations.DisableFlags; import android.platform.test.annotations.EnableFlags; import android.platform.test.flag.junit.FlagsParameterization; @@ -135,7 +144,7 @@ public class ZenModeConfigTest extends UiServiceTestCase { @Parameters(name = "{0}") public static List<FlagsParameterization> getParams() { return FlagsParameterization.allCombinationsOf( - FLAG_MODES_UI); + FLAG_MODES_UI, FLAG_BACKUP_RESTORE_LOGGING); } public ZenModeConfigTest(FlagsParameterization flags) { @@ -144,7 +153,6 @@ public class ZenModeConfigTest extends UiServiceTestCase { @Before public final void setUp() { - mSetFlagsRule.enableFlags(Flags.FLAG_MODES_API); MockitoAnnotations.initMocks(this); mContext.setMockPackageManager(mPm); } @@ -515,6 +523,98 @@ public class ZenModeConfigTest extends UiServiceTestCase { } @Test + @EnableFlags({FLAG_MODES_UI, FLAG_BACKUP_RESTORE_LOGGING}) + public void testBackupRestore_fromPreModesUi() throws IOException, XmlPullParserException { + String xml = "<zen version=\"12\">\n" + + "<allow calls=\"true\" repeatCallers=\"true\" messages=\"true\"" + + " reminders=\"false\" events=\"false\" callsFrom=\"2\" messagesFrom=\"2\"" + + " alarms=\"true\" media=\"true\" system=\"false\" convos=\"true\" convosFrom=\"2\"" + + " priorityChannelsAllowed=\"true\" />\n" + + "<disallow visualEffects=\"157\" />\n" + + "<manual enabled=\"true\" zen=\"1\" creationTime=\"0\" modified=\"false\" />\n" + + "<state areChannelsBypassingDnd=\"true\" />\n" + + "</zen>"; + + BackupRestoreEventLogger logger = mock(BackupRestoreEventLogger.class); + readConfigXml(new ByteArrayInputStream(xml.getBytes()), logger); + + verify(logger).logItemsRestored(DATA_TYPE_ZEN_RULES, 1); + } + + @Test + public void testBackupRestore() throws IOException, XmlPullParserException { + ZenModeConfig config = new ZenModeConfig(); + ZenModeConfig.ZenRule rule = new ZenModeConfig.ZenRule(); + rule.configurationActivity = CONFIG_ACTIVITY; + rule.component = OWNER; + rule.conditionId = CONDITION_ID; + rule.condition = CONDITION; + rule.enabled = ENABLED; + rule.creationTime = 123; + rule.id = "id"; + rule.zenMode = INTERRUPTION_FILTER; + rule.modified = true; + rule.name = NAME; + rule.setConditionOverride(OVERRIDE_DEACTIVATE); + rule.pkg = OWNER.getPackageName(); + rule.zenPolicy = POLICY; + + rule.allowManualInvocation = ALLOW_MANUAL; + rule.type = TYPE; + rule.userModifiedFields = 16; + rule.zenPolicyUserModifiedFields = 5; + rule.zenDeviceEffectsUserModifiedFields = 2; + rule.iconResName = ICON_RES_NAME; + rule.triggerDescription = TRIGGER_DESC; + rule.deletionInstant = Instant.ofEpochMilli(1701790147000L); + if (Flags.modesUi()) { + rule.disabledOrigin = ZenModeConfig.ORIGIN_USER_IN_SYSTEMUI; + } + config.automaticRules.put(rule.id, rule); + + BackupRestoreEventLogger logger = null; + if (Flags.backupRestoreLogging()) { + logger = mock(BackupRestoreEventLogger.class); + } + ByteArrayOutputStream baos = new ByteArrayOutputStream(); + writeConfigXml(config, XML_VERSION_MODES_API, true, baos, logger); + ByteArrayInputStream bais = new ByteArrayInputStream(baos.toByteArray()); + ZenModeConfig fromXml = readConfigXml(bais, logger); + + ZenModeConfig.ZenRule ruleActual = fromXml.automaticRules.get(rule.id); + assertEquals(rule.pkg, ruleActual.pkg); + assertEquals(OVERRIDE_NONE, ruleActual.getConditionOverride()); + assertEquals(rule.enabler, ruleActual.enabler); + assertEquals(rule.component, ruleActual.component); + assertEquals(rule.configurationActivity, ruleActual.configurationActivity); + assertEquals(rule.condition, ruleActual.condition); + assertEquals(rule.enabled, ruleActual.enabled); + assertEquals(rule.creationTime, ruleActual.creationTime); + assertEquals(rule.modified, ruleActual.modified); + assertEquals(rule.conditionId, ruleActual.conditionId); + assertEquals(rule.name, ruleActual.name); + assertEquals(rule.zenMode, ruleActual.zenMode); + + assertEquals(rule.allowManualInvocation, ruleActual.allowManualInvocation); + assertEquals(rule.iconResName, ruleActual.iconResName); + assertEquals(rule.type, ruleActual.type); + assertEquals(rule.userModifiedFields, ruleActual.userModifiedFields); + assertEquals(rule.zenPolicyUserModifiedFields, ruleActual.zenPolicyUserModifiedFields); + assertEquals(rule.zenDeviceEffectsUserModifiedFields, + ruleActual.zenDeviceEffectsUserModifiedFields); + assertEquals(rule.triggerDescription, ruleActual.triggerDescription); + assertEquals(rule.zenPolicy, ruleActual.zenPolicy); + assertEquals(rule.deletionInstant, ruleActual.deletionInstant); + if (Flags.modesUi()) { + assertEquals(rule.disabledOrigin, ruleActual.disabledOrigin); + } + if (Flags.backupRestoreLogging()) { + verify(logger).logItemsBackedUp(DATA_TYPE_ZEN_RULES, 2); + verify(logger).logItemsRestored(DATA_TYPE_ZEN_RULES, 2); + } + } + + @Test public void testWriteToParcel() { ZenModeConfig.ZenRule rule = new ZenModeConfig.ZenRule(); rule.configurationActivity = CONFIG_ACTIVITY; @@ -1023,9 +1123,9 @@ public class ZenModeConfigTest extends UiServiceTestCase { // write out entire config xml ByteArrayOutputStream baos = new ByteArrayOutputStream(); - writeConfigXml(config, XML_VERSION_MODES_API, /* forBackup= */ false, baos); + writeConfigXml(config, XML_VERSION_MODES_API, /* forBackup= */ false, baos, null); ByteArrayInputStream bais = new ByteArrayInputStream(baos.toByteArray()); - ZenModeConfig fromXml = readConfigXml(bais); + ZenModeConfig fromXml = readConfigXml(bais, null); // The result should be valid and contain a manual rule; the rule should have a non-null @@ -1055,9 +1155,9 @@ public class ZenModeConfigTest extends UiServiceTestCase { // write out entire config xml ByteArrayOutputStream baos = new ByteArrayOutputStream(); - writeConfigXml(config, XML_VERSION_MODES_API, /* forBackup= */ false, baos); + writeConfigXml(config, XML_VERSION_MODES_API, /* forBackup= */ false, baos, null); ByteArrayInputStream bais = new ByteArrayInputStream(baos.toByteArray()); - ZenModeConfig fromXml = readConfigXml(bais); + ZenModeConfig fromXml = readConfigXml(bais, null); // The result should have a manual rule; it should have a non-null ZenPolicy and a condition // whose state is true. The conditionId and enabler data should also be preserved. @@ -1084,9 +1184,9 @@ public class ZenModeConfigTest extends UiServiceTestCase { // write out entire config xml ByteArrayOutputStream baos = new ByteArrayOutputStream(); - writeConfigXml(config, XML_VERSION_MODES_API, /* forBackup= */ false, baos); + writeConfigXml(config, XML_VERSION_MODES_API, /* forBackup= */ false, baos, null); ByteArrayInputStream bais = new ByteArrayInputStream(baos.toByteArray()); - ZenModeConfig fromXml = readConfigXml(bais); + ZenModeConfig fromXml = readConfigXml(bais, null); // The result should have a manual rule; it should not be changed from the previous rule. assertThat(fromXml.manualRule).isEqualTo(config.manualRule); @@ -1213,9 +1313,9 @@ public class ZenModeConfigTest extends UiServiceTestCase { config.manualRule.enabled = false; ByteArrayOutputStream baos = new ByteArrayOutputStream(); - writeConfigXml(config, XML_VERSION_MODES_UI, /* forBackup= */ false, baos); + writeConfigXml(config, XML_VERSION_MODES_UI, /* forBackup= */ false, baos, null); ByteArrayInputStream bais = new ByteArrayInputStream(baos.toByteArray()); - ZenModeConfig fromXml = readConfigXml(bais); + ZenModeConfig fromXml = readConfigXml(bais, null); assertThat(fromXml.manualRule.enabled).isTrue(); } @@ -1359,23 +1459,23 @@ public class ZenModeConfigTest extends UiServiceTestCase { } private void writeConfigXml(ZenModeConfig config, Integer version, boolean forBackup, - ByteArrayOutputStream os) throws IOException { + ByteArrayOutputStream os, BackupRestoreEventLogger logger) throws IOException { String tag = ZEN_TAG; TypedXmlSerializer out = Xml.newFastSerializer(); out.setOutput(new BufferedOutputStream(os), "utf-8"); out.startDocument(null, true); out.startTag(null, tag); - config.writeXml(out, version, forBackup); + config.writeXml(out, version, forBackup, logger); out.endTag(null, tag); out.endDocument(); } - private ZenModeConfig readConfigXml(ByteArrayInputStream is) + private ZenModeConfig readConfigXml(ByteArrayInputStream is, BackupRestoreEventLogger logger) throws XmlPullParserException, IOException { TypedXmlPullParser parser = Xml.newFastPullParser(); parser.setInput(new BufferedInputStream(is), null); parser.nextTag(); - return ZenModeConfig.readXml(parser); + return ZenModeConfig.readXml(parser, logger); } } diff --git a/services/tests/uiservicestests/src/com/android/server/notification/ZenModeHelperTest.java b/services/tests/uiservicestests/src/com/android/server/notification/ZenModeHelperTest.java index a19659417b66..67923770fcb5 100644 --- a/services/tests/uiservicestests/src/com/android/server/notification/ZenModeHelperTest.java +++ b/services/tests/uiservicestests/src/com/android/server/notification/ZenModeHelperTest.java @@ -20,6 +20,7 @@ import static android.app.AutomaticZenRule.TYPE_BEDTIME; import static android.app.AutomaticZenRule.TYPE_IMMERSIVE; import static android.app.AutomaticZenRule.TYPE_SCHEDULE_TIME; import static android.app.AutomaticZenRule.TYPE_UNKNOWN; +import static android.app.Flags.FLAG_BACKUP_RESTORE_LOGGING; import static android.app.Flags.FLAG_MODES_API; import static android.app.Flags.FLAG_MODES_MULTIUSER; import static android.app.Flags.FLAG_MODES_UI; @@ -83,6 +84,8 @@ import static com.android.os.dnd.DNDProtoEnums.PEOPLE_STARRED; import static com.android.os.dnd.DNDProtoEnums.ROOT_CONFIG; import static com.android.os.dnd.DNDProtoEnums.STATE_ALLOW; import static com.android.os.dnd.DNDProtoEnums.STATE_DISALLOW; +import static android.app.backup.NotificationLoggingConstants.DATA_TYPE_ZEN_CONFIG; +import static android.app.backup.NotificationLoggingConstants.DATA_TYPE_ZEN_RULES; import static com.android.server.notification.ZenModeEventLogger.ACTIVE_RULE_TYPE_MANUAL; import static com.android.server.notification.ZenModeHelper.RULE_LIMIT_PER_PACKAGE; @@ -104,6 +107,7 @@ import static org.mockito.ArgumentMatchers.anyInt; import static org.mockito.ArgumentMatchers.anyString; import static org.mockito.ArgumentMatchers.eq; import static org.mockito.Mockito.atLeastOnce; +import static org.mockito.Mockito.doNothing; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.never; import static org.mockito.Mockito.notNull; @@ -118,15 +122,17 @@ import static org.mockito.Mockito.withSettings; import android.Manifest; import android.annotation.Nullable; import android.annotation.SuppressLint; +import android.app.AlarmManager; import android.app.AppGlobals; import android.app.AppOpsManager; import android.app.AutomaticZenRule; import android.app.Flags; import android.app.NotificationManager; import android.app.NotificationManager.Policy; +import android.app.backup.BackupRestoreEventLogger; import android.app.compat.CompatChanges; import android.content.ComponentName; -import android.content.ContentResolver; +import android.content.Context; import android.content.pm.ActivityInfo; import android.content.pm.ApplicationInfo; import android.content.pm.PackageInfo; @@ -273,7 +279,6 @@ public class ZenModeHelperTest extends UiServiceTestCase { private TestableLooper mTestableLooper; private final TestClock mTestClock = new TestClock(); private ZenModeHelper mZenModeHelper; - private ContentResolver mContentResolver; @Mock DeviceEffectsApplier mDeviceEffectsApplier; @Mock @@ -284,8 +289,7 @@ public class ZenModeHelperTest extends UiServiceTestCase { @Parameters(name = "{0}") public static List<FlagsParameterization> getParams() { - return FlagsParameterization.progressionOf(FLAG_MODES_API, - FLAG_MODES_UI); + return FlagsParameterization.allCombinationsOf(FLAG_MODES_UI, FLAG_BACKUP_RESTORE_LOGGING); } public ZenModeHelperTest(FlagsParameterization flags) { @@ -298,7 +302,6 @@ public class ZenModeHelperTest extends UiServiceTestCase { mTestableLooper = TestableLooper.get(this); mContext.ensureTestableResources(); - mContentResolver = mContext.getContentResolver(); mResources = mock(Resources.class, withSettings() .spiedInstance(mContext.getResources())); mPkg = mContext.getPackageName(); @@ -316,11 +319,16 @@ public class ZenModeHelperTest extends UiServiceTestCase { mContext.addMockSystemService(AppOpsManager.class, mAppOps); mContext.addMockSystemService(NotificationManager.class, mNotificationManager); + mContext.addMockSystemService(Context.ALARM_SERVICE, mock(AlarmManager.class)); mConditionProviders = new ConditionProviders(mContext, new UserProfiles(), AppGlobals.getPackageManager()); - mConditionProviders.addSystemProvider(new CountdownConditionProvider()); - mConditionProviders.addSystemProvider(new ScheduleConditionProvider()); + CountdownConditionProvider countdown = spy(new CountdownConditionProvider()); + ScheduleConditionProvider schedule = spy(new ScheduleConditionProvider()); + doNothing().when(countdown).notifyConditions(any()); + doNothing().when(schedule).notifyConditions(any()); + mConditionProviders.addSystemProvider(countdown); + mConditionProviders.addSystemProvider(schedule); mZenModeEventLogger = new ZenModeEventLoggerFake(mPackageManager); mZenModeHelper = new ZenModeHelper(mContext, mTestableLooper.getLooper(), mTestClock, mConditionProviders, mTestFlagResolver, mZenModeEventLogger); @@ -379,7 +387,7 @@ public class ZenModeHelperTest extends UiServiceTestCase { ByteArrayOutputStream baos = new ByteArrayOutputStream(); serializer.setOutput(new BufferedOutputStream(baos), "utf-8"); serializer.startDocument(null, true); - mZenModeHelper.writeXml(serializer, false, version, UserHandle.USER_ALL); + mZenModeHelper.writeXml(serializer, false, version, UserHandle.USER_ALL, null); serializer.endDocument(); serializer.flush(); mZenModeHelper.setConfig(new ZenModeConfig(), null, ORIGIN_INIT, "writing xml", @@ -387,13 +395,14 @@ public class ZenModeHelperTest extends UiServiceTestCase { return baos; } - private ByteArrayOutputStream writeXmlAndPurgeForUser(Integer version, int userId) + private ByteArrayOutputStream writeXmlAndPurgeForUser(Integer version, int userId, + boolean forBackup, BackupRestoreEventLogger logger) throws Exception { TypedXmlSerializer serializer = Xml.newFastSerializer(); ByteArrayOutputStream baos = new ByteArrayOutputStream(); serializer.setOutput(new BufferedOutputStream(baos), "utf-8"); serializer.startDocument(null, true); - mZenModeHelper.writeXml(serializer, true, version, userId); + mZenModeHelper.writeXml(serializer, forBackup, version, userId, logger); serializer.endDocument(); serializer.flush(); ZenModeConfig newConfig = new ZenModeConfig(); @@ -1093,7 +1102,7 @@ public class ZenModeHelperTest extends UiServiceTestCase { ByteArrayOutputStream baos = writeXmlAndPurge(null); TypedXmlPullParser parser = getParserForByteStream(baos); - mZenModeHelper.readXml(parser, false, UserHandle.USER_ALL); + mZenModeHelper.readXml(parser, false, UserHandle.USER_ALL, null); assertEquals("Config mismatch: current vs expected: " + new ZenModeDiff.ConfigDiff(mZenModeHelper.mConfig, expected), expected, @@ -1169,7 +1178,7 @@ public class ZenModeHelperTest extends UiServiceTestCase { parser.setInput(new BufferedInputStream( new ByteArrayInputStream(baos.toByteArray())), null); parser.nextTag(); - mZenModeHelper.readXml(parser, false, UserHandle.USER_ALL); + mZenModeHelper.readXml(parser, false, UserHandle.USER_ALL, null); List<StatsEvent> events = new LinkedList<>(); mZenModeHelper.pullRules(events); @@ -1377,6 +1386,10 @@ public class ZenModeHelperTest extends UiServiceTestCase { @Test public void testWriteXml_onlyBackupsTargetUser() throws Exception { + BackupRestoreEventLogger logger = null; + if (android.app.Flags.backupRestoreLogging()) { + logger = mock(BackupRestoreEventLogger.class); + } // Setup configs for user 10 and 11. setupZenConfig(); ZenModeConfig config10 = mZenModeHelper.mConfig.copy(); @@ -1393,15 +1406,16 @@ public class ZenModeHelperTest extends UiServiceTestCase { SYSTEM_UID); // Backup user 10 and reset values. - ByteArrayOutputStream baos = writeXmlAndPurgeForUser(null, 10); + ByteArrayOutputStream baos = writeXmlAndPurgeForUser(null, 10, true, logger); ZenModeConfig newConfig11 = new ZenModeConfig(); newConfig11.user = 11; mZenModeHelper.mConfigs.put(11, newConfig11); // Parse backup data. TypedXmlPullParser parser = getParserForByteStream(baos); - mZenModeHelper.readXml(parser, true, 10); - mZenModeHelper.readXml(parser, true, 11); + mZenModeHelper.readXml(parser, true, 10, logger); + parser = getParserForByteStream(baos); + mZenModeHelper.readXml(parser, true, 11, logger); ZenModeConfig actual = mZenModeHelper.mConfigs.get(10); if (Flags.modesUi()) { @@ -1415,39 +1429,72 @@ public class ZenModeHelperTest extends UiServiceTestCase { "Config mismatch: current vs expected: " + new ZenModeDiff.ConfigDiff(actual, config10), config10, actual); assertNotEquals("Expected config mismatch", config11, mZenModeHelper.mConfigs.get(11)); + + if (android.app.Flags.backupRestoreLogging()) { + verify(logger).logItemsBackedUp(DATA_TYPE_ZEN_CONFIG, 1); + // If this is modes_ui, this is manual + single default rule + // If not modes_ui, it's two default automatic rules + manual policy + verify(logger).logItemsBackedUp(DATA_TYPE_ZEN_RULES, Flags.modesUi() ? 2 : 3); + verify(logger, never()) + .logItemsBackupFailed(anyString(), anyInt(), anyString()); + + verify(logger, times(2)).logItemsRestored(DATA_TYPE_ZEN_RULES, Flags.modesUi() ? 2 : 3); + verify(logger, never()) + .logItemsRestoreFailed(anyString(), anyInt(), anyString()); + } } @Test public void testReadXmlRestore_forSystemUser() throws Exception { + BackupRestoreEventLogger logger = null; + if (android.app.Flags.backupRestoreLogging()) { + logger = mock(BackupRestoreEventLogger.class); + } setupZenConfig(); // one enabled automatic rule mZenModeHelper.mConfig.automaticRules = getCustomAutomaticRules(); ZenModeConfig original = mZenModeHelper.mConfig.copy(); - ByteArrayOutputStream baos = writeXmlAndPurgeForUser(null, UserHandle.USER_SYSTEM); + ByteArrayOutputStream baos = writeXmlAndPurgeForUser( + null, UserHandle.USER_SYSTEM, true, logger); TypedXmlPullParser parser = getParserForByteStream(baos); - mZenModeHelper.readXml(parser, true, UserHandle.USER_SYSTEM); + mZenModeHelper.readXml(parser, true, UserHandle.USER_SYSTEM, logger); assertEquals("Config mismatch: current vs original: " + new ZenModeDiff.ConfigDiff(mZenModeHelper.mConfig, original), original, mZenModeHelper.mConfig); assertEquals(original.hashCode(), mZenModeHelper.mConfig.hashCode()); + + if (android.app.Flags.backupRestoreLogging()) { + verify(logger).logItemsBackedUp(DATA_TYPE_ZEN_CONFIG, 1); + verify(logger).logItemsBackedUp(DATA_TYPE_ZEN_RULES, 2); + verify(logger, never()) + .logItemsBackupFailed(anyString(), anyInt(), anyString()); + verify(logger).logItemsRestored(DATA_TYPE_ZEN_RULES, 2); + verify(logger, never()) + .logItemsRestoreFailed(anyString(), anyInt(), anyString()); + } } /** Restore should ignore the data's user id and restore for the target user. */ @Test public void testReadXmlRestore_forNonSystemUser() throws Exception { + BackupRestoreEventLogger logger = null; + if (android.app.Flags.backupRestoreLogging()) { + logger = mock(BackupRestoreEventLogger.class); + } // Setup config. setupZenConfig(); mZenModeHelper.mConfig.automaticRules = getCustomAutomaticRules(); ZenModeConfig expected = mZenModeHelper.mConfig.copy(); // Backup data for user 0. - ByteArrayOutputStream baos = writeXmlAndPurgeForUser(null, UserHandle.USER_SYSTEM); + ByteArrayOutputStream baos = writeXmlAndPurgeForUser( + null, UserHandle.USER_SYSTEM, true, logger); // Restore data for user 10. TypedXmlPullParser parser = getParserForByteStream(baos); - mZenModeHelper.readXml(parser, true, 10); + mZenModeHelper.readXml(parser, true, 10, logger); ZenModeConfig actual = mZenModeHelper.mConfigs.get(10); expected.user = 10; @@ -1461,6 +1508,10 @@ public class ZenModeHelperTest extends UiServiceTestCase { @Test public void testReadXmlRestore_doesNotEnableManualRule() throws Exception { + BackupRestoreEventLogger logger = null; + if (android.app.Flags.backupRestoreLogging()) { + logger = mock(BackupRestoreEventLogger.class); + } setupZenConfig(); // Turn on manual zen mode @@ -1471,7 +1522,7 @@ public class ZenModeHelperTest extends UiServiceTestCase { ByteArrayOutputStream baos = writeXmlAndPurge(null); TypedXmlPullParser parser = getParserForByteStream(baos); - mZenModeHelper.readXml(parser, true, UserHandle.USER_ALL); + mZenModeHelper.readXml(parser, true, UserHandle.USER_ALL, logger); ZenModeConfig result = mZenModeHelper.getConfig(); assertThat(result.isManualActive()).isFalse(); @@ -1525,7 +1576,7 @@ public class ZenModeHelperTest extends UiServiceTestCase { parser.setInput(new BufferedInputStream( new ByteArrayInputStream(baos.toByteArray())), null); parser.nextTag(); - mZenModeHelper.readXml(parser, false, UserHandle.USER_ALL); + mZenModeHelper.readXml(parser, false, UserHandle.USER_ALL, null); ZenModeConfig.ZenRule original = expected.automaticRules.get(ruleId); ZenModeConfig.ZenRule current = mZenModeHelper.mConfig.automaticRules.get(ruleId); @@ -1536,6 +1587,10 @@ public class ZenModeHelperTest extends UiServiceTestCase { @Test public void testReadXmlRestoreWithZenPolicy_forSystemUser() throws Exception { + BackupRestoreEventLogger logger = null; + if (android.app.Flags.backupRestoreLogging()) { + logger = mock(BackupRestoreEventLogger.class); + } final String ruleId = "customRule"; setupZenConfig(); @@ -1567,9 +1622,10 @@ public class ZenModeHelperTest extends UiServiceTestCase { SystemZenRules.maybeUpgradeRules(mContext, expected); } - ByteArrayOutputStream baos = writeXmlAndPurgeForUser(null, UserHandle.USER_SYSTEM); + ByteArrayOutputStream baos = writeXmlAndPurgeForUser( + null, UserHandle.USER_SYSTEM, true, logger); TypedXmlPullParser parser = getParserForByteStream(baos); - mZenModeHelper.readXml(parser, true, UserHandle.USER_SYSTEM); + mZenModeHelper.readXml(parser, true, UserHandle.USER_SYSTEM, logger); ZenModeConfig.ZenRule original = expected.automaticRules.get(ruleId); ZenModeConfig.ZenRule current = mZenModeHelper.mConfig.automaticRules.get(ruleId); @@ -1601,7 +1657,7 @@ public class ZenModeHelperTest extends UiServiceTestCase { parser.setInput(new BufferedInputStream( new ByteArrayInputStream(baos.toByteArray())), null); parser.nextTag(); - mZenModeHelper.readXml(parser, false, UserHandle.USER_ALL); + mZenModeHelper.readXml(parser, false, UserHandle.USER_ALL, null); assertTrue(mZenModeHelper.mConfig.automaticRules.containsKey("customRule")); assertEquals(originalPolicy, mZenModeHelper.getNotificationPolicy(UserHandle.CURRENT)); @@ -1621,7 +1677,7 @@ public class ZenModeHelperTest extends UiServiceTestCase { parser.setInput(new BufferedInputStream( new ByteArrayInputStream(xml.getBytes())), null); parser.nextTag(); - mZenModeHelper.readXml(parser, false, UserHandle.USER_ALL); + mZenModeHelper.readXml(parser, false, UserHandle.USER_ALL, null); assertTrue(mZenModeHelper.mConfig.getZenPolicy().shouldShowAllVisualEffects()); @@ -1637,7 +1693,7 @@ public class ZenModeHelperTest extends UiServiceTestCase { parser.setInput(new BufferedInputStream( new ByteArrayInputStream(xml.getBytes())), null); parser.nextTag(); - mZenModeHelper.readXml(parser, false, UserHandle.USER_ALL); + mZenModeHelper.readXml(parser, false, UserHandle.USER_ALL, null); assertTrue(mZenModeHelper.mConfig.getZenPolicy().shouldShowAllVisualEffects()); } @@ -1656,7 +1712,7 @@ public class ZenModeHelperTest extends UiServiceTestCase { parser.setInput(new BufferedInputStream( new ByteArrayInputStream(xml.getBytes())), null); parser.nextTag(); - mZenModeHelper.readXml(parser, false, UserHandle.USER_ALL); + mZenModeHelper.readXml(parser, false, UserHandle.USER_ALL, null); assertTrue(mZenModeHelper.mConfig.getZenPolicy().shouldShowAllVisualEffects()); } @@ -1675,7 +1731,7 @@ public class ZenModeHelperTest extends UiServiceTestCase { parser.setInput(new BufferedInputStream( new ByteArrayInputStream(xml.getBytes())), null); parser.nextTag(); - mZenModeHelper.readXml(parser, false, UserHandle.USER_ALL); + mZenModeHelper.readXml(parser, false, UserHandle.USER_ALL, null); assertThat(mZenModeHelper.mConfig.getZenPolicy() .isVisualEffectAllowed(VISUAL_EFFECT_FULL_SCREEN_INTENT, true)).isFalse(); @@ -1700,7 +1756,7 @@ public class ZenModeHelperTest extends UiServiceTestCase { parser.setInput(new BufferedInputStream( new ByteArrayInputStream(xml.getBytes())), null); parser.nextTag(); - mZenModeHelper.readXml(parser, false, UserHandle.USER_ALL); + mZenModeHelper.readXml(parser, false, UserHandle.USER_ALL, null); assertThat(mZenModeHelper.mConfig.getZenPolicy() .isVisualEffectAllowed(VISUAL_EFFECT_PEEK, true)).isFalse(); @@ -1719,7 +1775,7 @@ public class ZenModeHelperTest extends UiServiceTestCase { parser.setInput(new BufferedInputStream( new ByteArrayInputStream(xml.getBytes())), null); parser.nextTag(); - mZenModeHelper.readXml(parser, false, UserHandle.USER_ALL); + mZenModeHelper.readXml(parser, false, UserHandle.USER_ALL, null); assertThat(mZenModeHelper.mConfig.getZenPolicy() .isVisualEffectAllowed(VISUAL_EFFECT_FULL_SCREEN_INTENT, true)).isFalse(); @@ -1746,7 +1802,7 @@ public class ZenModeHelperTest extends UiServiceTestCase { parser.setInput(new BufferedInputStream( new ByteArrayInputStream(baos.toByteArray())), null); parser.nextTag(); - mZenModeHelper.readXml(parser, false, UserHandle.USER_ALL); + mZenModeHelper.readXml(parser, false, UserHandle.USER_ALL, null); // check default rules ArrayMap<String, ZenModeConfig.ZenRule> rules = mZenModeHelper.mConfig.automaticRules; @@ -1782,7 +1838,7 @@ public class ZenModeHelperTest extends UiServiceTestCase { parser.setInput(new BufferedInputStream( new ByteArrayInputStream(baos.toByteArray())), null); parser.nextTag(); - mZenModeHelper.readXml(parser, false, UserHandle.USER_ALL); + mZenModeHelper.readXml(parser, false, UserHandle.USER_ALL, null); // check default rules ArrayMap<String, ZenModeConfig.ZenRule> rules = mZenModeHelper.mConfig.automaticRules; @@ -1836,7 +1892,7 @@ public class ZenModeHelperTest extends UiServiceTestCase { parser.setInput(new BufferedInputStream( new ByteArrayInputStream(baos.toByteArray())), null); parser.nextTag(); - mZenModeHelper.readXml(parser, false, UserHandle.USER_ALL); + mZenModeHelper.readXml(parser, false, UserHandle.USER_ALL, null); // check default rules ArrayMap<String, ZenModeConfig.ZenRule> rules = mZenModeHelper.mConfig.automaticRules; @@ -1906,7 +1962,7 @@ public class ZenModeHelperTest extends UiServiceTestCase { parser.setInput(new BufferedInputStream( new ByteArrayInputStream(baos.toByteArray())), null); parser.nextTag(); - mZenModeHelper.readXml(parser, false, UserHandle.USER_ALL); + mZenModeHelper.readXml(parser, false, UserHandle.USER_ALL, null); // check default rules int expectedNumAutoRules = 1 + ZenModeConfig.getDefaultRuleIds().size(); // custom + default @@ -1959,7 +2015,7 @@ public class ZenModeHelperTest extends UiServiceTestCase { parser.setInput(new BufferedInputStream( new ByteArrayInputStream(baos.toByteArray())), null); parser.nextTag(); - mZenModeHelper.readXml(parser, false, UserHandle.USER_ALL); + mZenModeHelper.readXml(parser, false, UserHandle.USER_ALL, null); // basic check: global config maintained assertEquals(originalPolicy, mZenModeHelper.getNotificationPolicy(UserHandle.CURRENT)); @@ -1998,7 +2054,7 @@ public class ZenModeHelperTest extends UiServiceTestCase { parser.setInput(new BufferedInputStream( new ByteArrayInputStream(baos.toByteArray())), null); parser.nextTag(); - mZenModeHelper.readXml(parser, false, UserHandle.USER_ALL); + mZenModeHelper.readXml(parser, false, UserHandle.USER_ALL, null); // basic check: global config maintained assertEquals(originalPolicy, mZenModeHelper.getNotificationPolicy(UserHandle.CURRENT)); @@ -2055,7 +2111,7 @@ public class ZenModeHelperTest extends UiServiceTestCase { parser.setInput(new BufferedInputStream( new ByteArrayInputStream(baos.toByteArray())), null); parser.nextTag(); - mZenModeHelper.readXml(parser, false, UserHandle.USER_ALL); + mZenModeHelper.readXml(parser, false, UserHandle.USER_ALL, null); // basic check: global config maintained assertEquals(originalPolicy, mZenModeHelper.getNotificationPolicy(UserHandle.CURRENT)); @@ -2121,7 +2177,7 @@ public class ZenModeHelperTest extends UiServiceTestCase { parser.setInput(new BufferedInputStream( new ByteArrayInputStream(baos.toByteArray())), null); parser.nextTag(); - mZenModeHelper.readXml(parser, false, UserHandle.USER_ALL); + mZenModeHelper.readXml(parser, false, UserHandle.USER_ALL, null); // check default rules ArrayMap<String, ZenModeConfig.ZenRule> rules = mZenModeHelper.mConfig.automaticRules; @@ -2173,7 +2229,7 @@ public class ZenModeHelperTest extends UiServiceTestCase { parser.setInput(new BufferedInputStream( new ByteArrayInputStream(baos.toByteArray())), null); parser.nextTag(); - mZenModeHelper.readXml(parser, false, UserHandle.USER_ALL); + mZenModeHelper.readXml(parser, false, UserHandle.USER_ALL, null); // Implicit rule was updated. assertThat(mZenModeHelper.mConfig.automaticRules.get(implicitRuleBeforeModesUi.id)) @@ -2211,7 +2267,7 @@ public class ZenModeHelperTest extends UiServiceTestCase { parser.setInput(new BufferedInputStream( new ByteArrayInputStream(baos.toByteArray())), null); parser.nextTag(); - mZenModeHelper.readXml(parser, false, UserHandle.USER_ALL); + mZenModeHelper.readXml(parser, false, UserHandle.USER_ALL, null); // Both rules were untouched assertThat(mZenModeHelper.mConfig.automaticRules.get(implicitRuleWithModesUi.id)) @@ -6965,7 +7021,7 @@ public class ZenModeHelperTest extends UiServiceTestCase { // Now simulate a reboot -> reload the configuration after purging. TypedXmlPullParser parser = getParserForByteStream(xmlBytes); - mZenModeHelper.readXml(parser, false, UserHandle.USER_ALL); + mZenModeHelper.readXml(parser, false, UserHandle.USER_ALL, null); if (Flags.modesUi()) { assertThat(mZenModeHelper.getAutomaticZenRuleState(UserHandle.CURRENT, ruleId)) @@ -7006,7 +7062,7 @@ public class ZenModeHelperTest extends UiServiceTestCase { // Now simulate a reboot -> reload the configuration after purging. TypedXmlPullParser parser = getParserForByteStream(xmlBytes); - mZenModeHelper.readXml(parser, false, UserHandle.USER_ALL); + mZenModeHelper.readXml(parser, false, UserHandle.USER_ALL, null); assertThat(mZenModeHelper.getAutomaticZenRuleState(UserHandle.CURRENT, ruleId)) .isEqualTo(STATE_TRUE); @@ -7045,7 +7101,7 @@ public class ZenModeHelperTest extends UiServiceTestCase { ByteArrayOutputStream xmlBytes = writeXmlAndPurge(ZenModeConfig.XML_VERSION_MODES_UI); TypedXmlPullParser parser = getParserForByteStream(xmlBytes); - mZenModeHelper.readXml(parser, false, UserHandle.USER_ALL); + mZenModeHelper.readXml(parser, false, UserHandle.USER_ALL, null); assertThat(mZenModeHelper.mConfig.automaticRules).doesNotContainKey( ZenModeConfig.EVENTS_OBSOLETE_RULE_ID); @@ -7065,7 +7121,7 @@ public class ZenModeHelperTest extends UiServiceTestCase { ByteArrayOutputStream xmlBytes = writeXmlAndPurge(ZenModeConfig.XML_VERSION_MODES_UI); TypedXmlPullParser parser = getParserForByteStream(xmlBytes); - mZenModeHelper.readXml(parser, false, UserHandle.USER_ALL); + mZenModeHelper.readXml(parser, false, UserHandle.USER_ALL, null); assertThat(mZenModeHelper.mConfig.automaticRules).containsKey( ZenModeConfig.EVENTS_OBSOLETE_RULE_ID); |