package com.geek_alarm.android; import android.content.Context; import android.media.AudioManager; import android.media.MediaPlayer; import android.media.RingtoneManager; import android.net.Uri; import android.util.Log; import java.util.Timer; import java.util.TimerTask; public class Player implements AudioManager.OnAudioFocusChangeListener { private static final String TAG = Player.class.getName(); private MediaPlayer player; private boolean started; private Context context; private long curPlayDelay; private Timer timer; public Player(Context context) { this.context = context; initPlayer(); timer = new Timer(); curPlayDelay = MuteUtils.getInitialMuteTime() * 1000; } private void initPlayer() { Uri music = Utils.getCurrentAlarmSound(); player = new MediaPlayer(); try { player.setDataSource(context, music); player.setAudioStreamType(AudioManager.STREAM_ALARM); player.setLooping(true); player.prepare(); } catch (Exception e) { // Suppose we can't play current music, because it's renamed/removed. // Play standard theme. player.reset(); try { player.setDataSource(context, RingtoneManager.getDefaultUri(RingtoneManager.TYPE_ALARM)); player.setAudioStreamType(AudioManager.STREAM_ALARM); player.setLooping(true); player.prepare(); } catch (Exception e2) { Log.e(this.getClass().getName(), "Now I don't know what to do.", e2); } } } public void mute() { boolean shouldPause = curPlayDelay > 0 || MuteUtils.getMuteTimeStep() > 0; if (player.isPlaying() && shouldPause) { Log.d(TAG, "Pausing player for " + curPlayDelay + "ms"); player.pause(); timer.schedule(new TimerTask() { @Override public void run() { player.start(); } }, curPlayDelay); curPlayDelay += MuteUtils.getMuteTimeStep() * 1000; } } public void start() { if (!started && player != null) { AudioManager audioManager = (AudioManager) context.getSystemService(Context.AUDIO_SERVICE); int result = audioManager.requestAudioFocus(this, AudioManager.STREAM_MUSIC, AudioManager.AUDIOFOCUS_GAIN); if (result == AudioManager.AUDIOFOCUS_REQUEST_GRANTED) { player.start(); started = true; } } } public void destroy() { if (player != null) { if (player.isPlaying()) { player.stop(); } player.release(); AudioManager audioManager = (AudioManager) context.getSystemService(Context.AUDIO_SERVICE); audioManager.abandonAudioFocus(this); player = null; } if (timer != null) { timer.cancel(); } } @Override public void onAudioFocusChange(int focusChange) { switch (focusChange) { case AudioManager.AUDIOFOCUS_GAIN: // resume playback if (player != null) { player.start(); player.setVolume(1.0f, 1.0f); } break; case AudioManager.AUDIOFOCUS_LOSS: // Lost focus for an unbounded amount of time: stop playback and release media player if (player.isPlaying()) { player.stop(); } player.release(); player = null; break; case AudioManager.AUDIOFOCUS_LOSS_TRANSIENT: // Lost focus for a short time, but we have to stop // playback. We don't release the media player because playback // is likely to resume if (player.isPlaying()) { player.pause(); } break; case AudioManager.AUDIOFOCUS_LOSS_TRANSIENT_CAN_DUCK: // Lost focus for a short time, but it's ok to keep playing // at an attenuated level if (player.isPlaying()) { player.setVolume(0.1f, 0.1f); } break; } } }