add qrcode reader on android

This commit is contained in:
turnoffthiscomputer
2024-07-31 16:08:16 +02:00
parent 4511115eea
commit 186677ed61
5 changed files with 158 additions and 27 deletions

View File

@@ -140,6 +140,8 @@ dependencies {
implementation project(':passportreader')
implementation 'org.jmrtd:jmrtd:0.7.18'
implementation 'com.github.blikoon:QRCodeScanner:0.1.2'
debugImplementation("com.facebook.flipper:flipper:${FLIPPER_VERSION}")
debugImplementation("com.facebook.flipper:flipper-network-plugin:${FLIPPER_VERSION}") {
exclude group:'com.squareup.okhttp3', module:'okhttp'

View File

@@ -13,6 +13,7 @@ import io.tradle.nfc.RNPassportReaderPackage;
import java.util.List;
import com.proofofpassport.prover.ProverPackage;
import com.rnfs.RNFSPackage;
import com.proofofpassport.QRCodeScannerPackage;
public class MainApplication extends Application implements ReactApplication {
@@ -32,6 +33,7 @@ public class MainApplication extends Application implements ReactApplication {
// Add the custom package here
packages.add(new CameraActivityPackage());
packages.add(new ProverPackage());
packages.add(new QRCodeScannerPackage());
return packages;
}

View File

@@ -0,0 +1,59 @@
package com.proofofpassport;
import android.app.Activity;
import android.content.Intent;
import androidx.annotation.NonNull;
import com.facebook.react.bridge.ActivityEventListener;
import com.facebook.react.bridge.BaseActivityEventListener;
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.blikoon.qrcodescanner.QrCodeActivity;
public class QRCodeScannerModule extends ReactContextBaseJavaModule {
private static final int REQUEST_CODE_QR_SCAN = 101;
private Promise scanPromise;
private final ActivityEventListener activityEventListener = new BaseActivityEventListener() {
@Override
public void onActivityResult(Activity activity, int requestCode, int resultCode, Intent data) {
if (requestCode == REQUEST_CODE_QR_SCAN) {
if (scanPromise != null) {
if (resultCode == Activity.RESULT_OK) {
String result = data.getStringExtra("com.blikoon.qrcodescanner.got_qr_scan_relult");
scanPromise.resolve(result);
} else {
scanPromise.reject("SCAN_FAILED", "QR Code scanning failed");
}
scanPromise = null;
}
}
}
};
QRCodeScannerModule(ReactApplicationContext reactContext) {
super(reactContext);
reactContext.addActivityEventListener(activityEventListener);
}
@NonNull
@Override
public String getName() {
return "QRCodeScanner";
}
@ReactMethod
public void scanQRCode(Promise promise) {
Activity currentActivity = getCurrentActivity();
if (currentActivity == null) {
promise.reject("ACTIVITY_DOES_NOT_EXIST", "Activity doesn't exist");
return;
}
scanPromise = promise;
Intent intent = new Intent(currentActivity, QrCodeActivity.class);
currentActivity.startActivityForResult(intent, REQUEST_CODE_QR_SCAN);
}
}

View File

@@ -0,0 +1,24 @@
package com.proofofpassport;
import com.facebook.react.ReactPackage;
import com.facebook.react.bridge.NativeModule;
import com.facebook.react.bridge.ReactApplicationContext;
import com.facebook.react.uimanager.ViewManager;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
public class QRCodeScannerPackage implements ReactPackage {
@Override
public List<ViewManager> createViewManagers(ReactApplicationContext reactContext) {
return Collections.emptyList();
}
@Override
public List<NativeModule> createNativeModules(ReactApplicationContext reactContext) {
List<NativeModule> modules = new ArrayList<>();
modules.add(new QRCodeScannerModule(reactContext));
return modules;
}
}

View File

@@ -13,7 +13,9 @@ import { BadgeCheck, Binary, LayoutGrid, List, LockKeyhole, QrCode, ShieldCheck,
import { bgBlue, bgGreen, separatorColor, textBlack } from '../utils/colors';
import { orange } from '@tamagui/colors';
import useUserStore from '../stores/userStore';
import { Platform } from 'react-native';
import { NativeModules } from 'react-native';
interface AppScreenProps {
setSheetAppListOpen: (value: boolean) => void;
setSheetRegisterIsOpen: (value: boolean) => void;
@@ -48,13 +50,65 @@ const AppScreen: React.FC<AppScreenProps> = ({ setSheetAppListOpen, setSheetRegi
gitcoinApp
];
const scanQRCode = () => {
if (Platform.OS === 'ios') {
if (NativeModules.QRScannerModule && NativeModules.QRScannerModule.scanQRCode) {
NativeModules.QRScannerModule.scanQRCode()
.then((result: string) => {
handleQRCodeScan(result);
})
.catch((error: any) => {
console.error('QR Scanner Error:', error);
toast.show('Error', {
message: 'Failed to scan QR code',
type: 'error',
});
});
} else {
console.error('QR Scanner module not found for iOS');
toast.show('Error', {
message: 'QR Scanner not available',
type: 'error',
});
}
} else if (Platform.OS === 'android') {
if (NativeModules.QRCodeScanner && NativeModules.QRCodeScanner.scanQRCode) {
NativeModules.QRCodeScanner.scanQRCode()
.then((result: string) => {
handleQRCodeScan(result);
})
.catch((error: any) => {
console.error('QR Scanner Error:', error);
toast.show('Error', {
message: 'Failed to scan QR code',
type: 'error',
});
});
} else {
console.error('QR Scanner module not found for Android');
toast.show('Error', {
message: 'QR Scanner not available',
type: 'error',
});
}
}
};
const handleQRCodeScan = (result: string) => {
console.log(result);
const app = createAppType(JSON.parse(result.replace(/'/g, '"')));
console.log(app);
setSelectedApp(app);
setSelectedTab("prove");
}
try {
console.log(result);
const app = createAppType(JSON.parse(result));
console.log(app);
setSelectedApp(app);
setSelectedTab("prove");
} catch (error) {
console.error('Error parsing QR code result:', error);
toast.show('Error', {
message: 'Invalid QR code format',
type: 'error',
});
}
};
return (
<YStack f={1} pb="$3" px="$3">
@@ -127,27 +181,17 @@ const AppScreen: React.FC<AppScreenProps> = ({ setSheetAppListOpen, setSheetRegi
<XStack f={1} minHeight="$1" />
<YStack gap="$2.5">
<CustomButton text="Scan QR Code" onPress={() => {
{
registered ?
NativeModules.QRScannerBridge.scanQRCode()
.then((result: string) => {
handleQRCodeScan(result);
})
.catch((error: any) => {
console.error('QR Scanner Error:', error);
})
:
setSheetRegisterIsOpen(true)
}
}} Icon={<QrCode size={18} color={textBlack} />} />
<CustomButton
text="Scan QR Code"
onPress={() => {
if (registered) {
scanQRCode();
} else {
setSheetRegisterIsOpen(true);
}
}}
Icon={<QrCode size={18} color={textBlack} />}
/>
<CustomButton bgColor='white' text="Open app list" onPress={
registered ?
() => setSheetAppListOpen(true)