Skip to content

Commit

Permalink
fix: set correct permissions for proximity drivers + set SDK to 31
Browse files Browse the repository at this point in the history
Signed-off-by: D4ryl00 <d4ryl00@gmail.com>
  • Loading branch information
D4ryl00 committed Jul 25, 2023
1 parent c3375ae commit bcaf254
Show file tree
Hide file tree
Showing 5 changed files with 98 additions and 18 deletions.
17 changes: 13 additions & 4 deletions js/android/app/src/main/AndroidManifest.xml
Original file line number Diff line number Diff line change
@@ -1,12 +1,21 @@
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="tech.berty.android">

<uses-permission android:name="android.permission.BLUETOOTH" />
<uses-permission android:name="android.permission.BLUETOOTH_ADMIN" />
<!-- Bluetooth permission API 30 or below -->
<uses-permission android:name="android.permission.BLUETOOTH" android:maxSdkVersion="30" />
<uses-permission android:name="android.permission.BLUETOOTH_ADMIN" android:maxSdkVersion="30" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" android:maxSdkVersion="30" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" android:maxSdkVersion="30" />

<!-- Bluetooth permission API 31 or above -->
<uses-permission android:name="android.permission.BLUETOOTH_SCAN"
android:usesPermissionFlags="neverForLocation"
android:minSdkVersion="31" />
<uses-permission android:name="android.permission.BLUETOOTH_ADVERTISE" android:minSdkVersion="31" />
<uses-permission android:name="android.permission.BLUETOOTH_CONNECT" android:minSdkVersion="31" />

<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<uses-permission android:name="android.permission.CHANGE_WIFI_STATE" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.CAMERA" />
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@
import android.content.Intent;
import android.content.IntentFilter;
import android.content.pm.PackageManager;
import android.os.Build;
import android.os.Handler;
import android.os.Looper;

Expand Down Expand Up @@ -114,9 +115,20 @@ private synchronized boolean initSystemBle() {
}

