mirror of
https://github.com/facebook/react-native.git
synced 2025-11-01 09:14:26 +00:00
Add Share module
Summary: revision of https://github.com/facebook/react-native/pull/5476 It has only one method `shareTextContent` and next will be`shareBinaryContent`. In Android, Promise can't receive a result, because `startActivityForResult` is not working with `Intent.ACTION_SEND`. Maybe we can use `createChooser(Intent target, CharSequence title, IntentSender sender)` which requires API level 22. Closes https://github.com/facebook/react-native/pull/5904 Differential Revision: D3612889 fbshipit-source-id: 0e7aaf34b076a99089cc76bd649e6da067d9a760
This commit is contained in:
committed by
Facebook Github Bot 6
parent
c21d3a1029
commit
3b35732800
@@ -0,0 +1,20 @@
|
||||
include_defs('//ReactAndroid/DEFS')
|
||||
|
||||
android_library(
|
||||
name = 'share',
|
||||
srcs = glob(['**/*.java']),
|
||||
deps = [
|
||||
react_native_target('java/com/facebook/react/bridge:bridge'),
|
||||
react_native_target('java/com/facebook/react/common:common'),
|
||||
react_native_dep('libraries/fbcore/src/main/java/com/facebook/common/logging:logging'),
|
||||
react_native_dep('third-party/java/infer-annotations:infer-annotations'),
|
||||
react_native_dep('third-party/java/jsr-305:jsr-305'),
|
||||
],
|
||||
visibility = [
|
||||
'PUBLIC',
|
||||
],
|
||||
)
|
||||
|
||||
project_config(
|
||||
src_target = ':share',
|
||||
)
|
||||
@@ -0,0 +1,90 @@
|
||||
/**
|
||||
* Copyright (c) 2016-present, Facebook, Inc.
|
||||
* All rights reserved.
|
||||
*
|
||||
* This source code is licensed under the BSD-style license found in the
|
||||
* LICENSE file in the root directory of this source tree. An additional grant
|
||||
* of patent rights can be found in the PATENTS file in the same directory.
|
||||
*/
|
||||
|
||||
package com.facebook.react.modules.share;
|
||||
|
||||
import android.app.Activity;
|
||||
import android.content.Intent;
|
||||
import android.net.Uri;
|
||||
|
||||
import com.facebook.react.bridge.Arguments;
|
||||
import com.facebook.react.bridge.JSApplicationIllegalArgumentException;
|
||||
import com.facebook.react.bridge.Promise;
|
||||
import com.facebook.react.bridge.ReactApplicationContext;
|
||||
import com.facebook.react.bridge.ReactContextBaseJavaModule;
|
||||
import com.facebook.react.bridge.ReactMethod;
|
||||
import com.facebook.react.bridge.ReadableMap;
|
||||
import com.facebook.react.bridge.WritableMap;
|
||||
import com.facebook.react.common.ReactConstants;
|
||||
|
||||
/**
|
||||
* Intent module. Launch other activities or open URLs.
|
||||
*/
|
||||
public class ShareModule extends ReactContextBaseJavaModule {
|
||||
|
||||
/* package */ static final String ACTION_SHARED = "sharedAction";
|
||||
/* package */ static final String ERROR_INVALID_CONTENT = "E_INVALID_CONTENT";
|
||||
/* package */ static final String ERROR_UNABLE_TO_OPEN_DIALOG = "E_UNABLE_TO_OPEN_DIALOG";
|
||||
|
||||
public ShareModule(ReactApplicationContext reactContext) {
|
||||
super(reactContext);
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getName() {
|
||||
return "ShareModule";
|
||||
}
|
||||
|
||||
/**
|
||||
* Open a chooser dialog to send text content to other apps.
|
||||
*
|
||||
* Refer http://developer.android.com/intl/ko/training/sharing/send.html
|
||||
*
|
||||
* @param content the data to send
|
||||
* @param dialogTitle the title of the chooser dialog
|
||||
*/
|
||||
@ReactMethod
|
||||
public void share(ReadableMap content, String dialogTitle, Promise promise) {
|
||||
if (content == null) {
|
||||
promise.reject(ERROR_INVALID_CONTENT, "Content cannot be null");
|
||||
return;
|
||||
}
|
||||
|
||||
try {
|
||||
Intent intent = new Intent(Intent.ACTION_SEND);
|
||||
intent.setTypeAndNormalize("text/plain");
|
||||
|
||||
if (content.hasKey("title")) {
|
||||
intent.putExtra(Intent.EXTRA_SUBJECT, content.getString("title"));
|
||||
}
|
||||
|
||||
if (content.hasKey("message")) {
|
||||
intent.putExtra(Intent.EXTRA_TEXT, content.getString("message"));
|
||||
}
|
||||
|
||||
Intent chooser = Intent.createChooser(intent, dialogTitle);
|
||||
chooser.addCategory(Intent.CATEGORY_DEFAULT);
|
||||
|
||||
Activity currentActivity = getCurrentActivity();
|
||||
if (currentActivity != null) {
|
||||
currentActivity.startActivity(chooser);
|
||||
} else {
|
||||
getReactApplicationContext().startActivity(chooser);
|
||||
}
|
||||
WritableMap result = Arguments.createMap();
|
||||
result.putString("action", ACTION_SHARED);
|
||||
promise.resolve(result);
|
||||
|
||||
} catch (Exception e) {
|
||||
promise.reject(ERROR_UNABLE_TO_OPEN_DIALOG, "Failed to open share dialog");
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
@@ -27,6 +27,7 @@ android_library(
|
||||
react_native_target('java/com/facebook/react/modules/netinfo:netinfo'),
|
||||
react_native_target('java/com/facebook/react/modules/network:network'),
|
||||
react_native_target('java/com/facebook/react/modules/permissions:permissions'),
|
||||
react_native_target('java/com/facebook/react/modules/share:share'),
|
||||
react_native_target('java/com/facebook/react/modules/statusbar:statusbar'),
|
||||
react_native_target('java/com/facebook/react/modules/storage:storage'),
|
||||
react_native_target('java/com/facebook/react/modules/timepicker:timepicker'),
|
||||
|
||||
@@ -33,6 +33,7 @@ import com.facebook.react.modules.location.LocationModule;
|
||||
import com.facebook.react.modules.netinfo.NetInfoModule;
|
||||
import com.facebook.react.modules.network.NetworkingModule;
|
||||
import com.facebook.react.modules.permissions.PermissionsModule;
|
||||
import com.facebook.react.modules.share.ShareModule;
|
||||
import com.facebook.react.modules.statusbar.StatusBarModule;
|
||||
import com.facebook.react.modules.storage.AsyncStorageModule;
|
||||
import com.facebook.react.modules.timepicker.TimePickerDialogModule;
|
||||
@@ -89,6 +90,7 @@ public class MainReactPackage implements ReactPackage {
|
||||
new NetworkingModule(reactContext),
|
||||
new NetInfoModule(reactContext),
|
||||
new PermissionsModule(reactContext),
|
||||
new ShareModule(reactContext),
|
||||
new StatusBarModule(reactContext),
|
||||
new TimePickerDialogModule(reactContext),
|
||||
new ToastModule(reactContext),
|
||||
|
||||
Reference in New Issue
Block a user