package com.solderbyte.openfit;
import com.solderbyte.openfit.util.OpenFitIntent;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.media.AudioManager;
import android.os.Build;
import android.util.Log;
import android.view.KeyEvent;
import java.util.Calendar;
public class MediaController {
private static final String LOG_TAG = "OpenFit:MediaController";
public static String CURRENT_TRACK = "Open Fit Track";
public static byte CURRENT_VOLUME = 15;
public static int MAX_VOLUME = 0;
public static int ACT_VOLUME = 0;
public static int CURRENT_PLAYER = 0; // 0 = stock, 1 = spotify
public static int CURRENT_METHOD = 0; // 0 = music service command, 1 = keycode
public static AudioManager audioManager = null;
public static Context context = null;
public static void init(Context cntxt) {
Log.d(LOG_TAG, "Initializing MediaController");
context = cntxt;
audioManager = (AudioManager) context.getSystemService(Context.AUDIO_SERVICE);
MAX_VOLUME = audioManager.getStreamMaxVolume(AudioManager.STREAM_MUSIC);
ACT_VOLUME = audioManager.getStreamVolume(AudioManager.STREAM_MUSIC);
CURRENT_VOLUME = (byte) ACT_VOLUME;
// google play music
// context.registerReceiver(playMusicReceiver, new IntentFilter("com.google.android.music.metachanged"));
// stock android music
IntentFilter stock = new IntentFilter("com.android.music.metachanged");
stock.addAction("com.android.music.queuechanged");
//stock.addAction("com.android.music.playstatechanged");
context.registerReceiver(stockMusicReceiver, stock);
// samsung music player
context.registerReceiver(samsungMusicReceiver, new IntentFilter("com.sec.android.app.music.metachanged"));
// spotify
IntentFilter spotify = new IntentFilter("com.spotify.music.playbackstatechanged");
spotify.addAction("com.spotify.music.metadatachanged");
spotify.addAction("com.spotify.music.queuechanged");
context.registerReceiver(spotifyReceiver, spotify);
// pandora
context.registerReceiver(pandoraReceiver, new IntentFilter("com.pandora.android.widget.RemoteBroadcastsReceiver"));
context.registerReceiver(mediacontrollerReceiver, new IntentFilter(OpenFitIntent.INTENT_MEDIACONTROLLER_METHOD));
context.registerReceiver(serviceStopReceiver, new IntentFilter(OpenFitIntent.INTENT_SERVICE_STOP));
}
private static BroadcastReceiver playMusicReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
Log.d(LOG_TAG, "playMusicReceiver");
CURRENT_PLAYER = 0;
processIntent(intent);
}
};
private static BroadcastReceiver stockMusicReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
Log.d(LOG_TAG, "stockMusicReceiver");
CURRENT_PLAYER = 0;
processIntent(intent);
}
};
private static BroadcastReceiver samsungMusicReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
Log.d(LOG_TAG, "samsungMusicReceiver");
CURRENT_PLAYER = 0;
processIntent(intent);
}
};
private static BroadcastReceiver spotifyReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
Log.d(LOG_TAG, "spotifyReceiver");
CURRENT_PLAYER = 1;
processIntent(intent);
}
};
private static BroadcastReceiver pandoraReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
Log.d(LOG_TAG, "pandoraReceiver");
CURRENT_PLAYER = 2;
processIntent(intent);
}
};
private static BroadcastReceiver mediacontrollerReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
Log.d(LOG_TAG, "mediacontrollerReceiver");
String msg = intent.getStringExtra(OpenFitIntent.INTENT_EXTRA_MSG);
if(msg.equals("true")) {
CURRENT_METHOD = 1;
Log.d(LOG_TAG, "keycode");
}
else {
CURRENT_METHOD = 0;
}
}
};
private static BroadcastReceiver serviceStopReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
//context.unregisterReceiver(playMusicReceiver);
context.unregisterReceiver(stockMusicReceiver);
context.unregisterReceiver(samsungMusicReceiver);
context.unregisterReceiver(spotifyReceiver);
context.unregisterReceiver(pandoraReceiver);
context.unregisterReceiver(mediacontrollerReceiver);
context.unregisterReceiver(serviceStopReceiver);
}
};
public static void processIntent(Intent intent) {
String action = intent.getAction();
Log.d(LOG_TAG, "action " + action);
String artist = getArtist(intent);
String track = getTrack(intent);
String mediaTrack = artist + " - " + track;
Log.d(LOG_TAG, mediaTrack);
setTrack(mediaTrack);
Intent msg = new Intent(OpenFitIntent.INTENT_SERVICE_MEDIA);
msg.putExtra("artist", artist);
msg.putExtra("track", track);
msg.putExtra("mediaTrack", mediaTrack);
context.sendBroadcast(msg);
}
public static void setTrack(String track) {
CURRENT_TRACK = track;
}
public static String getTrack() {
return CURRENT_TRACK;
}
public static void setVolume(byte vol) {
if(audioManager != null) {
if(CURRENT_VOLUME != vol) {
audioManager.setStreamVolume(AudioManager.STREAM_MUSIC, vol, AudioManager.FLAG_PLAY_SOUND);
}
/*if(CURRENT_VOLUME < vol) {
audioManager.adjustStreamVolume(AudioManager.STREAM_MUSIC, AudioManager.ADJUST_RAISE, AudioManager.FLAG_PLAY_SOUND);
}
else if(CURRENT_VOLUME > vol){
audioManager.adjustStreamVolume(AudioManager.STREAM_MUSIC, AudioManager.ADJUST_LOWER, AudioManager.FLAG_PLAY_SOUND);
}*/
}
CURRENT_VOLUME = vol;
}
public static byte getVolume() {
return CURRENT_VOLUME;
}
public static byte getActualVolume() {
ACT_VOLUME = audioManager.getStreamVolume(AudioManager.STREAM_MUSIC);
return (byte) ACT_VOLUME;
}
public static String getArtist(Intent intent) {
String artist = "Unsupported Player Artist";
try {
if(intent.hasExtra("artist")) {
artist = intent.getStringExtra("artist");
if(artist == null) {
artist = "OpenFit Artist";
}
}
}
catch(RuntimeException e) {
Log.e(LOG_TAG, "Could not get artist: " + e);
}
return artist;
}
public static String getAlbum(Intent intent) {
String album = "Unsupported Player Album";
try {
if(intent.hasExtra("album")) {
album = intent.getStringExtra("album");
if(album == null) {
album = "OpenFit Album";
}
}
}
catch(RuntimeException e) {
Log.e(LOG_TAG, "Could not get album: " + e);
}
return album;
}
public static String getTrack(Intent intent) {
String track = "Unsupported Player Track";
try {
if(intent.hasExtra("track")) {
track = intent.getStringExtra("track");
if(track == null) {
track = "OpenFit Track";
}
}
}
catch (RuntimeException e) {
Log.e(LOG_TAG, "Could not get track: " + e);
}
return track;
}
public static Intent prevTrack() {
Intent i = null;
if(CURRENT_METHOD == 0) {
if(CURRENT_PLAYER == 0) {
i = new Intent("com.android.music.musicservicecommand");
i.putExtra("command", "previous");
}
else if(CURRENT_PLAYER == 1) {
i = new Intent("com.spotify.mobile.android.ui.widget.PREVIOUS");
}
}
else {
i = new Intent();
sendKeycode(KeyEvent.KEYCODE_MEDIA_PREVIOUS);
}
return i;
}
public static Intent nextTrack() {
Intent i = null;
if(CURRENT_METHOD == 0) {
if(CURRENT_PLAYER == 0) {
i = new Intent("com.android.music.musicservicecommand");
i.putExtra("command", "next");
}
else if(CURRENT_PLAYER == 1) {
i = new Intent("com.spotify.mobile.android.ui.widget.NEXT");
}
}
else {
i = new Intent();
sendKeycode(KeyEvent.KEYCODE_MEDIA_NEXT);
}
return i;
}
public static Intent playTrack() {
Intent i = null;
if(CURRENT_METHOD == 0) {
if(CURRENT_PLAYER == 0) {
i = new Intent("com.android.music.musicservicecommand");
i.putExtra("command", "togglepause");
}
else if(CURRENT_PLAYER == 1) {
i = new Intent("com.spotify.mobile.android.ui.widget.PLAY");
}
}
else {
i = new Intent();
sendKeycode(KeyEvent.KEYCODE_MEDIA_PLAY_PAUSE);
}
return i;
}
private static void sendKeycode(int keyCode) {
Log.d(LOG_TAG, "sendKeycode");
long eventTime = Calendar.getInstance().getTimeInMillis() - 1;
KeyEvent downEvent = new KeyEvent(eventTime, eventTime, KeyEvent.ACTION_DOWN, keyCode, 0);
sendKeyevent(downEvent);
eventTime++;
KeyEvent upEvent = new KeyEvent(eventTime, eventTime, KeyEvent.ACTION_UP, keyCode, 0);
sendKeyevent(upEvent);
}
private static void sendKeyevent(KeyEvent keyEvent) {
if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
// use AudioManager.dispatchKeyEvent() from API 19 (KitKat)
// http://stackoverflow.com/questions/19890643/android-4-4-play-default-music-player
audioManager.dispatchMediaKeyEvent(keyEvent);
}
else {
// use broadcasting fake intent method
// http://stackoverflow.com/questions/12925896/android-emulate-send-action-media-button-intent
Intent i = new Intent(Intent.ACTION_MEDIA_BUTTON);
i.putExtra(Intent.EXTRA_KEY_EVENT, keyEvent);
context.sendOrderedBroadcast(i, null);
}
}
}