Loading services/core/java/com/android/server/notification/NotificationManagerService.java +12 −11 Original line number Diff line number Diff line Loading @@ -7376,15 +7376,7 @@ public class NotificationManagerService extends SystemService { // so need to check the notification still valide for vibrate. synchronized (mNotificationLock) { if (mNotificationsByKey.get(record.getKey()) != null) { // Vibrator checks the appops for the op package, not the caller, // so we need to add the bypass dnd flag to be heard. it's ok to // always add this flag here because we've already checked that we can // bypass dnd AudioAttributes.Builder aab = new AudioAttributes.Builder(record.getAudioAttributes()) .setFlags(FLAG_BYPASS_INTERRUPTION_POLICY); mVibrator.vibrate(record.getSbn().getUid(), record.getSbn().getOpPkg(), effect, "Notification (delayed)", aab.build()); vibrate(record, effect, true); } else { Slog.e(TAG, "No vibration for canceled notification : " + record.getKey()); Loading @@ -7392,8 +7384,7 @@ public class NotificationManagerService extends SystemService { } }).start(); } else { mVibrator.vibrate(record.getSbn().getUid(), record.getSbn().getPackageName(), effect, "Notification", record.getAudioAttributes()); vibrate(record, effect, false); } return true; } finally{ Loading @@ -7401,6 +7392,16 @@ public class NotificationManagerService extends SystemService { } } private void vibrate(NotificationRecord record, VibrationEffect effect, boolean delayed) { // We need to vibrate as "android" so we can breakthrough DND. VibratorManagerService // doesn't have a concept of vibrating on an app's behalf, so add the app information // to the reason so we can still debug from bugreports String reason = "Notification (" + record.getSbn().getOpPkg() + " " + record.getSbn().getUid() + ") " + (delayed ? "(Delayed)" : ""); mVibrator.vibrate(Process.SYSTEM_UID, PackageManagerService.PLATFORM_PACKAGE_NAME, effect, reason, record.getAudioAttributes()); } private boolean isNotificationForCurrentUser(NotificationRecord record) { final int currentUser; final long token = Binder.clearCallingIdentity(); Loading services/tests/uiservicestests/src/com/android/server/notification/BuzzBeepBlinkTest.java +9 −2 Original line number Diff line number Diff line Loading @@ -61,6 +61,7 @@ import android.media.AudioAttributes; import android.media.AudioManager; import android.net.Uri; import android.os.Handler; import android.os.Process; import android.os.RemoteException; import android.os.UserHandle; import android.os.VibrationEffect; Loading @@ -81,10 +82,12 @@ import com.android.internal.logging.InstanceIdSequenceFake; import com.android.internal.util.IntPair; import com.android.server.UiServiceTestCase; import com.android.server.lights.LogicalLight; import com.android.server.pm.PackageManagerService; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; import org.mockito.ArgumentCaptor; import org.mockito.ArgumentMatcher; import org.mockito.Mock; import org.mockito.Mockito; Loading Loading @@ -412,12 +415,16 @@ public class BuzzBeepBlinkTest extends UiServiceTestCase { } private void verifyVibrate() { ArgumentCaptor<AudioAttributes> captor = ArgumentCaptor.forClass(AudioAttributes.class); verify(mVibrator, times(1)).vibrate(anyInt(), anyString(), argThat(mVibrateOnceMatcher), anyString(), any(AudioAttributes.class)); anyString(), captor.capture()); assertEquals(0, (captor.getValue().getAllFlags() & AudioAttributes.FLAG_BYPASS_INTERRUPTION_POLICY)); } private void verifyVibrate(int times) { verify(mVibrator, times(times)).vibrate(anyInt(), anyString(), any(), anyString(), verify(mVibrator, times(times)).vibrate(eq(Process.SYSTEM_UID), eq(PackageManagerService.PLATFORM_PACKAGE_NAME), any(), anyString(), any(AudioAttributes.class)); } Loading Loading
services/core/java/com/android/server/notification/NotificationManagerService.java +12 −11 Original line number Diff line number Diff line Loading @@ -7376,15 +7376,7 @@ public class NotificationManagerService extends SystemService { // so need to check the notification still valide for vibrate. synchronized (mNotificationLock) { if (mNotificationsByKey.get(record.getKey()) != null) { // Vibrator checks the appops for the op package, not the caller, // so we need to add the bypass dnd flag to be heard. it's ok to // always add this flag here because we've already checked that we can // bypass dnd AudioAttributes.Builder aab = new AudioAttributes.Builder(record.getAudioAttributes()) .setFlags(FLAG_BYPASS_INTERRUPTION_POLICY); mVibrator.vibrate(record.getSbn().getUid(), record.getSbn().getOpPkg(), effect, "Notification (delayed)", aab.build()); vibrate(record, effect, true); } else { Slog.e(TAG, "No vibration for canceled notification : " + record.getKey()); Loading @@ -7392,8 +7384,7 @@ public class NotificationManagerService extends SystemService { } }).start(); } else { mVibrator.vibrate(record.getSbn().getUid(), record.getSbn().getPackageName(), effect, "Notification", record.getAudioAttributes()); vibrate(record, effect, false); } return true; } finally{ Loading @@ -7401,6 +7392,16 @@ public class NotificationManagerService extends SystemService { } } private void vibrate(NotificationRecord record, VibrationEffect effect, boolean delayed) { // We need to vibrate as "android" so we can breakthrough DND. VibratorManagerService // doesn't have a concept of vibrating on an app's behalf, so add the app information // to the reason so we can still debug from bugreports String reason = "Notification (" + record.getSbn().getOpPkg() + " " + record.getSbn().getUid() + ") " + (delayed ? "(Delayed)" : ""); mVibrator.vibrate(Process.SYSTEM_UID, PackageManagerService.PLATFORM_PACKAGE_NAME, effect, reason, record.getAudioAttributes()); } private boolean isNotificationForCurrentUser(NotificationRecord record) { final int currentUser; final long token = Binder.clearCallingIdentity(); Loading
services/tests/uiservicestests/src/com/android/server/notification/BuzzBeepBlinkTest.java +9 −2 Original line number Diff line number Diff line Loading @@ -61,6 +61,7 @@ import android.media.AudioAttributes; import android.media.AudioManager; import android.net.Uri; import android.os.Handler; import android.os.Process; import android.os.RemoteException; import android.os.UserHandle; import android.os.VibrationEffect; Loading @@ -81,10 +82,12 @@ import com.android.internal.logging.InstanceIdSequenceFake; import com.android.internal.util.IntPair; import com.android.server.UiServiceTestCase; import com.android.server.lights.LogicalLight; import com.android.server.pm.PackageManagerService; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; import org.mockito.ArgumentCaptor; import org.mockito.ArgumentMatcher; import org.mockito.Mock; import org.mockito.Mockito; Loading Loading @@ -412,12 +415,16 @@ public class BuzzBeepBlinkTest extends UiServiceTestCase { } private void verifyVibrate() { ArgumentCaptor<AudioAttributes> captor = ArgumentCaptor.forClass(AudioAttributes.class); verify(mVibrator, times(1)).vibrate(anyInt(), anyString(), argThat(mVibrateOnceMatcher), anyString(), any(AudioAttributes.class)); anyString(), captor.capture()); assertEquals(0, (captor.getValue().getAllFlags() & AudioAttributes.FLAG_BYPASS_INTERRUPTION_POLICY)); } private void verifyVibrate(int times) { verify(mVibrator, times(times)).vibrate(anyInt(), anyString(), any(), anyString(), verify(mVibrator, times(times)).vibrate(eq(Process.SYSTEM_UID), eq(PackageManagerService.PLATFORM_PACKAGE_NAME), any(), anyString(), any(AudioAttributes.class)); } Loading