1import { ExpoConfig } from '@expo/config-types';
2
3import {
4  addMetaDataItemToMainApplication,
5  addUsesLibraryItemToMainApplication,
6  AndroidManifest,
7  getMainApplicationOrThrow,
8  removeMetaDataItemFromMainApplication,
9  removeUsesLibraryItemFromMainApplication,
10} from './Manifest';
11import { createAndroidManifestPlugin } from '../plugins/android-plugins';
12
13const META_API_KEY = 'com.google.android.geo.API_KEY';
14const LIB_HTTP = 'org.apache.http.legacy';
15
16export const withGoogleMapsApiKey = createAndroidManifestPlugin(
17  setGoogleMapsApiKey,
18  'withGoogleMapsApiKey'
19);
20
21export function getGoogleMapsApiKey(config: Pick<ExpoConfig, 'android'>) {
22  return config.android?.config?.googleMaps?.apiKey ?? null;
23}
24
25export function setGoogleMapsApiKey(
26  config: Pick<ExpoConfig, 'android'>,
27  androidManifest: AndroidManifest
28) {
29  const apiKey = getGoogleMapsApiKey(config);
30  const mainApplication = getMainApplicationOrThrow(androidManifest);
31
32  if (apiKey) {
33    // If the item exists, add it back
34    addMetaDataItemToMainApplication(mainApplication, META_API_KEY, apiKey);
35    addUsesLibraryItemToMainApplication(mainApplication, {
36      name: LIB_HTTP,
37      required: false,
38    });
39  } else {
40    // Remove any existing item
41    removeMetaDataItemFromMainApplication(mainApplication, META_API_KEY);
42    removeUsesLibraryItemFromMainApplication(mainApplication, LIB_HTTP);
43  }
44
45  return androidManifest;
46}
47