Skip to content

Commit b81fc3f

Browse files
authored
[Gutenberg]Video insert & upload (#9644)
Implemented Gutenberg Video insert and upload
1 parent e16a5a2 commit b81fc3f

File tree

10 files changed

+111
-76
lines changed

10 files changed

+111
-76
lines changed

WordPress/build.gradle

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -61,6 +61,13 @@ android {
6161
buildConfigField "boolean", "NEW_SITE_CREATION_ENABLED", "true"
6262
buildConfigField "boolean", "OFFER_GUTENBERG", "true"
6363
buildConfigField "boolean", "DOMAIN_REGISTRATION_ENABLED", "false"
64+
65+
// Gutenberg's dependency - react-native-video is using
66+
// Java API 1.8
67+
compileOptions {
68+
sourceCompatibility JavaVersion.VERSION_1_8
69+
targetCompatibility JavaVersion.VERSION_1_8
70+
}
6471
}
6572

6673
flavorDimensions "buildType"

WordPress/src/main/java/org/wordpress/android/ui/media/MediaBrowserActivity.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -195,6 +195,10 @@ public void onCreate(Bundle savedInstanceState) {
195195
MediaFilter filter;
196196
if (mBrowserType.isSingleImagePicker()) {
197197
filter = MediaFilter.FILTER_IMAGES;
198+
} else if (mBrowserType == MediaBrowserType.GUTENBERG_IMAGE_PICKER) {
199+
filter = MediaFilter.FILTER_IMAGES;
200+
} else if (mBrowserType == MediaBrowserType.GUTENBERG_VIDEO_PICKER) {
201+
filter = MediaFilter.FILTER_VIDEOS;
198202
} else if (savedInstanceState != null) {
199203
filter = (MediaFilter) savedInstanceState.getSerializable(ARG_FILTER);
200204
} else {

WordPress/src/main/java/org/wordpress/android/ui/media/MediaBrowserType.java

Lines changed: 12 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -3,11 +3,12 @@
33
public enum MediaBrowserType {
44
BROWSER, // browse & manage media
55
EDITOR_PICKER, // select multiple images or videos to insert into a post
6-
GUTENBERG_EDITOR_PICKER, // select a single image to insert into a post
76
AZTEC_EDITOR_PICKER, // select multiple images or videos to insert into a post, hide source bar in portrait
87
FEATURED_IMAGE_PICKER, // select a single image as a featured image
98
GRAVATAR_IMAGE_PICKER, // select a single image as a gravatar
10-
SITE_ICON_PICKER; // select a single image as a site icon
9+
SITE_ICON_PICKER, // select a single image as a site icon
10+
GUTENBERG_IMAGE_PICKER, // select image from Gutenberg editor
11+
GUTENBERG_VIDEO_PICKER; // select video from Gutenberg editor
1112

1213
public boolean isPicker() {
1314
return this != BROWSER;
@@ -18,15 +19,21 @@ public boolean isBrowser() {
1819
}
1920

2021
public boolean isSingleImagePicker() {
21-
return this == FEATURED_IMAGE_PICKER || this == GRAVATAR_IMAGE_PICKER
22-
|| this == SITE_ICON_PICKER || this == GUTENBERG_EDITOR_PICKER;
22+
return this == FEATURED_IMAGE_PICKER || this == GRAVATAR_IMAGE_PICKER || this == SITE_ICON_PICKER;
2323
}
2424

2525
public boolean canMultiselect() {
26-
return this == EDITOR_PICKER || this == AZTEC_EDITOR_PICKER;
26+
return this == EDITOR_PICKER
27+
|| this == AZTEC_EDITOR_PICKER
28+
|| this == GUTENBERG_IMAGE_PICKER
29+
|| this == GUTENBERG_VIDEO_PICKER;
2730
}
2831

2932
public boolean canFilter() {
3033
return this == BROWSER;
3134
}
35+
36+
public boolean canOnlyDoInitialFilter() {
37+
return this == GUTENBERG_IMAGE_PICKER || this == GUTENBERG_VIDEO_PICKER;
38+
}
3239
}

WordPress/src/main/java/org/wordpress/android/ui/media/MediaGridFragment.java

Lines changed: 17 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -378,24 +378,8 @@ List<MediaModel> getFilteredMedia() {
378378
}
379379
} else if (mBrowserType.isSingleImagePicker()) {
380380
mediaList = mMediaStore.getSiteImages(mSite);
381-
} else if (mBrowserType.canFilter()) {
382-
switch (mFilter) {
383-
case FILTER_IMAGES:
384-
mediaList = mMediaStore.getSiteImages(mSite);
385-
break;
386-
case FILTER_DOCUMENTS:
387-
mediaList = mMediaStore.getSiteDocuments(mSite);
388-
break;
389-
case FILTER_VIDEOS:
390-
mediaList = mMediaStore.getSiteVideos(mSite);
391-
break;
392-
case FILTER_AUDIO:
393-
mediaList = mMediaStore.getSiteAudio(mSite);
394-
break;
395-
default:
396-
mediaList = mMediaStore.getAllSiteMedia(mSite);
397-
break;
398-
}
381+
} else if (mBrowserType.canFilter() || mBrowserType.canOnlyDoInitialFilter()) {
382+
mediaList = getMediaList();
399383
} else {
400384
List<MediaModel> allMedia = mMediaStore.getAllSiteMedia(mSite);
401385
mediaList = new ArrayList<>();
@@ -411,6 +395,21 @@ List<MediaModel> getFilteredMedia() {
411395
return mediaList;
412396
}
413397

398+
private List<MediaModel> getMediaList() {
399+
switch (mFilter) {
400+
case FILTER_IMAGES:
401+
return mMediaStore.getSiteImages(mSite);
402+
case FILTER_DOCUMENTS:
403+
return mMediaStore.getSiteDocuments(mSite);
404+
case FILTER_VIDEOS:
405+
return mMediaStore.getSiteVideos(mSite);
406+
case FILTER_AUDIO:
407+
return mMediaStore.getSiteAudio(mSite);
408+
default:
409+
return mMediaStore.getAllSiteMedia(mSite);
410+
}
411+
}
412+
414413
void setFilter(@NonNull MediaFilter filter) {
415414
mFilter = filter;
416415
getArguments().putSerializable(MediaBrowserActivity.ARG_FILTER, filter);

WordPress/src/main/java/org/wordpress/android/ui/posts/EditPostActivity.java

Lines changed: 22 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -3151,7 +3151,7 @@ private void handleMediaPickerResult(Intent data) {
31513151

31523152
// if the user selected multiple items and they're all images, show the insert media
31533153
// dialog so the user can choose whether to insert them individually or as a gallery
3154-
if (ids.size() > 1 && allAreImages) {
3154+
if (ids.size() > 1 && allAreImages && !mShowGutenbergEditor) {
31553155
showInsertMediaDialog(ids);
31563156
} else {
31573157
for (Long id : ids) {
@@ -3378,18 +3378,24 @@ public void onSettingsClicked() {
33783378
public void onAddMediaClicked() {
33793379
if (isPhotoPickerShowing()) {
33803380
hidePhotoPicker();
3381-
} else if (mShowGutenbergEditor) {
3382-
// show the WP media library with pictures only, since that's the only mode currently
3383-
// integrated in Gutenberg-mobile
3384-
ActivityLauncher.viewMediaPickerForResult(this, mSite, MediaBrowserType.GUTENBERG_EDITOR_PICKER);
3385-
} else if (WPMediaUtils.currentUserCanUploadMedia(mSite)) {
3381+
} else if (WPMediaUtils.currentUserCanUploadMedia(mSite)) {
33863382
showPhotoPicker();
33873383
} else {
33883384
// show the WP media library instead of the photo picker if the user doesn't have upload permission
33893385
ActivityLauncher.viewMediaPickerForResult(this, mSite, MediaBrowserType.EDITOR_PICKER);
33903386
}
33913387
}
33923388

3389+
@Override
3390+
public void onAddMediaImageClicked() {
3391+
ActivityLauncher.viewMediaPickerForResult(this, mSite, MediaBrowserType.GUTENBERG_IMAGE_PICKER);
3392+
}
3393+
3394+
@Override
3395+
public void onAddMediaVideoClicked() {
3396+
ActivityLauncher.viewMediaPickerForResult(this, mSite, MediaBrowserType.GUTENBERG_VIDEO_PICKER);
3397+
}
3398+
33933399
@Override
33943400
public void onAddPhotoClicked() {
33953401
onPhotoPickerIconClicked(PhotoPickerIcon.ANDROID_CHOOSE_PHOTO);
@@ -3400,6 +3406,16 @@ public void onCapturePhotoClicked() {
34003406
onPhotoPickerIconClicked(PhotoPickerIcon.ANDROID_CAPTURE_PHOTO);
34013407
}
34023408

3409+
@Override
3410+
public void onAddVideoClicked() {
3411+
onPhotoPickerIconClicked(PhotoPickerIcon.ANDROID_CHOOSE_VIDEO);
3412+
}
3413+
3414+
@Override
3415+
public void onCaptureVideoClicked() {
3416+
onPhotoPickerIconClicked(PhotoPickerIcon.ANDROID_CAPTURE_VIDEO);
3417+
}
3418+
34033419
@Override
34043420
public void onMediaDropped(final ArrayList<Uri> mediaUris) {
34053421
mDroppedMediaUris = mediaUris;

libs/editor/WordPressEditor/src/main/java/org/wordpress/android/editor/EditorFragmentAbstract.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -183,8 +183,12 @@ public interface EditorFragmentListener {
183183
void onEditorFragmentContentReady(boolean hasUnsupportedContent);
184184
void onSettingsClicked();
185185
void onAddMediaClicked();
186+
void onAddMediaImageClicked();
187+
void onAddMediaVideoClicked();
186188
void onAddPhotoClicked();
187189
void onCapturePhotoClicked();
190+
void onAddVideoClicked();
191+
void onCaptureVideoClicked();
188192
boolean onMediaRetryClicked(String mediaId);
189193
void onMediaRetryAllClicked(Set<String> mediaIdSet);
190194
void onMediaUploadCancelClicked(String mediaId);

libs/editor/WordPressEditor/src/main/java/org/wordpress/android/editor/GutenbergContainerFragment.java

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -118,16 +118,16 @@ public CharSequence getTitle(OnGetContentTimeout onGetContentTimeout) {
118118
return mWPAndroidGlueCode.getTitle(onGetContentTimeout);
119119
}
120120

121-
public void appendMediaFile(int mediaId, final String mediaUrl) {
122-
mWPAndroidGlueCode.appendMediaFile(mediaId, mediaUrl);
121+
public void appendMediaFile(int mediaId, final String mediaUrl, final boolean isVideo) {
122+
mWPAndroidGlueCode.appendMediaFile(mediaId, mediaUrl, isVideo);
123123
}
124124

125125
public void showDevOptionsDialog() {
126126
mWPAndroidGlueCode.showDevOptionsDialog();
127127
}
128128

129-
public void appendUploadMediaFile(final int mediaId, final String mediaUri) {
130-
mWPAndroidGlueCode.appendUploadMediaFile(mediaId, mediaUri);
129+
public void appendUploadMediaFile(final int mediaId, final String mediaUri, final boolean isVideo) {
130+
mWPAndroidGlueCode.appendUploadMediaFile(mediaId, mediaUri, isVideo);
131131
}
132132

133133
public void mediaFileUploadProgress(final int mediaId, final float progress) {

libs/editor/WordPressEditor/src/main/java/org/wordpress/android/editor/GutenbergEditorFragment.java

Lines changed: 38 additions & 42 deletions
Original file line numberDiff line numberDiff line change
@@ -63,6 +63,7 @@ public class GutenbergEditorFragment extends EditorFragmentAbstract implements
6363
private static final String ARG_LOCALE_SLUG = "param_locale_slug";
6464

6565
private static final int CAPTURE_PHOTO_PERMISSION_REQUEST_CODE = 101;
66+
private static final int CAPTURE_VIDEO_PERMISSION_REQUEST_CODE = 102;
6667

6768
private boolean mHtmlModeEnabled;
6869

@@ -216,18 +217,35 @@ public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle sa
216217
ViewGroup gutenbergContainer = view.findViewById(R.id.gutenberg_container);
217218
getGutenbergContainerFragment().attachToContainer(gutenbergContainer,
218219
new OnMediaLibraryButtonListener() {
219-
@Override public void onMediaLibraryButtonClicked() {
220-
onToolbarMediaButtonClicked();
220+
@Override public void onMediaLibraryImageButtonClicked() {
221+
mEditorFragmentListener.onTrackableEvent(TrackableEvent.MEDIA_BUTTON_TAPPED);
222+
mEditorFragmentListener.onAddMediaImageClicked();
221223
}
222224

223225
@Override
224-
public void onUploadMediaButtonClicked() {
226+
public void onMediaLibraryVideoButtonClicked() {
227+
mEditorFragmentListener.onTrackableEvent(TrackableEvent.MEDIA_BUTTON_TAPPED);
228+
mEditorFragmentListener.onAddMediaVideoClicked();
229+
}
230+
231+
@Override
232+
public void onUploadPhotoButtonClicked() {
225233
mEditorFragmentListener.onAddPhotoClicked();
226234
}
227235

236+
@Override
237+
public void onUploadVideoButtonClicked() {
238+
mEditorFragmentListener.onAddVideoClicked();
239+
}
240+
241+
@Override
242+
public void onCaptureVideoButtonClicked() {
243+
checkAndRequestCameraAndStoragePermissions(CAPTURE_VIDEO_PERMISSION_REQUEST_CODE);
244+
}
245+
228246
@Override
229247
public void onCapturePhotoButtonClicked() {
230-
checkAndRequestCameraAndStoragePermissions();
248+
checkAndRequestCameraAndStoragePermissions(CAPTURE_PHOTO_PERMISSION_REQUEST_CODE);
231249
}
232250

233251
@Override public void onRetryUploadForMediaClicked(int mediaId) {
@@ -307,9 +325,7 @@ public void run() {
307325
@Override
308326
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions,
309327
@NonNull int[] grantResults) {
310-
if (requestCode == CAPTURE_PHOTO_PERMISSION_REQUEST_CODE) {
311-
checkAndRequestCameraAndStoragePermissions();
312-
}
328+
checkAndRequestCameraAndStoragePermissions(requestCode);
313329
}
314330

315331
private void setEditorProgressBarVisibility(boolean shown) {
@@ -341,10 +357,14 @@ private void updateMediaProgress() {
341357
}
342358
}
343359

344-
private void checkAndRequestCameraAndStoragePermissions() {
360+
private void checkAndRequestCameraAndStoragePermissions(int permissionRequestCode) {
345361
if (PermissionUtils.checkAndRequestCameraAndStoragePermissions(this,
346-
CAPTURE_PHOTO_PERMISSION_REQUEST_CODE)) {
347-
mEditorFragmentListener.onCapturePhotoClicked();
362+
permissionRequestCode)) {
363+
if (permissionRequestCode == CAPTURE_PHOTO_PERMISSION_REQUEST_CODE) {
364+
mEditorFragmentListener.onCapturePhotoClicked();
365+
} else if (permissionRequestCode == CAPTURE_VIDEO_PERMISSION_REQUEST_CODE) {
366+
mEditorFragmentListener.onCaptureVideoClicked();
367+
}
348368
}
349369
}
350370

@@ -624,9 +644,15 @@ public void appendMediaFile(final MediaFile mediaFile, final String mediaUrl, Im
624644
}
625645

626646
if (URLUtil.isNetworkUrl(mediaUrl)) {
627-
getGutenbergContainerFragment().appendMediaFile(Integer.valueOf(mediaFile.getMediaId()), mediaUrl);
647+
getGutenbergContainerFragment().appendMediaFile(
648+
Integer.valueOf(mediaFile.getMediaId()),
649+
mediaUrl,
650+
mediaFile.isVideo());
628651
} else {
629-
getGutenbergContainerFragment().appendUploadMediaFile(mediaFile.getId(), "file://" + mediaUrl);
652+
getGutenbergContainerFragment().appendUploadMediaFile(
653+
mediaFile.getId(),
654+
"file://" + mediaUrl,
655+
mediaFile.isVideo());
630656
mUploadingMediaProgressMax.put(String.valueOf(mediaFile.getId()), 0f);
631657
}
632658
}
@@ -744,34 +770,4 @@ public void onMediaUploadFailed(final String localMediaId, final MediaType
744770
@Override
745771
public void onGalleryMediaUploadSucceeded(final long galleryId, long remoteMediaId, int remaining) {
746772
}
747-
748-
/**
749-
* Returns true if a hardware keyboard is detected, otherwise false.
750-
*/
751-
private boolean isHardwareKeyboardPresent() {
752-
Configuration config = getResources().getConfiguration();
753-
boolean returnValue = false;
754-
if (config.keyboard != Configuration.KEYBOARD_NOKEYS) {
755-
returnValue = true;
756-
}
757-
return returnValue;
758-
}
759-
760-
public boolean onToolbarMediaButtonClicked() {
761-
mEditorFragmentListener.onTrackableEvent(TrackableEvent.MEDIA_BUTTON_TAPPED);
762-
763-
if (isActionInProgress()) {
764-
ToastUtils.showToast(getActivity(), R.string.alert_action_while_uploading, ToastUtils.Duration.LONG);
765-
}
766-
767-
768-
getActivity().runOnUiThread(new Runnable() {
769-
@Override
770-
public void run() {
771-
mEditorFragmentListener.onAddMediaClicked();
772-
}
773-
});
774-
775-
return true;
776-
}
777773
}

settings.gradle

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,4 +15,6 @@ if (properties.getOrDefault('wp.BUILD_GUTENBERG_FROM_SOURCE', false).toBoolean()
1515
project(':react-native-recyclerview-list').projectDir = new File(rootProject.projectDir, 'libs/gutenberg-mobile/node_modules/react-native-recyclerview-list/android')
1616
include ':react-native-gutenberg-bridge'
1717
project(':react-native-gutenberg-bridge').projectDir = new File(rootProject.projectDir, 'libs/gutenberg-mobile/react-native-gutenberg-bridge/android')
18+
include ':react-native-video'
19+
project(':react-native-video').projectDir = new File(rootProject.projectDir, 'libs/gutenberg-mobile/node_modules/react-native-video/android-exoplayer')
1820
}

0 commit comments

Comments
 (0)