react-native-ble-plx
Version:
React Native Bluetooth Low Energy library
90 lines (89 loc) • 4.2 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.withBLEAndroidManifest = void 0;
exports.addLocationPermissionToManifest = addLocationPermissionToManifest;
exports.addScanPermissionToManifest = addScanPermissionToManifest;
exports.addBLEHardwareFeatureToManifest = addBLEHardwareFeatureToManifest;
const config_plugins_1 = require("@expo/config-plugins");
const withBLEAndroidManifest = (config, { isBackgroundEnabled, neverForLocation }) => (0, config_plugins_1.withAndroidManifest)(config, config => {
config.modResults = addLocationPermissionToManifest(config.modResults, neverForLocation);
config.modResults = addScanPermissionToManifest(config.modResults, neverForLocation);
if (isBackgroundEnabled) {
config.modResults = addBLEHardwareFeatureToManifest(config.modResults);
}
return config;
});
exports.withBLEAndroidManifest = withBLEAndroidManifest;
/**
* Add location permissions
* - 'android.permission.ACCESS_COARSE_LOCATION' for Android SDK 28 (Android 9) and lower
* - 'android.permission.ACCESS_FINE_LOCATION' for Android SDK 29 (Android 10) and higher.
* From Android SDK 31 (Android 12) it might not be required if BLE is not used for location.
*/
function addLocationPermissionToManifest(androidManifest, neverForLocationSinceSdk31) {
if (!Array.isArray(androidManifest.manifest['uses-permission-sdk-23'])) {
androidManifest.manifest['uses-permission-sdk-23'] = [];
}
const optMaxSdkVersion = neverForLocationSinceSdk31
? {
'android:maxSdkVersion': '30'
}
: {};
if (!androidManifest.manifest['uses-permission-sdk-23'].find(item => item.$['android:name'] === 'android.permission.ACCESS_COARSE_LOCATION')) {
androidManifest.manifest['uses-permission-sdk-23'].push({
$: {
'android:name': 'android.permission.ACCESS_COARSE_LOCATION',
...optMaxSdkVersion
}
});
}
if (!androidManifest.manifest['uses-permission-sdk-23'].find(item => item.$['android:name'] === 'android.permission.ACCESS_FINE_LOCATION')) {
androidManifest.manifest['uses-permission-sdk-23'].push({
$: {
'android:name': 'android.permission.ACCESS_FINE_LOCATION',
...optMaxSdkVersion
}
});
}
return androidManifest;
}
/**
* Add 'android.permission.BLUETOOTH_SCAN'.
* Required since Android SDK 31 (Android 12).
*/
function addScanPermissionToManifest(androidManifest, neverForLocation) {
if (!Array.isArray(androidManifest.manifest['uses-permission'])) {
androidManifest.manifest['uses-permission'] = [];
}
if (!androidManifest.manifest['uses-permission'].find(item => item.$['android:name'] === 'android.permission.BLUETOOTH_SCAN')) {
config_plugins_1.AndroidConfig.Manifest.ensureToolsAvailable(androidManifest);
androidManifest.manifest['uses-permission']?.push({
$: {
'android:name': 'android.permission.BLUETOOTH_SCAN',
...(neverForLocation
? {
'android:usesPermissionFlags': 'neverForLocation'
}
: {}),
'tools:targetApi': '31'
}
});
}
return androidManifest;
}
// Add this line if your application always requires BLE. More info can be found on: https://developer.android.com/guide/topics/connectivity/bluetooth-le.html#permissions
function addBLEHardwareFeatureToManifest(androidManifest) {
// Add `<uses-feature android:name="android.hardware.bluetooth_le" android:required="true"/>` to the AndroidManifest.xml
if (!Array.isArray(androidManifest.manifest['uses-feature'])) {
androidManifest.manifest['uses-feature'] = [];
}
if (!androidManifest.manifest['uses-feature'].find(item => item.$['android:name'] === 'android.hardware.bluetooth_le')) {
androidManifest.manifest['uses-feature']?.push({
$: {
'android:name': 'android.hardware.bluetooth_le',
'android:required': 'true'
}
});
}
return androidManifest;
}