diff --git a/app/src/main/java/github/daneren2005/dsub/service/DownloadService.java b/app/src/main/java/github/daneren2005/dsub/service/DownloadService.java index 0fb5e9e55..e15f36ede 100644 --- a/app/src/main/java/github/daneren2005/dsub/service/DownloadService.java +++ b/app/src/main/java/github/daneren2005/dsub/service/DownloadService.java @@ -72,7 +72,6 @@ import java.util.concurrent.CopyOnWriteArrayList; import android.annotation.TargetApi; -import android.app.Activity; import android.app.Service; import android.content.ComponentCallbacks2; import android.content.ComponentName; @@ -111,6 +110,8 @@ public class DownloadService extends Service { public static final String CMD_NEXT = "github.daneren2005.dsub.CMD_NEXT"; public static final String CANCEL_DOWNLOADS = "github.daneren2005.dsub.CANCEL_DOWNLOADS"; public static final String START_PLAY = "github.daneren2005.dsub.START_PLAYING"; + public static final String THUMBS_UP = "github.daneren2005.dsub.THUMBS_UP"; + public static final String THUMBS_DOWN = "github.daneren2005.dsub.THUMBS_DOWN"; private static final long DEFAULT_DELAY_UPDATE_PROGRESS = 1000L; private static final double DELETE_CUTOFF = 0.84; private static final int REQUIRED_ALBUM_MATCHES = 4; @@ -310,7 +311,7 @@ public boolean onError(MediaPlayer mediaPlayer, int what, int more) { public int onStartCommand(Intent intent, int flags, int startId) { super.onStartCommand(intent, flags, startId); lifecycleSupport.onStart(intent); - if(Build.VERSION.SDK_INT >= 26 && !this.isForeground()) { + if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.O && intent.getAction() == null) { Notifications.shutGoogleUpNotification(this); } return START_NOT_STICKY; @@ -390,7 +391,12 @@ public void onDestroy() { unregisterReceiver(audioNoisyReceiver); } mediaRouter.destroy(); - Notifications.hidePlayingNotification(this, this, handler); + if (Util.getPreferences(this).getBoolean(Constants.PREFERENCES_KEY_PERSISTENT_NOTIFICATION, false) + && Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) { + stopForeground(android.app.Service.STOP_FOREGROUND_DETACH); + } else { + Notifications.hidePlayingNotification(this, this, handler); + } Notifications.hideDownloadingNotification(this, this, handler); } @@ -970,6 +976,10 @@ synchronized void setNextPlaying() { } } + public int getDownloadListSize() { + return downloadList.size(); + } + public int getCurrentPlayingIndex() { return currentPlayingIndex; } @@ -1119,7 +1129,11 @@ private synchronized void play(int index, boolean start, int position) { reset(); if(index >= size && size != 0) { setCurrentPlaying(0, false); - Notifications.hidePlayingNotification(this, this, handler); + if(Util.getPreferences(this).getBoolean(Constants.PREFERENCES_KEY_PERSISTENT_NOTIFICATION, false)) { + Notifications.showPlayingNotification(this, this, handler, currentPlaying.getSong()); + } else { + Notifications.hidePlayingNotification(this, this, handler); + } } else { setCurrentPlaying(null, false); } @@ -2792,7 +2806,8 @@ public void starCommited(boolean starred) { } }); } - public void toggleRating(int rating) { + public void toggleRating(int rating) {toggleRating(rating, false);} + public void toggleRating(int rating, boolean updateNotification) { if(currentPlaying == null) { return; } @@ -2803,6 +2818,9 @@ public void toggleRating(int rating) { } else { setRating(rating); } + if (updateNotification) { + Notifications.showPlayingNotification(this, this, handler, entry); + } } public void setRating(int rating) { final DownloadFile currentPlaying = this.currentPlaying; diff --git a/app/src/main/java/github/daneren2005/dsub/service/DownloadServiceLifecycleSupport.java b/app/src/main/java/github/daneren2005/dsub/service/DownloadServiceLifecycleSupport.java index 1c80b622a..662601b2e 100644 --- a/app/src/main/java/github/daneren2005/dsub/service/DownloadServiceLifecycleSupport.java +++ b/app/src/main/java/github/daneren2005/dsub/service/DownloadServiceLifecycleSupport.java @@ -243,6 +243,10 @@ public void run() { downloadService.previous(); } else if(DownloadService.CANCEL_DOWNLOADS.equals(action)) { downloadService.clearBackground(); + } else if (DownloadService.THUMBS_UP.equals(action)) { + downloadService.toggleRating(5, true); + } else if (DownloadService.THUMBS_DOWN.equals(action)) { + downloadService.toggleRating(1, true); } else if(intent.getExtras() != null) { final KeyEvent event = (KeyEvent) intent.getExtras().get(Intent.EXTRA_KEY_EVENT); if (event != null) { diff --git a/app/src/main/java/github/daneren2005/dsub/util/Notifications.java b/app/src/main/java/github/daneren2005/dsub/util/Notifications.java index a8f7add0a..ff94eaca3 100644 --- a/app/src/main/java/github/daneren2005/dsub/util/Notifications.java +++ b/app/src/main/java/github/daneren2005/dsub/util/Notifications.java @@ -24,16 +24,13 @@ import android.content.Context; import android.content.Intent; import android.graphics.Bitmap; +import android.graphics.BitmapFactory; import android.os.Build; import android.os.Handler; import android.support.v4.app.NotificationCompat; +import android.support.v4.media.app.NotificationCompat.MediaStyle; import android.util.Log; import android.view.KeyEvent; -import android.view.View; -import android.view.ViewGroup; -import android.widget.LinearLayout; -import android.widget.RemoteViews; -import android.widget.TextView; import github.daneren2005.dsub.R; import github.daneren2005.dsub.activity.SubsonicActivity; @@ -43,6 +40,7 @@ import github.daneren2005.dsub.provider.DSubWidgetProvider; import github.daneren2005.dsub.service.DownloadFile; import github.daneren2005.dsub.service.DownloadService; +import github.daneren2005.dsub.util.compat.RemoteControlClientLP; import github.daneren2005.dsub.view.UpdateView; public final class Notifications { @@ -63,50 +61,56 @@ public final class Notifications { private static NotificationChannel downloadingChannel; private static NotificationChannel syncChannel; - private final static Pair NOTIFICATION_TEXT_COLORS = new Pair(); - public static void showPlayingNotification(final Context context, final DownloadService downloadService, final Handler handler, MusicDirectory.Entry song) { if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { getPlayingNotificationChannel(context); } // Set the icon, scrolling text and timestamp - final Notification notification = new NotificationCompat.Builder(context) + NotificationCompat.Builder builder = new NotificationCompat.Builder(context) .setSmallIcon(R.drawable.stat_notify_playing) .setTicker(song.getTitle()) - .setWhen(System.currentTimeMillis()) + .setSubText(song.getAlbum()) + .setContentTitle(song.getTitle()) + .setContentText(song.getArtist()) + .setShowWhen(false) .setChannelId("now-playing-channel") - .build(); + .setLargeIcon(getAlbumArt(context, song)); final boolean playing = downloadService.getPlayerState() == PlayerState.STARTED; - if(playing) { - notification.flags |= Notification.FLAG_NO_CLEAR | Notification.FLAG_ONGOING_EVENT; - } - boolean remote = downloadService.isRemoteEnabled(); - boolean isSingle = downloadService.isCurrentPlayingSingle(); - boolean shouldFastForward = downloadService.shouldFastForward(); - if (Build.VERSION.SDK_INT>= Build.VERSION_CODES.JELLY_BEAN){ - RemoteViews expandedContentView = new RemoteViews(context.getPackageName(), R.layout.notification_expanded); - setupViews(expandedContentView ,context, song, true, playing, remote, isSingle, shouldFastForward); - notification.bigContentView = expandedContentView; - notification.priority = Notification.PRIORITY_HIGH; + final boolean thumbs = Build.VERSION.SDK_INT >= Build.VERSION_CODES.N; + int[] compactActions; + + compactActions = thumbs ? new int[]{1, 2, 3} : new int[]{0, 1, 2}; + addActions(context, builder, song, playing, thumbs); + Intent cancelIntent = new Intent("KEYCODE_MEDIA_STOP") + .setComponent(new ComponentName(context, DownloadService.class)) + .putExtra(Intent.EXTRA_KEY_EVENT, new KeyEvent(KeyEvent.ACTION_UP, KeyEvent.KEYCODE_MEDIA_STOP)); + MediaStyle mediaStyle = new MediaStyle() + .setShowActionsInCompactView(compactActions) + .setShowCancelButton(true) + .setCancelButtonIntent(PendingIntent.getService(context, 0, cancelIntent, 0)); + + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN){ + builder.setPriority(Notification.PRIORITY_HIGH); } if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { - notification.visibility = Notification.VISIBILITY_PUBLIC; - + RemoteControlClientLP remoteControlClientLP = (RemoteControlClientLP) downloadService.getRemoteControlClient(); + mediaStyle.setMediaSession(remoteControlClientLP.getMediaSession().getSessionToken()); + builder.setVisibility(Notification.VISIBILITY_PUBLIC).setColor(context.getResources().getColor(R.color.lightPrimary)); if(Util.getPreferences(context).getBoolean(Constants.PREFERENCES_KEY_HEADS_UP_NOTIFICATION, false) && !UpdateView.hasActiveActivity()) { - notification.vibrate = new long[0]; + builder.setVibrate(new long[0]); } } - - RemoteViews smallContentView = new RemoteViews(context.getPackageName(), R.layout.notification); - setupViews(smallContentView, context, song, false, playing, remote, isSingle, shouldFastForward); - notification.contentView = smallContentView; - + builder.setStyle(mediaStyle); Intent notificationIntent = new Intent(context, SubsonicFragmentActivity.class); notificationIntent.putExtra(Constants.INTENT_EXTRA_NAME_DOWNLOAD, true); notificationIntent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); - notification.contentIntent = PendingIntent.getActivity(context, 0, notificationIntent, 0); + builder.setContentIntent(PendingIntent.getActivity(context, 0, notificationIntent, 0)); + final Notification notification = builder.build(); + if(playing) { + notification.flags |= Notification.FLAG_NO_CLEAR | Notification.FLAG_ONGOING_EVENT; + } playShowing = true; if(downloadForeground && downloadShowing) { @@ -138,7 +142,12 @@ public void run() { playShowing = false; persistentPlayingShowing = true; NotificationManager notificationManager = (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE); - stopForeground(downloadService, false); + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N + && Util.getPreferences(context).getBoolean(Constants.PREFERENCES_KEY_PERSISTENT_NOTIFICATION, false)) { + stopForeground(downloadService, android.app.Service.STOP_FOREGROUND_DETACH); + } else { + stopForeground(downloadService,false); + } try { notificationManager.notify(NOTIFICATION_ID_PLAYING, notification); @@ -154,13 +163,7 @@ public void run() { DSubWidgetProvider.notifyInstances(context, downloadService, playing); } - private static void setupViews(RemoteViews rv, Context context, MusicDirectory.Entry song, boolean expanded, boolean playing, boolean remote, boolean isSingleFile, boolean shouldFastForward) { - // Use the same text for the ticker and the expanded notification - String title = song.getTitle(); - String arist = song.getArtist(); - String album = song.getAlbum(); - - // Set the album art. + private static Bitmap getAlbumArt(Context context, MusicDirectory.Entry song) { try { ImageLoader imageLoader = SubsonicActivity.getStaticImageLoader(context); Bitmap bitmap = null; @@ -169,162 +172,75 @@ private static void setupViews(RemoteViews rv, Context context, MusicDirectory.E } if (bitmap == null) { // set default album art - rv.setImageViewResource(R.id.notification_image, R.drawable.unknown_album); + return BitmapFactory.decodeResource(context.getResources(), + R.drawable.unknown_album_large); } else { - imageLoader.setNowPlayingSmall(bitmap); - rv.setImageViewBitmap(R.id.notification_image, bitmap); + return bitmap; } } catch (Exception x) { Log.w(TAG, "Failed to get notification cover art", x); - rv.setImageViewResource(R.id.notification_image, R.drawable.unknown_album); - } - - // set the text for the notifications - rv.setTextViewText(R.id.notification_title, title); - rv.setTextViewText(R.id.notification_artist, arist); - rv.setTextViewText(R.id.notification_album, album); - - boolean persistent = Util.getPreferences(context).getBoolean(Constants.PREFERENCES_KEY_PERSISTENT_NOTIFICATION, false); - if(persistent) { - if(expanded) { - rv.setImageViewResource(R.id.control_pause, playing ? R.drawable.notification_pause : R.drawable.notification_start); - - if(shouldFastForward) { - rv.setImageViewResource(R.id.control_previous, R.drawable.notification_rewind); - rv.setImageViewResource(R.id.control_next, R.drawable.notification_fastforward); - } else { - rv.setImageViewResource(R.id.control_previous, R.drawable.notification_backward); - rv.setImageViewResource(R.id.control_next, R.drawable.notification_forward); - } - } else { - rv.setImageViewResource(R.id.control_previous, playing ? R.drawable.notification_pause : R.drawable.notification_start); - if(shouldFastForward) { - rv.setImageViewResource(R.id.control_pause, R.drawable.notification_fastforward); - } else { - rv.setImageViewResource(R.id.control_pause, R.drawable.notification_forward); - } - rv.setImageViewResource(R.id.control_next, R.drawable.notification_close); - } - } else if(shouldFastForward) { - rv.setImageViewResource(R.id.control_previous, R.drawable.notification_rewind); - rv.setImageViewResource(R.id.control_next, R.drawable.notification_fastforward); - } else { - // Necessary for switching back since it appears to re-use the same layout - rv.setImageViewResource(R.id.control_previous, R.drawable.notification_backward); - rv.setImageViewResource(R.id.control_next, R.drawable.notification_forward); - } - - // Create actions for media buttons - int previous = 0, pause = 0, next = 0, close = 0, rewind = 0, fastForward = 0; - if (expanded) { - pause = R.id.control_pause; - - if (shouldFastForward) { - rewind = R.id.control_previous; - fastForward = R.id.control_next; - } else { - previous = R.id.control_previous; - next = R.id.control_next; - } - - if (remote || persistent) { - close = R.id.notification_close; - rv.setViewVisibility(close, View.VISIBLE); - } - } else { - if (persistent) { - pause = R.id.control_previous; - if(shouldFastForward) { - fastForward = R.id.control_pause; - } else { - next = R.id.control_pause; - } - close = R.id.control_next; - } else { - if (shouldFastForward) { - rewind = R.id.control_previous; - fastForward = R.id.control_next; - } else { - previous = R.id.control_previous; - next = R.id.control_next; - } - - pause = R.id.control_pause; - } - } - - if(isSingleFile) { - if(previous > 0) { - rv.setViewVisibility(previous, View.GONE); - previous = 0; - } - if(rewind > 0) { - rv.setViewVisibility(rewind, View.GONE); - rewind = 0; - } - - if(next > 0) { - rv.setViewVisibility(next, View.GONE); - next = 0; - } - - if(fastForward > 0) { - rv.setViewVisibility(fastForward, View.GONE); - fastForward = 0; - } + return BitmapFactory.decodeResource(context.getResources(), + R.drawable.unknown_album_large); } + } - PendingIntent pendingIntent; - if(previous > 0) { + private static void addActions(final Context context, final NotificationCompat.Builder builder, MusicDirectory.Entry song, final boolean playing, final boolean thumbs) { + PendingIntent pendingIntent; + DownloadService downloadService = (DownloadService) context; + boolean shouldFastForward = downloadService.shouldFastForward(); + int rating = song.getRating(); + + if (thumbs) { + pendingIntent = PendingIntent.getService(downloadService, 0, + new Intent(DownloadService.THUMBS_UP).setComponent(new ComponentName(context, DownloadService.class)), 0); + builder.addAction(rating == 5 ? R.drawable.ic_action_rating_good_selected : R.drawable.ic_action_rating_good, "Thumbs Up", pendingIntent); + } + if(!shouldFastForward) { Intent prevIntent = new Intent("KEYCODE_MEDIA_PREVIOUS"); prevIntent.setComponent(new ComponentName(context, DownloadService.class)); prevIntent.putExtra(Intent.EXTRA_KEY_EVENT, new KeyEvent(KeyEvent.ACTION_UP, KeyEvent.KEYCODE_MEDIA_PREVIOUS)); pendingIntent = PendingIntent.getService(context, 0, prevIntent, 0); - rv.setOnClickPendingIntent(previous, pendingIntent); - } - if(rewind > 0) { + builder.addAction(R.drawable.ic_skip_previous, "Previous", pendingIntent); + } else { Intent rewindIntent = new Intent("KEYCODE_MEDIA_REWIND"); rewindIntent.setComponent(new ComponentName(context, DownloadService.class)); rewindIntent.putExtra(Intent.EXTRA_KEY_EVENT, new KeyEvent(KeyEvent.ACTION_UP, KeyEvent.KEYCODE_MEDIA_REWIND)); pendingIntent = PendingIntent.getService(context, 0, rewindIntent, 0); - rv.setOnClickPendingIntent(rewind, pendingIntent); - } - if(pause > 0) { - if(playing) { - Intent pauseIntent = new Intent("KEYCODE_MEDIA_PLAY_PAUSE"); - pauseIntent.setComponent(new ComponentName(context, DownloadService.class)); - pauseIntent.putExtra(Intent.EXTRA_KEY_EVENT, new KeyEvent(KeyEvent.ACTION_UP, KeyEvent.KEYCODE_MEDIA_PLAY_PAUSE)); - pendingIntent = PendingIntent.getService(context, 0, pauseIntent, 0); - rv.setOnClickPendingIntent(pause, pendingIntent); - } else { - Intent prevIntent = new Intent("KEYCODE_MEDIA_START"); - prevIntent.setComponent(new ComponentName(context, DownloadService.class)); - prevIntent.putExtra(Intent.EXTRA_KEY_EVENT, new KeyEvent(KeyEvent.ACTION_UP, KeyEvent.KEYCODE_MEDIA_PLAY)); - pendingIntent = PendingIntent.getService(context, 0, prevIntent, 0); - rv.setOnClickPendingIntent(pause, pendingIntent); - } - } - if(next > 0) { - Intent nextIntent = new Intent("KEYCODE_MEDIA_NEXT"); - nextIntent.setComponent(new ComponentName(context, DownloadService.class)); - nextIntent.putExtra(Intent.EXTRA_KEY_EVENT, new KeyEvent(KeyEvent.ACTION_UP, KeyEvent.KEYCODE_MEDIA_NEXT)); - pendingIntent = PendingIntent.getService(context, 0, nextIntent, 0); - rv.setOnClickPendingIntent(next, pendingIntent); - } - if(fastForward > 0) { - Intent fastForwardIntent = new Intent("KEYCODE_MEDIA_FAST_FORWARD"); - fastForwardIntent.setComponent(new ComponentName(context, DownloadService.class)); - fastForwardIntent.putExtra(Intent.EXTRA_KEY_EVENT, new KeyEvent(KeyEvent.ACTION_UP, KeyEvent.KEYCODE_MEDIA_FAST_FORWARD)); - pendingIntent = PendingIntent.getService(context, 0, fastForwardIntent, 0); - rv.setOnClickPendingIntent(fastForward, pendingIntent); - } - if(close > 0) { - Intent prevIntent = new Intent("KEYCODE_MEDIA_STOP"); - prevIntent.setComponent(new ComponentName(context, DownloadService.class)); - prevIntent.putExtra(Intent.EXTRA_KEY_EVENT, new KeyEvent(KeyEvent.ACTION_UP, KeyEvent.KEYCODE_MEDIA_STOP)); - pendingIntent = PendingIntent.getService(context, 0, prevIntent, 0); - rv.setOnClickPendingIntent(close, pendingIntent); + builder.addAction(R.drawable.ic_fast_rewind, "Rewind", pendingIntent); } + + if(playing) { + Intent pauseIntent = new Intent("KEYCODE_MEDIA_PLAY_PAUSE"); + pauseIntent.setComponent(new ComponentName(context, DownloadService.class)); + pauseIntent.putExtra(Intent.EXTRA_KEY_EVENT, new KeyEvent(KeyEvent.ACTION_UP, KeyEvent.KEYCODE_MEDIA_PLAY_PAUSE)); + pendingIntent = PendingIntent.getService(context, 0, pauseIntent, 0); + builder.addAction(R.drawable.ic_pause, "Pause", pendingIntent); + } else { + Intent playIntent = new Intent("KEYCODE_MEDIA_PLAY"); + playIntent.setComponent(new ComponentName(context, DownloadService.class)); + playIntent.putExtra(Intent.EXTRA_KEY_EVENT, new KeyEvent(KeyEvent.ACTION_UP, KeyEvent.KEYCODE_MEDIA_PLAY)); + pendingIntent = PendingIntent.getService(context, 0, playIntent, 0); + builder.addAction(R.drawable.ic_play_arrow, "Play", pendingIntent); + } + + if(!shouldFastForward) { + Intent nextIntent = new Intent("KEYCODE_MEDIA_NEXT"); + nextIntent.setComponent(new ComponentName(context, DownloadService.class)); + nextIntent.putExtra(Intent.EXTRA_KEY_EVENT, new KeyEvent(KeyEvent.ACTION_UP, KeyEvent.KEYCODE_MEDIA_NEXT)); + pendingIntent = PendingIntent.getService(context, 0, nextIntent, 0); + builder.addAction(R.drawable.ic_skip_next, "Next", pendingIntent); + } else { + Intent fastForwardIntent = new Intent("KEYCODE_MEDIA_FAST_FORWARD"); + fastForwardIntent.setComponent(new ComponentName(context, DownloadService.class)); + fastForwardIntent.putExtra(Intent.EXTRA_KEY_EVENT, new KeyEvent(KeyEvent.ACTION_UP, KeyEvent.KEYCODE_MEDIA_FAST_FORWARD)); + pendingIntent = PendingIntent.getService(context, 0, fastForwardIntent, 0); + builder.addAction(R.drawable.ic_fast_forward, "Fast Forward", pendingIntent); + } + if (thumbs) { + pendingIntent = PendingIntent.getService(downloadService, 0, + new Intent(DownloadService.THUMBS_DOWN).setComponent(new ComponentName(context, DownloadService.class)), 0); + builder.addAction(rating == 1 ? R.drawable.ic_action_rating_bad_selected : R.drawable.ic_action_rating_bad, "Thumbs Down", pendingIntent); + } } public static void hidePlayingNotification(final Context context, final DownloadService downloadService, Handler handler) { @@ -451,6 +367,9 @@ private static NotificationChannel getDownloadingNotificationChannel(Context con @TargetApi(Build.VERSION_CODES.O) public static void shutGoogleUpNotification(final DownloadService downloadService) { // On Android O+, service crashes if startForeground isn't called within 5 seconds of starting + if (downloadService.isForeground()) { + return; + } getDownloadingNotificationChannel(downloadService); NotificationCompat.Builder builder; @@ -547,4 +466,10 @@ private static void stopForeground(DownloadService downloadService, boolean remo downloadService.stopForeground(removeNotification); downloadService.setIsForeground(false); } + + @TargetApi(24) + private static void stopForeground(DownloadService downloadService, int removeNotification) { + downloadService.stopForeground(removeNotification); + downloadService.setIsForeground(false); + } } diff --git a/app/src/main/res/drawable-hdpi/ic_fast_forward.png b/app/src/main/res/drawable-hdpi/ic_fast_forward.png new file mode 100644 index 000000000..6dd61d125 Binary files /dev/null and b/app/src/main/res/drawable-hdpi/ic_fast_forward.png differ diff --git a/app/src/main/res/drawable-hdpi/ic_fast_rewind.png b/app/src/main/res/drawable-hdpi/ic_fast_rewind.png new file mode 100644 index 000000000..c85b2fcba Binary files /dev/null and b/app/src/main/res/drawable-hdpi/ic_fast_rewind.png differ diff --git a/app/src/main/res/drawable-hdpi/ic_pause.png b/app/src/main/res/drawable-hdpi/ic_pause.png new file mode 100644 index 000000000..15ab69e36 Binary files /dev/null and b/app/src/main/res/drawable-hdpi/ic_pause.png differ diff --git a/app/src/main/res/drawable-hdpi/ic_play_arrow.png b/app/src/main/res/drawable-hdpi/ic_play_arrow.png new file mode 100644 index 000000000..043763d44 Binary files /dev/null and b/app/src/main/res/drawable-hdpi/ic_play_arrow.png differ diff --git a/app/src/main/res/drawable-hdpi/ic_skip_next.png b/app/src/main/res/drawable-hdpi/ic_skip_next.png new file mode 100644 index 000000000..607a968be Binary files /dev/null and b/app/src/main/res/drawable-hdpi/ic_skip_next.png differ diff --git a/app/src/main/res/drawable-hdpi/ic_skip_previous.png b/app/src/main/res/drawable-hdpi/ic_skip_previous.png new file mode 100644 index 000000000..415e96339 Binary files /dev/null and b/app/src/main/res/drawable-hdpi/ic_skip_previous.png differ diff --git a/app/src/main/res/drawable-hdpi/stat_notify_playing.png b/app/src/main/res/drawable-hdpi/stat_notify_playing.png index 78b4d5bff..972bd869d 100644 Binary files a/app/src/main/res/drawable-hdpi/stat_notify_playing.png and b/app/src/main/res/drawable-hdpi/stat_notify_playing.png differ diff --git a/app/src/main/res/drawable-mdpi/ic_fast_forward.png b/app/src/main/res/drawable-mdpi/ic_fast_forward.png new file mode 100644 index 000000000..0bd66115c Binary files /dev/null and b/app/src/main/res/drawable-mdpi/ic_fast_forward.png differ diff --git a/app/src/main/res/drawable-mdpi/ic_fast_rewind.png b/app/src/main/res/drawable-mdpi/ic_fast_rewind.png new file mode 100644 index 000000000..d06e37887 Binary files /dev/null and b/app/src/main/res/drawable-mdpi/ic_fast_rewind.png differ diff --git a/app/src/main/res/drawable-mdpi/ic_pause.png b/app/src/main/res/drawable-mdpi/ic_pause.png new file mode 100644 index 000000000..2c3cde4af Binary files /dev/null and b/app/src/main/res/drawable-mdpi/ic_pause.png differ diff --git a/app/src/main/res/drawable-mdpi/ic_play_arrow.png b/app/src/main/res/drawable-mdpi/ic_play_arrow.png new file mode 100644 index 000000000..57cef8a52 Binary files /dev/null and b/app/src/main/res/drawable-mdpi/ic_play_arrow.png differ diff --git a/app/src/main/res/drawable-mdpi/ic_skip_next.png b/app/src/main/res/drawable-mdpi/ic_skip_next.png new file mode 100644 index 000000000..6f3264db7 Binary files /dev/null and b/app/src/main/res/drawable-mdpi/ic_skip_next.png differ diff --git a/app/src/main/res/drawable-mdpi/ic_skip_previous.png b/app/src/main/res/drawable-mdpi/ic_skip_previous.png new file mode 100644 index 000000000..cf22e0d00 Binary files /dev/null and b/app/src/main/res/drawable-mdpi/ic_skip_previous.png differ diff --git a/app/src/main/res/drawable-mdpi/stat_notify_playing.png b/app/src/main/res/drawable-mdpi/stat_notify_playing.png index 999ce798f..c1e75937d 100644 Binary files a/app/src/main/res/drawable-mdpi/stat_notify_playing.png and b/app/src/main/res/drawable-mdpi/stat_notify_playing.png differ diff --git a/app/src/main/res/drawable-xhdpi/ic_fast_forward.png b/app/src/main/res/drawable-xhdpi/ic_fast_forward.png new file mode 100644 index 000000000..23b193ae3 Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/ic_fast_forward.png differ diff --git a/app/src/main/res/drawable-xhdpi/ic_fast_rewind.png b/app/src/main/res/drawable-xhdpi/ic_fast_rewind.png new file mode 100644 index 000000000..568d286f9 Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/ic_fast_rewind.png differ diff --git a/app/src/main/res/drawable-xhdpi/ic_pause.png b/app/src/main/res/drawable-xhdpi/ic_pause.png new file mode 100644 index 000000000..c78097eee Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/ic_pause.png differ diff --git a/app/src/main/res/drawable-xhdpi/ic_play_arrow.png b/app/src/main/res/drawable-xhdpi/ic_play_arrow.png new file mode 100644 index 000000000..4182ae808 Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/ic_play_arrow.png differ diff --git a/app/src/main/res/drawable-xhdpi/ic_skip_next.png b/app/src/main/res/drawable-xhdpi/ic_skip_next.png new file mode 100644 index 000000000..82bec4236 Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/ic_skip_next.png differ diff --git a/app/src/main/res/drawable-xhdpi/ic_skip_previous.png b/app/src/main/res/drawable-xhdpi/ic_skip_previous.png new file mode 100644 index 000000000..9d6288875 Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/ic_skip_previous.png differ diff --git a/app/src/main/res/drawable-xhdpi/stat_notify_playing.png b/app/src/main/res/drawable-xhdpi/stat_notify_playing.png index e2bafa6a4..82416f814 100644 Binary files a/app/src/main/res/drawable-xhdpi/stat_notify_playing.png and b/app/src/main/res/drawable-xhdpi/stat_notify_playing.png differ diff --git a/app/src/main/res/drawable-xxhdpi/ic_fast_forward.png b/app/src/main/res/drawable-xxhdpi/ic_fast_forward.png new file mode 100644 index 000000000..1709669de Binary files /dev/null and b/app/src/main/res/drawable-xxhdpi/ic_fast_forward.png differ diff --git a/app/src/main/res/drawable-xxhdpi/ic_fast_rewind.png b/app/src/main/res/drawable-xxhdpi/ic_fast_rewind.png new file mode 100644 index 000000000..4a5136752 Binary files /dev/null and b/app/src/main/res/drawable-xxhdpi/ic_fast_rewind.png differ diff --git a/app/src/main/res/drawable-xxhdpi/ic_pause.png b/app/src/main/res/drawable-xxhdpi/ic_pause.png new file mode 100644 index 000000000..fefa6dd01 Binary files /dev/null and b/app/src/main/res/drawable-xxhdpi/ic_pause.png differ diff --git a/app/src/main/res/drawable-xxhdpi/ic_play_arrow.png b/app/src/main/res/drawable-xxhdpi/ic_play_arrow.png new file mode 100644 index 000000000..03ace2e28 Binary files /dev/null and b/app/src/main/res/drawable-xxhdpi/ic_play_arrow.png differ diff --git a/app/src/main/res/drawable-xxhdpi/ic_skip_next.png b/app/src/main/res/drawable-xxhdpi/ic_skip_next.png new file mode 100644 index 000000000..d02596fea Binary files /dev/null and b/app/src/main/res/drawable-xxhdpi/ic_skip_next.png differ diff --git a/app/src/main/res/drawable-xxhdpi/ic_skip_previous.png b/app/src/main/res/drawable-xxhdpi/ic_skip_previous.png new file mode 100644 index 000000000..d32c186d9 Binary files /dev/null and b/app/src/main/res/drawable-xxhdpi/ic_skip_previous.png differ diff --git a/app/src/main/res/drawable-xxhdpi/stat_notify_playing.png b/app/src/main/res/drawable-xxhdpi/stat_notify_playing.png index 9138a7603..bac5c5750 100644 Binary files a/app/src/main/res/drawable-xxhdpi/stat_notify_playing.png and b/app/src/main/res/drawable-xxhdpi/stat_notify_playing.png differ diff --git a/app/src/main/res/drawable-xxxhdpi/ic_fast_forward.png b/app/src/main/res/drawable-xxxhdpi/ic_fast_forward.png new file mode 100644 index 000000000..f7a03d04c Binary files /dev/null and b/app/src/main/res/drawable-xxxhdpi/ic_fast_forward.png differ diff --git a/app/src/main/res/drawable-xxxhdpi/ic_fast_rewind.png b/app/src/main/res/drawable-xxxhdpi/ic_fast_rewind.png new file mode 100644 index 000000000..686c06e3d Binary files /dev/null and b/app/src/main/res/drawable-xxxhdpi/ic_fast_rewind.png differ diff --git a/app/src/main/res/drawable-xxxhdpi/ic_pause.png b/app/src/main/res/drawable-xxxhdpi/ic_pause.png new file mode 100644 index 000000000..ab224f20d Binary files /dev/null and b/app/src/main/res/drawable-xxxhdpi/ic_pause.png differ diff --git a/app/src/main/res/drawable-xxxhdpi/ic_play_arrow.png b/app/src/main/res/drawable-xxxhdpi/ic_play_arrow.png new file mode 100644 index 000000000..0d3fa2242 Binary files /dev/null and b/app/src/main/res/drawable-xxxhdpi/ic_play_arrow.png differ diff --git a/app/src/main/res/drawable-xxxhdpi/ic_skip_next.png b/app/src/main/res/drawable-xxxhdpi/ic_skip_next.png new file mode 100644 index 000000000..74290887b Binary files /dev/null and b/app/src/main/res/drawable-xxxhdpi/ic_skip_next.png differ diff --git a/app/src/main/res/drawable-xxxhdpi/ic_skip_previous.png b/app/src/main/res/drawable-xxxhdpi/ic_skip_previous.png new file mode 100644 index 000000000..4ebd24791 Binary files /dev/null and b/app/src/main/res/drawable-xxxhdpi/ic_skip_previous.png differ diff --git a/app/src/main/res/drawable-xxxhdpi/stat_notify_playing.png b/app/src/main/res/drawable-xxxhdpi/stat_notify_playing.png new file mode 100644 index 000000000..676bb5645 Binary files /dev/null and b/app/src/main/res/drawable-xxxhdpi/stat_notify_playing.png differ