mirror of
https://codeberg.org/Bazsalanszky/Infinity-For-Lemmy.git
synced 2025-01-01 13:57:10 +01:00
Show progress when downloding images and gifs.
This commit is contained in:
parent
6284de74fe
commit
d23af6981a
@ -0,0 +1,56 @@
|
|||||||
|
package ml.docilealligator.infinityforreddit;
|
||||||
|
|
||||||
|
import java.io.IOException;
|
||||||
|
|
||||||
|
import okhttp3.MediaType;
|
||||||
|
import okhttp3.ResponseBody;
|
||||||
|
import okio.Buffer;
|
||||||
|
import okio.BufferedSource;
|
||||||
|
import okio.ForwardingSource;
|
||||||
|
import okio.Okio;
|
||||||
|
import okio.Source;
|
||||||
|
|
||||||
|
public class DownloadProgressResponseBody extends ResponseBody {
|
||||||
|
|
||||||
|
private final ResponseBody responseBody;
|
||||||
|
private final ProgressListener progressListener;
|
||||||
|
private BufferedSource bufferedSource;
|
||||||
|
|
||||||
|
public DownloadProgressResponseBody(ResponseBody responseBody, ProgressListener progressListener) {
|
||||||
|
this.responseBody = responseBody;
|
||||||
|
this.progressListener = progressListener;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override public MediaType contentType() {
|
||||||
|
return responseBody.contentType();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override public long contentLength() {
|
||||||
|
return responseBody.contentLength();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override public BufferedSource source() {
|
||||||
|
if (bufferedSource == null) {
|
||||||
|
bufferedSource = Okio.buffer(source(responseBody.source()));
|
||||||
|
}
|
||||||
|
return bufferedSource;
|
||||||
|
}
|
||||||
|
|
||||||
|
private Source source(Source source) {
|
||||||
|
return new ForwardingSource(source) {
|
||||||
|
long totalBytesRead = 0L;
|
||||||
|
|
||||||
|
@Override public long read(Buffer sink, long byteCount) throws IOException {
|
||||||
|
long bytesRead = super.read(sink, byteCount);
|
||||||
|
// read() returns the number of bytes read, or -1 if this source is exhausted.
|
||||||
|
totalBytesRead += bytesRead != -1 ? bytesRead : 0;
|
||||||
|
progressListener.update(totalBytesRead, responseBody.contentLength(), bytesRead == -1);
|
||||||
|
return bytesRead;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
public interface ProgressListener {
|
||||||
|
void update(long bytesRead, long contentLength, boolean done);
|
||||||
|
}
|
||||||
|
}
|
@ -7,7 +7,6 @@ import android.app.PendingIntent;
|
|||||||
import android.app.Service;
|
import android.app.Service;
|
||||||
import android.content.ContentResolver;
|
import android.content.ContentResolver;
|
||||||
import android.content.ContentValues;
|
import android.content.ContentValues;
|
||||||
import android.content.Context;
|
|
||||||
import android.content.Intent;
|
import android.content.Intent;
|
||||||
import android.content.SharedPreferences;
|
import android.content.SharedPreferences;
|
||||||
import android.media.MediaScannerConnection;
|
import android.media.MediaScannerConnection;
|
||||||
@ -17,6 +16,7 @@ import android.os.Build;
|
|||||||
import android.os.Environment;
|
import android.os.Environment;
|
||||||
import android.os.IBinder;
|
import android.os.IBinder;
|
||||||
import android.provider.MediaStore;
|
import android.provider.MediaStore;
|
||||||
|
import android.util.Log;
|
||||||
|
|
||||||
import androidx.annotation.NonNull;
|
import androidx.annotation.NonNull;
|
||||||
import androidx.core.app.NotificationCompat;
|
import androidx.core.app.NotificationCompat;
|
||||||
@ -36,11 +36,13 @@ import javax.inject.Named;
|
|||||||
|
|
||||||
import ml.docilealligator.infinityforreddit.API.DownloadFile;
|
import ml.docilealligator.infinityforreddit.API.DownloadFile;
|
||||||
import ml.docilealligator.infinityforreddit.CustomTheme.CustomThemeWrapper;
|
import ml.docilealligator.infinityforreddit.CustomTheme.CustomThemeWrapper;
|
||||||
|
import ml.docilealligator.infinityforreddit.DownloadProgressResponseBody;
|
||||||
import ml.docilealligator.infinityforreddit.Event.DownloadMediaEvent;
|
import ml.docilealligator.infinityforreddit.Event.DownloadMediaEvent;
|
||||||
import ml.docilealligator.infinityforreddit.Infinity;
|
import ml.docilealligator.infinityforreddit.Infinity;
|
||||||
import ml.docilealligator.infinityforreddit.R;
|
import ml.docilealligator.infinityforreddit.R;
|
||||||
import ml.docilealligator.infinityforreddit.Utils.NotificationUtils;
|
import ml.docilealligator.infinityforreddit.Utils.NotificationUtils;
|
||||||
import ml.docilealligator.infinityforreddit.Utils.SharedPreferencesUtils;
|
import ml.docilealligator.infinityforreddit.Utils.SharedPreferencesUtils;
|
||||||
|
import okhttp3.OkHttpClient;
|
||||||
import okhttp3.ResponseBody;
|
import okhttp3.ResponseBody;
|
||||||
import retrofit2.Call;
|
import retrofit2.Call;
|
||||||
import retrofit2.Callback;
|
import retrofit2.Callback;
|
||||||
@ -72,6 +74,9 @@ public class DownloadMediaService extends Service {
|
|||||||
CustomThemeWrapper mCustomThemeWrapper;
|
CustomThemeWrapper mCustomThemeWrapper;
|
||||||
private int mediaType;
|
private int mediaType;
|
||||||
private String mimeType;
|
private String mimeType;
|
||||||
|
private NotificationManagerCompat notificationManager;
|
||||||
|
private NotificationCompat.Builder builder;
|
||||||
|
private boolean downloadFinished;
|
||||||
|
|
||||||
public DownloadMediaService() {
|
public DownloadMediaService() {
|
||||||
}
|
}
|
||||||
@ -129,12 +134,55 @@ public class DownloadMediaService extends Service {
|
|||||||
public int onStartCommand(Intent intent, int flags, int startId) {
|
public int onStartCommand(Intent intent, int flags, int startId) {
|
||||||
((Infinity) getApplication()).getAppComponent().inject(this);
|
((Infinity) getApplication()).getAppComponent().inject(this);
|
||||||
|
|
||||||
|
notificationManager = NotificationManagerCompat.from(this);
|
||||||
|
builder = new NotificationCompat.Builder(this, getNotificationChannelId());
|
||||||
|
|
||||||
|
downloadFinished = false;
|
||||||
String fileUrl = intent.getStringExtra(EXTRA_URL);
|
String fileUrl = intent.getStringExtra(EXTRA_URL);
|
||||||
final String[] fileName = {intent.getStringExtra(EXTRA_FILE_NAME)};
|
final String[] fileName = {intent.getStringExtra(EXTRA_FILE_NAME)};
|
||||||
String subredditName = intent.getStringExtra(EXTRA_SUBREDDIT_NAME);
|
String subredditName = intent.getStringExtra(EXTRA_SUBREDDIT_NAME);
|
||||||
mediaType = intent.getIntExtra(EXTRA_MEDIA_TYPE, EXTRA_MEDIA_TYPE_IMAGE);
|
mediaType = intent.getIntExtra(EXTRA_MEDIA_TYPE, EXTRA_MEDIA_TYPE_IMAGE);
|
||||||
mimeType = mediaType == EXTRA_MEDIA_TYPE_VIDEO ? "video/*" : "image/*";
|
mimeType = mediaType == EXTRA_MEDIA_TYPE_VIDEO ? "video/*" : "image/*";
|
||||||
|
|
||||||
|
final DownloadProgressResponseBody.ProgressListener progressListener = new DownloadProgressResponseBody.ProgressListener() {
|
||||||
|
boolean firstUpdate = true;
|
||||||
|
long time = 0;
|
||||||
|
|
||||||
|
@Override public void update(long bytesRead, long contentLength, boolean done) {
|
||||||
|
if (done) {
|
||||||
|
//updateNotification(0, null, -1, null);
|
||||||
|
} else {
|
||||||
|
if (firstUpdate) {
|
||||||
|
firstUpdate = false;
|
||||||
|
if (contentLength == -1) {
|
||||||
|
Log.i("adfasdf", "content-length: unknown");
|
||||||
|
} else {
|
||||||
|
Log.i("adfasdf", "content-length: " + contentLength);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (contentLength != -1) {
|
||||||
|
long currentTime = System.currentTimeMillis();
|
||||||
|
if ((currentTime - time) / 1000 > 2) {
|
||||||
|
time = currentTime;
|
||||||
|
updateNotification(0, (int) ((100 * bytesRead) / contentLength), null);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
OkHttpClient client = new OkHttpClient.Builder()
|
||||||
|
.addNetworkInterceptor(chain -> {
|
||||||
|
okhttp3.Response originalResponse = chain.proceed(chain.request());
|
||||||
|
return originalResponse.newBuilder()
|
||||||
|
.body(new DownloadProgressResponseBody(originalResponse.body(), progressListener))
|
||||||
|
.build();
|
||||||
|
})
|
||||||
|
.build();
|
||||||
|
|
||||||
|
retrofit = retrofit.newBuilder().client(client).build();
|
||||||
|
|
||||||
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
|
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
|
||||||
NotificationChannel serviceChannel;
|
NotificationChannel serviceChannel;
|
||||||
serviceChannel = new NotificationChannel(
|
serviceChannel = new NotificationChannel(
|
||||||
@ -151,19 +199,19 @@ public class DownloadMediaService extends Service {
|
|||||||
case EXTRA_MEDIA_TYPE_GIF:
|
case EXTRA_MEDIA_TYPE_GIF:
|
||||||
startForeground(
|
startForeground(
|
||||||
NotificationUtils.DOWNLOAD_GIF_NOTIFICATION_ID,
|
NotificationUtils.DOWNLOAD_GIF_NOTIFICATION_ID,
|
||||||
createNotification(R.string.downloading_gif, fileName[0], null)
|
createNotification(fileName[0])
|
||||||
);
|
);
|
||||||
break;
|
break;
|
||||||
case EXTRA_MEDIA_TYPE_VIDEO:
|
case EXTRA_MEDIA_TYPE_VIDEO:
|
||||||
startForeground(
|
startForeground(
|
||||||
NotificationUtils.DOWNLOAD_VIDEO_NOTIFICATION_ID,
|
NotificationUtils.DOWNLOAD_VIDEO_NOTIFICATION_ID,
|
||||||
createNotification(R.string.downloading_video, fileName[0], null)
|
createNotification(fileName[0])
|
||||||
);
|
);
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
startForeground(
|
startForeground(
|
||||||
NotificationUtils.DOWNLOAD_IMAGE_NOTIFICATION_ID,
|
NotificationUtils.DOWNLOAD_IMAGE_NOTIFICATION_ID,
|
||||||
createNotification(R.string.downloading_image, fileName[0], null)
|
createNotification(fileName[0])
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -183,12 +231,12 @@ public class DownloadMediaService extends Service {
|
|||||||
String directoryPath = separateDownloadFolder && subredditName != null && !subredditName.equals("") ? directory.getAbsolutePath() + "/Infinity/" + subredditName + "/" : directory.getAbsolutePath() + "/Infinity/";
|
String directoryPath = separateDownloadFolder && subredditName != null && !subredditName.equals("") ? directory.getAbsolutePath() + "/Infinity/" + subredditName + "/" : directory.getAbsolutePath() + "/Infinity/";
|
||||||
File infinityDir = new File(directoryPath);
|
File infinityDir = new File(directoryPath);
|
||||||
if (!infinityDir.exists() && !infinityDir.mkdirs()) {
|
if (!infinityDir.exists() && !infinityDir.mkdirs()) {
|
||||||
downloadFinished(null, fileName[0], ERROR_CANNOT_GET_DESTINATION_DIRECTORY);
|
downloadFinished(null, ERROR_CANNOT_GET_DESTINATION_DIRECTORY);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
destinationFileUriString = directoryPath + fileName[0];
|
destinationFileUriString = directoryPath + fileName[0];
|
||||||
} else {
|
} else {
|
||||||
downloadFinished(null, fileName[0], ERROR_CANNOT_GET_DESTINATION_DIRECTORY);
|
downloadFinished(null, ERROR_CANNOT_GET_DESTINATION_DIRECTORY);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
@ -203,21 +251,21 @@ public class DownloadMediaService extends Service {
|
|||||||
if (separateDownloadFolder && subredditName != null && !subredditName.equals("")) {
|
if (separateDownloadFolder && subredditName != null && !subredditName.equals("")) {
|
||||||
dir = DocumentFile.fromTreeUri(DownloadMediaService.this, Uri.parse(destinationFileDirectory));
|
dir = DocumentFile.fromTreeUri(DownloadMediaService.this, Uri.parse(destinationFileDirectory));
|
||||||
if (dir == null) {
|
if (dir == null) {
|
||||||
downloadFinished(null, fileName[0], ERROR_CANNOT_GET_DESTINATION_DIRECTORY);
|
downloadFinished(null, ERROR_CANNOT_GET_DESTINATION_DIRECTORY);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
dir = dir.findFile(subredditName);
|
dir = dir.findFile(subredditName);
|
||||||
if (dir == null) {
|
if (dir == null) {
|
||||||
dir = DocumentFile.fromTreeUri(DownloadMediaService.this, Uri.parse(destinationFileDirectory)).createDirectory(subredditName);
|
dir = DocumentFile.fromTreeUri(DownloadMediaService.this, Uri.parse(destinationFileDirectory)).createDirectory(subredditName);
|
||||||
if (dir == null) {
|
if (dir == null) {
|
||||||
downloadFinished(null, fileName[0], ERROR_CANNOT_GET_DESTINATION_DIRECTORY);
|
downloadFinished(null, ERROR_CANNOT_GET_DESTINATION_DIRECTORY);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
dir = DocumentFile.fromTreeUri(DownloadMediaService.this, Uri.parse(destinationFileDirectory));
|
dir = DocumentFile.fromTreeUri(DownloadMediaService.this, Uri.parse(destinationFileDirectory));
|
||||||
if (dir == null) {
|
if (dir == null) {
|
||||||
downloadFinished(null, fileName[0], ERROR_CANNOT_GET_DESTINATION_DIRECTORY);
|
downloadFinished(null, ERROR_CANNOT_GET_DESTINATION_DIRECTORY);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -232,7 +280,7 @@ public class DownloadMediaService extends Service {
|
|||||||
}
|
}
|
||||||
picFile = dir.createFile(mimeType, fileName[0]);
|
picFile = dir.createFile(mimeType, fileName[0]);
|
||||||
if (picFile == null) {
|
if (picFile == null) {
|
||||||
downloadFinished(null, fileName[0], ERROR_CANNOT_GET_DESTINATION_DIRECTORY);
|
downloadFinished(null, ERROR_CANNOT_GET_DESTINATION_DIRECTORY);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
destinationFileUriString = picFile.getUri().toString();
|
destinationFileUriString = picFile.getUri().toString();
|
||||||
@ -240,58 +288,59 @@ public class DownloadMediaService extends Service {
|
|||||||
|
|
||||||
new SaveImageOrGifAndCopyToExternalStorageAsyncTask(response.body(), mediaType,
|
new SaveImageOrGifAndCopyToExternalStorageAsyncTask(response.body(), mediaType,
|
||||||
isDefaultDestination, fileName[0], destinationFileUriString, getContentResolver(),
|
isDefaultDestination, fileName[0], destinationFileUriString, getContentResolver(),
|
||||||
new SaveImageOrGifAndCopyToExternalStorageAsyncTask.SaveImageOrGifAndCopyToExternalStorageAsyncTaskListener() {
|
(destinationFileUri, errorCode) -> downloadFinished(destinationFileUri, errorCode)).execute();
|
||||||
@Override
|
|
||||||
public void finished(Uri destinationFileUri, int errorCode) {
|
|
||||||
downloadFinished(destinationFileUri, fileName[0], errorCode);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void updateProgressNotification(int stringResId) {
|
|
||||||
updateNotification(stringResId, fileName[0], null);
|
|
||||||
}
|
|
||||||
}).execute();
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void onFailure(@NonNull Call<ResponseBody> call, @NonNull Throwable t) {
|
public void onFailure(@NonNull Call<ResponseBody> call, @NonNull Throwable t) {
|
||||||
downloadFinished(null, fileName[0], ERROR_FILE_CANNOT_DOWNLOAD);
|
downloadFinished(null, ERROR_FILE_CANNOT_DOWNLOAD);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
return super.onStartCommand(intent, flags, startId);
|
return super.onStartCommand(intent, flags, startId);
|
||||||
}
|
}
|
||||||
|
|
||||||
private Notification createNotification(int stringResId, String fileName, PendingIntent pendingIntent) {
|
private Notification createNotification(String fileName) {
|
||||||
NotificationCompat.Builder builder;
|
builder.setContentTitle(fileName).setContentText(getString(R.string.downloading))
|
||||||
builder = new NotificationCompat.Builder(this, getNotificationChannelId());
|
.setProgress(100, 0, false);
|
||||||
builder.setContentTitle(fileName).setContentText(getString(stringResId));
|
|
||||||
if (pendingIntent != null) {
|
|
||||||
builder.setContentIntent(pendingIntent);
|
|
||||||
}
|
|
||||||
return builder.setSmallIcon(R.drawable.ic_notification)
|
return builder.setSmallIcon(R.drawable.ic_notification)
|
||||||
.setColor(mCustomThemeWrapper.getColorPrimaryLightTheme())
|
.setColor(mCustomThemeWrapper.getColorPrimaryLightTheme())
|
||||||
.build();
|
.build();
|
||||||
}
|
}
|
||||||
|
|
||||||
private void updateNotification(int stringResId, String fileName, PendingIntent pendingIntent) {
|
private void updateNotification(int contentStringResId, int progress, PendingIntent pendingIntent) {
|
||||||
NotificationManager notificationManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
|
|
||||||
if (notificationManager != null) {
|
if (notificationManager != null) {
|
||||||
notificationManager.notify(getNotificationId(), createNotification(stringResId, fileName, pendingIntent));
|
if (progress < 0) {
|
||||||
|
builder.setProgress(0, 0, false);
|
||||||
|
} else {
|
||||||
|
builder.setProgress(100, progress, false);
|
||||||
|
}
|
||||||
|
if (contentStringResId != 0) {
|
||||||
|
builder.setContentText(getString(contentStringResId));
|
||||||
|
}
|
||||||
|
if (pendingIntent != null) {
|
||||||
|
builder.setContentIntent(pendingIntent);
|
||||||
|
}
|
||||||
|
notificationManager.notify(getNotificationId(), builder.build());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private void downloadFinished(Uri destinationFileUri, String fileName, int errorCode) {
|
private void downloadFinished(Uri destinationFileUri, int errorCode) {
|
||||||
|
if (downloadFinished) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
downloadFinished = true;
|
||||||
if (errorCode != NO_ERROR) {
|
if (errorCode != NO_ERROR) {
|
||||||
switch (errorCode) {
|
switch (errorCode) {
|
||||||
case ERROR_CANNOT_GET_DESTINATION_DIRECTORY:
|
case ERROR_CANNOT_GET_DESTINATION_DIRECTORY:
|
||||||
updateNotification(R.string.downloading_image_or_gif_failed_cannot_get_destination_directory, fileName, null);
|
updateNotification(R.string.downloading_image_or_gif_failed_cannot_get_destination_directory, -1, null);
|
||||||
break;
|
break;
|
||||||
case ERROR_FILE_CANNOT_DOWNLOAD:
|
case ERROR_FILE_CANNOT_DOWNLOAD:
|
||||||
updateNotification(R.string.downloading_media_failed_cannot_download_media, fileName, null);
|
updateNotification(R.string.downloading_media_failed_cannot_download_media, -1, null);
|
||||||
break;
|
break;
|
||||||
case ERROR_FILE_CANNOT_SAVE:
|
case ERROR_FILE_CANNOT_SAVE:
|
||||||
updateNotification(R.string.downloading_media_failed_cannot_save_to_destination_directory, fileName, null);
|
updateNotification(R.string.downloading_media_failed_cannot_save_to_destination_directory, -1, null);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
EventBus.getDefault().post(new DownloadMediaEvent(false));
|
EventBus.getDefault().post(new DownloadMediaEvent(false));
|
||||||
@ -304,7 +353,7 @@ public class DownloadMediaService extends Service {
|
|||||||
intent.setDataAndType(destinationFileUri, mimeType);
|
intent.setDataAndType(destinationFileUri, mimeType);
|
||||||
intent.setFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
|
intent.setFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
|
||||||
PendingIntent pendingIntent = PendingIntent.getActivity(this, 0, intent, PendingIntent.FLAG_CANCEL_CURRENT);
|
PendingIntent pendingIntent = PendingIntent.getActivity(this, 0, intent, PendingIntent.FLAG_CANCEL_CURRENT);
|
||||||
updateNotification(R.string.downloading_media_finished, fileName, pendingIntent);
|
updateNotification(R.string.downloading_media_finished, -1, pendingIntent);
|
||||||
EventBus.getDefault().post(new DownloadMediaEvent(true));
|
EventBus.getDefault().post(new DownloadMediaEvent(true));
|
||||||
}
|
}
|
||||||
);
|
);
|
||||||
@ -326,7 +375,6 @@ public class DownloadMediaService extends Service {
|
|||||||
|
|
||||||
interface SaveImageOrGifAndCopyToExternalStorageAsyncTaskListener {
|
interface SaveImageOrGifAndCopyToExternalStorageAsyncTaskListener {
|
||||||
void finished(Uri destinationFileUri, int errorCode);
|
void finished(Uri destinationFileUri, int errorCode);
|
||||||
void updateProgressNotification(int stringResId);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public SaveImageOrGifAndCopyToExternalStorageAsyncTask(ResponseBody response, int mediaType,
|
public SaveImageOrGifAndCopyToExternalStorageAsyncTask(ResponseBody response, int mediaType,
|
||||||
@ -344,25 +392,8 @@ public class DownloadMediaService extends Service {
|
|||||||
this.saveImageOrGifAndCopyToExternalStorageAsyncTaskListener = saveImageOrGifAndCopyToExternalStorageAsyncTaskListener;
|
this.saveImageOrGifAndCopyToExternalStorageAsyncTaskListener = saveImageOrGifAndCopyToExternalStorageAsyncTaskListener;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
|
||||||
protected void onProgressUpdate(Integer... values) {
|
|
||||||
super.onProgressUpdate(values);
|
|
||||||
saveImageOrGifAndCopyToExternalStorageAsyncTaskListener.updateProgressNotification(values[0]);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected Void doInBackground(Void... voids) {
|
protected Void doInBackground(Void... voids) {
|
||||||
switch (mediaType) {
|
|
||||||
case EXTRA_MEDIA_TYPE_IMAGE:
|
|
||||||
publishProgress(R.string.downloading_image_save_image);
|
|
||||||
break;
|
|
||||||
case EXTRA_MEDIA_TYPE_GIF:
|
|
||||||
publishProgress(R.string.downloading_gif_save_gif);
|
|
||||||
break;
|
|
||||||
case EXTRA_MEDIA_TYPE_VIDEO:
|
|
||||||
publishProgress(R.string.downloading_video_save_video);
|
|
||||||
}
|
|
||||||
|
|
||||||
try {
|
try {
|
||||||
writeResponseBodyToDisk(response);
|
writeResponseBodyToDisk(response);
|
||||||
} catch (IOException e) {
|
} catch (IOException e) {
|
||||||
|
@ -21,6 +21,7 @@ import android.os.Build;
|
|||||||
import android.os.Environment;
|
import android.os.Environment;
|
||||||
import android.os.IBinder;
|
import android.os.IBinder;
|
||||||
import android.provider.MediaStore;
|
import android.provider.MediaStore;
|
||||||
|
import android.util.Log;
|
||||||
|
|
||||||
import androidx.annotation.NonNull;
|
import androidx.annotation.NonNull;
|
||||||
import androidx.core.app.NotificationCompat;
|
import androidx.core.app.NotificationCompat;
|
||||||
@ -42,11 +43,13 @@ import javax.inject.Named;
|
|||||||
|
|
||||||
import ml.docilealligator.infinityforreddit.API.DownloadFile;
|
import ml.docilealligator.infinityforreddit.API.DownloadFile;
|
||||||
import ml.docilealligator.infinityforreddit.CustomTheme.CustomThemeWrapper;
|
import ml.docilealligator.infinityforreddit.CustomTheme.CustomThemeWrapper;
|
||||||
|
import ml.docilealligator.infinityforreddit.DownloadProgressResponseBody;
|
||||||
import ml.docilealligator.infinityforreddit.Event.DownloadRedditVideoEvent;
|
import ml.docilealligator.infinityforreddit.Event.DownloadRedditVideoEvent;
|
||||||
import ml.docilealligator.infinityforreddit.Infinity;
|
import ml.docilealligator.infinityforreddit.Infinity;
|
||||||
import ml.docilealligator.infinityforreddit.Utils.NotificationUtils;
|
|
||||||
import ml.docilealligator.infinityforreddit.R;
|
import ml.docilealligator.infinityforreddit.R;
|
||||||
|
import ml.docilealligator.infinityforreddit.Utils.NotificationUtils;
|
||||||
import ml.docilealligator.infinityforreddit.Utils.SharedPreferencesUtils;
|
import ml.docilealligator.infinityforreddit.Utils.SharedPreferencesUtils;
|
||||||
|
import okhttp3.OkHttpClient;
|
||||||
import okhttp3.ResponseBody;
|
import okhttp3.ResponseBody;
|
||||||
import retrofit2.Call;
|
import retrofit2.Call;
|
||||||
import retrofit2.Callback;
|
import retrofit2.Callback;
|
||||||
@ -92,6 +95,46 @@ public class DownloadRedditVideoService extends Service {
|
|||||||
public int onStartCommand(Intent intent, int flags, int startId) {
|
public int onStartCommand(Intent intent, int flags, int startId) {
|
||||||
((Infinity) getApplication()).getAppComponent().inject(this);
|
((Infinity) getApplication()).getAppComponent().inject(this);
|
||||||
|
|
||||||
|
|
||||||
|
final DownloadProgressResponseBody.ProgressListener progressListener = new DownloadProgressResponseBody.ProgressListener() {
|
||||||
|
boolean firstUpdate = true;
|
||||||
|
|
||||||
|
@Override public void update(long bytesRead, long contentLength, boolean done) {
|
||||||
|
if (done) {
|
||||||
|
Log.i("adfasdf", "completed");
|
||||||
|
} else {
|
||||||
|
if (firstUpdate) {
|
||||||
|
firstUpdate = false;
|
||||||
|
if (contentLength == -1) {
|
||||||
|
Log.i("adfasdf", "content-length: unknown");
|
||||||
|
} else {
|
||||||
|
Log.i("adfasdf", "content-length: " + contentLength);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
Log.i("adfasdf", "bytes read " + bytesRead);
|
||||||
|
|
||||||
|
if (contentLength != -1) {
|
||||||
|
Log.i("adfasdf", "progress: " + ((100 * bytesRead) / contentLength));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
OkHttpClient client = new OkHttpClient.Builder()
|
||||||
|
.addNetworkInterceptor(chain -> {
|
||||||
|
okhttp3.Response originalResponse = chain.proceed(chain.request());
|
||||||
|
return originalResponse.newBuilder()
|
||||||
|
.body(new DownloadProgressResponseBody(originalResponse.body(), progressListener))
|
||||||
|
.build();
|
||||||
|
})
|
||||||
|
.build();
|
||||||
|
|
||||||
|
retrofit = retrofit.newBuilder().client(client).build();
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
String videoUrl = intent.getStringExtra(EXTRA_VIDEO_URL);
|
String videoUrl = intent.getStringExtra(EXTRA_VIDEO_URL);
|
||||||
String audioUrl = videoUrl.substring(0, videoUrl.lastIndexOf('/')) + "/DASH_audio.mp4";
|
String audioUrl = videoUrl.substring(0, videoUrl.lastIndexOf('/')) + "/DASH_audio.mp4";
|
||||||
String subredditName = intent.getStringExtra(EXTRA_SUBREDDIT);
|
String subredditName = intent.getStringExtra(EXTRA_SUBREDDIT);
|
||||||
|
@ -857,10 +857,7 @@
|
|||||||
<string name="downloading_video">Downloading Video</string>
|
<string name="downloading_video">Downloading Video</string>
|
||||||
<string name="downloading_video_save_video">Saving Video</string>
|
<string name="downloading_video_save_video">Saving Video</string>
|
||||||
|
|
||||||
<string name="downloading_image">Downloading Image</string>
|
<string name="downloading">Downloading</string>
|
||||||
<string name="downloading_gif">Downloading Gif</string>
|
|
||||||
<string name="downloading_image_save_image">Saving Image</string>
|
|
||||||
<string name="downloading_gif_save_gif">Saving Gif</string>
|
|
||||||
<string name="downloading_media_finished">Downloaded</string>
|
<string name="downloading_media_finished">Downloaded</string>
|
||||||
<string name="downloading_image_or_gif_failed_cannot_get_destination_directory">Download failed: cannot access destination directory</string>
|
<string name="downloading_image_or_gif_failed_cannot_get_destination_directory">Download failed: cannot access destination directory</string>
|
||||||
<string name="downloading_media_failed_cannot_download_media">Download failed</string>
|
<string name="downloading_media_failed_cannot_download_media">Download failed</string>
|
||||||
|
Loading…
Reference in New Issue
Block a user