Skip to content

Commit

Permalink
Merge branch 'component_share'
Browse files Browse the repository at this point in the history
  • Loading branch information
EstebanFuentealba committed Jul 27, 2016
2 parents 47519af + d705b2c commit 130326a
Show file tree
Hide file tree
Showing 29 changed files with 1,325 additions and 159 deletions.
243 changes: 197 additions & 46 deletions README.md

Large diffs are not rendered by default.

2 changes: 1 addition & 1 deletion android/react-native-share.iml
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@
<option name="ALLOW_USER_CONFIGURATION" value="false" />
<option name="MANIFEST_FILE_RELATIVE_PATH" value="/src/main/AndroidManifest.xml" />
<option name="RES_FOLDER_RELATIVE_PATH" value="/src/main/res" />
<option name="RES_FOLDERS_RELATIVE_PATH" value="" />
<option name="RES_FOLDERS_RELATIVE_PATH" value="file://$MODULE_DIR$/src/main/res" />
<option name="ASSETS_FOLDER_RELATIVE_PATH" value="/src/main/assets" />
<option name="LIBRARY_PROJECT" value="true" />
</configuration>
Expand Down
126 changes: 54 additions & 72 deletions android/src/main/java/cl/json/RNShareModule.java
Original file line number Diff line number Diff line change
Expand Up @@ -2,90 +2,72 @@

import android.content.Intent;
import android.content.ActivityNotFoundException;

import android.net.Uri;
import android.support.annotation.Nullable;
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.ReadableArray;
import com.facebook.react.bridge.Callback;

