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 ( 23 !app.activity.find( 24 ({ $ }) => $['android:name'] === 'com.theartofdev.edmodo.cropper.CropImageActivity' 25 ) 26 ) { 27 app.activity.push({ 28 $: { 29 'android:name': 'com.theartofdev.edmodo.cropper.CropImageActivity', 30 'android:theme': '@style/Base.Theme.AppCompat', 31 }, 32 }); 33 } 34 return androidManifest; 35} 36 37const withImagePickerManifestActivity: ConfigPlugin = config => { 38 // This plugin has no ability to remove the activity that it adds. 39 return withAndroidManifest(config, async config => { 40 config.modResults = setImagePickerManifestActivity(config.modResults); 41 return config; 42 }); 43}; 44 45const withImagePicker: ConfigPlugin<{ 46 photosPermission?: string; 47 cameraPermission?: string; 48 microphonePermission?: string; 49} | void> = (config, { photosPermission, cameraPermission, microphonePermission } = {}) => { 50 if (!config.ios) config.ios = {}; 51 if (!config.ios.infoPlist) config.ios.infoPlist = {}; 52 config.ios.infoPlist.NSPhotoLibraryUsageDescription = 53 photosPermission || config.ios.infoPlist.NSPhotoLibraryUsageDescription || READ_PHOTOS_USAGE; 54 config.ios.infoPlist.NSCameraUsageDescription = 55 cameraPermission || config.ios.infoPlist.NSCameraUsageDescription || CAMERA_USAGE; 56 config.ios.infoPlist.NSMicrophoneUsageDescription = 57 microphonePermission || config.ios.infoPlist.NSMicrophoneUsageDescription || MICROPHONE_USAGE; 58 59 return withPlugins(config, [ 60 [ 61 AndroidConfig.Permissions.withPermissions, 62 [ 63 'android.permission.CAMERA', 64 'android.permission.READ_EXTERNAL_STORAGE', 65 'android.permission.WRITE_EXTERNAL_STORAGE', 66 'android.permission.RECORD_AUDIO', 67 ], 68 ], 69 withImagePickerManifestActivity, 70 ]); 71}; 72 73export default createRunOncePlugin(withImagePicker, pkg.name, pkg.version); 74