1import fs from 'fs-extra';
2import path from 'path';
3
4import { copyFileWithTransformsAsync } from '../../Transforms';
5import { searchFilesAsync } from '../../Utils';
6import { expoviewTransforms } from './transforms/expoviewTransforms';
7
8export async function copyExpoviewAsync(sdkVersion: string, androidDir: string): Promise<void> {
9  const abiVersion = `abi${sdkVersion.replace(/\./g, '_')}`;
10  const targetDirectory = path.join(androidDir, `versioned-abis/expoview-${abiVersion}`);
11  const sourceDirectory = path.join(androidDir, 'expoview');
12  const transforms = expoviewTransforms(abiVersion);
13
14  const files = await searchFilesAsync(sourceDirectory, [
15    './build.gradle',
16    './CMakeLists.txt',
17    './empty.cpp',
18    './src/main/AndroidManifest.xml',
19    './src/main/cpp/**',
20    './src/main/JNI/**',
21    './src/main/Common/**',
22    './src/main/java/versioned/**',
23    './src/main/java/com/**',
24  ]);
25
26  for (const sourceFile of files) {
27    await copyFileWithTransformsAsync({
28      sourceFile,
29      targetDirectory,
30      sourceDirectory,
31      transforms,
32    });
33  }
34
35  const settingsGradlePath = path.join(androidDir, 'settings.gradle');
36  let settingsGradle = await fs.readFile(settingsGradlePath, 'utf-8');
37  if (!settingsGradle.match(abiVersion)) {
38    settingsGradle = settingsGradle.replace(
39      /ADD_NEW_SUPPORTED_ABIS_HERE/,
40      `ADD_NEW_SUPPORTED_ABIS_HERE\n    "${abiVersion}",`
41    );
42  }
43  const vendoredLinking = `useVendoredModulesForSettingsGradle('sdk${sdkVersion.split('.')[0]}')`;
44  if (!settingsGradle.match(vendoredLinking)) {
45    settingsGradle = settingsGradle.replace(
46      /(^useVendoredModulesForSettingsGradle\('unversioned'\))/gm,
47      `$1\n${vendoredLinking}`
48    );
49  }
50
51  await fs.writeFile(settingsGradlePath, settingsGradle);
52}
53