diff --git a/core/java/android/app/INotificationManager.aidl b/core/java/android/app/INotificationManager.aidl index e57738fbbfdd2..9f51db88e7dc6 100644 --- a/core/java/android/app/INotificationManager.aidl +++ b/core/java/android/app/INotificationManager.aidl @@ -108,6 +108,8 @@ interface INotificationManager ParceledListSlice getNotificationChannelsBypassingDnd(String pkg, int userId); boolean isPackagePaused(String pkg); + void silenceNotificationSound(); + // TODO: Remove this when callers have been migrated to the equivalent // INotificationListener method. @UnsupportedAppUsage diff --git a/core/java/android/app/NotificationManager.java b/core/java/android/app/NotificationManager.java index dd39376f80caa..b13a34faab6be 100644 --- a/core/java/android/app/NotificationManager.java +++ b/core/java/android/app/NotificationManager.java @@ -1094,6 +1094,25 @@ public class NotificationManager { } } + /** + * Silences the current notification sound, if ones currently playing. + *
+ * It is intended to handle use-cases such as silencing a ringing call + * when the user presses the volume button during ringing. + *
+ * If this method is called prior to when the notification begins playing, the sound will not be + * silenced. As such it is not intended as a means to avoid playing of a sound. + * @hide + */ + public void silenceNotificationSound() { + INotificationManager service = getService(); + try { + service.silenceNotificationSound(); + } catch (RemoteException e) { + throw e.rethrowFromSystemServer(); + } + } + /** * Returns whether notifications from this package are temporarily hidden. This * could be done because the package was marked as distracting to the user via diff --git a/services/core/java/com/android/server/notification/NotificationManagerService.java b/services/core/java/com/android/server/notification/NotificationManagerService.java index 595273f0e195d..81e0ae25dec04 100644 --- a/services/core/java/com/android/server/notification/NotificationManagerService.java +++ b/services/core/java/com/android/server/notification/NotificationManagerService.java @@ -2404,6 +2404,13 @@ public class NotificationManagerService extends SystemService { REASON_APP_CANCEL_ALL, null); } + @Override + public void silenceNotificationSound() { + checkCallerIsSystem(); + + mNotificationDelegate.clearEffects(); + } + @Override public void setNotificationsEnabledForPackage(String pkg, int uid, boolean enabled) { enforceSystemOrSystemUI("setNotificationsEnabledForPackage"); diff --git a/services/core/java/com/android/server/policy/PhoneWindowManager.java b/services/core/java/com/android/server/policy/PhoneWindowManager.java index 21b13fe234e0c..48056b47e1bd6 100644 --- a/services/core/java/com/android/server/policy/PhoneWindowManager.java +++ b/services/core/java/com/android/server/policy/PhoneWindowManager.java @@ -107,6 +107,7 @@ import android.app.ActivityManagerInternal; import android.app.ActivityTaskManager; import android.app.AppOpsManager; import android.app.IUiModeManager; +import android.app.NotificationManager; import android.app.ProgressDialog; import android.app.SearchManager; import android.app.UiModeManager; @@ -2572,6 +2573,10 @@ public class PhoneWindowManager implements WindowManagerPolicy { return (TelecomManager) mContext.getSystemService(Context.TELECOM_SERVICE); } + NotificationManager getNotificationService() { + return mContext.getSystemService(NotificationManager.class); + } + static IAudioService getAudioService() { IAudioService audioService = IAudioService.Stub.asInterface( ServiceManager.checkService(Context.AUDIO_SERVICE)); @@ -3806,6 +3811,11 @@ public class PhoneWindowManager implements WindowManagerPolicy { if (down) { sendSystemKeyToStatusBarAsync(event.getKeyCode()); + NotificationManager nm = getNotificationService(); + if (nm != null && !mHandleVolumeKeysInWM) { + nm.silenceNotificationSound(); + } + TelecomManager telecomManager = getTelecommService(); if (telecomManager != null && !mHandleVolumeKeysInWM) { // When {@link #mHandleVolumeKeysInWM} is set, volume key events