1import { AndroidConfig } from '@expo/config-plugins';
2
3import { AppIdResolver } from '../AppIdResolver';
4
5/** Resolves the Android package name from the Expo config or native files. */
6export class AndroidAppIdResolver extends AppIdResolver {
7  constructor(projectRoot: string) {
8    super(projectRoot, 'android', 'android.package');
9  }
10
11  async hasNativeProjectAsync(): Promise<boolean> {
12    try {
13      await AndroidConfig.Paths.getProjectPathOrThrowAsync(this.projectRoot);
14      return true;
15    } catch {
16      return false;
17    }
18  }
19
20  async resolveAppIdFromNativeAsync(): Promise<string | null> {
21    const applicationIdFromGradle = await AndroidConfig.Package.getApplicationIdAsync(
22      this.projectRoot
23    ).catch(() => null);
24    if (applicationIdFromGradle) {
25      return applicationIdFromGradle;
26    }
27
28    try {
29      const filePath = await AndroidConfig.Paths.getAndroidManifestAsync(this.projectRoot);
30      const androidManifest = await AndroidConfig.Manifest.readAndroidManifestAsync(filePath);
31      // Assert MainActivity defined.
32      await AndroidConfig.Manifest.getMainActivityOrThrow(androidManifest);
33      if (androidManifest.manifest?.$?.package) {
34        return androidManifest.manifest.$.package;
35      }
36    } catch {}
37
38    return null;
39  }
40}
41