implement batch downloads for most media types

This commit is contained in:
dkanada 2021-05-16 23:51:58 +09:00
commit 404a0a28d2
12 changed files with 56 additions and 21 deletions

View file

@ -58,8 +58,6 @@ public class RemoveFromPlaylistDialog extends DialogFragment {
.positiveText(R.string.remove_action)
.negativeText(android.R.string.cancel)
.onPositive((dialog, which) -> {
if (getActivity() == null) return;
PlaylistSong song = songs.get(0);
PlaylistUtil.deleteItems(songs, song.playlistId);
})

View file

@ -13,14 +13,14 @@ import com.dkanada.gramophone.model.Playlist;
import com.dkanada.gramophone.util.PlaylistUtil;
public class RenamePlaylistDialog extends DialogFragment {
private static final String PLAYLIST_ID = "playlist_id";
private static final String PLAYLIST = "playlist";
@NonNull
public static RenamePlaylistDialog create(Playlist playlist) {
RenamePlaylistDialog dialog = new RenamePlaylistDialog();
Bundle args = new Bundle();
args.putString(PLAYLIST_ID, playlist.id);
args.putString(PLAYLIST, playlist.id);
dialog.setArguments(args);
return dialog;
@ -29,18 +29,16 @@ public class RenamePlaylistDialog extends DialogFragment {
@NonNull
@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
String playlistId = getArguments().getString(PLAYLIST_ID);
return new MaterialDialog.Builder(requireContext())
.title(R.string.rename_playlist_title)
.positiveText(R.string.rename_action)
.negativeText(android.R.string.cancel)
.inputType(InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_VARIATION_PERSON_NAME | InputType.TYPE_TEXT_FLAG_CAP_WORDS)
.input(getString(R.string.name), "", false,
(materialDialog, charSequence) -> {
.input(getString(R.string.name), "", false, (materialDialog, charSequence) -> {
final String name = charSequence.toString().trim();
if (!name.isEmpty()) {
String id = getArguments().getString(PLAYLIST_ID);
String id = getArguments().getString(PLAYLIST);
PlaylistUtil.renamePlaylist(id, name);
}
})

View file

@ -38,6 +38,7 @@ public class PlaylistMenuHelper {
DeletePlaylistDialog.create(playlist).show(activity.getSupportFragmentManager(), DeletePlaylistDialog.TAG);
return true;
}
return false;
}

View file

@ -4,7 +4,6 @@ import androidx.annotation.NonNull;
import androidx.fragment.app.FragmentActivity;
import androidx.appcompat.app.AppCompatActivity;
import android.content.Intent;
import android.view.MenuItem;
import android.view.View;
import android.widget.PopupMenu;
@ -17,9 +16,10 @@ import com.dkanada.gramophone.helper.MusicPlayerRemote;
import com.dkanada.gramophone.model.Album;
import com.dkanada.gramophone.model.Artist;
import com.dkanada.gramophone.model.Song;
import com.dkanada.gramophone.service.DownloadService;
import com.dkanada.gramophone.util.NavigationUtil;
import java.util.Collections;
public class SongMenuHelper {
public static final int MENU_RES = R.menu.menu_item_song;
@ -41,7 +41,7 @@ public class SongMenuHelper {
SongDetailDialog.create(song).show(activity.getSupportFragmentManager(), SongDetailDialog.TAG);
return true;
case R.id.action_download:
NavigationUtil.startDownload(activity, song);
NavigationUtil.startDownload(activity, Collections.singletonList(song));
return true;
case R.id.action_go_to_album:
NavigationUtil.startAlbum(activity, new Album(song), null);

View file

@ -7,6 +7,7 @@ import com.dkanada.gramophone.R;
import com.dkanada.gramophone.dialogs.AddToPlaylistDialog;
import com.dkanada.gramophone.helper.MusicPlayerRemote;
import com.dkanada.gramophone.model.Song;
import com.dkanada.gramophone.util.NavigationUtil;
import java.util.List;
@ -22,6 +23,9 @@ public class SongsMenuHelper {
case R.id.action_add_to_playlist:
AddToPlaylistDialog.create(songs).show(activity.getSupportFragmentManager(), "ADD_PLAYLIST");
return true;
case R.id.action_download:
NavigationUtil.startDownload(activity, songs);
return true;
}
return false;

View file

@ -2,9 +2,7 @@ package com.dkanada.gramophone.service;
import android.app.Service;
import android.content.Intent;
import android.os.Handler;
import android.os.IBinder;
import android.os.Looper;
import com.dkanada.gramophone.App;
import com.dkanada.gramophone.BuildConfig;
@ -21,13 +19,14 @@ import java.io.InputStream;
import java.io.OutputStream;
import java.net.URL;
import java.net.URLConnection;
import java.util.List;
import java.util.concurrent.Executor;
import java.util.concurrent.Executors;
@SuppressWarnings("ResultOfMethodCallIgnored")
public class DownloadService extends Service {
public static final String PACKAGE_NAME = BuildConfig.APPLICATION_ID;
public static final String EXTRA_SONG = PACKAGE_NAME + ".extra.song";
public static final String EXTRA_SONGS = PACKAGE_NAME + ".extra.songs";
private Executor executor;
private DownloadNotification notification;
@ -42,9 +41,19 @@ public class DownloadService extends Service {
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
if (intent == null) return super.onStartCommand(null, flags, startId);
Song song = intent.getParcelableExtra(EXTRA_SONG);
if (intent == null) {
return super.onStartCommand(null, flags, startId);
}
List<Song> songs = intent.getParcelableArrayListExtra(EXTRA_SONGS);
for (Song song : songs) {
download(song);
}
return super.onStartCommand(intent, flags, startId);
}
public void download(Song song) {
executor.execute(() -> {
try {
URL url = new URL(MusicUtil.getDownloadUri(song));
@ -93,8 +102,6 @@ public class DownloadService extends Service {
e.printStackTrace();
}
});
return super.onStartCommand(intent, flags, startId);
}
@Override

View file

@ -23,6 +23,9 @@ import com.dkanada.gramophone.activities.details.PlaylistDetailActivity;
import com.dkanada.gramophone.model.Song;
import com.dkanada.gramophone.service.DownloadService;
import java.util.ArrayList;
import java.util.List;
public class NavigationUtil {
public static void openUrl(Context context, String url) {
final Intent intent = new Intent(Intent.ACTION_VIEW);
@ -93,17 +96,16 @@ public class NavigationUtil {
public static void startActivitySharedElements(Activity activity, Intent intent, Pair sharedElements) {
if (sharedElements != null) {
// noinspection unchecked
activity.startActivity(intent, ActivityOptionsCompat.makeSceneTransitionAnimation(activity, sharedElements).toBundle());
} else {
activity.startActivity(intent);
}
}
public static void startDownload(Activity activity, Song song) {
public static void startDownload(Activity activity, List<Song> songs) {
Intent intent = new Intent(activity, DownloadService.class);
intent.putExtra(DownloadService.EXTRA_SONG, song);
intent.putExtra(DownloadService.EXTRA_SONGS, new ArrayList<>(songs));
activity.startService(intent);
}
}

View file

@ -42,4 +42,9 @@
android:title="@string/action_details"
app:showAsAction="never" />
<item
android:id="@+id/action_download"
android:title="@string/action_download"
app:showAsAction="never" />
</menu>

View file

@ -37,4 +37,9 @@
android:title="@string/action_details"
app:showAsAction="never" />
<item
android:id="@+id/action_download"
android:title="@string/action_download"
app:showAsAction="never" />
</menu>

View file

@ -27,4 +27,9 @@
android:title="@string/select_all_title"
app:showAsAction="ifRoom" />
<item
android:id="@+id/action_download"
android:title="@string/action_download"
app:showAsAction="never" />
</menu>

View file

@ -33,4 +33,9 @@
android:title="@string/select_all_title"
app:showAsAction="ifRoom" />
<item
android:id="@+id/action_download"
android:title="@string/action_download"
app:showAsAction="never" />
</menu>

View file

@ -32,4 +32,9 @@
android:title="@string/select_all_title"
app:showAsAction="ifRoom" />
<item
android:id="@+id/action_download"
android:title="@string/action_download"
app:showAsAction="never" />
</menu>