aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--app/src/main/java/github/daneren2005/dsub/service/DownloadService.java31
-rw-r--r--app/src/main/java/github/daneren2005/dsub/util/compat/RemoteControlClientBase.java11
-rw-r--r--app/src/main/java/github/daneren2005/dsub/util/compat/RemoteControlClientICS.java13
-rw-r--r--app/src/main/java/github/daneren2005/dsub/util/compat/RemoteControlClientLP.java116
-rw-r--r--app/src/main/res/drawable-hdpi/ic_action_rating_bad.pngbin0 -> 817 bytes
-rw-r--r--app/src/main/res/drawable-hdpi/ic_action_rating_bad_selected.pngbin559 -> 584 bytes
-rw-r--r--app/src/main/res/drawable-hdpi/ic_action_rating_good.pngbin0 -> 835 bytes
-rw-r--r--app/src/main/res/drawable-hdpi/ic_action_rating_good_selected.pngbin550 -> 577 bytes
-rw-r--r--app/src/main/res/drawable-hdpi/ic_toggle_star.pngbin904 -> 969 bytes
-rw-r--r--app/src/main/res/drawable-hdpi/ic_toggle_star_outline.pngbin0 -> 1322 bytes
-rw-r--r--app/src/main/res/drawable-mdpi/ic_action_rating_bad.pngbin0 -> 469 bytes
-rw-r--r--app/src/main/res/drawable-mdpi/ic_action_rating_bad_selected.pngbin345 -> 374 bytes
-rw-r--r--app/src/main/res/drawable-mdpi/ic_action_rating_good.pngbin0 -> 459 bytes
-rw-r--r--app/src/main/res/drawable-mdpi/ic_action_rating_good_selected.pngbin326 -> 357 bytes
-rw-r--r--app/src/main/res/drawable-mdpi/ic_toggle_star.pngbin612 -> 664 bytes
-rw-r--r--app/src/main/res/drawable-mdpi/ic_toggle_star_outline.pngbin0 -> 844 bytes
-rw-r--r--app/src/main/res/drawable-xhdpi/ic_action_rating_bad.pngbin0 -> 898 bytes
-rw-r--r--app/src/main/res/drawable-xhdpi/ic_action_rating_bad_selected.pngbin655 -> 681 bytes
-rw-r--r--app/src/main/res/drawable-xhdpi/ic_action_rating_good.pngbin0 -> 900 bytes
-rw-r--r--app/src/main/res/drawable-xhdpi/ic_action_rating_good_selected.pngbin648 -> 665 bytes
-rw-r--r--app/src/main/res/drawable-xhdpi/ic_toggle_star.pngbin1260 -> 1367 bytes
-rw-r--r--app/src/main/res/drawable-xhdpi/ic_toggle_star_outline.pngbin0 -> 1864 bytes
-rw-r--r--app/src/main/res/drawable-xxhdpi/ic_action_rating_bad.pngbin0 -> 1662 bytes
-rw-r--r--app/src/main/res/drawable-xxhdpi/ic_action_rating_bad_selected.pngbin1018 -> 1074 bytes
-rw-r--r--app/src/main/res/drawable-xxhdpi/ic_action_rating_good.pngbin0 -> 1681 bytes
-rw-r--r--app/src/main/res/drawable-xxhdpi/ic_action_rating_good_selected.pngbin1085 -> 1116 bytes
-rw-r--r--app/src/main/res/drawable-xxhdpi/ic_toggle_star.pngbin1930 -> 2060 bytes
-rw-r--r--app/src/main/res/drawable-xxhdpi/ic_toggle_star_outline.pngbin0 -> 2882 bytes
-rw-r--r--app/src/main/res/drawable-xxxhdpi/ic_action_rating_bad.pngbin0 -> 1730 bytes
-rw-r--r--app/src/main/res/drawable-xxxhdpi/ic_action_rating_bad_selected.pngbin1558 -> 1603 bytes
-rw-r--r--app/src/main/res/drawable-xxxhdpi/ic_action_rating_good.pngbin0 -> 1731 bytes
-rw-r--r--app/src/main/res/drawable-xxxhdpi/ic_action_rating_good_selected.pngbin1695 -> 1650 bytes
-rw-r--r--app/src/main/res/drawable-xxxhdpi/ic_toggle_star.pngbin2798 -> 2986 bytes
-rw-r--r--app/src/main/res/drawable-xxxhdpi/ic_toggle_star_outline.pngbin0 -> 4166 bytes
34 files changed, 139 insertions, 32 deletions
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 576791b2..d33fa527 100644
--- a/app/src/main/java/github/daneren2005/dsub/service/DownloadService.java
+++ b/app/src/main/java/github/daneren2005/dsub/service/DownloadService.java
@@ -103,6 +103,7 @@ public class DownloadService extends Service {
public static final int REWIND = 10000;
private static final double DELETE_CUTOFF = 0.84;
private static final int REQUIRED_ALBUM_MATCHES = 4;
+ private static final int REMOTE_PLAYLIST_TOTAL = 3;
private static final int SHUFFLE_MODE_NONE = 0;
private static final int SHUFFLE_MODE_ALL = 1;
private static final int SHUFFLE_MODE_ARTIST = 2;
@@ -448,10 +449,21 @@ public class DownloadService extends Service {
lifecycleSupport.serializeDownloadQueue();
}
- private void updateRemotePlaylist() {
+ private synchronized void updateRemotePlaylist() {
+ List<DownloadFile> playlist = new ArrayList<>();
+ if(currentPlaying != null) {
+ int index = downloadList.indexOf(currentPlaying);
+ int size = size();
+ int end = index + REMOTE_PLAYLIST_TOTAL;
+ for(int i = index; i < size && i < end; i++) {
+ playlist.add(downloadList.get(i));
+ }
+ }
+
if (remoteState != LOCAL && remoteController != null) {
remoteController.updatePlaylist();
}
+ mRemoteControl.updatePlaylist(playlist);
}
public synchronized void restore(List<MusicDirectory.Entry> songs, List<MusicDirectory.Entry> toDelete, int currentPlayingIndex, int currentPlayingPosition) {
@@ -1026,6 +1038,7 @@ public class DownloadService extends Service {
proxy = null;
}
checkDownloads();
+ updateRemotePlaylist();
}
/** Plays or resumes the playback, depending on the current player state. */
@@ -1762,6 +1775,8 @@ public class DownloadService extends Service {
setPlayerState(PAUSED);
onSongProgress();
}
+
+ updateRemotePlaylist();
}
// Only call when starting, setPlayerState(PAUSED) already calls this
@@ -2604,6 +2619,13 @@ public class DownloadService extends Service {
}
});
}
+
+ handler.post(new Runnable() {
+ @Override
+ public void run() {
+ mRemoteControl.setPlaybackState(playerState.getRemoteControlClientPlayState());
+ }
+ });
}
private void onStateUpdate() {
final long atRevision = revision;
@@ -2631,6 +2653,13 @@ public class DownloadService extends Service {
}
});
}
+
+ handler.post(new Runnable() {
+ @Override
+ public void run() {
+ mRemoteControl.metadataChanged(currentPlaying.getSong());
+ }
+ });
}
private class BufferTask extends SilentBackgroundTask<Void> {
diff --git a/app/src/main/java/github/daneren2005/dsub/util/compat/RemoteControlClientBase.java b/app/src/main/java/github/daneren2005/dsub/util/compat/RemoteControlClientBase.java
index b5987270..1f7035dc 100644
--- a/app/src/main/java/github/daneren2005/dsub/util/compat/RemoteControlClientBase.java
+++ b/app/src/main/java/github/daneren2005/dsub/util/compat/RemoteControlClientBase.java
@@ -1,12 +1,16 @@
package github.daneren2005.dsub.util.compat;
import github.daneren2005.dsub.domain.MusicDirectory;
+import github.daneren2005.dsub.service.DownloadFile;
+
import android.content.ComponentName;
import android.content.Context;
import android.graphics.Bitmap;
import android.support.v7.media.MediaRouter;
import android.os.Build;
+import java.util.List;
+
public abstract class RemoteControlClientBase {
public static RemoteControlClientBase createInstance() {
@@ -25,10 +29,11 @@ public abstract class RemoteControlClientBase {
public abstract void register(final Context context, final ComponentName mediaButtonReceiverComponent);
public abstract void unregister(final Context context);
- public abstract void setPlaybackState(final int state);
- public abstract void updateMetadata(final Context context, final MusicDirectory.Entry currentSong);
+ public abstract void setPlaybackState(int state);
+ public abstract void updateMetadata(Context context, MusicDirectory.Entry currentSong);
+ public abstract void metadataChanged(MusicDirectory.Entry currentSong);
public abstract void updateAlbumArt(MusicDirectory.Entry currentSong, Bitmap bitmap);
public abstract void registerRoute(MediaRouter router);
public abstract void unregisterRoute(MediaRouter router);
-
+ public abstract void updatePlaylist(List<DownloadFile> playlist);
}
diff --git a/app/src/main/java/github/daneren2005/dsub/util/compat/RemoteControlClientICS.java b/app/src/main/java/github/daneren2005/dsub/util/compat/RemoteControlClientICS.java
index 994c23a6..55002c4b 100644
--- a/app/src/main/java/github/daneren2005/dsub/util/compat/RemoteControlClientICS.java
+++ b/app/src/main/java/github/daneren2005/dsub/util/compat/RemoteControlClientICS.java
@@ -1,6 +1,7 @@
package github.daneren2005.dsub.util.compat;
import github.daneren2005.dsub.domain.MusicDirectory;
+import github.daneren2005.dsub.service.DownloadFile;
import github.daneren2005.dsub.service.DownloadService;
import github.daneren2005.dsub.util.ImageLoader;
import android.annotation.TargetApi;
@@ -14,6 +15,8 @@ import android.media.MediaMetadataRetriever;
import android.media.RemoteControlClient;
import android.support.v7.media.MediaRouter;
+import java.util.List;
+
import github.daneren2005.dsub.activity.SubsonicActivity;
@TargetApi(14)
@@ -80,6 +83,11 @@ public class RemoteControlClientICS extends RemoteControlClientBase {
}
@Override
+ public void metadataChanged(MusicDirectory.Entry currentSong) {
+
+ }
+
+ @Override
public void updateAlbumArt(MusicDirectory.Entry currentSong, Bitmap bitmap) {
mRemoteControl.editMetadata(true)
.putBitmap(RemoteControlClient.MetadataEditor.BITMAP_KEY_ARTWORK, bitmap).
@@ -104,6 +112,11 @@ public class RemoteControlClientICS extends RemoteControlClientBase {
router.removeRemoteControlClient(mRemoteControl);
}
+ @Override
+ public void updatePlaylist(List<DownloadFile> playlist) {
+
+ }
+
protected void updateMetadata(final MusicDirectory.Entry currentSong, final RemoteControlClient.MetadataEditor editor) {
editor.putString(MediaMetadataRetriever.METADATA_KEY_ARTIST, (currentSong == null) ? null : currentSong.getArtist())
.putString(MediaMetadataRetriever.METADATA_KEY_ALBUM, (currentSong == null) ? null : currentSong.getAlbum())
diff --git a/app/src/main/java/github/daneren2005/dsub/util/compat/RemoteControlClientLP.java b/app/src/main/java/github/daneren2005/dsub/util/compat/RemoteControlClientLP.java
index e2cbb307..b6a38199 100644
--- a/app/src/main/java/github/daneren2005/dsub/util/compat/RemoteControlClientLP.java
+++ b/app/src/main/java/github/daneren2005/dsub/util/compat/RemoteControlClientLP.java
@@ -25,6 +25,7 @@ import android.content.Context;
import android.content.Intent;
import android.graphics.Bitmap;
import android.media.AudioAttributes;
+import android.media.MediaDescription;
import android.media.MediaMetadata;
import android.media.Rating;
import android.media.RemoteControlClient;
@@ -33,7 +34,9 @@ import android.media.session.PlaybackState;
import android.os.Build;
import android.os.Bundle;
import android.support.v7.media.MediaRouter;
-import android.util.Log;
+
+import java.util.ArrayList;
+import java.util.List;
import github.daneren2005.dsub.R;
import github.daneren2005.dsub.activity.SubsonicActivity;
@@ -43,7 +46,6 @@ import github.daneren2005.dsub.service.DownloadFile;
import github.daneren2005.dsub.service.DownloadService;
import github.daneren2005.dsub.util.Constants;
import github.daneren2005.dsub.util.ImageLoader;
-import github.daneren2005.dsub.util.UpdateHelper;
@TargetApi(Build.VERSION_CODES.LOLLIPOP)
public class RemoteControlClientLP extends RemoteControlClientBase {
@@ -51,10 +53,19 @@ public class RemoteControlClientLP extends RemoteControlClientBase {
private static final String CUSTOM_ACTION_THUMBS_UP = "github.daneren2005.dsub.THUMBS_UP";
private static final String CUSTOM_ACTION_THUMBS_DOWN = "github.daneren2005.dsub.THUMBS_DOWN";
private static final String CUSTOM_ACTION_STAR = "github.daneren2005.dsub.STAR";
+ // Copied from MediaControlConstants so I did not have to include the entire Wear SDK just for these constant
+ private static final String SHOW_ON_WEAR = "android.support.wearable.media.extra.CUSTOM_ACTION_SHOW_ON_WEAR";
+ private static final String WEAR_RESERVE_SKIP_TO_NEXT = "android.support.wearable.media.extra.RESERVE_SLOT_SKIP_TO_NEXT";
+ private static final String WEAR_RESERVE_SKIP_TO_PREVIOUS = "android.support.wearable.media.extra.RESERVE_SLOT_SKIP_TO_PREVIOUS";
+ // These constants don't seem to exist anywhere in the SDK. Grabbed from Google's sample media player app
+ private static final String AUTO_RESERVE_SKIP_TO_NEXT = "com.google.android.gms.car.media.ALWAYS_RESERVE_SPACE_FOR.ACTION_SKIP_TO_NEXT";
+ private static final String AUTO_RESERVE_SKIP_TO_PREVIOUS = "com.google.android.gms.car.media.ALWAYS_RESERVE_SPACE_FOR.ACTION_SKIP_TO_PREVIOUS";
protected MediaSession mediaSession;
protected DownloadService downloadService;
protected ImageLoader imageLoader;
+ protected List<DownloadFile> currentQueue;
+ protected int previousState;
@Override
public void register(Context context, ComponentName mediaButtonReceiverComponent) {
@@ -75,16 +86,19 @@ public class RemoteControlClientLP extends RemoteControlClientBase {
mediaSession.setFlags(MediaSession.FLAG_HANDLES_TRANSPORT_CONTROLS | MediaSession.FLAG_HANDLES_MEDIA_BUTTONS);
mediaSession.setCallback(new EventCallback());
- if(Build.VERSION.SDK_INT > Build.VERSION_CODES.LOLLIPOP_MR1) {
- mediaSession.setRatingType(Rating.RATING_THUMB_UP_DOWN);
- }
-
AudioAttributes.Builder audioAttributesBuilder = new AudioAttributes.Builder();
audioAttributesBuilder.setUsage(AudioAttributes.USAGE_MEDIA)
.setContentType(AudioAttributes.CONTENT_TYPE_MUSIC);
mediaSession.setPlaybackToLocal(audioAttributesBuilder.build());
mediaSession.setActive(true);
+ Bundle sessionExtras = new Bundle();
+ sessionExtras.putBoolean(WEAR_RESERVE_SKIP_TO_PREVIOUS, true);
+ sessionExtras.putBoolean(WEAR_RESERVE_SKIP_TO_NEXT, true);
+ sessionExtras.putBoolean(AUTO_RESERVE_SKIP_TO_PREVIOUS, true);
+ sessionExtras.putBoolean(AUTO_RESERVE_SKIP_TO_NEXT, true);
+ mediaSession.setExtras(sessionExtras);
+
imageLoader = SubsonicActivity.getStaticImageLoader(context);
}
@@ -122,11 +136,14 @@ public class RemoteControlClientLP extends RemoteControlClientBase {
DownloadFile downloadFile = downloadService.getCurrentPlaying();
if(downloadFile != null) {
- addCustomActions(downloadFile.getSong(), builder);
+ MusicDirectory.Entry entry = downloadFile.getSong();
+ addCustomActions(entry, builder);
+ builder.setActiveQueueItemId(entry.getId().hashCode());
}
PlaybackState playbackState = builder.build();
mediaSession.setPlaybackState(playbackState);
+ previousState = state;
}
@Override
@@ -138,6 +155,11 @@ public class RemoteControlClientLP extends RemoteControlClientBase {
}
}
+ @Override
+ public void metadataChanged(MusicDirectory.Entry currentSong) {
+ setPlaybackState(previousState);
+ }
+
public void setMetadata(MusicDirectory.Entry currentSong, Bitmap bitmap) {
MediaMetadata.Builder builder = new MediaMetadata.Builder();
builder.putString(MediaMetadata.METADATA_KEY_ARTIST, (currentSong == null) ? null : currentSong.getArtist())
@@ -150,17 +172,6 @@ public class RemoteControlClientLP extends RemoteControlClientBase {
.putLong(MediaMetadata.METADATA_KEY_DURATION, (currentSong == null) ?
0 : ((currentSong.getDuration() == null) ? 0 : (currentSong.getDuration() * 1000)));
- int userRating = currentSong.getRating();
- Rating rating;
- if(userRating == 1) {
- rating = Rating.newThumbRating(false);
- } else if(userRating == 5) {
- rating = Rating.newThumbRating(true);
- } else {
- rating = Rating.newUnratedRating(Rating.RATING_THUMB_UP_DOWN);
- }
- builder.putRating(MediaMetadata.METADATA_KEY_USER_RATING, rating);
-
if(bitmap != null) {
builder.putBitmap(MediaMetadata.METADATA_KEY_ALBUM_ART, bitmap);
}
@@ -183,31 +194,68 @@ public class RemoteControlClientLP extends RemoteControlClientBase {
router.setMediaSession(null);
}
+ @Override
+ public void updatePlaylist(List<DownloadFile> playlist) {
+ List<MediaSession.QueueItem> queue = new ArrayList<>();
+
+ for(DownloadFile file: playlist) {
+ MusicDirectory.Entry entry = file.getSong();
+
+ MediaDescription description = new MediaDescription.Builder()
+ .setMediaId(entry.getId())
+ .setTitle(entry.getTitle())
+ .setSubtitle(entry.getAlbumDisplay())
+ .build();
+ MediaSession.QueueItem item = new MediaSession.QueueItem(description, entry.getId().hashCode());
+ queue.add(item);
+ }
+
+ mediaSession.setQueue(queue);
+ currentQueue = playlist;
+ }
+
public MediaSession getMediaSession() {
return mediaSession;
}
protected long getPlaybackActions() {
- return PlaybackState.ACTION_PLAY |
+ long actions = PlaybackState.ACTION_PLAY |
PlaybackState.ACTION_PAUSE |
PlaybackState.ACTION_SEEK_TO |
- PlaybackState.ACTION_SKIP_TO_NEXT |
- PlaybackState.ACTION_SKIP_TO_PREVIOUS;
+ PlaybackState.ACTION_SKIP_TO_QUEUE_ITEM;
+
+ int currentIndex = downloadService.getCurrentPlayingIndex();
+ int size = downloadService.size();
+ if(currentIndex > 0) {
+ actions |= PlaybackState.ACTION_SKIP_TO_PREVIOUS;
+ }
+ if(currentIndex < size - 1) {
+ actions |= PlaybackState.ACTION_SKIP_TO_NEXT;
+ }
+
+ return actions;
}
protected void addCustomActions(MusicDirectory.Entry currentSong, PlaybackState.Builder builder) {
+ Bundle showOnWearExtras = new Bundle();
+ showOnWearExtras.putBoolean(SHOW_ON_WEAR, true);
+
+ int rating = currentSong.getRating();
PlaybackState.CustomAction thumbsUp = new PlaybackState.CustomAction.Builder(CUSTOM_ACTION_THUMBS_UP,
- downloadService.getString(R.string.download_thumbs_up),
- R.drawable.ic_action_rating_good_selected).build();
+ downloadService.getString(R.string.download_thumbs_up),
+ rating == 5 ? R.drawable.ic_action_rating_good_selected : R.drawable.ic_action_rating_good)
+ .setExtras(showOnWearExtras).build();
PlaybackState.CustomAction thumbsDown = new PlaybackState.CustomAction.Builder(CUSTOM_ACTION_THUMBS_DOWN,
- downloadService.getString(R.string.download_thumbs_down),
- R.drawable.ic_action_rating_bad_selected).build();
+ downloadService.getString(R.string.download_thumbs_down),
+ rating == 1 ? R.drawable.ic_action_rating_bad_selected : R.drawable.ic_action_rating_bad)
+ .setExtras(showOnWearExtras).build();
PlaybackState.CustomAction star = new PlaybackState.CustomAction.Builder(CUSTOM_ACTION_STAR,
- downloadService.getString(R.string.common_star),
- R.drawable.ic_toggle_star).build();
+ downloadService.getString(R.string.common_star),
+ currentSong.isStarred() ? R.drawable.ic_toggle_star : R.drawable.ic_toggle_star_outline)
+ .setExtras(showOnWearExtras).build();
- builder.addCustomAction(star).addCustomAction(thumbsDown).addCustomAction(thumbsUp);
+ builder.addCustomAction(thumbsDown).addCustomAction(star).addCustomAction(thumbsUp);
}
private class EventCallback extends MediaSession.Callback {
@@ -241,6 +289,18 @@ public class RemoteControlClientLP extends RemoteControlClientBase {
}
@Override
+ public void onSkipToQueueItem(long queueId) {
+ if(currentQueue != null) {
+ for(DownloadFile file: currentQueue) {
+ if(file.getSong().getId().hashCode() == queueId) {
+ downloadService.play(file);
+ return;
+ }
+ }
+ }
+ }
+
+ @Override
public void onCustomAction(String action, Bundle extras) {
if(CUSTOM_ACTION_THUMBS_UP.equals(action)) {
downloadService.toggleRating(5);
diff --git a/app/src/main/res/drawable-hdpi/ic_action_rating_bad.png b/app/src/main/res/drawable-hdpi/ic_action_rating_bad.png
new file mode 100644
index 00000000..7f06020b
--- /dev/null
+++ b/app/src/main/res/drawable-hdpi/ic_action_rating_bad.png
Binary files differ
diff --git a/app/src/main/res/drawable-hdpi/ic_action_rating_bad_selected.png b/app/src/main/res/drawable-hdpi/ic_action_rating_bad_selected.png
index 911eea25..b144900f 100644
--- a/app/src/main/res/drawable-hdpi/ic_action_rating_bad_selected.png
+++ b/app/src/main/res/drawable-hdpi/ic_action_rating_bad_selected.png
Binary files differ
diff --git a/app/src/main/res/drawable-hdpi/ic_action_rating_good.png b/app/src/main/res/drawable-hdpi/ic_action_rating_good.png
new file mode 100644
index 00000000..42640dbb
--- /dev/null
+++ b/app/src/main/res/drawable-hdpi/ic_action_rating_good.png
Binary files differ
diff --git a/app/src/main/res/drawable-hdpi/ic_action_rating_good_selected.png b/app/src/main/res/drawable-hdpi/ic_action_rating_good_selected.png
index 09417791..7096c8c2 100644
--- a/app/src/main/res/drawable-hdpi/ic_action_rating_good_selected.png
+++ b/app/src/main/res/drawable-hdpi/ic_action_rating_good_selected.png
Binary files differ
diff --git a/app/src/main/res/drawable-hdpi/ic_toggle_star.png b/app/src/main/res/drawable-hdpi/ic_toggle_star.png
index f9ef8772..e62e5803 100644
--- a/app/src/main/res/drawable-hdpi/ic_toggle_star.png
+++ b/app/src/main/res/drawable-hdpi/ic_toggle_star.png
Binary files differ
diff --git a/app/src/main/res/drawable-hdpi/ic_toggle_star_outline.png b/app/src/main/res/drawable-hdpi/ic_toggle_star_outline.png
new file mode 100644
index 00000000..fead34b3
--- /dev/null
+++ b/app/src/main/res/drawable-hdpi/ic_toggle_star_outline.png
Binary files differ
diff --git a/app/src/main/res/drawable-mdpi/ic_action_rating_bad.png b/app/src/main/res/drawable-mdpi/ic_action_rating_bad.png
new file mode 100644
index 00000000..6cb87ce9
--- /dev/null
+++ b/app/src/main/res/drawable-mdpi/ic_action_rating_bad.png
Binary files differ
diff --git a/app/src/main/res/drawable-mdpi/ic_action_rating_bad_selected.png b/app/src/main/res/drawable-mdpi/ic_action_rating_bad_selected.png
index ac563748..e96fc42e 100644
--- a/app/src/main/res/drawable-mdpi/ic_action_rating_bad_selected.png
+++ b/app/src/main/res/drawable-mdpi/ic_action_rating_bad_selected.png
Binary files differ
diff --git a/app/src/main/res/drawable-mdpi/ic_action_rating_good.png b/app/src/main/res/drawable-mdpi/ic_action_rating_good.png
new file mode 100644
index 00000000..21ca0f92
--- /dev/null
+++ b/app/src/main/res/drawable-mdpi/ic_action_rating_good.png
Binary files differ
diff --git a/app/src/main/res/drawable-mdpi/ic_action_rating_good_selected.png b/app/src/main/res/drawable-mdpi/ic_action_rating_good_selected.png
index 197aa106..9340e80f 100644
--- a/app/src/main/res/drawable-mdpi/ic_action_rating_good_selected.png
+++ b/app/src/main/res/drawable-mdpi/ic_action_rating_good_selected.png
Binary files differ
diff --git a/app/src/main/res/drawable-mdpi/ic_toggle_star.png b/app/src/main/res/drawable-mdpi/ic_toggle_star.png
index 6d949fd0..570104dc 100644
--- a/app/src/main/res/drawable-mdpi/ic_toggle_star.png
+++ b/app/src/main/res/drawable-mdpi/ic_toggle_star.png
Binary files differ
diff --git a/app/src/main/res/drawable-mdpi/ic_toggle_star_outline.png b/app/src/main/res/drawable-mdpi/ic_toggle_star_outline.png
new file mode 100644
index 00000000..656336d6
--- /dev/null
+++ b/app/src/main/res/drawable-mdpi/ic_toggle_star_outline.png
Binary files differ
diff --git a/app/src/main/res/drawable-xhdpi/ic_action_rating_bad.png b/app/src/main/res/drawable-xhdpi/ic_action_rating_bad.png
new file mode 100644
index 00000000..8d36c8e7
--- /dev/null
+++ b/app/src/main/res/drawable-xhdpi/ic_action_rating_bad.png
Binary files differ
diff --git a/app/src/main/res/drawable-xhdpi/ic_action_rating_bad_selected.png b/app/src/main/res/drawable-xhdpi/ic_action_rating_bad_selected.png
index 98494b1f..a88e9483 100644
--- a/app/src/main/res/drawable-xhdpi/ic_action_rating_bad_selected.png
+++ b/app/src/main/res/drawable-xhdpi/ic_action_rating_bad_selected.png
Binary files differ
diff --git a/app/src/main/res/drawable-xhdpi/ic_action_rating_good.png b/app/src/main/res/drawable-xhdpi/ic_action_rating_good.png
new file mode 100644
index 00000000..88f6a6cb
--- /dev/null
+++ b/app/src/main/res/drawable-xhdpi/ic_action_rating_good.png
Binary files differ
diff --git a/app/src/main/res/drawable-xhdpi/ic_action_rating_good_selected.png b/app/src/main/res/drawable-xhdpi/ic_action_rating_good_selected.png
index f5065d18..5e30e89e 100644
--- a/app/src/main/res/drawable-xhdpi/ic_action_rating_good_selected.png
+++ b/app/src/main/res/drawable-xhdpi/ic_action_rating_good_selected.png
Binary files differ
diff --git a/app/src/main/res/drawable-xhdpi/ic_toggle_star.png b/app/src/main/res/drawable-xhdpi/ic_toggle_star.png
index 5c54298c..7b628888 100644
--- a/app/src/main/res/drawable-xhdpi/ic_toggle_star.png
+++ b/app/src/main/res/drawable-xhdpi/ic_toggle_star.png
Binary files differ
diff --git a/app/src/main/res/drawable-xhdpi/ic_toggle_star_outline.png b/app/src/main/res/drawable-xhdpi/ic_toggle_star_outline.png
new file mode 100644
index 00000000..55a2d40b
--- /dev/null
+++ b/app/src/main/res/drawable-xhdpi/ic_toggle_star_outline.png
Binary files differ
diff --git a/app/src/main/res/drawable-xxhdpi/ic_action_rating_bad.png b/app/src/main/res/drawable-xxhdpi/ic_action_rating_bad.png
new file mode 100644
index 00000000..a09751b7
--- /dev/null
+++ b/app/src/main/res/drawable-xxhdpi/ic_action_rating_bad.png
Binary files differ
diff --git a/app/src/main/res/drawable-xxhdpi/ic_action_rating_bad_selected.png b/app/src/main/res/drawable-xxhdpi/ic_action_rating_bad_selected.png
index 945bb594..5adde418 100644
--- a/app/src/main/res/drawable-xxhdpi/ic_action_rating_bad_selected.png
+++ b/app/src/main/res/drawable-xxhdpi/ic_action_rating_bad_selected.png
Binary files differ
diff --git a/app/src/main/res/drawable-xxhdpi/ic_action_rating_good.png b/app/src/main/res/drawable-xxhdpi/ic_action_rating_good.png
new file mode 100644
index 00000000..7adc2c24
--- /dev/null
+++ b/app/src/main/res/drawable-xxhdpi/ic_action_rating_good.png
Binary files differ
diff --git a/app/src/main/res/drawable-xxhdpi/ic_action_rating_good_selected.png b/app/src/main/res/drawable-xxhdpi/ic_action_rating_good_selected.png
index 273615ea..de797727 100644
--- a/app/src/main/res/drawable-xxhdpi/ic_action_rating_good_selected.png
+++ b/app/src/main/res/drawable-xxhdpi/ic_action_rating_good_selected.png
Binary files differ
diff --git a/app/src/main/res/drawable-xxhdpi/ic_toggle_star.png b/app/src/main/res/drawable-xxhdpi/ic_toggle_star.png
index 4db2a37c..00e7c347 100644
--- a/app/src/main/res/drawable-xxhdpi/ic_toggle_star.png
+++ b/app/src/main/res/drawable-xxhdpi/ic_toggle_star.png
Binary files differ
diff --git a/app/src/main/res/drawable-xxhdpi/ic_toggle_star_outline.png b/app/src/main/res/drawable-xxhdpi/ic_toggle_star_outline.png
new file mode 100644
index 00000000..096ebba7
--- /dev/null
+++ b/app/src/main/res/drawable-xxhdpi/ic_toggle_star_outline.png
Binary files differ
diff --git a/app/src/main/res/drawable-xxxhdpi/ic_action_rating_bad.png b/app/src/main/res/drawable-xxxhdpi/ic_action_rating_bad.png
new file mode 100644
index 00000000..6c358480
--- /dev/null
+++ b/app/src/main/res/drawable-xxxhdpi/ic_action_rating_bad.png
Binary files differ
diff --git a/app/src/main/res/drawable-xxxhdpi/ic_action_rating_bad_selected.png b/app/src/main/res/drawable-xxxhdpi/ic_action_rating_bad_selected.png
index f585ba00..0088b4ef 100644
--- a/app/src/main/res/drawable-xxxhdpi/ic_action_rating_bad_selected.png
+++ b/app/src/main/res/drawable-xxxhdpi/ic_action_rating_bad_selected.png
Binary files differ
diff --git a/app/src/main/res/drawable-xxxhdpi/ic_action_rating_good.png b/app/src/main/res/drawable-xxxhdpi/ic_action_rating_good.png
new file mode 100644
index 00000000..b949b53b
--- /dev/null
+++ b/app/src/main/res/drawable-xxxhdpi/ic_action_rating_good.png
Binary files differ
diff --git a/app/src/main/res/drawable-xxxhdpi/ic_action_rating_good_selected.png b/app/src/main/res/drawable-xxxhdpi/ic_action_rating_good_selected.png
index 9ee267f7..3fca95ef 100644
--- a/app/src/main/res/drawable-xxxhdpi/ic_action_rating_good_selected.png
+++ b/app/src/main/res/drawable-xxxhdpi/ic_action_rating_good_selected.png
Binary files differ
diff --git a/app/src/main/res/drawable-xxxhdpi/ic_toggle_star.png b/app/src/main/res/drawable-xxxhdpi/ic_toggle_star.png
index 6116210d..ce14f384 100644
--- a/app/src/main/res/drawable-xxxhdpi/ic_toggle_star.png
+++ b/app/src/main/res/drawable-xxxhdpi/ic_toggle_star.png
Binary files differ
diff --git a/app/src/main/res/drawable-xxxhdpi/ic_toggle_star_outline.png b/app/src/main/res/drawable-xxxhdpi/ic_toggle_star_outline.png
new file mode 100644
index 00000000..c39bbcf5
--- /dev/null
+++ b/app/src/main/res/drawable-xxxhdpi/ic_toggle_star_outline.png
Binary files differ