diff --git a/core/res/res/values/config.xml b/core/res/res/values/config.xml
index ab53b4c2b3e28..28f18a4124ded 100644
--- a/core/res/res/values/config.xml
+++ b/core/res/res/values/config.xml
@@ -3971,6 +3971,9 @@
/product/media/audio/ui/InCallNotification.ogg
+
+ /product/media/audio/ui/AttentionalHaptics.ogg
+
4
diff --git a/core/res/res/values/public.xml b/core/res/res/values/public.xml
index 552898bff1ed8..ef5cfe33c6615 100644
--- a/core/res/res/values/public.xml
+++ b/core/res/res/values/public.xml
@@ -3236,6 +3236,8 @@
+
+
diff --git a/media/java/android/media/Ringtone.java b/media/java/android/media/Ringtone.java
index 79d505ebbde88..f8297bc93b727 100644
--- a/media/java/android/media/Ringtone.java
+++ b/media/java/android/media/Ringtone.java
@@ -405,9 +405,11 @@ public class Ringtone {
*/
public void play() {
if (mLocalPlayer != null) {
- // do not play ringtones if stream volume is 0
- // (typically because ringer mode is silent).
- if (mAudioManager.getStreamVolume(
+ // Play ringtones if stream volume is over 0 or if it is a haptic-only ringtone
+ // (typically because ringer mode is vibrate).
+ boolean isHapticOnly = AudioManager.hasHapticChannels(mUri)
+ && !mAudioAttributes.areHapticChannelsMuted() && mVolume == 0;
+ if (isHapticOnly || mAudioManager.getStreamVolume(
AudioAttributes.toLegacyStreamType(mAudioAttributes)) != 0) {
startLocalPlayer();
}