{"version":3,"file":"Permissions.js","sourceRoot":"","sources":["../../src/android/Permissions.ts"],"names":[],"mappings":"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","sourcesContent":["import { ExpoConfig } from '@expo/config-types';\n\nimport { ConfigPlugin } from '../Plugin.types';\nimport { withAndroidManifest } from '../plugins/android-plugins';\nimport { AndroidManifest, ManifestUsesPermission } from './Manifest';\n\nconst USES_PERMISSION = 'uses-permission';\n\nexport const requiredPermissions = [\n  'android.permission.INTERNET',\n  'android.permission.ACCESS_NETWORK_STATE',\n  'android.permission.SYSTEM_ALERT_WINDOW',\n  'android.permission.WAKE_LOCK',\n  'com.google.android.c2dm.permission.RECEIVE',\n];\n\nexport const allPermissions = [\n  ...requiredPermissions,\n  'android.permission.ACCESS_WIFI_STATE',\n  'android.permission.ACCESS_COARSE_LOCATION',\n  'android.permission.ACCESS_FINE_LOCATION',\n  'android.permission.CAMERA',\n  'android.permission.MANAGE_DOCUMENTS',\n  'android.permission.READ_CONTACTS',\n  'android.permission.WRITE_CONTACTS',\n  'android.permission.READ_CALENDAR',\n  'android.permission.WRITE_CALENDAR',\n  'android.permission.READ_EXTERNAL_STORAGE',\n  'android.permission.READ_INTERNAL_STORAGE',\n  'android.permission.READ_PHONE_STATE',\n  'android.permission.RECORD_AUDIO',\n  'android.permission.USE_FINGERPRINT',\n  'android.permission.VIBRATE',\n  'android.permission.WRITE_EXTERNAL_STORAGE',\n  'android.permission.READ_SMS',\n  'com.anddoes.launcher.permission.UPDATE_COUNT',\n  'com.android.launcher.permission.INSTALL_SHORTCUT',\n  'com.google.android.gms.permission.ACTIVITY_RECOGNITION',\n  'com.google.android.providers.gsf.permission.READ_GSERVICES',\n  'com.htc.launcher.permission.READ_SETTINGS',\n  'com.htc.launcher.permission.UPDATE_SHORTCUT',\n  'com.majeur.launcher.permission.UPDATE_BADGE',\n  'com.sec.android.provider.badge.permission.READ',\n  'com.sec.android.provider.badge.permission.WRITE',\n  'com.sonyericsson.home.permission.BROADCAST_BADGE',\n];\n\nexport const withPermissions: ConfigPlugin<string[] | void> = (config, permissions) => {\n  if (Array.isArray(permissions)) {\n    permissions = permissions.filter(Boolean);\n    if (!config.android) config.android = {};\n    if (!config.android.permissions) config.android.permissions = [];\n    config.android.permissions = [\n      // @ts-ignore\n      ...new Set(config.android.permissions.concat(permissions)),\n    ];\n  }\n  return withAndroidManifest(config, async config => {\n    config.modResults = await setAndroidPermissions(config, config.modResults);\n    return config;\n  });\n};\n\nfunction prefixAndroidPermissionsIfNecessary(permissions: string[]): string[] {\n  return permissions.map(permission => {\n    if (!permission.includes('.')) {\n      return `android.permission.${permission}`;\n    }\n    return permission;\n  });\n}\n\nexport function getAndroidPermissions(config: Pick<ExpoConfig, 'android'>): string[] {\n  return config.android?.permissions ?? [];\n}\n\nexport function setAndroidPermissions(\n  config: Pick<ExpoConfig, 'android'>,\n  androidManifest: AndroidManifest\n) {\n  const permissions = getAndroidPermissions(config);\n  let permissionsToAdd = [];\n  if (permissions === null) {\n    // Use all Expo permissions\n    permissionsToAdd = allPermissions;\n  } else {\n    // Use minimum required, plus any specified in permissions array\n    const providedPermissions = prefixAndroidPermissionsIfNecessary(permissions);\n    permissionsToAdd = [...providedPermissions, ...requiredPermissions];\n  }\n\n  if (!androidManifest.manifest.hasOwnProperty('uses-permission')) {\n    androidManifest.manifest['uses-permission'] = [];\n  }\n  // manifest.manifest['uses-permission'] = [];\n\n  const manifestPermissions = androidManifest.manifest['uses-permission'] ?? [];\n\n  permissionsToAdd.forEach(permission => {\n    if (!isPermissionAlreadyRequested(permission, manifestPermissions)) {\n      addPermissionToManifest(permission, manifestPermissions);\n    }\n  });\n\n  return androidManifest;\n}\n\nexport function isPermissionAlreadyRequested(\n  permission: string,\n  manifestPermissions: ManifestUsesPermission[]\n): boolean {\n  return manifestPermissions.some(e => e.$['android:name'] === permission);\n}\n\nexport function addPermissionToManifest(\n  permission: string,\n  manifestPermissions: ManifestUsesPermission[]\n) {\n  manifestPermissions.push({ $: { 'android:name': permission } });\n  return manifestPermissions;\n}\n\nexport function removePermissions(androidManifest: AndroidManifest, permissionNames?: string[]) {\n  const targetNames = permissionNames ? permissionNames.map(ensurePermissionNameFormat) : null;\n  const permissions = androidManifest.manifest[USES_PERMISSION] || [];\n  const nextPermissions = [];\n  for (const attribute of permissions) {\n    if (targetNames) {\n      // @ts-ignore: name isn't part of the type\n      const value = attribute.$['android:name'] || attribute.$.name;\n      if (!targetNames.includes(value)) {\n        nextPermissions.push(attribute);\n      }\n    }\n  }\n\n  androidManifest.manifest[USES_PERMISSION] = nextPermissions;\n}\n\nexport function addPermission(androidManifest: AndroidManifest, permissionName: string): void {\n  const usesPermissions: ManifestUsesPermission[] = androidManifest.manifest[USES_PERMISSION] || [];\n  usesPermissions.push({\n    $: { 'android:name': permissionName },\n  });\n  androidManifest.manifest[USES_PERMISSION] = usesPermissions;\n}\n\nexport function ensurePermissions(\n  androidManifest: AndroidManifest,\n  permissionNames: string[]\n): { [permission: string]: boolean } {\n  const permissions = getPermissions(androidManifest);\n\n  const results: { [permission: string]: boolean } = {};\n  for (const permissionName of permissionNames) {\n    const targetName = ensurePermissionNameFormat(permissionName);\n    if (!permissions.includes(targetName)) {\n      addPermission(androidManifest, targetName);\n      results[permissionName] = true;\n    } else {\n      results[permissionName] = false;\n    }\n  }\n  return results;\n}\n\nexport function ensurePermission(\n  androidManifest: AndroidManifest,\n  permissionName: string\n): boolean {\n  const permissions = getPermissions(androidManifest);\n  const targetName = ensurePermissionNameFormat(permissionName);\n\n  if (!permissions.includes(targetName)) {\n    addPermission(androidManifest, targetName);\n    return true;\n  }\n  return false;\n}\n\nexport function ensurePermissionNameFormat(permissionName: string): string {\n  if (permissionName.includes('.')) {\n    const com = permissionName.split('.');\n    const name = com.pop() as string;\n    return [...com, name.toUpperCase()].join('.');\n  } else {\n    // If shorthand form like `WRITE_CONTACTS` is provided, expand it to `android.permission.WRITE_CONTACTS`.\n    return ensurePermissionNameFormat(`android.permission.${permissionName}`);\n  }\n}\n\nexport function getPermissions(androidManifest: AndroidManifest): string[] {\n  const usesPermissions: { [key: string]: any }[] = androidManifest.manifest[USES_PERMISSION] || [];\n  const permissions = usesPermissions.map(permissionObject => {\n    return permissionObject.$['android:name'] || permissionObject.$.name;\n  });\n  return permissions;\n}\n"]}