microsoft/vscode-react-native

Public

mirrored from https://github.com/microsoft/vscode-react-nativeAvailable

CodeCommitsIssuesPull requestsActionsInsightsSecurity
0.5.1

Branches

Tags

  • No tags available.
0Branches0Tags
Go to file
Add file
Code

Clone

HTTPS

Download ZIP

src/extension/android/adb.ts

157lines · modeblame

52f3873ddigeff10 years ago1// Copyright (c) Microsoft Corporation. All rights reserved.
2// Licensed under the MIT license. See LICENSE file in the project root for details.
3
4import * as Q from "q";
5
6import {ChildProcess} from "../../common/node/childProcess";
7import {CommandExecutor} from "../../common/commandExecutor";
8
ce7fd946digeff10 years ago9// See android versions usage at: http://developer.android.com/about/dashboards/index.html
52f3873ddigeff10 years ago10export enum AndroidAPILevel {
ce7fd946digeff10 years ago11Marshmallow = 23,
52f3873ddigeff10 years ago12LOLLIPOP_MR1 = 22,
13LOLLIPOP = 21, /* Supports adb reverse */
14KITKAT = 19,
15JELLY_BEAN_MR2 = 18,
16JELLY_BEAN_MR1 = 17,
17JELLY_BEAN = 16,
18ICE_CREAM_SANDWICH_MR1 = 15,
19GINGERBREAD_MR1 = 10,
20}
21
7daed3fcArtem Egorov8 years ago22enum KeyEvents {
23KEYCODE_BACK = 4,
24KEYCODE_DPAD_UP = 19,
25KEYCODE_DPAD_DOWN = 20,
26KEYCODE_DPAD_CENTER = 23,
27KEYCODE_MENU = 82,
28}
29
52f3873ddigeff10 years ago30export enum DeviceType {
31AndroidSdkEmulator, // These seem to have emulator-<port> ids
27710197Vladimir Kotikov8 years ago32Other,
52f3873ddigeff10 years ago33}
34
35export interface IDevice {
36id: string;
37isOnline: boolean;
38type: DeviceType;
39}
40
7daed3fcArtem Egorov8 years ago41const AndroidSDKEmulatorPattern = /^emulator-\d{1,5}$/;
52f3873ddigeff10 years ago42
7daed3fcArtem Egorov8 years ago43export class AdbHelper {
44private static childProcess: ChildProcess = new ChildProcess();
45private static commandExecutor: CommandExecutor = new CommandExecutor();
52f3873ddigeff10 years ago46
47/**
48* Gets the list of Android connected devices and emulators.
49*/
7daed3fcArtem Egorov8 years ago50public static getConnectedDevices(): Q.Promise<IDevice[]> {
51return this.childProcess.execToString("adb devices")
52f3873ddigeff10 years ago52.then(output => {
53return this.parseConnectedDevices(output);
54});
55}
56
57/**
58* Broadcasts an intent to reload the application in debug mode.
59*/
7daed3fcArtem Egorov8 years ago60public static switchDebugMode(projectRoot: string, packageName: string, enable: boolean, debugTarget?: string): Q.Promise<void> {
b57ea017Artem Egorov8 years ago61let enableDebugCommand = `adb ${debugTarget ? "-s " + debugTarget : ""} shell am broadcast -a "${packageName}.RELOAD_APP_ACTION" --ez jsproxy ${enable}`;
62return new CommandExecutor(projectRoot).execute(enableDebugCommand)
63.then(() => { // We should stop and start application again after RELOAD_APP_ACTION, otherwise app going to hangs up
64let deferred = Q.defer();
65setTimeout(() => {
66this.stopApp(projectRoot, packageName, debugTarget)
67.then(() => {
68return deferred.resolve({});
69});
70}, 200); // We need a little delay after broadcast command
71
72return deferred.promise;
73})
74.then(() => {
75return this.launchApp(projectRoot, packageName, debugTarget);
76});
52f3873ddigeff10 years ago77}
78
79/**
80* Sends an intent which launches the main activity of the application.
81*/
7daed3fcArtem Egorov8 years ago82public static launchApp(projectRoot: string, packageName: string, debugTarget?: string): Q.Promise<void> {
b57ea017Artem Egorov8 years ago83let launchAppCommand = `adb ${debugTarget ? "-s " + debugTarget : ""} shell am start -n ${packageName}/.MainActivity`;
52f3873ddigeff10 years ago84return new CommandExecutor(projectRoot).execute(launchAppCommand);
85}
86
7daed3fcArtem Egorov8 years ago87public static stopApp(projectRoot: string, packageName: string, debugTarget?: string): Q.Promise<void> {
b57ea017Artem Egorov8 years ago88let stopAppCommand = `adb ${debugTarget ? "-s " + debugTarget : ""} shell am force-stop ${packageName}`;
89return new CommandExecutor(projectRoot).execute(stopAppCommand);
90}
91
7daed3fcArtem Egorov8 years ago92public static apiVersion(deviceId: string): Q.Promise<AndroidAPILevel> {
52f3873ddigeff10 years ago93return this.executeQuery(deviceId, "shell getprop ro.build.version.sdk").then(output =>
94parseInt(output, 10));
95}
96
7daed3fcArtem Egorov8 years ago97public static reverseAdb(deviceId: string, packagerPort: number): Q.Promise<void> {
b57ea017Artem Egorov8 years ago98return this.execute(deviceId, `reverse tcp:${packagerPort} tcp:${packagerPort}`);
52f3873ddigeff10 years ago99}
100
7daed3fcArtem Egorov8 years ago101public static showDevMenu(deviceId?: string): Q.Promise<void> {
102let command = `adb ${deviceId ? "-s " + deviceId : ""} shell input keyevent ${KeyEvents.KEYCODE_MENU}`;
103return this.commandExecutor.execute(command);
104}
105
106public static reloadApp(deviceId?: string): Q.Promise<void> {
107let commands = [
108`adb ${deviceId ? "-s " + deviceId : ""} shell input keyevent ${KeyEvents.KEYCODE_MENU}`,
109`adb ${deviceId ? "-s " + deviceId : ""} shell input keyevent ${KeyEvents.KEYCODE_DPAD_UP}`,
110`adb ${deviceId ? "-s " + deviceId : ""} shell input keyevent ${KeyEvents.KEYCODE_DPAD_CENTER}`,
111];
112
113return this.executeChain(commands);
114}
115
116public static getOnlineDevices(): Q.Promise<IDevice[]> {
117return this.getConnectedDevices().then(devices => {
118return devices.filter(device =>
119device.isOnline);
120});
121}
122
123private static parseConnectedDevices(input: string): IDevice[] {
52f3873ddigeff10 years ago124let result: IDevice[] = [];
125let regex = new RegExp("^(\\S+)\\t(\\S+)$", "mg");
126let match = regex.exec(input);
127while (match != null) {
128result.push({ id: match[1], isOnline: match[2] === "device", type: this.extractDeviceType(match[1]) });
129match = regex.exec(input);
130}
131return result;
132}
133
7daed3fcArtem Egorov8 years ago134private static extractDeviceType(id: string): DeviceType {
52f3873ddigeff10 years ago135return id.match(AndroidSDKEmulatorPattern)
136? DeviceType.AndroidSdkEmulator
137: DeviceType.Other;
138}
139
7daed3fcArtem Egorov8 years ago140private static executeQuery(deviceId: string, command: string): Q.Promise<string> {
52f3873ddigeff10 years ago141return this.childProcess.execToString(this.generateCommandForDevice(deviceId, command));
142}
143
7daed3fcArtem Egorov8 years ago144private static execute(deviceId: string, command: string): Q.Promise<void> {
52f3873ddigeff10 years ago145return this.commandExecutor.execute(this.generateCommandForDevice(deviceId, command));
146}
147
7daed3fcArtem Egorov8 years ago148private static executeChain(commands: string[]): Q.Promise<any> {
149return commands.reduce((promise, command) => {
150return promise.then(() => this.commandExecutor.execute(command));
151}, Q(void 0));
152}
153
154private static generateCommandForDevice(deviceId: string, adbCommand: string): string {
52f3873ddigeff10 years ago155return `adb -s "${deviceId}" ${adbCommand}`;
156}
157}