diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml
index ee7d2d366..3754e2219 100644
--- a/app/src/main/AndroidManifest.xml
+++ b/app/src/main/AndroidManifest.xml
@@ -178,6 +178,30 @@
android:name="android.appwidget.provider"
android:resource="@xml/app_widget_classic_info" />
+
+
+
+
+
+
+
+
+
+
+
+
+
+
target; // for cancellation
+
+ public static synchronized AppWidgetBlack getInstance() {
+ if (mInstance == null) {
+ mInstance = new AppWidgetBlack();
+ }
+ return mInstance;
+ }
+
+ /**
+ * Initialize given widgets to default state, where we launch Music on
+ * default click and hide actions if service not running.
+ */
+ protected void defaultAppWidget(final Context context, final int[] appWidgetIds) {
+ final RemoteViews appWidgetView = new RemoteViews(context.getPackageName(), R.layout.app_widget_black);
+
+ appWidgetView.setViewVisibility(R.id.media_titles, View.INVISIBLE);
+ appWidgetView.setImageViewResource(R.id.image, R.drawable.default_album_art);
+ appWidgetView.setImageViewBitmap(R.id.button_next, ImageUtil.createBitmap(ImageUtil.getTintedVectorDrawable(context, R.drawable.ic_skip_next_white_24dp, MaterialValueHelper.getSecondaryTextColor(context, true))));
+ appWidgetView.setImageViewBitmap(R.id.button_prev, ImageUtil.createBitmap(ImageUtil.getTintedVectorDrawable(context, R.drawable.ic_skip_previous_white_24dp, MaterialValueHelper.getSecondaryTextColor(context, true))));
+ appWidgetView.setImageViewBitmap(R.id.button_toggle_play_pause, ImageUtil.createBitmap(ImageUtil.getTintedVectorDrawable(context, R.drawable.ic_play_arrow_white_24dp, MaterialValueHelper.getSecondaryTextColor(context, true))));
+
+ linkButtons(context, appWidgetView);
+ pushUpdate(context, appWidgetIds, appWidgetView);
+ }
+
+ /**
+ * Update all active widget instances by pushing changes
+ */
+ public void performUpdate(final MusicService service, final int[] appWidgetIds) {
+ final RemoteViews appWidgetView = new RemoteViews(service.getPackageName(), R.layout.app_widget_black);
+
+ final boolean isPlaying = service.isPlaying();
+ final Song song = service.getCurrentSong();
+
+ // Set the titles and artwork
+ if (TextUtils.isEmpty(song.title) && TextUtils.isEmpty(song.artistName)) {
+ appWidgetView.setViewVisibility(R.id.media_titles, View.INVISIBLE);
+ } else {
+ appWidgetView.setViewVisibility(R.id.media_titles, View.VISIBLE);
+ appWidgetView.setTextViewText(R.id.title, song.title);
+ appWidgetView.setTextViewText(R.id.text, getSongArtistAndAlbum(song));
+ }
+
+ // Link actions buttons to intents
+ linkButtons(service, appWidgetView);
+
+ if (imageSize == 0)
+ imageSize = service.getResources().getDimensionPixelSize(R.dimen.app_widget_classic_image_size);
+ if (cardRadius == 0f)
+ cardRadius = service.getResources().getDimension(R.dimen.app_widget_card_radius);
+
+ // Load the album cover async and push the update on completion
+ final Context appContext = service.getApplicationContext();
+ service.runOnUiThread(new Runnable() {
+ @Override
+ public void run() {
+ if (target != null) {
+ Glide.clear(target);
+ }
+ target = SongGlideRequest.Builder.from(Glide.with(appContext), song)
+ .checkIgnoreMediaStore(appContext)
+ .generatePalette(service).build()
+ .centerCrop()
+ .into(new SimpleTarget(imageSize, imageSize) {
+ @Override
+ public void onResourceReady(BitmapPaletteWrapper resource, GlideAnimation super BitmapPaletteWrapper> glideAnimation) {
+ Palette palette = resource.getPalette();
+ update(resource.getBitmap(), palette.getVibrantColor(palette.getMutedColor(MaterialValueHelper.getSecondaryTextColor(appContext, true))));
+ }
+
+ @Override
+ public void onLoadFailed(Exception e, Drawable errorDrawable) {
+ super.onLoadFailed(e, errorDrawable);
+ update(null, MaterialValueHelper.getSecondaryTextColor(appContext, true));
+ }
+
+ private void update(@Nullable Bitmap bitmap, int color) {
+ // Set correct drawable for pause state
+ int playPauseRes = isPlaying ? R.drawable.ic_pause_white_24dp : R.drawable.ic_play_arrow_white_24dp;
+ appWidgetView.setImageViewBitmap(R.id.button_toggle_play_pause, ImageUtil.createBitmap(ImageUtil.getTintedVectorDrawable(service, playPauseRes, color)));
+
+ // Set prev/next button drawables
+ appWidgetView.setImageViewBitmap(R.id.button_next, ImageUtil.createBitmap(ImageUtil.getTintedVectorDrawable(service, R.drawable.ic_skip_next_white_24dp, color)));
+ appWidgetView.setImageViewBitmap(R.id.button_prev, ImageUtil.createBitmap(ImageUtil.getTintedVectorDrawable(service, R.drawable.ic_skip_previous_white_24dp, color)));
+
+ final Drawable image = getAlbumArtDrawable(service.getResources(), bitmap);
+ final Bitmap roundedBitmap = createRoundedBitmap(image, imageSize, imageSize, cardRadius, 0, cardRadius, 0);
+ appWidgetView.setImageViewBitmap(R.id.image, roundedBitmap);
+
+ pushUpdate(appContext, appWidgetIds, appWidgetView);
+ }
+ });
+ }
+ });
+ }
+
+ /**
+ * Link up various button actions using {@link PendingIntent}.
+ */
+ private void linkButtons(final Context context, final RemoteViews views) {
+ Intent action;
+ PendingIntent pendingIntent;
+
+ final ComponentName serviceName = new ComponentName(context, MusicService.class);
+
+ // Home
+ action = new Intent(context, MainActivity.class);
+ action.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TOP);
+ pendingIntent = PendingIntent.getActivity(context, 0, action, 0);
+ views.setOnClickPendingIntent(R.id.image, pendingIntent);
+ views.setOnClickPendingIntent(R.id.media_titles, pendingIntent);
+
+ // Previous track
+ pendingIntent = buildPendingIntent(context, MusicService.ACTION_REWIND, serviceName);
+ views.setOnClickPendingIntent(R.id.button_prev, pendingIntent);
+
+ // Play and pause
+ pendingIntent = buildPendingIntent(context, MusicService.ACTION_TOGGLE_PAUSE, serviceName);
+ views.setOnClickPendingIntent(R.id.button_toggle_play_pause, pendingIntent);
+
+ // Next track
+ pendingIntent = buildPendingIntent(context, MusicService.ACTION_SKIP, serviceName);
+ views.setOnClickPendingIntent(R.id.button_next, pendingIntent);
+ }
+}
diff --git a/app/src/main/java/com/kabouzeid/gramophone/appwidgets/AppWidgetClassicBlack.java b/app/src/main/java/com/kabouzeid/gramophone/appwidgets/AppWidgetClassicBlack.java
new file mode 100644
index 000000000..c381e0011
--- /dev/null
+++ b/app/src/main/java/com/kabouzeid/gramophone/appwidgets/AppWidgetClassicBlack.java
@@ -0,0 +1,162 @@
+package com.kabouzeid.gramophone.appwidgets;
+
+import android.app.PendingIntent;
+import android.content.ComponentName;
+import android.content.Context;
+import android.content.Intent;
+import android.graphics.Bitmap;
+import android.graphics.drawable.Drawable;
+
+import androidx.annotation.Nullable;
+import androidx.palette.graphics.Palette;
+
+import android.text.TextUtils;
+import android.view.View;
+import android.widget.RemoteViews;
+
+import com.bumptech.glide.Glide;
+import com.bumptech.glide.request.animation.GlideAnimation;
+import com.bumptech.glide.request.target.SimpleTarget;
+import com.bumptech.glide.request.target.Target;
+import com.kabouzeid.appthemehelper.util.MaterialValueHelper;
+import com.kabouzeid.gramophone.R;
+import com.kabouzeid.gramophone.appwidgets.base.BaseAppWidget;
+import com.kabouzeid.gramophone.glide.SongGlideRequest;
+import com.kabouzeid.gramophone.glide.palette.BitmapPaletteWrapper;
+import com.kabouzeid.gramophone.model.Song;
+import com.kabouzeid.gramophone.service.MusicService;
+import com.kabouzeid.gramophone.ui.activities.MainActivity;
+import com.kabouzeid.gramophone.util.ImageUtil;
+
+public class AppWidgetClassicBlack extends BaseAppWidget {
+ public static final String NAME = "app_widget_classic_black";
+
+ private static AppWidgetClassicBlack mInstance;
+ private static int imageSize = 0;
+ private static float cardRadius = 0f;
+ private Target target; // for cancellation
+
+ public static synchronized AppWidgetClassicBlack getInstance() {
+ if (mInstance == null) {
+ mInstance = new AppWidgetClassicBlack();
+ }
+ return mInstance;
+ }
+
+ /**
+ * Initialize given widgets to default state, where we launch Music on
+ * default click and hide actions if service not running.
+ */
+ protected void defaultAppWidget(final Context context, final int[] appWidgetIds) {
+ final RemoteViews appWidgetView = new RemoteViews(context.getPackageName(), R.layout.app_widget_classic_black);
+
+ appWidgetView.setViewVisibility(R.id.media_titles, View.INVISIBLE);
+ appWidgetView.setImageViewResource(R.id.image, R.drawable.default_album_art);
+ appWidgetView.setImageViewBitmap(R.id.button_next, ImageUtil.createBitmap(ImageUtil.getTintedVectorDrawable(context, R.drawable.ic_skip_next_white_24dp, MaterialValueHelper.getSecondaryTextColor(context, true))));
+ appWidgetView.setImageViewBitmap(R.id.button_prev, ImageUtil.createBitmap(ImageUtil.getTintedVectorDrawable(context, R.drawable.ic_skip_previous_white_24dp, MaterialValueHelper.getSecondaryTextColor(context, true))));
+ appWidgetView.setImageViewBitmap(R.id.button_toggle_play_pause, ImageUtil.createBitmap(ImageUtil.getTintedVectorDrawable(context, R.drawable.ic_play_arrow_white_24dp, MaterialValueHelper.getSecondaryTextColor(context, true))));
+
+ linkButtons(context, appWidgetView);
+ pushUpdate(context, appWidgetIds, appWidgetView);
+ }
+
+ /**
+ * Update all active widget instances by pushing changes
+ */
+ public void performUpdate(final MusicService service, final int[] appWidgetIds) {
+ final RemoteViews appWidgetView = new RemoteViews(service.getPackageName(), R.layout.app_widget_classic_black);
+
+ final boolean isPlaying = service.isPlaying();
+ final Song song = service.getCurrentSong();
+
+ // Set the titles and artwork
+ if (TextUtils.isEmpty(song.title) && TextUtils.isEmpty(song.artistName)) {
+ appWidgetView.setViewVisibility(R.id.media_titles, View.INVISIBLE);
+ } else {
+ appWidgetView.setViewVisibility(R.id.media_titles, View.VISIBLE);
+ appWidgetView.setTextViewText(R.id.title, song.title);
+ appWidgetView.setTextViewText(R.id.text, getSongArtistAndAlbum(song));
+ }
+
+ // Link actions buttons to intents
+ linkButtons(service, appWidgetView);
+
+ if (imageSize == 0)
+ imageSize = service.getResources().getDimensionPixelSize(R.dimen.app_widget_classic_image_size);
+ if (cardRadius == 0f)
+ cardRadius = service.getResources().getDimension(R.dimen.app_widget_card_radius);
+
+ // Load the album cover async and push the update on completion
+ final Context appContext = service.getApplicationContext();
+ service.runOnUiThread(new Runnable() {
+ @Override
+ public void run() {
+ if (target != null) {
+ Glide.clear(target);
+ }
+ target = SongGlideRequest.Builder.from(Glide.with(appContext), song)
+ .checkIgnoreMediaStore(appContext)
+ .generatePalette(service).build()
+ .centerCrop()
+ .into(new SimpleTarget(imageSize, imageSize) {
+ @Override
+ public void onResourceReady(BitmapPaletteWrapper resource, GlideAnimation super BitmapPaletteWrapper> glideAnimation) {
+ Palette palette = resource.getPalette();
+ update(resource.getBitmap(), palette.getVibrantColor(palette.getMutedColor(MaterialValueHelper.getSecondaryTextColor(appContext, true))));
+ }
+
+ @Override
+ public void onLoadFailed(Exception e, Drawable errorDrawable) {
+ super.onLoadFailed(e, errorDrawable);
+ update(null, MaterialValueHelper.getSecondaryTextColor(appContext, true));
+ }
+
+ private void update(@Nullable Bitmap bitmap, int color) {
+ // Set correct drawable for pause state
+ int playPauseRes = isPlaying ? R.drawable.ic_pause_white_24dp : R.drawable.ic_play_arrow_white_24dp;
+ appWidgetView.setImageViewBitmap(R.id.button_toggle_play_pause, ImageUtil.createBitmap(ImageUtil.getTintedVectorDrawable(service, playPauseRes, color)));
+
+ // Set prev/next button drawables
+ appWidgetView.setImageViewBitmap(R.id.button_next, ImageUtil.createBitmap(ImageUtil.getTintedVectorDrawable(service, R.drawable.ic_skip_next_white_24dp, color)));
+ appWidgetView.setImageViewBitmap(R.id.button_prev, ImageUtil.createBitmap(ImageUtil.getTintedVectorDrawable(service, R.drawable.ic_skip_previous_white_24dp, color)));
+
+ final Drawable image = getAlbumArtDrawable(service.getResources(), bitmap);
+ final Bitmap roundedBitmap = createRoundedBitmap(image, imageSize, imageSize, cardRadius, 0, cardRadius, 0);
+ appWidgetView.setImageViewBitmap(R.id.image, roundedBitmap);
+
+ pushUpdate(appContext, appWidgetIds, appWidgetView);
+ }
+ });
+ }
+ });
+ }
+
+ /**
+ * Link up various button actions using {@link PendingIntent}.
+ */
+ private void linkButtons(final Context context, final RemoteViews views) {
+ Intent action;
+ PendingIntent pendingIntent;
+
+ final ComponentName serviceName = new ComponentName(context, MusicService.class);
+
+ // Home
+ action = new Intent(context, MainActivity.class);
+ action.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TOP);
+ pendingIntent = PendingIntent.getActivity(context, 0, action, 0);
+ views.setOnClickPendingIntent(R.id.image, pendingIntent);
+ views.setOnClickPendingIntent(R.id.media_titles, pendingIntent);
+
+ // Previous track
+ pendingIntent = buildPendingIntent(context, MusicService.ACTION_REWIND, serviceName);
+ views.setOnClickPendingIntent(R.id.button_prev, pendingIntent);
+
+ // Play and pause
+ pendingIntent = buildPendingIntent(context, MusicService.ACTION_TOGGLE_PAUSE, serviceName);
+ views.setOnClickPendingIntent(R.id.button_toggle_play_pause, pendingIntent);
+
+ // Next track
+ pendingIntent = buildPendingIntent(context, MusicService.ACTION_SKIP, serviceName);
+ views.setOnClickPendingIntent(R.id.button_next, pendingIntent);
+ }
+}
diff --git a/app/src/main/java/com/kabouzeid/gramophone/dialogs/AddToPlaylistDialog.java b/app/src/main/java/com/kabouzeid/gramophone/dialogs/AddToPlaylistDialog.java
index ae081804a..aed0123f5 100644
--- a/app/src/main/java/com/kabouzeid/gramophone/dialogs/AddToPlaylistDialog.java
+++ b/app/src/main/java/com/kabouzeid/gramophone/dialogs/AddToPlaylistDialog.java
@@ -5,6 +5,7 @@
import androidx.annotation.NonNull;
import androidx.fragment.app.DialogFragment;
+import android.widget.Toast;
import com.afollestad.materialdialogs.MaterialDialog;
import com.kabouzeid.gramophone.R;
import com.kabouzeid.gramophone.loader.PlaylistLoader;
@@ -57,9 +58,32 @@ public Dialog onCreateDialog(Bundle savedInstanceState) {
CreatePlaylistDialog.create(songs).show(getActivity().getSupportFragmentManager(), "ADD_TO_PLAYLIST");
} else {
materialDialog.dismiss();
- PlaylistsUtil.addToPlaylist(getActivity(), songs, playlists.get(i - 1).id, true);
+ ArrayList updatedSongs = getNotExistingSongs(songs, playlists.get(i - 1).id);
+ if (updatedSongs.size() > 0 ){
+ PlaylistsUtil.addToPlaylist(getActivity(), updatedSongs, playlists.get(i - 1).id, true);
+ }else {
+ Toast.makeText(getActivity(), " Inserted "+updatedSongs.size()+" songs ins to the Playlist", Toast.LENGTH_SHORT).show();
+ }
}
})
.build();
}
+
+ /**
+ * getNotExistingSongs helps get rid of songs that already exxist in a playlist,
+ * returns a list of songs
+ * @param songs list of songs to be added to playlist
+ * @param playlistId playlist Id
+ */
+ private ArrayList getNotExistingSongs(ArrayList songs, int playlistId ){
+ ArrayList newSongsList = new ArrayList<>();
+ if (songs.size()>0){
+ for (Song song : songs){
+ if (!PlaylistsUtil.doPlaylistContains(getActivity(), playlistId, song.id)){
+ newSongsList.add(song);
+ }
+ }
+ }
+ return newSongsList;
+ }
}
diff --git a/app/src/main/java/com/kabouzeid/gramophone/service/MusicService.java b/app/src/main/java/com/kabouzeid/gramophone/service/MusicService.java
index 0566f0088..342744ecf 100644
--- a/app/src/main/java/com/kabouzeid/gramophone/service/MusicService.java
+++ b/app/src/main/java/com/kabouzeid/gramophone/service/MusicService.java
@@ -27,13 +27,14 @@
import android.os.Process;
import android.preference.PreferenceManager;
import android.provider.MediaStore;
-import androidx.annotation.NonNull;
-import androidx.annotation.Nullable;
import android.support.v4.media.MediaMetadataCompat;
import android.support.v4.media.session.MediaSessionCompat;
import android.support.v4.media.session.PlaybackStateCompat;
import android.widget.Toast;
+import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
+
import com.bumptech.glide.BitmapRequestBuilder;
import com.bumptech.glide.Glide;
import com.bumptech.glide.request.animation.GlideAnimation;
@@ -42,6 +43,8 @@
import com.kabouzeid.gramophone.appwidgets.AppWidgetBig;
import com.kabouzeid.gramophone.appwidgets.AppWidgetCard;
import com.kabouzeid.gramophone.appwidgets.AppWidgetClassic;
+import com.kabouzeid.gramophone.appwidgets.AppWidgetClassicBlack;
+import com.kabouzeid.gramophone.appwidgets.AppWidgetBlack;
import com.kabouzeid.gramophone.appwidgets.AppWidgetSmall;
import com.kabouzeid.gramophone.glide.BlurTransformation;
import com.kabouzeid.gramophone.glide.SongGlideRequest;
@@ -130,12 +133,14 @@ public class MusicService extends Service implements SharedPreferences.OnSharedP
private AppWidgetBig appWidgetBig = AppWidgetBig.getInstance();
private AppWidgetClassic appWidgetClassic = AppWidgetClassic.getInstance();
+ private AppWidgetClassicBlack appWidgetClassicBlack = AppWidgetClassicBlack.getInstance();
+ private AppWidgetBlack appWidgetBlack = AppWidgetBlack.getInstance();
private AppWidgetSmall appWidgetSmall = AppWidgetSmall.getInstance();
private AppWidgetCard appWidgetCard = AppWidgetCard.getInstance();
private Playback playback;
- private ArrayList playingQueue = new ArrayList<>();
- private ArrayList originalPlayingQueue = new ArrayList<>();
+ private List playingQueue = new ArrayList<>();
+ private List originalPlayingQueue = new ArrayList<>();
private int position = -1;
private int nextPosition = -1;
private int shuffleMode;
@@ -275,8 +280,7 @@ public boolean onMediaButtonEvent(Intent mediaButtonEvent) {
}
});
- mediaSession.setFlags(MediaSession.FLAG_HANDLES_TRANSPORT_CONTROLS
- | MediaSession.FLAG_HANDLES_MEDIA_BUTTONS);
+ mediaSession.setFlags(MediaSession.FLAG_HANDLES_TRANSPORT_CONTROLS | MediaSession.FLAG_HANDLES_MEDIA_BUTTONS);
mediaSession.setMediaButtonReceiver(mediaButtonReceiverPendingIntent);
}
@@ -305,12 +309,12 @@ public int onStartCommand(@Nullable Intent intent, int flags, int startId) {
Playlist playlist = intent.getParcelableExtra(INTENT_EXTRA_PLAYLIST);
int shuffleMode = intent.getIntExtra(INTENT_EXTRA_SHUFFLE_MODE, getShuffleMode());
if (playlist != null) {
- ArrayList playlistSongs;
+ List playlistSongs;
if (playlist instanceof AbsCustomPlaylist) {
playlistSongs = ((AbsCustomPlaylist) playlist).getSongs(getApplicationContext());
} else {
//noinspection unchecked
- playlistSongs = (ArrayList) (List) PlaylistSongLoader.getPlaylistSongList(getApplicationContext(), playlist.id);
+ playlistSongs = (List) PlaylistSongLoader.getPlaylistSongList(getApplicationContext(), playlist.id);
}
if (!playlistSongs.isEmpty()) {
if (shuffleMode == SHUFFLE_MODE_SHUFFLE) {
@@ -428,8 +432,8 @@ private void restoreState() {
private synchronized void restoreQueuesAndPositionIfNecessary() {
if (!queuesRestored && playingQueue.isEmpty()) {
- ArrayList restoredQueue = MusicPlaybackQueueStore.getInstance(this).getSavedPlayingQueue();
- ArrayList restoredOriginalQueue = MusicPlaybackQueueStore.getInstance(this).getSavedOriginalPlayingQueue();
+ List restoredQueue = MusicPlaybackQueueStore.getInstance(this).getSavedPlayingQueue();
+ List restoredOriginalQueue = MusicPlaybackQueueStore.getInstance(this).getSavedOriginalPlayingQueue();
int restoredPosition = PreferenceManager.getDefaultSharedPreferences(this).getInt(SAVED_POSITION, -1);
int restoredPositionInTrack = PreferenceManager.getDefaultSharedPreferences(this).getInt(SAVED_POSITION_IN_TRACK, -1);
@@ -677,7 +681,7 @@ private boolean isLastTrack() {
return getPosition() == getPlayingQueue().size() - 1;
}
- public ArrayList getPlayingQueue() {
+ public List getPlayingQueue() {
return playingQueue;
}
@@ -700,7 +704,7 @@ public void setRepeatMode(final int repeatMode) {
}
}
- public void openQueue(@Nullable final ArrayList playingQueue, final int startPosition, final boolean startPlaying) {
+ public void openQueue(@Nullable final List playingQueue, final int startPosition, final boolean startPlaying) {
if (playingQueue != null && !playingQueue.isEmpty() && startPosition >= 0 && startPosition < playingQueue.size()) {
// it is important to copy the playing queue here first as we might add/remove songs later
originalPlayingQueue = new ArrayList<>(playingQueue);
@@ -869,7 +873,7 @@ public void play() {
}
}
- public void playSongs(ArrayList songs, int shuffleMode) {
+ public void playSongs(List songs, int shuffleMode) {
if (songs != null && !songs.isEmpty()) {
if (shuffleMode == SHUFFLE_MODE_SHUFFLE) {
int startPosition = 0;
@@ -1042,6 +1046,8 @@ private void sendChangeInternal(final String what) {
sendBroadcast(new Intent(what));
appWidgetBig.notifyChange(this, what);
appWidgetClassic.notifyChange(this, what);
+ appWidgetClassicBlack.notifyChange(this, what);
+ appWidgetBlack.notifyChange(this, what);
appWidgetSmall.notifyChange(this, what);
appWidgetCard.notifyChange(this, what);
}
@@ -1292,6 +1298,14 @@ public void onReceive(final Context context, final Intent intent) {
appWidgetClassic.performUpdate(MusicService.this, ids);
break;
}
+ case AppWidgetClassicBlack.NAME: {
+ appWidgetClassicBlack.performUpdate(MusicService.this, ids);
+ break;
+ }
+ case AppWidgetBlack.NAME: {
+ appWidgetBlack.performUpdate(MusicService.this, ids);
+ break;
+ }
case AppWidgetSmall.NAME: {
appWidgetSmall.performUpdate(MusicService.this, ids);
break;
diff --git a/app/src/main/res/drawable/app_widget_black.png b/app/src/main/res/drawable/app_widget_black.png
new file mode 100644
index 000000000..32649dd03
Binary files /dev/null and b/app/src/main/res/drawable/app_widget_black.png differ
diff --git a/app/src/main/res/drawable/app_widget_classic_black.png b/app/src/main/res/drawable/app_widget_classic_black.png
new file mode 100644
index 000000000..85dac8c9f
Binary files /dev/null and b/app/src/main/res/drawable/app_widget_classic_black.png differ
diff --git a/app/src/main/res/drawable/card_black.xml b/app/src/main/res/drawable/card_black.xml
new file mode 100644
index 000000000..63d3314ff
--- /dev/null
+++ b/app/src/main/res/drawable/card_black.xml
@@ -0,0 +1,22 @@
+
+
+
+ -
+
+
+
+
+
+
+ -
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/app_widget_black.xml b/app/src/main/res/layout/app_widget_black.xml
new file mode 100644
index 000000000..226321f37
--- /dev/null
+++ b/app/src/main/res/layout/app_widget_black.xml
@@ -0,0 +1,107 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/app_widget_classic_black.xml b/app/src/main/res/layout/app_widget_classic_black.xml
new file mode 100644
index 000000000..aa3e3384b
--- /dev/null
+++ b/app/src/main/res/layout/app_widget_classic_black.xml
@@ -0,0 +1,104 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml
index b3a2cd4a2..6704f6298 100644
--- a/app/src/main/res/values/strings.xml
+++ b/app/src/main/res/values/strings.xml
@@ -245,6 +245,8 @@
%s is the new start directory.
Phonograph - Big
Phonograph - Classic
+ Phonograph - Classic Black
+ Phonograph - Black
Phonograph - Small
Phonograph - Card
Report an issue
diff --git a/app/src/main/res/xml/app_widget_black_info.xml b/app/src/main/res/xml/app_widget_black_info.xml
new file mode 100644
index 000000000..f4260c1c7
--- /dev/null
+++ b/app/src/main/res/xml/app_widget_black_info.xml
@@ -0,0 +1,11 @@
+
+
diff --git a/app/src/main/res/xml/app_widget_classic_black_info.xml b/app/src/main/res/xml/app_widget_classic_black_info.xml
new file mode 100644
index 000000000..263073301
--- /dev/null
+++ b/app/src/main/res/xml/app_widget_classic_black_info.xml
@@ -0,0 +1,11 @@
+
+