protected async launchSimulator()

in src/utils/android/androidTargetManager.ts [117:176]


    protected async launchSimulator(emulatorTarget: IMobileTarget): Promise<AndroidTarget> {
        return new Promise<AndroidTarget>((resolve, reject) => {
            const emulatorProcess = this.childProcess.spawn(
                AndroidTargetManager.EMULATOR_COMMAND,
                [AndroidTargetManager.EMULATOR_AVD_START_COMMAND, emulatorTarget.name],
                {
                    detached: true,
                },
                true,
            );
            emulatorProcess.outcome.catch(error => {
                if (
                    process.platform == "win32" &&
                    process.env.SESSIONNAME &&
                    process.env.SESSIONNAME.toLowerCase().includes("rdp-tcp")
                ) {
                    this.logger.log(
                        localize(
                            "RDPEmulatorWarning",
                            "Android emulator was launched from the Windows RDP session, this might lead to failures.",
                        ),
                    );
                }
                reject(new Error(`Virtual device launch finished with an exception: ${error}`));
            });
            emulatorProcess.spawnedProcess.unref();

            const rejectTimeout = setTimeout(() => {
                cleanup();
                reject(new Error(`Virtual device launch finished with an exception: ${localize(
                    "EmulatorStartWarning",
                    "Could not start the emulator {0} within {1} seconds.",
                    emulatorTarget.name,
                    AndroidTargetManager.EMULATOR_START_TIMEOUT,
                )}`));
            }, AndroidTargetManager.EMULATOR_START_TIMEOUT * 1000);

            const bootCheckInterval = setInterval(async () => {
                const connectedDevices = await this.adbHelper.getOnlineTargets();
                for (let i = 0; i < connectedDevices.length; i++) {
                    const onlineAvdName = await this.adbHelper.getAvdNameById(connectedDevices[i].id);
                    if (onlineAvdName === emulatorTarget.name) {
                        emulatorTarget.id = connectedDevices[i].id;
                        emulatorTarget.isOnline = true;
                        this.logger.log(
                            localize("EmulatorLaunched", "Launched emulator {0}", emulatorTarget.name),
                        );
                        cleanup();
                        resolve(AndroidTarget.fromInterface(<IDebuggableMobileTarget>emulatorTarget));
                        break;
                    }
                }
            }, 1000);

            const cleanup = () => {
                clearTimeout(rejectTimeout);
                clearInterval(bootCheckInterval);
            };
        });
    }