From b6034f748403665e6fcf0982cade59e959ddce52 Mon Sep 17 00:00:00 2001 From: Martin Disch Date: Sun, 27 May 2018 12:49:20 +0200 Subject: [PATCH 1/2] Add playlist export item to options menu --- .../ui/fragments/mainactivity/library/LibraryFragment.java | 4 ++++ app/src/main/res/values/ids.xml | 1 + app/src/main/res/values/strings.xml | 1 + 3 files changed, 6 insertions(+) diff --git a/app/src/main/java/com/kabouzeid/gramophone/ui/fragments/mainactivity/library/LibraryFragment.java b/app/src/main/java/com/kabouzeid/gramophone/ui/fragments/mainactivity/library/LibraryFragment.java index 6991be37..50704c79 100644 --- a/app/src/main/java/com/kabouzeid/gramophone/ui/fragments/mainactivity/library/LibraryFragment.java +++ b/app/src/main/java/com/kabouzeid/gramophone/ui/fragments/mainactivity/library/LibraryFragment.java @@ -188,6 +188,7 @@ public class LibraryFragment extends AbsMainActivityFragment implements CabHolde inflater.inflate(R.menu.menu_main, menu); if (isPlaylistPage()) { menu.add(0, R.id.action_new_playlist, 0, R.string.new_playlist_title); + menu.add(0, R.id.action_export_playlists, 1, R.string.export_playlists); } Fragment currentFragment = getCurrentFragment(); if (currentFragment instanceof AbsLibraryPagerRecyclerViewCustomGridSizeFragment && currentFragment.isAdded()) { @@ -248,6 +249,9 @@ public class LibraryFragment extends AbsMainActivityFragment implements CabHolde case R.id.action_new_playlist: CreatePlaylistDialog.create().show(getChildFragmentManager(), "CREATE_PLAYLIST"); return true; + case R.id.action_export_playlists: + // TODO + return true; case R.id.action_search: startActivity(new Intent(getActivity(), SearchActivity.class)); return true; diff --git a/app/src/main/res/values/ids.xml b/app/src/main/res/values/ids.xml index ef5fe97a..5234dceb 100644 --- a/app/src/main/res/values/ids.xml +++ b/app/src/main/res/values/ids.xml @@ -1,6 +1,7 @@ + diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 1e0f4f5f..972e064c 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -182,6 +182,7 @@ Sleep timer set for %d minutes from now. New playlist… New playlist + Export playlists 1 2 3 From 614f28e0c9dd12f809ac61728791983c9c40bbe8 Mon Sep 17 00:00:00 2001 From: Karim Abou Zeid Date: Tue, 5 Jun 2018 22:45:29 +0200 Subject: [PATCH 2/2] Clean up --- .../gramophone/adapter/PlaylistAdapter.java | 50 ++++++++++++++++ .../adapter/album/AlbumAdapter.java | 2 +- .../adapter/album/HorizontalAlbumAdapter.java | 7 +-- .../adapter/base/AbsMultiSelectAdapter.java | 49 ++++++++++----- .../adapter/song/AbsOffsetSongAdapter.java | 6 +- .../song/OrderablePlaylistSongAdapter.java | 2 +- .../adapter/song/PlaylistSongAdapter.java | 2 +- .../gramophone/adapter/song/SongAdapter.java | 2 +- .../audiocover/AudioFileCoverFetcher.java | 2 +- .../helper/menu/PlaylistMenuHelper.java | 59 +++++++++---------- .../gramophone/misc/DialogAsyncTask.java | 11 +--- .../gramophone/misc/WeakContextAsyncTask.java | 23 ++++++++ .../ui/activities/AlbumDetailActivity.java | 2 +- .../mainactivity/library/LibraryFragment.java | 4 -- .../kabouzeid/gramophone/util/MusicUtil.java | 5 ++ .../res/drawable/ic_select_all_white_24dp.xml | 10 ++++ ..._single_songs_playlist_songs_selection.xml | 12 +++- .../main/res/menu/menu_media_selection.xml | 14 +++-- .../res/menu/menu_playlists_selection.xml | 20 +++++-- .../menu/menu_playlists_songs_selection.xml | 14 +++-- app/src/main/res/values/ids.xml | 3 +- app/src/main/res/values/strings.xml | 5 +- fastlane/Fastfile | 5 ++ 23 files changed, 220 insertions(+), 89 deletions(-) create mode 100644 app/src/main/java/com/kabouzeid/gramophone/misc/WeakContextAsyncTask.java create mode 100644 app/src/main/res/drawable/ic_select_all_white_24dp.xml diff --git a/app/src/main/java/com/kabouzeid/gramophone/adapter/PlaylistAdapter.java b/app/src/main/java/com/kabouzeid/gramophone/adapter/PlaylistAdapter.java index c37b966e..79cade53 100644 --- a/app/src/main/java/com/kabouzeid/gramophone/adapter/PlaylistAdapter.java +++ b/app/src/main/java/com/kabouzeid/gramophone/adapter/PlaylistAdapter.java @@ -1,5 +1,6 @@ package com.kabouzeid.gramophone.adapter; +import android.content.Context; import android.graphics.PorterDuff; import android.os.Build; import android.support.annotation.LayoutRes; @@ -11,8 +12,10 @@ import android.view.MenuItem; import android.view.View; import android.view.ViewGroup; import android.widget.PopupMenu; +import android.widget.Toast; import com.kabouzeid.appthemehelper.util.ATHUtil; +import com.kabouzeid.gramophone.App; import com.kabouzeid.gramophone.R; import com.kabouzeid.gramophone.adapter.base.AbsMultiSelectAdapter; import com.kabouzeid.gramophone.adapter.base.MediaEntryViewHolder; @@ -22,6 +25,7 @@ import com.kabouzeid.gramophone.helper.menu.PlaylistMenuHelper; import com.kabouzeid.gramophone.helper.menu.SongsMenuHelper; import com.kabouzeid.gramophone.interfaces.CabHolder; import com.kabouzeid.gramophone.loader.PlaylistSongLoader; +import com.kabouzeid.gramophone.misc.WeakContextAsyncTask; import com.kabouzeid.gramophone.model.AbsCustomPlaylist; import com.kabouzeid.gramophone.model.Playlist; import com.kabouzeid.gramophone.model.Song; @@ -29,7 +33,9 @@ import com.kabouzeid.gramophone.model.smartplaylist.AbsSmartPlaylist; import com.kabouzeid.gramophone.model.smartplaylist.LastAddedPlaylist; import com.kabouzeid.gramophone.util.MusicUtil; import com.kabouzeid.gramophone.util.NavigationUtil; +import com.kabouzeid.gramophone.util.PlaylistsUtil; +import java.io.IOException; import java.util.ArrayList; import java.util.List; @@ -149,12 +155,56 @@ public class PlaylistAdapter extends AbsMultiSelectAdapter, String, String> { + public SavePlaylistsAsyncTask(Context context) { + super(context); + } + + @Override + protected String doInBackground(ArrayList... params) { + int successes = 0; + int failures = 0; + + String dir = ""; + + for (Playlist playlist : params[0]) { + try { + dir = PlaylistsUtil.savePlaylist(App.getInstance().getApplicationContext(), playlist).getParent(); + successes++; + } catch (IOException e) { + failures++; + e.printStackTrace(); + } + } + + return failures == 0 + ? String.format(App.getInstance().getApplicationContext().getString(R.string.saved_x_playlists_to_x), successes, dir) + : String.format(App.getInstance().getApplicationContext().getString(R.string.saved_x_playlists_to_x_failed_to_save_x), successes, dir, failures); + } + + @Override + protected void onPostExecute(String string) { + super.onPostExecute(string); + Context context = getContext(); + if (context != null) { + Toast.makeText(context, string, Toast.LENGTH_LONG).show(); + } + } + } + @NonNull private ArrayList getSongList(@NonNull List playlists) { final ArrayList songs = new ArrayList<>(); diff --git a/app/src/main/java/com/kabouzeid/gramophone/adapter/album/AlbumAdapter.java b/app/src/main/java/com/kabouzeid/gramophone/adapter/album/AlbumAdapter.java index e4a7f33d..5a2bab70 100644 --- a/app/src/main/java/com/kabouzeid/gramophone/adapter/album/AlbumAdapter.java +++ b/app/src/main/java/com/kabouzeid/gramophone/adapter/album/AlbumAdapter.java @@ -198,7 +198,7 @@ public class AlbumAdapter extends AbsMultiSelectAdapter 0) { - return String.valueOf(year); - } - return "-"; + return MusicUtil.getYearString(album.getYear()); } @Override diff --git a/app/src/main/java/com/kabouzeid/gramophone/adapter/base/AbsMultiSelectAdapter.java b/app/src/main/java/com/kabouzeid/gramophone/adapter/base/AbsMultiSelectAdapter.java index f7e15b8d..8e15e94a 100644 --- a/app/src/main/java/com/kabouzeid/gramophone/adapter/base/AbsMultiSelectAdapter.java +++ b/app/src/main/java/com/kabouzeid/gramophone/adapter/base/AbsMultiSelectAdapter.java @@ -31,37 +31,51 @@ public abstract class AbsMultiSelectAdapter 1) cab.setTitle(context.getString(R.string.x_selected, size)); - + updateCab(); return true; } return false; } - private void openCabIfNecessary() { + protected void checkAll() { + if (cabHolder != null) { + checked.clear(); + for (int i = 0; i < getItemCount(); i++) { + I identifier = getIdentifier(i); + if (identifier != null) { + checked.add(identifier); + } + } + notifyDataSetChanged(); + updateCab(); + } + } + + private void updateCab() { if (cabHolder != null) { if (cab == null || !cab.isActive()) { cab = cabHolder.openCab(menuRes, this); } + final int size = checked.size(); + if (size <= 0) cab.finish(); + else if (size == 1) cab.setTitle(getName(checked.get(0))); + else cab.setTitle(context.getString(R.string.x_selected, size)); } } - private void unCheckAll() { + private void clearChecked() { checked.clear(); notifyDataSetChanged(); } @@ -81,15 +95,19 @@ public abstract class AbsMultiSelectAdapter(checked)); - cab.finish(); - unCheckAll(); + if (menuItem.getItemId() == R.id.action_multi_select_adapter_check_all) { + checkAll(); + } else { + onMultipleItemAction(menuItem, new ArrayList<>(checked)); + cab.finish(); + clearChecked(); + } return true; } @Override public boolean onCabFinished(MaterialCab materialCab) { - unCheckAll(); + clearChecked(); return true; } @@ -97,6 +115,7 @@ public abstract class AbsMultiSelectAdapter selection); diff --git a/app/src/main/java/com/kabouzeid/gramophone/adapter/song/AbsOffsetSongAdapter.java b/app/src/main/java/com/kabouzeid/gramophone/adapter/song/AbsOffsetSongAdapter.java index b75170dd..a0bb21d8 100644 --- a/app/src/main/java/com/kabouzeid/gramophone/adapter/song/AbsOffsetSongAdapter.java +++ b/app/src/main/java/com/kabouzeid/gramophone/adapter/song/AbsOffsetSongAdapter.java @@ -53,10 +53,11 @@ public abstract class AbsOffsetSongAdapter extends SongAdapter { return super.getItemId(position); } + @Nullable @Override protected Song getIdentifier(int position) { position--; - if (position < 0) return Song.EMPTY_SONG; + if (position < 0) return null; return super.getIdentifier(position); } @@ -87,7 +88,8 @@ public abstract class AbsOffsetSongAdapter extends SongAdapter { @Override protected Song getSong() { - if (getItemViewType() == OFFSET_ITEM) return Song.EMPTY_SONG; + if (getItemViewType() == OFFSET_ITEM) + return Song.EMPTY_SONG; // could also return null, just to be safe return empty song return dataSet.get(getAdapterPosition() - 1); } diff --git a/app/src/main/java/com/kabouzeid/gramophone/adapter/song/OrderablePlaylistSongAdapter.java b/app/src/main/java/com/kabouzeid/gramophone/adapter/song/OrderablePlaylistSongAdapter.java index 18d14167..353af458 100644 --- a/app/src/main/java/com/kabouzeid/gramophone/adapter/song/OrderablePlaylistSongAdapter.java +++ b/app/src/main/java/com/kabouzeid/gramophone/adapter/song/OrderablePlaylistSongAdapter.java @@ -33,7 +33,7 @@ public class OrderablePlaylistSongAdapter extends PlaylistSongAdapter implements public OrderablePlaylistSongAdapter(@NonNull AppCompatActivity activity, @NonNull ArrayList dataSet, @LayoutRes int itemLayoutRes, boolean usePalette, @Nullable CabHolder cabHolder, @Nullable OnMoveItemListener onMoveItemListener) { super(activity, (ArrayList) (List) dataSet, itemLayoutRes, usePalette, cabHolder); - overrideMultiSelectMenuRes(R.menu.menu_playlists_songs_selection); + setMultiSelectMenuRes(R.menu.menu_playlists_songs_selection); this.onMoveItemListener = onMoveItemListener; } diff --git a/app/src/main/java/com/kabouzeid/gramophone/adapter/song/PlaylistSongAdapter.java b/app/src/main/java/com/kabouzeid/gramophone/adapter/song/PlaylistSongAdapter.java index 938221f4..40785c07 100644 --- a/app/src/main/java/com/kabouzeid/gramophone/adapter/song/PlaylistSongAdapter.java +++ b/app/src/main/java/com/kabouzeid/gramophone/adapter/song/PlaylistSongAdapter.java @@ -26,7 +26,7 @@ public class PlaylistSongAdapter extends AbsOffsetSongAdapter { public PlaylistSongAdapter(AppCompatActivity activity, @NonNull ArrayList dataSet, @LayoutRes int itemLayoutRes, boolean usePalette, @Nullable CabHolder cabHolder) { super(activity, dataSet, itemLayoutRes, usePalette, cabHolder, false); - overrideMultiSelectMenuRes(R.menu.menu_cannot_delete_single_songs_playlist_songs_selection); + setMultiSelectMenuRes(R.menu.menu_cannot_delete_single_songs_playlist_songs_selection); } @Override diff --git a/app/src/main/java/com/kabouzeid/gramophone/adapter/song/SongAdapter.java b/app/src/main/java/com/kabouzeid/gramophone/adapter/song/SongAdapter.java index 1faa6f07..af6878e0 100644 --- a/app/src/main/java/com/kabouzeid/gramophone/adapter/song/SongAdapter.java +++ b/app/src/main/java/com/kabouzeid/gramophone/adapter/song/SongAdapter.java @@ -203,7 +203,7 @@ public class SongAdapter extends AbsMultiSelectAdapter { } } - private static final String[] FALLBACKS = {"cover.jpg", "album.jpg", "folder.jpg"}; + private static final String[] FALLBACKS = {"cover.jpg", "album.jpg", "folder.jpg", "cover.png", "album.png", "folder.png"}; private InputStream fallback(String path) throws FileNotFoundException { File parent = new File(path).getParentFile(); diff --git a/app/src/main/java/com/kabouzeid/gramophone/helper/menu/PlaylistMenuHelper.java b/app/src/main/java/com/kabouzeid/gramophone/helper/menu/PlaylistMenuHelper.java index 7b405085..c32fb56b 100644 --- a/app/src/main/java/com/kabouzeid/gramophone/helper/menu/PlaylistMenuHelper.java +++ b/app/src/main/java/com/kabouzeid/gramophone/helper/menu/PlaylistMenuHelper.java @@ -1,20 +1,20 @@ package com.kabouzeid.gramophone.helper.menu; -import android.annotation.SuppressLint; import android.app.Activity; import android.content.Context; -import android.os.AsyncTask; import android.support.annotation.NonNull; import android.support.v7.app.AppCompatActivity; import android.view.MenuItem; import android.widget.Toast; +import com.kabouzeid.gramophone.App; import com.kabouzeid.gramophone.R; import com.kabouzeid.gramophone.dialogs.AddToPlaylistDialog; import com.kabouzeid.gramophone.dialogs.DeletePlaylistDialog; import com.kabouzeid.gramophone.dialogs.RenamePlaylistDialog; import com.kabouzeid.gramophone.helper.MusicPlayerRemote; import com.kabouzeid.gramophone.loader.PlaylistSongLoader; +import com.kabouzeid.gramophone.misc.WeakContextAsyncTask; import com.kabouzeid.gramophone.model.AbsCustomPlaylist; import com.kabouzeid.gramophone.model.Playlist; import com.kabouzeid.gramophone.model.Song; @@ -48,34 +48,7 @@ public class PlaylistMenuHelper { DeletePlaylistDialog.create(playlist).show(activity.getSupportFragmentManager(), "DELETE_PLAYLIST"); return true; case R.id.action_save_playlist: - @SuppressLint("ShowToast") - final Toast toast = Toast.makeText(activity, R.string.saving_to_file, Toast.LENGTH_SHORT); - new AsyncTask() { - @Override - protected void onPreExecute() { - super.onPreExecute(); - toast.show(); - } - - @Override - protected String doInBackground(Context... params) { - try { - return String.format(params[0].getString(R.string.saved_playlist_to), PlaylistsUtil.savePlaylist(params[0], playlist)); - } catch (IOException e) { - e.printStackTrace(); - return String.format(params[0].getString(R.string.failed_to_save_playlist), e); - } - } - - @Override - protected void onPostExecute(String string) { - super.onPostExecute(string); - if (toast != null) { - toast.setText(string); - toast.show(); - } - } - }.execute(activity.getApplicationContext()); + new SavePlaylistAsyncTask(activity).execute(playlist); return true; } return false; @@ -87,4 +60,30 @@ public class PlaylistMenuHelper { ((AbsCustomPlaylist) playlist).getSongs(activity) : PlaylistSongLoader.getPlaylistSongList(activity, playlist.id); } + + + private static class SavePlaylistAsyncTask extends WeakContextAsyncTask { + public SavePlaylistAsyncTask(Context context) { + super(context); + } + + @Override + protected String doInBackground(Playlist... params) { + try { + return String.format(App.getInstance().getApplicationContext().getString(R.string.saved_playlist_to), PlaylistsUtil.savePlaylist(App.getInstance().getApplicationContext(), params[0])); + } catch (IOException e) { + e.printStackTrace(); + return String.format(App.getInstance().getApplicationContext().getString(R.string.failed_to_save_playlist), e); + } + } + + @Override + protected void onPostExecute(String string) { + super.onPostExecute(string); + Context context = getContext(); + if (context != null) { + Toast.makeText(context, string, Toast.LENGTH_LONG).show(); + } + } + } } diff --git a/app/src/main/java/com/kabouzeid/gramophone/misc/DialogAsyncTask.java b/app/src/main/java/com/kabouzeid/gramophone/misc/DialogAsyncTask.java index 8ddd3ad2..cb5659d3 100644 --- a/app/src/main/java/com/kabouzeid/gramophone/misc/DialogAsyncTask.java +++ b/app/src/main/java/com/kabouzeid/gramophone/misc/DialogAsyncTask.java @@ -2,7 +2,6 @@ package com.kabouzeid.gramophone.misc; import android.app.Dialog; import android.content.Context; -import android.os.AsyncTask; import android.os.Handler; import android.support.annotation.NonNull; import android.support.annotation.Nullable; @@ -12,9 +11,8 @@ import java.lang.ref.WeakReference; /** * @author Karim Abou Zeid (kabouzeid) */ -public abstract class DialogAsyncTask extends AsyncTask { +public abstract class DialogAsyncTask extends WeakContextAsyncTask { private final int delay; - private WeakReference contextWeakReference; private WeakReference dialogWeakReference; private boolean supposedToBeDismissed; @@ -24,8 +22,8 @@ public abstract class DialogAsyncTask extends AsyncTas } public DialogAsyncTask(Context context, int showDelay) { + super(context); this.delay = showDelay; - contextWeakReference = new WeakReference<>(context); dialogWeakReference = new WeakReference<>(null); } @@ -62,11 +60,6 @@ public abstract class DialogAsyncTask extends AsyncTas protected void onProgressUpdate(@NonNull Dialog dialog, Progress... values) { } - @Nullable - protected Context getContext() { - return contextWeakReference.get(); - } - @Nullable protected Dialog getDialog() { return dialogWeakReference.get(); diff --git a/app/src/main/java/com/kabouzeid/gramophone/misc/WeakContextAsyncTask.java b/app/src/main/java/com/kabouzeid/gramophone/misc/WeakContextAsyncTask.java new file mode 100644 index 00000000..1b4f6f97 --- /dev/null +++ b/app/src/main/java/com/kabouzeid/gramophone/misc/WeakContextAsyncTask.java @@ -0,0 +1,23 @@ +package com.kabouzeid.gramophone.misc; + +import android.content.Context; +import android.os.AsyncTask; +import android.support.annotation.Nullable; + +import java.lang.ref.WeakReference; + +/** + * @author Karim Abou Zeid (kabouzeid) + */ +public abstract class WeakContextAsyncTask extends AsyncTask { + private WeakReference contextWeakReference; + + public WeakContextAsyncTask(Context context) { + contextWeakReference = new WeakReference<>(context); + } + + @Nullable + protected Context getContext() { + return contextWeakReference.get(); + } +} diff --git a/app/src/main/java/com/kabouzeid/gramophone/ui/activities/AlbumDetailActivity.java b/app/src/main/java/com/kabouzeid/gramophone/ui/activities/AlbumDetailActivity.java index 06c2b2e9..1ddffb81 100644 --- a/app/src/main/java/com/kabouzeid/gramophone/ui/activities/AlbumDetailActivity.java +++ b/app/src/main/java/com/kabouzeid/gramophone/ui/activities/AlbumDetailActivity.java @@ -418,7 +418,7 @@ public class AlbumDetailActivity extends AbsSlidingMusicPanelActivity implements artistTextView.setText(album.getArtistName()); songCountTextView.setText(MusicUtil.getSongCountString(this, album.getSongCount())); durationTextView.setText(MusicUtil.getReadableDurationString(MusicUtil.getTotalDuration(this, album.songs))); - albumYearTextView.setText(album.getYear() > 0 ? String.valueOf(album.getYear()) : "-"); + albumYearTextView.setText(MusicUtil.getYearString(album.getYear())); adapter.swapDataSet(album.songs); } diff --git a/app/src/main/java/com/kabouzeid/gramophone/ui/fragments/mainactivity/library/LibraryFragment.java b/app/src/main/java/com/kabouzeid/gramophone/ui/fragments/mainactivity/library/LibraryFragment.java index 50704c79..6991be37 100644 --- a/app/src/main/java/com/kabouzeid/gramophone/ui/fragments/mainactivity/library/LibraryFragment.java +++ b/app/src/main/java/com/kabouzeid/gramophone/ui/fragments/mainactivity/library/LibraryFragment.java @@ -188,7 +188,6 @@ public class LibraryFragment extends AbsMainActivityFragment implements CabHolde inflater.inflate(R.menu.menu_main, menu); if (isPlaylistPage()) { menu.add(0, R.id.action_new_playlist, 0, R.string.new_playlist_title); - menu.add(0, R.id.action_export_playlists, 1, R.string.export_playlists); } Fragment currentFragment = getCurrentFragment(); if (currentFragment instanceof AbsLibraryPagerRecyclerViewCustomGridSizeFragment && currentFragment.isAdded()) { @@ -249,9 +248,6 @@ public class LibraryFragment extends AbsMainActivityFragment implements CabHolde case R.id.action_new_playlist: CreatePlaylistDialog.create().show(getChildFragmentManager(), "CREATE_PLAYLIST"); return true; - case R.id.action_export_playlists: - // TODO - return true; case R.id.action_search: startActivity(new Intent(getActivity(), SearchActivity.class)); 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 23ddd8b0..97c46880 100644 --- a/app/src/main/java/com/kabouzeid/gramophone/util/MusicUtil.java +++ b/app/src/main/java/com/kabouzeid/gramophone/util/MusicUtil.java @@ -139,6 +139,11 @@ public class MusicUtil { return albumCount + " " + albumString; } + @NonNull + public static String getYearString(int year) { + return year > 0 ? String.valueOf(year) : "-"; + } + public static long getTotalDuration(@NonNull final Context context, @NonNull List songs) { long duration = 0; for (int i = 0; i < songs.size(); i++) { diff --git a/app/src/main/res/drawable/ic_select_all_white_24dp.xml b/app/src/main/res/drawable/ic_select_all_white_24dp.xml new file mode 100644 index 00000000..57fc53b2 --- /dev/null +++ b/app/src/main/res/drawable/ic_select_all_white_24dp.xml @@ -0,0 +1,10 @@ + + + + diff --git a/app/src/main/res/menu/menu_cannot_delete_single_songs_playlist_songs_selection.xml b/app/src/main/res/menu/menu_cannot_delete_single_songs_playlist_songs_selection.xml index a516b873..e8a6846e 100644 --- a/app/src/main/res/menu/menu_cannot_delete_single_songs_playlist_songs_selection.xml +++ b/app/src/main/res/menu/menu_cannot_delete_single_songs_playlist_songs_selection.xml @@ -6,18 +6,24 @@ android:id="@+id/action_play_next" android:icon="@drawable/ic_redo_white_24dp" android:title="@string/action_play_next" - app:showAsAction="always" /> + app:showAsAction="ifRoom" /> + app:showAsAction="ifRoom" /> + app:showAsAction="ifRoom" /> + + \ No newline at end of file diff --git a/app/src/main/res/menu/menu_media_selection.xml b/app/src/main/res/menu/menu_media_selection.xml index 20ab9883..85a18c4d 100644 --- a/app/src/main/res/menu/menu_media_selection.xml +++ b/app/src/main/res/menu/menu_media_selection.xml @@ -6,24 +6,30 @@ android:id="@+id/action_play_next" android:icon="@drawable/ic_redo_white_24dp" android:title="@string/action_play_next" - app:showAsAction="always" /> + app:showAsAction="ifRoom" /> + app:showAsAction="ifRoom" /> + app:showAsAction="ifRoom" /> + app:showAsAction="ifRoom" /> + + \ No newline at end of file diff --git a/app/src/main/res/menu/menu_playlists_selection.xml b/app/src/main/res/menu/menu_playlists_selection.xml index aea5a2db..37954979 100644 --- a/app/src/main/res/menu/menu_playlists_selection.xml +++ b/app/src/main/res/menu/menu_playlists_selection.xml @@ -6,24 +6,36 @@ android:id="@+id/action_play_next" android:icon="@drawable/ic_redo_white_24dp" android:title="@string/action_play_next" - app:showAsAction="always" /> + app:showAsAction="ifRoom" /> + app:showAsAction="ifRoom" /> + app:showAsAction="ifRoom" /> + + + app:showAsAction="ifRoom" /> + + \ No newline at end of file diff --git a/app/src/main/res/menu/menu_playlists_songs_selection.xml b/app/src/main/res/menu/menu_playlists_songs_selection.xml index ff356b62..4f2d0e3d 100644 --- a/app/src/main/res/menu/menu_playlists_songs_selection.xml +++ b/app/src/main/res/menu/menu_playlists_songs_selection.xml @@ -6,24 +6,30 @@ android:id="@+id/action_play_next" android:icon="@drawable/ic_redo_white_24dp" android:title="@string/action_play_next" - app:showAsAction="always" /> + app:showAsAction="ifRoom" /> + app:showAsAction="ifRoom" /> + app:showAsAction="ifRoom" /> + app:showAsAction="ifRoom" /> + + \ No newline at end of file diff --git a/app/src/main/res/values/ids.xml b/app/src/main/res/values/ids.xml index 5234dceb..a5756383 100644 --- a/app/src/main/res/values/ids.xml +++ b/app/src/main/res/values/ids.xml @@ -1,7 +1,6 @@ - @@ -15,4 +14,6 @@ + + \ 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 972e064c..576b338a 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -48,7 +48,6 @@ Lyrics The title or artist is empty. Saving changes - Saving to file… Details File name File path @@ -88,6 +87,7 @@ Delete playlists Clear playlist Save as file + Save as files "Add to playlist" Shuffle all Shuffle album @@ -182,7 +182,6 @@ Sleep timer set for %d minutes from now. New playlist… New playlist - Export playlists 1 2 3 @@ -234,6 +233,8 @@ Folders Saved playlist to %s. Failed to save playlist (%s). + Saved %1$d playlists to %2$s. + Saved %1$d playlists to %2$s, failed to save %3$d. %s is not listed in the media store.]]> Some files are not listed in the media store. Nothing to scan. diff --git a/fastlane/Fastfile b/fastlane/Fastfile index 455d0968..51e420f8 100644 --- a/fastlane/Fastfile +++ b/fastlane/Fastfile @@ -12,6 +12,11 @@ # Uncomment the line if you want fastlane to automatically update itself # update_fastlane +# +# Usage: 1. fastlane changelog +# 2. Prepare release +# 3. fastlane tag +# 4. fastlane beta|deploy_staged|deploy default_platform(:android)