summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMalcolm Chen <refuhoo@google.com>2017-04-17 11:18:41 -0700
committerMalcolm Chen <refuhoo@google.com>2017-05-16 12:15:15 -0700
commitda146e341516c0a900861e2230caa13e0036db59 (patch)
tree96585df8cd756775c4ae734064ada55976568a38
parent110de3cca0b3ab85615540832bc9ce70a53ee4ca (diff)
downloadCellBroadcastReceiver-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.xml3
-rw-r--r--res/values/config.xml2
-rw-r--r--res/values/strings.xml5
-rw-r--r--res/xml/preferences.xml5
-rw-r--r--src/com/android/cellbroadcastreceiver/CellBroadcastAlertAudio.java93
-rw-r--r--src/com/android/cellbroadcastreceiver/CellBroadcastSettings.java7
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);
}