public class RNShareModule extends ReactContextBaseJavaModule {

private final ReactApplicationContext reactContext;
import java.sql.SQLOutput;
import java.util.ArrayList;
import java.util.HashMap;

public RNShareModule(ReactApplicationContext reactContext) {
super(reactContext);
this.reactContext = reactContext;
}
import cl.json.social.EmailShare;
import cl.json.social.FacebookShare;
import cl.json.social.GenericShare;
import cl.json.social.GooglePlusShare;
import cl.json.social.ShareIntent;
import cl.json.social.TwitterShare;
import cl.json.social.WhatsAppShare;

@Override
public String getName() {
return "RNShare";
}

@ReactMethod
public void open(ReadableMap options, Callback callback) {
Intent shareIntent = createShareIntent(options);
Intent intentChooser = createIntentChooser(options, shareIntent);
public class RNShareModule extends ReactContextBaseJavaModule {

try {
this.reactContext.startActivity(intentChooser);
callback.invoke("OK");
} catch (ActivityNotFoundException ex) {
callback.invoke("not_available");
private final ReactApplicationContext reactContext;
private HashMap<String, ShareIntent> sharesExtra = new HashMap<String, ShareIntent>();
public RNShareModule(ReactApplicationContext reactContext) {
super(reactContext);
this.reactContext = reactContext;
sharesExtra.put("generic", new GenericShare(this.reactContext));
sharesExtra.put("facebook", new FacebookShare(this.reactContext));
sharesExtra.put("twitter", new TwitterShare(this.reactContext));
sharesExtra.put("whatsapp",new WhatsAppShare(this.reactContext));
sharesExtra.put("googleplus",new GooglePlusShare(this.reactContext));
sharesExtra.put("email",new EmailShare(this.reactContext));
// add more customs single intent shares here
}
}

/**
* Creates an {@link Intent} to be shared from a set of {@link ReadableMap} options
* @param {@link ReadableMap} options
* @return {@link Intent} intent
*/
private Intent createShareIntent(ReadableMap options) {
Intent intent = new Intent(android.content.Intent.ACTION_SEND);
intent.setType("text/plain");

if (hasValidKey("share_subject", options) ) {
intent.putExtra(Intent.EXTRA_SUBJECT, options.getString("share_subject"));
@Override
public String getName() {
return "RNShare";
}

if (hasValidKey("share_text", options) && hasValidKey("share_URL", options)) {
intent.putExtra(Intent.EXTRA_TEXT, options.getString("share_text") + " " + options.getString("share_URL"));
} else if (hasValidKey("share_URL", options)) {
intent.putExtra(Intent.EXTRA_TEXT, options.getString("share_URL"));
} else if (hasValidKey("share_text", options) ) {
intent.putExtra(Intent.EXTRA_TEXT, options.getString("share_text"));
@ReactMethod
public void open(ReadableMap options, @Nullable Callback failureCallback, @Nullable Callback successCallback) {
try{
this.sharesExtra.get("generic").open(options);
successCallback.invoke("OK");
}catch(ActivityNotFoundException ex) {
System.out.println("ERROR");
System.out.println(ex.getMessage());
failureCallback.invoke("not_available");
}
}
return intent;
}

/**
* Creates an {@link Intent} representing an intent chooser
* @param {@link ReadableMap} options
* @param {@link Intent} intent to share
* @return {@link Intent} intent
*/
private Intent createIntentChooser(ReadableMap options, Intent intent) {
String title = "Share";
if (hasValidKey("title", options)) {
title = options.getString("title");
@ReactMethod
public void shareSingle(ReadableMap options, @Nullable Callback failureCallback, @Nullable Callback successCallback) {
System.out.println("SHARE SINGLE METHOD");
if (ShareIntent.hasValidKey("social", options) ) {
try{
this.sharesExtra.get(options.getString("social")).open(options);
successCallback.invoke("OK");
}catch(ActivityNotFoundException ex) {
System.out.println("ERROR");
System.out.println(ex.getMessage());
failureCallback.invoke(ex.getMessage());
}
} else {
failureCallback.invoke("no exists social key");
}
}

Intent chooser = Intent.createChooser(intent, title);
chooser.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);

return chooser;
}

/**
* Checks if a given key is valid
* @param @{link String} key
* @param @{link ReadableMap} options
* @return boolean representing whether the key exists and has a value
*/
private boolean hasValidKey(String key, ReadableMap options) {
return options.hasKey(key) && !options.isNull(key);
}

}
}
115 changes: 115 additions & 0 deletions android/src/main/java/cl/json/ShareFile.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,115 @@
package cl.json;

import android.content.CursorLoader;
import android.content.Intent;
import android.database.Cursor;
import android.media.MediaScannerConnection;
import android.net.Uri;
import android.os.Environment;
import android.provider.MediaStore;
import android.util.Base64;
import android.webkit.MimeTypeMap;

import com.facebook.react.bridge.ReactApplicationContext;

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.StringReader;
import java.net.URI;

/**
* Created by disenodosbbcl on 22-07-16.
*/
public class ShareFile {

private final ReactApplicationContext reactContext;
private String url;
private Uri uri;
private String type = "*/*";
private String extension = "";

public ShareFile(String url, ReactApplicationContext reactContext){
this.url = url;
this.uri = Uri.parse(this.url);
this.reactContext = reactContext;
}
/**
* Obtain mime type from URL
* @param {@link String} url
* @return {@link String} mime type
*/
private String getMimeType(String url) {
String type = "*/*";
String extension = MimeTypeMap.getFileExtensionFromUrl(url);
if (extension != null) {
type = MimeTypeMap.getSingleton().getMimeTypeFromExtension(extension);
}
return type;
}
/**
* Return an if the url is a file (local or base64)l
* @return {@link boolean}
*/
public boolean isFile() {
return this.isBase64File() || this.isLocalFile();
}
public boolean isBase64File() {
if(uri.getScheme().equals("data")) {
this.type = this.uri.getSchemeSpecificPart().substring(0, this.uri.getSchemeSpecificPart().indexOf(";"));
return true;
}
return false;
}
public boolean isLocalFile() {
if(uri.getScheme().equals("content") || uri.getScheme().equals("file")) {
String realPath = this.getRealPathFromURI(uri);
this.type = this.getMimeType(realPath);

return true;
}
return false;
}
public String getType() {
return this.type;
}
private String getRealPathFromURI(Uri contentUri) {
String[] proj = { MediaStore.Images.Media.DATA };
CursorLoader loader = new CursorLoader(this.reactContext, contentUri, proj, null, null, null);
Cursor cursor = loader.loadInBackground();
int column_index = cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA);
cursor.moveToFirst();
String result = cursor.getString(column_index);
cursor.close();
return result;
}
public Uri getURI() {

final MimeTypeMap mime = MimeTypeMap.getSingleton();
this.extension = mime.getExtensionFromMimeType(this.type);
if(this.isBase64File()) {
String encodedImg = this.uri.getSchemeSpecificPart().substring(this.uri.getSchemeSpecificPart().indexOf(";base64,") + 8);
try {
File dir = new File(Environment.getExternalStorageDirectory(), Environment.DIRECTORY_DOWNLOADS );
if (!dir.exists()) {
dir.mkdirs();
}
File file = new File(dir, System.currentTimeMillis() + "." + this.extension);
final FileOutputStream fos = new FileOutputStream(file);
fos.write(Base64.decode(encodedImg, Base64.DEFAULT));
fos.flush();
fos.close();
return Uri.fromFile(file);

} catch (IOException e) {
e.printStackTrace();
}
} else if(this.isLocalFile()) {
Uri uri = Uri.parse(this.url);

return uri;
}

return null;
}
}
39 changes: 39 additions & 0 deletions android/src/main/java/cl/json/social/EmailShare.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
package cl.json.social;

import android.content.ActivityNotFoundException;

import com.facebook.react.bridge.ReactApplicationContext;
import com.facebook.react.bridge.ReadableMap;

/**
* Created by disenodosbbcl on 23-07-16.
*/
public class EmailShare extends SingleShareIntent {

private static final String PACKAGE = "com.google.android.gm";

public EmailShare(ReactApplicationContext reactContext) {
super(reactContext);
}
@Override
public void open(ReadableMap options) throws ActivityNotFoundException {
super.open(options);
// extra params here
this.openIntentChooser();
}
@Override
protected String getPackage() {
return PACKAGE;
}

@Override
protected String getDefaultWebLink() {
return null;
}

@Override
protected String getPlayStoreLink() {
return null;
}
}

40 changes: 40 additions & 0 deletions android/src/main/java/cl/json/social/FacebookShare.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,40 @@
package cl.json.social;

import android.content.ActivityNotFoundException;

import com.facebook.react.bridge.ReactApplicationContext;
import com.facebook.react.bridge.ReadableMap;

/**
* Created by disenodosbbcl on 23-07-16.
*/
public class FacebookShare extends SingleShareIntent {

private static final String PACKAGE = "com.facebook.katana";
private static final String DEFAULT_WEB_LINK = "https://www.facebook.com/sharer/sharer.php?u={url}";

public FacebookShare(ReactApplicationContext reactContext) {
super(reactContext);

}
@Override
public void open(ReadableMap options) throws ActivityNotFoundException {
super.open(options);
// MORE DATA
this.openIntentChooser();
}
@Override
protected String getPackage() {
return PACKAGE;
}

@Override
protected String getDefaultWebLink() {
return DEFAULT_WEB_LINK;
}

@Override
protected String getPlayStoreLink() {
return null;
}
}
37 changes: 37 additions & 0 deletions android/src/main/java/cl/json/social/GenericShare.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
package cl.json.social;

import android.content.ActivityNotFoundException;

import com.facebook.react.bridge.ReactApplicationContext;
import com.facebook.react.bridge.ReadableMap;

/**
* Created by disenodosbbcl on 23-07-16.
*/
public class GenericShare extends ShareIntent {
public GenericShare(ReactApplicationContext reactContext) {
super(reactContext);
}

@Override
public void open(ReadableMap options) throws ActivityNotFoundException {
super.open(options);
// extra params here
this.openIntentChooser();
}

@Override
protected String getPackage() {
return null;
}

@Override
protected String getDefaultWebLink() {
return null;
}

@Override
protected String getPlayStoreLink() {
return null;
}
}
Loading

0 comments on commit 130326a

Please sign in to comment.