private async resolveAndroidTarget()

in src/debugger/cordovaDebugSession.ts [1337:1394]


    private async resolveAndroidTarget(configArgs: ICordovaLaunchRequestArgs | ICordovaAttachRequestArgs, isAttachScenario: boolean): Promise<AndroidTarget | undefined> {
        const adbHelper = new AdbHelper(configArgs.cwd);

        const getFirstOnlineAndroidTarget = async (): Promise<AndroidTarget | undefined> => {
            const onlineTargets = await adbHelper.getOnlineTargets();
            if (onlineTargets.length) {
                const firstDevice = onlineTargets[0];
                configArgs.target = firstDevice.id;
                return AndroidTarget.fromInterface(firstDevice);
            }
        };

        if (configArgs.target) {
            const androidEmulatorManager = new AndroidTargetManager(adbHelper);
            const isAnyEmulator = configArgs.target.toLowerCase() === TargetType.Emulator;
            const isAnyDevice = configArgs.target.toLowerCase() === TargetType.Device;
            const isVirtualTarget = await androidEmulatorManager.isVirtualTarget(configArgs.target);

            const saveResult = async (target: AndroidTarget): Promise<void> => {
            const launchScenariousManager = new LaunchScenariosManager(configArgs.cwd);
                if (isAttachScenario) {
                    // Save the selected target for attach scenario only if there are more then one online target
                    const onlineDevices = await adbHelper.getOnlineTargets();
                    if (onlineDevices.filter(device => target.isVirtualTarget === device.isVirtualTarget).length > 1) {
                        launchScenariousManager.updateLaunchScenario(configArgs, {target: target.name});
                    }
                } else {
                    launchScenariousManager.updateLaunchScenario(configArgs, {target: target.name});
                }
            };

            await androidEmulatorManager.collectTargets(isVirtualTarget ? TargetType.Emulator : TargetType.Device);
            let targetDevice = await androidEmulatorManager.selectAndPrepareTarget(target => {
                const conditionForAttachScenario = isAttachScenario ? target.isOnline : true;
                const conditionForNotAnyTarget = isAnyEmulator || isAnyDevice ? true : target.name === configArgs.target || target.id === configArgs.target;
                const conditionForVirtualTarget = isVirtualTarget === target.isVirtualTarget;
                return conditionForVirtualTarget && conditionForNotAnyTarget && conditionForAttachScenario;
            });
            if (targetDevice) {
                if (isAnyEmulator || isAnyDevice) {
                    await saveResult(targetDevice);
                }
                configArgs.target = targetDevice.id;
            } else if (isAttachScenario && (isAnyEmulator || isAnyDevice)) {
                this.outputLogger("Target has not been selected. Trying to use the first online Android device");
                targetDevice = await getFirstOnlineAndroidTarget();
            }

            return targetDevice;
        } else {
            // If there is no a target in debug config, use the first online device
            const targetDevice = await getFirstOnlineAndroidTarget();
            if (!targetDevice) {
                throw new Error(localize("ThereIsNoAnyOnlineDebuggableDevice", "The 'target' parameter in the debug configuration is undefined, and there are no any online debuggable targets"));
            }
            return targetDevice;
        }
    }