package zenproject.meditation.android.sketch.music; import android.media.MediaPlayer; import com.juankysoriano.rainbow.core.event.RainbowInputController; import com.novoda.notils.logger.simple.Log; import zenproject.meditation.android.ContextRetriever; import zenproject.meditation.android.R; import zenproject.meditation.android.sketch.actions.StepPerformer; public class MusicPerformer implements StepPerformer { private static final MediaPlayer RELEASED_MUSIC_PERFORMER = null; private static final float MUSIC_STEP = 0.005f; private static final float MIN_VOLUME = 0.05f; private MediaPlayer mediaPlayer; private final RainbowInputController rainbowInputController; private float volume = MIN_VOLUME; protected MusicPerformer(MediaPlayer mediaPlayer, RainbowInputController rainbowInputController) { this.mediaPlayer = mediaPlayer; this.rainbowInputController = rainbowInputController; } public static MusicPerformer newInstance(RainbowInputController rainbowInputController) { return new MusicPerformer(RELEASED_MUSIC_PERFORMER, rainbowInputController); } @Override public void init() { if (isMediaPlayerReleased()) { mediaPlayer = MediaPlayer.create(ContextRetriever.INSTANCE.getApplicationContext(), R.raw.zen); mediaPlayer.setVolume(volume, volume); mediaPlayer.setLooping(true); } } @Override public void doStep() { if (rainbowInputController.isScreenTouched()) { increaseVolume(); } else { decreaseVolume(); } } private void increaseVolume() { if (isPlaying()) { volume += MUSIC_STEP; volume = Math.min(1f, Math.max(MIN_VOLUME, volume)); mediaPlayer.setVolume(volume, volume); } } private void decreaseVolume() { if (isPlaying()) { volume -= MUSIC_STEP; volume = Math.max(MIN_VOLUME, volume); mediaPlayer.setVolume(volume, volume); } } @Override public void reset() { volume = MIN_VOLUME; if (isMediaPlayerReleased()) { init(); start(); } } @Override public void disable() { stop(); } @SuppressWarnings("PMD.CompareObjectsWithEquals") private boolean isMediaPlayerReleased() { return mediaPlayer == RELEASED_MUSIC_PERFORMER; } private void stop() { if (isPlaying()) { mediaPlayer.stop(); releaseMediaPlayer(); } } private boolean isPlaying() { if (isMediaPlayerReleased()) { return false; } try { return mediaPlayer.isPlaying(); } catch (IllegalStateException e) { Log.e("Trying to access a mediaPlayer which is released or not initialised!!", e); return false; } } private void releaseMediaPlayer() { if (!isMediaPlayerReleased()) { mediaPlayer.release(); mediaPlayer = RELEASED_MUSIC_PERFORMER; } } @Override public void enable() { reset(); } private void start() { if (!isPlaying()) { mediaPlayer.start(); } } }