Skip to content

Commit

Permalink
Merge pull request #492 from wordpress-mobile/feature/upload_captured…
Browse files Browse the repository at this point in the history
…_photo_android

Feature/upload captured photo android
  • Loading branch information
SergioEstevao committed Jan 25, 2019
2 parents 90a6581 + db1694d commit b1672c0
Show file tree
Hide file tree
Showing 11 changed files with 93 additions and 12 deletions.
16 changes: 12 additions & 4 deletions ios/gutenberg/GutenbergViewController.swift
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,7 @@ class GutenbergViewController: UIViewController {
}

extension GutenbergViewController: GutenbergBridgeDelegate {

func gutenbergDidLoad() {

}
Expand All @@ -47,12 +47,20 @@ extension GutenbergViewController: GutenbergBridgeDelegate {
callback(1, "https://cldup.com/cXyG__fTLN.jpg")
}

func gutenbergDidRequestMediaFromDevicePicker(with callback: @escaping MediaPickerDidPickMediaToUploadCallback) {
print("Gutenberg did request a device media picker, passing a sample url in callback and a fake ID")
func gutenbergDidRequestMediaFromDevicePicker(with callback: @escaping MediaPickerDidPickMediaCallback) {
print("Gutenberg did request a device media picker, opening the device picker")
mediaPickAndUploadCoordinator = MediaPickAndUploadCoordinator(presenter: self, gutenberg: gutenberg, mediaCallback: callback, finishCallback: {
self.mediaPickAndUploadCoordinator = nil
} )
mediaPickAndUploadCoordinator?.pickAndUpload(from: .savedPhotosAlbum)
}

func gutenbergDidRequestMediaFromCameraPicker(with callback: @escaping MediaPickerDidPickMediaCallback) {
print("Gutenberg did request a device media picker, opening the camera picker")
mediaPickAndUploadCoordinator = MediaPickAndUploadCoordinator(presenter: self, gutenberg: gutenberg, mediaCallback: callback, finishCallback: {
self.mediaPickAndUploadCoordinator = nil
} )
mediaPickAndUploadCoordinator?.pickAndUpload()
mediaPickAndUploadCoordinator?.pickAndUpload(from: .camera)
}
}

Expand Down
12 changes: 11 additions & 1 deletion ios/gutenberg/Info.plist
Original file line number Diff line number Diff line change
Expand Up @@ -46,7 +46,17 @@
<key>UIViewControllerBasedStatusBarAppearance</key>
<false/>
<key>NSLocationWhenInUseUsageDescription</key>
<string></string>
<string>The app would like to add your location to posts on sites where you have enabled geotagging.</string>
<key>NSCameraUsageDescription</key>
<string>To take photos or videos to use in your posts.</string>
<key>NSLocationUsageDescription</key>
<string>The app would like to add your location to posts on sites where you have enabled geotagging.</string>
<key>NSMicrophoneUsageDescription</key>
<string>Enable microphone access to record sound in your videos.</string>
<key>NSPhotoLibraryUsageDescription</key>
<string>To add photos or videos to your posts.</string>
<key>NSPhotoLibraryAddUsageDescription</key>
<string>To add photos or videos to your posts.</string>
<key>NSAppTransportSecurity</key>
<dict>
<key>NSExceptionDomains</key>
Expand Down
12 changes: 9 additions & 3 deletions ios/gutenberg/MediaPickAndUploadCoordinator.swift
Original file line number Diff line number Diff line change
Expand Up @@ -6,20 +6,26 @@ import RNReactNativeGutenbergBridge
class MediaPickAndUploadCoordinator: NSObject, UIImagePickerControllerDelegate, UINavigationControllerDelegate {

private let presenter: UIViewController
private let mediaCallback: MediaPickerDidPickMediaToUploadCallback
private let mediaCallback: MediaPickerDidPickMediaCallback
private let gutenberg: Gutenberg

init(presenter: UIViewController,
gutenberg: Gutenberg,
mediaCallback: @escaping MediaPickerDidPickMediaToUploadCallback,
mediaCallback: @escaping MediaPickerDidPickMediaCallback,
finishCallback: @escaping () -> Void) {
self.presenter = presenter
self.gutenberg = gutenberg
self.mediaCallback = mediaCallback
}

func pickAndUpload() {
func pickAndUpload(from source: UIImagePickerController.SourceType) {
guard UIImagePickerController.isSourceTypeAvailable(source) else {
// Camera not available, bound to happen in the simulator
mediaCallback(nil, nil)
return
}
let pickerController = UIImagePickerController()
pickerController.sourceType = source
pickerController.delegate = self
presenter.show(pickerController, sender: nil)
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -17,4 +17,6 @@ interface MediaUploadCallback {
void onMediaLibraryPressed(MediaSelectedCallback mediaSelectedCallback);

void onUploadMediaPressed(MediaUploadCallback mediaUploadCallback);

void onCapturePhotoPressed(MediaUploadCallback mediaUploadCallback);
}
Original file line number Diff line number Diff line change
Expand Up @@ -87,7 +87,32 @@ public void onUploadMediaPressed(final Callback onUploadMediaSelected) {
mGutenbergBridgeJS2Parent.onUploadMediaPressed(new GutenbergBridgeJS2Parent.MediaUploadCallback() {
@Override
public void onUploadMediaFileSelected(int mediaId, String mediaUri) {
onUploadMediaSelected.invoke(mediaId, mediaUri);
onUploadMediaSelected.invoke(mediaId, mediaUri, 0);
}

@Override
public void onMediaFileUploadProgress(int mediaId, float progress) {
setMediaFileUploadDataInJS(MEDIA_UPLOAD_STATE_UPLOADING, mediaId, null, progress);
}

@Override
public void onMediaFileUploadSucceeded(int mediaId, String mediaUrl, int mediaServerId) {
setMediaFileUploadDataInJS(MEDIA_UPLOAD_STATE_SUCCEEDED, mediaId, mediaUrl, 1, mediaServerId);
}

@Override
public void onMediaFileUploadFailed(int mediaId) {
setMediaFileUploadDataInJS(MEDIA_UPLOAD_STATE_FAILED, mediaId, null, 0 );
}
});
}

@ReactMethod
public void onCapturePhotoPressed(final Callback onUploadMediaSelected) {
mGutenbergBridgeJS2Parent.onCapturePhotoPressed(new GutenbergBridgeJS2Parent.MediaUploadCallback() {
@Override
public void onUploadMediaFileSelected(int mediaId, String mediaUri) {
onUploadMediaSelected.invoke(mediaId, mediaUri, 0);
}

@Override
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -67,6 +67,7 @@ public boolean isContentChanged() {
public interface OnMediaLibraryButtonListener {
void onMediaLibraryButtonClicked();
void onUploadMediaButtonClicked();
void onCapturePhotoButtonClicked();
}

protected List<ReactPackage> getPackages(final OnMediaLibraryButtonListener onMediaLibraryButtonListener) {
Expand All @@ -91,6 +92,12 @@ public void onUploadMediaPressed(MediaUploadCallback mediaUploadCallback) {
mPendingMediaUploadCallback = mediaUploadCallback;
onMediaLibraryButtonListener.onUploadMediaButtonClicked();
}

@Override
public void onCapturePhotoPressed(MediaUploadCallback mediaUploadCallback) {
mPendingMediaUploadCallback = mediaUploadCallback;
onMediaLibraryButtonListener.onCapturePhotoButtonClicked();
}
});
return Arrays.asList(
new MainReactPackage(),
Expand Down
4 changes: 4 additions & 0 deletions react-native-gutenberg-bridge/index.js
Original file line number Diff line number Diff line change
Expand Up @@ -48,4 +48,8 @@ export function onUploadMediaPressed( callback ) {
return RNReactNativeGutenbergBridge.onUploadMediaPressed( callback );
}

export function onCapturePhotoPressed( callback ) {
return RNReactNativeGutenbergBridge.onCapturePhotoPressed( callback );
}

export default RNReactNativeGutenbergBridge;
Original file line number Diff line number Diff line change
@@ -1,5 +1,4 @@
public typealias MediaPickerDidPickMediaCallback = (_ id: Int?, _ url: String?) -> Void
public typealias MediaPickerDidPickMediaToUploadCallback = (_ id: Int?, _ url: String?) -> Void

public protocol GutenbergBridgeDelegate: class {
/// Tells the delegate that Gutenberg had returned the requested HTML content.
Expand All @@ -19,9 +18,15 @@ public protocol GutenbergBridgeDelegate: class {

/// Tells the delegate that an image block requested an image from the device media.
///
/// - Parameter callback: A callbak block to be called with an upload mediaIdentifier and a placaholder image file url,
/// use nil on both parameters to signal that the action was canceled.
func gutenbergDidRequestMediaFromDevicePicker(with callback: @escaping MediaPickerDidPickMediaCallback)

/// Tells the delegate that an image block requested an image from the device cameras.
///
/// - Parameter callback: A callbak block to be called with and temporary
/// image file url and an mediaIdentifier or nil to signal that the action was canceled.
func gutenbergDidRequestMediaFromDevicePicker(with callback: @escaping MediaPickerDidPickMediaToUploadCallback)
func gutenbergDidRequestMediaFromCameraPicker(with callback: @escaping MediaPickerDidPickMediaCallback)

/// Tells the delegate that the Gutenberg module has finished loading.
///
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@ @interface RCT_EXTERN_MODULE(RNReactNativeGutenbergBridge, NSObject)
RCT_EXTERN_METHOD(provideToNative_Html:(NSString *)html title:(NSString *)title changed:(BOOL)changed)
RCT_EXTERN_METHOD(onMediaLibraryPressed:(RCTResponseSenderBlock)callback)
RCT_EXTERN_METHOD(onUploadMediaPressed:(RCTResponseSenderBlock)callback)
RCT_EXTERN_METHOD(onCapturePhotoPressed:(RCTResponseSenderBlock)callback)
RCT_EXTERN_METHOD(editorDidLayout)

@end
Original file line number Diff line number Diff line change
Expand Up @@ -38,6 +38,19 @@ public class RNReactNativeGutenbergBridge: RCTEventEmitter {
}
}

@objc
func onCapturePhotoPressed(_ callback: @escaping RCTResponseSenderBlock) {
DispatchQueue.main.async {
self.delegate?.gutenbergDidRequestMediaFromCameraPicker(with: { (mediaID, url) in
guard let url = url, let mediaID = mediaID else {
callback(nil)
return
}
callback([mediaID, url])
})
}
}

@objc
func editorDidLayout() {
DispatchQueue.main.async {
Expand Down

0 comments on commit b1672c0

Please sign in to comment.