diff --git a/services/core/java/com/android/server/vibrator/VibratorManagerService.java b/services/core/java/com/android/server/vibrator/VibratorManagerService.java index 567463fd7725d..239a112f31447 100644 --- a/services/core/java/com/android/server/vibrator/VibratorManagerService.java +++ b/services/core/java/com/android/server/vibrator/VibratorManagerService.java @@ -1344,24 +1344,18 @@ public class VibratorManagerService extends IVibratorManagerService.Stub { return IExternalVibratorService.SCALE_MUTE; } - int mode = checkAppOpModeLocked(vib.getUid(), vib.getPackage(), - vib.getVibrationAttributes()); - if (mode != AppOpsManager.MODE_ALLOWED) { - ExternalVibrationHolder vibHolder = new ExternalVibrationHolder(vib); - vibHolder.scale = IExternalVibratorService.SCALE_MUTE; - if (mode == AppOpsManager.MODE_ERRORED) { - Slog.w(TAG, "Would be an error: external vibrate from uid " + vib.getUid()); - endVibrationLocked(vibHolder, Vibration.Status.IGNORED_ERROR_APP_OPS); - } else { - endVibrationLocked(vibHolder, Vibration.Status.IGNORED_APP_OPS); - } - return vibHolder.scale; - } - ExternalVibrationHolder cancelingExternalVibration = null; VibrationThread cancelingVibration = null; int scale; synchronized (mLock) { + Vibration.Status ignoreStatus = shouldIgnoreVibrationLocked( + vib.getUid(), vib.getPackage(), vib.getVibrationAttributes()); + if (ignoreStatus != null) { + ExternalVibrationHolder vibHolder = new ExternalVibrationHolder(vib); + vibHolder.scale = IExternalVibratorService.SCALE_MUTE; + endVibrationLocked(vibHolder, ignoreStatus); + return vibHolder.scale; + } if (mCurrentExternalVibration != null && mCurrentExternalVibration.externalVibration.equals(vib)) { // We are already playing this external vibration, so we can return the same diff --git a/services/tests/servicestests/src/com/android/server/vibrator/VibratorManagerServiceTest.java b/services/tests/servicestests/src/com/android/server/vibrator/VibratorManagerServiceTest.java index f9e63d1b1d0ac..5e25bc59c6a5b 100644 --- a/services/tests/servicestests/src/com/android/server/vibrator/VibratorManagerServiceTest.java +++ b/services/tests/servicestests/src/com/android/server/vibrator/VibratorManagerServiceTest.java @@ -1013,6 +1013,8 @@ public class VibratorManagerServiceTest { throws Exception { mockVibrators(1); mVibratorProviders.get(1).setCapabilities(IVibrator.CAP_EXTERNAL_CONTROL); + setRingerMode(AudioManager.RINGER_MODE_NORMAL); + setUserSetting(Settings.System.VIBRATE_WHEN_RINGING, 1); createSystemReadyService(); IExternalVibrationController firstController = mock(IExternalVibrationController.class); @@ -1021,8 +1023,11 @@ public class VibratorManagerServiceTest { firstController); int firstScale = mExternalVibratorService.onExternalVibrationStart(firstVibration); - ExternalVibration secondVibration = new ExternalVibration(UID, PACKAGE_NAME, AUDIO_ATTRS, - secondController); + AudioAttributes ringtoneAudioAttrs = new AudioAttributes.Builder() + .setUsage(AudioAttributes.USAGE_NOTIFICATION_RINGTONE) + .build(); + ExternalVibration secondVibration = new ExternalVibration(UID, PACKAGE_NAME, + ringtoneAudioAttrs, secondController); int secondScale = mExternalVibratorService.onExternalVibrationStart(secondVibration); assertEquals(IExternalVibratorService.SCALE_NONE, firstScale); @@ -1057,6 +1062,37 @@ public class VibratorManagerServiceTest { mVibratorProviders.get(1).getExternalControlStates()); } + @Test + public void onExternalVibration_withRingtone_usesRingerModeSettings() { + mockVibrators(1); + mVibratorProviders.get(1).setCapabilities(IVibrator.CAP_EXTERNAL_CONTROL); + mVibrator.setDefaultRingVibrationIntensity(Vibrator.VIBRATION_INTENSITY_MEDIUM); + AudioAttributes audioAttrs = new AudioAttributes.Builder() + .setUsage(AudioAttributes.USAGE_NOTIFICATION_RINGTONE) + .build(); + ExternalVibration externalVibration = new ExternalVibration(UID, PACKAGE_NAME, audioAttrs, + mock(IExternalVibrationController.class)); + + setRingerMode(AudioManager.RINGER_MODE_NORMAL); + setUserSetting(Settings.System.VIBRATE_WHEN_RINGING, 0); + setGlobalSetting(Settings.Global.APPLY_RAMPING_RINGER, 0); + createSystemReadyService(); + int scale = mExternalVibratorService.onExternalVibrationStart(externalVibration); + assertEquals(IExternalVibratorService.SCALE_MUTE, scale); + + setUserSetting(Settings.System.VIBRATE_WHEN_RINGING, 0); + setGlobalSetting(Settings.Global.APPLY_RAMPING_RINGER, 1); + createSystemReadyService(); + scale = mExternalVibratorService.onExternalVibrationStart(externalVibration); + assertEquals(IExternalVibratorService.SCALE_NONE, scale); + + setUserSetting(Settings.System.VIBRATE_WHEN_RINGING, 1); + setGlobalSetting(Settings.Global.APPLY_RAMPING_RINGER, 0); + createSystemReadyService(); + scale = mExternalVibratorService.onExternalVibrationStart(externalVibration); + assertEquals(IExternalVibratorService.SCALE_NONE, scale); + } + private VibrationEffectSegment expectedPrebaked(int effectId) { return new PrebakedSegment(effectId, false, VibrationEffect.EFFECT_STRENGTH_MEDIUM); }