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