Loading services/core/java/com/android/server/notification/NotificationManagerService.java +13 −1 Original line number Diff line number Diff line Loading @@ -795,6 +795,15 @@ public class NotificationManagerService extends SystemService { updateLightsLocked(); } protected final BroadcastReceiver mLocaleChangeReceiver = new BroadcastReceiver() { @Override public void onReceive(Context context, Intent intent) { if (Intent.ACTION_LOCALE_CHANGED.equals(intent.getAction())) { mZenModeHelper.updateDefaultZenRules(); } } }; private final BroadcastReceiver mRestoreReceiver = new BroadcastReceiver() { @Override public void onReceive(Context context, Intent intent) { Loading Loading @@ -1056,7 +1065,7 @@ public class NotificationManagerService extends SystemService { } private SettingsObserver mSettingsObserver; private ZenModeHelper mZenModeHelper; protected ZenModeHelper mZenModeHelper; static long[] getLongArray(Resources r, int resid, int maxlen, long[] def) { int[] ar = r.getIntArray(resid); Loading Loading @@ -1364,6 +1373,9 @@ public class NotificationManagerService extends SystemService { IntentFilter settingsRestoredFilter = new IntentFilter(Intent.ACTION_SETTING_RESTORED); getContext().registerReceiver(mRestoreReceiver, settingsRestoredFilter); IntentFilter localeChangedFilter = new IntentFilter(Intent.ACTION_LOCALE_CHANGED); getContext().registerReceiver(mLocaleChangeReceiver, localeChangedFilter); publishBinderService(Context.NOTIFICATION_SERVICE, mService); publishLocalService(NotificationManagerInternal.class, mInternalService); } Loading services/core/java/com/android/server/notification/ZenModeHelper.java +79 −21 Original line number Diff line number Diff line Loading @@ -16,11 +16,6 @@ package com.android.server.notification; import static android.media.AudioAttributes.USAGE_NOTIFICATION; import static android.media.AudioAttributes.USAGE_NOTIFICATION_RINGTONE; import static android.media.AudioAttributes.USAGE_UNKNOWN; import static android.media.AudioAttributes.USAGE_VIRTUAL_SOURCE; import android.app.AppOpsManager; import android.app.AutomaticZenRule; import android.app.NotificationManager; Loading Loading @@ -52,7 +47,6 @@ import android.os.UserHandle; import android.provider.Settings.Global; import android.service.notification.Condition; import android.service.notification.ConditionProviderService; import android.service.notification.NotificationServiceDumpProto; import android.service.notification.ZenModeConfig; import android.service.notification.ZenModeConfig.EventInfo; import android.service.notification.ZenModeConfig.ScheduleInfo; Loading @@ -60,6 +54,7 @@ import android.service.notification.ZenModeConfig.ZenRule; import android.service.notification.ZenModeProto; import android.util.AndroidRuntimeException; import android.util.Log; import android.util.Slog; import android.util.SparseArray; import android.util.proto.ProtoOutputStream; Loading Loading @@ -93,7 +88,7 @@ public class ZenModeHelper { private final H mHandler; private final SettingsObserver mSettingsObserver; private final AppOpsManager mAppOps; private final ZenModeConfig mDefaultConfig; protected ZenModeConfig mDefaultConfig; private final ArrayList<Callback> mCallbacks = new ArrayList<Callback>(); private final ZenModeFiltering mFiltering; private final RingerModeDelegate mRingerModeDelegate = new RingerModeDelegate(); Loading @@ -102,11 +97,16 @@ public class ZenModeHelper { private final Metrics mMetrics = new Metrics(); private final ConditionProviders.Config mServiceConfig; protected final ArrayList<String> mDefaultRuleIds = new ArrayList<>(); private final String EVENTS_DEFAULT_RULE = "EVENTS_DEFAULT_RULE"; private final String SCHEDULED_DEFAULT_RULE_1 = "SCHEDULED_DEFAULT_RULE_1"; private final String SCHEDULED_DEFAULT_RULE_2 = "SCHEDULED_DEFAULT_RULE_2"; private int mZenMode; private int mUser = UserHandle.USER_SYSTEM; private ZenModeConfig mConfig; protected ZenModeConfig mConfig; private AudioManagerInternal mAudioManager; private PackageManager mPm; protected PackageManager mPm; private long mSuppressedEffects; public static final long SUPPRESSED_EFFECT_NOTIFICATIONS = 1; Loading @@ -114,21 +114,33 @@ public class ZenModeHelper { public static final long SUPPRESSED_EFFECT_ALL = SUPPRESSED_EFFECT_CALLS | SUPPRESSED_EFFECT_NOTIFICATIONS; protected String mDefaultRuleWeeknightsName; protected String mDefaultRuleEventsName; protected String mDefaultRuleWeekendsName; public ZenModeHelper(Context context, Looper looper, ConditionProviders conditionProviders) { mContext = context; mHandler = new H(looper); addCallback(mMetrics); mAppOps = (AppOpsManager) context.getSystemService(Context.APP_OPS_SERVICE); mDefaultConfig = readDefaultConfig(context.getResources()); appendDefaultScheduleRules(mDefaultConfig); appendDefaultEventRules(mDefaultConfig); mDefaultConfig = new ZenModeConfig(); mDefaultRuleWeeknightsName = mContext.getResources() .getString(R.string.zen_mode_default_weeknights_name); mDefaultRuleWeekendsName = mContext.getResources() .getString(R.string.zen_mode_default_weekends_name); mDefaultRuleEventsName = mContext.getResources() .getString(R.string.zen_mode_default_events_name); setDefaultZenRules(mContext); mConfig = mDefaultConfig; mConfigs.put(UserHandle.USER_SYSTEM, mConfig); mSettingsObserver = new SettingsObserver(mHandler); mSettingsObserver.observe(); mFiltering = new ZenModeFiltering(mContext); mConditions = new ZenModeConditions(this, conditionProviders); mServiceConfig = conditionProviders.getConfig(); } public Looper getLooper() { Loading Loading @@ -412,6 +424,54 @@ public class ZenModeHelper { } } public void setDefaultZenRules(Context context) { mDefaultConfig = readDefaultConfig(context.getResources()); mDefaultRuleIds.add(EVENTS_DEFAULT_RULE); mDefaultRuleIds.add(SCHEDULED_DEFAULT_RULE_1); mDefaultRuleIds.add(SCHEDULED_DEFAULT_RULE_2); appendDefaultRules(mDefaultConfig); } private void appendDefaultRules (ZenModeConfig config) { appendDefaultScheduleRules(config); appendDefaultEventRules(config); } // Checks zen rule properties are the same (doesn't check creation time, name nor enabled) // used to check if default rules were customized or not private boolean ruleValuesEqual(AutomaticZenRule rule, ZenRule defaultRule) { if (rule == null || defaultRule == null) { return false; } return rule.getInterruptionFilter() == NotificationManager.zenModeToInterruptionFilter(defaultRule.zenMode) && rule.getConditionId().equals(defaultRule.conditionId) && rule.getOwner().equals(defaultRule.component); } protected void updateDefaultZenRules() { ZenModeConfig configDefaultRules = new ZenModeConfig(); appendDefaultRules(configDefaultRules); // "new" localized default rules for (String ruleId : mDefaultRuleIds) { AutomaticZenRule currRule = getAutomaticZenRule(ruleId); ZenRule defaultRule = configDefaultRules.automaticRules.get(ruleId); // if default rule wasn't customized, use localized name instead of previous if (ruleValuesEqual(currRule, defaultRule) && !defaultRule.name.equals(currRule.getName())) { if (canManageAutomaticZenRule(defaultRule)) { if (DEBUG) Slog.d(TAG, "Locale change - updating default zen rule name " + "from " + currRule.getName() + " to " + defaultRule.name); // update default rule (if locale changed, name of rule will change) AutomaticZenRule defaultAutoRule = createAutomaticZenRule(defaultRule); updateAutomaticZenRule(ruleId, defaultAutoRule, "locale changed"); } } } } private boolean isSystemRule(AutomaticZenRule rule) { return ZenModeConfig.SYSTEM_AUTHORITY.equals(rule.getOwner().getPackageName()); } Loading Loading @@ -453,7 +513,7 @@ public class ZenModeHelper { automaticZenRule.getInterruptionFilter(), Global.ZEN_MODE_OFF); } private AutomaticZenRule createAutomaticZenRule(ZenRule rule) { protected AutomaticZenRule createAutomaticZenRule(ZenRule rule) { return new AutomaticZenRule(rule.name, rule.component, rule.conditionId, NotificationManager.zenModeToInterruptionFilter(rule.zenMode), rule.enabled, rule.creationTime); Loading Loading @@ -853,12 +913,11 @@ public class ZenModeHelper { weeknights.endHour = 7; final ZenRule rule1 = new ZenRule(); rule1.enabled = false; rule1.name = mContext.getResources() .getString(R.string.zen_mode_default_weeknights_name); rule1.name = mDefaultRuleWeeknightsName; rule1.conditionId = ZenModeConfig.toScheduleConditionId(weeknights); rule1.zenMode = Global.ZEN_MODE_ALARMS; rule1.component = ScheduleConditionProvider.COMPONENT; rule1.id = ZenModeConfig.newRuleId(); rule1.id = SCHEDULED_DEFAULT_RULE_1; rule1.creationTime = System.currentTimeMillis(); config.automaticRules.put(rule1.id, rule1); Loading @@ -869,12 +928,11 @@ public class ZenModeHelper { weekends.endHour = 10; final ZenRule rule2 = new ZenRule(); rule2.enabled = false; rule2.name = mContext.getResources() .getString(R.string.zen_mode_default_weekends_name); rule2.name = mDefaultRuleWeekendsName; rule2.conditionId = ZenModeConfig.toScheduleConditionId(weekends); rule2.zenMode = Global.ZEN_MODE_ALARMS; rule2.component = ScheduleConditionProvider.COMPONENT; rule2.id = ZenModeConfig.newRuleId(); rule2.id = SCHEDULED_DEFAULT_RULE_2; rule2.creationTime = System.currentTimeMillis(); config.automaticRules.put(rule2.id, rule2); } Loading @@ -887,11 +945,11 @@ public class ZenModeHelper { events.reply = EventInfo.REPLY_YES_OR_MAYBE; final ZenRule rule = new ZenRule(); rule.enabled = false; rule.name = mContext.getResources().getString(R.string.zen_mode_default_events_name); rule.name = mDefaultRuleEventsName; rule.conditionId = ZenModeConfig.toEventConditionId(events); rule.zenMode = Global.ZEN_MODE_ALARMS; rule.component = EventConditionProvider.COMPONENT; rule.id = ZenModeConfig.newRuleId(); rule.id = EVENTS_DEFAULT_RULE; rule.creationTime = System.currentTimeMillis(); config.automaticRules.put(rule.id, rule); } Loading services/tests/notification/src/com/android/server/notification/NotificationManagerServiceTest.java +11 −1 Original line number Diff line number Diff line Loading @@ -48,6 +48,7 @@ import android.app.NotificationManager; import android.companion.ICompanionDeviceManager; import android.content.ComponentName; import android.content.Context; import android.content.Intent; import android.content.pm.ApplicationInfo; import android.content.pm.IPackageManager; import android.content.pm.PackageManager; Loading @@ -60,7 +61,6 @@ import android.os.UserHandle; import android.provider.Settings.Secure; import android.service.notification.NotificationListenerService; import android.service.notification.StatusBarNotification; import android.service.notification.ZenModeConfig; import android.test.suitebuilder.annotation.SmallTest; import android.testing.AndroidTestingRunner; import android.testing.TestableLooper; Loading Loading @@ -1550,4 +1550,14 @@ public class NotificationManagerServiceTest extends NotificationTestCase { verify(mAssistants, times(2)).migrateToXml(); } @Test public void testLocaleChangedCallsUpdateDefaultZenModeRules() throws Exception { ZenModeHelper mZenModeHelper = mock(ZenModeHelper.class); mNotificationManagerService.mZenModeHelper = mZenModeHelper; mNotificationManagerService.mLocaleChangeReceiver.onReceive(mContext, new Intent(Intent.ACTION_LOCALE_CHANGED)); verify(mZenModeHelper, times(1)).updateDefaultZenRules(); } } Loading
services/core/java/com/android/server/notification/NotificationManagerService.java +13 −1 Original line number Diff line number Diff line Loading @@ -795,6 +795,15 @@ public class NotificationManagerService extends SystemService { updateLightsLocked(); } protected final BroadcastReceiver mLocaleChangeReceiver = new BroadcastReceiver() { @Override public void onReceive(Context context, Intent intent) { if (Intent.ACTION_LOCALE_CHANGED.equals(intent.getAction())) { mZenModeHelper.updateDefaultZenRules(); } } }; private final BroadcastReceiver mRestoreReceiver = new BroadcastReceiver() { @Override public void onReceive(Context context, Intent intent) { Loading Loading @@ -1056,7 +1065,7 @@ public class NotificationManagerService extends SystemService { } private SettingsObserver mSettingsObserver; private ZenModeHelper mZenModeHelper; protected ZenModeHelper mZenModeHelper; static long[] getLongArray(Resources r, int resid, int maxlen, long[] def) { int[] ar = r.getIntArray(resid); Loading Loading @@ -1364,6 +1373,9 @@ public class NotificationManagerService extends SystemService { IntentFilter settingsRestoredFilter = new IntentFilter(Intent.ACTION_SETTING_RESTORED); getContext().registerReceiver(mRestoreReceiver, settingsRestoredFilter); IntentFilter localeChangedFilter = new IntentFilter(Intent.ACTION_LOCALE_CHANGED); getContext().registerReceiver(mLocaleChangeReceiver, localeChangedFilter); publishBinderService(Context.NOTIFICATION_SERVICE, mService); publishLocalService(NotificationManagerInternal.class, mInternalService); } Loading
services/core/java/com/android/server/notification/ZenModeHelper.java +79 −21 Original line number Diff line number Diff line Loading @@ -16,11 +16,6 @@ package com.android.server.notification; import static android.media.AudioAttributes.USAGE_NOTIFICATION; import static android.media.AudioAttributes.USAGE_NOTIFICATION_RINGTONE; import static android.media.AudioAttributes.USAGE_UNKNOWN; import static android.media.AudioAttributes.USAGE_VIRTUAL_SOURCE; import android.app.AppOpsManager; import android.app.AutomaticZenRule; import android.app.NotificationManager; Loading Loading @@ -52,7 +47,6 @@ import android.os.UserHandle; import android.provider.Settings.Global; import android.service.notification.Condition; import android.service.notification.ConditionProviderService; import android.service.notification.NotificationServiceDumpProto; import android.service.notification.ZenModeConfig; import android.service.notification.ZenModeConfig.EventInfo; import android.service.notification.ZenModeConfig.ScheduleInfo; Loading @@ -60,6 +54,7 @@ import android.service.notification.ZenModeConfig.ZenRule; import android.service.notification.ZenModeProto; import android.util.AndroidRuntimeException; import android.util.Log; import android.util.Slog; import android.util.SparseArray; import android.util.proto.ProtoOutputStream; Loading Loading @@ -93,7 +88,7 @@ public class ZenModeHelper { private final H mHandler; private final SettingsObserver mSettingsObserver; private final AppOpsManager mAppOps; private final ZenModeConfig mDefaultConfig; protected ZenModeConfig mDefaultConfig; private final ArrayList<Callback> mCallbacks = new ArrayList<Callback>(); private final ZenModeFiltering mFiltering; private final RingerModeDelegate mRingerModeDelegate = new RingerModeDelegate(); Loading @@ -102,11 +97,16 @@ public class ZenModeHelper { private final Metrics mMetrics = new Metrics(); private final ConditionProviders.Config mServiceConfig; protected final ArrayList<String> mDefaultRuleIds = new ArrayList<>(); private final String EVENTS_DEFAULT_RULE = "EVENTS_DEFAULT_RULE"; private final String SCHEDULED_DEFAULT_RULE_1 = "SCHEDULED_DEFAULT_RULE_1"; private final String SCHEDULED_DEFAULT_RULE_2 = "SCHEDULED_DEFAULT_RULE_2"; private int mZenMode; private int mUser = UserHandle.USER_SYSTEM; private ZenModeConfig mConfig; protected ZenModeConfig mConfig; private AudioManagerInternal mAudioManager; private PackageManager mPm; protected PackageManager mPm; private long mSuppressedEffects; public static final long SUPPRESSED_EFFECT_NOTIFICATIONS = 1; Loading @@ -114,21 +114,33 @@ public class ZenModeHelper { public static final long SUPPRESSED_EFFECT_ALL = SUPPRESSED_EFFECT_CALLS | SUPPRESSED_EFFECT_NOTIFICATIONS; protected String mDefaultRuleWeeknightsName; protected String mDefaultRuleEventsName; protected String mDefaultRuleWeekendsName; public ZenModeHelper(Context context, Looper looper, ConditionProviders conditionProviders) { mContext = context; mHandler = new H(looper); addCallback(mMetrics); mAppOps = (AppOpsManager) context.getSystemService(Context.APP_OPS_SERVICE); mDefaultConfig = readDefaultConfig(context.getResources()); appendDefaultScheduleRules(mDefaultConfig); appendDefaultEventRules(mDefaultConfig); mDefaultConfig = new ZenModeConfig(); mDefaultRuleWeeknightsName = mContext.getResources() .getString(R.string.zen_mode_default_weeknights_name); mDefaultRuleWeekendsName = mContext.getResources() .getString(R.string.zen_mode_default_weekends_name); mDefaultRuleEventsName = mContext.getResources() .getString(R.string.zen_mode_default_events_name); setDefaultZenRules(mContext); mConfig = mDefaultConfig; mConfigs.put(UserHandle.USER_SYSTEM, mConfig); mSettingsObserver = new SettingsObserver(mHandler); mSettingsObserver.observe(); mFiltering = new ZenModeFiltering(mContext); mConditions = new ZenModeConditions(this, conditionProviders); mServiceConfig = conditionProviders.getConfig(); } public Looper getLooper() { Loading Loading @@ -412,6 +424,54 @@ public class ZenModeHelper { } } public void setDefaultZenRules(Context context) { mDefaultConfig = readDefaultConfig(context.getResources()); mDefaultRuleIds.add(EVENTS_DEFAULT_RULE); mDefaultRuleIds.add(SCHEDULED_DEFAULT_RULE_1); mDefaultRuleIds.add(SCHEDULED_DEFAULT_RULE_2); appendDefaultRules(mDefaultConfig); } private void appendDefaultRules (ZenModeConfig config) { appendDefaultScheduleRules(config); appendDefaultEventRules(config); } // Checks zen rule properties are the same (doesn't check creation time, name nor enabled) // used to check if default rules were customized or not private boolean ruleValuesEqual(AutomaticZenRule rule, ZenRule defaultRule) { if (rule == null || defaultRule == null) { return false; } return rule.getInterruptionFilter() == NotificationManager.zenModeToInterruptionFilter(defaultRule.zenMode) && rule.getConditionId().equals(defaultRule.conditionId) && rule.getOwner().equals(defaultRule.component); } protected void updateDefaultZenRules() { ZenModeConfig configDefaultRules = new ZenModeConfig(); appendDefaultRules(configDefaultRules); // "new" localized default rules for (String ruleId : mDefaultRuleIds) { AutomaticZenRule currRule = getAutomaticZenRule(ruleId); ZenRule defaultRule = configDefaultRules.automaticRules.get(ruleId); // if default rule wasn't customized, use localized name instead of previous if (ruleValuesEqual(currRule, defaultRule) && !defaultRule.name.equals(currRule.getName())) { if (canManageAutomaticZenRule(defaultRule)) { if (DEBUG) Slog.d(TAG, "Locale change - updating default zen rule name " + "from " + currRule.getName() + " to " + defaultRule.name); // update default rule (if locale changed, name of rule will change) AutomaticZenRule defaultAutoRule = createAutomaticZenRule(defaultRule); updateAutomaticZenRule(ruleId, defaultAutoRule, "locale changed"); } } } } private boolean isSystemRule(AutomaticZenRule rule) { return ZenModeConfig.SYSTEM_AUTHORITY.equals(rule.getOwner().getPackageName()); } Loading Loading @@ -453,7 +513,7 @@ public class ZenModeHelper { automaticZenRule.getInterruptionFilter(), Global.ZEN_MODE_OFF); } private AutomaticZenRule createAutomaticZenRule(ZenRule rule) { protected AutomaticZenRule createAutomaticZenRule(ZenRule rule) { return new AutomaticZenRule(rule.name, rule.component, rule.conditionId, NotificationManager.zenModeToInterruptionFilter(rule.zenMode), rule.enabled, rule.creationTime); Loading Loading @@ -853,12 +913,11 @@ public class ZenModeHelper { weeknights.endHour = 7; final ZenRule rule1 = new ZenRule(); rule1.enabled = false; rule1.name = mContext.getResources() .getString(R.string.zen_mode_default_weeknights_name); rule1.name = mDefaultRuleWeeknightsName; rule1.conditionId = ZenModeConfig.toScheduleConditionId(weeknights); rule1.zenMode = Global.ZEN_MODE_ALARMS; rule1.component = ScheduleConditionProvider.COMPONENT; rule1.id = ZenModeConfig.newRuleId(); rule1.id = SCHEDULED_DEFAULT_RULE_1; rule1.creationTime = System.currentTimeMillis(); config.automaticRules.put(rule1.id, rule1); Loading @@ -869,12 +928,11 @@ public class ZenModeHelper { weekends.endHour = 10; final ZenRule rule2 = new ZenRule(); rule2.enabled = false; rule2.name = mContext.getResources() .getString(R.string.zen_mode_default_weekends_name); rule2.name = mDefaultRuleWeekendsName; rule2.conditionId = ZenModeConfig.toScheduleConditionId(weekends); rule2.zenMode = Global.ZEN_MODE_ALARMS; rule2.component = ScheduleConditionProvider.COMPONENT; rule2.id = ZenModeConfig.newRuleId(); rule2.id = SCHEDULED_DEFAULT_RULE_2; rule2.creationTime = System.currentTimeMillis(); config.automaticRules.put(rule2.id, rule2); } Loading @@ -887,11 +945,11 @@ public class ZenModeHelper { events.reply = EventInfo.REPLY_YES_OR_MAYBE; final ZenRule rule = new ZenRule(); rule.enabled = false; rule.name = mContext.getResources().getString(R.string.zen_mode_default_events_name); rule.name = mDefaultRuleEventsName; rule.conditionId = ZenModeConfig.toEventConditionId(events); rule.zenMode = Global.ZEN_MODE_ALARMS; rule.component = EventConditionProvider.COMPONENT; rule.id = ZenModeConfig.newRuleId(); rule.id = EVENTS_DEFAULT_RULE; rule.creationTime = System.currentTimeMillis(); config.automaticRules.put(rule.id, rule); } Loading
services/tests/notification/src/com/android/server/notification/NotificationManagerServiceTest.java +11 −1 Original line number Diff line number Diff line Loading @@ -48,6 +48,7 @@ import android.app.NotificationManager; import android.companion.ICompanionDeviceManager; import android.content.ComponentName; import android.content.Context; import android.content.Intent; import android.content.pm.ApplicationInfo; import android.content.pm.IPackageManager; import android.content.pm.PackageManager; Loading @@ -60,7 +61,6 @@ import android.os.UserHandle; import android.provider.Settings.Secure; import android.service.notification.NotificationListenerService; import android.service.notification.StatusBarNotification; import android.service.notification.ZenModeConfig; import android.test.suitebuilder.annotation.SmallTest; import android.testing.AndroidTestingRunner; import android.testing.TestableLooper; Loading Loading @@ -1550,4 +1550,14 @@ public class NotificationManagerServiceTest extends NotificationTestCase { verify(mAssistants, times(2)).migrateToXml(); } @Test public void testLocaleChangedCallsUpdateDefaultZenModeRules() throws Exception { ZenModeHelper mZenModeHelper = mock(ZenModeHelper.class); mNotificationManagerService.mZenModeHelper = mZenModeHelper; mNotificationManagerService.mLocaleChangeReceiver.onReceive(mContext, new Intent(Intent.ACTION_LOCALE_CHANGED)); verify(mZenModeHelper, times(1)).updateDefaultZenRules(); } }