package com.tomclaw.mandarin.core;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.media.AudioManager;
import android.text.TextUtils;
import com.tomclaw.mandarin.R;
import com.tomclaw.mandarin.util.Logger;
import java.lang.ref.WeakReference;
/**
* Created by solkin on 3/6/14.
*/
public class MusicStateReceiver extends BroadcastReceiver {
public static final String EXTRA_MUSIC_STATUS_MESSAGE = "music_status_message";
public static final String EXTRA_MUSIC_EVENT = "music_event";
private static final int PROCESS_EVENT_DELAY = 1500;
private static final String[] EVENTS = new String[]{
"com.android.music.metachanged",
"com.android.music.playstatechanged",
"com.android.music.playbackcomplete",
"com.android.music.queuechanged",
"com.sec.android.app.music.metachanged",
"com.sec.android.app.music.playstatechanged",
"com.sec.android.app.music.playbackcomplete",
"com.sec.android.app.music.queuechanged",
"com.rdio.android.metachanged",
"com.rdio.android.playstatechanged",
"com.rdio.android.playbackcomplete",
"com.rdio.android.queuechanged",
"com.andrew.apollo.metachanged",
"com.andrew.apollo.playstatechanged",
"com.andrew.apollo.playbackcomplete",
"com.andrew.apollo.queuechanged",
"com.htc.music.metachanged",
"com.htc.music.playstatechanged",
"com.htc.music.playbackcomplete",
"com.htc.music.queuechanged",
"com.miui.player.metachanged",
"com.miui.player.playstatechanged",
"com.miui.player.playbackcomplete",
"com.miui.player.queuechanged",
"com.sonyericsson.music.metachanged",
"com.sonyericsson.music.playstatechanged",
"com.sonyericsson.music.playbackcomplete",
"com.sonyericsson.music.queuechanged",
"com.samsung.sec.android.MusicPlayer.metachanged",
"com.samsung.sec.android.MusicPlayer.playstatechanged",
"com.samsung.sec.android.MusicPlayer.playbackcomplete",
"com.samsung.sec.android.MusicPlayer.queuechanged"
};
@Override
public void onReceive(Context context, final Intent intent) {
if (PreferenceHelper.isMusicAutoStatus(context)) {
final WeakReference<Context> contextWeakReference = new WeakReference<>(context);
MainExecutor.executeLater(new Runnable() {
@Override
public void run() {
try {
Context context = contextWeakReference.get();
if (context != null) {
boolean isMusicActive = isMusicActive(context);
String action = intent.getAction();
String cmd = intent.getStringExtra("command");
String artist = intent.getStringExtra("artist");
String album = intent.getStringExtra("album");
String track = intent.getStringExtra("track");
Logger.log(action + " / " + cmd);
Logger.log(artist + ":" + album + ":" + track);
Logger.log("music active: " + isMusicActive);
String statusMessage = null;
if (!TextUtils.isEmpty(track) && isMusicActive) {
if (TextUtils.isEmpty(artist)) {
statusMessage = "";
} else {
statusMessage = artist;
}
if (!TextUtils.isEmpty(track)) {
if (!TextUtils.isEmpty(statusMessage)) {
statusMessage = context.getString(R.string.music_status_pattern, artist, track);
} else {
statusMessage = track;
}
}
}
sendEventToService(context, statusMessage);
}
} catch (Throwable ex) {
// Music event with incorrect format will be ignored.
Logger.log("Error while trying process music state intent", ex);
}
}
}, PROCESS_EVENT_DELAY);
}
}
public static void sendEventToService(Context context) {
sendEventToService(context, null);
}
public static void sendEventToService(Context context, String statusMessage) {
Intent serviceIntent = new Intent(context, CoreService.class);
if (!TextUtils.isEmpty(statusMessage)) {
serviceIntent.putExtra(EXTRA_MUSIC_STATUS_MESSAGE, statusMessage);
}
serviceIntent.putExtra(EXTRA_MUSIC_EVENT, true);
context.startService(serviceIntent);
}
public static boolean isMusicActive(Context context) {
AudioManager audioManager = (AudioManager) context.getSystemService(Context.AUDIO_SERVICE);
return audioManager.isMusicActive();
}
public IntentFilter getIntentFilter() {
IntentFilter filter = new IntentFilter();
for (String event : EVENTS) {
filter.addAction(event);
}
return filter;
}
}