Skip to content

Commit

Permalink
Paste image from Clipboard (Android) (react-native-clipboard#117)
Browse files Browse the repository at this point in the history
  • Loading branch information
MalcolmTomisin committed Oct 7, 2021
1 parent 33b60d7 commit cf23a19
Show file tree
Hide file tree
Showing 11 changed files with 232 additions and 107 deletions.
2 changes: 1 addition & 1 deletion android/.classpath
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<classpath>
<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.8/"/>
<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-14/"/>
<classpathentry kind="con" path="org.eclipse.buildship.core.gradleclasspathcontainer"/>
<classpathentry kind="output" path="bin/default"/>
</classpath>
13 changes: 12 additions & 1 deletion android/.project
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<projectDescription>
<name>android</name>
<name>@react-native-community_clipboard</name>
<comment>Project android created by Buildship.</comment>
<projects>
</projects>
Expand All @@ -20,4 +20,15 @@
<nature>org.eclipse.jdt.core.javanature</nature>
<nature>org.eclipse.buildship.core.gradleprojectnature</nature>
</natures>
<filteredResources>
<filter>
<id>0</id>
<name></name>
<type>30</type>
<matcher>
<id>org.eclipse.core.resources.regexFilterMatcher</id>
<arguments>node_modules|.git|__CREATED_BY_JAVA_LANGUAGE_SERVER__</arguments>
</matcher>
</filter>
</filteredResources>
</projectDescription>
6 changes: 3 additions & 3 deletions android/.settings/org.eclipse.buildship.core.prefs
Original file line number Diff line number Diff line change
@@ -1,11 +1,11 @@
arguments=
auto.sync=false
build.scans.enabled=false
connection.gradle.distribution=GRADLE_DISTRIBUTION(VERSION(6.3))
connection.project.dir=
connection.gradle.distribution=GRADLE_DISTRIBUTION(VERSION(7.0-rc-1))
connection.project.dir=../example/android
eclipse.preferences.version=1
gradle.user.home=
java.home=/Library/Java/JavaVirtualMachines/adoptopenjdk-8.jdk/Contents/Home
java.home=/Library/Java/JavaVirtualMachines/jdk-14.0.2.jdk/Contents/Home
jvm.arguments=
offline.mode=false
override.workspace.settings=true
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,9 +7,16 @@

package com.reactnativecommunity.clipboard;

import android.content.ClipDescription;
import android.content.ClipboardManager;
import android.content.ClipData;
import android.content.ContentResolver;
import android.content.Context;
import android.graphics.Bitmap;
import android.net.Uri;
import android.provider.MediaStore;
import android.util.Base64;
import android.util.Log;

import com.facebook.react.bridge.ReactApplicationContext;
import com.facebook.react.bridge.ReactContextBaseJavaModule;
Expand All @@ -19,6 +26,9 @@
import com.facebook.react.module.annotations.ReactModule;
import com.facebook.react.modules.core.DeviceEventManagerModule;

import java.io.ByteArrayOutputStream;
import java.io.IOException;

/**
* A module that allows JS to get/set clipboard contents.
*/
Expand Down Expand Up @@ -83,6 +93,51 @@ public void hasString(Promise promise) {
}
}

@ReactMethod
public void getImage(Promise promise){
ClipboardManager clipboardManager = getClipboardService();
if (!(clipboardManager.hasPrimaryClip())){
promise.resolve("");
}
else if (clipboardManager.getPrimaryClipDescription().hasMimeType(ClipDescription.MIMETYPE_TEXT_PLAIN)){
promise.resolve("");
}
else {
ClipData clipData = clipboardManager.getPrimaryClip();
if(clipData != null){
ClipData.Item item = clipData.getItemAt(0);
Uri pasteUri = item.getUri();
if (pasteUri != null){
ContentResolver cr = reactContext.getContentResolver();
String mimeType = cr.getType(pasteUri);
if (mimeType != null){
if (mimeType.equals("image/jpeg") || mimeType.equals("image/png") || mimeType.equals("image/jpg")){
String imgPath = pasteUri.getPath();
try {
Bitmap bitmap = MediaStore.Images.Media.getBitmap(cr, pasteUri);
ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
if (mimeType.equals("image/jpeg") || mimeType.equals("image/jpg")){
bitmap.compress(Bitmap.CompressFormat.JPEG, 100, outputStream);
}
if (mimeType.equals("image/png")){
bitmap.compress(Bitmap.CompressFormat.PNG, 100, outputStream);
}
byte[] byteArray = outputStream.toByteArray();
String encodedString = Base64.encodeToString(byteArray, Base64.DEFAULT);
StringBuilder builder = new StringBuilder("data:" + mimeType + ";base64,").append(encodedString);
promise.resolve(builder.toString());
} catch (IOException e) {
promise.reject(e);
e.printStackTrace();
}
}
}
}
}
promise.resolve("");
}
}

