Loading services/core/java/com/android/server/notification/ZenModeHelper.java +26 −10 Original line number Original line Diff line number Diff line Loading @@ -121,6 +121,7 @@ public class ZenModeHelper { protected final RingerModeDelegate mRingerModeDelegate = new protected final RingerModeDelegate mRingerModeDelegate = new RingerModeDelegate(); RingerModeDelegate(); @VisibleForTesting protected final ZenModeConditions mConditions; @VisibleForTesting protected final ZenModeConditions mConditions; Object mConfigsLock = new Object(); @VisibleForTesting final SparseArray<ZenModeConfig> mConfigs = new SparseArray<>(); @VisibleForTesting final SparseArray<ZenModeConfig> mConfigs = new SparseArray<>(); private final Metrics mMetrics = new Metrics(); private final Metrics mMetrics = new Metrics(); private final ConditionProviders.Config mServiceConfig; private final ConditionProviders.Config mServiceConfig; Loading Loading @@ -153,7 +154,9 @@ public class ZenModeHelper { mDefaultConfig = readDefaultConfig(mContext.getResources()); mDefaultConfig = readDefaultConfig(mContext.getResources()); updateDefaultAutomaticRuleNames(); updateDefaultAutomaticRuleNames(); mConfig = mDefaultConfig.copy(); mConfig = mDefaultConfig.copy(); synchronized (mConfigsLock) { mConfigs.put(UserHandle.USER_SYSTEM, mConfig); mConfigs.put(UserHandle.USER_SYSTEM, mConfig); } mConsolidatedPolicy = mConfig.toNotificationPolicy(); mConsolidatedPolicy = mConfig.toNotificationPolicy(); mSettingsObserver = new SettingsObserver(mHandler); mSettingsObserver = new SettingsObserver(mHandler); Loading Loading @@ -233,8 +236,10 @@ public class ZenModeHelper { public void onUserRemoved(int user) { public void onUserRemoved(int user) { if (user < UserHandle.USER_SYSTEM) return; if (user < UserHandle.USER_SYSTEM) return; if (DEBUG) Log.d(TAG, "onUserRemoved u=" + user); if (DEBUG) Log.d(TAG, "onUserRemoved u=" + user); synchronized (mConfigsLock) { mConfigs.remove(user); mConfigs.remove(user); } } } public void onUserUnlocked(int user) { public void onUserUnlocked(int user) { loadConfigForUser(user, "onUserUnlocked"); loadConfigForUser(user, "onUserUnlocked"); Loading @@ -248,7 +253,12 @@ public class ZenModeHelper { if (mUser == user || user < UserHandle.USER_SYSTEM) return; if (mUser == user || user < UserHandle.USER_SYSTEM) return; mUser = user; mUser = user; if (DEBUG) Log.d(TAG, reason + " u=" + user); if (DEBUG) Log.d(TAG, reason + " u=" + user); ZenModeConfig config = mConfigs.get(user); ZenModeConfig config = null; synchronized (mConfigsLock) { if (mConfigs.get(user) != null) { config = mConfigs.get(user).copy(); } } if (config == null) { if (config == null) { if (DEBUG) Log.d(TAG, reason + " generating default config for user " + user); if (DEBUG) Log.d(TAG, reason + " generating default config for user " + user); config = mDefaultConfig.copy(); config = mDefaultConfig.copy(); Loading Loading @@ -685,10 +695,12 @@ public class ZenModeHelper { pw.println(Global.zenModeToString(mZenMode)); pw.println(Global.zenModeToString(mZenMode)); pw.print(prefix); pw.print(prefix); pw.println("mConsolidatedPolicy=" + mConsolidatedPolicy.toString()); pw.println("mConsolidatedPolicy=" + mConsolidatedPolicy.toString()); synchronized(mConfigsLock) { final int N = mConfigs.size(); final int N = mConfigs.size(); for (int i = 0; i < N; i++) { for (int i = 0; i < N; i++) { dump(pw, prefix, "mConfigs[u=" + mConfigs.keyAt(i) + "]", mConfigs.valueAt(i)); dump(pw, prefix, "mConfigs[u=" + mConfigs.keyAt(i) + "]", mConfigs.valueAt(i)); } } } pw.print(prefix); pw.print("mUser="); pw.println(mUser); pw.print(prefix); pw.print("mUser="); pw.println(mUser); synchronized (mConfig) { synchronized (mConfig) { dump(pw, prefix, "mConfig", mConfig); dump(pw, prefix, "mConfig", mConfig); Loading Loading @@ -787,7 +799,7 @@ public class ZenModeHelper { public void writeXml(TypedXmlSerializer out, boolean forBackup, Integer version, int userId) public void writeXml(TypedXmlSerializer out, boolean forBackup, Integer version, int userId) throws IOException { throws IOException { synchronized (mConfigs) { synchronized (mConfigsLock) { final int n = mConfigs.size(); final int n = mConfigs.size(); for (int i = 0; i < n; i++) { for (int i = 0; i < n; i++) { if (forBackup && mConfigs.keyAt(i) != userId) { if (forBackup && mConfigs.keyAt(i) != userId) { Loading Loading @@ -883,14 +895,18 @@ public class ZenModeHelper { } } if (config.user != mUser) { if (config.user != mUser) { // simply store away for background users // simply store away for background users synchronized (mConfigsLock) { mConfigs.put(config.user, config); mConfigs.put(config.user, config); } if (DEBUG) Log.d(TAG, "setConfigLocked: store config for user " + config.user); if (DEBUG) Log.d(TAG, "setConfigLocked: store config for user " + config.user); return true; return true; } } // handle CPS backed conditions - danger! may modify config // handle CPS backed conditions - danger! may modify config mConditions.evaluateConfig(config, null, false /*processSubscriptions*/); mConditions.evaluateConfig(config, null, false /*processSubscriptions*/); synchronized (mConfigsLock) { mConfigs.put(config.user, config); mConfigs.put(config.user, config); } if (DEBUG) Log.d(TAG, "setConfigLocked reason=" + reason, new Throwable()); if (DEBUG) Log.d(TAG, "setConfigLocked reason=" + reason, new Throwable()); ZenLog.traceConfig(reason, mConfig, config); ZenLog.traceConfig(reason, mConfig, config); Loading Loading @@ -1211,7 +1227,7 @@ public class ZenModeHelper { * Generate pulled atoms about do not disturb configurations. * Generate pulled atoms about do not disturb configurations. */ */ public void pullRules(List<StatsEvent> events) { public void pullRules(List<StatsEvent> events) { synchronized (mConfig) { synchronized (mConfigsLock) { final int numConfigs = mConfigs.size(); final int numConfigs = mConfigs.size(); for (int i = 0; i < numConfigs; i++) { for (int i = 0; i < numConfigs; i++) { final int user = mConfigs.keyAt(i); final int user = mConfigs.keyAt(i); Loading Loading
services/core/java/com/android/server/notification/ZenModeHelper.java +26 −10 Original line number Original line Diff line number Diff line Loading @@ -121,6 +121,7 @@ public class ZenModeHelper { protected final RingerModeDelegate mRingerModeDelegate = new protected final RingerModeDelegate mRingerModeDelegate = new RingerModeDelegate(); RingerModeDelegate(); @VisibleForTesting protected final ZenModeConditions mConditions; @VisibleForTesting protected final ZenModeConditions mConditions; Object mConfigsLock = new Object(); @VisibleForTesting final SparseArray<ZenModeConfig> mConfigs = new SparseArray<>(); @VisibleForTesting final SparseArray<ZenModeConfig> mConfigs = new SparseArray<>(); private final Metrics mMetrics = new Metrics(); private final Metrics mMetrics = new Metrics(); private final ConditionProviders.Config mServiceConfig; private final ConditionProviders.Config mServiceConfig; Loading Loading @@ -153,7 +154,9 @@ public class ZenModeHelper { mDefaultConfig = readDefaultConfig(mContext.getResources()); mDefaultConfig = readDefaultConfig(mContext.getResources()); updateDefaultAutomaticRuleNames(); updateDefaultAutomaticRuleNames(); mConfig = mDefaultConfig.copy(); mConfig = mDefaultConfig.copy(); synchronized (mConfigsLock) { mConfigs.put(UserHandle.USER_SYSTEM, mConfig); mConfigs.put(UserHandle.USER_SYSTEM, mConfig); } mConsolidatedPolicy = mConfig.toNotificationPolicy(); mConsolidatedPolicy = mConfig.toNotificationPolicy(); mSettingsObserver = new SettingsObserver(mHandler); mSettingsObserver = new SettingsObserver(mHandler); Loading Loading @@ -233,8 +236,10 @@ public class ZenModeHelper { public void onUserRemoved(int user) { public void onUserRemoved(int user) { if (user < UserHandle.USER_SYSTEM) return; if (user < UserHandle.USER_SYSTEM) return; if (DEBUG) Log.d(TAG, "onUserRemoved u=" + user); if (DEBUG) Log.d(TAG, "onUserRemoved u=" + user); synchronized (mConfigsLock) { mConfigs.remove(user); mConfigs.remove(user); } } } public void onUserUnlocked(int user) { public void onUserUnlocked(int user) { loadConfigForUser(user, "onUserUnlocked"); loadConfigForUser(user, "onUserUnlocked"); Loading @@ -248,7 +253,12 @@ public class ZenModeHelper { if (mUser == user || user < UserHandle.USER_SYSTEM) return; if (mUser == user || user < UserHandle.USER_SYSTEM) return; mUser = user; mUser = user; if (DEBUG) Log.d(TAG, reason + " u=" + user); if (DEBUG) Log.d(TAG, reason + " u=" + user); ZenModeConfig config = mConfigs.get(user); ZenModeConfig config = null; synchronized (mConfigsLock) { if (mConfigs.get(user) != null) { config = mConfigs.get(user).copy(); } } if (config == null) { if (config == null) { if (DEBUG) Log.d(TAG, reason + " generating default config for user " + user); if (DEBUG) Log.d(TAG, reason + " generating default config for user " + user); config = mDefaultConfig.copy(); config = mDefaultConfig.copy(); Loading Loading @@ -685,10 +695,12 @@ public class ZenModeHelper { pw.println(Global.zenModeToString(mZenMode)); pw.println(Global.zenModeToString(mZenMode)); pw.print(prefix); pw.print(prefix); pw.println("mConsolidatedPolicy=" + mConsolidatedPolicy.toString()); pw.println("mConsolidatedPolicy=" + mConsolidatedPolicy.toString()); synchronized(mConfigsLock) { final int N = mConfigs.size(); final int N = mConfigs.size(); for (int i = 0; i < N; i++) { for (int i = 0; i < N; i++) { dump(pw, prefix, "mConfigs[u=" + mConfigs.keyAt(i) + "]", mConfigs.valueAt(i)); dump(pw, prefix, "mConfigs[u=" + mConfigs.keyAt(i) + "]", mConfigs.valueAt(i)); } } } pw.print(prefix); pw.print("mUser="); pw.println(mUser); pw.print(prefix); pw.print("mUser="); pw.println(mUser); synchronized (mConfig) { synchronized (mConfig) { dump(pw, prefix, "mConfig", mConfig); dump(pw, prefix, "mConfig", mConfig); Loading Loading @@ -787,7 +799,7 @@ public class ZenModeHelper { public void writeXml(TypedXmlSerializer out, boolean forBackup, Integer version, int userId) public void writeXml(TypedXmlSerializer out, boolean forBackup, Integer version, int userId) throws IOException { throws IOException { synchronized (mConfigs) { synchronized (mConfigsLock) { final int n = mConfigs.size(); final int n = mConfigs.size(); for (int i = 0; i < n; i++) { for (int i = 0; i < n; i++) { if (forBackup && mConfigs.keyAt(i) != userId) { if (forBackup && mConfigs.keyAt(i) != userId) { Loading Loading @@ -883,14 +895,18 @@ public class ZenModeHelper { } } if (config.user != mUser) { if (config.user != mUser) { // simply store away for background users // simply store away for background users synchronized (mConfigsLock) { mConfigs.put(config.user, config); mConfigs.put(config.user, config); } if (DEBUG) Log.d(TAG, "setConfigLocked: store config for user " + config.user); if (DEBUG) Log.d(TAG, "setConfigLocked: store config for user " + config.user); return true; return true; } } // handle CPS backed conditions - danger! may modify config // handle CPS backed conditions - danger! may modify config mConditions.evaluateConfig(config, null, false /*processSubscriptions*/); mConditions.evaluateConfig(config, null, false /*processSubscriptions*/); synchronized (mConfigsLock) { mConfigs.put(config.user, config); mConfigs.put(config.user, config); } if (DEBUG) Log.d(TAG, "setConfigLocked reason=" + reason, new Throwable()); if (DEBUG) Log.d(TAG, "setConfigLocked reason=" + reason, new Throwable()); ZenLog.traceConfig(reason, mConfig, config); ZenLog.traceConfig(reason, mConfig, config); Loading Loading @@ -1211,7 +1227,7 @@ public class ZenModeHelper { * Generate pulled atoms about do not disturb configurations. * Generate pulled atoms about do not disturb configurations. */ */ public void pullRules(List<StatsEvent> events) { public void pullRules(List<StatsEvent> events) { synchronized (mConfig) { synchronized (mConfigsLock) { final int numConfigs = mConfigs.size(); final int numConfigs = mConfigs.size(); for (int i = 0; i < numConfigs; i++) { for (int i = 0; i < numConfigs; i++) { final int user = mConfigs.keyAt(i); final int user = mConfigs.keyAt(i); Loading