implement functionality to add items to playlists

This commit is contained in:
dkanada 2020-04-30 18:25:27 +09:00
commit 3ca2b750ff
9 changed files with 86 additions and 85 deletions

View file

@ -9,7 +9,7 @@ import com.afollestad.materialdialogs.MaterialDialog;
import com.kabouzeid.gramophone.R; import com.kabouzeid.gramophone.R;
import com.kabouzeid.gramophone.model.Playlist; import com.kabouzeid.gramophone.model.Playlist;
import com.kabouzeid.gramophone.model.Song; import com.kabouzeid.gramophone.model.Song;
import com.kabouzeid.gramophone.util.PlaylistsUtil; import com.kabouzeid.gramophone.util.PlaylistUtil;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
@ -56,7 +56,7 @@ public class AddToPlaylistDialog extends DialogFragment {
CreatePlaylistDialog.create(songs).show(getActivity().getSupportFragmentManager(), "ADD_TO_PLAYLIST"); CreatePlaylistDialog.create(songs).show(getActivity().getSupportFragmentManager(), "ADD_TO_PLAYLIST");
} else { } else {
materialDialog.dismiss(); materialDialog.dismiss();
PlaylistsUtil.addToPlaylist(getActivity(), songs, playlists.get(i - 1).id, true); PlaylistUtil.addItems(songs, playlists.get(i - 1).id);
} }
}) })
.build(); .build();

View file

@ -6,12 +6,11 @@ import androidx.annotation.NonNull;
import androidx.annotation.Nullable; import androidx.annotation.Nullable;
import androidx.fragment.app.DialogFragment; import androidx.fragment.app.DialogFragment;
import android.text.InputType; import android.text.InputType;
import android.widget.Toast;
import com.afollestad.materialdialogs.MaterialDialog; import com.afollestad.materialdialogs.MaterialDialog;
import com.kabouzeid.gramophone.R; import com.kabouzeid.gramophone.R;
import com.kabouzeid.gramophone.model.Song; import com.kabouzeid.gramophone.model.Song;
import com.kabouzeid.gramophone.util.PlaylistsUtil; import com.kabouzeid.gramophone.util.PlaylistUtil;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
@ -49,27 +48,13 @@ public class CreatePlaylistDialog extends DialogFragment {
.title(R.string.action_new_playlist) .title(R.string.action_new_playlist)
.positiveText(R.string.create_action) .positiveText(R.string.create_action)
.negativeText(android.R.string.cancel) .negativeText(android.R.string.cancel)
.inputType(InputType.TYPE_CLASS_TEXT | .inputType(InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_VARIATION_PERSON_NAME | InputType.TYPE_TEXT_FLAG_CAP_WORDS)
InputType.TYPE_TEXT_VARIATION_PERSON_NAME |
InputType.TYPE_TEXT_FLAG_CAP_WORDS)
.input(R.string.playlist_name_empty, 0, false, (materialDialog, charSequence) -> { .input(R.string.playlist_name_empty, 0, false, (materialDialog, charSequence) -> {
if (getActivity() == null)
return;
final String name = charSequence.toString().trim(); final String name = charSequence.toString().trim();
if (!name.isEmpty()) { if (getActivity() == null || getArguments() == null || name.isEmpty()) return;
if (!PlaylistsUtil.doesPlaylistExist(getActivity(), name)) {
final String playlistId = PlaylistsUtil.createPlaylist(getActivity(), name);
if (getActivity() != null) {
// noinspection unchecked
List<Song> songs = getArguments().getParcelableArrayList(SONGS); List<Song> songs = getArguments().getParcelableArrayList(SONGS);
if (songs != null && !songs.isEmpty()) { if (songs != null && !songs.isEmpty()) {
PlaylistsUtil.addToPlaylist(getActivity(), songs, playlistId, true); PlaylistUtil.createPlaylist(name, songs);
}
}
} else {
Toast.makeText(getActivity(), getActivity().getResources().getString(
R.string.playlist_exists, name), Toast.LENGTH_SHORT).show();
}
} }
}) })
.build(); .build();

View file

@ -9,7 +9,7 @@ import android.text.Html;
import com.afollestad.materialdialogs.MaterialDialog; import com.afollestad.materialdialogs.MaterialDialog;
import com.kabouzeid.gramophone.R; import com.kabouzeid.gramophone.R;
import com.kabouzeid.gramophone.model.Playlist; import com.kabouzeid.gramophone.model.Playlist;
import com.kabouzeid.gramophone.util.PlaylistsUtil; import com.kabouzeid.gramophone.util.PlaylistUtil;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
@ -54,7 +54,7 @@ public class DeletePlaylistDialog extends DialogFragment {
.negativeText(android.R.string.cancel) .negativeText(android.R.string.cancel)
.onPositive((dialog, which) -> { .onPositive((dialog, which) -> {
if (getActivity() == null) return; if (getActivity() == null) return;
PlaylistsUtil.deletePlaylist(getActivity(), playlists); PlaylistUtil.deletePlaylist(playlists);
}) })
.build(); .build();
} }

