diff options
author | Malcolm Chen <refuhoo@google.com> | 2017-04-17 11:18:41 -0700 |
---|---|---|
committer | Malcolm Chen <refuhoo@google.com> | 2017-05-16 12:15:15 -0700 |
commit | da146e341516c0a900861e2230caa13e0036db59 (patch) | |
tree | 96585df8cd756775c4ae734064ada55976568a38 | |
parent | 110de3cca0b3ab85615540832bc9ce70a53ee4ca (diff) | |
download | CellBroadcastReceiver-da146e341516c0a900861e2230caa13e0036db59.tar.gz |
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.
Test: sanity tests
Bug: 35743532
Merged-In: I12f80bf0435a62a307f5438c36ca76b273ec5df1
Change-Id: I12f80bf0435a62a307f5438c36ca76b273ec5df1
-rw-r--r-- | res/values-mcc440/config.xml | 3 | ||||
-rw-r--r-- | res/values/config.xml | 2 | ||||
-rw-r--r-- | res/values/strings.xml | 5 | ||||
-rw-r--r-- | res/xml/preferences.xml | 5 | ||||
-rw-r--r-- | src/com/android/cellbroadcastreceiver/CellBroadcastAlertAudio.java | 93 | ||||
-rw-r--r-- | src/com/android/cellbroadcastreceiver/CellBroadcastSettings.java | 7 |
6 files changed, 101 insertions, 14 deletions
diff --git a/res/values-mcc440/config.xml b/res/values-mcc440/config.xml index ca58e7f53..6a80539bd 100644 --- a/res/values-mcc440/config.xml +++ b/res/values-mcc440/config.xml @@ -18,4 +18,7 @@ <!-- Whether to enable CMAS settings (United States) --> <!-- No need to show this for Japanese users --> <bool name="show_cmas_settings">false</bool> + <!-- Whether to always sound CBS alerts at full volume --> + <!-- By default it's true for Japanese users --> + <bool name="use_full_volume">true</bool> </resources> diff --git a/res/values/config.xml b/res/values/config.xml index 72fad3049..b2f3684ad 100644 --- a/res/values/config.xml +++ b/res/values/config.xml @@ -17,6 +17,8 @@ <resources> <!-- Whether to enable ETWS settings (Japan) --> <bool name="show_etws_settings">false</bool> + <!-- Whether to always sound CBS alerts at full volume --> + <bool name="use_full_volume">false</bool> <!-- Whether to enable CMAS settings (United States) --> <bool name="show_cmas_settings">true</bool> <!-- Whether to enable channel 50 settings (Brazil) --> diff --git a/res/values/strings.xml b/res/values/strings.xml index 2ac524970..1f7ef081b 100644 --- a/res/values/strings.xml +++ b/res/values/strings.xml @@ -131,6 +131,11 @@ <!-- Preference summary for CMAS vibration on/off. [CHAR LIMIT=60] --> <string name="enable_alert_vibrate_summary">Vibrate on alert</string> + <!-- Preference title for use full volume option. [CHAR LIMIT=30] --> + <string name="use_full_volume_title">Use full volume</string> + <!-- Preference summary for use full volume option. [CHAR LIMIT=60] --> + <string name="use_full_volume_summary">Ignore other volume and Do Not Disturb preferences</string> + <!-- Preference category title for Brazil settings. [CHAR LIMIT=50] --> <string name="category_brazil_settings_title">Settings for Brazil</string> <!-- Preference title for enable channel 50 alerts (Brazil only). [CHAR LIMIT=30] --> diff --git a/res/xml/preferences.xml b/res/xml/preferences.xml index 4a49acbd9..da79ca5bf 100644 --- a/res/xml/preferences.xml +++ b/res/xml/preferences.xml @@ -62,6 +62,11 @@ android:summary="@string/enable_alert_speech_summary" android:title="@string/enable_alert_speech_title" /> + <SwitchPreference android:defaultValue="@bool/use_full_volume" + android:key="use_full_volume" + android:summary="@string/use_full_volume_summary" + android:title="@string/use_full_volume_title" /> + </PreferenceCategory> <!-- Emergency alert settings for ETWS. --> diff --git a/src/com/android/cellbroadcastreceiver/CellBroadcastAlertAudio.java b/src/com/android/cellbroadcastreceiver/CellBroadcastAlertAudio.java index a4770820e..8b3a10e18 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 b06189a3e..b8bb84f9c 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); } |