Skip to content

Commit

Permalink
MediaService: Add Poweramp handling for media controls
Browse files Browse the repository at this point in the history
* To allow simultaneous usage we store the current MediaController in a Preference and send commands based on that.
  • Loading branch information
Myself5 committed Oct 21, 2018
1 parent 58d0bf4 commit 172396f
Showing 1 changed file with 59 additions and 25 deletions.
84 changes: 59 additions & 25 deletions app/src/main/java/org/asteroidos/sync/ble/MediaService.java
Expand Up @@ -20,6 +20,7 @@
import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
import android.content.SharedPreferences;
import android.media.MediaMetadata;
import android.media.session.MediaController;
import android.media.session.MediaSession;
Expand All @@ -29,6 +30,8 @@
import android.util.Log;

import com.idevicesinc.sweetblue.BleDevice;
import com.maxmpz.poweramp.player.PowerampAPI;
import com.maxmpz.poweramp.player.PowerampAPIHelper;

import org.asteroidos.sync.services.NLService;

Expand All @@ -49,8 +52,13 @@ public class MediaService implements BleDevice.ReadWriteListener, MediaSessionM
private static final byte MEDIA_COMMAND_PLAY = 0x2;
private static final byte MEDIA_COMMAND_PAUSE = 0x3;

public static final String PREFS_NAME = "MediaPreferences";
public static final String PREFS_MEDIA_CONTROLLER_PACKAGE = "media_controller_package";
public static final String PREFS_MEDIA_CONTROLLER_PACKAGE_DEFAULT = "default";

private Context mCtx;
private BleDevice mDevice;
private SharedPreferences mSettings;

private MediaController mMediaController = null;
private MediaSessionManager mMediaSessionManager;
Expand All @@ -59,6 +67,8 @@ public MediaService(Context ctx, BleDevice device)
{
mDevice = device;
mCtx = ctx;

mSettings = mCtx.getSharedPreferences(PREFS_NAME, 0);
}

public void sync() {
Expand Down Expand Up @@ -92,14 +102,43 @@ public void onEvent(ReadWriteEvent e) {
if(e.isNotification() && e.charUuid().equals(mediaCommandsCharac)) {
if (mMediaController != null) {
byte data[] = e.data();
if (data[0] == MEDIA_COMMAND_PREVIOUS)
mMediaController.getTransportControls().skipToPrevious();
else if (data[0] == MEDIA_COMMAND_NEXT)
mMediaController.getTransportControls().skipToNext();
else if (data[0] == MEDIA_COMMAND_PLAY)
mMediaController.getTransportControls().play();
else if (data[0] == MEDIA_COMMAND_PAUSE)
mMediaController.getTransportControls().pause();
boolean isPoweramp = mSettings.getString(PREFS_MEDIA_CONTROLLER_PACKAGE, PREFS_MEDIA_CONTROLLER_PACKAGE_DEFAULT)
.equals(PowerampAPI.PACKAGE_NAME);

switch (data[0]) {
case MEDIA_COMMAND_PREVIOUS:
if(isPoweramp) {
PowerampAPIHelper.startPAService(mCtx, new Intent(PowerampAPI.ACTION_API_COMMAND)
.putExtra(PowerampAPI.COMMAND, PowerampAPI.Commands.PREVIOUS));
} else {
mMediaController.getTransportControls().skipToPrevious();
}
break;
case MEDIA_COMMAND_NEXT:
if(isPoweramp) {
PowerampAPIHelper.startPAService(mCtx, new Intent(PowerampAPI.ACTION_API_COMMAND)
.putExtra(PowerampAPI.COMMAND, PowerampAPI.Commands.NEXT));
} else {
mMediaController.getTransportControls().skipToNext();
}
break;
case MEDIA_COMMAND_PLAY:
if(isPoweramp) {
PowerampAPIHelper.startPAService(mCtx, new Intent(PowerampAPI.ACTION_API_COMMAND)
.putExtra(PowerampAPI.COMMAND, PowerampAPI.Commands.RESUME));
} else {
mMediaController.getTransportControls().play();
}
break;
case MEDIA_COMMAND_PAUSE:
if (isPoweramp) {
PowerampAPIHelper.startPAService(mCtx, new Intent(PowerampAPI.ACTION_API_COMMAND)
.putExtra(PowerampAPI.COMMAND, PowerampAPI.Commands.PAUSE));
} else {
mMediaController.getTransportControls().pause();
}
break;
}
} else {
Intent mediaIntent = new Intent(Intent.ACTION_MAIN);
mediaIntent.addCategory(Intent.CATEGORY_APP_MUSIC);
Expand Down Expand Up @@ -190,29 +229,24 @@ public void onQueueTitleChanged(CharSequence title) {
@Override
public void onActiveSessionsChanged(List<MediaController> controllers) {
if (controllers.size() > 0) {
if (mMediaController != null) {
if (!controllers.get(0).getSessionToken().equals(mMediaController.getSessionToken())) {
// Detach current controller
mMediaController.unregisterCallback(mMediaCallback);
Log.d("MediaService", "MediaController removed");
mMediaController = null;

// Attach new controller
mMediaController = controllers.get(0);
mMediaController.registerCallback(mMediaCallback);
mMediaCallback.onMetadataChanged(mMediaController.getMetadata());
if(mMediaController.getPlaybackState() != null)
mMediaCallback.onPlaybackStateChanged(mMediaController.getPlaybackState());
Log.d("MediaService", "MediaController set: " + mMediaController.getPackageName());
}
} else {
if (mMediaController != null && !controllers.get(0).getSessionToken().equals(mMediaController.getSessionToken())) {
// Detach current controller
mMediaController.unregisterCallback(mMediaCallback);
Log.d("MediaService", "MediaController removed");
mMediaController = null;
}

if(mMediaController == null) {
// Attach new controller
mMediaController = controllers.get(0);
mMediaController.registerCallback(mMediaCallback);
mMediaCallback.onMetadataChanged(mMediaController.getMetadata());
if(mMediaController.getPlaybackState() != null)
if (mMediaController.getPlaybackState() != null)
mMediaCallback.onPlaybackStateChanged(mMediaController.getPlaybackState());
Log.d("MediaService", "MediaController set: " + mMediaController.getPackageName());
SharedPreferences.Editor editor = mSettings.edit();
editor.putString(PREFS_MEDIA_CONTROLLER_PACKAGE, mMediaController.getPackageName());
editor.apply();
}
} else {
byte[] data = new byte[]{0};
Expand Down

0 comments on commit 172396f

Please sign in to comment.