From 8503eb4e366862616473463ed41ea6217c219938 Mon Sep 17 00:00:00 2001 From: Karim Abou Zeid Date: Sun, 24 May 2015 20:33:14 +0200 Subject: [PATCH] Prepared everything for multi-selection and implemented it in the song view for now. --- app/build.gradle | 3 +- .../adapter/AbsMultiSelectAdapter.java | 80 ++++++++++++++++++ .../adapter/songadapter/SongAdapter.java | 42 ++++++--- .../gramophone/helper/MusicPlayerRemote.java | 9 ++ .../gramophone/interfaces/CabHolder.java | 11 +++ .../gramophone/loader/AlbumLoader.java | 11 +-- .../gramophone/loader/AlbumSongLoader.java | 7 +- .../gramophone/loader/ArtistAlbumLoader.java | 5 +- .../gramophone/loader/ArtistSongLoader.java | 7 +- .../gramophone/loader/PlaylistSongLoader.java | 7 +- .../gramophone/loader/SongLoader.java | 13 +-- .../com/kabouzeid/gramophone/model/Album.java | 5 +- .../gramophone/model/PlaylistSong.java | 4 +- .../com/kabouzeid/gramophone/model/Song.java | 51 ++++++++++- .../gramophone/service/MusicService.java | 13 +++ .../ui/activities/MainActivity.java | 15 +++- .../AbsMainActivityFragment.java | 5 ++ .../SongViewFragment.java | 2 +- .../drawable-hdpi/ic_delete_white_24dp.png | Bin 0 -> 189 bytes .../ic_playlist_add_white_24dp.png | Bin 0 -> 131 bytes .../res/drawable-hdpi/ic_queue_white_24dp.png | Bin 0 -> 227 bytes .../drawable-mdpi/ic_delete_white_24dp.png | Bin 0 -> 129 bytes .../ic_playlist_add_white_24dp.png | Bin 0 -> 114 bytes .../res/drawable-mdpi/ic_queue_white_24dp.png | Bin 0 -> 164 bytes .../drawable-xhdpi/ic_delete_white_24dp.png | Bin 0 -> 192 bytes .../ic_playlist_add_white_24dp.png | Bin 0 -> 148 bytes .../drawable-xhdpi/ic_queue_white_24dp.png | Bin 0 -> 240 bytes .../drawable-xxhdpi/ic_delete_white_24dp.png | Bin 0 -> 277 bytes .../ic_playlist_add_white_24dp.png | Bin 0 -> 198 bytes .../drawable-xxhdpi/ic_queue_white_24dp.png | Bin 0 -> 349 bytes .../drawable-xxxhdpi/ic_delete_white_24dp.png | Bin 0 -> 353 bytes .../ic_playlist_add_white_24dp.png | Bin 0 -> 246 bytes .../drawable-xxxhdpi/ic_queue_white_24dp.png | Bin 0 -> 444 bytes app/src/main/res/layout/activity_main.xml | 20 ++++- .../main/res/menu/menu_media_selection.xml | 23 +++++ app/src/main/res/values-ar/strings.xml | 65 ++++++++++---- app/src/main/res/values-cs/strings.xml | 2 +- app/src/main/res/values-de/strings.xml | 3 +- app/src/main/res/values-el/strings.xml | 2 +- app/src/main/res/values-es-rES/strings.xml | 2 +- app/src/main/res/values-fr/strings.xml | 16 ++-- app/src/main/res/values-it/strings.xml | 6 +- app/src/main/res/values-ko/strings.xml | 2 +- app/src/main/res/values-nl/strings.xml | 2 +- app/src/main/res/values-pl/strings.xml | 2 +- app/src/main/res/values-pt-rBR/strings.xml | 2 +- app/src/main/res/values-pt-rPT/strings.xml | 2 +- app/src/main/res/values-ro/strings.xml | 2 +- app/src/main/res/values-ru/strings.xml | 2 +- app/src/main/res/values-sv/strings.xml | 2 +- app/src/main/res/values-tr/strings.xml | 2 +- app/src/main/res/values-zh-rCN/strings.xml | 2 +- app/src/main/res/values-zh-rTW/strings.xml | 2 +- app/src/main/res/values/strings.xml | 3 +- app/src/main/res/values/styles.xml | 2 +- 55 files changed, 348 insertions(+), 108 deletions(-) create mode 100644 app/src/main/java/com/kabouzeid/gramophone/adapter/AbsMultiSelectAdapter.java create mode 100644 app/src/main/java/com/kabouzeid/gramophone/interfaces/CabHolder.java create mode 100644 app/src/main/res/drawable-hdpi/ic_delete_white_24dp.png create mode 100644 app/src/main/res/drawable-hdpi/ic_playlist_add_white_24dp.png create mode 100644 app/src/main/res/drawable-hdpi/ic_queue_white_24dp.png create mode 100644 app/src/main/res/drawable-mdpi/ic_delete_white_24dp.png create mode 100644 app/src/main/res/drawable-mdpi/ic_playlist_add_white_24dp.png create mode 100644 app/src/main/res/drawable-mdpi/ic_queue_white_24dp.png create mode 100644 app/src/main/res/drawable-xhdpi/ic_delete_white_24dp.png create mode 100644 app/src/main/res/drawable-xhdpi/ic_playlist_add_white_24dp.png create mode 100644 app/src/main/res/drawable-xhdpi/ic_queue_white_24dp.png create mode 100644 app/src/main/res/drawable-xxhdpi/ic_delete_white_24dp.png create mode 100644 app/src/main/res/drawable-xxhdpi/ic_playlist_add_white_24dp.png create mode 100644 app/src/main/res/drawable-xxhdpi/ic_queue_white_24dp.png create mode 100644 app/src/main/res/drawable-xxxhdpi/ic_delete_white_24dp.png create mode 100644 app/src/main/res/drawable-xxxhdpi/ic_playlist_add_white_24dp.png create mode 100644 app/src/main/res/drawable-xxxhdpi/ic_queue_white_24dp.png create mode 100644 app/src/main/res/menu/menu_media_selection.xml diff --git a/app/build.gradle b/app/build.gradle index 341c5ba1..d81bafc3 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -25,7 +25,7 @@ android { minSdkVersion 16 targetSdkVersion 22 versionCode 26 - versionName "0.9.10.1b" + versionName "0.9.10.1b DEV" } compileOptions { @@ -70,6 +70,7 @@ dependencies { compile 'com.nostra13.universalimageloader:universal-image-loader:1.9.3' compile 'com.afollestad:material-dialogs:0.7.4.2' + compile 'com.afollestad:material-cab:0.1.2' compile 'com.jpardogo.materialtabstrip:library:1.0.9' compile 'com.readystatesoftware.systembartint:systembartint:1.0.3' compile 'com.melnykov:floatingactionbutton:1.3.0' diff --git a/app/src/main/java/com/kabouzeid/gramophone/adapter/AbsMultiSelectAdapter.java b/app/src/main/java/com/kabouzeid/gramophone/adapter/AbsMultiSelectAdapter.java new file mode 100644 index 00000000..dd3383d6 --- /dev/null +++ b/app/src/main/java/com/kabouzeid/gramophone/adapter/AbsMultiSelectAdapter.java @@ -0,0 +1,80 @@ +package com.kabouzeid.gramophone.adapter; + +import android.support.v7.widget.RecyclerView; +import android.view.Menu; +import android.view.MenuItem; + +import com.afollestad.materialcab.MaterialCab; +import com.kabouzeid.gramophone.interfaces.CabHolder; + +import java.util.ArrayList; + +/** + * @author Karim Abou Zeid (kabouzeid) + */ +public abstract class AbsMultiSelectAdapter extends RecyclerView.Adapter implements MaterialCab.Callback { + private final CabHolder cabHolder; + private MaterialCab cab; + private ArrayList checked; + private int menuRes; + + public AbsMultiSelectAdapter(CabHolder cabHolder, int menuRes) { + this.cabHolder = cabHolder; + checked = new ArrayList<>(); + this.menuRes = menuRes; + } + + protected void toggleChecked(final int position) { + if (cabHolder != null) { + openCabIfNecessary(); + if (position > 0) { + I identifier = getIdentifier(position); + if (!checked.remove(identifier)) checked.add(identifier); + notifyItemChanged(position); + } + if (checked.isEmpty()) cab.finish(); + } + } + + private void openCabIfNecessary() { + if (cab == null || !cab.isActive()) { + cab = cabHolder.openCab(menuRes, this); + } + } + + private void uncheckAll() { + checked.clear(); + notifyDataSetChanged(); + } + + protected boolean isChecked(I identifier) { + return checked.contains(identifier); + } + + protected boolean isInQuickSelectMode() { + return cab != null && cab.isActive(); + } + + @Override + public boolean onCabCreated(MaterialCab materialCab, Menu menu) { + return true; + } + + @Override + public boolean onCabItemClicked(MenuItem menuItem) { + onMultipleItemAction(menuItem, new ArrayList<>(checked)); + cab.finish(); + uncheckAll(); + return true; + } + + @Override + public boolean onCabFinished(MaterialCab materialCab) { + uncheckAll(); + return true; + } + + protected abstract I getIdentifier(int position); + + protected abstract void onMultipleItemAction(MenuItem menuItem, ArrayList selection); +} diff --git a/app/src/main/java/com/kabouzeid/gramophone/adapter/songadapter/SongAdapter.java b/app/src/main/java/com/kabouzeid/gramophone/adapter/songadapter/SongAdapter.java index 0a2cb6de..ceb05a2c 100644 --- a/app/src/main/java/com/kabouzeid/gramophone/adapter/songadapter/SongAdapter.java +++ b/app/src/main/java/com/kabouzeid/gramophone/adapter/songadapter/SongAdapter.java @@ -12,11 +12,16 @@ import android.widget.ImageView; import android.widget.PopupMenu; import android.widget.TextView; +import com.afollestad.materialcab.MaterialCab; import com.afollestad.materialdialogs.ThemeSingleton; import com.kabouzeid.gramophone.App; import com.kabouzeid.gramophone.R; +import com.kabouzeid.gramophone.adapter.AbsMultiSelectAdapter; +import com.kabouzeid.gramophone.dialogs.AddToPlaylistDialog; +import com.kabouzeid.gramophone.dialogs.DeleteSongsDialog; import com.kabouzeid.gramophone.helper.MenuItemClickHelper; import com.kabouzeid.gramophone.helper.MusicPlayerRemote; +import com.kabouzeid.gramophone.interfaces.CabHolder; import com.kabouzeid.gramophone.loader.SongLoader; import com.kabouzeid.gramophone.model.DataBaseChangedEvent; import com.kabouzeid.gramophone.model.Song; @@ -28,12 +33,11 @@ import com.nostra13.universalimageloader.core.ImageLoader; import com.squareup.otto.Subscribe; import java.util.ArrayList; -import java.util.HashSet; /** * @author Karim Abou Zeid (kabouzeid) */ -public class SongAdapter extends RecyclerView.Adapter { +public class SongAdapter extends AbsMultiSelectAdapter implements MaterialCab.Callback { public static final String TAG = AlbumSongAdapter.class.getSimpleName(); private static final int SHUFFLE_BUTTON = 0; @@ -41,11 +45,10 @@ public class SongAdapter extends RecyclerView.Adapter { protected final AppCompatActivity activity; protected ArrayList dataSet; - private HashSet checked; - public SongAdapter(AppCompatActivity activity) { + public SongAdapter(AppCompatActivity activity, CabHolder cabHolder) { + super(cabHolder, R.menu.menu_media_selection); this.activity = activity; - checked = new HashSet<>(); loadDataSet(); } @@ -80,7 +83,7 @@ public class SongAdapter extends RecyclerView.Adapter { .resetViewBeforeLoading(true) .build() ); - holder.view.setActivated(checked.contains(song.id)); + holder.view.setActivated(isChecked(song)); } else { holder.songTitle.setText(activity.getResources().getString(R.string.shuffle_all).toUpperCase()); holder.songTitle.setTextColor(ThemeSingleton.get().positiveColor); @@ -101,6 +104,26 @@ public class SongAdapter extends RecyclerView.Adapter { return dataSet.size() + 1; } + @Override + protected Song getIdentifier(int position) { + return dataSet.get(position - 1); + } + + @Override + protected void onMultipleItemAction(MenuItem menuItem, ArrayList selection) { + switch (menuItem.getItemId()) { + case R.id.action_delete_from_disk: + DeleteSongsDialog.create(selection).show(activity.getSupportFragmentManager(), "DELETE_SONGS"); + break; + case R.id.action_add_to_playlist: + AddToPlaylistDialog.create(selection).show(activity.getSupportFragmentManager(), "ADD_PLAYLIST"); + break; + case R.id.action_add_to_current_playing: + MusicPlayerRemote.enqueue(selection); + break; + } + } + public class ViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener, View.OnLongClickListener { final TextView songTitle; final TextView songInfo; @@ -152,6 +175,8 @@ public class SongAdapter extends RecyclerView.Adapter { public void onClick(View v) { if (getItemViewType() == SHUFFLE_BUTTON) { MusicPlayerRemote.shuffleAllSongs(activity); + } else if (isInQuickSelectMode()) { + toggleChecked(getAdapterPosition()); } else { MusicPlayerRemote.openQueue(dataSet, getAdapterPosition() - 1, true); } @@ -164,11 +189,6 @@ public class SongAdapter extends RecyclerView.Adapter { } } - private void toggleChecked(final int position) { - final int id = dataSet.get(position - 1).id; - if (!checked.add(id)) checked.remove(id); - notifyItemChanged(position); - } @Override public void onDetachedFromRecyclerView(RecyclerView recyclerView) { diff --git a/app/src/main/java/com/kabouzeid/gramophone/helper/MusicPlayerRemote.java b/app/src/main/java/com/kabouzeid/gramophone/helper/MusicPlayerRemote.java index fdf19e15..fe62786d 100644 --- a/app/src/main/java/com/kabouzeid/gramophone/helper/MusicPlayerRemote.java +++ b/app/src/main/java/com/kabouzeid/gramophone/helper/MusicPlayerRemote.java @@ -21,6 +21,7 @@ import com.kabouzeid.gramophone.service.MusicService; import com.kabouzeid.gramophone.util.InternalStorageUtil; import java.util.ArrayList; +import java.util.List; import java.util.Random; /** @@ -251,6 +252,14 @@ public class MusicPlayerRemote { } } + public static void enqueue(List songs) { + if (musicService != null) { + musicService.addSongs(songs); + final String toast = songs.size() > 1 ? musicService.getResources().getString(R.string.added_x_titles_to_playing_queue, songs.size()) : musicService.getResources().getString(R.string.added_title_to_playing_queue); + Toast.makeText(musicService, toast, Toast.LENGTH_SHORT).show(); + } + } + public static void removeFromQueue(Song song) { if (musicService != null) { musicService.removeSong(song); diff --git a/app/src/main/java/com/kabouzeid/gramophone/interfaces/CabHolder.java b/app/src/main/java/com/kabouzeid/gramophone/interfaces/CabHolder.java new file mode 100644 index 00000000..cf836d88 --- /dev/null +++ b/app/src/main/java/com/kabouzeid/gramophone/interfaces/CabHolder.java @@ -0,0 +1,11 @@ +package com.kabouzeid.gramophone.interfaces; + +import com.afollestad.materialcab.MaterialCab; + +/** + * @author Karim Abou Zeid (kabouzeid) + */ +public interface CabHolder { + + MaterialCab openCab(final int menuRes, final MaterialCab.Callback callback); +} diff --git a/app/src/main/java/com/kabouzeid/gramophone/loader/AlbumLoader.java b/app/src/main/java/com/kabouzeid/gramophone/loader/AlbumLoader.java index b7a13887..24cdfd55 100644 --- a/app/src/main/java/com/kabouzeid/gramophone/loader/AlbumLoader.java +++ b/app/src/main/java/com/kabouzeid/gramophone/loader/AlbumLoader.java @@ -27,9 +27,8 @@ public class AlbumLoader { final int artistId = cursor.getInt(3); final int songCount = cursor.getInt(4); final int year = cursor.getInt(5); - final String albumArtPath = cursor.getString(6); - final Album album = new Album(id, albumName, artist, artistId, songCount, year, albumArtPath); + final Album album = new Album(id, albumName, artist, artistId, songCount, year); albums.add(album); } while (cursor.moveToNext()); } @@ -58,8 +57,6 @@ public class AlbumLoader { MediaStore.Audio.AlbumColumns.NUMBER_OF_SONGS, /* 5 */ MediaStore.Audio.AlbumColumns.FIRST_YEAR, - /* 6 */ - MediaStore.Audio.AlbumColumns.ALBUM_ART }, selection, values, PreferenceUtils.getInstance(context).getAlbumSortOrder()); } @@ -73,9 +70,8 @@ public class AlbumLoader { final int artistId = cursor.getInt(3); final int songCount = cursor.getInt(4); final int year = cursor.getInt(5); - final String albumArtPath = cursor.getString(6); - album = new Album(id, albumName, artist, artistId, songCount, year, albumArtPath); + album = new Album(id, albumName, artist, artistId, songCount, year); } if (cursor != null) { @@ -95,9 +91,8 @@ public class AlbumLoader { final int artistId = cursor.getInt(3); final int songCount = cursor.getInt(4); final int year = cursor.getInt(5); - final String albumArtPath = cursor.getString(6); - final Album album = new Album(id, albumName, artist, artistId, songCount, year, albumArtPath); + final Album album = new Album(id, albumName, artist, artistId, songCount, year); albums.add(album); } while (cursor.moveToNext()); } diff --git a/app/src/main/java/com/kabouzeid/gramophone/loader/AlbumSongLoader.java b/app/src/main/java/com/kabouzeid/gramophone/loader/AlbumSongLoader.java index a931616c..df5d1d11 100644 --- a/app/src/main/java/com/kabouzeid/gramophone/loader/AlbumSongLoader.java +++ b/app/src/main/java/com/kabouzeid/gramophone/loader/AlbumSongLoader.java @@ -27,9 +27,8 @@ public class AlbumSongLoader { final long duration = cursor.getLong(4); final int trackNumber = cursor.getInt(5); final int artistId = cursor.getInt(6); - final long dateModified = cursor.getInt(7); - final Song song = new Song(id, albumId, artistId, songName, artist, album, duration, trackNumber, dateModified); + final Song song = new Song(id, albumId, artistId, songName, artist, album, duration, trackNumber); songs.add(song); } while (cursor.moveToNext()); } @@ -54,9 +53,7 @@ public class AlbumSongLoader { /* 5 */ MediaStore.Audio.AudioColumns.TRACK, /* 6 */ - MediaStore.Audio.AudioColumns.ARTIST_ID, - /* 7 */ - MediaStore.Audio.AudioColumns.DATE_MODIFIED + MediaStore.Audio.AudioColumns.ARTIST_ID }, (MediaStore.Audio.AudioColumns.IS_MUSIC + "=1") + " AND " + MediaStore.Audio.AudioColumns.TITLE + " != ''" + " AND " + MediaStore.Audio.AudioColumns.ALBUM_ID + "=" + albumId, null, diff --git a/app/src/main/java/com/kabouzeid/gramophone/loader/ArtistAlbumLoader.java b/app/src/main/java/com/kabouzeid/gramophone/loader/ArtistAlbumLoader.java index eaa82d0d..893a53f6 100644 --- a/app/src/main/java/com/kabouzeid/gramophone/loader/ArtistAlbumLoader.java +++ b/app/src/main/java/com/kabouzeid/gramophone/loader/ArtistAlbumLoader.java @@ -26,9 +26,8 @@ public class ArtistAlbumLoader { final String artist = cursor.getString(2); final int songCount = cursor.getInt(3); final int year = cursor.getInt(4); - final String albumArtPath = cursor.getString(5); - final Album album = new Album(id, albumName, artist, artistId, songCount, year, albumArtPath); + final Album album = new Album(id, albumName, artist, artistId, songCount, year); albums.add(album); } while (cursor.moveToNext()); } @@ -51,8 +50,6 @@ public class ArtistAlbumLoader { MediaStore.Audio.AlbumColumns.NUMBER_OF_SONGS, /* 4 */ MediaStore.Audio.AlbumColumns.FIRST_YEAR, - /* 5 */ - MediaStore.Audio.AlbumColumns.ALBUM_ART }, null, null, PreferenceUtils.getInstance(context).getArtistAlbumSortOrder()); } } diff --git a/app/src/main/java/com/kabouzeid/gramophone/loader/ArtistSongLoader.java b/app/src/main/java/com/kabouzeid/gramophone/loader/ArtistSongLoader.java index 3d84ef23..2a68191c 100644 --- a/app/src/main/java/com/kabouzeid/gramophone/loader/ArtistSongLoader.java +++ b/app/src/main/java/com/kabouzeid/gramophone/loader/ArtistSongLoader.java @@ -27,9 +27,8 @@ public class ArtistSongLoader { final long duration = cursor.getLong(4); final int trackNumber = cursor.getInt(5); final int albumId = cursor.getInt(6); - final long dateModified = cursor.getInt(7); - final Song song = new Song(id, albumId, artistId, songName, artist, album, duration, trackNumber, dateModified); + final Song song = new Song(id, albumId, artistId, songName, artist, album, duration, trackNumber); songs.add(song); } while (cursor.moveToNext()); } @@ -54,9 +53,7 @@ public class ArtistSongLoader { /* 5 */ MediaStore.Audio.AudioColumns.TRACK, /* 6 */ - MediaStore.Audio.AudioColumns.ALBUM_ID, - /* 7 */ - MediaStore.Audio.AudioColumns.DATE_MODIFIED + MediaStore.Audio.AudioColumns.ALBUM_ID }, (MediaStore.Audio.AudioColumns.IS_MUSIC + "=1") + " AND " + MediaStore.Audio.AudioColumns.TITLE + " != ''" + " AND " + MediaStore.Audio.AudioColumns.ARTIST_ID + "=" + artistId, null, diff --git a/app/src/main/java/com/kabouzeid/gramophone/loader/PlaylistSongLoader.java b/app/src/main/java/com/kabouzeid/gramophone/loader/PlaylistSongLoader.java index 619daf1e..5b201d99 100644 --- a/app/src/main/java/com/kabouzeid/gramophone/loader/PlaylistSongLoader.java +++ b/app/src/main/java/com/kabouzeid/gramophone/loader/PlaylistSongLoader.java @@ -26,9 +26,8 @@ public class PlaylistSongLoader { final int albumId = cursor.getInt(6); final int artistId = cursor.getInt(7); final int idInPlaylist = cursor.getInt(8); - final long dateModified = cursor.getInt(9); - final PlaylistSong song = new PlaylistSong(id, albumId, artistId, songName, artist, album, duration, trackNumber, playlistID, idInPlaylist, dateModified); + final PlaylistSong song = new PlaylistSong(id, albumId, artistId, songName, artist, album, duration, trackNumber, playlistID, idInPlaylist); songs.add(song); } while (cursor.moveToNext()); @@ -60,9 +59,7 @@ public class PlaylistSongLoader { /* 7 */ AudioColumns.ARTIST_ID, /* 8 */ - MediaStore.Audio.Playlists.Members._ID, - /* 9 */ - MediaStore.Audio.AudioColumns.DATE_MODIFIED + MediaStore.Audio.Playlists.Members._ID }, (AudioColumns.IS_MUSIC + "=1") + " AND " + AudioColumns.TITLE + " != ''", null, MediaStore.Audio.Playlists.Members.DEFAULT_SORT_ORDER); } diff --git a/app/src/main/java/com/kabouzeid/gramophone/loader/SongLoader.java b/app/src/main/java/com/kabouzeid/gramophone/loader/SongLoader.java index 9c7e00b5..0bc8607c 100644 --- a/app/src/main/java/com/kabouzeid/gramophone/loader/SongLoader.java +++ b/app/src/main/java/com/kabouzeid/gramophone/loader/SongLoader.java @@ -30,9 +30,8 @@ public class SongLoader { final int trackNumber = cursor.getInt(5); final int artistId = cursor.getInt(6); final int albumId = cursor.getInt(7); - final long dateModified = cursor.getInt(8); - final Song song = new Song(id, albumId, artistId, songName, artist, album, duration, trackNumber, dateModified); + final Song song = new Song(id, albumId, artistId, songName, artist, album, duration, trackNumber); songs.add(song); } while (cursor.moveToNext()); } @@ -68,9 +67,7 @@ public class SongLoader { /* 6 */ MediaStore.Audio.AudioColumns.ARTIST_ID, /* 7 */ - MediaStore.Audio.AudioColumns.ALBUM_ID, - /* 8 */ - MediaStore.Audio.AudioColumns.DATE_MODIFIED + MediaStore.Audio.AudioColumns.ALBUM_ID }, finalSelection, values, PreferenceUtils.getInstance(context).getSongSortOrder()); } @@ -87,9 +84,8 @@ public class SongLoader { final int trackNumber = cursor.getInt(5); final int artistId = cursor.getInt(6); final int albumId = cursor.getInt(7); - final long dateModified = cursor.getInt(8); - final Song song = new Song(id, albumId, artistId, songName, artist, album, duration, trackNumber, dateModified); + final Song song = new Song(id, albumId, artistId, songName, artist, album, duration, trackNumber); songs.add(song); } while (cursor.moveToNext()); } @@ -111,8 +107,7 @@ public class SongLoader { final int trackNumber = cursor.getInt(5); final int artistId = cursor.getInt(6); final int albumId = cursor.getInt(7); - final long dateModified = cursor.getInt(8); - song = new Song(id, albumId, artistId, songName, artist, album, duration, trackNumber, dateModified); + song = new Song(id, albumId, artistId, songName, artist, album, duration, trackNumber); } if (cursor != null) { cursor.close(); diff --git a/app/src/main/java/com/kabouzeid/gramophone/model/Album.java b/app/src/main/java/com/kabouzeid/gramophone/model/Album.java index b674c284..f3a000d0 100644 --- a/app/src/main/java/com/kabouzeid/gramophone/model/Album.java +++ b/app/src/main/java/com/kabouzeid/gramophone/model/Album.java @@ -11,17 +11,15 @@ public class Album { public final String artistName; public final int songCount; public final int year; - public final String albumArtPath; //used as cache key public Album(final int id, final String title, final String artistName, final int artistId, - final int songNumber, final int albumYear, final String albumArtPath) { + final int songNumber, final int albumYear) { this.id = id; this.title = title; this.artistName = artistName; this.artistId = artistId; songCount = songNumber; year = albumYear; - this.albumArtPath = albumArtPath != null ? albumArtPath : ""; } public Album() { @@ -31,6 +29,5 @@ public class Album { this.artistId = -1; songCount = -1; year = -1; - this.albumArtPath = ""; } } diff --git a/app/src/main/java/com/kabouzeid/gramophone/model/PlaylistSong.java b/app/src/main/java/com/kabouzeid/gramophone/model/PlaylistSong.java index e746a877..2d40c30d 100644 --- a/app/src/main/java/com/kabouzeid/gramophone/model/PlaylistSong.java +++ b/app/src/main/java/com/kabouzeid/gramophone/model/PlaylistSong.java @@ -8,8 +8,8 @@ public class PlaylistSong extends Song { public final int idInPlayList; public PlaylistSong(final int id, final int albumId, final int artistId, final String title, final String artistName, - final String albumName, final long duration, final int trackNumber, final int playlistId, final int idInPlayList, final long dateModified) { - super(id, albumId, artistId, title, artistName, albumName, duration, trackNumber, dateModified); + final String albumName, final long duration, final int trackNumber, final int playlistId, final int idInPlayList) { + super(id, albumId, artistId, title, artistName, albumName, duration, trackNumber); this.playlistId = playlistId; this.idInPlayList = idInPlayList; } diff --git a/app/src/main/java/com/kabouzeid/gramophone/model/Song.java b/app/src/main/java/com/kabouzeid/gramophone/model/Song.java index 4497f70b..4543586d 100644 --- a/app/src/main/java/com/kabouzeid/gramophone/model/Song.java +++ b/app/src/main/java/com/kabouzeid/gramophone/model/Song.java @@ -1,5 +1,7 @@ package com.kabouzeid.gramophone.model; +import android.text.TextUtils; + import java.io.Serializable; /** @@ -17,10 +19,9 @@ public class Song implements Serializable { public final String albumName; public final long duration; public final int trackNumber; - public final long dateModified; //used as cache key public Song(final int id, final int albumId, final int artistId, final String title, final String artistName, - final String albumName, final long duration, final int trackNumber, final long dateModified) { + final String albumName, final long duration, final int trackNumber) { this.id = id; this.albumId = albumId; this.artistId = artistId; @@ -29,7 +30,6 @@ public class Song implements Serializable { this.albumName = albumName; this.duration = duration; this.trackNumber = trackNumber; - this.dateModified = dateModified; } public Song() { @@ -41,6 +41,49 @@ public class Song implements Serializable { this.albumName = ""; this.duration = -1; this.trackNumber = -1; - this.dateModified = -1; + } + + @Override + public int hashCode() { + final int prime = 31; + int result = 1; + result = prime * result + (albumName == null ? 0 : albumName.hashCode()); + result = prime * result + (artistName == null ? 0 : artistName.hashCode()); + result = prime * result + (int) duration; + result = prime * result + id; + result = prime * result + (title == null ? 0 : title.hashCode()); + return result; + } + + @Override + public boolean equals(final Object obj) { + if (this == obj) { + return true; + } + if (obj == null) { + return false; + } + if (getClass() != obj.getClass()) { + return false; + } + final Song other = (Song) obj; + if (id != other.id) { + return false; + } + if (!TextUtils.equals(albumName, other.albumName)) { + return false; + } + if (!TextUtils.equals(artistName, other.artistName)) { + return false; + } + if (duration != other.duration) { + return false; + } + return TextUtils.equals(title, other.title); + } + + @Override + public String toString() { + return title; } } 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 dbabf5e7..53c92f6a 100644 --- a/app/src/main/java/com/kabouzeid/gramophone/service/MusicService.java +++ b/app/src/main/java/com/kabouzeid/gramophone/service/MusicService.java @@ -42,6 +42,7 @@ import com.nostra13.universalimageloader.core.listener.SimpleImageLoadingListene import java.io.IOException; import java.util.ArrayList; +import java.util.List; public class MusicService extends Service implements MediaPlayer.OnPreparedListener, MediaPlayer.OnErrorListener, MediaPlayer.OnCompletionListener, AudioManager.OnAudioFocusChangeListener { public static final String ACTION_TOGGLE_PLAYBACK = "com.kabouzeid.gramophone.action.TOGGLE_PLAYBACK"; @@ -552,6 +553,18 @@ public class MusicService extends Service implements MediaPlayer.OnPreparedListe saveState(); } + public void addSongs(int position, List songs) { + playingQueue.addAll(position, songs); + originalPlayingQueue.addAll(position, songs); + saveState(); + } + + public void addSongs(List songs) { + playingQueue.addAll(songs); + originalPlayingQueue.addAll(songs); + saveState(); + } + public void removeSong(int position) { if (getShuffleMode() == SHUFFLE_MODE_NONE) { playingQueue.remove(position); diff --git a/app/src/main/java/com/kabouzeid/gramophone/ui/activities/MainActivity.java b/app/src/main/java/com/kabouzeid/gramophone/ui/activities/MainActivity.java index 1de1e71e..9c37fb60 100644 --- a/app/src/main/java/com/kabouzeid/gramophone/ui/activities/MainActivity.java +++ b/app/src/main/java/com/kabouzeid/gramophone/ui/activities/MainActivity.java @@ -25,6 +25,7 @@ import android.view.MenuItem; import android.view.SubMenu; import android.widget.FrameLayout; +import com.afollestad.materialcab.MaterialCab; import com.afollestad.materialdialogs.ThemeSingleton; import com.astuetz.PagerSlidingTabStrip; import com.kabouzeid.gramophone.R; @@ -32,6 +33,7 @@ import com.kabouzeid.gramophone.adapter.PagerAdapter; import com.kabouzeid.gramophone.dialogs.AboutDialog; import com.kabouzeid.gramophone.dialogs.CreatePlaylistDialog; import com.kabouzeid.gramophone.helper.MusicPlayerRemote; +import com.kabouzeid.gramophone.interfaces.CabHolder; import com.kabouzeid.gramophone.interfaces.KabViewsDisableAble; import com.kabouzeid.gramophone.loader.AlbumSongLoader; import com.kabouzeid.gramophone.loader.ArtistSongLoader; @@ -57,7 +59,7 @@ import java.util.List; import java.util.Set; public class MainActivity extends AbsFabActivity - implements NavigationDrawerFragment.NavigationDrawerCallbacks, KabViewsDisableAble { + implements NavigationDrawerFragment.NavigationDrawerCallbacks, KabViewsDisableAble, CabHolder { public static final String TAG = MainActivity.class.getSimpleName(); @@ -69,6 +71,7 @@ public class MainActivity extends AbsFabActivity private ViewPager viewPager; private PagerSlidingTabStrip slidingTabLayout; private int currentPage = -1; + private MaterialCab cab; @Override protected void onCreate(Bundle savedInstanceState) { @@ -553,4 +556,14 @@ public class MainActivity extends AbsFabActivity }); return super.onMenuOpened(featureId, menu); } + + @Override + public MaterialCab openCab(final int menu, final MaterialCab.Callback callback) { + if (cab != null) cab.finish(); + cab = new MaterialCab(this, R.id.cab_stub) + .setMenu(menu) + .setBackgroundColor(PreferenceUtils.getInstance(this).getThemeColorPrimary()) + .start(callback); + return cab; + } } \ No newline at end of file diff --git a/app/src/main/java/com/kabouzeid/gramophone/ui/fragments/mainactivityfragments/AbsMainActivityFragment.java b/app/src/main/java/com/kabouzeid/gramophone/ui/fragments/mainactivityfragments/AbsMainActivityFragment.java index 271f8452..0739b3b3 100644 --- a/app/src/main/java/com/kabouzeid/gramophone/ui/fragments/mainactivityfragments/AbsMainActivityFragment.java +++ b/app/src/main/java/com/kabouzeid/gramophone/ui/fragments/mainactivityfragments/AbsMainActivityFragment.java @@ -5,6 +5,7 @@ import android.support.v4.app.Fragment; import com.kabouzeid.gramophone.R; import com.kabouzeid.gramophone.interfaces.KabViewsDisableAble; +import com.kabouzeid.gramophone.ui.activities.MainActivity; import com.kabouzeid.gramophone.util.Util; /** @@ -29,6 +30,10 @@ public abstract class AbsMainActivityFragment extends Fragment implements KabVie return getResources().getDimensionPixelSize(R.dimen.bottom_offset_fab_activity); } + protected MainActivity getMainActivity() { + return (MainActivity) getActivity(); + } + @Override public void enableViews() { areViewsEnabled = true; diff --git a/app/src/main/java/com/kabouzeid/gramophone/ui/fragments/mainactivityfragments/SongViewFragment.java b/app/src/main/java/com/kabouzeid/gramophone/ui/fragments/mainactivityfragments/SongViewFragment.java index 1697b487..9d068485 100644 --- a/app/src/main/java/com/kabouzeid/gramophone/ui/fragments/mainactivityfragments/SongViewFragment.java +++ b/app/src/main/java/com/kabouzeid/gramophone/ui/fragments/mainactivityfragments/SongViewFragment.java @@ -26,6 +26,6 @@ public class SongViewFragment extends AbsMainActivityRecyclerViewFragment { @Override protected RecyclerView.Adapter createAdapter() { - return new SongAdapter((AppCompatActivity) getActivity()); + return new SongAdapter((AppCompatActivity) getActivity(), getMainActivity()); } } diff --git a/app/src/main/res/drawable-hdpi/ic_delete_white_24dp.png b/app/src/main/res/drawable-hdpi/ic_delete_white_24dp.png new file mode 100644 index 0000000000000000000000000000000000000000..5e89821e2af31cfdba2c634963a9da8e16f7d532 GIT binary patch literal 189 zcmeAS@N?(olHy`uVBq!ia0y~yU{C>J4mJh`hKCF@W-u@?w0OEWhE&{odt)PKgMmQn zL+!hc>VoB)d@GYvISM5M~m5?F|;r+Ffe$!`njxgN@xNANa01N literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-hdpi/ic_playlist_add_white_24dp.png b/app/src/main/res/drawable-hdpi/ic_playlist_add_white_24dp.png new file mode 100644 index 0000000000000000000000000000000000000000..e466600ad04d3a83150262b5d9610dba2f3a1f50 GIT binary patch literal 131 zcmeAS@N?(olHy`uVBq!ia0y~yU{C>J4mJh`hKCF@W-u@?czL=whE&{od(DxHL4kw8 z@&EtK>gL2mlg99whq+wSjxFI-P*7NqxL_T739m|4cvvoXhLf{{yJPIyocD~Ynp}8U iz9^mO7krU_fyp|F@xhM!P9+Qs3=E#GelF{r5}E)rLn#{o literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-hdpi/ic_queue_white_24dp.png b/app/src/main/res/drawable-hdpi/ic_queue_white_24dp.png new file mode 100644 index 0000000000000000000000000000000000000000..7efdfab6490c72e54b0dd5d4ef2a616f28cda640 GIT binary patch literal 227 zcmeAS@N?(olHy`uVBq!ia0y~yU{C>J4mJh`hKCF@W-u@?tnzem45_&F_QpZZ0}4E> z0sduc`=)Vn+OYG{_G+kleBDtc@^w2qn6N>*QG$=ig3b9i2a+n`0B3r_~Du3(u;DAkRP9>Lx fPTX%l)9m-4zk6e$`MNC(3=9mOu6{1-oD!M}1|M>sko>|xM zaK{D*#t!*E$65Fn6s1Hu=t}1|M>sko>|xM z@CsJt(@a4JA8bx|a*Xkw!s6AePaYjiW?bp$G^J`+l);zB2~VO7q810XF^X)Ib+f#) SA%TH`fx*+&&t;ucLK6VM*(cHf literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-mdpi/ic_queue_white_24dp.png b/app/src/main/res/drawable-mdpi/ic_queue_white_24dp.png new file mode 100644 index 0000000000000000000000000000000000000000..1aeb991a96dc512c51742fab06af1d40b756eeb9 GIT binary patch literal 164 zcmeAS@N?(olHy`uVBq!ia0y~yV2}V|4mJh`h6m-gKNuJovOQfKLn>}1|M>sko>|xM zutSsp#}WPillkHpH`*JDO-Q!j*`sod$&1ldOkgeB?8e1n6H*yBzO4HYWgvC3`8?C6 zF0K;pxWI%T+(|kg)Hl1ZO1|^%VGUVdkdb##JIh7Oj{5{}@giM`S!=l%^iH2~U*8nX R&A`CG;OXk;vd$@?2>{iqHNXG> literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-xhdpi/ic_delete_white_24dp.png b/app/src/main/res/drawable-xhdpi/ic_delete_white_24dp.png new file mode 100644 index 0000000000000000000000000000000000000000..3c9e171869415b851787451c4478683af11260be GIT binary patch literal 192 zcmeAS@N?(olHy`uVBq!ia0y~yU@!n-4mJh`hH$2z?FYKnR_c<9CW!*yJkVPwy)Gf_O$CqZK5<>LPGz^FfuSOG^j`3_wQrN(7Z2tvFJuM z149Sf1Njanj*le_m|zDp-{DWY*%J&|MEDPcY?ho7pFQb%-WR7c-=}`BFnj7txIRfp8y%*>FVdQ&MBb@03Q!NYXATM literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-xhdpi/ic_playlist_add_white_24dp.png b/app/src/main/res/drawable-xhdpi/ic_playlist_add_white_24dp.png new file mode 100644 index 0000000000000000000000000000000000000000..aa874a65cf7cd139dba248299d1c47065df93b75 GIT binary patch literal 148 zcmeAS@N?(olHy`uVBq!ia0y~yU@!n-4mJh`hH$2z?FYI@UY!F0zH-G~)z3Ir+Y#`A3 zaE@D5wJE#s#W%|ZOVo8=7*F2v|G;glIte%5rkSnNgc%qlrF?-}zb2WhziO_IKj62(!O8&)#PYsXf5RaKP7L)l1h>R)J{t pinEoH3%<;$XF1?$+fdKAhcWGdp%w3?)_Wi$Jzf1=);T3K0RX*4S04ZX literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-xxhdpi/ic_delete_white_24dp.png b/app/src/main/res/drawable-xxhdpi/ic_delete_white_24dp.png new file mode 100644 index 0000000000000000000000000000000000000000..5d2e8ea3b964d302f8490b809af9783495795b09 GIT binary patch literal 277 zcmeAS@N?(olHy`uVBq!ia0y~yVDJE84mJh`hS0a0-5D4d?s&R5hE&{od)tt&$v~tb zQEgANUfhKjmKTq_;Iv>ZT&|0T=vxoxSPjdy(4 phwlDT`6rJ7;x0y}CH;FD3l?;>@W^rmGcYhPc)I$ztaD0e0szq}UHSk3 literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-xxhdpi/ic_playlist_add_white_24dp.png b/app/src/main/res/drawable-xxhdpi/ic_playlist_add_white_24dp.png new file mode 100644 index 0000000000000000000000000000000000000000..82e0ee1f376a47f32f07173d60590deb197a3bf2 GIT binary patch literal 198 zcmeAS@N?(olHy`uVBq!ia0y~yVDJE84mJh`hS0a0-5D4ddOcknLn>~)y>*b2L4k+m z;FtR)YZM;1dmiGreW1qg;E6K~)z2nQ(?7-8O z7=F!o%a@L&j|~4hPMNoKhqv*9(@`Qllg~;2xYoySC1jGOG-={{Mn;7O1||)|1x~@4 zR%cZ{hDHRh)-)B*Ua7^JM3CA?^iY3rZIVEhtr3zjvzSgyZ*4$((S` lFSQb|H&+C!D}2VRbV+Y#{`^_X7#J8BJYD@<);T3K0RYC+ddC0& literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-xxxhdpi/ic_delete_white_24dp.png b/app/src/main/res/drawable-xxxhdpi/ic_delete_white_24dp.png new file mode 100644 index 0000000000000000000000000000000000000000..e7b2514da1696960c89b7e274e469b0f4b9ebcf3 GIT binary patch literal 353 zcmeAS@N?(olHy`uVBq!ia0y~yU`POA4mJh`hDS5XEf^RWH9TD$Ln>~)y>phg$$+6P zF>eP?p=()y@@0wT2X=JEtx!G4yXDJs#me=^YWg?Mxz#FQ^>(@-1A_nq0~3P-0|N&G z10zTBkH5xDH}e1F2u4ZSd$(LWcAoE{ynNJeW(Fj{$e_T$@XB@yBa#^9%my)rd#wHc zS1~?_G&m5$d|+!rLohGH@f$%8e!MQ1%VLO_&BbD|{Dzw70mU-?j6cz9)^k4SHc0(f zz9nb>AG@o1)pw@uoX0u+MsoGp(+@+7@A2JH{3@sCUs|lk0Cq47LjwbYKttIthP5$5 U=Qee>o&veq)78&qol`;+07^w-f&c&j literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-xxxhdpi/ic_playlist_add_white_24dp.png b/app/src/main/res/drawable-xxxhdpi/ic_playlist_add_white_24dp.png new file mode 100644 index 0000000000000000000000000000000000000000..ae4cdc5b84f0492c1e9a3aac3bd016abef216093 GIT binary patch literal 246 zcmeAS@N?(olHy`uVBq!ia0y~yU`POA4mJh`hDS5XEf^RW_IkQFhE&{od;K6Ug8>J# z;kS4zS>_}3|Ln>~)z3Z5DC_sQM zp?q8W#7B|0g~aDA_26H4Wbzf?xcki_yLx7)O!~?8k9p6}CVf7mcV3#-k$STj7#bKD z6c`vhgc_31u6!2vS>yHkvbKH8R#$fOe26O6yS*;4W=Gs2#x2k4r`wdy>@pBPu=B}k zJ+1>ApR7qdHP?Xsz{)3U&vP(*KfMg9sClHdVxLnIz5vjL>A;S7VAnJ&)-b+#RD3@?P3_qa1;td?$XIh&tu=fZGe z*RD^=Uir_MGO}y*J7@h5-Q3Uep}pYNkK-2&?0)`USvyns!T-4z%ud}qc72QPo~*dz z+}}Us*iT~+U|?WjU|?imU}*TkF!T9ORVD}igvbWI1DhBkpZ`o`*z{jCl%pZ%^Pd8S s$Y(znGH$avA1@0DHx32{ri8mcS-JC%{HidGIskICr>mdKI;Vst01^M0@c;k- literal 0 HcmV?d00001 diff --git a/app/src/main/res/layout/activity_main.xml b/app/src/main/res/layout/activity_main.xml index 4386dc78..d47aac85 100644 --- a/app/src/main/res/layout/activity_main.xml +++ b/app/src/main/res/layout/activity_main.xml @@ -20,15 +20,22 @@ android:fitsSystemWindows="true" /> + android:paddingTop="@dimen/main_toolbar_padding_top" + tools:ignore="UnusedAttribute"> - + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/values-ar/strings.xml b/app/src/main/res/values-ar/strings.xml index 2b049b81..a37fbebe 100644 --- a/app/src/main/res/values-ar/strings.xml +++ b/app/src/main/res/values-ar/strings.xml @@ -1,16 +1,17 @@ "الإعدادات" - عنى - يتم التشغيل حالياً - قائمة الانتظار + " عن التطبيق +" + الإستماع الآن + قائمة الإنتظار بحث استمع لاحقاً - أضف إلى قائمة الانتظار + أضف إلى قائمة الإنتظار أزل من قائمة الانتظار أضف إلى قائمة تشغيل... - تعديل معلومات الموسيقى - حذف + تعديل معلومات الملف + حذف نهائي التفاصيل الألبومات الفنانون @@ -27,30 +28,29 @@ النوع فنان الألبوم السنة - الموسيقى + "المقطع " "الموسيقى (٢ للموسيقى ٢ أو ٣٠٠٤ للموسيقى ٤)" حقل نص اسم الألبوم أو اسم الفنان فارغ تتم كتابة الملف يتم حفظ التغييرات... التفاصيل - اسم الملف + إسم الملف مسار الملف الحجم - التنسيق + نوع الملف الطول معدل البت معدل أخذ العينات - اذهب إلى الفنان - اذهب إلى الألبوم - قائمة الانتظار + إذهب إلى الفنان + إذهب إلى الألبوم + قائمة الإنتظار حفظ كقائمة تشغيل - الأيقونة من - "مشغل الموسيقى فونقراف هو برنامج مجاني بشكلٍ كامل بتصميم أنيق من " + الأيقونة من تصميم + "مشغل الموسيقى فونقراف هو برنامج مجاني بشكلٍ كامل بتصميم أنيق من تصميم" بحث لا توجد نتائج تحديث صورة الفنان يتم التحديث... - "تمت الإضافة إلى قائمة الانتظار" حذف من قائمة التشغيل قائمة تشغيل جديدة... عدد قوائم الشبكة @@ -71,14 +71,14 @@ حذف قائمة التشغيل "إضافة إلى قائمة التشغيل" قائمة تشغيل جديدة - "تحذير: لا يمكن التراجع هذه العملية." + "تحذير: لا يمكن التراجع عن هذه العملية." عشوائي آخر ما تم فتحه فاتح داكن المعادل واجهة المستخدم - السمة الأساسية + الثيم العام الصوت عام في أي مشهد يتم تلوين شريط التنقل @@ -93,4 +93,35 @@ مشهد قائمة التشغيل تعديل معلومات الموسيقى في أي مكان + الهوامش السفلية للألبومات ملونة + لا يوجد معدل صوت + "لا يوجد audio id, شغل شيئا وحاول مرة أخرى." + إفتح قائمة التصفح الجانبية + "إغلاق قائمة التصفح الجانبية" + حذف + إعادة التسمية + إختيار + إفتراضي + اللون الأساسي + اللون الثانوي + تحديد الأزرق النيلي كلون ثيم اساسي. + تحديد الوردي كلون ثانوي. + تحديث الصورة + قائمة التشغيل فارغة + لا توجد قوائم تشغيل + إسم قائمة الشغيل + الأغنية + "متوفر في نظام التشغيل Lollipop." + جعل المحتوى الذي يمر تحت شريط الأدوات مرئيا. + "تلوين الهوامش السفلية للألبومات بلون غلاف الألبوم." + "تعذر تحميل صور هذا الألبوم." + البحث في المكتبة... + إعادة تفحص الملفات... + + تحميل من last.fm + اختيار من ذاكرة التخزين الداخلية + بحث في الإنترنات + حذف الغلاف + + "تمت الإضافة إلى قائمة الانتظار" diff --git a/app/src/main/res/values-cs/strings.xml b/app/src/main/res/values-cs/strings.xml index 4649c68c..375c33a0 100644 --- a/app/src/main/res/values-cs/strings.xml +++ b/app/src/main/res/values-cs/strings.xml @@ -50,7 +50,6 @@ Žádné výsledky Změnit obrázek umělce Aktualizace... - "Přidána 1 skladba do fronty." Vymazat z playlistu Nový playlist... Počet sloupců mřížky @@ -120,4 +119,5 @@ Najít na webu Odstranit obal alba + "Přidána 1 skladba do fronty." diff --git a/app/src/main/res/values-de/strings.xml b/app/src/main/res/values-de/strings.xml index 3f40a4ea..25dd5d07 100644 --- a/app/src/main/res/values-de/strings.xml +++ b/app/src/main/res/values-de/strings.xml @@ -50,7 +50,7 @@ Keine Ergebnisse Interpretenbild aktualisieren Aktualisiere... - "1 Titel wurde der Wiedergabeliste hinzugefügt." + %1$d Titel wurden der Wiedergabeliste hinzugefügt. Aus Playlist entfernen Neue Playlist… Rastergröße @@ -120,4 +120,5 @@ Web suche Cover entfernen + "1 Titel wurde der Wiedergabeliste hinzugefügt." diff --git a/app/src/main/res/values-el/strings.xml b/app/src/main/res/values-el/strings.xml index fd24d489..1c20b3bd 100644 --- a/app/src/main/res/values-el/strings.xml +++ b/app/src/main/res/values-el/strings.xml @@ -50,7 +50,6 @@ Κανένα αποτέλεσμα Ανανέωση εικόνας καλλιτέχνη Γίνεται ανανέωση... - "Προστέθηκε ένας τίτλος στη σειρά αναπαραγωγής" Διαγραφή από τη λίστα αναπαραγωγής Νέα λίστα αναπαραγωγής... Στήλες πλέγματος @@ -120,4 +119,5 @@ Αναζήτηση στο διαδίκτυο Διαγραφή εξώφυλλου + "Προστέθηκε ένας τίτλος στη σειρά αναπαραγωγής" diff --git a/app/src/main/res/values-es-rES/strings.xml b/app/src/main/res/values-es-rES/strings.xml index 27773a0a..da0b4500 100644 --- a/app/src/main/res/values-es-rES/strings.xml +++ b/app/src/main/res/values-es-rES/strings.xml @@ -50,7 +50,6 @@ Sin resultados Actualizar imagen del artista Actualizando... - "1 título añadido a la cola de reproducción" Borrar de la lista de reproducción Nueva lista de reproducción... Columnas de la cuadrícula @@ -118,4 +117,5 @@ Busqueda Web Eliminar Carátula + "1 título añadido a la cola de reproducción" diff --git a/app/src/main/res/values-fr/strings.xml b/app/src/main/res/values-fr/strings.xml index 907a03e4..abe8644e 100644 --- a/app/src/main/res/values-fr/strings.xml +++ b/app/src/main/res/values-fr/strings.xml @@ -3,11 +3,11 @@ "Paramètres" À propos Lecture en cours - File de lecture + Liste de lecture Rechercher - Lire ensuite - Ajouter à la file de lecture - Retirer de la file de lecture + Prochaine lecture + Ajouter à la liste de lecture + Retirer de la liste de lecture Ajouter à une playlist... Éditeur d\'infos Supprimer de l\'appareil @@ -31,10 +31,10 @@ "Piste (2 pour piste 2 ou 3004 pour CD3 piste 4)" Veuillez indiquer le nom et l\'artiste de l\'album. Fichier en cours d\'écriture - Sauvegarde des changements... + Sauvegarde en cours... Détails Nom du fichier - Chemin du fichier + Location du fichier Taille Format Durée @@ -45,12 +45,11 @@ File de lecture Sauvegarder Icône par - "Phonograph est un lecteur de musique avec un Material Design et entièrement gratuit créé par" + "Phonograph est un lecteur de musique entièrement gratuit avec le concept de Material Design créé par" Rechercher Aucun résultat Actualiser l\'image de l\'artiste Actualisation... - "1 titre ajouté à la file de lecture." Supprimer de la playlist Nouvelle playlist... Nombre de colonnes @@ -120,4 +119,5 @@ Recherche internet Supprimer la couverture + "1 titre ajouté à la file de lecture." diff --git a/app/src/main/res/values-it/strings.xml b/app/src/main/res/values-it/strings.xml index d3022808..daf59af7 100644 --- a/app/src/main/res/values-it/strings.xml +++ b/app/src/main/res/values-it/strings.xml @@ -12,9 +12,9 @@ Modifica tag Elimina Dettagli - album + Album Artisti - brani + Brani Playlist Niente in riproduzione Spiacenti - si è verificato un errore nel tentativo di riprodurre questa canzone @@ -52,7 +52,6 @@ Nessun risultato Aggiorna immagine artista Aggiornamento... - "Un brano aggiunto alla coda." DettagliAttivitàPlaylist Elimina dalla playlist Nuova playlist... @@ -123,4 +122,5 @@ Cerca nel web Rimuovi copertina + "Un brano aggiunto alla coda." diff --git a/app/src/main/res/values-ko/strings.xml b/app/src/main/res/values-ko/strings.xml index 5267f8a0..72d56453 100644 --- a/app/src/main/res/values-ko/strings.xml +++ b/app/src/main/res/values-ko/strings.xml @@ -50,7 +50,6 @@ 결과 없음 아티스트 이미지 변경 변경 중... - "재생 대기열에 1개의 음악을 추가했습니다." 재생목록에서 삭제 새로운 재생목록... 가로세로 격자 @@ -121,4 +120,5 @@ 인터넷 검색 커버 없애기 + "재생 대기열에 1개의 음악을 추가했습니다." diff --git a/app/src/main/res/values-nl/strings.xml b/app/src/main/res/values-nl/strings.xml index c5e71ea7..a2c818eb 100644 --- a/app/src/main/res/values-nl/strings.xml +++ b/app/src/main/res/values-nl/strings.xml @@ -50,7 +50,6 @@ Geen resultaten Artiest afbeelding bijwerken Bijwerken... - "1 titel toegevoegd aan de afspeelwachtrij." Verwijderen uit afspeellijst Nieuwe afspeellijst... Rasterkolommen @@ -120,4 +119,5 @@ Zoeken op internet Verwijder hoes + "1 titel toegevoegd aan de afspeelwachtrij." diff --git a/app/src/main/res/values-pl/strings.xml b/app/src/main/res/values-pl/strings.xml index e3c05028..f6612073 100644 --- a/app/src/main/res/values-pl/strings.xml +++ b/app/src/main/res/values-pl/strings.xml @@ -52,7 +52,6 @@ Brak wyników Zaktualizuj zdjęcie wykonawcy Aktualizowanie... - "Dodano 1 tytuł do kolejki odtwarzania" Usuń z listy odtwarzania Nowa lista odtwarzania... Siatka kolumn @@ -122,4 +121,5 @@ Szukaj w sieci Usuń okładkę + "Dodano 1 tytuł do kolejki odtwarzania" diff --git a/app/src/main/res/values-pt-rBR/strings.xml b/app/src/main/res/values-pt-rBR/strings.xml index 9aed5cdb..1ba9e656 100644 --- a/app/src/main/res/values-pt-rBR/strings.xml +++ b/app/src/main/res/values-pt-rBR/strings.xml @@ -50,7 +50,6 @@ Sem resultados Atualizar imagem do artista Atualizando... - "1 título adicionado à lista de reprodução" Excluir da playlist Nova playlist... Colunas da grade @@ -120,4 +119,5 @@ Pesquisar na Internet Remover Arte do Album + "1 título adicionado à lista de reprodução" diff --git a/app/src/main/res/values-pt-rPT/strings.xml b/app/src/main/res/values-pt-rPT/strings.xml index 52d6e8e3..c60997c7 100644 --- a/app/src/main/res/values-pt-rPT/strings.xml +++ b/app/src/main/res/values-pt-rPT/strings.xml @@ -49,7 +49,6 @@ Nenhum resultado Atualizar imagem do artista Atualizando... - "Adicionada uma música para a fila atual de músicas." Apagar da playlist Colunas da grade Colunas da grade (Paisagem) @@ -74,4 +73,5 @@ Abrir área de navegação "Fechar área de navegação" Música + "Adicionada uma música para a fila atual de músicas." diff --git a/app/src/main/res/values-ro/strings.xml b/app/src/main/res/values-ro/strings.xml index 9468a11d..738749e9 100644 --- a/app/src/main/res/values-ro/strings.xml +++ b/app/src/main/res/values-ro/strings.xml @@ -49,7 +49,6 @@ Niciun rezultat Actualizează imagine artist Actualizare... - "Adăugat 1 melodie la lista de redare." Şterge din playlist Playlist nou... Rânduri pe grid @@ -99,4 +98,5 @@ Culoare Primară Culoare de accent Melodie + "Adăugat 1 melodie la lista de redare." diff --git a/app/src/main/res/values-ru/strings.xml b/app/src/main/res/values-ru/strings.xml index 471c1808..b13f32bd 100644 --- a/app/src/main/res/values-ru/strings.xml +++ b/app/src/main/res/values-ru/strings.xml @@ -50,7 +50,6 @@ Нет результатов Обновить изображение исполнителя Обновление... - "Добавлена 1 композиция в очередь воспроизведения" Удалить из списка воспроизведения Новый список воспроизведения... Столбцы сетки @@ -120,4 +119,5 @@ Поиск в интернете Удалить обложку + "Добавлена 1 композиция в очередь воспроизведения" diff --git a/app/src/main/res/values-sv/strings.xml b/app/src/main/res/values-sv/strings.xml index 88fef55e..9b0affcd 100644 --- a/app/src/main/res/values-sv/strings.xml +++ b/app/src/main/res/values-sv/strings.xml @@ -50,7 +50,6 @@ Inga resultat Uppdatera artistbild Uppdaterar ... - "Lagt till 1 titel till spellistan." Radera från spellista Ny spellista ... Spellista %1$s skapad @@ -115,4 +114,5 @@ Vill du radera %1$d låtar? Weksök Ta bort omslag + "Lagt till 1 titel till spellistan." diff --git a/app/src/main/res/values-tr/strings.xml b/app/src/main/res/values-tr/strings.xml index e3b216e5..33e3beca 100644 --- a/app/src/main/res/values-tr/strings.xml +++ b/app/src/main/res/values-tr/strings.xml @@ -50,7 +50,6 @@ Sonuç bulunamadı Sanatçı resmini güncelle Güncelleniyor... - "Çalma sırasına 1 başlık eklendi" Çalma listesinden sil Yeni çalma listesi Izgara sütunları @@ -120,4 +119,5 @@ Web\'de ara Albüm Kapağını Kaldır + "Çalma sırasına 1 başlık eklendi" diff --git a/app/src/main/res/values-zh-rCN/strings.xml b/app/src/main/res/values-zh-rCN/strings.xml index 5db100c5..e866a9d4 100644 --- a/app/src/main/res/values-zh-rCN/strings.xml +++ b/app/src/main/res/values-zh-rCN/strings.xml @@ -50,7 +50,6 @@ 没有找到结果 更新歌手图片 正在更新… - "该曲目已加入播放队列" 从播放列表中删除 新建播放列表 专辑列数 @@ -120,4 +119,5 @@ 通过网络搜索 删除封面 + "该曲目已加入播放队列" diff --git a/app/src/main/res/values-zh-rTW/strings.xml b/app/src/main/res/values-zh-rTW/strings.xml index cca45c35..bf78e3b8 100644 --- a/app/src/main/res/values-zh-rTW/strings.xml +++ b/app/src/main/res/values-zh-rTW/strings.xml @@ -50,7 +50,6 @@ 無搜尋結果 更新歌手圖片 更新中… - "這歌曲已加入播放佇列" 從音樂清單移除 新增音樂清單 專輯網格列數 @@ -120,4 +119,5 @@ 網路搜尋 刪除封面 + "這歌曲已加入播放佇列" diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index a3d04136..9e2745d2 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -53,7 +53,8 @@ No results Update artist image Updating… - Added 1 title to the playing queue. + "Added 1 title to the playing queue." + Added %1$d titles to the playing queue. Playlist Activity Delete from playlist New playlist… diff --git a/app/src/main/res/values/styles.xml b/app/src/main/res/values/styles.xml index 3e606a12..56e647d3 100644 --- a/app/src/main/res/values/styles.xml +++ b/app/src/main/res/values/styles.xml @@ -43,7 +43,7 @@