View file

@ -9,7 +9,7 @@ import android.text.Html;
import com.afollestad.materialdialogs.MaterialDialog; import com.afollestad.materialdialogs.MaterialDialog;
import com.kabouzeid.gramophone.R; import com.kabouzeid.gramophone.R;
import com.kabouzeid.gramophone.model.Song; import com.kabouzeid.gramophone.model.Song;
import com.kabouzeid.gramophone.util.PlaylistsUtil; import com.kabouzeid.gramophone.util.PlaylistUtil;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
@ -35,7 +35,6 @@ public class RemoveFromPlaylistDialog extends DialogFragment {
@NonNull @NonNull
@Override @Override
public Dialog onCreateDialog(Bundle savedInstanceState) { public Dialog onCreateDialog(Bundle savedInstanceState) {
//noinspection unchecked
final List<Song> songs = getArguments().getParcelableArrayList("songs"); final List<Song> songs = getArguments().getParcelableArrayList("songs");
int title; int title;
CharSequence content; CharSequence content;
@ -54,7 +53,7 @@ public class RemoveFromPlaylistDialog extends DialogFragment {
.negativeText(android.R.string.cancel) .negativeText(android.R.string.cancel)
.onPositive((dialog, which) -> { .onPositive((dialog, which) -> {
if (getActivity() == null) return; if (getActivity() == null) return;
PlaylistsUtil.removeFromPlaylist(getActivity(), songs.get(0), songs.get(0).id); PlaylistUtil.deleteItems(songs, songs.get(0).id);
}) })
.build(); .build();
} }

View file

@ -8,7 +8,7 @@ import android.text.InputType;
import com.afollestad.materialdialogs.MaterialDialog; import com.afollestad.materialdialogs.MaterialDialog;
import com.kabouzeid.gramophone.R; import com.kabouzeid.gramophone.R;
import com.kabouzeid.gramophone.util.PlaylistsUtil; import com.kabouzeid.gramophone.util.PlaylistUtil;
public class RenamePlaylistDialog extends DialogFragment { public class RenamePlaylistDialog extends DialogFragment {
@ -26,21 +26,19 @@ public class RenamePlaylistDialog extends DialogFragment {
@NonNull @NonNull
@Override @Override
public Dialog onCreateDialog(Bundle savedInstanceState) { public Dialog onCreateDialog(Bundle savedInstanceState) {
long playlistId = getArguments().getLong(PLAYLIST_ID); String playlistId = getArguments().getString(PLAYLIST_ID);
return new MaterialDialog.Builder(getActivity()) return new MaterialDialog.Builder(getActivity())
.title(R.string.rename_playlist_title) .title(R.string.rename_playlist_title)
.positiveText(R.string.rename_action) .positiveText(R.string.rename_action)
.negativeText(android.R.string.cancel) .negativeText(android.R.string.cancel)
.inputType(InputType.TYPE_CLASS_TEXT | .inputType(InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_VARIATION_PERSON_NAME | InputType.TYPE_TEXT_FLAG_CAP_WORDS)
InputType.TYPE_TEXT_VARIATION_PERSON_NAME | .input(getString(R.string.playlist_name_empty), "", false,
InputType.TYPE_TEXT_FLAG_CAP_WORDS)
.input(getString(R.string.playlist_name_empty), PlaylistsUtil.getNameForPlaylist(getActivity(), playlistId), false,
(materialDialog, charSequence) -> { (materialDialog, charSequence) -> {
final String name = charSequence.toString().trim(); final String name = charSequence.toString().trim();
if (!name.isEmpty()) { if (!name.isEmpty()) {
long playlistId1 = getArguments().getLong(PLAYLIST_ID); String id = getArguments().getString(PLAYLIST_ID);
PlaylistsUtil.renamePlaylist(getActivity(), playlistId1, name); PlaylistUtil.renamePlaylist(id, name);
} }
}) })
.build(); .build();

View file

@ -31,7 +31,7 @@ import com.kabouzeid.gramophone.model.playlist.AbsSmartPlaylist;
import com.kabouzeid.gramophone.ui.activities.base.AbsSlidingMusicPanelActivity; import com.kabouzeid.gramophone.ui.activities.base.AbsSlidingMusicPanelActivity;
import com.kabouzeid.gramophone.util.QueryUtil; import com.kabouzeid.gramophone.util.QueryUtil;
import com.kabouzeid.gramophone.util.ThemeUtil; import com.kabouzeid.gramophone.util.ThemeUtil;
import com.kabouzeid.gramophone.util.PlaylistsUtil; import com.kabouzeid.gramophone.util.PlaylistUtil;
import com.kabouzeid.gramophone.util.ViewUtil; import com.kabouzeid.gramophone.util.ViewUtil;
import com.simplecityapps.recyclerview_fastscroll.views.FastScrollRecyclerView; import com.simplecityapps.recyclerview_fastscroll.views.FastScrollRecyclerView;
@ -104,11 +104,10 @@ public class PlaylistDetailActivity extends AbsSlidingMusicPanelActivity impleme
recyclerViewDragDropManager = new RecyclerViewDragDropManager(); recyclerViewDragDropManager = new RecyclerViewDragDropManager();
final GeneralItemAnimator animator = new RefactoredDefaultItemAnimator(); final GeneralItemAnimator animator = new RefactoredDefaultItemAnimator();
adapter = new OrderablePlaylistSongAdapter(this, new ArrayList<>(), R.layout.item_list, false, this, (fromPosition, toPosition) -> { adapter = new OrderablePlaylistSongAdapter(this, new ArrayList<>(), R.layout.item_list, false, this, (fromPosition, toPosition) -> {
if (PlaylistsUtil.moveItem(PlaylistDetailActivity.this, playlist.id, fromPosition, toPosition)) { PlaylistUtil.moveItem(playlist.id, adapter.getDataSet().get(fromPosition), toPosition);
Song song = adapter.getDataSet().remove(fromPosition); Song song = adapter.getDataSet().remove(fromPosition);
adapter.getDataSet().add(toPosition, song); adapter.getDataSet().add(toPosition, song);
adapter.notifyItemMoved(fromPosition, toPosition); adapter.notifyItemMoved(fromPosition, toPosition);
}
}); });
wrappedAdapter = recyclerViewDragDropManager.createWrappedAdapter(adapter); wrappedAdapter = recyclerViewDragDropManager.createWrappedAdapter(adapter);

View file

@ -0,0 +1,58 @@
package com.kabouzeid.gramophone.util;
import com.kabouzeid.gramophone.App;
import com.kabouzeid.gramophone.model.Playlist;
import com.kabouzeid.gramophone.model.Song;
import org.jellyfin.apiclient.interaction.EmptyResponse;
import org.jellyfin.apiclient.interaction.Response;
import org.jellyfin.apiclient.model.playlists.PlaylistCreationRequest;
import java.util.ArrayList;
import java.util.List;
public class PlaylistUtil {
public static void createPlaylist(final String name, final List<Song> songs) {
ArrayList<String> ids = new ArrayList<>();
for (Song song : songs) {
ids.add(song.id);
}
PlaylistCreationRequest request = new PlaylistCreationRequest();
request.setUserId(App.getApiClient().getCurrentUserId());
request.setName(name);
request.setItemIdList(ids);
App.getApiClient().CreatePlaylist(request, new Response<>());
}
public static void deletePlaylist(final List<Playlist> playlists) {
for (Playlist playlist : playlists) {
App.getApiClient().DeleteItem(playlist.id, new EmptyResponse());
}
}
public static void addItems(final List<Song> songs, final String playlist) {
String[] ids = new String[songs.size()];
for (int i = 0; i < songs.size(); i++) {
ids[i] = songs.get(i).id;
}
String user = App.getApiClient().getCurrentUserId();
App.getApiClient().AddToPlaylist(playlist, ids, user, new EmptyResponse());
}
public static void deleteItems(final List<Song> songs, final String playlist) {
String[] ids = new String[songs.size()];
for (int i = 0; i < songs.size(); i++) {
ids[i] = songs.get(i).id;
}
App.getApiClient().RemoveFromPlaylist(playlist, ids, new EmptyResponse());
}
public static void moveItem(final String playlist, final Song song, int to) {
}
public static void renamePlaylist(final String playlist, final String name) {
}
}

View file

@ -1,43 +0,0 @@
package com.kabouzeid.gramophone.util;
import android.content.Context;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import com.kabouzeid.gramophone.model.Playlist;
import com.kabouzeid.gramophone.model.Song;
import java.util.List;
public class PlaylistsUtil {
public static boolean doesPlaylistExist(@NonNull final Context context, final String name) {
return false;
}
public static String createPlaylist(@NonNull final Context context, @Nullable final String name) {
return "";
}
public static void deletePlaylist(@NonNull final Context context, @NonNull final List<Playlist> playlists) {
}
public static void addToPlaylist(@NonNull final Context context, final Song song, final String playlistId, final boolean showToastOnFinish) {
}
public static void addToPlaylist(@NonNull final Context context, @NonNull final List<Song> songs, final String playlistId, final boolean showToastOnFinish) {
}
public static void removeFromPlaylist(@NonNull final Context context, @NonNull final Song song, String playlistId) {
}
public static boolean moveItem(@NonNull final Context context, String playlistId, int from, int to) {
return true;
}
public static void renamePlaylist(@NonNull final Context context, final long id, final String newName) {
}
public static String getNameForPlaylist(@NonNull final Context context, final long id) {
return "";
}
}

View file

@ -4,23 +4,28 @@
<group <group
android:id="@+id/navigation_drawer_menu_category_sections" android:id="@+id/navigation_drawer_menu_category_sections"
android:checkableBehavior="single"> android:checkableBehavior="single">
<item <item
android:id="@+id/nav_library" android:id="@+id/nav_library"
android:icon="@drawable/ic_library_music_white_24dp" android:icon="@drawable/ic_library_music_white_24dp"
android:title="@string/all" /> android:title="@string/all" />
</group> </group>
<group <group
android:id="@+id/navigation_drawer_menu_category_other" android:id="@+id/navigation_drawer_menu_category_other"
android:checkableBehavior="none"> android:checkableBehavior="none">
<item <item
android:id="@+id/nav_settings" android:id="@+id/nav_settings"
android:icon="@drawable/ic_settings_white_24dp" android:icon="@drawable/ic_settings_white_24dp"
android:title="@string/action_settings" /> android:title="@string/action_settings" />
<item <item
android:id="@+id/nav_about" android:id="@+id/nav_about"
android:icon="@drawable/ic_help_white_24dp" android:icon="@drawable/ic_help_white_24dp"
android:title="@string/action_about" /> android:title="@string/action_about" />
</group> </group>
</menu> </menu>