@ReactMethod
public void setListener() {
try {
Expand Down
25 changes: 25 additions & 0 deletions example/App.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@ import {
Alert,
SafeAreaView,
Platform,
Image,
} from 'react-native';
import Clipboard, {useClipboard} from '../src';

Expand All @@ -19,12 +20,18 @@ export const App: React.FC = () => {
const [text, setText] = useState('');
const [isURL, setIsURL] = useState(false);
const [data, setString] = useClipboard();
const [imageString, setImageString] = useState<string>('');

const checkStringType = async () => {
const checkClipboard = await Clipboard.hasURL();
setIsURL(checkClipboard);
};

const pasteImageAndroid = async () => {
const base64 = await Clipboard.getImage();
setImageString(base64);
};

useEffect(() => {
checkStringType();
}, [data]);
Expand Down Expand Up @@ -62,7 +69,18 @@ export const App: React.FC = () => {
placeholder="Type here..."
/>
<Button onPress={writeToClipboard} title="Write to Clipboard" />
{Platform.OS === 'android' && (
<View style={styles.imageButtonAndroid}>
<Button
onPress={pasteImageAndroid}
title="Paste image from Android Clipboard"
/>
</View>
)}
</View>
{imageString === '' ? null : (
<Image style={styles.imageAndroid} source={{uri: imageString}} />
)}
</SafeAreaView>
);
};
Expand Down Expand Up @@ -110,4 +128,11 @@ const styles = StyleSheet.create({
clipboardContent: {
marginBottom: 20,
},
imageAndroid: {
height: 160,
width: 160,
},
imageButtonAndroid: {
marginTop: 10,
},
});
11 changes: 11 additions & 0 deletions example/android/.project
Original file line number Diff line number Diff line change
Expand Up @@ -14,4 +14,15 @@
<natures>
<nature>org.eclipse.buildship.core.gradleprojectnature</nature>
</natures>
<filteredResources>
<filter>
<id>0</id>
<name></name>
<type>30</type>
<matcher>
<id>org.eclipse.core.resources.regexFilterMatcher</id>
<arguments>node_modules|.git|__CREATED_BY_JAVA_LANGUAGE_SERVER__</arguments>
</matcher>
</filter>
</filteredResources>
</projectDescription>
2 changes: 1 addition & 1 deletion example/android/.settings/org.eclipse.buildship.core.prefs
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ connection.gradle.distribution=GRADLE_DISTRIBUTION(WRAPPER)
connection.project.dir=
eclipse.preferences.version=1
gradle.user.home=
java.home=/Library/Java/JavaVirtualMachines/adoptopenjdk-8.jdk/Contents/Home
java.home=/Library/Java/JavaVirtualMachines/jdk-14.0.2.jdk/Contents/Home
jvm.arguments=
offline.mode=false
override.workspace.settings=true
Expand Down
2 changes: 1 addition & 1 deletion example/android/app/.classpath
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<classpath>
<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.8/"/>
<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-14/"/>
<classpathentry kind="con" path="org.eclipse.buildship.core.gradleclasspathcontainer"/>
<classpathentry kind="output" path="bin/default"/>
</classpath>
11 changes: 11 additions & 0 deletions example/android/app/.project
Original file line number Diff line number Diff line change
Expand Up @@ -20,4 +20,15 @@
<nature>org.eclipse.jdt.core.javanature</nature>
<nature>org.eclipse.buildship.core.gradleprojectnature</nature>
</natures>
<filteredResources>
<filter>
<id>1632858203963</id>
<name></name>
<type>30</type>
<matcher>
<id>org.eclipse.core.resources.regexFilterMatcher</id>
<arguments>node_modules|.git|__CREATED_BY_JAVA_LANGUAGE_SERVER__</arguments>
</matcher>
</filter>
</filteredResources>
</projectDescription>
Loading

0 comments on commit cf23a19

Please sign in to comment.