From 1b79e90028c4c41429bd81c6ab9704419efc8aa9 Mon Sep 17 00:00:00 2001 From: abarisic86 Date: Thu, 3 May 2018 16:37:24 +0200 Subject: [PATCH 1/7] prepare for application data --- .../parkerdan/shareextension/ShareModule.java | 4 +- .../ShareExModule.java | 71 ------------------- .../ShareExPackage.java | 24 ------- 3 files changed, 2 insertions(+), 97 deletions(-) delete mode 100644 android/src/main/java/com/github/alinz/reactNativeShareExtension/ShareExModule.java delete mode 100644 android/src/main/java/com/github/alinz/reactNativeShareExtension/ShareExPackage.java diff --git a/android/src/main/java/com/alinz/parkerdan/shareextension/ShareModule.java b/android/src/main/java/com/alinz/parkerdan/shareextension/ShareModule.java index a27483a0..0884fdbf 100644 --- a/android/src/main/java/com/alinz/parkerdan/shareextension/ShareModule.java +++ b/android/src/main/java/com/alinz/parkerdan/shareextension/ShareModule.java @@ -46,6 +46,7 @@ public WritableArray processIntent() { mediaTypesSupported.add("video"); mediaTypesSupported.add("audio"); mediaTypesSupported.add("image"); + mediaTypesSupported.add("application"); String type = ""; String action = ""; @@ -67,8 +68,7 @@ public WritableArray processIntent() { dataMap.putString("type", type); dataMap.putString("value", intent.getStringExtra(Intent.EXTRA_TEXT)); dataArrayMap.pushMap(dataMap); - } else if (Intent.ACTION_SEND.equals(action) && ( - mediaTypesSupported.contains(typePart))) { + } else if (Intent.ACTION_SEND.equals(action) && mediaTypesSupported.contains(typePart)) { WritableMap dataMap = Arguments.createMap(); dataMap.putString("type", type); Uri uri = (Uri) intent.getParcelableExtra(Intent.EXTRA_STREAM); diff --git a/android/src/main/java/com/github/alinz/reactNativeShareExtension/ShareExModule.java b/android/src/main/java/com/github/alinz/reactNativeShareExtension/ShareExModule.java deleted file mode 100644 index 5409cb05..00000000 --- a/android/src/main/java/com/github/alinz/reactNativeShareExtension/ShareExModule.java +++ /dev/null @@ -1,71 +0,0 @@ -package com.github.alinz.reactNativeShareExtension; - -import android.app.Activity; -import android.content.Intent; -import android.util.Log; -import com.facebook.react.bridge.Promise; -import com.facebook.react.bridge.ReactApplicationContext; -import com.facebook.react.bridge.ReactContextBaseJavaModule; -import com.facebook.react.bridge.ActivityEventListener; -import com.facebook.react.bridge.ReactMethod; -import com.facebook.react.bridge.WritableMap; -import com.facebook.react.bridge.Arguments; - -import javax.annotation.Nullable; - -public class ShareExModule extends ReactContextBaseJavaModule implements ActivityEventListener { - - public ShareExModule(ReactApplicationContext reactContext) { - super(reactContext); - reactContext.addActivityEventListener(this); - } - - public String getName() { - return "ReactNativeShareExtension"; - } - - @ReactMethod - public void data(Promise promise) { - promise.resolve(processIntent()); - } - - protected WritableMap processIntent() { - - Activity currentActivity = getCurrentActivity(); - - WritableMap map = Arguments.createMap(); - - Intent intent = currentActivity.getIntent(); - String action = intent.getAction(); - String type = intent.getType(); - String value = ""; - - if (type == null) { - type = ""; - } - - //if you want to support more, just add more things here. - //at the moment we are only supporting browser URL - if (Intent.ACTION_SEND.equals(action) && "text/plain".equals(type)) { - value = intent.getStringExtra(Intent.EXTRA_TEXT); - } - - map.putString("type", type); - map.putString("value", value); - - return map; - } - - @ReactMethod - public void close() { - Activity currentActivity = getCurrentActivity(); - - currentActivity.finish(); - } - - public void onActivityResult(final int requestCode, final int resultCode, final Intent data) { } - - public void onActivityResult(Activity activity, int requestCode, int resultCode, Intent data) { } - - public void onNewIntent(Intent intent) { } -} diff --git a/android/src/main/java/com/github/alinz/reactNativeShareExtension/ShareExPackage.java b/android/src/main/java/com/github/alinz/reactNativeShareExtension/ShareExPackage.java deleted file mode 100644 index 485c87c5..00000000 --- a/android/src/main/java/com/github/alinz/reactNativeShareExtension/ShareExPackage.java +++ /dev/null @@ -1,24 +0,0 @@ -package com.github.alinz.reactNativeShareExtension; - -import com.facebook.react.ReactPackage; -import com.facebook.react.bridge.JavaScriptModule; -import com.facebook.react.bridge.NativeModule; -import com.facebook.react.bridge.ReactApplicationContext; -import com.facebook.react.uimanager.ViewManager; - -import java.util.Arrays; -import java.util.Collections; -import java.util.List; - -public class ShareExPackage implements ReactPackage { - - @Override - public List createNativeModules(ReactApplicationContext reactContext) { - return Arrays.asList(new ShareExModule(reactContext)); - } - - @Override - public List createViewManagers(ReactApplicationContext reactContext) { - return Collections.emptyList(); - } -} From 4d773bc4d4c50811d1ee5691bf2330bbe7b4eaff Mon Sep 17 00:00:00 2001 From: abarisic86 Date: Thu, 10 May 2018 14:40:22 +0200 Subject: [PATCH 2/7] enable open url --- ios/ReactNativeShareExtension.m | 6 +++++- lib/index.js | 3 ++- 2 files changed, 7 insertions(+), 2 deletions(-) diff --git a/ios/ReactNativeShareExtension.m b/ios/ReactNativeShareExtension.m index 3556ae8f..5dbb71bb 100644 --- a/ios/ReactNativeShareExtension.m +++ b/ios/ReactNativeShareExtension.m @@ -41,7 +41,11 @@ - (void)viewDidLoad { completionHandler:nil]; } - +RCT_EXPORT_METHOD(openURL:(NSString *)url) { + UIApplication *application = [UIApplication sharedApplication]; + NSURL *urlToOpen = [NSURL URLWithString:[url stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]]; + [application openURL:urlToOpen options:@{} completionHandler: nil]; +} RCT_REMAP_METHOD(data, resolver:(RCTPromiseResolveBlock)resolve diff --git a/lib/index.js b/lib/index.js index aa17dce1..cf6e5cfd 100644 --- a/lib/index.js +++ b/lib/index.js @@ -5,5 +5,6 @@ import { NativeModules } from 'react-native' // NativeModules.ShareExtension.close() export default { data: () => NativeModules.ReactNativeShareExtension.data(), - close: () => NativeModules.ReactNativeShareExtension.close() + close: () => NativeModules.ReactNativeShareExtension.close(), + openURL: url => NativeModules.ReactNativeShareExtension.openURL(url), } From 2bc4c301065c3a98e869db6a460533b59f98778b Mon Sep 17 00:00:00 2001 From: Ivana Rast Date: Fri, 18 May 2018 16:49:24 +0200 Subject: [PATCH 3/7] stringByAddingPercentEscapesUsingEncoding was deprecated. Changing it to see if it'll help with the current issue on iOS (SharedExtension.data() returns un undefined object). --- ios/ReactNativeShareExtension.m | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/ios/ReactNativeShareExtension.m b/ios/ReactNativeShareExtension.m index 5dbb71bb..61adf16a 100644 --- a/ios/ReactNativeShareExtension.m +++ b/ios/ReactNativeShareExtension.m @@ -42,9 +42,10 @@ - (void)viewDidLoad { } RCT_EXPORT_METHOD(openURL:(NSString *)url) { - UIApplication *application = [UIApplication sharedApplication]; - NSURL *urlToOpen = [NSURL URLWithString:[url stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]]; - [application openURL:urlToOpen options:@{} completionHandler: nil]; + UIApplication *application = [UIApplication sharedApplication]; + NSCharacterSet *set = [NSCharacterSet URLHostAllowedCharacterSet]; + NSURL *urlToOpen = [NSURL URLWithString:[url stringByAddingPercentEncodingWithAllowedCharacters: set]]; + [application openURL:urlToOpen options:@{} completionHandler: nil]; } RCT_REMAP_METHOD(data, From 7ca379ff44c5888bd7f732ff66895beb43410548 Mon Sep 17 00:00:00 2001 From: Ivana Rast Date: Mon, 21 May 2018 10:50:30 +0200 Subject: [PATCH 4/7] Reverting the changes. This wasn't causing the app to fail. Actually, it fails if the url is constructed this way. --- ios/ReactNativeShareExtension.m | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/ios/ReactNativeShareExtension.m b/ios/ReactNativeShareExtension.m index 61adf16a..0fde78b3 100644 --- a/ios/ReactNativeShareExtension.m +++ b/ios/ReactNativeShareExtension.m @@ -43,8 +43,7 @@ - (void)viewDidLoad { RCT_EXPORT_METHOD(openURL:(NSString *)url) { UIApplication *application = [UIApplication sharedApplication]; - NSCharacterSet *set = [NSCharacterSet URLHostAllowedCharacterSet]; - NSURL *urlToOpen = [NSURL URLWithString:[url stringByAddingPercentEncodingWithAllowedCharacters: set]]; + NSURL *urlToOpen = [NSURL URLWithString:[url stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]]; [application openURL:urlToOpen options:@{} completionHandler: nil]; } From f439c1df72522aee5765837840857af7de27dfb7 Mon Sep 17 00:00:00 2001 From: Damir Date: Wed, 27 Jun 2018 13:52:50 +0200 Subject: [PATCH 5/7] Enable opening external files with the application --- .../com/alinz/parkerdan/shareextension/ShareModule.java | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/android/src/main/java/com/alinz/parkerdan/shareextension/ShareModule.java b/android/src/main/java/com/alinz/parkerdan/shareextension/ShareModule.java index 0884fdbf..fecea2fe 100644 --- a/android/src/main/java/com/alinz/parkerdan/shareextension/ShareModule.java +++ b/android/src/main/java/com/alinz/parkerdan/shareextension/ShareModule.java @@ -82,6 +82,12 @@ public WritableArray processIntent() { dataMap.putString("value", "file://" + RealPathUtil.getRealPathFromURI(currentActivity, uri)); dataArrayMap.pushMap(dataMap); } + } else if (Intent.ACTION_VIEW.equals(action) && mediaTypesSupported.contains(typePart)) { + WritableMap dataMap = Arguments.createMap(); + dataMap.putString("type", type); + Uri uri = intent.getData(); + dataMap.putString("value", "file://" + RealPathUtil.getRealPathFromURI(currentActivity, uri)); + dataArrayMap.pushMap(dataMap); } } return dataArrayMap; From 469a0e7255f22259a3034b32b82de1665b6d1ac2 Mon Sep 17 00:00:00 2001 From: Damir Date: Thu, 28 Jun 2018 12:39:24 +0200 Subject: [PATCH 6/7] Exit extension on close so that it can be called again --- ios/ReactNativeShareExtension.m | 1 + 1 file changed, 1 insertion(+) diff --git a/ios/ReactNativeShareExtension.m b/ios/ReactNativeShareExtension.m index 0fde78b3..c537ffbd 100644 --- a/ios/ReactNativeShareExtension.m +++ b/ios/ReactNativeShareExtension.m @@ -39,6 +39,7 @@ - (void)viewDidLoad { RCT_EXPORT_METHOD(close) { [extensionContext completeRequestReturningItems:nil completionHandler:nil]; + exit(0); } RCT_EXPORT_METHOD(openURL:(NSString *)url) { From 8dfa3f2282f66900bc91db216e7f467291dbfcb0 Mon Sep 17 00:00:00 2001 From: Damir Date: Thu, 5 Jul 2018 11:14:38 +0200 Subject: [PATCH 7/7] Remove exit from iOS code exit was causing the extension to close before the JavaScript code was executed, but only when the app was archived --- ios/ReactNativeShareExtension.m | 1 - 1 file changed, 1 deletion(-) diff --git a/ios/ReactNativeShareExtension.m b/ios/ReactNativeShareExtension.m index c537ffbd..0fde78b3 100644 --- a/ios/ReactNativeShareExtension.m +++ b/ios/ReactNativeShareExtension.m @@ -39,7 +39,6 @@ - (void)viewDidLoad { RCT_EXPORT_METHOD(close) { [extensionContext completeRequestReturningItems:nil completionHandler:nil]; - exit(0); } RCT_EXPORT_METHOD(openURL:(NSString *)url) {