20
20
import android .os .Environment ;
21
21
import android .os .PersistableBundle ;
22
22
import android .provider .MediaStore ;
23
- import android .util .Log ;
24
23
25
24
import androidx .core .app .NotificationChannelCompat ;
26
25
import androidx .core .app .NotificationCompat ;
35
34
import java .io .InputStream ;
36
35
import java .io .OutputStream ;
37
36
import java .util .ArrayList ;
37
+ import java .util .List ;
38
38
import java .util .Random ;
39
39
import java .util .concurrent .Executor ;
40
40
@@ -69,6 +69,7 @@ public class DownloadMediaService extends JobService {
69
69
public static final String EXTRA_IS_NSFW = "EIN" ;
70
70
public static final String EXTRA_REDGIFS_ID = "EGI" ;
71
71
public static final String EXTRA_STREAMABLE_SHORT_CODE = "ESSC" ;
72
+ public static final String EXTRA_IS_ALL_GALLERY_MEDIA = "EIAGM" ;
72
73
public static final int EXTRA_MEDIA_TYPE_IMAGE = 0 ;
73
74
public static final int EXTRA_MEDIA_TYPE_GIF = 1 ;
74
75
public static final int EXTRA_MEDIA_TYPE_VIDEO = 2 ;
@@ -82,7 +83,8 @@ public class DownloadMediaService extends JobService {
82
83
private static final int ERROR_FILE_CANNOT_DOWNLOAD = 1 ;
83
84
private static final int ERROR_FILE_CANNOT_SAVE = 2 ;
84
85
private static final int ERROR_FILE_CANNOT_FETCH_REDGIFS_VIDEO_LINK = 3 ;
85
- private static final int ERROR_FILE_CANNOT_FETCH_STREAMABLE_VIDEO_LINK = 4 ;
86
+ private static final int ERROR_CANNOT_FETCH_STREAMABLE_VIDEO_LINK = 4 ;
87
+ private static final int ERROR_INVALID_ARGUMENT = 5 ;
86
88
87
89
private static int JOB_ID = 20000 ;
88
90
@@ -125,13 +127,13 @@ public static JobInfo constructJobInfo(Context context, long contentEstimatedByt
125
127
extras .putString (EXTRA_FILE_NAME , post .getSubredditName ()
126
128
+ "-" + post .getId () + ".jpg" );
127
129
extras .putString (EXTRA_SUBREDDIT_NAME , post .getSubredditName ());
128
- extras .putInt (EXTRA_IS_NSFW , post .isNSFW () ? 1 : 0 );
130
+ extras .putBoolean (EXTRA_IS_NSFW , post .isNSFW ());
129
131
} else if (post .getPostType () == Post .GIF_TYPE ) {
130
132
extras .putString (EXTRA_URL , post .getVideoUrl ());
131
133
extras .putInt (EXTRA_MEDIA_TYPE , EXTRA_MEDIA_TYPE_GIF );
132
134
extras .putString (EXTRA_FILE_NAME , post .getSubredditName () + "-" + post .getId () + ".gif" );
133
135
extras .putString (EXTRA_SUBREDDIT_NAME , post .getSubredditName ());
134
- extras .putInt (EXTRA_IS_NSFW , post .isNSFW () ? 1 : 0 );
136
+ extras .putBoolean (EXTRA_IS_NSFW , post .isNSFW ());
135
137
} else if (post .getPostType () == Post .VIDEO_TYPE ) {
136
138
if (post .isStreamable ()) {
137
139
if (post .isLoadRedgifsOrStreamableVideoSuccess ()) {
@@ -160,21 +162,21 @@ public static JobInfo constructJobInfo(Context context, long contentEstimatedByt
160
162
161
163
extras .putInt (EXTRA_MEDIA_TYPE , EXTRA_MEDIA_TYPE_VIDEO );
162
164
extras .putString (EXTRA_SUBREDDIT_NAME , post .getSubredditName ());
163
- extras .putInt (EXTRA_IS_NSFW , post .isNSFW () ? 1 : 0 );
165
+ extras .putBoolean (EXTRA_IS_NSFW , post .isNSFW ());
164
166
} else if (post .getPostType () == Post .GALLERY_TYPE ) {
165
167
Post .Gallery media = post .getGallery ().get (galleryIndex );
166
168
if (media .mediaType == Post .Gallery .TYPE_VIDEO ) {
167
169
extras .putString (EXTRA_URL , media .url );
168
170
extras .putInt (EXTRA_MEDIA_TYPE , EXTRA_MEDIA_TYPE_VIDEO );
169
171
extras .putString (EXTRA_FILE_NAME , media .fileName );
170
172
extras .putString (EXTRA_SUBREDDIT_NAME , post .getSubredditName ());
171
- extras .putInt (EXTRA_IS_NSFW , post .isNSFW () ? 1 : 0 );
173
+ extras .putBoolean (EXTRA_IS_NSFW , post .isNSFW ());
172
174
} else {
173
175
extras .putString (EXTRA_URL , media .hasFallback () ? media .fallbackUrl : media .url ); // Retrieve original instead of the one additionally compressed by reddit
174
176
extras .putInt (EXTRA_MEDIA_TYPE , media .mediaType == Post .Gallery .TYPE_GIF ? EXTRA_MEDIA_TYPE_GIF : EXTRA_MEDIA_TYPE_IMAGE );
175
177
extras .putString (EXTRA_FILE_NAME , media .fileName );
176
178
extras .putString (EXTRA_SUBREDDIT_NAME , post .getSubredditName ());
177
- extras .putInt (EXTRA_IS_NSFW , post .isNSFW () ? 1 : 0 );
179
+ extras .putBoolean (EXTRA_IS_NSFW , post .isNSFW ());
178
180
}
179
181
}
180
182
@@ -193,11 +195,11 @@ public static JobInfo constructJobInfo(Context context, long contentEstimatedByt
193
195
}
194
196
}
195
197
196
- public static JobInfo constructGalleryDownloadAllImagesJobInfo (Context context , long contentEstimatedBytes , Post post ) {
198
+ public static JobInfo constructGalleryDownloadAllMediaJobInfo (Context context , long contentEstimatedBytes , Post post ) {
197
199
PersistableBundle extras = new PersistableBundle ();
198
200
if (post .getPostType () == Post .GALLERY_TYPE ) {
199
201
extras .putString (EXTRA_SUBREDDIT_NAME , post .getSubredditName ());
200
- extras .putInt (EXTRA_IS_NSFW , post .isNSFW () ? 1 : 0 );
202
+ extras .putBoolean (EXTRA_IS_NSFW , post .isNSFW ());
201
203
202
204
ArrayList <Post .Gallery > gallery = post .getGallery ();
203
205
@@ -234,6 +236,7 @@ public static JobInfo constructGalleryDownloadAllImagesJobInfo(Context context,
234
236
extras .putString (EXTRA_ALL_GALLERY_IMAGE_URLS , concatUrlsBuilder .toString ());
235
237
extras .putString (EXTRA_ALL_GALLERY_IMAGE_MEDIA_TYPES , concatMediaTypesBuilder .toString ());
236
238
extras .putString (EXTRA_ALL_GALLERY_IMAGE_FILE_NAMES , concatFileNamesBuilder .toString ());
239
+ extras .putBoolean (EXTRA_IS_ALL_GALLERY_MEDIA , true );
237
240
}
238
241
239
242
if (Build .VERSION .SDK_INT >= Build .VERSION_CODES .UPSIDE_DOWN_CAKE ) {
@@ -276,6 +279,58 @@ public static JobInfo constructJobInfo(Context context, long contentEstimatedByt
276
279
}
277
280
}
278
281
282
+ public static JobInfo constructImgurAlbumDownloadAllMediaJobInfo (Context context , long contentEstimatedBytes , List <ImgurMedia > imgurMedia ) {
283
+ PersistableBundle extras = new PersistableBundle ();
284
+
285
+ StringBuilder concatUrlsBuilder = new StringBuilder ();
286
+ StringBuilder concatMediaTypesBuilder = new StringBuilder ();
287
+ StringBuilder concatFileNamesBuilder = new StringBuilder ();
288
+
289
+ for (int i = 0 ; i < imgurMedia .size (); i ++) {
290
+ ImgurMedia media = imgurMedia .get (i );
291
+
292
+ if (media .getType () == ImgurMedia .TYPE_VIDEO ) {
293
+ concatUrlsBuilder .append (media .getLink ()).append (" " );
294
+ concatMediaTypesBuilder .append (EXTRA_MEDIA_TYPE_VIDEO ).append (" " );
295
+ concatFileNamesBuilder .append (media .getFileName ()).append (" " );
296
+ } else {
297
+ concatUrlsBuilder .append (media .getLink ()).append (" " ); // Retrieve original instead of the one additionally compressed by reddit
298
+ concatMediaTypesBuilder .append (EXTRA_MEDIA_TYPE_IMAGE ).append (" " );
299
+ concatFileNamesBuilder .append (media .getFileName ()).append (" " );
300
+ }
301
+ }
302
+
303
+ if (concatUrlsBuilder .length () > 0 ) {
304
+ concatUrlsBuilder .deleteCharAt (concatUrlsBuilder .length () - 1 );
305
+ }
306
+
307
+ if (concatMediaTypesBuilder .length () > 0 ) {
308
+ concatMediaTypesBuilder .deleteCharAt (concatMediaTypesBuilder .length () - 1 );
309
+ }
310
+
311
+ if (concatFileNamesBuilder .length () > 0 ) {
312
+ concatFileNamesBuilder .deleteCharAt (concatFileNamesBuilder .length () - 1 );
313
+ }
314
+
315
+ extras .putString (EXTRA_ALL_GALLERY_IMAGE_URLS , concatUrlsBuilder .toString ());
316
+ extras .putString (EXTRA_ALL_GALLERY_IMAGE_MEDIA_TYPES , concatMediaTypesBuilder .toString ());
317
+ extras .putString (EXTRA_ALL_GALLERY_IMAGE_FILE_NAMES , concatFileNamesBuilder .toString ());
318
+
319
+ if (Build .VERSION .SDK_INT >= Build .VERSION_CODES .UPSIDE_DOWN_CAKE ) {
320
+ return new JobInfo .Builder (JOB_ID ++, new ComponentName (context , DownloadMediaService .class ))
321
+ .setUserInitiated (true )
322
+ .setRequiredNetwork (new NetworkRequest .Builder ().clearCapabilities ().build ())
323
+ .setEstimatedNetworkBytes (0 , contentEstimatedBytes + 500 )
324
+ .setExtras (extras )
325
+ .build ();
326
+ } else {
327
+ return new JobInfo .Builder (JOB_ID ++, new ComponentName (context , DownloadMediaService .class ))
328
+ .setOverrideDeadline (0 )
329
+ .setExtras (extras )
330
+ .build ();
331
+ }
332
+ }
333
+
279
334
public static JobInfo constructJobInfo (Context context , long contentEstimatedBytes , PersistableBundle extras ) {
280
335
if (Build .VERSION .SDK_INT >= Build .VERSION_CODES .UPSIDE_DOWN_CAKE ) {
281
336
return new JobInfo .Builder (JOB_ID ++, new ComponentName (context , DownloadMediaService .class ))
@@ -296,7 +351,6 @@ public static JobInfo constructJobInfo(Context context, long contentEstimatedByt
296
351
public void onCreate () {
297
352
((Infinity ) getApplication ()).getAppComponent ().inject (this );
298
353
notificationManager = NotificationManagerCompat .from (this );
299
- Log .i ("asdfasdf" , "s " + JOB_ID );
300
354
}
301
355
302
356
@ Override
@@ -314,7 +368,10 @@ public boolean onStartJob(JobParameters params) {
314
368
notificationManager .createNotificationChannel (serviceChannel );
315
369
316
370
int randomNotificationIdOffset = new Random ().nextInt (10000 );
317
- String notificationTitle = extras .containsKey (EXTRA_FILE_NAME ) ? extras .getString (EXTRA_FILE_NAME ) : getString (R .string .download_all_gallery_media_notification_title );
371
+ String notificationTitle = extras .containsKey (EXTRA_FILE_NAME ) ?
372
+ extras .getString (EXTRA_FILE_NAME ) :
373
+ (extras .getBoolean (EXTRA_IS_ALL_GALLERY_MEDIA , false ) ?
374
+ getString (R .string .download_all_gallery_media_notification_title ) : getString (R .string .download_all_imgur_album_media_notification_title ));
318
375
switch (extras .getInt (EXTRA_MEDIA_TYPE , EXTRA_MEDIA_TYPE_IMAGE )) {
319
376
case EXTRA_MEDIA_TYPE_GIF :
320
377
if (Build .VERSION .SDK_INT >= Build .VERSION_CODES .UPSIDE_DOWN_CAKE ) {
@@ -352,7 +409,7 @@ public boolean onStartJob(JobParameters params) {
352
409
353
410
mExecutor .execute (() -> {
354
411
String subredditName = extras .getString (EXTRA_SUBREDDIT_NAME );
355
- boolean isNsfw = extras .getInt (EXTRA_IS_NSFW , 0 ) == 1 ;
412
+ boolean isNsfw = extras .getBoolean (EXTRA_IS_NSFW , false ) ;
356
413
357
414
if (extras .containsKey (EXTRA_ALL_GALLERY_IMAGE_URLS )) {
358
415
// Download all images in a gallery post
@@ -452,14 +509,23 @@ private boolean downloadMedia(JobParameters params, String fileUrl, PersistableB
452
509
// Only Redgifs and Streamble video can go inside this if clause.
453
510
String redgifsId = intent .getString (EXTRA_REDGIFS_ID , null );
454
511
String streamableShortCode = intent .getString (EXTRA_STREAMABLE_SHORT_CODE , null );
512
+
513
+ if (redgifsId == null && streamableShortCode == null ) {
514
+ downloadFinished (params , builder , mediaType , randomNotificationIdOffset , mimeType ,
515
+ null ,
516
+ ERROR_INVALID_ARGUMENT ,
517
+ multipleDownloads );
518
+ return false ;
519
+ }
520
+
455
521
fileUrl = VideoLinkFetcher .fetchVideoLinkSync (mRedgifsRetrofit , mStreamableApiProvider , mCurrentAccountSharedPreferences ,
456
522
redgifsId == null ? ViewVideoActivity .VIDEO_TYPE_STREAMABLE : ViewVideoActivity .VIDEO_TYPE_REDGIFS ,
457
523
redgifsId , streamableShortCode );
458
524
459
525
if (fileUrl == null ) {
460
526
downloadFinished (params , builder , mediaType , randomNotificationIdOffset , mimeType ,
461
527
null ,
462
- redgifsId == null ? ERROR_FILE_CANNOT_FETCH_STREAMABLE_VIDEO_LINK : ERROR_FILE_CANNOT_FETCH_REDGIFS_VIDEO_LINK ,
528
+ redgifsId == null ? ERROR_CANNOT_FETCH_STREAMABLE_VIDEO_LINK : ERROR_FILE_CANNOT_FETCH_REDGIFS_VIDEO_LINK ,
463
529
multipleDownloads );
464
530
return false ;
465
531
}
@@ -783,11 +849,15 @@ private void downloadFinished(JobParameters parameters, NotificationCompat.Build
783
849
-1 , randomNotificationIdOffset , null , null );
784
850
break ;
785
851
case ERROR_FILE_CANNOT_FETCH_REDGIFS_VIDEO_LINK :
786
- updateNotification (builder , mediaType , R .string .downloading_media_failed_cannot_fetch_redgifs_url ,
852
+ updateNotification (builder , mediaType , R .string .download_media_failed_cannot_fetch_redgifs_url ,
853
+ -1 , randomNotificationIdOffset , null , null );
854
+ break ;
855
+ case ERROR_CANNOT_FETCH_STREAMABLE_VIDEO_LINK :
856
+ updateNotification (builder , mediaType , R .string .download_media_failed_cannot_fetch_streamable_url ,
787
857
-1 , randomNotificationIdOffset , null , null );
788
858
break ;
789
- case ERROR_FILE_CANNOT_FETCH_STREAMABLE_VIDEO_LINK :
790
- updateNotification (builder , mediaType , R .string .downloading_media_failed_cannot_fetch_streamable_url ,
859
+ case ERROR_INVALID_ARGUMENT :
860
+ updateNotification (builder , mediaType , R .string .download_media_failed_invalid_argument ,
791
861
-1 , randomNotificationIdOffset , null , null );
792
862
break ;
793
863
}
0 commit comments