18a424bebSJames Ideimport { withMod } from './withMod';
2*f0d67e12SMateus Craveiroimport { ConfigPlugin, ExportedConfigWithProps, Mod } from '../Plugin.types';
3082815dcSEvan Baconimport { Manifest, Paths, Properties, Resources } from '../android';
4082815dcSEvan Bacon
5082815dcSEvan Bacontype OptionalPromise<T> = T | Promise<T>;
6082815dcSEvan Bacon
7*f0d67e12SMateus Craveirotype MutateDataAction<T> = (expo: ExportedConfigWithProps<T>, data: T) => OptionalPromise<T>;
8082815dcSEvan Bacon
9082815dcSEvan Bacon/**
10082815dcSEvan Bacon * Helper method for creating mods from existing config functions.
11082815dcSEvan Bacon *
12082815dcSEvan Bacon * @param action
13082815dcSEvan Bacon */
14082815dcSEvan Baconexport function createAndroidManifestPlugin(
15082815dcSEvan Bacon  action: MutateDataAction<Manifest.AndroidManifest>,
16082815dcSEvan Bacon  name: string
17082815dcSEvan Bacon): ConfigPlugin {
18082815dcSEvan Bacon  const withUnknown: ConfigPlugin = (config) =>
19082815dcSEvan Bacon    withAndroidManifest(config, async (config) => {
20082815dcSEvan Bacon      config.modResults = await action(config, config.modResults);
21082815dcSEvan Bacon      return config;
22082815dcSEvan Bacon    });
23082815dcSEvan Bacon  if (name) {
24082815dcSEvan Bacon    Object.defineProperty(withUnknown, 'name', {
25082815dcSEvan Bacon      value: name,
26082815dcSEvan Bacon    });
27082815dcSEvan Bacon  }
28082815dcSEvan Bacon  return withUnknown;
29082815dcSEvan Bacon}
30082815dcSEvan Bacon
31082815dcSEvan Baconexport function createStringsXmlPlugin(
32082815dcSEvan Bacon  action: MutateDataAction<Resources.ResourceXML>,
33082815dcSEvan Bacon  name: string
34082815dcSEvan Bacon): ConfigPlugin {
35082815dcSEvan Bacon  const withUnknown: ConfigPlugin = (config) =>
36082815dcSEvan Bacon    withStringsXml(config, async (config) => {
37082815dcSEvan Bacon      config.modResults = await action(config, config.modResults);
38082815dcSEvan Bacon      return config;
39082815dcSEvan Bacon    });
40082815dcSEvan Bacon  if (name) {
41082815dcSEvan Bacon    Object.defineProperty(withUnknown, 'name', {
42082815dcSEvan Bacon      value: name,
43082815dcSEvan Bacon    });
44082815dcSEvan Bacon  }
45082815dcSEvan Bacon  return withUnknown;
46082815dcSEvan Bacon}
47082815dcSEvan Bacon
48082815dcSEvan Bacon/**
49082815dcSEvan Bacon * Provides the AndroidManifest.xml for modification.
50082815dcSEvan Bacon *
51082815dcSEvan Bacon * @param config
52082815dcSEvan Bacon * @param action
53082815dcSEvan Bacon */
54082815dcSEvan Baconexport const withAndroidManifest: ConfigPlugin<Mod<Manifest.AndroidManifest>> = (
55082815dcSEvan Bacon  config,
56082815dcSEvan Bacon  action
57082815dcSEvan Bacon) => {
58082815dcSEvan Bacon  return withMod(config, {
59082815dcSEvan Bacon    platform: 'android',
60082815dcSEvan Bacon    mod: 'manifest',
61082815dcSEvan Bacon    action,
62082815dcSEvan Bacon  });
63082815dcSEvan Bacon};
64082815dcSEvan Bacon
65082815dcSEvan Bacon/**
66082815dcSEvan Bacon * Provides the strings.xml for modification.
67082815dcSEvan Bacon *
68082815dcSEvan Bacon * @param config
69082815dcSEvan Bacon * @param action
70082815dcSEvan Bacon */
71082815dcSEvan Baconexport const withStringsXml: ConfigPlugin<Mod<Resources.ResourceXML>> = (config, action) => {
72082815dcSEvan Bacon  return withMod(config, {
73082815dcSEvan Bacon    platform: 'android',
74082815dcSEvan Bacon    mod: 'strings',
75082815dcSEvan Bacon    action,
76082815dcSEvan Bacon  });
77082815dcSEvan Bacon};
78082815dcSEvan Bacon
79082815dcSEvan Bacon/**
80082815dcSEvan Bacon * Provides the `android/app/src/main/res/values/colors.xml` as JSON (parsed with [`xml2js`](https://www.npmjs.com/package/xml2js)).
81082815dcSEvan Bacon *
82082815dcSEvan Bacon * @param config
83082815dcSEvan Bacon * @param action
84082815dcSEvan Bacon */
85082815dcSEvan Baconexport const withAndroidColors: ConfigPlugin<Mod<Resources.ResourceXML>> = (config, action) => {
86082815dcSEvan Bacon  return withMod(config, {
87082815dcSEvan Bacon    platform: 'android',
88082815dcSEvan Bacon    mod: 'colors',
89082815dcSEvan Bacon    action,
90082815dcSEvan Bacon  });
91082815dcSEvan Bacon};
92082815dcSEvan Bacon
93082815dcSEvan Bacon/**
94082815dcSEvan Bacon * Provides the `android/app/src/main/res/values-night/colors.xml` as JSON (parsed with [`xml2js`](https://www.npmjs.com/package/xml2js)).
95082815dcSEvan Bacon *
96082815dcSEvan Bacon * @param config
97082815dcSEvan Bacon * @param action
98082815dcSEvan Bacon */
99082815dcSEvan Baconexport const withAndroidColorsNight: ConfigPlugin<Mod<Resources.ResourceXML>> = (
100082815dcSEvan Bacon  config,
101082815dcSEvan Bacon  action
102082815dcSEvan Bacon) => {
103082815dcSEvan Bacon  return withMod(config, {
104082815dcSEvan Bacon    platform: 'android',
105082815dcSEvan Bacon    mod: 'colorsNight',
106082815dcSEvan Bacon    action,
107082815dcSEvan Bacon  });
108082815dcSEvan Bacon};
109082815dcSEvan Bacon
110082815dcSEvan Bacon/**
111082815dcSEvan Bacon * Provides the `android/app/src/main/res/values/styles.xml` as JSON (parsed with [`xml2js`](https://www.npmjs.com/package/xml2js)).
112082815dcSEvan Bacon *
113082815dcSEvan Bacon * @param config
114082815dcSEvan Bacon * @param action
115082815dcSEvan Bacon */
116082815dcSEvan Baconexport const withAndroidStyles: ConfigPlugin<Mod<Resources.ResourceXML>> = (config, action) => {
117082815dcSEvan Bacon  return withMod(config, {
118082815dcSEvan Bacon    platform: 'android',
119082815dcSEvan Bacon    mod: 'styles',
120082815dcSEvan Bacon    action,
121082815dcSEvan Bacon  });
122082815dcSEvan Bacon};
123082815dcSEvan Bacon
124082815dcSEvan Bacon/**
125082815dcSEvan Bacon * Provides the project MainActivity for modification.
126082815dcSEvan Bacon *
127082815dcSEvan Bacon * @param config
128082815dcSEvan Bacon * @param action
129082815dcSEvan Bacon */
130082815dcSEvan Baconexport const withMainActivity: ConfigPlugin<Mod<Paths.ApplicationProjectFile>> = (
131082815dcSEvan Bacon  config,
132082815dcSEvan Bacon  action
133082815dcSEvan Bacon) => {
134082815dcSEvan Bacon  return withMod(config, {
135082815dcSEvan Bacon    platform: 'android',
136082815dcSEvan Bacon    mod: 'mainActivity',
137082815dcSEvan Bacon    action,
138082815dcSEvan Bacon  });
139082815dcSEvan Bacon};
140082815dcSEvan Bacon
141082815dcSEvan Bacon/**
142082815dcSEvan Bacon * Provides the project MainApplication for modification.
143082815dcSEvan Bacon *
144082815dcSEvan Bacon * @param config
145082815dcSEvan Bacon * @param action
146082815dcSEvan Bacon */
147082815dcSEvan Baconexport const withMainApplication: ConfigPlugin<Mod<Paths.ApplicationProjectFile>> = (
148082815dcSEvan Bacon  config,
149082815dcSEvan Bacon  action
150082815dcSEvan Bacon) => {
151082815dcSEvan Bacon  return withMod(config, {
152082815dcSEvan Bacon    platform: 'android',
153082815dcSEvan Bacon    mod: 'mainApplication',
154082815dcSEvan Bacon    action,
155082815dcSEvan Bacon  });
156082815dcSEvan Bacon};
157082815dcSEvan Bacon
158082815dcSEvan Bacon/**
159082815dcSEvan Bacon * Provides the project /build.gradle for modification.
160082815dcSEvan Bacon *
161082815dcSEvan Bacon * @param config
162082815dcSEvan Bacon * @param action
163082815dcSEvan Bacon */
164082815dcSEvan Baconexport const withProjectBuildGradle: ConfigPlugin<Mod<Paths.GradleProjectFile>> = (
165082815dcSEvan Bacon  config,
166082815dcSEvan Bacon  action
167082815dcSEvan Bacon) => {
168082815dcSEvan Bacon  return withMod(config, {
169082815dcSEvan Bacon    platform: 'android',
170082815dcSEvan Bacon    mod: 'projectBuildGradle',
171082815dcSEvan Bacon    action,
172082815dcSEvan Bacon  });
173082815dcSEvan Bacon};
174082815dcSEvan Bacon
175082815dcSEvan Bacon/**
176082815dcSEvan Bacon * Provides the app/build.gradle for modification.
177082815dcSEvan Bacon *
178082815dcSEvan Bacon * @param config
179082815dcSEvan Bacon * @param action
180082815dcSEvan Bacon */
181082815dcSEvan Baconexport const withAppBuildGradle: ConfigPlugin<Mod<Paths.GradleProjectFile>> = (config, action) => {
182082815dcSEvan Bacon  return withMod(config, {
183082815dcSEvan Bacon    platform: 'android',
184082815dcSEvan Bacon    mod: 'appBuildGradle',
185082815dcSEvan Bacon    action,
186082815dcSEvan Bacon  });
187082815dcSEvan Bacon};
188082815dcSEvan Bacon
189082815dcSEvan Bacon/**
190082815dcSEvan Bacon * Provides the /settings.gradle for modification.
191082815dcSEvan Bacon *
192082815dcSEvan Bacon * @param config
193082815dcSEvan Bacon * @param action
194082815dcSEvan Bacon */
195082815dcSEvan Baconexport const withSettingsGradle: ConfigPlugin<Mod<Paths.GradleProjectFile>> = (config, action) => {
196082815dcSEvan Bacon  return withMod(config, {
197082815dcSEvan Bacon    platform: 'android',
198082815dcSEvan Bacon    mod: 'settingsGradle',
199082815dcSEvan Bacon    action,
200082815dcSEvan Bacon  });
201082815dcSEvan Bacon};
202082815dcSEvan Bacon
203082815dcSEvan Bacon/**
204082815dcSEvan Bacon * Provides the /gradle.properties for modification.
205082815dcSEvan Bacon *
206082815dcSEvan Bacon * @param config
207082815dcSEvan Bacon * @param action
208082815dcSEvan Bacon */
209082815dcSEvan Baconexport const withGradleProperties: ConfigPlugin<Mod<Properties.PropertiesItem[]>> = (
210082815dcSEvan Bacon  config,
211082815dcSEvan Bacon  action
212082815dcSEvan Bacon) => {
213082815dcSEvan Bacon  return withMod(config, {
214082815dcSEvan Bacon    platform: 'android',
215082815dcSEvan Bacon    mod: 'gradleProperties',
216082815dcSEvan Bacon    action,
217082815dcSEvan Bacon  });
218082815dcSEvan Bacon};
219