diff --git a/plugin/src/withRadarAndroid.ts b/plugin/src/withRadarAndroid.ts index 994c0f81..c3638125 100644 --- a/plugin/src/withRadarAndroid.ts +++ b/plugin/src/withRadarAndroid.ts @@ -1,20 +1,31 @@ import { ExpoConfig } from "expo/config"; import { + withAndroidManifest, withAppBuildGradle, AndroidConfig, + WarningAggregator, withDangerousMod, } from "expo/config-plugins"; import fs from "fs"; import path from "path"; +const { addPermission } = AndroidConfig.Permissions; + import { RadarPluginProps } from "./types"; export const withRadarAndroid = ( config: ExpoConfig, args: RadarPluginProps ) => { - config = withAndroidPermissions(config, args); + config = withAndroidManifest(config, async (config) => { + config.modResults = await setCustomConfigAsync( + config, + config.modResults, + args + ); + return config; + }); config = withDangerousMod(config, [ "android", @@ -82,25 +93,61 @@ export const withRadarAndroid = ( }); }; -function withAndroidPermissions( +async function setCustomConfigAsync( config: any, + androidManifest: AndroidConfig.Manifest.AndroidManifest, args: RadarPluginProps -): ExpoConfig { - const isAndroidBackgroundLocationEnabled = !!args.androidBackgroundPermission; - const enableAndroidForegroundService = !!args.androidForegroundService; - const enableAndroidActivityRecognition = !!args.androidActivityRecognition; - return AndroidConfig.Permissions.withPermissions( - config, - [ - isAndroidBackgroundLocationEnabled && - "android.permission.ACCESS_BACKGROUND_LOCATION", - enableAndroidForegroundService && "android.permission.FOREGROUND_SERVICE", - enableAndroidForegroundService && - "android.permission.FOREGROUND_SERVICE_LOCATION", - enableAndroidActivityRecognition && - "android.permission.ACTIVITY_RECOGNITION", - ].filter(Boolean) as string[] - ); +): Promise { + if (!androidManifest.manifest["uses-permission"]) { + androidManifest.manifest["uses-permission"] = []; + } + // Add permissions + if ( + args.androidFineLocationPermission && + !androidManifest.manifest["uses-permission"].some( + (e) => + e["$"]["android:name"] === "android.permission.ACCESS_FINE_LOCATION" + ) + ) { + addPermission(androidManifest, "android.permission.ACCESS_FINE_LOCATION"); + } + if ( + args.androidBackgroundPermission && + !androidManifest.manifest["uses-permission"].some( + (e) => + e["$"]["android:name"] === + "android.permission.ACCESS_BACKGROUND_LOCATION" + ) + ) { + addPermission( + androidManifest, + "android.permission.ACCESS_BACKGROUND_LOCATION" + ); + } + if ( + !androidManifest.manifest["uses-permission"].some( + (e) => + e["$"]["android:name"] === "android.permission.ACCESS_COARSE_LOCATION" + ) + ) { + addPermission(androidManifest, "android.permission.ACCESS_COARSE_LOCATION"); + } + if ( + !androidManifest.manifest["uses-permission"].some( + (e) => e["$"]["android:name"] === "android.permission.FOREGROUND_SERVICE" + ) + ) { + addPermission(androidManifest, "android.permission.FOREGROUND_SERVICE"); + } + if ( + !androidManifest.manifest["uses-permission"].some( + (e) => e["$"]["android:name"] === "android.permission.ACTIVITY_RECOGNITION" + ) + ) { + addPermission(androidManifest, "android.permission.ACTIVITY_RECOGNITION"); + } + + return androidManifest; } function modifyAppBuildGradle(buildGradle: string, androidFraud: boolean) { @@ -121,11 +168,9 @@ function modifyAppBuildGradle(buildGradle: string, androidFraud: boolean) { const pattern = /^dependencies {/m; if (!buildGradle.match(pattern)) { - throw new Error( - `Failed to find react.gradle script in android/app/build.gradle. - This is required for react-native-radar to function properly. - Please ensure your android/app/build.gradle includes the react.gradle script. - Current build.gradle content: ${buildGradle}` + WarningAggregator.addWarningAndroid( + "react-native-radar", + "Could not find react.gradle script in android/app/build.gradle." ); }