From 5862d7a290b0c842efc2135e66d7a827c51f0b1b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micha=C5=82=20Pierzcha=C5=82a?= Date: Sun, 10 Dec 2023 19:27:58 +0100 Subject: [PATCH] fix(android): launching app on simulator with different appId than packageName (#2195) --- .../__tests__/runOnAllDevices.test.ts | 1 + .../__tests__/tryLaunchAppOnDevice.test.ts | 133 ++++++++++++++++++ .../src/commands/runAndroid/index.ts | 2 +- .../runAndroid/tryLaunchAppOnDevice.ts | 2 +- 4 files changed, 136 insertions(+), 2 deletions(-) create mode 100644 packages/cli-platform-android/src/commands/runAndroid/__tests__/tryLaunchAppOnDevice.test.ts diff --git a/packages/cli-platform-android/src/commands/runAndroid/__tests__/runOnAllDevices.test.ts b/packages/cli-platform-android/src/commands/runAndroid/__tests__/runOnAllDevices.test.ts index 935137307..1e54de80d 100644 --- a/packages/cli-platform-android/src/commands/runAndroid/__tests__/runOnAllDevices.test.ts +++ b/packages/cli-platform-android/src/commands/runAndroid/__tests__/runOnAllDevices.test.ts @@ -66,6 +66,7 @@ describe('--appFolder', () => { const androidProject: AndroidProjectConfig = { appName: 'app', packageName: 'com.test', + applicationId: 'com.test', sourceDir: '/android', mainActivity: '.MainActivity', }; diff --git a/packages/cli-platform-android/src/commands/runAndroid/__tests__/tryLaunchAppOnDevice.test.ts b/packages/cli-platform-android/src/commands/runAndroid/__tests__/tryLaunchAppOnDevice.test.ts new file mode 100644 index 000000000..39630bcdf --- /dev/null +++ b/packages/cli-platform-android/src/commands/runAndroid/__tests__/tryLaunchAppOnDevice.test.ts @@ -0,0 +1,133 @@ +import {AndroidProjectConfig} from '@react-native-community/cli-types'; +import tryLaunchAppOnDevice from '../tryLaunchAppOnDevice'; +import {Flags} from '..'; +import execa from 'execa'; + +jest.mock('execa'); +jest.mock('../getAdbPath'); +jest.mock('../tryLaunchEmulator'); + +const adbPath = 'path/to/adb'; +const device = 'emulator-5554'; +let args: Flags = { + activeArchOnly: false, + packager: true, + port: 8081, + terminal: 'iTerm.app', + appId: '', + appIdSuffix: '', + listDevices: false, +}; + +let androidProject: AndroidProjectConfig = { + sourceDir: '/Users/thymikee/Developer/tmp/App73/android', + appName: 'app', + packageName: 'com.myapp', + applicationId: 'com.myapp.custom', + mainActivity: '.MainActivity', + dependencyConfiguration: undefined, + watchModeCommandParams: undefined, + unstable_reactLegacyComponentNames: undefined, +}; + +const shellStartCommand = ['shell', 'am', 'start']; +const actionCategoryFlags = [ + '-a', + 'android.intent.action.MAIN', + '-c', + 'android.intent.category.LAUNCHER', +]; + +beforeEach(() => { + jest.clearAllMocks(); +}); + +test('launches adb shell with intent to launch com.myapp.MainActivity with different appId than packageName on a simulator', () => { + tryLaunchAppOnDevice(device, androidProject, adbPath, args); + + expect(execa.sync).toHaveBeenCalledWith( + 'path/to/adb', + [ + '-s', + 'emulator-5554', + ...shellStartCommand, + '-n', + 'com.myapp.custom/com.myapp.MainActivity', + ...actionCategoryFlags, + ], + {stdio: 'inherit'}, + ); +}); + +test('launches adb shell with intent to launch com.myapp.MainActivity with same appId as packageName on a simulator', () => { + tryLaunchAppOnDevice( + device, + {...androidProject, applicationId: 'com.myapp'}, + adbPath, + args, + ); + + expect(execa.sync).toHaveBeenCalledWith( + 'path/to/adb', + [ + '-s', + 'emulator-5554', + ...shellStartCommand, + '-n', + 'com.myapp/com.myapp.MainActivity', + ...actionCategoryFlags, + ], + {stdio: 'inherit'}, + ); +}); + +test('launches adb shell with intent to launch com.myapp.MainActivity with different appId than packageName on a device (without calling simulator)', () => { + tryLaunchAppOnDevice(undefined, androidProject, adbPath, args); + + expect(execa.sync).toHaveBeenCalledWith( + 'path/to/adb', + [ + ...shellStartCommand, + '-n', + 'com.myapp.custom/com.myapp.MainActivity', + ...actionCategoryFlags, + ], + {stdio: 'inherit'}, + ); +}); + +test('--appId flag overwrites applicationId setting in androidProject', () => { + tryLaunchAppOnDevice(undefined, androidProject, adbPath, { + ...args, + appId: 'my.app.id', + }); + + expect(execa.sync).toHaveBeenCalledWith( + 'path/to/adb', + [ + ...shellStartCommand, + '-n', + 'my.app.id/com.myapp.MainActivity', + ...actionCategoryFlags, + ], + {stdio: 'inherit'}, + ); +}); + +test('appIdSuffix Staging is appended to applicationId', () => { + tryLaunchAppOnDevice(undefined, androidProject, adbPath, { + ...args, + appIdSuffix: 'Staging', + }); + + expect(execa.sync).toHaveBeenCalledWith( + 'path/to/adb', + [ + ...shellStartCommand, + '-n', + 'com.myapp.custom.Staging/com.myapp.MainActivity', + ...actionCategoryFlags, + ], + {stdio: 'inherit'}, + ); +}); diff --git a/packages/cli-platform-android/src/commands/runAndroid/index.ts b/packages/cli-platform-android/src/commands/runAndroid/index.ts index 63636d64b..d207641b4 100644 --- a/packages/cli-platform-android/src/commands/runAndroid/index.ts +++ b/packages/cli-platform-android/src/commands/runAndroid/index.ts @@ -34,7 +34,7 @@ import {checkUsers, promptForUser} from './listAndroidUsers'; export interface Flags extends BuildFlags { appId: string; appIdSuffix: string; - mainActivity: string; + mainActivity?: string; port: number; terminal?: string; packager?: boolean; diff --git a/packages/cli-platform-android/src/commands/runAndroid/tryLaunchAppOnDevice.ts b/packages/cli-platform-android/src/commands/runAndroid/tryLaunchAppOnDevice.ts index bef77a345..2a0dda4a0 100644 --- a/packages/cli-platform-android/src/commands/runAndroid/tryLaunchAppOnDevice.ts +++ b/packages/cli-platform-android/src/commands/runAndroid/tryLaunchAppOnDevice.ts @@ -25,7 +25,7 @@ function tryLaunchAppOnDevice( .join('.'); const activityToLaunch = mainActivity.includes('.') - ? mainActivity + ? [packageName, mainActivity].join('') : [packageName, mainActivity].filter(Boolean).join('.'); try {