1import fs from 'fs-extra';
2import path from 'path';
3
4import { copyFileWithTransformsAsync } from '../../Transforms';
5import { searchFilesAsync } from '../../Utils';
6import { expoviewTransforms } from './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  const settingsGradle = await fs.readFile(settingsGradlePath, 'utf-8');
37  if (!settingsGradle.match(abiVersion)) {
38    await fs.writeFile(
39      settingsGradlePath,
40      settingsGradle.replace(
41        /ADD_NEW_SUPPORTED_ABIS_HERE/,
42        `ADD_NEW_SUPPORTED_ABIS_HERE\n    "${abiVersion}",`
43      )
44    );
45  }
46}
47