react-native-ble-manager
Version:
A BLE module for react native.
126 lines (125 loc) • 5.87 kB
JavaScript
Object.defineProperty(exports, "__esModule", { value: true });
exports.withBLEAndroidManifest = void 0;
exports.addLocationPermissionToManifest = addLocationPermissionToManifest;
exports.addScanPermissionToManifest = addScanPermissionToManifest;
exports.addConnectPermissionToManifest = addConnectPermissionToManifest;
exports.addCompanionPermissionToManifest = addCompanionPermissionToManifest;
exports.addBLEHardwareFeatureToManifest = addBLEHardwareFeatureToManifest;
const config_plugins_1 = require("expo/config-plugins");
const withBLEAndroidManifest = (config, { isBleRequired, neverForLocation, companionDeviceEnabled }) => {
return (0, config_plugins_1.withAndroidManifest)(config, config => {
config.modResults = addLocationPermissionToManifest(config.modResults, neverForLocation);
config.modResults = addScanPermissionToManifest(config.modResults, neverForLocation);
config.modResults = addConnectPermissionToManifest(config.modResults, neverForLocation);
if (companionDeviceEnabled) {
config.modResults = addCompanionPermissionToManifest(config.modResults);
}
if (isBleRequired) {
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;
}
function addConnectPermissionToManifest(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_CONNECT')) {
config_plugins_1.AndroidConfig.Manifest.ensureToolsAvailable(androidManifest);
androidManifest.manifest['uses-permission']?.push({
$: {
'android:name': 'android.permission.BLUETOOTH_CONNECT',
},
});
}
return androidManifest;
}
function addCompanionPermissionToManifest(androidManifest) {
if (!Array.isArray(androidManifest.manifest['uses-feature'])) {
androidManifest.manifest['uses-feature'] = [];
}
if (!androidManifest.manifest['uses-feature'].find(item => item.$['android:name'] === 'android.software.companion_device_setup')) {
androidManifest.manifest['uses-feature']?.push({
$: {
'android:name': 'android.software.companion_device_setup',
'android:required': 'true',
},
});
}
return androidManifest;
}
// Add this line if your application always requires BLE. More info can be found on: https://developer.android.com/develop/connectivity/bluetooth/bt-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;
}
;