diff options
author | Malcolm Chen <refuhoo@google.com> | 2017-04-17 11:18:41 -0700 |
---|---|---|
committer | Malcolm Chen <refuhoo@google.com> | 2017-05-03 11:30:41 -0700 |
commit | d29e55cc7ca77715b5c6a5ed069db047be058901 (patch) | |
tree | 3c68f3792e0af239b2107abc1a1d51231237892a /src | |
parent | b884e6825d894827b86d856f2d2a017b8d07da45 (diff) | |
download | android_packages_apps_CellBroadcastReceiver-d29e55cc7ca77715b5c6a5ed069db047be058901.tar.gz android_packages_apps_CellBroadcastReceiver-d29e55cc7ca77715b5c6a5ed069db047be058901.tar.bz2 android_packages_apps_CellBroadcastReceiver-d29e55cc7ca77715b5c6a5ed069db047be058901.zip |
Force CBS alerts volume to full in Japan.
Add a config which, if set to true, will always enable
audio of CBS alerts and play them at max volume. This
config is false by default except in Japan.
Bug: 35743532
Test: Manual test
Change-Id: I12f80bf0435a62a307f5438c36ca76b273ec5df1
Diffstat (limited to 'src')
-rw-r--r-- | src/com/android/cellbroadcastreceiver/CellBroadcastAlertAudio.java | 93 | ||||
-rw-r--r-- | src/com/android/cellbroadcastreceiver/CellBroadcastSettings.java | 7 |
2 files changed, 86 insertions, 14 deletions
diff --git a/src/com/android/cellbroadcastreceiver/CellBroadcastAlertAudio.java b/src/com/android/cellbroadcastreceiver/CellBroadcastAlertAudio.java index a4770820..8b3a10e1 100644 --- a/src/com/android/cellbroadcastreceiver/CellBroadcastAlertAudio.java +++ b/src/com/android/cellbroadcastreceiver/CellBroadcastAlertAudio.java @@ -25,6 +25,7 @@ import android.content.Context; import android.content.Intent; import android.content.res.AssetFileDescriptor; import android.content.res.Resources; +import android.media.AudioAttributes; import android.media.AudioManager; import android.media.MediaPlayer; import android.media.MediaPlayer.OnCompletionListener; @@ -34,6 +35,7 @@ import android.os.Handler; import android.os.IBinder; import android.os.Message; import android.os.Vibrator; +import android.preference.PreferenceManager; import android.speech.tts.TextToSpeech; import android.telephony.PhoneStateListener; import android.telephony.TelephonyManager; @@ -99,6 +101,9 @@ public class CellBroadcastAlertAudio extends Service implements TextToSpeech.OnI private boolean mTtsLanguageSupported; private boolean mEnableVibrate; private boolean mEnableAudio; + private boolean mUseFullVolume; + private boolean mResetAlarmVolumeNeeded; + private int mUserSetAlarmVolume; private Vibrator mVibrator; private MediaPlayer mMediaPlayer; @@ -301,9 +306,12 @@ public class CellBroadcastAlertAudio extends Service implements TextToSpeech.OnI mMessagePreferredLanguage = intent.getStringExtra(ALERT_AUDIO_MESSAGE_PREFERRED_LANGUAGE); mMessageDefaultLanguage = intent.getStringExtra(ALERT_AUDIO_MESSAGE_DEFAULT_LANGUAGE); + // Get config of whether to always sound CBS alerts at full volume. + mUseFullVolume = PreferenceManager.getDefaultSharedPreferences(this) + .getBoolean(CellBroadcastSettings.KEY_USE_FULL_VOLUME, false); + // retrieve the vibrate settings from cellbroadcast receiver settings. mEnableVibrate = intent.getBooleanExtra(ALERT_AUDIO_VIBRATE_EXTRA, true); - switch (mAudioManager.getRingerMode()) { case AudioManager.RINGER_MODE_SILENT: if (DBG) log("Ringer mode: silent"); @@ -324,6 +332,10 @@ public class CellBroadcastAlertAudio extends Service implements TextToSpeech.OnI break; } + if (mUseFullVolume) { + mEnableAudio = true; + } + if (mMessageBody != null && mEnableAudio) { if (mTts == null) { mTts = new TextToSpeech(this, this); @@ -388,9 +400,7 @@ public class CellBroadcastAlertAudio extends Service implements TextToSpeech.OnI mMediaPlayer.setOnErrorListener(new OnErrorListener() { public boolean onError(MediaPlayer mp, int what, int extra) { loge("Error occurred while playing audio."); - mp.stop(); - mp.release(); - mMediaPlayer = null; + mHandler.sendMessage(mHandler.obtainMessage(ALERT_SOUND_FINISHED)); return true; } }); @@ -404,14 +414,6 @@ public class CellBroadcastAlertAudio extends Service implements TextToSpeech.OnI }); try { - // Check if we are in a call. If we are, play the alert - // sound at a low volume to not disrupt the call. - if (mTelephonyManager.getCallState() - != TelephonyManager.CALL_STATE_IDLE) { - log("in call: reducing volume"); - mMediaPlayer.setVolume(IN_CALL_VOLUME, IN_CALL_VOLUME); - } - log("Locale=" + getResources().getConfiguration().getLocales()); // Load the tones based on type @@ -439,10 +441,12 @@ public class CellBroadcastAlertAudio extends Service implements TextToSpeech.OnI } // start playing alert audio (unless master volume is vibrate only or silent). - mAudioManager.requestAudioFocus(null, AudioManager.STREAM_NOTIFICATION, + mAudioManager.requestAudioFocus(null, AudioManager.STREAM_ALARM, AudioManager.AUDIOFOCUS_GAIN_TRANSIENT); - mMediaPlayer.setAudioStreamType(AudioManager.STREAM_NOTIFICATION); + setAlertAudioAttributes(); + setAlertVolume(); + mMediaPlayer.setLooping(false); mMediaPlayer.prepare(); mMediaPlayer.start(); @@ -489,6 +493,8 @@ public class CellBroadcastAlertAudio extends Service implements TextToSpeech.OnI mHandler.removeMessages(ALERT_SOUND_FINISHED); mHandler.removeMessages(ALERT_PAUSE_FINISHED); + resetAlarmStreamVolume(); + if (mState == STATE_ALERTING) { // Stop audio playing if (mMediaPlayer != null) { @@ -515,6 +521,65 @@ public class CellBroadcastAlertAudio extends Service implements TextToSpeech.OnI mState = STATE_IDLE; } + /** + * Set AudioAttributes for mMediaPlayer. Replacement of deprecated + * mMediaPlayer.setAudioStreamType. + */ + private void setAlertAudioAttributes() { + AudioAttributes.Builder builder = new AudioAttributes.Builder(); + + builder.setContentType(AudioAttributes.CONTENT_TYPE_SONIFICATION); + builder.setUsage(AudioAttributes.USAGE_ALARM); + if (mUseFullVolume) { + // Set FLAG_BYPASS_INTERRUPTION_POLICY so that it still enables + // audio in DnD mode (except total silence DnD mode). + builder.setFlags(AudioAttributes.FLAG_BYPASS_INTERRUPTION_POLICY); + } + + mMediaPlayer.setAudioAttributes(builder.build()); + } + + /** + * Set volume for alerts. + */ + private void setAlertVolume() { + if (mTelephonyManager.getCallState() + != TelephonyManager.CALL_STATE_IDLE) { + // If we are in a call, play the alert + // sound at a low volume to not disrupt the call. + log("in call: reducing volume"); + mMediaPlayer.setVolume(IN_CALL_VOLUME); + } else if (mUseFullVolume) { + // If use_full_volume is configured, + // we overwrite volume setting of STREAM_ALARM to full, play at + // max possible volume, and reset it after it's finished. + setAlarmStreamVolumeToFull(); + } + } + + /** + * Set volume of STREAM_ALARM to full. + */ + private void setAlarmStreamVolumeToFull() { + log("setting alarm volume to full for cell broadcast alerts."); + mUserSetAlarmVolume = mAudioManager.getStreamVolume(AudioManager.STREAM_ALARM); + mResetAlarmVolumeNeeded = true; + mAudioManager.setStreamVolume(AudioManager.STREAM_ALARM, + mAudioManager.getStreamMaxVolume(AudioManager.STREAM_ALARM), + 0); + } + + /** + * Reset volume of STREAM_ALARM, if needed. + */ + private void resetAlarmStreamVolume() { + if (mResetAlarmVolumeNeeded) { + log("resetting alarm volume to back to " + mUserSetAlarmVolume); + mAudioManager.setStreamVolume(AudioManager.STREAM_ALARM, mUserSetAlarmVolume, 0); + mResetAlarmVolumeNeeded = false; + } + } + private static void log(String msg) { Log.d(TAG, msg); } diff --git a/src/com/android/cellbroadcastreceiver/CellBroadcastSettings.java b/src/com/android/cellbroadcastreceiver/CellBroadcastSettings.java index b06189a3..b8bb84f9 100644 --- a/src/com/android/cellbroadcastreceiver/CellBroadcastSettings.java +++ b/src/com/android/cellbroadcastreceiver/CellBroadcastSettings.java @@ -53,6 +53,9 @@ public class CellBroadcastSettings extends PreferenceActivity { // Speak contents of alert after playing the alert sound. public static final String KEY_ENABLE_ALERT_SPEECH = "enable_alert_speech"; + // Always play at full volume when playing the alert sound. + public static final String KEY_USE_FULL_VOLUME = "use_full_volume"; + // Preference category for emergency alert and CMAS settings. public static final String KEY_CATEGORY_ALERT_SETTINGS = "category_alert_settings"; @@ -121,6 +124,7 @@ public class CellBroadcastSettings extends PreferenceActivity { private TwoStatePreference mEmergencyCheckBox; private ListPreference mReminderInterval; private TwoStatePreference mSpeechCheckBox; + private TwoStatePreference mFullVolumeCheckBox; private TwoStatePreference mEtwsTestCheckBox; private TwoStatePreference mChannel50CheckBox; private TwoStatePreference mCmasTestCheckBox; @@ -149,6 +153,8 @@ public class CellBroadcastSettings extends PreferenceActivity { findPreference(KEY_ALERT_REMINDER_INTERVAL); mSpeechCheckBox = (TwoStatePreference) findPreference(KEY_ENABLE_ALERT_SPEECH); + mFullVolumeCheckBox = (TwoStatePreference) + findPreference(KEY_USE_FULL_VOLUME); mEtwsTestCheckBox = (TwoStatePreference) findPreference(KEY_ENABLE_ETWS_TEST_ALERTS); mChannel50CheckBox = (TwoStatePreference) @@ -227,6 +233,7 @@ public class CellBroadcastSettings extends PreferenceActivity { } } else { mAlertCategory.removePreference(mSpeechCheckBox); + mAlertCategory.removePreference(mFullVolumeCheckBox); // Remove ETWS test preference category. preferenceScreen.removePreference(mETWSSettingCategory); } |