package fm.last.android; import android.app.AlarmManager; import android.app.PendingIntent; import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; import android.os.IBinder; import android.os.RemoteException; import android.preference.PreferenceManager; import android.util.Log; import android.view.KeyEvent; import fm.last.android.player.IRadioPlayer; import fm.last.android.player.RadioPlayerService; public class LastFMMediaButtonHandler extends BroadcastReceiver { private final static String TAG = "LastFMMediaButtonHandler"; @Override public void onReceive(Context context, Intent intent) { IBinder service = peekService(context, new Intent(context, RadioPlayerService.class)); if (service == null) { Log.i(TAG, "LastFM-Player not active, don't handling media keys."); return; } try { IRadioPlayer player = fm.last.android.player.IRadioPlayer.Stub.asInterface(service); if (player != null && (player.isPlaying() || player.getState() == RadioPlayerService.STATE_PAUSED)) { if ((intent.getAction().equals("android.media.AUDIO_BECOMING_NOISY") && PreferenceManager.getDefaultSharedPreferences( LastFMApplication.getInstance()).getBoolean("handle_noisy", true))) { if(player.getState() != RadioPlayerService.STATE_PAUSED) player.pause(); } if(!PreferenceManager.getDefaultSharedPreferences(LastFMApplication.getInstance()).getBoolean("headset_controls", true)) return; if (intent.getAction().equals("com.smartmadsoft.openwatch.command.BUTTON_FF")) { player.skip(); } if (intent.getAction().equals("com.smartmadsoft.openwatch.command.BUTTON_PLAYPAUSE")) { intent = new Intent("fm.last.android.widget.STOP"); context.sendBroadcast(intent); } if (intent.getAction().equals("android.intent.action.MEDIA_BUTTON")) { KeyEvent event = (KeyEvent) intent.getParcelableExtra(Intent.EXTRA_KEY_EVENT); if (event == null) { return; } int keycode = event.getKeyCode(); if (event.getAction() == KeyEvent.ACTION_DOWN) { switch (keycode) { case KeyEvent.KEYCODE_MEDIA_PREVIOUS: // ignore previous button as accepting it would start the built-in player abortBroadcast(); return; case KeyEvent.KEYCODE_MEDIA_NEXT: Log.i(TAG, "Next-Button => Skipping '" + player.getTrackName() + "'"); player.skip(); abortBroadcast(); return; case KeyEvent.KEYCODE_HEADSETHOOK: case KeyEvent.KEYCODE_MEDIA_PLAY_PAUSE: if(player.getPauseButtonPressed()) { Log.i(TAG, "Next-Button => Skipping '" + player.getTrackName() + "'"); intent = new Intent("fm.last.android.widget.STOP"); PendingIntent alarmIntent = PendingIntent.getBroadcast(context, 0, intent, 0); AlarmManager am = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE); am.cancel(alarmIntent); player.skip(); } else { Log.i(TAG, "Pause-Button => Pause/Resuming '" + player.getTrackName() + "'"); player.pauseButtonPressed(); intent = new Intent("fm.last.android.widget.STOP"); PendingIntent alarmIntent = PendingIntent.getBroadcast(context, 0, intent, 0); AlarmManager am = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE); am.set(AlarmManager.RTC, System.currentTimeMillis() + 1000, alarmIntent); } abortBroadcast(); return; } } } } } catch (RemoteException e) { Log.e(TAG, "Couldn't reach player service.", e); } } }