Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

feat: support multiple prop in gutenberg editor #10556

Merged
merged 18 commits into from
Oct 2, 2019
Merged
Original file line number Diff line number Diff line change
Expand Up @@ -288,7 +288,7 @@ public void onPhotoPickerMediaChosen(@NonNull List<Uri> uriList) {
}

@Override
public void onPhotoPickerIconClicked(@NonNull PhotoPickerFragment.PhotoPickerIcon icon) {
public void onPhotoPickerIconClicked(@NonNull PhotoPickerFragment.PhotoPickerIcon icon, boolean multiple) {
switch (icon) {
case ANDROID_CAPTURE_PHOTO:
launchCamera();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -68,7 +68,7 @@ public enum PhotoPickerIcon {
public interface PhotoPickerListener {
void onPhotoPickerMediaChosen(@NonNull List<Uri> uriList);

void onPhotoPickerIconClicked(@NonNull PhotoPickerIcon icon);
void onPhotoPickerIconClicked(@NonNull PhotoPickerIcon icon, boolean allowMultipleSelection);
}

private EmptyViewRecyclerView mRecycler;
Expand Down Expand Up @@ -252,7 +252,7 @@ public void doIconClicked(@NonNull PhotoPickerIcon icon) {
}

if (mListener != null) {
mListener.onPhotoPickerIconClicked(icon);
mListener.onPhotoPickerIconClicked(icon, false);
}
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@
import android.text.Editable;
import android.text.Spanned;
import android.text.TextUtils;
import android.util.ArrayMap;
import android.view.ContextThemeWrapper;
import android.view.DragEvent;
import android.view.Menu;
Expand Down Expand Up @@ -257,6 +258,7 @@ enum RestartEditorOptions {
private boolean mShowAztecEditor;
private boolean mShowGutenbergEditor;
private boolean mMediaInsertedOnCreation;
private boolean mAllowMultipleSelection;

private List<String> mPendingVideoPressInfoRequests;
private List<String> mAztecBackspaceDeletedOrGbBlockDeletedMediaItemIds = new ArrayList<>();
Expand Down Expand Up @@ -1204,8 +1206,9 @@ public void onMediaToolbarButtonClicked(MediaToolbarAction action) {
* picker, or WP media picker
*/
@Override
public void onPhotoPickerIconClicked(@NonNull PhotoPickerIcon icon) {
public void onPhotoPickerIconClicked(@NonNull PhotoPickerIcon icon, boolean allowMultipleSelection) {
hidePhotoPicker();
mAllowMultipleSelection = allowMultipleSelection;
switch (icon) {
case ANDROID_CAPTURE_PHOTO:
launchCamera();
Expand Down Expand Up @@ -1787,13 +1790,11 @@ private void onUploadProgress(MediaModel media, float progress) {
}

private void launchPictureLibrary() {
// don't allow multiple selection for Gutenberg, as we're on a single image block for now
WPMediaUtils.launchPictureLibrary(this, !mShowGutenbergEditor);
WPMediaUtils.launchPictureLibrary(this, mAllowMultipleSelection);
}

private void launchVideoLibrary() {
// don't allow multiple selection for Gutenberg, as we're on a single image block for now
WPMediaUtils.launchVideoLibrary(this, !mShowGutenbergEditor);
WPMediaUtils.launchVideoLibrary(this, mAllowMultipleSelection);
}

private void launchVideoCamera() {
Expand Down Expand Up @@ -2522,6 +2523,24 @@ private boolean addExistingMediaToEditor(@NonNull AddExistingdMediaSource source
return true;
}

private void addExistingMediaToEditor(@NonNull AddExistingdMediaSource source, List<Long> mediaIdList) {
ArrayMap<String, MediaFile> mediaMap = new ArrayMap<>();
for (Long mediaId : mediaIdList) {
MediaModel media = mMediaStore.getSiteMediaWithId(mSite, mediaId);
if (media == null) {
AppLog.w(T.MEDIA, "Cannot add null media to post");
} else {
trackAddMediaEvent(source, media);

MediaFile mediaFile = FluxCUtils.mediaFileFromMediaModel(media);
String urlToUse = TextUtils.isEmpty(media.getUrl()) ? media.getFilePath() : media.getUrl();

mediaMap.put(urlToUse, mediaFile);
}
}
mEditorFragment.appendMediaFiles(mediaMap);
}

private class LoadPostContentTask extends AsyncTask<String, Spanned, Spanned> {
@Override
protected Spanned doInBackground(String... params) {
Expand Down Expand Up @@ -2826,7 +2845,7 @@ private boolean addMedia(Uri mediaUri, boolean isNew) {
private void addMediaList(@NonNull List<Uri> uriList, boolean isNew) {
// fetch any shared media first - must be done on the main thread
List<Uri> fetchedUriList = fetchMediaList(uriList);
mAddMediaListThread = new AddMediaListThread(fetchedUriList, isNew);
mAddMediaListThread = new AddMediaListThread(fetchedUriList, isNew, mAllowMultipleSelection);
mAddMediaListThread.start();
}

Expand All @@ -2849,13 +2868,23 @@ private class AddMediaListThread extends Thread {
private final boolean mIsNew;
private ProgressDialog mProgressDialog;
private boolean mDidAnyFail;
private int mFinishedUploads = 0;
private boolean mAllowMultipleSelection = false;
private Map<String, MediaFile> mediaMap = new ArrayMap<>();

AddMediaListThread(@NonNull List<Uri> uriList, boolean isNew) {
this.mUriList.addAll(uriList);
this.mIsNew = isNew;
showOverlay(false);
}

AddMediaListThread(@NonNull List<Uri> uriList, boolean isNew, boolean allowMultipleSelection) {
this.mUriList.addAll(uriList);
this.mIsNew = isNew;
this.mAllowMultipleSelection = allowMultipleSelection;
showOverlay(false);
}

private void showProgressDialog(final boolean show) {
runOnUiThread(new Runnable() {
@Override
Expand Down Expand Up @@ -2955,20 +2984,45 @@ private boolean processMedia(Uri mediaUri) {
}

private void postProcessMedia(final Uri mediaUri, final String path, final boolean isVideo) {
runOnUiThread(new Runnable() {
@Override
public void run() {
addMediaVisualEditor(mediaUri, path);
if (mAllowMultipleSelection) {
MediaFile mediaFile = getMediaFile(mediaUri);
if (mediaFile != null) {
mediaMap.put(path, mediaFile);
}
});
mFinishedUploads++;
if (mUriList.size() == mFinishedUploads) {
runOnUiThread(new Runnable() {
@Override
public void run() {
mEditorFragment.appendMediaFiles(mediaMap);
}
});
}
} else {
runOnUiThread(new Runnable() {
@Override
public void run() {
addMediaVisualEditor(mediaUri, path);
}
});
}
}
}

private void addMediaVisualEditor(Uri uri, String path) {
MediaFile mediaFile = getMediaFile(uri);
if (mediaFile != null) {
mEditorFragment.appendMediaFile(mediaFile, path, mImageLoader);
}
}

private MediaFile getMediaFile(Uri uri) {
MediaModel media = queueFileForUpload(uri, getContentResolver().getType(uri));
MediaFile mediaFile = FluxCUtils.mediaFileFromMediaModel(media);
if (media != null) {
mEditorFragment.appendMediaFile(mediaFile, path, mImageLoader);
return mediaFile;
} else {
return null;
}
}

Expand Down Expand Up @@ -2996,10 +3050,12 @@ private void addMediaLegacyEditor(Uri mediaUri, boolean isVideo) {
private void addMediaItemGroupOrSingleItem(Intent data) {
ClipData clipData = data.getClipData();
if (clipData != null) {
ArrayList<Uri> uriList = new ArrayList<>();
for (int i = 0; i < clipData.getItemCount(); i++) {
ClipData.Item item = clipData.getItemAt(i);
addMedia(item.getUri(), false);
uriList.add(item.getUri());
}
addMediaList(uriList, false);
} else {
addMedia(data.getData(), false);
}
Expand Down Expand Up @@ -3229,8 +3285,14 @@ private void handleMediaPickerResult(Intent data) {
if (ids.size() > 1 && allAreImages && !mShowGutenbergEditor) {
showInsertMediaDialog(ids);
} else {
for (Long id : ids) {
addExistingMediaToEditor(AddExistingdMediaSource.WP_MEDIA_LIBRARY, id);
// if mAllowMultipleSelection and gutenberg editor, pass all ids to addExistingMediaToEditor at once
if (mShowGutenbergEditor && mAllowMultipleSelection) {
addExistingMediaToEditor(AddExistingdMediaSource.WP_MEDIA_LIBRARY, ids);
mAllowMultipleSelection = false;
} else {
for (Long id : ids) {
addExistingMediaToEditor(AddExistingdMediaSource.WP_MEDIA_LIBRARY, id);
}
}
savePostAsync(null);
}
Expand Down Expand Up @@ -3462,33 +3524,35 @@ public void onAddMediaClicked() {
}

@Override
public void onAddMediaImageClicked() {
public void onAddMediaImageClicked(boolean allowMultipleSelection) {
mAllowMultipleSelection = allowMultipleSelection;
ActivityLauncher.viewMediaPickerForResult(this, mSite, MediaBrowserType.GUTENBERG_IMAGE_PICKER);
}

@Override
public void onAddMediaVideoClicked() {
public void onAddMediaVideoClicked(boolean allowMultipleSelection) {
mAllowMultipleSelection = allowMultipleSelection;
ActivityLauncher.viewMediaPickerForResult(this, mSite, MediaBrowserType.GUTENBERG_VIDEO_PICKER);
}

@Override
public void onAddPhotoClicked() {
onPhotoPickerIconClicked(PhotoPickerIcon.ANDROID_CHOOSE_PHOTO);
public void onAddPhotoClicked(boolean allowMultipleSelection) {
onPhotoPickerIconClicked(PhotoPickerIcon.ANDROID_CHOOSE_PHOTO, allowMultipleSelection);
}

@Override
public void onCapturePhotoClicked() {
onPhotoPickerIconClicked(PhotoPickerIcon.ANDROID_CAPTURE_PHOTO);
onPhotoPickerIconClicked(PhotoPickerIcon.ANDROID_CAPTURE_PHOTO, false);
}

@Override
public void onAddVideoClicked() {
onPhotoPickerIconClicked(PhotoPickerIcon.ANDROID_CHOOSE_VIDEO);
public void onAddVideoClicked(boolean allowMultipleSelectio) {
onPhotoPickerIconClicked(PhotoPickerIcon.ANDROID_CHOOSE_VIDEO, allowMultipleSelectio);
}

@Override
public void onCaptureVideoClicked() {
onPhotoPickerIconClicked(PhotoPickerIcon.ANDROID_CAPTURE_VIDEO);
onPhotoPickerIconClicked(PhotoPickerIcon.ANDROID_CAPTURE_VIDEO, false);
}

@Override
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -105,6 +105,7 @@
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.UUID;

Expand Down Expand Up @@ -1098,6 +1099,8 @@ private void replaceDrawable(Drawable newDrawable) {
}
}

@Override public void appendMediaFiles(Map<String, MediaFile> mediaList) { }

private Drawable getLoadingMediaErrorPlaceholder(String msg) {
if (TextUtils.isEmpty(msg)) {
ToastUtils.showToast(getActivity(), R.string.error_media_load);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@

import java.util.ArrayList;
import java.util.HashMap;
import java.util.Map;
import java.util.Set;

public abstract class EditorFragmentAbstract extends Fragment {
Expand All @@ -28,6 +29,7 @@ public class EditorFragmentNotAddedException extends Exception {
public abstract CharSequence getContent(CharSequence originalContent) throws EditorFragmentNotAddedException;
public abstract LiveData<Editable> getTitleOrContentChanged();
public abstract void appendMediaFile(MediaFile mediaFile, String imageUrl, ImageLoader imageLoader);
public abstract void appendMediaFiles(Map<String, MediaFile> mediaList);
public abstract void appendGallery(MediaGallery mediaGallery);
public abstract void setUrlForVideoPressId(String videoPressId, String url, String posterUrl);
public abstract boolean isUploadingMedia();
Expand Down Expand Up @@ -171,11 +173,11 @@ public interface EditorFragmentListener {
void onEditorFragmentInitialized();
void onEditorFragmentContentReady(ArrayList<Object> unsupportedBlocks);
void onAddMediaClicked();
void onAddMediaImageClicked();
void onAddMediaVideoClicked();
void onAddPhotoClicked();
void onAddMediaImageClicked(boolean allowMultipleSelection);
void onAddMediaVideoClicked(boolean allowMultipleSelection);
void onAddPhotoClicked(boolean allowMultipleSelection);
void onCapturePhotoClicked();
void onAddVideoClicked();
void onAddVideoClicked(boolean allowMultipleSelection);
void onCaptureVideoClicked();
boolean onMediaRetryClicked(String mediaId);
void onMediaRetryAllClicked(Set<String> mediaIdSet);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@

import androidx.fragment.app.Fragment;

import org.wordpress.mobile.WPAndroidGlue.Media;
import org.wordpress.mobile.WPAndroidGlue.WPAndroidGlueCode;
import org.wordpress.mobile.WPAndroidGlue.WPAndroidGlueCode.OnAuthHeaderRequestedListener;
import org.wordpress.mobile.WPAndroidGlue.WPAndroidGlueCode.OnEditorAutosaveListener;
Expand All @@ -13,6 +14,8 @@
import org.wordpress.mobile.WPAndroidGlue.WPAndroidGlueCode.OnMediaLibraryButtonListener;
import org.wordpress.mobile.WPAndroidGlue.WPAndroidGlueCode.OnReattachQueryListener;

import java.util.ArrayList;

public class GutenbergContainerFragment extends Fragment {
public static final String TAG = "gutenberg_container_fragment_tag";

Expand Down Expand Up @@ -125,6 +128,10 @@ public void appendMediaFile(int mediaId, final String mediaUrl, final boolean is
mWPAndroidGlueCode.appendMediaFile(mediaId, mediaUrl, isVideo);
}

public void appendMediaFiles(ArrayList<Media> mediaList) {
mWPAndroidGlueCode.appendMediaFiles(mediaList);
}

public void showDevOptionsDialog() {
mWPAndroidGlueCode.showDevOptionsDialog();
}
Expand All @@ -133,6 +140,10 @@ public void appendUploadMediaFile(final int mediaId, final String mediaUri, fina
mWPAndroidGlueCode.appendUploadMediaFile(mediaId, mediaUri, isVideo);
}

public void appendUploadMediaFiles(ArrayList<Media> mediaList) {
mWPAndroidGlueCode.appendUploadMediaFiles(mediaList);
}

public void mediaFileUploadProgress(final int mediaId, final float progress) {
mWPAndroidGlueCode.mediaFileUploadProgress(mediaId, progress);
}
Expand Down
Loading