18d307f52SEvan Baconimport { AndroidConfig } from '@expo/config-plugins';
28d307f52SEvan Bacon
38d307f52SEvan Baconimport { AppIdResolver } from '../AppIdResolver';
48d307f52SEvan Bacon
5*60392ac6SEvan Baconconst debug = require('debug')(
6*60392ac6SEvan Bacon  'expo:start:platforms:android:AndroidAppIdResolver'
7*60392ac6SEvan Bacon) as typeof console.log;
8*60392ac6SEvan Bacon
98d307f52SEvan Bacon/** Resolves the Android package name from the Expo config or native files. */
108d307f52SEvan Baconexport class AndroidAppIdResolver extends AppIdResolver {
118d307f52SEvan Bacon  constructor(projectRoot: string) {
128d307f52SEvan Bacon    super(projectRoot, 'android', 'android.package');
138d307f52SEvan Bacon  }
148d307f52SEvan Bacon
158d307f52SEvan Bacon  async hasNativeProjectAsync(): Promise<boolean> {
168d307f52SEvan Bacon    try {
178d307f52SEvan Bacon      await AndroidConfig.Paths.getProjectPathOrThrowAsync(this.projectRoot);
188d307f52SEvan Bacon      return true;
19*60392ac6SEvan Bacon    } catch (error: any) {
20*60392ac6SEvan Bacon      debug('Expected error checking for native project:', error);
218d307f52SEvan Bacon      return false;
228d307f52SEvan Bacon    }
238d307f52SEvan Bacon  }
248d307f52SEvan Bacon
258d307f52SEvan Bacon  async resolveAppIdFromNativeAsync(): Promise<string | null> {
268d307f52SEvan Bacon    const applicationIdFromGradle = await AndroidConfig.Package.getApplicationIdAsync(
278d307f52SEvan Bacon      this.projectRoot
288d307f52SEvan Bacon    ).catch(() => null);
298d307f52SEvan Bacon    if (applicationIdFromGradle) {
308d307f52SEvan Bacon      return applicationIdFromGradle;
318d307f52SEvan Bacon    }
328d307f52SEvan Bacon
338d307f52SEvan Bacon    try {
348d307f52SEvan Bacon      const filePath = await AndroidConfig.Paths.getAndroidManifestAsync(this.projectRoot);
358d307f52SEvan Bacon      const androidManifest = await AndroidConfig.Manifest.readAndroidManifestAsync(filePath);
368d307f52SEvan Bacon      // Assert MainActivity defined.
378d307f52SEvan Bacon      await AndroidConfig.Manifest.getMainActivityOrThrow(androidManifest);
388d307f52SEvan Bacon      if (androidManifest.manifest?.$?.package) {
398d307f52SEvan Bacon        return androidManifest.manifest.$.package;
408d307f52SEvan Bacon      }
41*60392ac6SEvan Bacon    } catch (error: any) {
42*60392ac6SEvan Bacon      debug('Expected error resolving the package name from the AndroidManifest.xml:', error);
43*60392ac6SEvan Bacon    }
448d307f52SEvan Bacon
458d307f52SEvan Bacon    return null;
468d307f52SEvan Bacon  }
478d307f52SEvan Bacon}
48