package com.integreight.onesheeld.shields.controller;
import android.Manifest;
import android.app.Activity;
import android.media.MediaPlayer;
import android.net.Uri;
import android.os.Build;
import com.integreight.onesheeld.sdk.ShieldFrame;
import com.integreight.onesheeld.enums.UIShield;
import com.integreight.onesheeld.model.PlaylistItem;
import com.integreight.onesheeld.shields.ControllerParent;
import com.integreight.onesheeld.utils.Log;
import com.integreight.onesheeld.utils.database.MusicPlaylist;
import java.util.ArrayList;
public class MusicShield extends ControllerParent<MusicShield> {
public MediaPlayer mediaPlayer;
public String musicFileName = "";
private ArrayList<PlaylistItem> mediaFiles = new ArrayList<PlaylistItem>();
private int currentIndex = 0;
private MusicEventHandler eventHandler;
public int mediaDuration = 0;
private static class METHOD {
public static byte PLAY = 0x02;
public static byte PAUSE = 0x03;
public static byte STOP = 0x01;
public static byte PREV = 0x04;
public static byte NEXT = 0x05;
public static byte SEEK_FORWARD = 0x06;
public static byte SEEK_BACKWARD = 0x07;
public static byte VOLUME = 0x08;
public static byte SEEK = 0x09;
}
public MusicShield() {
super();
}
public MusicShield(Activity activity, String tag) {
super(activity, tag);
checkMedia();
checkMediaFilesList();
}
@Override
public ControllerParent<MusicShield> init(String tag) {
checkMedia();
checkMediaFilesList();
return super.init(tag);
}
public void setEventHandler(MusicEventHandler eventHandler) {
this.eventHandler = eventHandler;
}
@Override
public ControllerParent<MusicShield> invalidate(SelectionAction selectionAction, boolean isToastable) {
this.selectionAction = selectionAction;
if(Build.VERSION.SDK_INT >=16)
addRequiredPremission(Manifest.permission.READ_EXTERNAL_STORAGE);
if (checkForPermissions())
selectionAction.onSuccess();
else
selectionAction.onFailure();
return super.invalidate(selectionAction, isToastable);
}
private void init() {
try {
if (currentIndex < mediaFiles.size() && currentIndex >= 0) {
if (mediaPlayer.isPlaying()) {
mediaPlayer.stop();
mediaPlayer.release();
}
mediaPlayer = MediaPlayer.create(activity,
Uri.parse(mediaFiles.get(currentIndex).path));
mediaPlayer
.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
@Override
public void onPrepared(MediaPlayer mp) {
mediaDuration = mediaPlayer.getDuration();
}
});
} else {
if (mediaFiles.size() != 0) {
if (currentIndex > mediaFiles.size()) {
currentIndex = 0;
} else {
currentIndex = mediaFiles.size() - 1;
}
init();
}
}
musicFileName = mediaFiles.get(currentIndex).name;
} catch (Exception e) {
// TODO Auto-generated catch block
Log.e("TAG", "Music::init()", e);
try {
MusicPlaylist db = new MusicPlaylist(activity);
db.openToWrite();
db.delete(mediaFiles.get(currentIndex).id);
mediaFiles = db.getPlaylist();
db.close();
} catch (Exception e1) {
}
}
}
public synchronized void seekTo(int pos) {
if (mediaPlayer != null) {
boolean playAfter = mediaPlayer.isPlaying();
mediaPlayer.seekTo(pos);
if (playAfter)
mediaPlayer.start();
}
}
public synchronized void next() {
currentIndex += 1;
init();
play();
}
public synchronized void prev() {
currentIndex -= 1;
init();
play();
}
public synchronized void play() {
checkMedia();
checkMediaFilesList();
if (!mediaPlayer.isPlaying())
mediaPlayer.start();
}
public synchronized void pause() {
checkMedia();
checkMediaFilesList();
if (mediaPlayer.isPlaying())
mediaPlayer.pause();
}
public synchronized void stop() {
if (mediaPlayer != null && mediaPlayer.isPlaying()) {
init();
}
}
private void checkMedia() {
if (mediaPlayer == null) {
mediaPlayer = new MediaPlayer();
}
}
private void checkMediaFilesList() {
if (mediaFiles == null
|| (mediaFiles != null && mediaFiles.size() == 0)) {
MusicPlaylist db = new MusicPlaylist(activity);
db.openToWrite();
mediaFiles = db.getPlaylist();
db.close();
init();
}
}
@Override
public void onNewShieldFrameReceived(ShieldFrame frame) {
if (frame.getShieldId() == UIShield.MUSICPLAYER_SHIELD.getId()) {
if (frame.getFunctionId() == METHOD.STOP) {
stop();
} else if (frame.getFunctionId() == METHOD.PLAY) {
play();
if (eventHandler != null) {
eventHandler.play();
eventHandler.setMusicName(musicFileName);
}
} else if (frame.getFunctionId() == METHOD.PAUSE) {
pause();
if (eventHandler != null) {
eventHandler.pause();
eventHandler.setMusicName(musicFileName);
}
} else if (frame.getFunctionId() == METHOD.NEXT) {
next();
if (eventHandler != null) {
eventHandler.play();
eventHandler.setMusicName(musicFileName);
eventHandler.seekTo(0);
}
} else if (frame.getFunctionId() == METHOD.PREV) {
prev();
if (eventHandler != null) {
eventHandler.play();
eventHandler.setMusicName(musicFileName);
eventHandler.seekTo(0);
}
} else if (frame.getFunctionId() == METHOD.SEEK_FORWARD) {
if (mediaPlayer != null) {
int pos = (int) (((int) frame.getArgument(0)[0])
* mediaDuration / 100);
seekTo(pos + mediaPlayer.getCurrentPosition());
if (eventHandler != null) {
eventHandler.play();
eventHandler.setMusicName(musicFileName);
eventHandler.seekTo(mediaPlayer.getCurrentPosition());
}
}
} else if (frame.getFunctionId() == METHOD.SEEK_BACKWARD) {
if (mediaPlayer != null) {
int pos = (int) (((int) frame.getArgument(0)[0])
* mediaDuration / 100);
seekTo(mediaPlayer.getCurrentPosition() - pos);
if (eventHandler != null) {
eventHandler.play();
eventHandler.setMusicName(musicFileName);
eventHandler.seekTo(mediaPlayer.getCurrentPosition());
}
}
} else if (frame.getFunctionId() == METHOD.VOLUME) {
if (mediaPlayer != null) {
int pos = ((int) frame.getArgument(0)[0]);
final float volume = (float) (1 - (Math.log(10 - pos) / Math
.log(10)));
mediaPlayer.setVolume(volume, volume);
}
} else if (frame.getFunctionId() == METHOD.SEEK) {
if (mediaPlayer != null) {
int pos = ((int) frame.getArgument(0)[0]);
seekTo(pos);
if (eventHandler != null) {
eventHandler.play();
eventHandler.setMusicName(musicFileName);
eventHandler.seekTo(mediaPlayer.getCurrentPosition());
}
}
}
}
}
public interface MusicEventHandler {
public void play();
public void pause();
public void seekTo(int pos);
public void setMusicName(String name);
}
@Override
public void reset() {
if (mediaPlayer != null)
if (mediaPlayer.isPlaying()) {
mediaPlayer.stop();
mediaPlayer.release();
} else
mediaPlayer.release();
if (mediaFiles != null)
mediaFiles.clear();
mediaFiles = null;
mediaPlayer = null;
}
}