1import { 2 ConfigPlugin, 3 createRunOncePlugin, 4 withAndroidManifest, 5 withPlugins, 6 AndroidConfig, 7} from '@expo/config-plugins'; 8 9const pkg = require('expo-image-picker/package.json'); 10 11const CAMERA_USAGE = 'Allow $(PRODUCT_NAME) to access your camera'; 12const MICROPHONE_USAGE = 'Allow $(PRODUCT_NAME) to access your microphone'; 13const READ_PHOTOS_USAGE = 'Allow $(PRODUCT_NAME) to access your photos'; 14 15export function setImagePickerManifestActivity( 16 androidManifest: AndroidConfig.Manifest.AndroidManifest 17): AndroidConfig.Manifest.AndroidManifest { 18 const app = AndroidConfig.Manifest.getMainApplicationOrThrow(androidManifest); 19 if (!app.activity) { 20 app.activity = []; 21 } 22 if (!app.activity.find(({ $ }) => $['android:name'] === 'com.canhub.cropper.CropImageActivity')) { 23 app.activity.push({ 24 $: { 25 'android:name': 'com.canhub.cropper.CropImageActivity', 26 'android:theme': '@style/Base.Theme.AppCompat', 27 }, 28 }); 29 } 30 return androidManifest; 31} 32 33const withImagePickerManifestActivity: ConfigPlugin = (config) => { 34 // This plugin has no ability to remove the activity that it adds. 35 return withAndroidManifest(config, async (config) => { 36 config.modResults = setImagePickerManifestActivity(config.modResults); 37 return config; 38 }); 39}; 40 41const withImagePicker: ConfigPlugin< 42 { 43 photosPermission?: string; 44 cameraPermission?: string; 45 microphonePermission?: string; 46 } | void 47> = (config, { photosPermission, cameraPermission, microphonePermission } = {}) => { 48 if (!config.ios) config.ios = {}; 49 if (!config.ios.infoPlist) config.ios.infoPlist = {}; 50 config.ios.infoPlist.NSPhotoLibraryUsageDescription = 51 photosPermission || config.ios.infoPlist.NSPhotoLibraryUsageDescription || READ_PHOTOS_USAGE; 52 config.ios.infoPlist.NSCameraUsageDescription = 53 cameraPermission || config.ios.infoPlist.NSCameraUsageDescription || CAMERA_USAGE; 54 config.ios.infoPlist.NSMicrophoneUsageDescription = 55 microphonePermission || config.ios.infoPlist.NSMicrophoneUsageDescription || MICROPHONE_USAGE; 56 57 return withPlugins(config, [ 58 [ 59 AndroidConfig.Permissions.withPermissions, 60 [ 61 'android.permission.CAMERA', 62 'android.permission.READ_EXTERNAL_STORAGE', 63 'android.permission.WRITE_EXTERNAL_STORAGE', 64 'android.permission.RECORD_AUDIO', 65 ], 66 ], 67 withImagePickerManifestActivity, 68 ]); 69}; 70 71export default createRunOncePlugin(withImagePicker, pkg.name, pkg.version); 72