From 63568f878946e9ace9b1cddb8fc48bf11078c67a Mon Sep 17 00:00:00 2001 From: Evan Date: Fri, 27 Sep 2019 01:12:00 -0400 Subject: [PATCH 1/2] Display Touch ID dialog on Android (if supported) --- src/action/auth-mobile.js | 11 ++++++++--- src/view/pin-mobile.js | 5 ++++- 2 files changed, 12 insertions(+), 4 deletions(-) diff --git a/src/action/auth-mobile.js b/src/action/auth-mobile.js index 4da785c6a..7f3864df8 100644 --- a/src/action/auth-mobile.js +++ b/src/action/auth-mobile.js @@ -192,15 +192,20 @@ class AuthAction { // TouchID & KeyStore Authentication // + async checkFingerprintHardwareAndEnrollment() { + const hasHardware = await this._Fingerprint.hasHardwareAsync(); + const isEnrolled = await this._Fingerprint.isEnrolledAsync(); + return hasHardware && isEnrolled ? true : false; + } + /** * Try authenticating the user using either via TouchID/FaceID on iOS * or a fingerprint reader on Android. * @return {Promise} */ async tryFingerprint() { - const hasHardware = await this._Fingerprint.hasHardwareAsync(); - const isEnrolled = await this._Fingerprint.isEnrolledAsync(); - if (!hasHardware || !isEnrolled) { + const hasFingerprint = await this.checkFingerprintHardwareAndEnrollment(); + if (!hasFingerprint) { return; } const msg = 'Unlock your Wallet'; diff --git a/src/view/pin-mobile.js b/src/view/pin-mobile.js index 4abfc41b1..a049d1def 100644 --- a/src/view/pin-mobile.js +++ b/src/view/pin-mobile.js @@ -37,6 +37,9 @@ class PinView extends React.Component { render() { const { store, auth } = this.props; + const unlockText = this.props.auth.checkFingerprintHardwareAndEnrollment() + ? 'Unlock with your pin or fingerprint' + : 'Unlock with your pin'; return ( @@ -47,7 +50,7 @@ class PinView extends React.Component { - Unlock with your pin + {unlockText} Date: Sun, 29 Sep 2019 14:54:53 -0400 Subject: [PATCH 2/2] Use BiometricPrompt API -Leverage BiometricPrompt API from Java component -Set up androidx -Update expo-constants and react-native-unimodules -Call BiometricPrompt Java code from react --- mobile/android/app/build.gradle | 3 +- .../android/app/src/main/AndroidManifest.xml | 1 + .../lightningapp/FingerprintDialogModule.java | 30 ++++ .../FingerprintDialogPackage.java | 28 ++++ .../com/lightningapp/MainApplication.java | 3 +- mobile/android/gradle.properties | 2 + mobile/package-lock.json | 148 +++++++++--------- mobile/package.json | 3 +- src/view/pin-mobile.js | 13 +- 9 files changed, 149 insertions(+), 82 deletions(-) create mode 100644 mobile/android/app/src/main/java/com/lightningapp/FingerprintDialogModule.java create mode 100644 mobile/android/app/src/main/java/com/lightningapp/FingerprintDialogPackage.java diff --git a/mobile/android/app/build.gradle b/mobile/android/app/build.gradle index 522d7e0c3..2fb2728f1 100644 --- a/mobile/android/app/build.gradle +++ b/mobile/android/app/build.gradle @@ -152,8 +152,9 @@ dependencies { implementation project(':react-native-svg') implementation project(':react-native-gesture-handler') implementation fileTree(dir: "libs", include: ["*.jar"]) - implementation "com.android.support:appcompat-v7:${rootProject.ext.supportLibVersion}" + implementation "com.android.support:support-annotations:${rootProject.ext.supportLibVersion}" implementation "com.facebook.react:react-native:+" // From node_modules + implementation 'androidx.biometric:biometric:1.0.0-alpha03' // Add v8-android - prebuilt libv8.so into APK implementation 'org.chromium:v8-android:+' addUnimodulesDependencies() diff --git a/mobile/android/app/src/main/AndroidManifest.xml b/mobile/android/app/src/main/AndroidManifest.xml index 8bf2afda4..0c01481cc 100644 --- a/mobile/android/app/src/main/AndroidManifest.xml +++ b/mobile/android/app/src/main/AndroidManifest.xml @@ -11,6 +11,7 @@ + diff --git a/mobile/android/app/src/main/java/com/lightningapp/FingerprintDialogModule.java b/mobile/android/app/src/main/java/com/lightningapp/FingerprintDialogModule.java new file mode 100644 index 000000000..837922f70 --- /dev/null +++ b/mobile/android/app/src/main/java/com/lightningapp/FingerprintDialogModule.java @@ -0,0 +1,30 @@ +package com.lightningapp; + +import com.facebook.react.bridge.ReactApplicationContext; +import com.facebook.react.bridge.ReactContextBaseJavaModule; +import com.facebook.react.bridge.ReactMethod; +import java.util.concurrent.Executors; +import androidx.biometric.BiometricPrompt; + +public class FingerprintDialogModule extends ReactContextBaseJavaModule { + public FingerprintDialogModule(ReactApplicationContext reactContext) { + super(reactContext); //required by React Native + } + + @Override + //getName is required to define the name of the module represented in JavaScript + public String getName() { + return "FingerprintDialog"; + } + + @ReactMethod + public void getBiometricPrompt() { + val executor = Executors.newSingleThreadExecutor(); + BiometricPrompt.Builder() + .setTitle("Use your fingerprint to unlock") + .setSubtitle("Lightning App requires authentication to continue") + .setDescription("Use your fingerprint to unlock the app or press cancel and enter in your pin") + .setNegativeButton("Cancel") + .build(); + } +} diff --git a/mobile/android/app/src/main/java/com/lightningapp/FingerprintDialogPackage.java b/mobile/android/app/src/main/java/com/lightningapp/FingerprintDialogPackage.java new file mode 100644 index 000000000..ee781fe46 --- /dev/null +++ b/mobile/android/app/src/main/java/com/lightningapp/FingerprintDialogPackage.java @@ -0,0 +1,28 @@ +package com.lightningapp; + +import com.facebook.react.ReactPackage; +import com.facebook.react.bridge.NativeModule; +import com.facebook.react.bridge.ReactApplicationContext; +import com.facebook.react.uimanager.ViewManager; +import com.lightningapp.FingerprintDialogModule; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; + +public class FingerprintDialogPackage implements ReactPackage { + + @Override + public List createViewManagers(ReactApplicationContext reactContext) { + return Collections.emptyList(); + } + + @Override + public List createNativeModules( + ReactApplicationContext reactContext) { + List modules = new ArrayList<>(); + //this is where you register the module + modules.add(new FingerprintDialogModule(reactContext)); + return modules; + } +} \ No newline at end of file diff --git a/mobile/android/app/src/main/java/com/lightningapp/MainApplication.java b/mobile/android/app/src/main/java/com/lightningapp/MainApplication.java index 2413c2234..e7bbb9135 100644 --- a/mobile/android/app/src/main/java/com/lightningapp/MainApplication.java +++ b/mobile/android/app/src/main/java/com/lightningapp/MainApplication.java @@ -53,7 +53,8 @@ protected List getPackages() { new SvgPackage(), new RNGestureHandlerPackage(), new ModuleRegistryAdapter(mModuleRegistryProvider), - new LndNativePackage() + new LndNativePackage(), + new FingerprintDialogPackage() ); } diff --git a/mobile/android/gradle.properties b/mobile/android/gradle.properties index 89e0d99e2..59d5aab6a 100644 --- a/mobile/android/gradle.properties +++ b/mobile/android/gradle.properties @@ -16,3 +16,5 @@ # This option should only be used with decoupled projects. More details, visit # http://www.gradle.org/docs/current/userguide/multi_project_builds.html#sec:decoupled_projects # org.gradle.parallel=true +android.useAndroidX=true +android.enableJetifier=true \ No newline at end of file diff --git a/mobile/package-lock.json b/mobile/package-lock.json index 19271ae5c..356f2c313 100644 --- a/mobile/package-lock.json +++ b/mobile/package-lock.json @@ -984,17 +984,17 @@ "integrity": "sha512-CBR5avlLcu0YCILJiDIXeU2pTw7UK/NIxfC63m7d7CVamho1qDEzXKkOtEauQRPMy6MI8mLozth+JJkas7HY6g==" }, "@unimodules/core": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/@unimodules/core/-/core-3.0.2.tgz", - "integrity": "sha512-EMZjVp+yrtoPKpDBPvj4+hyDWALl7gvpWeUsDz2Nb9MMBPLnhag1uNk3KC98StJdnjbSXKSdKrCMMidOXnyKcg==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@unimodules/core/-/core-4.0.0.tgz", + "integrity": "sha512-lHxRmCG9DK3/aA2lnBKPS32K95NpYE10mZQRp5dycSptgN0DIeWWHuE01SndcSUACGyEP+tDO+DnGo8mhLlt4Q==", "requires": { "compare-versions": "^3.4.0" } }, "@unimodules/react-native-adapter": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@unimodules/react-native-adapter/-/react-native-adapter-3.0.0.tgz", - "integrity": "sha512-zkFFE0HQ2Flfx/aY3hBKDgMvQ1meUm3H6vMIacY1KywexCuKW8ivBobkOsHIet4jf7km0Eklt6WtB3LqQVw5yw==", + "version": "5.0.0-alpha.0", + "resolved": "https://registry.npmjs.org/@unimodules/react-native-adapter/-/react-native-adapter-5.0.0-alpha.0.tgz", + "integrity": "sha512-qPF92DiSDMoOmdxb/i6+XEAqLR7+4RZgi2HmPMlqh2oTBQIlrAcM7JQVsIDFkmtcVAzdy4VPzJpFDSJW67My3A==", "requires": { "invariant": "^2.2.4", "lodash": "^4.5.0", @@ -1602,9 +1602,9 @@ "integrity": "sha512-7MzElZPTyJ2fNvBkPxtFQ2fWIkVmuzw41+BZHSzpEq3ymB2MfeKp1+yXl/tS75xCx+WnyV+yb0kp+K1C3UNwmQ==" }, "blueimp-md5": { - "version": "2.11.1", - "resolved": "https://registry.npmjs.org/blueimp-md5/-/blueimp-md5-2.11.1.tgz", - "integrity": "sha512-4UiOAmql2XO0Sws07OVzYdCKK0K2Va5g6AVgYXoGhEQiKrdSOefjUCm1frPk6E+xiIOHRqaFg+TUGo7cClKg5g==" + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/blueimp-md5/-/blueimp-md5-2.12.0.tgz", + "integrity": "sha512-zo+HIdIhzojv6F1siQPqPFROyVy7C50KzHv/k/Iz+BtvtVzSHXiMXOpq2wCfNkeBqdCv+V8XOV96tsEt2W/3rQ==" }, "bn.js": { "version": "4.11.8", @@ -2460,14 +2460,14 @@ } }, "expo-app-loader-provider": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/expo-app-loader-provider/-/expo-app-loader-provider-6.0.0.tgz", - "integrity": "sha512-GtpztJVxOz+vVwdLyHskpzVzFWMXZPIFC/zczHZPsTwjS+wXj6n8MVaLxX6GaTyhNEtYjp0VIQUw3b7eP+vO6w==" + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/expo-app-loader-provider/-/expo-app-loader-provider-7.0.0.tgz", + "integrity": "sha512-C+5zpZN2T7PCj7weLs/ZgAC+y9dvu0VdTXD00Jf9Wo7Pxu/lsLh6ljg9JL91c+2tYDzMEODPNmT+JOUIxAr5zQ==" }, "expo-asset": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/expo-asset/-/expo-asset-6.0.0.tgz", - "integrity": "sha512-M0sJphdCQ0mq+7kg6rQmq4rU5hbsL72AZCNrga565JchCLeevJhv6j72erh2viqDAPdvjZpGwc7pwI/dxu1+zg==", + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/expo-asset/-/expo-asset-7.0.0.tgz", + "integrity": "sha512-MwWrlpzaZqT0NU0V3Wn8oA1pMb7Al49aYAWMPEUZ2UV5NyVAbzYPuS2duIfwX55ivczjJZHpwrhd0hb/3l9ngQ==", "requires": { "blueimp-md5": "^2.10.0", "path-browserify": "^1.0.0", @@ -2482,17 +2482,17 @@ } }, "expo-constants": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/expo-constants/-/expo-constants-6.0.0.tgz", - "integrity": "sha512-O0yL3Ok0YUEWpAqsWjOdgFD/lMfg8PUGH/nq31CZ1s7cuFUlksD42i5YhIRlb0Pa/btK8X9LpfY3eWhx9eTmbg==", + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/expo-constants/-/expo-constants-7.0.0.tgz", + "integrity": "sha512-oLINuMtGcAwfHGInSVhq6xGojp3atUpSIp7KImo9rqXhWwD5FNmqA5Jflo4J0ODPq590kN5ieiYCCqwls2/u0w==", "requires": { "ua-parser-js": "^0.7.19" } }, "expo-file-system": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/expo-file-system/-/expo-file-system-6.0.2.tgz", - "integrity": "sha512-s+6oQpLhcT7MQp7fcoj1E+zttMr0WX6c0FrddzqB4dUfhIggV+nb35nQMASIiTHAj8VPUanTFliY5rETHRMHRA==", + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/expo-file-system/-/expo-file-system-7.0.0.tgz", + "integrity": "sha512-ignf5Vf5cPDYO/4HgUkgnL574wMbCNxyazlOvBgV34rLGJzBbFsn++hqC7njr2VTpIIXh2G9vp1+8g6cvsQdqA==", "requires": { "uuid-js": "^0.7.5" } @@ -2519,9 +2519,9 @@ } }, "expo-permissions": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/expo-permissions/-/expo-permissions-6.0.0.tgz", - "integrity": "sha512-O+RdyfGiq7i+5Vi9fE38DgKn436lNWiqhnS5/Z7CC00bmKahhjVMNDbZvNn/nrdRGyaPneJk1Co1s1sexSnv0A==" + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/expo-permissions/-/expo-permissions-7.0.0.tgz", + "integrity": "sha512-C+qyVz+pdZO4YpVR2HSC3gsBZg0Qb8brCFgzmDmWcAtgrOiHClaLPdhI2XtQuGh8ubXcKPUGZp++UCEGiG0Jxg==" }, "expo-random": { "version": "6.0.0", @@ -5592,28 +5592,28 @@ } }, "react-native-unimodules": { - "version": "0.5.4", - "resolved": "https://registry.npmjs.org/react-native-unimodules/-/react-native-unimodules-0.5.4.tgz", - "integrity": "sha512-47ZJzZriaVtvDJp24HLu6xcKBaDScDcx71yIDmahsKKJtbEHmXl7jPz1y/2FhAKSb174m9niu3F97Di5Bo+91g==", + "version": "0.7.0-rc.1", + "resolved": "https://registry.npmjs.org/react-native-unimodules/-/react-native-unimodules-0.7.0-rc.1.tgz", + "integrity": "sha512-qRKxMY5k7NVlHglOklUPbIawD1A6TujChe1S4tR+Yew+9SmE+JEUUhz1tjrVkOakpFOFAfiBk74Gh1KI9H0DtA==", "requires": { - "@unimodules/core": "~3.0.2", - "@unimodules/react-native-adapter": "~3.0.0", + "@unimodules/core": "~4.0.0", + "@unimodules/react-native-adapter": "~5.0.0-alpha.0", "chalk": "^2.4.2", - "expo-app-loader-provider": "~6.0.0", - "expo-asset": "~6.0.0", - "expo-constants": "~6.0.0", - "expo-file-system": "~6.0.1", - "expo-permissions": "~6.0.0", - "unimodules-barcode-scanner-interface": "~3.0.0", - "unimodules-camera-interface": "~3.0.0", - "unimodules-constants-interface": "~3.0.0", - "unimodules-face-detector-interface": "~3.0.0", - "unimodules-file-system-interface": "~3.0.0", - "unimodules-font-interface": "~3.0.0", - "unimodules-image-loader-interface": "~3.0.0", - "unimodules-permissions-interface": "~3.0.0", - "unimodules-sensors-interface": "~3.0.0", - "unimodules-task-manager-interface": "~3.0.0" + "expo-app-loader-provider": "~7.0.0", + "expo-asset": "~7.0.0", + "expo-constants": "~7.0.0", + "expo-file-system": "~7.0.0", + "expo-permissions": "~7.0.0", + "unimodules-barcode-scanner-interface": "~4.0.0", + "unimodules-camera-interface": "~4.0.0", + "unimodules-constants-interface": "~4.0.0", + "unimodules-face-detector-interface": "~4.0.0", + "unimodules-file-system-interface": "~4.0.0", + "unimodules-font-interface": "~4.0.0", + "unimodules-image-loader-interface": "~4.0.0", + "unimodules-permissions-interface": "~4.0.0", + "unimodules-sensors-interface": "~4.0.0", + "unimodules-task-manager-interface": "~4.0.0" } }, "react-native-v8": { @@ -6883,54 +6883,54 @@ "integrity": "sha512-L5RAqCfXqAwR3RriF8pM0lU0w4Ryf/GgzONwi6KnL1taJQa7x1TCxdJnILX59WIGOwR57IVxn7Nej0fz1Ny6fw==" }, "unimodules-barcode-scanner-interface": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/unimodules-barcode-scanner-interface/-/unimodules-barcode-scanner-interface-3.0.0.tgz", - "integrity": "sha512-EtJBfKU5VgZbyIfIZwyWfUo59pIgW6s7YGzlpj9jk4UWKyqqhYT/FoaZqudCJcPcfh2eYxkc9VxBGieRBpQrzg==" + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/unimodules-barcode-scanner-interface/-/unimodules-barcode-scanner-interface-4.0.0.tgz", + "integrity": "sha512-XAW+8s7w/dQ514I/SPfBKHPmbaCOEpYAkdn1aaBoWocVfdvOKf8SqwHSIaP2W/SFUwWNRF4Wqv2HBt1dvuhSSg==" }, "unimodules-camera-interface": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/unimodules-camera-interface/-/unimodules-camera-interface-3.0.0.tgz", - "integrity": "sha512-STjf1FAdYlN27ilJSR4kIUYyHTPrkQSR/mEg4S4pZX6tazmcuG2KzLCXCoV+xMWsrwmsMBjgLzw6yzg87N5Ydw==" + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/unimodules-camera-interface/-/unimodules-camera-interface-4.0.0.tgz", + "integrity": "sha512-rEYD3mKarxzgiWWL8J0mPAxzV4i1WI9DsNMRxyV2T7qC/WWIucroZX72O1BkYjUbIKerGmJWeGYbWHheP4/rsA==" }, "unimodules-constants-interface": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/unimodules-constants-interface/-/unimodules-constants-interface-3.0.0.tgz", - "integrity": "sha512-S4ap11UJH7D+Y4fXC7DyMNAkqIWD8B7rNCTS30wAF9beHXMZa1Od66rkJgSHqFRURy06h+Jr7qfJm9H5mtMz8Q==" + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/unimodules-constants-interface/-/unimodules-constants-interface-4.0.0.tgz", + "integrity": "sha512-FTM64GP+uawURWhuExrsCMebpcu0DdREUCuUmes5qd3/uTM2gqmhbm/ZwSKviH/ar4h630Fdb6P6v9o4MDInbA==" }, "unimodules-face-detector-interface": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/unimodules-face-detector-interface/-/unimodules-face-detector-interface-3.0.0.tgz", - "integrity": "sha512-fMQ3ZnhdOjbQ5ZXW62s/t1bbqBaenxzVIcgVEcwvLIFek0mx/EMHFkySgFkFjU11icUvaPEXW1yJtkK4QEpLhg==" + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/unimodules-face-detector-interface/-/unimodules-face-detector-interface-4.0.0.tgz", + "integrity": "sha512-ZFzqcNnJkBxvfdKCupvtQUj1yVJkzKivPGV6nydKZc9eJRLUgSXCUWtvXd0vaet1NSQqr2R3r6Ilvj0DzuCzUA==" }, "unimodules-file-system-interface": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/unimodules-file-system-interface/-/unimodules-file-system-interface-3.0.0.tgz", - "integrity": "sha512-LkLIKRE3CwsXLRFw8vx0++Cfjj+pAvvidVb7yhGWKFmNlVaWUW9Z8jkhFLBFXDsGFAOU69bUTrz25jmB2MRt0Q==" + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/unimodules-file-system-interface/-/unimodules-file-system-interface-4.0.0.tgz", + "integrity": "sha512-dDcKjArDwY3CXLlCL8tf9/JJG25K2lgtAL+560kqrftLu3pi0x5V7JmSDz52pJ4pLd5xL8s1Rzse+rIr5OpM3g==" }, "unimodules-font-interface": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/unimodules-font-interface/-/unimodules-font-interface-3.0.0.tgz", - "integrity": "sha512-DOQI0uTn7CGvA9lNUuiTWfQYuKQEM8LZKn6gNS8G+HVHVb+TZl/37qdhuoMBi5jkAZ4VOD/GpgnPv8qr0pJi1Q==" + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/unimodules-font-interface/-/unimodules-font-interface-4.0.0.tgz", + "integrity": "sha512-RFD1H405kZy8oYcg7f9Krr+UTUn6EZTcqAb+wRL6Ex9TJmzmxJT6JZ0FsUMezOUEwrdvXRpArH4P1AadHlzzGA==" }, "unimodules-image-loader-interface": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/unimodules-image-loader-interface/-/unimodules-image-loader-interface-3.0.0.tgz", - "integrity": "sha512-hC/VWdT33GkOZ4FLaqPoKGNKxhw+miFhM+7Re57snWIWYewSv0lRvCqqwc/hbGLocvd2qF3YYrBx9woqPI8NzA==" + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/unimodules-image-loader-interface/-/unimodules-image-loader-interface-4.0.0.tgz", + "integrity": "sha512-tv7g1YmZq9ZnG/x9l3qSlpEn93ZuMD+FuQpOZj3/oGDkBlc27vtBSEi8lTySWb9U7UK+bNlHGFqf1lGZcFU1Ug==" }, "unimodules-permissions-interface": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/unimodules-permissions-interface/-/unimodules-permissions-interface-3.0.0.tgz", - "integrity": "sha512-rfyGDBMtO8IOlk9hJN44EKz7vk6nt/PXByAumsptRdgsd+knokMlaWGYatrxKW2g/08WUbEkgKspvMxjJ0M1Tg==" + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/unimodules-permissions-interface/-/unimodules-permissions-interface-4.0.0.tgz", + "integrity": "sha512-bVZ6JQMO12WvAv6YqcHaPV5KekV7WH606eRiMJq5Qwm2z9yGSM+KaOxOH/n2LVcYckForphsCLf58OGVUtM65Q==" }, "unimodules-sensors-interface": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/unimodules-sensors-interface/-/unimodules-sensors-interface-3.0.0.tgz", - "integrity": "sha512-1JJT/lqCfxHqUSJc3o6b0WUply/lFOJjcuzN0QcAfmdAW8d+lEXA7BJ7DV/Nn/OKpMlHriEyxkM+FoGoXKJJcg==" + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/unimodules-sensors-interface/-/unimodules-sensors-interface-4.0.0.tgz", + "integrity": "sha512-O7l+N2DLwviTc6gz/ptV7a930Sdo30AvzQLEJPHfqj4e9fCdbrHNrcPqiq0CLqHYYIsdpSDpC6wCWmepLaAgJQ==" }, "unimodules-task-manager-interface": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/unimodules-task-manager-interface/-/unimodules-task-manager-interface-3.0.0.tgz", - "integrity": "sha512-og4UiUOxc7PqT8uQQqXY+pOBvdS204xmgyUG2AjM2L3kVsw/6WH4pIW084WG8/e9M5SLsSXdrjecIUBQ/zLf8w==" + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/unimodules-task-manager-interface/-/unimodules-task-manager-interface-4.0.0.tgz", + "integrity": "sha512-c7x5hgEtT+oIVd37TBn2jxlTw2+Bgb55XZ2Md0AV5NCjeRlKw2bIBPwUvSdI1iAziSQOIGOImNaaIUo3L3zW3w==" }, "union-value": { "version": "1.0.1", diff --git a/mobile/package.json b/mobile/package.json index 77f4ecb8e..0451ce45d 100644 --- a/mobile/package.json +++ b/mobile/package.json @@ -5,6 +5,7 @@ "start": "react-native start" }, "dependencies": { + "expo-constants": "^7.0.0", "expo-font": "^6.0.1", "expo-keep-awake": "^6.0.0", "expo-local-authentication": "^6.0.0", @@ -28,7 +29,7 @@ "react-native-picker-select": "^6.3.2", "react-native-share": "^1.2.1", "react-native-svg": "^9.6.2", - "react-native-unimodules": "^0.5.4", + "react-native-unimodules": "^0.7.0-rc.1", "react-native-v8": "^0.59.10-patch.1", "react-navigation": "^3.11.1" }, diff --git a/src/view/pin-mobile.js b/src/view/pin-mobile.js index a049d1def..df3b0b7fc 100644 --- a/src/view/pin-mobile.js +++ b/src/view/pin-mobile.js @@ -1,5 +1,5 @@ import React from 'react'; -import { View, StyleSheet } from 'react-native'; +import { NativeModules, View, StyleSheet } from 'react-native'; import { observer } from 'mobx-react'; import PropTypes from 'prop-types'; import Background from '../component/background'; @@ -37,9 +37,12 @@ class PinView extends React.Component { render() { const { store, auth } = this.props; - const unlockText = this.props.auth.checkFingerprintHardwareAndEnrollment() - ? 'Unlock with your pin or fingerprint' - : 'Unlock with your pin'; + const FingerprintDialog = NativeModules.FingerprintDialog; + const hasActiveFingerprint = this.props.auth.checkFingerprintHardwareAndEnrollment(); + + if (hasActiveFingerprint) { + FingerprintDialog.getBiometricPrompt(); + } return ( @@ -50,7 +53,7 @@ class PinView extends React.Component { - {unlockText} + Unlock with your pin