Fixed saving position in track, improvement with service binding, temporary new default album art.

This commit is contained in:
Karim Abou Zeid 2015-07-07 02:19:09 +02:00
commit cfa6ddaa2e
12 changed files with 140 additions and 61 deletions

View file

@ -1,7 +1,9 @@
package com.kabouzeid.gramophone.helper;
import android.app.Activity;
import android.content.ComponentName;
import android.content.Context;
import android.content.ContextWrapper;
import android.content.Intent;
import android.content.ServiceConnection;
import android.media.audiofx.AudioEffect;
@ -15,6 +17,7 @@ import com.kabouzeid.gramophone.service.MusicService;
import java.util.ArrayList;
import java.util.Random;
import java.util.WeakHashMap;
/**
* @author Karim Abou Zeid (kabouzeid)
@ -23,28 +26,75 @@ public class MusicPlayerRemote {
public static final String TAG = MusicPlayerRemote.class.getSimpleName();
public static final String SERVICE_BOUND = "com.kabouzeid.gramophone.SERVICE_BOUND";
public static MusicService musicService;
private static MusicService musicService;
private static final WeakHashMap<Context, ServiceBinder> mConnectionMap = new WeakHashMap<>();
private static final ServiceConnection musicConnection = new ServiceConnection() {
@Override
public void onServiceConnected(ComponentName name, IBinder service) {
MusicService.MusicBinder binder = (MusicService.MusicBinder) service;
musicService = binder.getService();
musicService.sendBroadcast(new Intent(SERVICE_BOUND));
public static ServiceToken bindToService(final Context context,
final ServiceConnection callback) {
Activity realActivity = ((Activity) context).getParent();
if (realActivity == null) {
realActivity = (Activity) context;
}
@Override
public void onServiceDisconnected(ComponentName name) {
final ContextWrapper contextWrapper = new ContextWrapper(realActivity);
contextWrapper.startService(new Intent(contextWrapper, MusicService.class));
final ServiceBinder binder = new ServiceBinder(callback);
if (contextWrapper.bindService(new Intent().setClass(contextWrapper, MusicService.class), binder, Context.BIND_AUTO_CREATE)) {
mConnectionMap.put(contextWrapper, binder);
return new ServiceToken(contextWrapper);
}
return null;
}
public static void unbindFromService(final ServiceToken token) {
if (token == null) {
return;
}
final ContextWrapper mContextWrapper = token.mWrappedContext;
final ServiceBinder mBinder = mConnectionMap.remove(mContextWrapper);
if (mBinder == null) {
return;
}
mContextWrapper.unbindService(mBinder);
if (mConnectionMap.isEmpty()) {
musicService = null;
}
};
}
public static void startAndBindService(final Context context) {
Intent musicServiceIntent = new Intent(context, MusicService.class);
context.bindService(musicServiceIntent, musicConnection, Context.BIND_AUTO_CREATE);
context.startService(musicServiceIntent);
public static final class ServiceBinder implements ServiceConnection {
private final ServiceConnection mCallback;
public ServiceBinder(final ServiceConnection callback) {
mCallback = callback;
}
@Override
public void onServiceConnected(final ComponentName className, final IBinder service) {
MusicService.MusicBinder binder = (MusicService.MusicBinder) service;
musicService = binder.getService();
if (mCallback != null) {
mCallback.onServiceConnected(className, service);
}
}
@Override
public void onServiceDisconnected(final ComponentName className) {
if (mCallback != null) {
mCallback.onServiceDisconnected(className);
}
musicService = null;
}
}
public static final class ServiceToken {
public ContextWrapper mWrappedContext;
public ServiceToken(final ContextWrapper context) {
mWrappedContext = context;
}
}
public static boolean isServiceConnected() {

View file

@ -7,7 +7,6 @@ package com.kabouzeid.gramophone.helper;
import android.app.Notification;
import android.app.NotificationManager;
import android.app.PendingIntent;
import android.app.TaskStackBuilder;
import android.content.BroadcastReceiver;
import android.content.ComponentName;
import android.content.Context;
@ -22,7 +21,7 @@ import android.widget.RemoteViews;
import com.kabouzeid.gramophone.R;
import com.kabouzeid.gramophone.model.Song;
import com.kabouzeid.gramophone.service.MusicService;
import com.kabouzeid.gramophone.ui.activities.MusicControllerActivity;
import com.kabouzeid.gramophone.ui.activities.MainActivity;
import com.kabouzeid.gramophone.util.MusicUtil;
import com.kabouzeid.gramophone.util.PreferenceUtils;
import com.nostra13.universalimageloader.core.ImageLoader;
@ -122,11 +121,7 @@ public class PlayingNotificationHelper {
}
private PendingIntent getOpenMusicControllerPendingIntent() {
Intent result = new Intent(service, MusicControllerActivity.class);
TaskStackBuilder taskStackBuilder = TaskStackBuilder.create(service);
taskStackBuilder.addParentStack(MusicControllerActivity.class);
taskStackBuilder.addNextIntent(result);
return taskStackBuilder.getPendingIntent(0, PendingIntent.FLAG_UPDATE_CURRENT);
return PendingIntent.getActivity(service, 0, new Intent(service, MainActivity.class), 0);
}
private void setUpExpandedPlaybackActions() {
@ -263,7 +258,7 @@ public class PlayingNotificationHelper {
this.isPlaying = isPlaying;
if (notification == null) {
return;
updateNotification();
}
if (notificationLayout != null) {
notificationLayout.setImageViewResource(R.id.action_play_pause,