1import { AndroidConfig } from '@expo/config-plugins';
2
3import { AndroidAppIdResolver } from '../../start/platforms/android/AndroidAppIdResolver';
4import { CommandError } from '../../utils/errors';
5
6export interface LaunchProps {
7  packageName: string;
8  mainActivity: string;
9  launchActivity: string;
10}
11
12async function getMainActivityAsync(projectRoot: string): Promise<string> {
13  const filePath = await AndroidConfig.Paths.getAndroidManifestAsync(projectRoot);
14  const androidManifest = await AndroidConfig.Manifest.readAndroidManifestAsync(filePath);
15
16  // Assert MainActivity defined.
17  const activity = await AndroidConfig.Manifest.getRunnableActivity(androidManifest);
18  if (!activity) {
19    throw new CommandError(
20      'ANDROID_MALFORMED',
21      `${filePath} is missing a runnable activity element.`
22    );
23  }
24  // Often this is ".MainActivity"
25  return activity.$['android:name'];
26}
27
28export async function resolveLaunchPropsAsync(projectRoot: string): Promise<LaunchProps> {
29  // Often this is ".MainActivity"
30  const mainActivity = await getMainActivityAsync(projectRoot);
31
32  const packageName = await new AndroidAppIdResolver(projectRoot).getAppIdFromNativeAsync();
33  const launchActivity = `${packageName}/${mainActivity}`;
34
35  return {
36    mainActivity,
37    launchActivity,
38    packageName,
39  };
40}
41