From fb0a941730577ae04aa4e3dea58526e3466b8914 Mon Sep 17 00:00:00 2001 From: Vijay <94220135+vijay151096@users.noreply.github.com> Date: Tue, 14 Nov 2023 10:28:55 +0530 Subject: [PATCH] fix(inji-522): enable the location service before initiating the vc sharing. Signed-off-by: Vijay <94220135+vijay151096@users.noreply.github.com> --- android/app/build.gradle | 12 +- android/settings.gradle | 5 +- machines/bleShare/scan/scanMachine.ts | 41 ++- machines/bleShare/scan/scanMachine.typegen.ts | 236 ------------------ package-lock.json | 15 ++ package.json | 3 +- shared/location.ts | 33 ++- 7 files changed, 87 insertions(+), 258 deletions(-) diff --git a/android/app/build.gradle b/android/app/build.gradle index 2b2d0d8a0b..e80d145f8f 100644 --- a/android/app/build.gradle +++ b/android/app/build.gradle @@ -1,12 +1,10 @@ -plugins { +plugins { id 'com.gladed.androidgitversion' version '0.4.14' } apply plugin: "com.android.application" apply plugin: "com.facebook.react" -import com.android.build.OutputFile - react { /* Folders */ // The root of your project, i.e. where "package.json" lives. Default is '..' @@ -104,7 +102,7 @@ android { namespace 'io.mosip.residentapp' - + namespace 'io.mosip.residentapp' defaultConfig { @@ -130,7 +128,7 @@ android { include "armeabi-v7a", "x86", "arm64-v8a", "x86_64" } } - + signingConfigs { release { def keystore = file('release.keystore') @@ -232,7 +230,7 @@ dependencies { implementation 'com.facebook.fresco:animated-webp:2.0.0' } } - + compileOnly project(':react-native-android-location-services-dialog-box') implementation "androidx.swiperefreshlayout:swiperefreshlayout:1.0.0" debugImplementation("com.facebook.flipper:flipper:${FLIPPER_VERSION}") debugImplementation("com.facebook.flipper:flipper-network-plugin:${FLIPPER_VERSION}") { @@ -252,4 +250,4 @@ dependencies { } apply from: file("../../node_modules/@react-native-community/cli-platform-android/native_modules.gradle"); applyNativeModulesAppBuildGradle(project) -apply from: "./eas-build.gradle" \ No newline at end of file +apply from: "./eas-build.gradle" diff --git a/android/settings.gradle b/android/settings.gradle index cf75b94c96..38e206ee8b 100644 --- a/android/settings.gradle +++ b/android/settings.gradle @@ -3,6 +3,7 @@ rootProject.name = 'Inji' apply from: file("../node_modules/@react-native-community/cli-platform-android/native_modules.gradle"); applyNativeModulesSettingsGradle(settings) include ':app' includeBuild('../node_modules/react-native-gradle-plugin') - +include ':react-native-android-location-services-dialog-box' +project(':react-native-android-location-services-dialog-box').projectDir = new File(rootProject.projectDir, '../node_modules/react-native-android-location-services-dialog-box/android') apply from: new File(["node", "--print", "require.resolve('expo/package.json')"].execute(null, rootDir).text.trim(), "../scripts/autolinking.gradle") -useExpoModules() \ No newline at end of file +useExpoModules() diff --git a/machines/bleShare/scan/scanMachine.ts b/machines/bleShare/scan/scanMachine.ts index 43cb24c4cf..b2fefef394 100644 --- a/machines/bleShare/scan/scanMachine.ts +++ b/machines/bleShare/scan/scanMachine.ts @@ -22,13 +22,14 @@ import {subscribe} from '../../../shared/openIdBLE/walletEventHandler'; import { check, checkMultiple, - PermissionStatus, PERMISSIONS, + PermissionStatus, requestMultiple, RESULTS, } from 'react-native-permissions'; import { checkLocationPermissionStatus, + checkLocationService, requestLocationPermission, } from '../../../shared/location'; import {CameraCapturedPicture} from 'expo-camera'; @@ -40,14 +41,14 @@ import {BLEError} from '../types'; import Storage from '../../../shared/storage'; import {VCMetadata} from '../../../shared/VCMetadata'; import { - getStartEventData, getEndEventData, - sendStartEvent, - sendEndEvent, - sendImpressionEvent, + getErrorEventData, getImpressionEventData, + getStartEventData, + sendEndEvent, sendErrorEvent, - getErrorEventData, + sendImpressionEvent, + sendStartEvent, } from '../../../shared/telemetry/TelemetryUtils'; import {TelemetryConstants} from '../../../shared/telemetry/TelemetryConstants'; @@ -679,8 +680,21 @@ export const scanMachine = }, }, checkingLocationService: { - initial: 'checkingPermissionStatus', + initial: 'checkLocationService', states: { + checkLocationService: { + invoke: { + src: 'checkLocationStatus', + }, + on: { + LOCATION_ENABLED: { + target: 'checkingPermissionStatus', + }, + LOCATION_DISABLED: { + target: 'disabled', + }, + }, + }, checkingPermissionStatus: { invoke: { src: 'checkLocationPermission', @@ -717,6 +731,13 @@ export const scanMachine = }, }, }, + disabled: { + on: { + LOCATION_REQUEST: { + target: 'checkLocationService', + }, + }, + }, }, }, }, @@ -1096,6 +1117,12 @@ export const scanMachine = () => callback(model.events.LOCATION_DISABLED()), ); }, + checkLocationStatus: () => callback => { + return checkLocationService( + () => callback(model.events.LOCATION_ENABLED()), + () => callback(model.events.LOCATION_DISABLED()), + ); + }, startConnection: context => callback => { wallet.startConnection(context.openId4VpUri); diff --git a/machines/bleShare/scan/scanMachine.typegen.ts b/machines/bleShare/scan/scanMachine.typegen.ts index 08447ddf16..e69de29bb2 100644 --- a/machines/bleShare/scan/scanMachine.typegen.ts +++ b/machines/bleShare/scan/scanMachine.typegen.ts @@ -1,236 +0,0 @@ -// This file was automatically generated. Edits will be overwritten - -export interface Typegen0 { - '@@xstate/typegen': true; - internalEvents: { - '': {type: ''}; - 'done.invoke.QrLogin': { - type: 'done.invoke.QrLogin'; - data: unknown; - __tip: 'See the XState TS docs to learn how to strongly type this.'; - }; - 'done.invoke.scan.checkStorage:invocation[0]': { - type: 'done.invoke.scan.checkStorage:invocation[0]'; - data: unknown; - __tip: 'See the XState TS docs to learn how to strongly type this.'; - }; - 'done.invoke.scan.reviewing.creatingVp:invocation[0]': { - type: 'done.invoke.scan.reviewing.creatingVp:invocation[0]'; - data: unknown; - __tip: 'See the XState TS docs to learn how to strongly type this.'; - }; - 'xstate.after(CONNECTION_TIMEOUT)#scan.connecting.inProgress': { - type: 'xstate.after(CONNECTION_TIMEOUT)#scan.connecting.inProgress'; - }; - 'xstate.after(DESTROY_TIMEOUT)#scan.clearingConnection': { - type: 'xstate.after(DESTROY_TIMEOUT)#scan.clearingConnection'; - }; - 'xstate.after(SHARING_TIMEOUT)#scan.reviewing.sendingVc.inProgress': { - type: 'xstate.after(SHARING_TIMEOUT)#scan.reviewing.sendingVc.inProgress'; - }; - 'xstate.init': {type: 'xstate.init'}; - 'xstate.stop': {type: 'xstate.stop'}; - }; - invokeSrcNameMap: { - checkBluetoothPermission: 'done.invoke.scan.checkBluetoothPermission.checking:invocation[0]'; - checkBluetoothState: - | 'done.invoke.scan.checkBluetoothState.checking:invocation[0]' - | 'done.invoke.scan.recheckBluetoothState.checking:invocation[0]'; - checkLocationPermission: 'done.invoke.scan.checkingLocationService.checkingPermissionStatus:invocation[0]'; - checkNearByDevicesPermission: 'done.invoke.scan.checkNearbyDevicesPermission.checking:invocation[0]'; - checkStorageAvailability: 'done.invoke.scan.checkStorage:invocation[0]'; - createVp: 'done.invoke.scan.reviewing.creatingVp:invocation[0]'; - disconnect: - | 'done.invoke.scan.clearingConnection:invocation[0]' - | 'done.invoke.scan.disconnectDevice:invocation[0]'; - monitorConnection: 'done.invoke.scan:invocation[0]'; - requestBluetooth: 'done.invoke.scan.checkBluetoothState.requesting:invocation[0]'; - requestNearByDevicesPermission: 'done.invoke.scan.checkNearbyDevicesPermission.requesting:invocation[0]'; - requestToEnableLocationPermission: 'done.invoke.scan.checkingLocationService.requestToEnableLocation:invocation[0]'; - sendVc: 'done.invoke.scan.reviewing.sendingVc:invocation[0]'; - startConnection: 'done.invoke.scan.connecting:invocation[0]'; - }; - missingImplementations: { - actions: never; - delays: never; - guards: never; - services: never; - }; - eventsCausingActions: { - clearCreatedVp: - | '' - | 'BLE_ERROR' - | 'DISCONNECT' - | 'DISMISS' - | 'RESET' - | 'SCREEN_BLUR' - | 'SCREEN_FOCUS' - | 'xstate.stop'; - clearReason: - | '' - | 'BLE_ERROR' - | 'DISCONNECT' - | 'DISMISS' - | 'RESET' - | 'SCREEN_BLUR' - | 'SCREEN_FOCUS' - | 'xstate.stop'; - clearUri: - | 'DISCONNECT' - | 'DISMISS' - | 'xstate.after(DESTROY_TIMEOUT)#scan.clearingConnection'; - logFailedVerification: 'FACE_INVALID'; - logShared: 'VC_ACCEPTED'; - openAppPermission: 'GOTO_SETTINGS' | 'LOCATION_REQUEST'; - openBluetoothSettings: 'GOTO_SETTINGS'; - registerLoggers: - | 'DISCONNECT' - | 'DISMISS' - | 'xstate.after(DESTROY_TIMEOUT)#scan.clearingConnection'; - removeLoggers: - | 'DISCONNECT' - | 'DISMISS' - | 'SCREEN_BLUR' - | 'xstate.after(DESTROY_TIMEOUT)#scan.clearingConnection' - | 'xstate.init'; - resetShouldVerifyPresence: 'CANCEL' | 'CONNECTED' | 'DISMISS' | 'RETRY'; - sendScanData: 'SCAN'; - setBleError: 'BLE_ERROR'; - setChildRef: - | 'DISCONNECT' - | 'DISMISS' - | 'xstate.after(DESTROY_TIMEOUT)#scan.clearingConnection'; - setCreatedVp: 'done.invoke.scan.reviewing.creatingVp:invocation[0]'; - setLinkCode: 'SCAN'; - setPromptHint: 'CANCEL' | 'RETRY'; - setReadyForBluetoothStateCheck: 'BLUETOOTH_PERMISSION_ENABLED'; - setReason: 'UPDATE_REASON'; - setReceiverInfo: 'CONNECTED'; - setSelectedVc: 'SELECT_VC'; - setSenderInfo: 'CONNECTED'; - setShareLogTypeUnverified: 'ACCEPT_REQUEST'; - setShareLogTypeVerified: 'FACE_VALID'; - setStayInProgress: - | 'STAY_IN_PROGRESS' - | 'xstate.after(CONNECTION_TIMEOUT)#scan.connecting.inProgress' - | 'xstate.after(SHARING_TIMEOUT)#scan.reviewing.sendingVc.inProgress'; - setUri: 'SCAN'; - storeLoginItem: 'done.invoke.QrLogin'; - storingActivityLog: 'STORE_RESPONSE'; - toggleShouldVerifyPresence: 'TOGGLE_USER_CONSENT'; - }; - eventsCausingDelays: { - CONNECTION_TIMEOUT: 'SCAN'; - DESTROY_TIMEOUT: '' | 'DISMISS' | 'LOCATION_ENABLED'; - SHARING_TIMEOUT: - | 'ACCEPT_REQUEST' - | 'FACE_VALID' - | 'done.invoke.scan.reviewing.creatingVp:invocation[0]'; - }; - eventsCausingGuards: { - isIOS: 'BLUETOOTH_STATE_DISABLED' | 'START_PERMISSION_CHECK'; - isMinimumStorageRequiredForAuditEntryReached: 'done.invoke.scan.checkStorage:invocation[0]'; - isOpenIdQr: 'SCAN'; - isQrLogin: 'SCAN'; - uptoAndroid11: '' | 'START_PERMISSION_CHECK'; - }; - eventsCausingServices: { - QrLogin: 'SCAN'; - checkBluetoothPermission: - | '' - | 'BLUETOOTH_STATE_DISABLED' - | 'NEARBY_ENABLED' - | 'START_PERMISSION_CHECK'; - checkBluetoothState: '' | 'APP_ACTIVE'; - checkLocationPermission: '' | 'APP_ACTIVE'; - checkNearByDevicesPermission: 'APP_ACTIVE' | 'START_PERMISSION_CHECK'; - checkStorageAvailability: 'RESET' | 'SCREEN_FOCUS'; - createVp: never; - disconnect: '' | 'DISMISS' | 'LOCATION_ENABLED' | 'SCREEN_BLUR'; - monitorConnection: 'DISMISS' | 'SCREEN_BLUR' | 'xstate.init'; - requestBluetooth: 'BLUETOOTH_STATE_DISABLED'; - requestNearByDevicesPermission: 'NEARBY_DISABLED'; - requestToEnableLocationPermission: 'LOCATION_DISABLED'; - sendVc: - | 'ACCEPT_REQUEST' - | 'FACE_VALID' - | 'done.invoke.scan.reviewing.creatingVp:invocation[0]'; - startConnection: 'SCAN'; - }; - matchesStates: - | 'bluetoothDenied' - | 'bluetoothPermissionDenied' - | 'checkBluetoothPermission' - | 'checkBluetoothPermission.checking' - | 'checkBluetoothPermission.enabled' - | 'checkBluetoothState' - | 'checkBluetoothState.checking' - | 'checkBluetoothState.enabled' - | 'checkBluetoothState.requesting' - | 'checkNearbyDevicesPermission' - | 'checkNearbyDevicesPermission.checking' - | 'checkNearbyDevicesPermission.enabled' - | 'checkNearbyDevicesPermission.requesting' - | 'checkStorage' - | 'checkingLocationService' - | 'checkingLocationService.checkingPermissionStatus' - | 'checkingLocationService.denied' - | 'checkingLocationService.requestToEnableLocation' - | 'clearingConnection' - | 'connecting' - | 'connecting.inProgress' - | 'connecting.timeout' - | 'disconnectDevice' - | 'disconnected' - | 'findingConnection' - | 'handlingBleError' - | 'inactive' - | 'invalid' - | 'nearByDevicesPermissionDenied' - | 'recheckBluetoothState' - | 'recheckBluetoothState.checking' - | 'recheckBluetoothState.enabled' - | 'restrictSharingVc' - | 'reviewing' - | 'reviewing.accepted' - | 'reviewing.cancelling' - | 'reviewing.creatingVp' - | 'reviewing.invalidIdentity' - | 'reviewing.navigatingToHome' - | 'reviewing.rejected' - | 'reviewing.selectingVc' - | 'reviewing.sendingVc' - | 'reviewing.sendingVc.inProgress' - | 'reviewing.sendingVc.sent' - | 'reviewing.sendingVc.timeout' - | 'reviewing.verifyingIdentity' - | 'showQrLogin' - | 'showQrLogin.idle' - | 'showQrLogin.navigatingToHistory' - | 'showQrLogin.storing' - | 'startPermissionCheck' - | { - checkBluetoothPermission?: 'checking' | 'enabled'; - checkBluetoothState?: 'checking' | 'enabled' | 'requesting'; - checkNearbyDevicesPermission?: 'checking' | 'enabled' | 'requesting'; - checkingLocationService?: - | 'checkingPermissionStatus' - | 'denied' - | 'requestToEnableLocation'; - connecting?: 'inProgress' | 'timeout'; - recheckBluetoothState?: 'checking' | 'enabled'; - reviewing?: - | 'accepted' - | 'cancelling' - | 'creatingVp' - | 'invalidIdentity' - | 'navigatingToHome' - | 'rejected' - | 'selectingVc' - | 'sendingVc' - | 'verifyingIdentity' - | {sendingVc?: 'inProgress' | 'sent' | 'timeout'}; - showQrLogin?: 'idle' | 'navigatingToHistory' | 'storing'; - }; - tags: never; -} diff --git a/package-lock.json b/package-lock.json index aa67ca4246..88aa85b959 100644 --- a/package-lock.json +++ b/package-lock.json @@ -48,6 +48,7 @@ "react": "18.2.0", "react-i18next": "^11.16.6", "react-native": "0.71.8", + "react-native-android-location-services-dialog-box": "^2.8.2", "react-native-app-auth": "^7.0.0", "react-native-app-intro-slider": "^4.0.4", "react-native-argon2": "^2.0.1", @@ -25761,6 +25762,14 @@ "react": "18.2.0" } }, + "node_modules/react-native-android-location-services-dialog-box": { + "version": "2.8.2", + "resolved": "https://registry.npmjs.org/react-native-android-location-services-dialog-box/-/react-native-android-location-services-dialog-box-2.8.2.tgz", + "integrity": "sha512-zBTi0xJQoF6GdImRhXOCXezYuALlPgbctqG3eOrZu63hdrlvTBhqATkb6DB5JM9kpcMbX1skMIOI3m71zKGsPA==", + "peerDependencies": { + "react-native": ">= 0.56.0" + } + }, "node_modules/react-native-app-auth": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/react-native-app-auth/-/react-native-app-auth-7.0.0.tgz", @@ -49740,6 +49749,12 @@ } } }, + "react-native-android-location-services-dialog-box": { + "version": "2.8.2", + "resolved": "https://registry.npmjs.org/react-native-android-location-services-dialog-box/-/react-native-android-location-services-dialog-box-2.8.2.tgz", + "integrity": "sha512-zBTi0xJQoF6GdImRhXOCXezYuALlPgbctqG3eOrZu63hdrlvTBhqATkb6DB5JM9kpcMbX1skMIOI3m71zKGsPA==", + "requires": {} + }, "react-native-app-auth": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/react-native-app-auth/-/react-native-app-auth-7.0.0.tgz", diff --git a/package.json b/package.json index c89e9029ce..57c5331f7b 100644 --- a/package.json +++ b/package.json @@ -50,6 +50,7 @@ "react": "18.2.0", "react-i18next": "^11.16.6", "react-native": "0.71.8", + "react-native-android-location-services-dialog-box": "^2.8.2", "react-native-app-auth": "^7.0.0", "react-native-app-intro-slider": "^4.0.4", "react-native-argon2": "^2.0.1", @@ -82,7 +83,7 @@ "react-native-vector-icons": "^10.0.0", "short-unique-id": "^4.4.4", "simple-pem2jwk": "^0.2.4", - "telemetry-sdk": "git://github.com/mosip/sunbird-telemetry-sdk.git#f762be5732ee552c0c70bdd540aa4e2701554c71", + "telemetry-sdk": "git://github.com/mosip/sunbird-telemetry-sdk.git#f762be5732ee552c0c70bdd540aa4e2701554c71", "xstate": "^4.35.0" }, "devDependencies": { diff --git a/shared/location.ts b/shared/location.ts index fb3b8090bc..48f7afed87 100644 --- a/shared/location.ts +++ b/shared/location.ts @@ -1,5 +1,5 @@ import RNLocation from 'react-native-location'; - +import LocationServicesDialogBox from 'react-native-android-location-services-dialog-box'; // Initialize RNLocation RNLocation.configure({ distanceFilter: 5.0, // Example configuration, adjust as needed @@ -7,26 +7,26 @@ RNLocation.configure({ export function checkLocationPermissionStatus( onEnabled: () => void, - onDisabled: () => void + onDisabled: () => void, ) { RNLocation.checkPermission({ android: { detail: 'fine', }, }) - .then((granted) => { + .then(granted => { if (granted) { return onEnabled(); } else { return onDisabled(); } }) - .catch((err) => console.log('Error getting location:', err)); + .catch(err => console.log('Error getting location:', err)); } export async function requestLocationPermission( onEnabled: () => void, - onDisabled: () => void + onDisabled: () => void, ) { try { const granted = await RNLocation.requestPermission({ @@ -43,3 +43,26 @@ export async function requestLocationPermission( console.log(error); } } + +export async function checkLocationService( + onEnabled: () => void, + onDisabled: () => void, +) { + try { + await LocationServicesDialogBox.checkLocationServicesIsEnabled({ + message: + "