Loading core/res/res/values/config.xml +6 −0 Original line number Diff line number Diff line Loading @@ -3483,6 +3483,12 @@ <item>com.android.messaging</item> </string-array> <!-- An array of packages that can make sound on the ringer stream in priority-only DND mode --> <string-array translatable="false" name="config_priorityOnlyDndExemptPackages"> <item>com.android.dialer</item> </string-array> <!-- An array of packages which can listen for notifications on low ram devices. --> <string-array translatable="false" name="config_allowedManagedServicesOnLowRamDevices" /> Loading core/res/res/values/symbols.xml +1 −0 Original line number Diff line number Diff line Loading @@ -3188,6 +3188,7 @@ <java-symbol type="array" name="config_convert_to_emergency_number_map" /> <java-symbol type="array" name="config_nonBlockableNotificationPackages" /> <java-symbol type="array" name="config_priorityOnlyDndExemptPackages" /> <java-symbol type="array" name="config_allowedManagedServicesOnLowRamDevices" /> Loading services/core/java/com/android/server/notification/NotificationManagerService.java +3 −0 Original line number Diff line number Diff line Loading @@ -1689,6 +1689,9 @@ public class NotificationManagerService extends SystemService { mPreferencesHelper.lockChannelsForOEM(getContext().getResources().getStringArray( com.android.internal.R.array.config_nonBlockableNotificationPackages)); mZenModeHelper.setPriorityOnlyDndExemptPackages(getContext().getResources().getStringArray( com.android.internal.R.array.config_priorityOnlyDndExemptPackages)); } @Override Loading services/core/java/com/android/server/notification/ZenModeHelper.java +29 −28 Original line number Diff line number Diff line Loading @@ -80,6 +80,7 @@ import org.xmlpull.v1.XmlSerializer; import java.io.IOException; import java.io.PrintWriter; import java.util.ArrayList; import java.util.Arrays; import java.util.List; import java.util.Objects; Loading @@ -96,7 +97,7 @@ public class ZenModeHelper { private final Context mContext; private final H mHandler; private final SettingsObserver mSettingsObserver; @VisibleForTesting protected final AppOpsManager mAppOps; private final AppOpsManager mAppOps; @VisibleForTesting protected final NotificationManager mNotificationManager; @VisibleForTesting protected ZenModeConfig mDefaultConfig; private final ArrayList<Callback> mCallbacks = new ArrayList<Callback>(); Loading @@ -123,11 +124,13 @@ public class ZenModeHelper { @VisibleForTesting protected boolean mIsBootComplete; private String[] mPriorityOnlyDndExemptPackages; public ZenModeHelper(Context context, Looper looper, ConditionProviders conditionProviders) { mContext = context; mHandler = new H(looper); addCallback(mMetrics); mAppOps = (AppOpsManager) context.getSystemService(Context.APP_OPS_SERVICE); mAppOps = context.getSystemService(AppOpsManager.class); mNotificationManager = context.getSystemService(NotificationManager.class); mDefaultConfig = readDefaultConfig(mContext.getResources()); Loading Loading @@ -214,6 +217,10 @@ public class ZenModeHelper { loadConfigForUser(user, "onUserUnlocked"); } void setPriorityOnlyDndExemptPackages(String[] packages) { mPriorityOnlyDndExemptPackages = packages; } private void loadConfigForUser(int user, String reason) { if (mUser == user || user < UserHandle.USER_SYSTEM) return; mUser = user; Loading Loading @@ -994,53 +1001,47 @@ public class ZenModeHelper { for (int usage : AudioAttributes.SDK_USAGES) { final int suppressionBehavior = AudioAttributes.SUPPRESSIBLE_USAGES.get(usage); if (suppressionBehavior == AudioAttributes.SUPPRESSIBLE_NEVER) { applyRestrictions(false /*mute*/, usage); applyRestrictions(zenPriorityOnly, false /*mute*/, usage); } else if (suppressionBehavior == AudioAttributes.SUPPRESSIBLE_NOTIFICATION) { applyRestrictions(muteNotifications || muteEverything, usage); applyRestrictions(zenPriorityOnly, muteNotifications || muteEverything, usage); } else if (suppressionBehavior == AudioAttributes.SUPPRESSIBLE_CALL) { applyRestrictions(muteCalls || muteEverything, usage); applyRestrictions(zenPriorityOnly, muteCalls || muteEverything, usage); } else if (suppressionBehavior == AudioAttributes.SUPPRESSIBLE_ALARM) { applyRestrictions(muteAlarms || muteEverything, usage); applyRestrictions(zenPriorityOnly, muteAlarms || muteEverything, usage); } else if (suppressionBehavior == AudioAttributes.SUPPRESSIBLE_MEDIA) { applyRestrictions(muteMedia || muteEverything, usage); applyRestrictions(zenPriorityOnly, muteMedia || muteEverything, usage); } else if (suppressionBehavior == AudioAttributes.SUPPRESSIBLE_SYSTEM) { if (usage == AudioAttributes.USAGE_ASSISTANCE_SONIFICATION) { // normally DND will only restrict touch sounds, not haptic feedback/vibrations applyRestrictions(muteSystem || muteEverything, usage, applyRestrictions(zenPriorityOnly, muteSystem || muteEverything, usage, AppOpsManager.OP_PLAY_AUDIO); applyRestrictions(false, usage, AppOpsManager.OP_VIBRATE); applyRestrictions(zenPriorityOnly, false, usage, AppOpsManager.OP_VIBRATE); } else { applyRestrictions(muteSystem || muteEverything, usage); applyRestrictions(zenPriorityOnly, muteSystem || muteEverything, usage); } } else { applyRestrictions(muteEverything, usage); applyRestrictions(zenPriorityOnly, muteEverything, usage); } } } @VisibleForTesting protected void applyRestrictions(boolean mute, int usage, int code) { final String[] exceptionPackages = null; // none (for now) // Only do this if we are executing within the system process... otherwise // we are running as test code, so don't have access to the protected call. if (Process.myUid() == Process.SYSTEM_UID) { protected void applyRestrictions(boolean zenPriorityOnly, boolean mute, int usage, int code) { final long ident = Binder.clearCallingIdentity(); try { mAppOps.setRestriction(code, usage, mute ? AppOpsManager.MODE_IGNORED : AppOpsManager.MODE_ALLOWED, exceptionPackages); zenPriorityOnly ? mPriorityOnlyDndExemptPackages : null); } finally { Binder.restoreCallingIdentity(ident); } } } @VisibleForTesting protected void applyRestrictions(boolean mute, int usage) { applyRestrictions(mute, usage, AppOpsManager.OP_VIBRATE); applyRestrictions(mute, usage, AppOpsManager.OP_PLAY_AUDIO); protected void applyRestrictions(boolean zenPriorityOnly, boolean mute, int usage) { applyRestrictions(zenPriorityOnly, mute, usage, AppOpsManager.OP_VIBRATE); applyRestrictions(zenPriorityOnly, mute, usage, AppOpsManager.OP_PLAY_AUDIO); } Loading services/tests/uiservicestests/src/com/android/server/notification/NotificationManagerServiceTest.java +1 −0 Original line number Diff line number Diff line Loading @@ -349,6 +349,7 @@ public class NotificationManagerServiceTest extends UiServiceTestCase { when(mUgmInternal.newUriPermissionOwner(anyString())).thenReturn(mPermOwner); when(mPackageManager.getPackagesForUid(mUid)).thenReturn(new String[]{PKG}); when(mPackageManagerClient.getPackagesForUid(anyInt())).thenReturn(new String[]{PKG}); mContext.addMockSystemService(AppOpsManager.class, mock(AppOpsManager.class)); // write to a test file; the system file isn't readable from tests mFile = new File(mContext.getCacheDir(), "test.xml"); Loading Loading
core/res/res/values/config.xml +6 −0 Original line number Diff line number Diff line Loading @@ -3483,6 +3483,12 @@ <item>com.android.messaging</item> </string-array> <!-- An array of packages that can make sound on the ringer stream in priority-only DND mode --> <string-array translatable="false" name="config_priorityOnlyDndExemptPackages"> <item>com.android.dialer</item> </string-array> <!-- An array of packages which can listen for notifications on low ram devices. --> <string-array translatable="false" name="config_allowedManagedServicesOnLowRamDevices" /> Loading
core/res/res/values/symbols.xml +1 −0 Original line number Diff line number Diff line Loading @@ -3188,6 +3188,7 @@ <java-symbol type="array" name="config_convert_to_emergency_number_map" /> <java-symbol type="array" name="config_nonBlockableNotificationPackages" /> <java-symbol type="array" name="config_priorityOnlyDndExemptPackages" /> <java-symbol type="array" name="config_allowedManagedServicesOnLowRamDevices" /> Loading
services/core/java/com/android/server/notification/NotificationManagerService.java +3 −0 Original line number Diff line number Diff line Loading @@ -1689,6 +1689,9 @@ public class NotificationManagerService extends SystemService { mPreferencesHelper.lockChannelsForOEM(getContext().getResources().getStringArray( com.android.internal.R.array.config_nonBlockableNotificationPackages)); mZenModeHelper.setPriorityOnlyDndExemptPackages(getContext().getResources().getStringArray( com.android.internal.R.array.config_priorityOnlyDndExemptPackages)); } @Override Loading
services/core/java/com/android/server/notification/ZenModeHelper.java +29 −28 Original line number Diff line number Diff line Loading @@ -80,6 +80,7 @@ import org.xmlpull.v1.XmlSerializer; import java.io.IOException; import java.io.PrintWriter; import java.util.ArrayList; import java.util.Arrays; import java.util.List; import java.util.Objects; Loading @@ -96,7 +97,7 @@ public class ZenModeHelper { private final Context mContext; private final H mHandler; private final SettingsObserver mSettingsObserver; @VisibleForTesting protected final AppOpsManager mAppOps; private final AppOpsManager mAppOps; @VisibleForTesting protected final NotificationManager mNotificationManager; @VisibleForTesting protected ZenModeConfig mDefaultConfig; private final ArrayList<Callback> mCallbacks = new ArrayList<Callback>(); Loading @@ -123,11 +124,13 @@ public class ZenModeHelper { @VisibleForTesting protected boolean mIsBootComplete; private String[] mPriorityOnlyDndExemptPackages; public ZenModeHelper(Context context, Looper looper, ConditionProviders conditionProviders) { mContext = context; mHandler = new H(looper); addCallback(mMetrics); mAppOps = (AppOpsManager) context.getSystemService(Context.APP_OPS_SERVICE); mAppOps = context.getSystemService(AppOpsManager.class); mNotificationManager = context.getSystemService(NotificationManager.class); mDefaultConfig = readDefaultConfig(mContext.getResources()); Loading Loading @@ -214,6 +217,10 @@ public class ZenModeHelper { loadConfigForUser(user, "onUserUnlocked"); } void setPriorityOnlyDndExemptPackages(String[] packages) { mPriorityOnlyDndExemptPackages = packages; } private void loadConfigForUser(int user, String reason) { if (mUser == user || user < UserHandle.USER_SYSTEM) return; mUser = user; Loading Loading @@ -994,53 +1001,47 @@ public class ZenModeHelper { for (int usage : AudioAttributes.SDK_USAGES) { final int suppressionBehavior = AudioAttributes.SUPPRESSIBLE_USAGES.get(usage); if (suppressionBehavior == AudioAttributes.SUPPRESSIBLE_NEVER) { applyRestrictions(false /*mute*/, usage); applyRestrictions(zenPriorityOnly, false /*mute*/, usage); } else if (suppressionBehavior == AudioAttributes.SUPPRESSIBLE_NOTIFICATION) { applyRestrictions(muteNotifications || muteEverything, usage); applyRestrictions(zenPriorityOnly, muteNotifications || muteEverything, usage); } else if (suppressionBehavior == AudioAttributes.SUPPRESSIBLE_CALL) { applyRestrictions(muteCalls || muteEverything, usage); applyRestrictions(zenPriorityOnly, muteCalls || muteEverything, usage); } else if (suppressionBehavior == AudioAttributes.SUPPRESSIBLE_ALARM) { applyRestrictions(muteAlarms || muteEverything, usage); applyRestrictions(zenPriorityOnly, muteAlarms || muteEverything, usage); } else if (suppressionBehavior == AudioAttributes.SUPPRESSIBLE_MEDIA) { applyRestrictions(muteMedia || muteEverything, usage); applyRestrictions(zenPriorityOnly, muteMedia || muteEverything, usage); } else if (suppressionBehavior == AudioAttributes.SUPPRESSIBLE_SYSTEM) { if (usage == AudioAttributes.USAGE_ASSISTANCE_SONIFICATION) { // normally DND will only restrict touch sounds, not haptic feedback/vibrations applyRestrictions(muteSystem || muteEverything, usage, applyRestrictions(zenPriorityOnly, muteSystem || muteEverything, usage, AppOpsManager.OP_PLAY_AUDIO); applyRestrictions(false, usage, AppOpsManager.OP_VIBRATE); applyRestrictions(zenPriorityOnly, false, usage, AppOpsManager.OP_VIBRATE); } else { applyRestrictions(muteSystem || muteEverything, usage); applyRestrictions(zenPriorityOnly, muteSystem || muteEverything, usage); } } else { applyRestrictions(muteEverything, usage); applyRestrictions(zenPriorityOnly, muteEverything, usage); } } } @VisibleForTesting protected void applyRestrictions(boolean mute, int usage, int code) { final String[] exceptionPackages = null; // none (for now) // Only do this if we are executing within the system process... otherwise // we are running as test code, so don't have access to the protected call. if (Process.myUid() == Process.SYSTEM_UID) { protected void applyRestrictions(boolean zenPriorityOnly, boolean mute, int usage, int code) { final long ident = Binder.clearCallingIdentity(); try { mAppOps.setRestriction(code, usage, mute ? AppOpsManager.MODE_IGNORED : AppOpsManager.MODE_ALLOWED, exceptionPackages); zenPriorityOnly ? mPriorityOnlyDndExemptPackages : null); } finally { Binder.restoreCallingIdentity(ident); } } } @VisibleForTesting protected void applyRestrictions(boolean mute, int usage) { applyRestrictions(mute, usage, AppOpsManager.OP_VIBRATE); applyRestrictions(mute, usage, AppOpsManager.OP_PLAY_AUDIO); protected void applyRestrictions(boolean zenPriorityOnly, boolean mute, int usage) { applyRestrictions(zenPriorityOnly, mute, usage, AppOpsManager.OP_VIBRATE); applyRestrictions(zenPriorityOnly, mute, usage, AppOpsManager.OP_PLAY_AUDIO); } Loading
services/tests/uiservicestests/src/com/android/server/notification/NotificationManagerServiceTest.java +1 −0 Original line number Diff line number Diff line Loading @@ -349,6 +349,7 @@ public class NotificationManagerServiceTest extends UiServiceTestCase { when(mUgmInternal.newUriPermissionOwner(anyString())).thenReturn(mPermOwner); when(mPackageManager.getPackagesForUid(mUid)).thenReturn(new String[]{PKG}); when(mPackageManagerClient.getPackagesForUid(anyInt())).thenReturn(new String[]{PKG}); mContext.addMockSystemService(AppOpsManager.class, mock(AppOpsManager.class)); // write to a test file; the system file isn't readable from tests mFile = new File(mContext.getCacheDir(), "test.xml"); Loading