aboutsummaryrefslogtreecommitdiff
path: root/app
diff options
context:
space:
mode:
Diffstat (limited to 'app')
-rw-r--r--app/src/main/java/ml/docilealligator/infinityforreddit/services/DownloadMediaService.java200
-rw-r--r--app/src/main/res/values/strings.xml2
2 files changed, 129 insertions, 73 deletions
diff --git a/app/src/main/java/ml/docilealligator/infinityforreddit/services/DownloadMediaService.java b/app/src/main/java/ml/docilealligator/infinityforreddit/services/DownloadMediaService.java
index 8a110e74..a8908795 100644
--- a/app/src/main/java/ml/docilealligator/infinityforreddit/services/DownloadMediaService.java
+++ b/app/src/main/java/ml/docilealligator/infinityforreddit/services/DownloadMediaService.java
@@ -314,38 +314,39 @@ public class DownloadMediaService extends JobService {
notificationManager.createNotificationChannel(serviceChannel);
int randomNotificationIdOffset = new Random().nextInt(10000);
+ String notificationTitle = extras.containsKey(EXTRA_FILE_NAME) ? extras.getString(EXTRA_FILE_NAME) : getString(R.string.download_all_gallery_media_notification_title);
switch (extras.getInt(EXTRA_MEDIA_TYPE, EXTRA_MEDIA_TYPE_IMAGE)) {
case EXTRA_MEDIA_TYPE_GIF:
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.UPSIDE_DOWN_CAKE) {
setNotification(params,
NotificationUtils.DOWNLOAD_GIF_NOTIFICATION_ID + randomNotificationIdOffset,
- createNotification(builder, extras.getString(EXTRA_FILE_NAME)),
+ createNotification(builder, notificationTitle),
JobService.JOB_END_NOTIFICATION_POLICY_DETACH);
} else {
notificationManager.notify(NotificationUtils.DOWNLOAD_GIF_NOTIFICATION_ID + randomNotificationIdOffset,
- createNotification(builder, extras.getString(EXTRA_FILE_NAME)));
+ createNotification(builder, notificationTitle));
}
break;
case EXTRA_MEDIA_TYPE_VIDEO:
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.UPSIDE_DOWN_CAKE) {
setNotification(params,
NotificationUtils.DOWNLOAD_VIDEO_NOTIFICATION_ID + randomNotificationIdOffset,
- createNotification(builder, extras.getString(EXTRA_FILE_NAME)),
+ createNotification(builder, notificationTitle),
JobService.JOB_END_NOTIFICATION_POLICY_DETACH);
} else {
notificationManager.notify(NotificationUtils.DOWNLOAD_VIDEO_NOTIFICATION_ID + randomNotificationIdOffset,
- createNotification(builder, extras.getString(EXTRA_FILE_NAME)));
+ createNotification(builder, notificationTitle));
}
break;
default:
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.UPSIDE_DOWN_CAKE) {
setNotification(params,
NotificationUtils.DOWNLOAD_IMAGE_NOTIFICATION_ID + randomNotificationIdOffset,
- createNotification(builder, extras.getString(EXTRA_FILE_NAME)),
+ createNotification(builder, notificationTitle),
JobService.JOB_END_NOTIFICATION_POLICY_DETACH);
} else {
notificationManager.notify(NotificationUtils.DOWNLOAD_IMAGE_NOTIFICATION_ID + randomNotificationIdOffset,
- createNotification(builder, extras.getString(EXTRA_FILE_NAME)));
+ createNotification(builder, notificationTitle));
}
}
@@ -363,18 +364,59 @@ public class DownloadMediaService extends JobService {
String[] mediaTypes = concatMediaTypes.split(" ");
String[] fileNames = concatFileNames.split(" ");
+ boolean allImagesDownloadedSuccessfully = true;
for (int i = 0; i < urls.length; i++) {
String mimeType = Integer.parseInt(mediaTypes[i]) == EXTRA_MEDIA_TYPE_VIDEO ? "video/*" : "image/*";
- downloadMedia(params, urls[i], extras, builder, mediaType, randomNotificationIdOffset, fileNames[i],
- mimeType, subredditName, isNsfw);
+ int finalI = i;
+ allImagesDownloadedSuccessfully &= downloadMedia(params, urls[i], extras, builder, mediaType, randomNotificationIdOffset, fileNames[i],
+ mimeType, subredditName, isNsfw, true,
+ new DownloadProgressResponseBody.ProgressListener() {
+ long time = 0;
+ @Override
+ public void update(long bytesRead, long contentLength, boolean done) {
+ if (!done) {
+ if (contentLength != -1) {
+ long currentTime = System.currentTimeMillis();
+ if (currentTime - time > 1000) {
+ time = currentTime;
+ int currentMediaProgress = (int) (((float) bytesRead / contentLength + (float) finalI / urls.length) * 100);
+ updateNotification(builder, mediaType, 0,
+ currentMediaProgress, randomNotificationIdOffset,
+ null, null);
+ }
+ }
+ }
+ }
+ });
}
+
+ updateNotification(builder, mediaType,
+ allImagesDownloadedSuccessfully ? R.string.downloading_media_finished : R.string.download_gallery_failed_some_images,
+ -1, randomNotificationIdOffset,
+ null, null);
+ jobFinished(params, false);
} else {
String fileUrl = extras.getString(EXTRA_URL);
String fileName = extras.getString(EXTRA_FILE_NAME);
String mimeType = mediaType == EXTRA_MEDIA_TYPE_VIDEO ? "video/*" : "image/*";
downloadMedia(params, fileUrl, extras, builder, mediaType, randomNotificationIdOffset, fileName,
- mimeType, subredditName, isNsfw);
+ mimeType, subredditName, isNsfw, false, new DownloadProgressResponseBody.ProgressListener() {
+ long time = 0;
+ @Override
+ public void update(long bytesRead, long contentLength, boolean done) {
+ if (!done) {
+ if (contentLength != -1) {
+ long currentTime = System.currentTimeMillis();
+ if (currentTime - time > 1000) {
+ time = currentTime;
+ updateNotification(builder, mediaType, 0,
+ (int) ((100 * bytesRead) / contentLength), randomNotificationIdOffset, null, null);
+ }
+ }
+ }
+ }
+ });
}
});
@@ -386,9 +428,26 @@ public class DownloadMediaService extends JobService {
return false;
}
- private void downloadMedia(JobParameters params, String fileUrl, PersistableBundle intent,
+ /**
+ *
+ * @param params
+ * @param fileUrl
+ * @param intent
+ * @param builder
+ * @param mediaType
+ * @param randomNotificationIdOffset
+ * @param fileName
+ * @param mimeType
+ * @param subredditName
+ * @param isNsfw
+ * @param multipleDownloads
+ * @param progressListener
+ * @return true if download succeeded or false otherwise.
+ */
+ private boolean downloadMedia(JobParameters params, String fileUrl, PersistableBundle intent,
NotificationCompat.Builder builder, int mediaType, int randomNotificationIdOffset,
- String fileName, String mimeType, String subredditName, boolean isNsfw) {
+ String fileName, String mimeType, String subredditName, boolean isNsfw,
+ boolean multipleDownloads, DownloadProgressResponseBody.ProgressListener progressListener) {
if (fileUrl == null) {
// Only Redgifs and Streamble video can go inside this if clause.
String redgifsId = intent.getString(EXTRA_REDGIFS_ID, null);
@@ -400,28 +459,12 @@ public class DownloadMediaService extends JobService {
if (fileUrl == null) {
downloadFinished(params, builder, mediaType, randomNotificationIdOffset, mimeType,
null,
- redgifsId == null ? ERROR_FILE_CANNOT_FETCH_STREAMABLE_VIDEO_LINK : ERROR_FILE_CANNOT_FETCH_REDGIFS_VIDEO_LINK);
- return;
+ redgifsId == null ? ERROR_FILE_CANNOT_FETCH_STREAMABLE_VIDEO_LINK : ERROR_FILE_CANNOT_FETCH_REDGIFS_VIDEO_LINK,
+ multipleDownloads);
+ return false;
}
}
- final DownloadProgressResponseBody.ProgressListener progressListener = new DownloadProgressResponseBody.ProgressListener() {
- long time = 0;
-
- @Override public void update(long bytesRead, long contentLength, boolean done) {
- if (!done) {
- if (contentLength != -1) {
- long currentTime = System.currentTimeMillis();
- if (currentTime - time > 1000) {
- time = currentTime;
- updateNotification(builder, mediaType, 0,
- (int) ((100 * bytesRead) / contentLength), randomNotificationIdOffset, null, null);
- }
- }
- }
- }
- };
-
OkHttpClient client = new OkHttpClient.Builder()
.addNetworkInterceptor(chain -> {
okhttp3.Response originalResponse = chain.proceed(chain.request());
@@ -456,14 +499,14 @@ public class DownloadMediaService extends JobService {
File infinityDir = new File(directoryPath);
if (!infinityDir.exists() && !infinityDir.mkdirs()) {
downloadFinished(params, builder, mediaType, randomNotificationIdOffset, mimeType,
- null, ERROR_CANNOT_GET_DESTINATION_DIRECTORY);
- return;
+ null, ERROR_CANNOT_GET_DESTINATION_DIRECTORY, multipleDownloads);
+ return false;
}
destinationFileUriString = directoryPath + fileName;
} else {
downloadFinished(params, builder, mediaType, randomNotificationIdOffset, mimeType,
- null, ERROR_CANNOT_GET_DESTINATION_DIRECTORY);
- return;
+ null, ERROR_CANNOT_GET_DESTINATION_DIRECTORY, multipleDownloads);
+ return false;
}
} else {
String dir = mediaType == EXTRA_MEDIA_TYPE_VIDEO ? Environment.DIRECTORY_MOVIES : Environment.DIRECTORY_PICTURES;
@@ -477,24 +520,24 @@ public class DownloadMediaService extends JobService {
dir = DocumentFile.fromTreeUri(DownloadMediaService.this, Uri.parse(destinationFileDirectory));
if (dir == null) {
downloadFinished(params, builder, mediaType, randomNotificationIdOffset, mimeType,
- null, ERROR_CANNOT_GET_DESTINATION_DIRECTORY);
- return;
+ null, ERROR_CANNOT_GET_DESTINATION_DIRECTORY, multipleDownloads);
+ return false;
}
dir = dir.findFile(subredditName);
if (dir == null) {
dir = DocumentFile.fromTreeUri(DownloadMediaService.this, Uri.parse(destinationFileDirectory)).createDirectory(subredditName);
if (dir == null) {
downloadFinished(params, builder, mediaType, randomNotificationIdOffset, mimeType,
- null, ERROR_CANNOT_GET_DESTINATION_DIRECTORY);
- return;
+ null, ERROR_CANNOT_GET_DESTINATION_DIRECTORY, multipleDownloads);
+ return false;
}
}
} else {
dir = DocumentFile.fromTreeUri(DownloadMediaService.this, Uri.parse(destinationFileDirectory));
if (dir == null) {
downloadFinished(params, builder, mediaType, randomNotificationIdOffset, mimeType,
- null, ERROR_CANNOT_GET_DESTINATION_DIRECTORY);
- return;
+ null, ERROR_CANNOT_GET_DESTINATION_DIRECTORY, multipleDownloads);
+ return false;
}
}
DocumentFile checkForDuplicates = dir.findFile(fileName);
@@ -509,32 +552,34 @@ public class DownloadMediaService extends JobService {
picFile = dir.createFile(mimeType, fileName);
if (picFile == null) {
downloadFinished(params, builder, mediaType, randomNotificationIdOffset, mimeType,
- null, ERROR_CANNOT_GET_DESTINATION_DIRECTORY);
- return;
+ null, ERROR_CANNOT_GET_DESTINATION_DIRECTORY, multipleDownloads);
+ return false;
}
destinationFileUriString = picFile.getUri().toString();
}
} else {
downloadFinished(params, builder, mediaType, randomNotificationIdOffset, mimeType, null,
- ERROR_FILE_CANNOT_DOWNLOAD);
- return;
+ ERROR_FILE_CANNOT_DOWNLOAD, multipleDownloads);
+ return false;
}
} catch (IOException e) {
e.printStackTrace();
downloadFinished(params, builder, mediaType, randomNotificationIdOffset, mimeType, null,
- ERROR_FILE_CANNOT_DOWNLOAD);
- return;
+ ERROR_FILE_CANNOT_DOWNLOAD, multipleDownloads);
+ return false;
}
try {
Uri destinationFileUri = writeResponseBodyToDisk(response.body(), isDefaultDestination, destinationFileUriString,
fileName, mediaType);
downloadFinished(params, builder, mediaType, randomNotificationIdOffset,
- mimeType, destinationFileUri, NO_ERROR);
+ mimeType, destinationFileUri, NO_ERROR, multipleDownloads);
+ return true;
} catch (IOException e) {
e.printStackTrace();
downloadFinished(params, builder, mediaType, randomNotificationIdOffset,
- mimeType, null, ERROR_FILE_CANNOT_SAVE);
+ mimeType, null, ERROR_FILE_CANNOT_SAVE, multipleDownloads);
+ return false;
}
}
@@ -719,39 +764,48 @@ public class DownloadMediaService extends JobService {
return Uri.parse(destinationFileUriString);
}
- private void downloadFinished(JobParameters parameters, NotificationCompat.Builder builder, int mediaType, int randomNotificationIdOffset, String mimeType, Uri destinationFileUri, int errorCode) {
+ private void downloadFinished(JobParameters parameters, NotificationCompat.Builder builder, int mediaType,
+ int randomNotificationIdOffset, String mimeType, Uri destinationFileUri,
+ int errorCode, boolean multipleDownloads) {
if (errorCode != NO_ERROR) {
- switch (errorCode) {
- case ERROR_CANNOT_GET_DESTINATION_DIRECTORY:
- updateNotification(builder, mediaType, R.string.downloading_image_or_gif_failed_cannot_get_destination_directory,
- -1, randomNotificationIdOffset, null, null);
- break;
- case ERROR_FILE_CANNOT_DOWNLOAD:
- updateNotification(builder, mediaType, R.string.downloading_media_failed_cannot_download_media,
- -1, randomNotificationIdOffset, null, null);
- break;
- case ERROR_FILE_CANNOT_SAVE:
- updateNotification(builder, mediaType, R.string.downloading_media_failed_cannot_save_to_destination_directory,
- -1, randomNotificationIdOffset, null, null);
- break;
- case ERROR_FILE_CANNOT_FETCH_REDGIFS_VIDEO_LINK:
- updateNotification(builder, mediaType, R.string.downloading_media_failed_cannot_fetch_redgifs_url,
- -1, randomNotificationIdOffset, null, null);
- break;
- case ERROR_FILE_CANNOT_FETCH_STREAMABLE_VIDEO_LINK:
- updateNotification(builder, mediaType, R.string.downloading_media_failed_cannot_fetch_streamable_url,
- -1, randomNotificationIdOffset, null, null);
- break;
+ if (multipleDownloads) {
+ switch (errorCode) {
+ case ERROR_CANNOT_GET_DESTINATION_DIRECTORY:
+ updateNotification(builder, mediaType, R.string.downloading_image_or_gif_failed_cannot_get_destination_directory,
+ -1, randomNotificationIdOffset, null, null);
+ break;
+ case ERROR_FILE_CANNOT_DOWNLOAD:
+ updateNotification(builder, mediaType, R.string.downloading_media_failed_cannot_download_media,
+ -1, randomNotificationIdOffset, null, null);
+ break;
+ case ERROR_FILE_CANNOT_SAVE:
+ updateNotification(builder, mediaType, R.string.downloading_media_failed_cannot_save_to_destination_directory,
+ -1, randomNotificationIdOffset, null, null);
+ break;
+ case ERROR_FILE_CANNOT_FETCH_REDGIFS_VIDEO_LINK:
+ updateNotification(builder, mediaType, R.string.downloading_media_failed_cannot_fetch_redgifs_url,
+ -1, randomNotificationIdOffset, null, null);
+ break;
+ case ERROR_FILE_CANNOT_FETCH_STREAMABLE_VIDEO_LINK:
+ updateNotification(builder, mediaType, R.string.downloading_media_failed_cannot_fetch_streamable_url,
+ -1, randomNotificationIdOffset, null, null);
+ break;
+ }
}
} else {
MediaScannerConnection.scanFile(
DownloadMediaService.this, new String[]{destinationFileUri.toString()}, null,
(path, uri) -> {
- updateNotification(builder, mediaType, R.string.downloading_media_finished, -1,
- randomNotificationIdOffset, destinationFileUri, mimeType);
+ if (!multipleDownloads) {
+ updateNotification(builder, mediaType, R.string.downloading_media_finished, -1,
+ randomNotificationIdOffset, destinationFileUri, mimeType);
+ }
}
);
}
- jobFinished(parameters, false);
+
+ if (!multipleDownloads) {
+ jobFinished(parameters, false);
+ }
}
}
diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml
index bd4ac962..fcb7d0b0 100644
--- a/app/src/main/res/values/strings.xml
+++ b/app/src/main/res/values/strings.xml
@@ -1053,6 +1053,8 @@
<string name="downloading_media_failed_cannot_save_to_destination_directory">Download failed: cannot save the file to destination directory</string>
<string name="downloading_media_failed_cannot_fetch_redgifs_url">Download failed: cannot fetch Redgifs video url</string>
<string name="downloading_media_failed_cannot_fetch_streamable_url">Download failed: cannot fetch Streamable video url</string>
+ <string name="download_all_gallery_media_notification_title">All Gallery Media</string>
+ <string name="download_gallery_failed_some_images">Downloaded. Some media failed to download.</string>
<string name="wallpaper_set">Wallpaper set</string>
<string name="error_set_wallpaper">Cannot set wallpaper</string>