19
19
import android .text .Editable ;
20
20
import android .text .Spanned ;
21
21
import android .text .TextUtils ;
22
+ import android .util .ArrayMap ;
22
23
import android .view .ContextThemeWrapper ;
23
24
import android .view .DragEvent ;
24
25
import android .view .Menu ;
@@ -257,6 +258,7 @@ enum RestartEditorOptions {
257
258
private boolean mShowAztecEditor ;
258
259
private boolean mShowGutenbergEditor ;
259
260
private boolean mMediaInsertedOnCreation ;
261
+ private boolean mAllowMultipleSelection ;
260
262
261
263
private List <String > mPendingVideoPressInfoRequests ;
262
264
private List <String > mAztecBackspaceDeletedOrGbBlockDeletedMediaItemIds = new ArrayList <>();
@@ -1204,8 +1206,9 @@ public void onMediaToolbarButtonClicked(MediaToolbarAction action) {
1204
1206
* picker, or WP media picker
1205
1207
*/
1206
1208
@ Override
1207
- public void onPhotoPickerIconClicked (@ NonNull PhotoPickerIcon icon ) {
1209
+ public void onPhotoPickerIconClicked (@ NonNull PhotoPickerIcon icon , boolean allowMultipleSelection ) {
1208
1210
hidePhotoPicker ();
1211
+ mAllowMultipleSelection = allowMultipleSelection ;
1209
1212
switch (icon ) {
1210
1213
case ANDROID_CAPTURE_PHOTO :
1211
1214
launchCamera ();
@@ -1787,13 +1790,11 @@ private void onUploadProgress(MediaModel media, float progress) {
1787
1790
}
1788
1791
1789
1792
private void launchPictureLibrary () {
1790
- // don't allow multiple selection for Gutenberg, as we're on a single image block for now
1791
- WPMediaUtils .launchPictureLibrary (this , !mShowGutenbergEditor );
1793
+ WPMediaUtils .launchPictureLibrary (this , mAllowMultipleSelection );
1792
1794
}
1793
1795
1794
1796
private void launchVideoLibrary () {
1795
- // don't allow multiple selection for Gutenberg, as we're on a single image block for now
1796
- WPMediaUtils .launchVideoLibrary (this , !mShowGutenbergEditor );
1797
+ WPMediaUtils .launchVideoLibrary (this , mAllowMultipleSelection );
1797
1798
}
1798
1799
1799
1800
private void launchVideoCamera () {
@@ -2522,6 +2523,24 @@ private boolean addExistingMediaToEditor(@NonNull AddExistingdMediaSource source
2522
2523
return true ;
2523
2524
}
2524
2525
2526
+ private void addExistingMediaToEditor (@ NonNull AddExistingdMediaSource source , List <Long > mediaIdList ) {
2527
+ ArrayMap <String , MediaFile > mediaMap = new ArrayMap <>();
2528
+ for (Long mediaId : mediaIdList ) {
2529
+ MediaModel media = mMediaStore .getSiteMediaWithId (mSite , mediaId );
2530
+ if (media == null ) {
2531
+ AppLog .w (T .MEDIA , "Cannot add null media to post" );
2532
+ } else {
2533
+ trackAddMediaEvent (source , media );
2534
+
2535
+ MediaFile mediaFile = FluxCUtils .mediaFileFromMediaModel (media );
2536
+ String urlToUse = TextUtils .isEmpty (media .getUrl ()) ? media .getFilePath () : media .getUrl ();
2537
+
2538
+ mediaMap .put (urlToUse , mediaFile );
2539
+ }
2540
+ }
2541
+ mEditorFragment .appendMediaFiles (mediaMap );
2542
+ }
2543
+
2525
2544
private class LoadPostContentTask extends AsyncTask <String , Spanned , Spanned > {
2526
2545
@ Override
2527
2546
protected Spanned doInBackground (String ... params ) {
@@ -2826,7 +2845,7 @@ private boolean addMedia(Uri mediaUri, boolean isNew) {
2826
2845
private void addMediaList (@ NonNull List <Uri > uriList , boolean isNew ) {
2827
2846
// fetch any shared media first - must be done on the main thread
2828
2847
List <Uri > fetchedUriList = fetchMediaList (uriList );
2829
- mAddMediaListThread = new AddMediaListThread (fetchedUriList , isNew );
2848
+ mAddMediaListThread = new AddMediaListThread (fetchedUriList , isNew , mAllowMultipleSelection );
2830
2849
mAddMediaListThread .start ();
2831
2850
}
2832
2851
@@ -2849,13 +2868,23 @@ private class AddMediaListThread extends Thread {
2849
2868
private final boolean mIsNew ;
2850
2869
private ProgressDialog mProgressDialog ;
2851
2870
private boolean mDidAnyFail ;
2871
+ private int mFinishedUploads = 0 ;
2872
+ private boolean mAllowMultipleSelection = false ;
2873
+ private Map <String , MediaFile > mediaMap = new ArrayMap <>();
2852
2874
2853
2875
AddMediaListThread (@ NonNull List <Uri > uriList , boolean isNew ) {
2854
2876
this .mUriList .addAll (uriList );
2855
2877
this .mIsNew = isNew ;
2856
2878
showOverlay (false );
2857
2879
}
2858
2880
2881
+ AddMediaListThread (@ NonNull List <Uri > uriList , boolean isNew , boolean allowMultipleSelection ) {
2882
+ this .mUriList .addAll (uriList );
2883
+ this .mIsNew = isNew ;
2884
+ this .mAllowMultipleSelection = allowMultipleSelection ;
2885
+ showOverlay (false );
2886
+ }
2887
+
2859
2888
private void showProgressDialog (final boolean show ) {
2860
2889
runOnUiThread (new Runnable () {
2861
2890
@ Override
@@ -2955,20 +2984,45 @@ private boolean processMedia(Uri mediaUri) {
2955
2984
}
2956
2985
2957
2986
private void postProcessMedia (final Uri mediaUri , final String path , final boolean isVideo ) {
2958
- runOnUiThread ( new Runnable ( ) {
2959
- @ Override
2960
- public void run ( ) {
2961
- addMediaVisualEditor ( mediaUri , path );
2987
+ if ( mAllowMultipleSelection ) {
2988
+ MediaFile mediaFile = getMediaFile ( mediaUri );
2989
+ if ( mediaFile != null ) {
2990
+ mediaMap . put ( path , mediaFile );
2962
2991
}
2963
- });
2992
+ mFinishedUploads ++;
2993
+ if (mUriList .size () == mFinishedUploads ) {
2994
+ runOnUiThread (new Runnable () {
2995
+ @ Override
2996
+ public void run () {
2997
+ mEditorFragment .appendMediaFiles (mediaMap );
2998
+ }
2999
+ });
3000
+ }
3001
+ } else {
3002
+ runOnUiThread (new Runnable () {
3003
+ @ Override
3004
+ public void run () {
3005
+ addMediaVisualEditor (mediaUri , path );
3006
+ }
3007
+ });
3008
+ }
2964
3009
}
2965
3010
}
2966
3011
2967
3012
private void addMediaVisualEditor (Uri uri , String path ) {
3013
+ MediaFile mediaFile = getMediaFile (uri );
3014
+ if (mediaFile != null ) {
3015
+ mEditorFragment .appendMediaFile (mediaFile , path , mImageLoader );
3016
+ }
3017
+ }
3018
+
3019
+ private MediaFile getMediaFile (Uri uri ) {
2968
3020
MediaModel media = queueFileForUpload (uri , getContentResolver ().getType (uri ));
2969
3021
MediaFile mediaFile = FluxCUtils .mediaFileFromMediaModel (media );
2970
3022
if (media != null ) {
2971
- mEditorFragment .appendMediaFile (mediaFile , path , mImageLoader );
3023
+ return mediaFile ;
3024
+ } else {
3025
+ return null ;
2972
3026
}
2973
3027
}
2974
3028
@@ -2996,10 +3050,12 @@ private void addMediaLegacyEditor(Uri mediaUri, boolean isVideo) {
2996
3050
private void addMediaItemGroupOrSingleItem (Intent data ) {
2997
3051
ClipData clipData = data .getClipData ();
2998
3052
if (clipData != null ) {
3053
+ ArrayList <Uri > uriList = new ArrayList <>();
2999
3054
for (int i = 0 ; i < clipData .getItemCount (); i ++) {
3000
3055
ClipData .Item item = clipData .getItemAt (i );
3001
- addMedia (item .getUri (), false );
3056
+ uriList . add (item .getUri ());
3002
3057
}
3058
+ addMediaList (uriList , false );
3003
3059
} else {
3004
3060
addMedia (data .getData (), false );
3005
3061
}
@@ -3229,8 +3285,14 @@ private void handleMediaPickerResult(Intent data) {
3229
3285
if (ids .size () > 1 && allAreImages && !mShowGutenbergEditor ) {
3230
3286
showInsertMediaDialog (ids );
3231
3287
} else {
3232
- for (Long id : ids ) {
3233
- addExistingMediaToEditor (AddExistingdMediaSource .WP_MEDIA_LIBRARY , id );
3288
+ // if mAllowMultipleSelection and gutenberg editor, pass all ids to addExistingMediaToEditor at once
3289
+ if (mShowGutenbergEditor && mAllowMultipleSelection ) {
3290
+ addExistingMediaToEditor (AddExistingdMediaSource .WP_MEDIA_LIBRARY , ids );
3291
+ mAllowMultipleSelection = false ;
3292
+ } else {
3293
+ for (Long id : ids ) {
3294
+ addExistingMediaToEditor (AddExistingdMediaSource .WP_MEDIA_LIBRARY , id );
3295
+ }
3234
3296
}
3235
3297
savePostAsync (null );
3236
3298
}
@@ -3462,33 +3524,35 @@ public void onAddMediaClicked() {
3462
3524
}
3463
3525
3464
3526
@ Override
3465
- public void onAddMediaImageClicked () {
3527
+ public void onAddMediaImageClicked (boolean allowMultipleSelection ) {
3528
+ mAllowMultipleSelection = allowMultipleSelection ;
3466
3529
ActivityLauncher .viewMediaPickerForResult (this , mSite , MediaBrowserType .GUTENBERG_IMAGE_PICKER );
3467
3530
}
3468
3531
3469
3532
@ Override
3470
- public void onAddMediaVideoClicked () {
3533
+ public void onAddMediaVideoClicked (boolean allowMultipleSelection ) {
3534
+ mAllowMultipleSelection = allowMultipleSelection ;
3471
3535
ActivityLauncher .viewMediaPickerForResult (this , mSite , MediaBrowserType .GUTENBERG_VIDEO_PICKER );
3472
3536
}
3473
3537
3474
3538
@ Override
3475
- public void onAddPhotoClicked () {
3476
- onPhotoPickerIconClicked (PhotoPickerIcon .ANDROID_CHOOSE_PHOTO );
3539
+ public void onAddPhotoClicked (boolean allowMultipleSelection ) {
3540
+ onPhotoPickerIconClicked (PhotoPickerIcon .ANDROID_CHOOSE_PHOTO , allowMultipleSelection );
3477
3541
}
3478
3542
3479
3543
@ Override
3480
3544
public void onCapturePhotoClicked () {
3481
- onPhotoPickerIconClicked (PhotoPickerIcon .ANDROID_CAPTURE_PHOTO );
3545
+ onPhotoPickerIconClicked (PhotoPickerIcon .ANDROID_CAPTURE_PHOTO , false );
3482
3546
}
3483
3547
3484
3548
@ Override
3485
- public void onAddVideoClicked () {
3486
- onPhotoPickerIconClicked (PhotoPickerIcon .ANDROID_CHOOSE_VIDEO );
3549
+ public void onAddVideoClicked (boolean allowMultipleSelectio ) {
3550
+ onPhotoPickerIconClicked (PhotoPickerIcon .ANDROID_CHOOSE_VIDEO , allowMultipleSelectio );
3487
3551
}
3488
3552
3489
3553
@ Override
3490
3554
public void onCaptureVideoClicked () {
3491
- onPhotoPickerIconClicked (PhotoPickerIcon .ANDROID_CAPTURE_VIDEO );
3555
+ onPhotoPickerIconClicked (PhotoPickerIcon .ANDROID_CAPTURE_VIDEO , false );
3492
3556
}
3493
3557
3494
3558
@ Override
0 commit comments