// Check BLE permissions
if (mAppContext.checkSelfPermission(Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
mLogger.e(TAG, "initSystemBle: BLE permissions not granted");
return false;
String[] permissions;
if (Build.VERSION.SDK_INT <= Build.VERSION_CODES.S) {
permissions = new String[]{Manifest.permission.ACCESS_FINE_LOCATION};
} else {
permissions = new String[]{Manifest.permission.BLUETOOTH_SCAN,
Manifest.permission.BLUETOOTH_ADVERTISE,
Manifest.permission.BLUETOOTH_CONNECT
};
}
for (int i = 0; i < permissions.length; i++) {
if (mAppContext.checkSelfPermission(permissions[i]) != PackageManager.PERMISSION_GRANTED) {
mLogger.e(TAG, String.format("initSystemBle: %s permissions not granted", permissions[i]));
return false;
}
}

// Initializes Bluetooth adapter.
Expand Down
8 changes: 4 additions & 4 deletions js/android/build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -8,14 +8,14 @@ buildscript {
minSdkVersion = 23
compileSdkVersion = 31
targetSdkVersion = 31
ndkVersion = "22.1.7171670"
ndkVersion = "23.1.7779620"
}
repositories {
google()
mavenCentral()
}
dependencies {
classpath('com.android.tools.build:gradle:4.1.0')
classpath('com.android.tools.build:gradle:4.2.2')
// NOTE: Do not place your application dependencies here; they belong
// in the individual module build.gradle files

Expand Down Expand Up @@ -62,8 +62,8 @@ allprojects {
project ->
if (project.hasProperty("android")) {
android {
compileSdkVersion = 29
buildToolsVersion = "29.0.2"
compileSdkVersion = 31
buildToolsVersion = "29.0.3"
}
}
}
Expand Down
2 changes: 1 addition & 1 deletion js/android/gradle/wrapper/gradle-wrapper.properties
Original file line number Diff line number Diff line change
Expand Up @@ -3,4 +3,4 @@ distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-6.7-all.zip
distributionUrl=https\://services.gradle.org/distributions/gradle-6.7.1-all.zip
71 changes: 65 additions & 6 deletions js/packages/utils/permissions/permissions.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2,11 +2,13 @@ import { Camera } from 'expo-camera'
import { Platform } from 'react-native'
import {
check,
checkMultiple,
checkNotifications,
Permission,
PERMISSIONS,
PermissionStatus,
request,
requestMultiple,
requestNotifications,
RESULTS,
} from 'react-native-permissions'
Expand All @@ -21,14 +23,9 @@ export enum PermissionType {
}

const permissionsByDevice: Record<
Exclude<PermissionType, PermissionType.notification>,
Exclude<PermissionType, PermissionType.notification | PermissionType.proximity>,
Permission | undefined
> = {
proximity: Platform.select({
ios: PERMISSIONS?.IOS?.BLUETOOTH_PERIPHERAL,
android: PERMISSIONS?.ANDROID?.ACCESS_FINE_LOCATION,
web: undefined,
}),
camera: Platform.select({
ios: PERMISSIONS?.IOS?.CAMERA,
android: PERMISSIONS?.ANDROID?.CAMERA,
Expand All @@ -51,6 +48,34 @@ const permissionsByDevice: Record<
}),
}

const checkProximity = async (): Promise<PermissionStatus> => {
if (Platform.OS === 'web') {
return 'denied'
}

if (Platform.OS === 'ios') {
return await check(PERMISSIONS?.IOS?.BLUETOOTH_PERIPHERAL)
}
// Android 11 or below
if (Platform.Version <= 30) {
return await check(PERMISSIONS?.ANDROID?.ACCESS_FINE_LOCATION)
}
// Android 12 or above
const statuses = await checkMultiple([
PERMISSIONS?.ANDROID?.BLUETOOTH_SCAN,
PERMISSIONS?.ANDROID?.BLUETOOTH_ADVERTISE,
PERMISSIONS?.ANDROID?.BLUETOOTH_CONNECT,
])
if (
statuses[PERMISSIONS?.ANDROID?.BLUETOOTH_SCAN] === 'granted' &&
statuses[PERMISSIONS?.ANDROID?.BLUETOOTH_ADVERTISE] === 'granted' &&
statuses[PERMISSIONS?.ANDROID?.BLUETOOTH_SCAN] === 'granted'
) {
return 'granted'
}
return 'denied'
}

export type Permissions = {
[Property in PermissionType]: PermissionStatus
}
Expand All @@ -59,6 +84,7 @@ export const getPermissions = async (): Promise<Permissions> => {
const ret: Permissions = Object.assign({}, defaultPermissionStatus)

ret[PermissionType.notification] = (await checkNotifications()).status
ret[PermissionType.proximity] = await checkProximity()

await Promise.all(
Object.entries(permissionsByDevice).map(async ([key, perm]) => {
Expand All @@ -80,6 +106,36 @@ export const getPermissions = async (): Promise<Permissions> => {
return Object.freeze(ret)
}

const requestProximity = async (): Promise<PermissionStatus> => {
if (Platform.OS === 'web') {
return RESULTS.DENIED
}

if (Platform.OS === 'ios') {
return await request(PERMISSIONS?.IOS?.BLUETOOTH_PERIPHERAL)
}

if (Platform.Version <= 30) {
// Android 11 or below
return await request(PERMISSIONS?.ANDROID?.ACCESS_FINE_LOCATION)
}

// Android 12 or above
const statuses = await requestMultiple([
PERMISSIONS?.ANDROID?.BLUETOOTH_SCAN,
PERMISSIONS?.ANDROID?.BLUETOOTH_ADVERTISE,
PERMISSIONS?.ANDROID?.BLUETOOTH_CONNECT,
])
if (
statuses[PERMISSIONS?.ANDROID?.BLUETOOTH_SCAN] === 'granted' &&
statuses[PERMISSIONS?.ANDROID?.BLUETOOTH_ADVERTISE] === 'granted' &&
statuses[PERMISSIONS?.ANDROID?.BLUETOOTH_SCAN] === 'granted'
) {
return RESULTS.GRANTED
}
return RESULTS.DENIED
}

export const acquirePermission = async (
permissionType: PermissionType,
): Promise<PermissionStatus> => {
Expand All @@ -91,6 +147,9 @@ export const acquirePermission = async (
? RESULTS.GRANTED
: RESULTS.DENIED
}
if (permissionType === PermissionType.proximity) {
return await requestProximity()
}
const permission = permissionsByDevice[permissionType]
if (!permission) {
console.warn(`unsupported permission ${permissionType} for device`)
Expand Down

0 comments on commit bcaf254

Please sign in to comment.