diff --git a/app/src/main/java/com/dkanada/gramophone/service/DownloadService.java b/app/src/main/java/com/dkanada/gramophone/service/DownloadService.java index e34185f7..ca45ba51 100644 --- a/app/src/main/java/com/dkanada/gramophone/service/DownloadService.java +++ b/app/src/main/java/com/dkanada/gramophone/service/DownloadService.java @@ -20,15 +20,17 @@ 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.ExecutorService; 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 ACTION_START = PACKAGE_NAME + ".action.start"; + public static final String ACTION_CANCEL = PACKAGE_NAME + ".action.cancel"; public static final String EXTRA_SONGS = PACKAGE_NAME + ".extra.songs"; - private Executor executor; + private ExecutorService executor; private DownloadNotification notification; @Override @@ -41,14 +43,22 @@ public class DownloadService extends Service { @Override public int onStartCommand(Intent intent, int flags, int startId) { - if (intent == null) { + if (intent == null || intent.getAction() == null) { return super.onStartCommand(null, flags, startId); } - List songs = intent.getParcelableArrayListExtra(EXTRA_SONGS); - for (Song song : songs) { - download(song); - notification.start(song); + switch (intent.getAction()) { + case DownloadService.ACTION_CANCEL: + executor.shutdownNow(); + notification.stop(null); + stopSelf(); + break; + case DownloadService.ACTION_START: + List songs = intent.getParcelableArrayListExtra(EXTRA_SONGS); + for (Song song : songs) { + download(song); + notification.start(song); + } } return super.onStartCommand(intent, flags, startId); diff --git a/app/src/main/java/com/dkanada/gramophone/service/notifications/DownloadNotification.java b/app/src/main/java/com/dkanada/gramophone/service/notifications/DownloadNotification.java index 62e762ac..09aa4355 100644 --- a/app/src/main/java/com/dkanada/gramophone/service/notifications/DownloadNotification.java +++ b/app/src/main/java/com/dkanada/gramophone/service/notifications/DownloadNotification.java @@ -13,6 +13,7 @@ import androidx.core.app.NotificationCompat; import com.dkanada.gramophone.R; import com.dkanada.gramophone.activities.MainActivity; import com.dkanada.gramophone.model.Song; +import com.dkanada.gramophone.service.DownloadService; import java.util.ArrayList; import java.util.List; @@ -54,6 +55,9 @@ public class DownloadNotification { Intent action = new Intent(context, MainActivity.class).setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TOP); PendingIntent clickIntent = PendingIntent.getActivity(context, 0, action, 0); + Intent cancel = new Intent(context, DownloadService.class).setAction(DownloadService.ACTION_CANCEL); + PendingIntent pendingCancel = PendingIntent.getService(context, 0, cancel, 0); + NotificationCompat.InboxStyle style = new NotificationCompat.InboxStyle(); for (Song item : songs.stream().limit(5).collect(Collectors.toList())) { style.addLine(item.title); @@ -65,6 +69,7 @@ public class DownloadNotification { .setContentTitle(String.format(context.getString(R.string.downloading_x_songs), songs.size())) .setProgress(this.maximum, this.current, false) .setVisibility(NotificationCompat.VISIBILITY_PUBLIC) + .addAction(R.drawable.ic_close_white_24dp, context.getString(R.string.action_cancel), pendingCancel) .setStyle(style) .setShowWhen(false); @@ -74,6 +79,8 @@ public class DownloadNotification { public synchronized void stop(Song song) { if (song != null) { songs.remove(song); + } else { + songs.clear(); } if (songs.size() != 0) { diff --git a/app/src/main/java/com/dkanada/gramophone/util/NavigationUtil.java b/app/src/main/java/com/dkanada/gramophone/util/NavigationUtil.java index 269dc8e6..dda89b13 100644 --- a/app/src/main/java/com/dkanada/gramophone/util/NavigationUtil.java +++ b/app/src/main/java/com/dkanada/gramophone/util/NavigationUtil.java @@ -115,6 +115,8 @@ public class NavigationUtil { Intent intent = new Intent(activity, DownloadService.class); intent.putExtra(DownloadService.EXTRA_SONGS, new ArrayList<>(songs)); + intent.setAction(DownloadService.ACTION_START); + activity.startService(intent); } } diff --git a/app/src/main/java/com/dkanada/gramophone/views/widgets/BaseAppWidget.java b/app/src/main/java/com/dkanada/gramophone/views/widgets/BaseAppWidget.java index adf2c48a..63ead5f7 100644 --- a/app/src/main/java/com/dkanada/gramophone/views/widgets/BaseAppWidget.java +++ b/app/src/main/java/com/dkanada/gramophone/views/widgets/BaseAppWidget.java @@ -30,7 +30,7 @@ import com.dkanada.gramophone.util.MusicUtil; import java.util.Arrays; public abstract class BaseAppWidget extends AppWidgetProvider { - public static final String NAME = "app_widget"; + public static final String NAME = "widget.base"; public int imageSize = 0; public float cardRadius = 0f; diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index fb2de6fa..ed0d4680 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -18,6 +18,7 @@ Remove from favorites Search Download + Cancel Play next Play Play/Pause