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