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