blob: 9d877e090ba436953246c9312c469054db05c753 [file] [log] [blame]
/*
* Copyright (C) 2020 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.android.emergency.action.sensoryfeedback;
import android.content.Context;
import android.media.AudioAttributes;
import android.media.AudioManager;
import android.media.MediaPlayer;
import android.provider.Settings;
import android.util.Log;
import com.android.emergency.action.EmergencyActionUtils;
import com.android.emergency.action.R;
public class EmergencyActionAlarmHelper {
private static final String TAG = "AlarmSoundManager";
private static final int USER_SET_ALARM_VOLUME_UNKNOWN = -1;
private final Context mContext;
private MediaPlayer mMediaPlayer;
private AudioManager mAudioManager;
private int mUserSetAlarmVolume;
private boolean mResetAlarmVolumeNeeded;
public EmergencyActionAlarmHelper(Context context) {
this(context, USER_SET_ALARM_VOLUME_UNKNOWN);
}
public int getUserSetAlarmVolume() {
return mUserSetAlarmVolume;
}
public EmergencyActionAlarmHelper(Context context, int userSetAlarmVolume) {
mContext = context;
mAudioManager = context.getSystemService(AudioManager.class);
mUserSetAlarmVolume = userSetAlarmVolume;
}
public void playWarningSound() {
if (!isPlayWarningSoundEnabled()) {
return;
}
if (mMediaPlayer == null) {
mMediaPlayer = MediaPlayer.create(
mContext,
R.raw.alarm,
new AudioAttributes.Builder()
.setUsage(AudioAttributes.USAGE_ALARM)
.setContentType(AudioAttributes.CONTENT_TYPE_SONIFICATION)
.build(),
/* audioSessionId= */ 0);
}
mMediaPlayer.setOnCompletionListener(mp -> mp.release());
mMediaPlayer.setOnErrorListener(
(MediaPlayer mp, int what, int extra) -> {
Log.w(TAG, "MediaPlayer playback failed with error code: " + what
+ ", and extra code: " + extra);
mp.release();
return false;
});
setAlarmVolumeToFull();
mMediaPlayer.start();
}
public void stopWarningSound() {
if (mMediaPlayer != null) {
try {
mMediaPlayer.stop();
mMediaPlayer.release();
} catch (IllegalStateException e) {
Log.w(TAG, "Exception when trying to stop media player");
}
mMediaPlayer = null;
}
resetAlarmVolume();
}
private void setAlarmVolumeToFull() {
int streamType = AudioManager.STREAM_ALARM;
if (mUserSetAlarmVolume == USER_SET_ALARM_VOLUME_UNKNOWN) {
mUserSetAlarmVolume = mAudioManager.getStreamVolume(streamType);
}
mResetAlarmVolumeNeeded = true;
Log.d(TAG, "Setting alarm volume from " + mUserSetAlarmVolume + "to full");
mAudioManager.setStreamVolume(streamType,
mAudioManager.getStreamMaxVolume(streamType), 0);
}
private void resetAlarmVolume() {
if (mResetAlarmVolumeNeeded) {
Log.d(TAG, "Resetting alarm volume to back to " + mUserSetAlarmVolume);
mAudioManager.setStreamVolume(AudioManager.STREAM_ALARM, mUserSetAlarmVolume, 0);
mResetAlarmVolumeNeeded = false;
}
}
private boolean isPlayWarningSoundEnabled() {
return Settings.Secure.getInt(mContext.getContentResolver(),
Settings.Secure.EMERGENCY_GESTURE_SOUND_ENABLED,
EmergencyActionUtils.isDefaultEmergencyGestureSoundEnabled(mContext) ? 1 : 0) != 0;
}
}