From 5d463b6c885965fa47daf6e7897e818ec44edaec Mon Sep 17 00:00:00 2001 From: Beverly Date: Wed, 26 Jul 2017 14:13:40 -0400 Subject: [PATCH] Pleasant sound implemented for in-call notif. Replacing tone generator with an audio file for in-call notifications from text messages. Fixes: 38194285 Test: runtest -x frameworks/base/services/tests/notification/src/com/android/server/notification/BuzzBeepBlinkTest.java Change-Id: I9ec28ff54ae259ae906b3db08ece7059707c7edb --- core/res/res/values/config.xml | 8 ++- core/res/res/values/symbols.xml | 3 +- data/sounds/effects/InCallNotification.ogg | Bin 0 -> 6275 bytes .../sounds/effects/ogg/InCallNotification.ogg | Bin 0 -> 6275 bytes .../NotificationManagerService.java | 64 +++++++----------- .../notification/BuzzBeepBlinkTest.java | 15 ++++ 6 files changed, 47 insertions(+), 43 deletions(-) create mode 100644 data/sounds/effects/InCallNotification.ogg create mode 100644 data/sounds/effects/ogg/InCallNotification.ogg diff --git a/core/res/res/values/config.xml b/core/res/res/values/config.xml index 066c0512d0a19..95aa264639ac2 100644 --- a/core/res/res/values/config.xml +++ b/core/res/res/values/config.xml @@ -2994,9 +2994,11 @@ false - - 67 + + .25 + + + /system/media/audio/ui/InCallNotification.ogg -1 diff --git a/core/res/res/values/symbols.xml b/core/res/res/values/symbols.xml index e67884d8e7804..061413c603677 100644 --- a/core/res/res/values/symbols.xml +++ b/core/res/res/values/symbols.xml @@ -3039,7 +3039,8 @@ - + + diff --git a/data/sounds/effects/InCallNotification.ogg b/data/sounds/effects/InCallNotification.ogg new file mode 100644 index 0000000000000000000000000000000000000000..4481ccb25614687c02f091e80722c363dcb61a4d GIT binary patch literal 6275 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 F{1fZAQ|bT! literal 0 HcmV?d00001 diff --git a/data/sounds/effects/ogg/InCallNotification.ogg b/data/sounds/effects/ogg/InCallNotification.ogg new file mode 100644 index 0000000000000000000000000000000000000000..4481ccb25614687c02f091e80722c363dcb61a4d GIT binary patch literal 6275 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 F{1fZAQ|bT! literal 0 HcmV?d00001 diff --git a/services/core/java/com/android/server/notification/NotificationManagerService.java b/services/core/java/com/android/server/notification/NotificationManagerService.java index 704978b9616f8..719c365510776 100644 --- a/services/core/java/com/android/server/notification/NotificationManagerService.java +++ b/services/core/java/com/android/server/notification/NotificationManagerService.java @@ -93,10 +93,10 @@ import android.content.pm.PackageManager.NameNotFoundException; import android.content.pm.ParceledListSlice; import android.content.res.Resources; import android.database.ContentObserver; +import android.media.AudioAttributes; import android.media.AudioManager; import android.media.AudioManagerInternal; import android.media.IRingtonePlayer; -import android.media.ToneGenerator; import android.net.Uri; import android.os.Binder; import android.os.Build; @@ -194,6 +194,7 @@ import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.io.PrintWriter; +import java.net.URI; import java.nio.charset.StandardCharsets; import java.util.ArrayDeque; import java.util.ArrayList; @@ -304,12 +305,12 @@ public class NotificationManagerService extends SystemService { // for enabling and disabling notification pulse behavior private boolean mScreenOn = true; - private boolean mInCall = false; + protected boolean mInCall = false; private boolean mNotificationPulseEnabled; - // for generating notification tones in-call - private ToneGenerator mInCallToneGenerator; - private final Object mInCallToneGeneratorLock = new Object(); + private Uri mInCallNotificationUri; + private AudioAttributes mInCallNotificationAudioAttributes; + private float mInCallNotificationVolume; // used as a mutex for access to all active notifications & listeners final Object mNotificationLock = new Object(); @@ -947,30 +948,6 @@ public class NotificationManagerService extends SystemService { mInCall = TelephonyManager.EXTRA_STATE_OFFHOOK .equals(intent.getStringExtra(TelephonyManager.EXTRA_STATE)); updateNotificationPulse(); - synchronized (mInCallToneGeneratorLock) { - if (mInCall) { - if (mInCallToneGenerator == null) { - int relativeToneVolume = getContext().getResources().getInteger( - R.integer.config_inCallNotificationVolumeRelative); - if (relativeToneVolume < ToneGenerator.MIN_VOLUME - || relativeToneVolume > ToneGenerator.MAX_VOLUME) { - relativeToneVolume = ToneGenerator.MAX_VOLUME; - } - try { - mInCallToneGenerator = new ToneGenerator( - AudioManager.STREAM_VOICE_CALL, relativeToneVolume); - } catch (RuntimeException e) { - Log.e(TAG, "Error creating local tone generator: " + e); - mInCallToneGenerator = null; - } - } - } else { - if (mInCallToneGenerator != null) { - mInCallToneGenerator.release(); - mInCallToneGenerator = null; - } - } - } } else if (action.equals(Intent.ACTION_USER_STOPPED)) { int userHandle = intent.getIntExtra(Intent.EXTRA_USER_HANDLE, -1); if (userHandle >= 0) { @@ -1277,6 +1254,15 @@ public class NotificationManagerService extends SystemService { VIBRATE_PATTERN_MAXLEN, DEFAULT_VIBRATE_PATTERN); + mInCallNotificationUri = Uri.parse("file://" + + resources.getString(R.string.config_inCallNotificationSound)); + mInCallNotificationAudioAttributes = new AudioAttributes.Builder() + .setContentType(AudioAttributes.CONTENT_TYPE_SONIFICATION) + .setUsage(AudioAttributes.USAGE_VOICE_COMMUNICATION) + .setFlags(AudioAttributes.FLAG_AUDIBILITY_ENFORCED) + .build(); + mInCallNotificationVolume = resources.getFloat(R.dimen.config_inCallNotificationVolume); + mUseAttentionLight = resources.getBoolean(R.bool.config_useAttentionLight); // Don't start allowing notifications until the setup wizard has run once. @@ -4152,21 +4138,21 @@ public class NotificationManagerService extends SystemService { mUserProfiles.isCurrentProfile(record.getUserId())); } - private void playInCallNotification() { + protected void playInCallNotification() { new Thread() { @Override public void run() { - // If toneGenerator creation fails, just continue the call - // without playing the notification sound. + final long identity = Binder.clearCallingIdentity(); try { - synchronized (mInCallToneGeneratorLock) { - if (mInCallToneGenerator != null) { - // limit this tone to 1 second; BEEP2 should in fact be much shorter - mInCallToneGenerator.startTone(ToneGenerator.TONE_PROP_BEEP2, 1000); - } + final IRingtonePlayer player = mAudioManager.getRingtonePlayer(); + if (player != null) { + player.play(new Binder(), mInCallNotificationUri, + mInCallNotificationAudioAttributes, + mInCallNotificationVolume, false); } - } catch (RuntimeException e) { - Log.w(TAG, "Exception from ToneGenerator: " + e); + } catch (RemoteException e) { + } finally { + Binder.restoreCallingIdentity(identity); } } }.start(); diff --git a/services/tests/notification/src/com/android/server/notification/BuzzBeepBlinkTest.java b/services/tests/notification/src/com/android/server/notification/BuzzBeepBlinkTest.java index 835603a9228ba..529ac3a192ae9 100644 --- a/services/tests/notification/src/com/android/server/notification/BuzzBeepBlinkTest.java +++ b/services/tests/notification/src/com/android/server/notification/BuzzBeepBlinkTest.java @@ -536,6 +536,21 @@ public class BuzzBeepBlinkTest extends NotificationTestCase { verifyStopAudio(); } + @Test + public void testInCallNotification() throws Exception { + NotificationRecord r = getBeepyNotification(); + + // set up internal state + mService.buzzBeepBlinkLocked(r); + Mockito.reset(mRingtonePlayer); + + mService.mInCall = true; + mService.buzzBeepBlinkLocked(r); + + //verify(mService, times(1)).playInCallNotification(); + verifyNeverBeep(); // doesn't play normal beep + } + @Test public void testNoDemoteSoundToVibrateIfVibrateGiven() throws Exception { NotificationRecord r = getBuzzyBeepyNotification();