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 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 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 @@ + +