diff --git a/app/src/main/java/com/kabouzeid/gramophone/loader/PlaylistLoader.java b/app/src/main/java/com/kabouzeid/gramophone/loader/PlaylistLoader.java index 7795f1de..5cf652d3 100644 --- a/app/src/main/java/com/kabouzeid/gramophone/loader/PlaylistLoader.java +++ b/app/src/main/java/com/kabouzeid/gramophone/loader/PlaylistLoader.java @@ -27,6 +27,20 @@ public class PlaylistLoader { return playlist; } + public static Playlist getPlaylist(final Context context, final String playlistName) { + Playlist playlist = new Playlist(); + Cursor cursor = makePlaylistCursor(context, PlaylistsColumns.NAME + "=?", new String[]{playlistName}); + + if (cursor != null && cursor.moveToFirst()) { + final int id = cursor.getInt(0); + final String name = cursor.getString(1); + playlist = new Playlist(id, name); + } + if (cursor != null) + cursor.close(); + return playlist; + } + public static List getAllPlaylists(final Context context) { List playlists = new ArrayList<>(); Cursor cursor = makePlaylistCursor(context, null, null); diff --git a/app/src/main/java/com/kabouzeid/gramophone/ui/activities/MusicControllerActivity.java b/app/src/main/java/com/kabouzeid/gramophone/ui/activities/MusicControllerActivity.java index e01d44ed..1b10e6cd 100644 --- a/app/src/main/java/com/kabouzeid/gramophone/ui/activities/MusicControllerActivity.java +++ b/app/src/main/java/com/kabouzeid/gramophone/ui/activities/MusicControllerActivity.java @@ -391,6 +391,7 @@ public class MusicControllerActivity extends AbsFabActivity { setUpAlbumArtAndApplyPalette(); songTotalTime.setText(MusicUtil.getReadableDurationString(song.duration)); songCurrentProgress.setText(MusicUtil.getReadableDurationString(0)); + invalidateOptionsMenu(); } private void setHeadersText() { @@ -548,6 +549,10 @@ public class MusicControllerActivity extends AbsFabActivity { @Override public boolean onCreateOptionsMenu(Menu menu) { getMenuInflater().inflate(R.menu.menu_music_playing, menu); + boolean isFavorite = MusicUtil.isFavorite(this, song); + menu.findItem(R.id.action_toggle_favorite) + .setIcon(isFavorite ? R.drawable.ic_favorite_white_24dp : R.drawable.ic_favorite_outline_white_24dp) + .setTitle(isFavorite ? getString(R.string.action_remove_from_favorites) : getString(R.string.action_add_to_favorites)); return true; } @@ -555,6 +560,10 @@ public class MusicControllerActivity extends AbsFabActivity { public boolean onOptionsItemSelected(MenuItem item) { int id = item.getItemId(); switch (id) { + case R.id.action_toggle_favorite: + MusicUtil.toggleFavorite(this, song); + invalidateOptionsMenu(); + return true; case R.id.action_share: SongShareDialog.create(song.id).show(getSupportFragmentManager(), "SHARE_SONG"); return true; diff --git a/app/src/main/java/com/kabouzeid/gramophone/util/MusicUtil.java b/app/src/main/java/com/kabouzeid/gramophone/util/MusicUtil.java index d0b26754..ca8da482 100644 --- a/app/src/main/java/com/kabouzeid/gramophone/util/MusicUtil.java +++ b/app/src/main/java/com/kabouzeid/gramophone/util/MusicUtil.java @@ -17,10 +17,12 @@ import android.widget.Toast; import com.kabouzeid.gramophone.App; import com.kabouzeid.gramophone.R; import com.kabouzeid.gramophone.helper.MusicPlayerRemote; +import com.kabouzeid.gramophone.loader.PlaylistLoader; import com.kabouzeid.gramophone.loader.SongFilePathLoader; import com.kabouzeid.gramophone.loader.SongLoader; import com.kabouzeid.gramophone.model.Artist; import com.kabouzeid.gramophone.model.DataBaseChangedEvent; +import com.kabouzeid.gramophone.model.Playlist; import com.kabouzeid.gramophone.model.Song; import java.io.File; @@ -190,4 +192,24 @@ public class MusicUtil { Toast.makeText(context, context.getString(R.string.deleted_x_songs, songs.size()), Toast.LENGTH_SHORT).show(); App.bus.post(new DataBaseChangedEvent(DataBaseChangedEvent.DATABASE_CHANGED)); } + + private static Playlist getFavoritesPlaylist(final Context context) { + return PlaylistLoader.getPlaylist(context, context.getString(R.string.favorites)); + } + + private static Playlist getOrCreateFavoritesPlaylist(final Context context) { + return PlaylistLoader.getPlaylist(context, PlaylistsUtil.createPlaylist(context, context.getString(R.string.favorites))); + } + + public static boolean isFavorite(final Context context, final Song song) { + return PlaylistsUtil.doPlaylistContains(context, getFavoritesPlaylist(context).id, song.id); + } + + public static void toggleFavorite(final Context context, final Song song) { + if (isFavorite(context, song)) { + PlaylistsUtil.removeFromPlaylist(context, song, getFavoritesPlaylist(context).id); + } else { + PlaylistsUtil.addToPlaylist(context, song, getOrCreateFavoritesPlaylist(context).id); + } + } } diff --git a/app/src/main/java/com/kabouzeid/gramophone/util/PlaylistsUtil.java b/app/src/main/java/com/kabouzeid/gramophone/util/PlaylistsUtil.java index edafb2ac..c3831de4 100644 --- a/app/src/main/java/com/kabouzeid/gramophone/util/PlaylistsUtil.java +++ b/app/src/main/java/com/kabouzeid/gramophone/util/PlaylistsUtil.java @@ -25,32 +25,36 @@ import java.util.List; public class PlaylistsUtil { public static int createPlaylist(final Context context, final String name) { + int id = -1; if (name != null && name.length() > 0) { - final ContentResolver resolver = context.getContentResolver(); - final String[] projection = new String[]{ - MediaStore.Audio.PlaylistsColumns.NAME - }; - final String selection = MediaStore.Audio.PlaylistsColumns.NAME + " = '" + name + "'"; - Cursor cursor = resolver.query(MediaStore.Audio.Playlists.EXTERNAL_CONTENT_URI, - projection, selection, null, null); - if (cursor.getCount() <= 0) { + Cursor cursor = context.getContentResolver().query(MediaStore.Audio.Playlists.EXTERNAL_CONTENT_URI, + new String[]{MediaStore.Audio.Playlists._ID}, MediaStore.Audio.PlaylistsColumns.NAME + "=?", new String[]{name}, null); + if (cursor == null || cursor.getCount() < 1) { final ContentValues values = new ContentValues(1); values.put(MediaStore.Audio.PlaylistsColumns.NAME, name); - final Uri uri = resolver.insert(MediaStore.Audio.Playlists.EXTERNAL_CONTENT_URI, + final Uri uri = context.getContentResolver().insert( + MediaStore.Audio.Playlists.EXTERNAL_CONTENT_URI, values); - cursor.close(); if (uri != null) { Toast.makeText(context, context.getResources().getString( R.string.created_playlist_x, name), Toast.LENGTH_SHORT).show(); App.bus.post(new DataBaseChangedEvent(DataBaseChangedEvent.PLAYLISTS_CHANGED)); - return Integer.parseInt(uri.getLastPathSegment()); + id = Integer.parseInt(uri.getLastPathSegment()); + } + } else { + if (cursor.moveToFirst()) { + id = cursor.getInt(cursor.getColumnIndex(MediaStore.Audio.Playlists._ID)); } } - cursor.close(); + if (cursor != null) { + cursor.close(); + } } - Toast.makeText(context, context.getResources().getString( - R.string.couldnot_create_playlist_x, name), Toast.LENGTH_SHORT).show(); - return -1; + if (id == -1) { + Toast.makeText(context, context.getResources().getString( + R.string.could_not_create_playlist), Toast.LENGTH_SHORT).show(); + } + return id; } // public static void clearPlaylist(final Context context, final int playlistId) { @@ -81,11 +85,11 @@ public class PlaylistsUtil { App.bus.post(new DataBaseChangedEvent(DataBaseChangedEvent.PLAYLISTS_CHANGED)); } -// public static void addToPlaylist(final Context context, final Song song, final int playlistId) { -// List helperList = new ArrayList<>(); -// helperList.add(song); -// addToPlaylist(context, helperList, playlistId); -// } + public static void addToPlaylist(final Context context, final Song song, final int playlistId) { + List helperList = new ArrayList<>(); + helperList.add(song); + addToPlaylist(context, helperList, playlistId); + } public static void addToPlaylist(final Context context, final List songs, final int playlistId) { final int size = songs.size(); @@ -133,15 +137,15 @@ public class PlaylistsUtil { return contentValues; } -// public static void removeFromPlaylist(final Context context, final PlaylistSong song) { -// Uri uri = MediaStore.Audio.Playlists.Members.getContentUri( -// "external", song.playlistId); -// String selection = MediaStore.Audio.Playlists.Members._ID + " =?"; -// String[] selectionArgs = new String[]{String.valueOf(song.idInPlayList)}; -// -// context.getContentResolver().delete(uri, selection, selectionArgs); -// App.bus.post(new DataBaseChangedEvent(DataBaseChangedEvent.PLAYLISTS_CHANGED)); -// } + public static void removeFromPlaylist(final Context context, final Song song, int playlistId) { + Uri uri = MediaStore.Audio.Playlists.Members.getContentUri( + "external", playlistId); + String selection = MediaStore.Audio.Playlists.Members.AUDIO_ID + " =?"; + String[] selectionArgs = new String[]{String.valueOf(song.id)}; + + context.getContentResolver().delete(uri, selection, selectionArgs); + App.bus.post(new DataBaseChangedEvent(DataBaseChangedEvent.PLAYLISTS_CHANGED)); + } public static void removeFromPlaylist(final Context context, final List songs) { final int playlistId = songs.get(0).playlistId; @@ -158,7 +162,22 @@ public class PlaylistsUtil { context.getContentResolver().delete(uri, selection, selectionArgs); App.bus.post(new DataBaseChangedEvent(DataBaseChangedEvent.PLAYLISTS_CHANGED)); } -// + + public static boolean doPlaylistContains(final Context context, final long playlistId, final int songId) { + if (playlistId != -1) { + Cursor c = context.getContentResolver().query( + MediaStore.Audio.Playlists.Members.getContentUri("external", playlistId), + new String[]{MediaStore.Audio.Playlists.Members.AUDIO_ID}, MediaStore.Audio.Playlists.Members.AUDIO_ID + "=?", new String[]{String.valueOf(songId)}, null); + int count = 0; + if (c != null) { + count = c.getCount(); + c.close(); + } + return count > 0; + } + return false; + } + // public static int getSongCountForPlaylist(final Context context, final long playlistId) { // Cursor c = context.getContentResolver().query( // MediaStore.Audio.Playlists.Members.getContentUri("external", playlistId), diff --git a/app/src/main/res/menu/menu_music_playing.xml b/app/src/main/res/menu/menu_music_playing.xml index 43685615..433d57bd 100644 --- a/app/src/main/res/menu/menu_music_playing.xml +++ b/app/src/main/res/menu/menu_music_playing.xml @@ -1,29 +1,34 @@ + xmlns:app="http://schemas.android.com/apk/res-auto" + xmlns:tools="http://schemas.android.com/tools" + tools:context="com.kabouzeid.gramophone.ui.activities.MusicControllerActivity"> + app:showAsAction="ifRoom" /> + + app:showAsAction="never" /> + app:showAsAction="never" /> + app:showAsAction="never" /> + app:showAsAction="never" /> + app:showAsAction="never" /> + app:showAsAction="never" /> + app:showAsAction="never" /> diff --git a/app/src/main/res/values-ar/strings.xml b/app/src/main/res/values-ar/strings.xml index 0b65eb51..5f824e29 100644 --- a/app/src/main/res/values-ar/strings.xml +++ b/app/src/main/res/values-ar/strings.xml @@ -55,7 +55,7 @@ تم إدراج الأغاني %1$d إلى قائمة التشغيل تم إنشاء قائمة التشغيل %1$s تم حذف قائمة التشغيل %1$s - لا يمكن إنشاء قائمة التشغيل %1$s + لا يمكن إنشاء قائمة التشغيل %1$s %1$s ؟]]> Vytvořen playlist %1$s Playlist %1$s smazán Odstraněno %1$d skladeb - Playlist %1$s nelze vytvořit + Playlist %1$s nelze vytvořit %1$s ?]]> %1$s? Tato operace je nevratná!]]> %1$d playlistů?]]> diff --git a/app/src/main/res/values-de/strings.xml b/app/src/main/res/values-de/strings.xml index c472c67f..700c80f2 100644 --- a/app/src/main/res/values-de/strings.xml +++ b/app/src/main/res/values-de/strings.xml @@ -68,7 +68,7 @@ Wiedergabeliste %1$s erstellt Wiedergabeliste %1$s gelöscht %1$d Titel gelöscht - Wiedergabeliste %1$s konnte nicht erstellt werden + Wiedergabeliste %1$s konnte nicht erstellt werden %1$s löschen?]]> %1$s wirklich leeren?]]> %1$d Wiedergabelisten löschen?]]> diff --git a/app/src/main/res/values-el/strings.xml b/app/src/main/res/values-el/strings.xml index b6f645f2..a5f238a8 100644 --- a/app/src/main/res/values-el/strings.xml +++ b/app/src/main/res/values-el/strings.xml @@ -55,7 +55,7 @@ Προστέθηκαν %1$d τραγούδια σε αυτή τη λίστα αναπαραγωγής Δημιουργήθηκε η λίστα αναπαραγωγής %1$s Διεγράφη η λίστα αναπαραγωγής %1$s - Δεν μπόρεσε να δημιουργηθεί η λίστα αναπαραγωγής %1$s + Δεν μπόρεσε να δημιουργηθεί η λίστα αναπαραγωγής %1$s %1$s;]]> %1$d λίστες αναπαραγωγής; diff --git a/app/src/main/res/values-es-rES/strings.xml b/app/src/main/res/values-es-rES/strings.xml index b3d2b3d3..db264abe 100644 --- a/app/src/main/res/values-es-rES/strings.xml +++ b/app/src/main/res/values-es-rES/strings.xml @@ -68,7 +68,7 @@ Lista de reproducción %1$s creada Lista de reproducción %1$s borrada Borrado las canciones {%1$d} - No se puede crear la lista de reproducción %1$s + No se puede crear la lista de reproducción %1$s %1$s?]]> } {} {%1$s} ? ¡Esto no se puede deshacer!]]> {%1$d} kappaletta lisättiin tähän soittolistaan Soittolista {%1$s} luotu Soittolista {%1$s} poistettu - Soittolistaa {%1$s} ei voitu luoda + Soittolistaa {%1$s} ei voitu luoda }{%1$s}{}?]]> }{%1$s}{}?]]> }{%1$d}{} kappaletta?]]> diff --git a/app/src/main/res/values-fr/strings.xml b/app/src/main/res/values-fr/strings.xml index da75df52..bd4151ff 100644 --- a/app/src/main/res/values-fr/strings.xml +++ b/app/src/main/res/values-fr/strings.xml @@ -68,7 +68,7 @@ La playlist %1$s a été créée. Playlist %1$s supprimée Supprimé %1$d des chansons - Impossible de créer la playlist %1$s. + Impossible de créer la playlist %1$s. %1$s ?]]> %1$s ? Ceci ne peut pas être annulé!]]> %1$d ?]]> diff --git a/app/src/main/res/values-hr/strings.xml b/app/src/main/res/values-hr/strings.xml index cb725c8f..18b9452f 100644 --- a/app/src/main/res/values-hr/strings.xml +++ b/app/src/main/res/values-hr/strings.xml @@ -68,7 +68,7 @@ Stvoren popis pjesama %1$s Obrisan popis pjesama %1$s Obrisano %1$d pjesama - Nije bilo moguće stvoriti popis pjesama %1$s + Nije bilo moguće stvoriti popis pjesama %1$s %1$s?]]> %1$s? Ovaj postupak se ne može poništiti!]]> %1$d?]]> diff --git a/app/src/main/res/values-it/strings.xml b/app/src/main/res/values-it/strings.xml index 148c28ba..2470960a 100644 --- a/app/src/main/res/values-it/strings.xml +++ b/app/src/main/res/values-it/strings.xml @@ -68,7 +68,7 @@ Playlist %1$s creata Playlist %1$s eliminata %1$d brani eliminati - Impossibile creare playlist %1$s + Impossibile creare playlist %1$s %1$s? ]]> %1$s? L\'operazione non può essere annullata!]]> %1$d playlist? ]]> diff --git a/app/src/main/res/values-ko/strings.xml b/app/src/main/res/values-ko/strings.xml index 68dbfc81..cc61a0df 100644 --- a/app/src/main/res/values-ko/strings.xml +++ b/app/src/main/res/values-ko/strings.xml @@ -68,7 +68,7 @@ 재생 목록 \'%1$s\'을 만들었습니다. 재생목록 \'%1$s\'을 삭제했습니다. %1$d개의 노래를 삭제하시겠습니까? - 재생목록 \'%1$s\'을(를) 만들 수 없습니다. + 재생목록 \'%1$s\'을(를) 만들 수 없습니다. %1$s을(를) 삭제하시겠습니까?]]> %1$s을(를) 재생목록에서 삭제하시겠습니까?]]> %1$d을(를) 삭제하시겠습니까?]]> diff --git a/app/src/main/res/values-nl/strings.xml b/app/src/main/res/values-nl/strings.xml index aab31407..0ad66c35 100644 --- a/app/src/main/res/values-nl/strings.xml +++ b/app/src/main/res/values-nl/strings.xml @@ -68,7 +68,7 @@ Afspeellijst %1$s aangemaakt Afspeellijst %1$s verwijderd %1$d nummers verwijderd - Kan afspeellijst %1$s niet aanmaken + Kan afspeellijst %1$s niet aanmaken %1$s verwijderen?]]> %1$s wilt vrijmaken? Dit kan niet ongedaan gemaakt worden!]]> %1$d afspeellijsten verwijderen?]]> diff --git a/app/src/main/res/values-nn/strings.xml b/app/src/main/res/values-nn/strings.xml index 786dcec6..4ab237e4 100644 --- a/app/src/main/res/values-nn/strings.xml +++ b/app/src/main/res/values-nn/strings.xml @@ -55,7 +55,7 @@ Satte inn %1$d songar i denne spelelista. Oppretta speleliste %1$s Sletta speleliste %1$s - Kunne ikkje opprette speleliste %1$s + Kunne ikkje opprette speleliste %1$s %1$s? ]]> diff --git a/app/src/main/res/values-pl/strings.xml b/app/src/main/res/values-pl/strings.xml index aaf4d34c..0b3eb59b 100644 --- a/app/src/main/res/values-pl/strings.xml +++ b/app/src/main/res/values-pl/strings.xml @@ -68,7 +68,7 @@ Utworzono listę odtwarzania %1$s Usunięto listę odtwarzania %1$s Usunięto %1$d utworów - Nie można utworzyć listy odtwarzania %1$s + Nie można utworzyć listy odtwarzania %1$s %1$s?]]> %1$s? Operacja nie może zostać cofnięta!]]> %1$d listy odtwarzania?]]> diff --git a/app/src/main/res/values-pt-rBR/strings.xml b/app/src/main/res/values-pt-rBR/strings.xml index 9963e098..dcc403c2 100644 --- a/app/src/main/res/values-pt-rBR/strings.xml +++ b/app/src/main/res/values-pt-rBR/strings.xml @@ -68,7 +68,7 @@ A playlist %1$s foi criada A playlist %1$s foi excluída %1$d músicas excluidas - Não foi possível criar a playlist %1$s + Não foi possível criar a playlist %1$s %1$s? ]]> %1$s? Isto não pode ser desfeito!]]> %1$d playlists? ]]> diff --git a/app/src/main/res/values-ro/strings.xml b/app/src/main/res/values-ro/strings.xml index f35ae812..eff15101 100644 --- a/app/src/main/res/values-ro/strings.xml +++ b/app/src/main/res/values-ro/strings.xml @@ -54,7 +54,7 @@ Inserate %1$d melodii in playlist Creat playlistul %1$s Șters playlistul %1$s - Nu a putut fi creat playlistul %1$s + Nu a putut fi creat playlistul %1$s %1$s ]]> %1$s ?]]> %1$d melodii ?]]> diff --git a/app/src/main/res/values-ru/strings.xml b/app/src/main/res/values-ru/strings.xml index dbd064e7..49992c8b 100644 --- a/app/src/main/res/values-ru/strings.xml +++ b/app/src/main/res/values-ru/strings.xml @@ -57,7 +57,7 @@ Вставлено %1$d песен в список воспроизведения. Список воспроизведения %1$s создан Список воспроизведения %1$s удалён - Невозможно создать список воспроизведения %1$s + Невозможно создать список воспроизведения %1$s %1$s? ]]> %1$d ? diff --git a/app/src/main/res/values-sv/strings.xml b/app/src/main/res/values-sv/strings.xml index cca48e08..ec7120d9 100644 --- a/app/src/main/res/values-sv/strings.xml +++ b/app/src/main/res/values-sv/strings.xml @@ -51,7 +51,7 @@ Ny spellista ... Spellista %1$s skapad Spellista %1$s raderad - Kunde inte skapa spellistan %1$s + Kunde inte skapa spellistan %1$s %1$s? ]]> diff --git a/app/src/main/res/values-tr/strings.xml b/app/src/main/res/values-tr/strings.xml index 7f72dd5c..e7556ac5 100644 --- a/app/src/main/res/values-tr/strings.xml +++ b/app/src/main/res/values-tr/strings.xml @@ -68,7 +68,7 @@ Çalma listesi %1$s oluşturuldu Çalma listesi %1$s silindi %1$d parça silindi - Çalma listesi %1$s oluşturulamadı + Çalma listesi %1$s oluşturulamadı %1$s çalma listesini silmek istiyor musunuz?]]> %1$s çalma listesini temizlemek istediğinize emin misiniz? Bu geri döndürülemez!]]> %1$d çalma listelerini silmek istiyor musunuz?]]> diff --git a/app/src/main/res/values-zh-rCN/strings.xml b/app/src/main/res/values-zh-rCN/strings.xml index 3b5c2afd..4868997e 100644 --- a/app/src/main/res/values-zh-rCN/strings.xml +++ b/app/src/main/res/values-zh-rCN/strings.xml @@ -68,7 +68,7 @@ 播放列表%1$s已创建 %1$s播放列表已删除 %1$d 首歌曲已删除 - 创建播放列表%1$s失败 + 创建播放列表%1$s失败 %1$s?]]> %1$s吗?该操作不可撤销!]]> %1$d个播放列表?]]> diff --git a/app/src/main/res/values-zh-rTW/strings.xml b/app/src/main/res/values-zh-rTW/strings.xml index 745b942c..a77479d1 100644 --- a/app/src/main/res/values-zh-rTW/strings.xml +++ b/app/src/main/res/values-zh-rTW/strings.xml @@ -62,7 +62,7 @@ %1$d首歌曲已加入該音樂清單 已新增音樂清單%1$s 已刪除音樂清單%1$s - 無法建立音樂清單%1$s + 無法建立音樂清單%1$s %1$s嗎? ]]> diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 69653d43..83899930 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -12,6 +12,8 @@ Now Playing Clear Playlist Playing Queue + Add to favorites + Remove from favorites Search Play Next Play @@ -68,7 +70,7 @@ Created playlist %1$s Deleted playlist %1$s Deleted %1$d songs - Could not create playlist %1$s + Could not create playlist %1$s?]]> %1$s? This cannot be undone!]]> %1$d playlists?]]>