appium-android-driver 5.13.1 → 5.13.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (151) hide show
  1. package/CHANGELOG.md +7 -0
  2. package/build/index.js +43 -40
  3. package/build/lib/android-helpers.d.ts +136 -0
  4. package/build/lib/android-helpers.d.ts.map +1 -0
  5. package/build/lib/android-helpers.js +760 -679
  6. package/build/lib/android-helpers.js.map +1 -1
  7. package/build/lib/bootstrap.d.ts +29 -0
  8. package/build/lib/bootstrap.d.ts.map +1 -0
  9. package/build/lib/bootstrap.js +192 -179
  10. package/build/lib/bootstrap.js.map +1 -1
  11. package/build/lib/commands/actions.d.ts +209 -0
  12. package/build/lib/commands/actions.d.ts.map +1 -0
  13. package/build/lib/commands/actions.js +327 -265
  14. package/build/lib/commands/actions.js.map +1 -1
  15. package/build/lib/commands/alert.d.ts +10 -0
  16. package/build/lib/commands/alert.d.ts.map +1 -0
  17. package/build/lib/commands/alert.js +12 -18
  18. package/build/lib/commands/alert.js.map +1 -1
  19. package/build/lib/commands/app-management.d.ts +314 -0
  20. package/build/lib/commands/app-management.d.ts.map +1 -0
  21. package/build/lib/commands/app-management.js +278 -110
  22. package/build/lib/commands/app-management.js.map +1 -1
  23. package/build/lib/commands/context.d.ts +94 -0
  24. package/build/lib/commands/context.d.ts.map +1 -0
  25. package/build/lib/commands/context.js +412 -260
  26. package/build/lib/commands/context.js.map +1 -1
  27. package/build/lib/commands/coverage.d.ts +5 -0
  28. package/build/lib/commands/coverage.d.ts.map +1 -0
  29. package/build/lib/commands/coverage.js +14 -17
  30. package/build/lib/commands/coverage.js.map +1 -1
  31. package/build/lib/commands/element.d.ts +36 -0
  32. package/build/lib/commands/element.d.ts.map +1 -0
  33. package/build/lib/commands/element.js +97 -127
  34. package/build/lib/commands/element.js.map +1 -1
  35. package/build/lib/commands/emu-console.d.ts +49 -0
  36. package/build/lib/commands/emu-console.d.ts.map +1 -0
  37. package/build/lib/commands/emu-console.js +36 -25
  38. package/build/lib/commands/emu-console.js.map +1 -1
  39. package/build/lib/commands/execute.d.ts +6 -0
  40. package/build/lib/commands/execute.d.ts.map +1 -0
  41. package/build/lib/commands/execute.js +68 -69
  42. package/build/lib/commands/execute.js.map +1 -1
  43. package/build/lib/commands/file-actions.d.ts +129 -0
  44. package/build/lib/commands/file-actions.d.ts.map +1 -0
  45. package/build/lib/commands/file-actions.js +321 -178
  46. package/build/lib/commands/file-actions.js.map +1 -1
  47. package/build/lib/commands/find.d.ts +13 -0
  48. package/build/lib/commands/find.d.ts.map +1 -0
  49. package/build/lib/commands/find.js +69 -51
  50. package/build/lib/commands/find.js.map +1 -1
  51. package/build/lib/commands/general.d.ts +133 -0
  52. package/build/lib/commands/general.d.ts.map +1 -0
  53. package/build/lib/commands/general.js +275 -216
  54. package/build/lib/commands/general.js.map +1 -1
  55. package/build/lib/commands/ime.d.ts +11 -0
  56. package/build/lib/commands/ime.d.ts.map +1 -0
  57. package/build/lib/commands/ime.js +27 -33
  58. package/build/lib/commands/ime.js.map +1 -1
  59. package/build/lib/commands/index.d.ts +3 -0
  60. package/build/lib/commands/index.d.ts.map +1 -0
  61. package/build/lib/commands/index.js +32 -35
  62. package/build/lib/commands/index.js.map +1 -1
  63. package/build/lib/commands/intent.d.ts +418 -0
  64. package/build/lib/commands/intent.d.ts.map +1 -0
  65. package/build/lib/commands/intent.js +281 -151
  66. package/build/lib/commands/intent.js.map +1 -1
  67. package/build/lib/commands/keyboard.d.ts +6 -0
  68. package/build/lib/commands/keyboard.d.ts.map +1 -0
  69. package/build/lib/commands/keyboard.js +6 -14
  70. package/build/lib/commands/keyboard.js.map +1 -1
  71. package/build/lib/commands/log.d.ts +45 -0
  72. package/build/lib/commands/log.d.ts.map +1 -0
  73. package/build/lib/commands/log.js +117 -103
  74. package/build/lib/commands/log.js.map +1 -1
  75. package/build/lib/commands/media-projection.d.ts +144 -0
  76. package/build/lib/commands/media-projection.d.ts.map +1 -0
  77. package/build/lib/commands/media-projection.js +228 -171
  78. package/build/lib/commands/media-projection.js.map +1 -1
  79. package/build/lib/commands/network.d.ts +139 -0
  80. package/build/lib/commands/network.d.ts.map +1 -0
  81. package/build/lib/commands/network.js +249 -181
  82. package/build/lib/commands/network.js.map +1 -1
  83. package/build/lib/commands/performance.d.ts +101 -0
  84. package/build/lib/commands/performance.d.ts.map +1 -0
  85. package/build/lib/commands/performance.js +390 -236
  86. package/build/lib/commands/performance.js.map +1 -1
  87. package/build/lib/commands/permissions.d.ts +93 -0
  88. package/build/lib/commands/permissions.d.ts.map +1 -0
  89. package/build/lib/commands/permissions.js +133 -93
  90. package/build/lib/commands/permissions.js.map +1 -1
  91. package/build/lib/commands/recordscreen.d.ts +194 -0
  92. package/build/lib/commands/recordscreen.d.ts.map +1 -0
  93. package/build/lib/commands/recordscreen.js +293 -224
  94. package/build/lib/commands/recordscreen.js.map +1 -1
  95. package/build/lib/commands/shell.d.ts +8 -0
  96. package/build/lib/commands/shell.d.ts.map +1 -0
  97. package/build/lib/commands/shell.js +38 -43
  98. package/build/lib/commands/shell.js.map +1 -1
  99. package/build/lib/commands/streamscreen.d.ts +104 -0
  100. package/build/lib/commands/streamscreen.d.ts.map +1 -0
  101. package/build/lib/commands/streamscreen.js +364 -305
  102. package/build/lib/commands/streamscreen.js.map +1 -1
  103. package/build/lib/commands/system-bars.d.ts +100 -0
  104. package/build/lib/commands/system-bars.d.ts.map +1 -0
  105. package/build/lib/commands/system-bars.js +148 -90
  106. package/build/lib/commands/system-bars.js.map +1 -1
  107. package/build/lib/commands/touch.d.ts +30 -0
  108. package/build/lib/commands/touch.d.ts.map +1 -0
  109. package/build/lib/commands/touch.js +311 -287
  110. package/build/lib/commands/touch.js.map +1 -1
  111. package/build/lib/desired-caps.d.ts +353 -0
  112. package/build/lib/desired-caps.d.ts.map +1 -0
  113. package/build/lib/desired-caps.js +291 -292
  114. package/build/lib/desired-caps.js.map +1 -1
  115. package/build/lib/driver.d.ts +430 -0
  116. package/build/lib/driver.d.ts.map +1 -0
  117. package/build/lib/driver.js +449 -384
  118. package/build/lib/driver.js.map +1 -1
  119. package/build/lib/logger.d.ts +3 -0
  120. package/build/lib/logger.d.ts.map +1 -0
  121. package/build/lib/logger.js +5 -11
  122. package/build/lib/logger.js.map +1 -1
  123. package/build/lib/method-map.d.ts +389 -0
  124. package/build/lib/method-map.d.ts.map +1 -0
  125. package/build/lib/method-map.js +220 -394
  126. package/build/lib/method-map.js.map +1 -1
  127. package/build/lib/stubs.d.ts +8 -0
  128. package/build/lib/stubs.d.ts.map +1 -0
  129. package/build/lib/stubs.js +5 -0
  130. package/build/lib/stubs.js.map +1 -0
  131. package/build/lib/uiautomator.d.ts +24 -0
  132. package/build/lib/uiautomator.d.ts.map +1 -0
  133. package/build/lib/uiautomator.js +86 -82
  134. package/build/lib/uiautomator.js.map +1 -1
  135. package/build/lib/unlock-helpers.d.ts +38 -0
  136. package/build/lib/unlock-helpers.d.ts.map +1 -0
  137. package/build/lib/unlock-helpers.js +228 -204
  138. package/build/lib/unlock-helpers.js.map +1 -1
  139. package/build/lib/utils.d.ts +11 -0
  140. package/build/lib/utils.d.ts.map +1 -0
  141. package/build/lib/utils.js +23 -18
  142. package/build/lib/utils.js.map +1 -1
  143. package/build/lib/webview-helpers.d.ts +223 -0
  144. package/build/lib/webview-helpers.d.ts.map +1 -0
  145. package/build/lib/webview-helpers.js +476 -298
  146. package/build/lib/webview-helpers.js.map +1 -1
  147. package/index.js +3 -1
  148. package/lib/android-helpers.js +2 -1
  149. package/lib/stubs.ts +8 -0
  150. package/lib/unlock-helpers.js +2 -2
  151. package/package.json +23 -14
@@ -1,145 +1,313 @@
1
1
  "use strict";
2
-
3
- var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
- Object.defineProperty(exports, "__esModule", {
5
- value: true
6
- });
7
- exports.default = exports.commands = void 0;
8
- require("source-map-support/register");
9
- var _lodash = _interopRequireDefault(require("lodash"));
10
- var _asyncbox = require("asyncbox");
11
- var _support = require("@appium/support");
12
- var _androidHelpers = require("../android-helpers");
13
- var _driver = require("appium/driver");
14
- var _utils = require("../utils");
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.commands = void 0;
7
+ const lodash_1 = __importDefault(require("lodash"));
8
+ const asyncbox_1 = require("asyncbox");
9
+ const support_1 = require("@appium/support");
10
+ const android_helpers_1 = require("../android-helpers");
11
+ const driver_1 = require("appium/driver");
12
+ const utils_1 = require("../utils");
15
13
  const APP_EXTENSIONS = ['.apk', '.apks'];
16
14
  const RESOLVER_ACTIVITY_NAME = 'android/com.android.internal.app.ResolverActivity';
17
15
  const commands = {};
18
16
  exports.commands = commands;
17
+ /**
18
+ * Verify whether an application is installed or not
19
+ *
20
+ * @param {string} appId - Application package identifier
21
+ * @returns {boolean} true if the app is installed
22
+ */
19
23
  commands.isAppInstalled = async function isAppInstalled(appId) {
20
- return await this.adb.isAppInstalled(appId);
24
+ return await this.adb.isAppInstalled(appId);
21
25
  };
26
+ /**
27
+ * @typedef {Object} MobileAppInstalledOptions
28
+ * @property {string} appId - Application package identifier. Must be always provided.
29
+ */
30
+ /**
31
+ * Verify whether an application is installed or not
32
+ *
33
+ * @param {MobileAppInstalledOptions} opts
34
+ * @returns {boolean} Same as in `isAppInstalled`
35
+ */
22
36
  commands.mobileIsAppInstalled = async function mobileIsAppInstalled(opts = {}) {
23
- const {
24
- appId
25
- } = (0, _utils.requireArgs)('appId', opts);
26
- return await this.isAppInstalled(appId);
37
+ const { appId } = (0, utils_1.requireArgs)('appId', opts);
38
+ return await this.isAppInstalled(appId);
27
39
  };
40
+ /**
41
+ * Queries the current state of the app.
42
+ *
43
+ * @param {string} appId - Application package identifier
44
+ * @returns {number} The corresponding constant, which describes
45
+ * the current application state:
46
+ * 0 - is the app is not installed
47
+ * 1 - if the app is installed, but is not running
48
+ * 3 - if the app is running in the background
49
+ * 4 - if the app is running in the foreground
50
+ */
28
51
  commands.queryAppState = async function queryAppState(appId) {
29
- this.log.info(`Querying the state of '${appId}'`);
30
- if (!(await this.adb.isAppInstalled(appId))) {
31
- return _androidHelpers.APP_STATE.NOT_INSTALLED;
32
- }
33
- if (!(await this.adb.processExists(appId))) {
34
- return _androidHelpers.APP_STATE.NOT_RUNNING;
35
- }
36
- const appIdRe = new RegExp(`\\b${_lodash.default.escapeRegExp(appId)}/`);
37
- for (const line of (await this.adb.dumpWindows()).split('\n')) {
38
- if (appIdRe.test(line) && ['mCurrentFocus', 'mFocusedApp'].some(x => line.includes(x))) {
39
- return _androidHelpers.APP_STATE.RUNNING_IN_FOREGROUND;
52
+ this.log.info(`Querying the state of '${appId}'`);
53
+ if (!await this.adb.isAppInstalled(appId)) {
54
+ return android_helpers_1.APP_STATE.NOT_INSTALLED;
55
+ }
56
+ if (!await this.adb.processExists(appId)) {
57
+ return android_helpers_1.APP_STATE.NOT_RUNNING;
58
+ }
59
+ const appIdRe = new RegExp(`\\b${lodash_1.default.escapeRegExp(appId)}/`);
60
+ for (const line of (await this.adb.dumpWindows()).split('\n')) {
61
+ if (appIdRe.test(line) && ['mCurrentFocus', 'mFocusedApp'].some((x) => line.includes(x))) {
62
+ return android_helpers_1.APP_STATE.RUNNING_IN_FOREGROUND;
63
+ }
40
64
  }
41
- }
42
- return _androidHelpers.APP_STATE.RUNNING_IN_BACKGROUND;
65
+ return android_helpers_1.APP_STATE.RUNNING_IN_BACKGROUND;
43
66
  };
67
+ /**
68
+ * @typedef {Object} MobileQueryAppStateOptions
69
+ * @property {string} appId - Application package identifier. Must be always provided.
70
+ */
71
+ /**
72
+ * Queries the current state of the app.
73
+ *
74
+ * @param {MobileQueryAppStateOptions} opts
75
+ * @returns {number} Same as in `queryAppState`
76
+ */
44
77
  commands.mobileQueryAppState = async function mobileQueryAppState(opts = {}) {
45
- const {
46
- appId
47
- } = (0, _utils.requireArgs)('appId', opts);
48
- return await this.queryAppState(appId);
78
+ const { appId } = (0, utils_1.requireArgs)('appId', opts);
79
+ return await this.queryAppState(appId);
49
80
  };
81
+ /**
82
+ * Activates the given application or launches it if necessary.
83
+ * The action literally simulates
84
+ * clicking the corresponding application icon on the dashboard.
85
+ *
86
+ * @param {string} appId - Application package identifier
87
+ * @throws {Error} If the app cannot be activated
88
+ */
50
89
  commands.activateApp = async function activateApp(appId) {
51
- this.log.debug(`Activating '${appId}'`);
52
- const apiLevel = await this.adb.getApiLevel();
53
- if (apiLevel < 24) {
54
- const cmd = ['monkey', '-p', appId, '-c', 'android.intent.category.LAUNCHER', '1'];
55
- let output = '';
56
- try {
57
- output = await this.adb.shell(cmd);
58
- this.log.debug(`Command stdout: ${output}`);
59
- } catch (e) {
60
- this.log.errorAndThrow(`Cannot activate '${appId}'. Original error: ${e.message}`);
90
+ this.log.debug(`Activating '${appId}'`);
91
+ const apiLevel = await this.adb.getApiLevel();
92
+ // Fallback to Monkey in older APIs
93
+ if (apiLevel < 24) {
94
+ // The monkey command could raise an issue as https://stackoverflow.com/questions/44860475/how-to-use-the-monkey-command-with-an-android-system-that-doesnt-have-physical
95
+ // but '--pct-syskeys 0' could cause another background process issue. https://github.com/appium/appium/issues/16941#issuecomment-1129837285
96
+ const cmd = ['monkey',
97
+ '-p', appId,
98
+ '-c', 'android.intent.category.LAUNCHER',
99
+ '1'];
100
+ let output = '';
101
+ try {
102
+ output = await this.adb.shell(cmd);
103
+ this.log.debug(`Command stdout: ${output}`);
104
+ }
105
+ catch (e) {
106
+ this.log.errorAndThrow(`Cannot activate '${appId}'. Original error: ${e.message}`);
107
+ }
108
+ if (output.includes('monkey aborted')) {
109
+ this.log.errorAndThrow(`Cannot activate '${appId}'. Are you sure it is installed?`);
110
+ }
111
+ return;
112
+ }
113
+ let activityName = await this.adb.resolveLaunchableActivity(appId);
114
+ if (activityName === RESOLVER_ACTIVITY_NAME) {
115
+ // https://github.com/appium/appium/issues/17128
116
+ this.log.debug(`The launchable activity name of '${appId}' was resolved to '${activityName}'. ` +
117
+ `Switching the resolver to not use cmd`);
118
+ activityName = await this.adb.resolveLaunchableActivity(appId, { preferCmd: false });
61
119
  }
62
- if (output.includes('monkey aborted')) {
63
- this.log.errorAndThrow(`Cannot activate '${appId}'. Are you sure it is installed?`);
120
+ const stdout = await this.adb.shell([
121
+ 'am', (apiLevel < 26) ? 'start' : 'start-activity',
122
+ '-a', 'android.intent.action.MAIN',
123
+ '-c', 'android.intent.category.LAUNCHER',
124
+ // FLAG_ACTIVITY_NEW_TASK | FLAG_ACTIVITY_RESET_TASK_IF_NEEDED
125
+ // https://developer.android.com/reference/android/content/Intent#FLAG_ACTIVITY_NEW_TASK
126
+ // https://developer.android.com/reference/android/content/Intent#FLAG_ACTIVITY_RESET_TASK_IF_NEEDED
127
+ '-f', '0x10200000',
128
+ '-n', activityName,
129
+ ]);
130
+ this.log.debug(stdout);
131
+ if (/^error:/mi.test(stdout)) {
132
+ throw new Error(`Cannot activate '${appId}'. Original error: ${stdout}`);
64
133
  }
65
- return;
66
- }
67
- let activityName = await this.adb.resolveLaunchableActivity(appId);
68
- if (activityName === RESOLVER_ACTIVITY_NAME) {
69
- this.log.debug(`The launchable activity name of '${appId}' was resolved to '${activityName}'. ` + `Switching the resolver to not use cmd`);
70
- activityName = await this.adb.resolveLaunchableActivity(appId, {
71
- preferCmd: false
72
- });
73
- }
74
- const stdout = await this.adb.shell(['am', apiLevel < 26 ? 'start' : 'start-activity', '-a', 'android.intent.action.MAIN', '-c', 'android.intent.category.LAUNCHER', '-f', '0x10200000', '-n', activityName]);
75
- this.log.debug(stdout);
76
- if (/^error:/mi.test(stdout)) {
77
- throw new Error(`Cannot activate '${appId}'. Original error: ${stdout}`);
78
- }
79
134
  };
135
+ /**
136
+ * @typedef {Object} MobileActivateAppOptions
137
+ * @property {string} appId - Application package identifier. Must be always provided.
138
+ */
139
+ /**
140
+ * Activates the given application or launches it if necessary.
141
+ * The action literally simulates
142
+ * clicking the corresponding application icon on the dashboard.
143
+ *
144
+ * @param {MobileActivateAppOptions} opts
145
+ * @throws {Error} If the app cannot be activated
146
+ */
80
147
  commands.mobileActivateApp = async function mobileActivateApp(opts = {}) {
81
- const {
82
- appId
83
- } = (0, _utils.requireArgs)('appId', opts);
84
- return await this.activateApp(appId);
148
+ const { appId } = (0, utils_1.requireArgs)('appId', opts);
149
+ return await this.activateApp(appId);
85
150
  };
151
+ /**
152
+ * @typedef {Object} UninstallOptions
153
+ * @property {number} timeout [20000] - The count of milliseconds to wait until the
154
+ * app is uninstalled.
155
+ * @property {boolean} keepData [false] - Set to true in order to keep the
156
+ * application data and cache folders after uninstall.
157
+ */
158
+ /**
159
+ * Remove the corresponding application if is installed.
160
+ * The call is ignored if the app is not installed.
161
+ *
162
+ * @param {string} appId - Application package identifier
163
+ * @param {?UninstallOptions} options - The set of removal options
164
+ * @returns {boolean} True if the package was found on the device and
165
+ * successfully uninstalled.
166
+ */
86
167
  commands.removeApp = async function removeApp(appId, options = {}) {
87
- return await this.adb.uninstallApk(appId, options);
168
+ return await this.adb.uninstallApk(appId, options);
88
169
  };
170
+ /**
171
+ * @typedef {Object} MobileRemoveAppOptions
172
+ * @property {string} appId - Application package identifier. Must be always provided.
173
+ */
174
+ /**
175
+ * Remove the corresponding application if is installed.
176
+ * The call is ignored if the app is not installed.
177
+ *
178
+ * @param {MobileRemoveAppOptions} opts
179
+ * @returns {boolean} Same as in `removeApp`
180
+ */
89
181
  commands.mobileRemoveApp = async function mobileRemoveApp(opts = {}) {
90
- const {
91
- appId
92
- } = (0, _utils.requireArgs)('appId', opts);
93
- return await this.removeApp(appId, opts);
182
+ const { appId } = (0, utils_1.requireArgs)('appId', opts);
183
+ return await this.removeApp(appId, opts);
94
184
  };
185
+ /**
186
+ * @typedef {Object} TerminateOptions
187
+ * @property {number|string} timeout [500] - The count of milliseconds to wait until the
188
+ * app is terminated. The method will skip
189
+ * checking the app state check if the timeout
190
+ * was lower or equal to zero. Then, the return
191
+ * value will be true.
192
+ */
193
+ /**
194
+ * Terminates the app if it is running. If the given timeout was lower or equal to zero,
195
+ * it returns true after terminating the app without checking the app state.
196
+ *
197
+ * @param {string} appId - Application package identifier
198
+ * @param {?TerminateOptions} options - The set of application termination options
199
+ * @returns {boolean} True if the app has been successfully terminated.
200
+ * @throws {Error} if the app has not been terminated within the given timeout.
201
+ */
95
202
  commands.terminateApp = async function terminateApp(appId, options = {}) {
96
- this.log.info(`Terminating '${appId}'`);
97
- if (!(await this.adb.processExists(appId))) {
98
- this.log.info(`The app '${appId}' is not running`);
99
- return false;
100
- }
101
- await this.adb.forceStop(appId);
102
- const timeout = _support.util.hasValue(options.timeout) && !isNaN(options.timeout) ? parseInt(options.timeout, 10) : 500;
103
- if (timeout <= 0) {
104
- this.log.info(`'${appId}' has been terminated. Skip checking the application process state ` + `since the timeout was set as ${timeout}ms`);
203
+ this.log.info(`Terminating '${appId}'`);
204
+ if (!(await this.adb.processExists(appId))) {
205
+ this.log.info(`The app '${appId}' is not running`);
206
+ return false;
207
+ }
208
+ await this.adb.forceStop(appId);
209
+ const timeout = support_1.util.hasValue(options.timeout) && !isNaN(options.timeout) ? parseInt(options.timeout, 10) : 500;
210
+ if (timeout <= 0) {
211
+ this.log.info(`'${appId}' has been terminated. Skip checking the application process state ` +
212
+ `since the timeout was set as ${timeout}ms`);
213
+ return true;
214
+ }
215
+ try {
216
+ await (0, asyncbox_1.waitForCondition)(async () => await this.queryAppState(appId) <= android_helpers_1.APP_STATE.NOT_RUNNING, { waitMs: timeout, intervalMs: 100 });
217
+ }
218
+ catch (e) {
219
+ this.log.errorAndThrow(`'${appId}' is still running after ${timeout}ms timeout`);
220
+ }
221
+ this.log.info(`'${appId}' has been successfully terminated`);
105
222
  return true;
106
- }
107
- try {
108
- await (0, _asyncbox.waitForCondition)(async () => (await this.queryAppState(appId)) <= _androidHelpers.APP_STATE.NOT_RUNNING, {
109
- waitMs: timeout,
110
- intervalMs: 100
111
- });
112
- } catch (e) {
113
- this.log.errorAndThrow(`'${appId}' is still running after ${timeout}ms timeout`);
114
- }
115
- this.log.info(`'${appId}' has been successfully terminated`);
116
- return true;
117
223
  };
224
+ /**
225
+ * @typedef {Object} MobileTerminateAppOptions
226
+ * @property {string} appId - Application package identifier. Must be always provided.
227
+ * @property {number|string} timeout [500] - The count of milliseconds to wait until the
228
+ * app is terminated.
229
+ */
230
+ /**
231
+ * Terminates the app if it is running.
232
+ *
233
+ * @param {MobileTerminateAppOptions} opts
234
+ * @returns {boolean} Same as in `terminateApp`
235
+ * @throws {Error} if the app has not been terminated within the given timeout.
236
+ */
118
237
  commands.mobileTerminateApp = async function mobileTerminateApp(opts = {}) {
119
- const {
120
- appId
121
- } = (0, _utils.requireArgs)('appId', opts);
122
- return await this.terminateApp(appId, opts);
238
+ const { appId } = (0, utils_1.requireArgs)('appId', opts);
239
+ return await this.terminateApp(appId, opts);
123
240
  };
241
+ /**
242
+ * @typedef {Object} InstallOptions
243
+ * @property {number} timeout [60000] - The count of milliseconds to wait until the
244
+ * app is installed.
245
+ * @property {boolean} allowTestPackages [false] - Set to true in order to allow test
246
+ * packages installation.
247
+ * @property {boolean} useSdcard [false] - Set to true to install the app on sdcard
248
+ * instead of the device memory.
249
+ * @property {boolean} grantPermissions [false] - Set to true in order to grant all the
250
+ * permissions requested in the application's manifest
251
+ * automatically after the installation is completed
252
+ * under Android 6+.
253
+ * @property {boolean} replace [true] - Set it to false if you don't want
254
+ * the application to be upgraded/reinstalled
255
+ * if it is already present on the device.
256
+ */
257
+ /**
258
+ * Installs the given application to the device under test
259
+ *
260
+ * @param {string} appPath - The local apk path or a remote url
261
+ * @param {?InstallOptions} options - The set of installation options
262
+ * @throws {Error} if the given apk does not exist or is not reachable
263
+ */
124
264
  commands.installApp = async function installApp(appPath, options = {}) {
125
- const localPath = await this.helpers.configureApp(appPath, APP_EXTENSIONS);
126
- await this.adb.install(localPath, options);
265
+ const localPath = await this.helpers.configureApp(appPath, APP_EXTENSIONS);
266
+ await this.adb.install(localPath, options);
127
267
  };
268
+ /**
269
+ * @typedef {Object} MobileInstallAppOptions
270
+ * @property {string} appPath - The local apk path or a remote url. Must be always provided.
271
+ * @property {number} timeout [60000] - The count of milliseconds to wait until the
272
+ * app is installed.
273
+ * @property {boolean} allowTestPackages [false] - Set to true in order to allow test
274
+ * packages installation.
275
+ * @property {boolean} useSdcard [false] - Set to true to install the app on sdcard
276
+ * instead of the device memory.
277
+ * @property {boolean} grantPermissions [false] - Set to true in order to grant all the
278
+ * permissions requested in the application's manifest
279
+ * automatically after the installation is completed
280
+ * under Android 6+.
281
+ * @property {boolean} replace [true] - Set it to false if you don't want
282
+ * the application to be upgraded/reinstalled
283
+ * if it is already present on the device.
284
+ */
285
+ /**
286
+ * Installs the given application to the device under test
287
+ *
288
+ * @param {MobileInstallAppOptions} opts
289
+ * @throws {Error} if the given apk does not exist or is not reachable
290
+ */
128
291
  commands.mobileInstallApp = async function mobileInstallApp(opts = {}) {
129
- const {
130
- appPath
131
- } = (0, _utils.requireArgs)('appPath', opts);
132
- return await this.installApp(appPath, opts);
292
+ const { appPath } = (0, utils_1.requireArgs)('appPath', opts);
293
+ return await this.installApp(appPath, opts);
133
294
  };
295
+ /**
296
+ * @typedef {Object} ClearAppOptions
297
+ * @property {!string} appId The identifier of the application package to be cleared
298
+ */
299
+ /**
300
+ * Deletes all data associated with a package.
301
+ *
302
+ * @param {ClearAppOptions} opts
303
+ * @throws {Error} If cleaning of the app data fails
304
+ */
134
305
  commands.mobileClearApp = async function mobileClearApp(opts = {}) {
135
- const {
136
- appId
137
- } = opts;
138
- if (!appId) {
139
- throw new _driver.errors.InvalidArgumentError(`The 'appId' argument is required`);
140
- }
141
- await this.adb.clear(appId);
306
+ const { appId } = opts;
307
+ if (!appId) {
308
+ throw new driver_1.errors.InvalidArgumentError(`The 'appId' argument is required`);
309
+ }
310
+ await this.adb.clear(appId);
142
311
  };
143
- var _default = commands;
144
- exports.default = _default;
145
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfbG9kYXNoIiwiX2ludGVyb3BSZXF1aXJlRGVmYXVsdCIsInJlcXVpcmUiLCJfYXN5bmNib3giLCJfc3VwcG9ydCIsIl9hbmRyb2lkSGVscGVycyIsIl9kcml2ZXIiLCJfdXRpbHMiLCJBUFBfRVhURU5TSU9OUyIsIlJFU09MVkVSX0FDVElWSVRZX05BTUUiLCJjb21tYW5kcyIsImV4cG9ydHMiLCJpc0FwcEluc3RhbGxlZCIsImFwcElkIiwiYWRiIiwibW9iaWxlSXNBcHBJbnN0YWxsZWQiLCJvcHRzIiwicmVxdWlyZUFyZ3MiLCJxdWVyeUFwcFN0YXRlIiwibG9nIiwiaW5mbyIsIkFQUF9TVEFURSIsIk5PVF9JTlNUQUxMRUQiLCJwcm9jZXNzRXhpc3RzIiwiTk9UX1JVTk5JTkciLCJhcHBJZFJlIiwiUmVnRXhwIiwiXyIsImVzY2FwZVJlZ0V4cCIsImxpbmUiLCJkdW1wV2luZG93cyIsInNwbGl0IiwidGVzdCIsInNvbWUiLCJ4IiwiaW5jbHVkZXMiLCJSVU5OSU5HX0lOX0ZPUkVHUk9VTkQiLCJSVU5OSU5HX0lOX0JBQ0tHUk9VTkQiLCJtb2JpbGVRdWVyeUFwcFN0YXRlIiwiYWN0aXZhdGVBcHAiLCJkZWJ1ZyIsImFwaUxldmVsIiwiZ2V0QXBpTGV2ZWwiLCJjbWQiLCJvdXRwdXQiLCJzaGVsbCIsImUiLCJlcnJvckFuZFRocm93IiwibWVzc2FnZSIsImFjdGl2aXR5TmFtZSIsInJlc29sdmVMYXVuY2hhYmxlQWN0aXZpdHkiLCJwcmVmZXJDbWQiLCJzdGRvdXQiLCJFcnJvciIsIm1vYmlsZUFjdGl2YXRlQXBwIiwicmVtb3ZlQXBwIiwib3B0aW9ucyIsInVuaW5zdGFsbEFwayIsIm1vYmlsZVJlbW92ZUFwcCIsInRlcm1pbmF0ZUFwcCIsImZvcmNlU3RvcCIsInRpbWVvdXQiLCJ1dGlsIiwiaGFzVmFsdWUiLCJpc05hTiIsInBhcnNlSW50Iiwid2FpdEZvckNvbmRpdGlvbiIsIndhaXRNcyIsImludGVydmFsTXMiLCJtb2JpbGVUZXJtaW5hdGVBcHAiLCJpbnN0YWxsQXBwIiwiYXBwUGF0aCIsImxvY2FsUGF0aCIsImhlbHBlcnMiLCJjb25maWd1cmVBcHAiLCJpbnN0YWxsIiwibW9iaWxlSW5zdGFsbEFwcCIsIm1vYmlsZUNsZWFyQXBwIiwiZXJyb3JzIiwiSW52YWxpZEFyZ3VtZW50RXJyb3IiLCJjbGVhciIsIl9kZWZhdWx0IiwiZGVmYXVsdCJdLCJzb3VyY2VzIjpbIi4uLy4uLy4uL2xpYi9jb21tYW5kcy9hcHAtbWFuYWdlbWVudC5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgXyBmcm9tICdsb2Rhc2gnO1xuaW1wb3J0IHsgd2FpdEZvckNvbmRpdGlvbiB9IGZyb20gJ2FzeW5jYm94JztcbmltcG9ydCB7IHV0aWwgfSBmcm9tICdAYXBwaXVtL3N1cHBvcnQnO1xuaW1wb3J0IHsgQVBQX1NUQVRFIH0gZnJvbSAnLi4vYW5kcm9pZC1oZWxwZXJzJztcbmltcG9ydCB7IGVycm9ycyB9IGZyb20gJ2FwcGl1bS9kcml2ZXInO1xuaW1wb3J0IHsgcmVxdWlyZUFyZ3MgfSBmcm9tICcuLi91dGlscyc7XG5cbmNvbnN0IEFQUF9FWFRFTlNJT05TID0gWycuYXBrJywgJy5hcGtzJ107XG5jb25zdCBSRVNPTFZFUl9BQ1RJVklUWV9OQU1FID0gJ2FuZHJvaWQvY29tLmFuZHJvaWQuaW50ZXJuYWwuYXBwLlJlc29sdmVyQWN0aXZpdHknO1xuXG5jb25zdCBjb21tYW5kcyA9IHt9O1xuXG4vKipcbiAqIFZlcmlmeSB3aGV0aGVyIGFuIGFwcGxpY2F0aW9uIGlzIGluc3RhbGxlZCBvciBub3RcbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gYXBwSWQgLSBBcHBsaWNhdGlvbiBwYWNrYWdlIGlkZW50aWZpZXJcbiAqIEByZXR1cm5zIHtib29sZWFufSB0cnVlIGlmIHRoZSBhcHAgaXMgaW5zdGFsbGVkXG4gKi9cbmNvbW1hbmRzLmlzQXBwSW5zdGFsbGVkID0gYXN5bmMgZnVuY3Rpb24gaXNBcHBJbnN0YWxsZWQgKGFwcElkKSB7XG4gIHJldHVybiBhd2FpdCB0aGlzLmFkYi5pc0FwcEluc3RhbGxlZChhcHBJZCk7XG59O1xuXG4vKipcbiAqIEB0eXBlZGVmIHtPYmplY3R9IE1vYmlsZUFwcEluc3RhbGxlZE9wdGlvbnNcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBhcHBJZCAtIEFwcGxpY2F0aW9uIHBhY2thZ2UgaWRlbnRpZmllci4gTXVzdCBiZSBhbHdheXMgcHJvdmlkZWQuXG4gKi9cblxuLyoqXG4gKiBWZXJpZnkgd2hldGhlciBhbiBhcHBsaWNhdGlvbiBpcyBpbnN0YWxsZWQgb3Igbm90XG4gKlxuICogQHBhcmFtIHtNb2JpbGVBcHBJbnN0YWxsZWRPcHRpb25zfSBvcHRzXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gU2FtZSBhcyBpbiBgaXNBcHBJbnN0YWxsZWRgXG4gKi9cbmNvbW1hbmRzLm1vYmlsZUlzQXBwSW5zdGFsbGVkID0gYXN5bmMgZnVuY3Rpb24gbW9iaWxlSXNBcHBJbnN0YWxsZWQgKG9wdHMgPSB7fSkge1xuICBjb25zdCB7IGFwcElkIH0gPSByZXF1aXJlQXJncygnYXBwSWQnLCBvcHRzKTtcbiAgcmV0dXJuIGF3YWl0IHRoaXMuaXNBcHBJbnN0YWxsZWQoYXBwSWQpO1xufTtcblxuLyoqXG4gKiBRdWVyaWVzIHRoZSBjdXJyZW50IHN0YXRlIG9mIHRoZSBhcHAuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IGFwcElkIC0gQXBwbGljYXRpb24gcGFja2FnZSBpZGVudGlmaWVyXG4gKiBAcmV0dXJucyB7bnVtYmVyfSBUaGUgY29ycmVzcG9uZGluZyBjb25zdGFudCwgd2hpY2ggZGVzY3JpYmVzXG4gKiAgICAgICAgICAgICAgICAgICB0aGUgY3VycmVudCBhcHBsaWNhdGlvbiBzdGF0ZTpcbiAqIDAgLSBpcyB0aGUgYXBwIGlzIG5vdCBpbnN0YWxsZWRcbiAqIDEgLSBpZiB0aGUgYXBwIGlzIGluc3RhbGxlZCwgYnV0IGlzIG5vdCBydW5uaW5nXG4gKiAzIC0gaWYgdGhlIGFwcCBpcyBydW5uaW5nIGluIHRoZSBiYWNrZ3JvdW5kXG4gKiA0IC0gaWYgdGhlIGFwcCBpcyBydW5uaW5nIGluIHRoZSBmb3JlZ3JvdW5kXG4gKi9cbmNvbW1hbmRzLnF1ZXJ5QXBwU3RhdGUgPSBhc3luYyBmdW5jdGlvbiBxdWVyeUFwcFN0YXRlIChhcHBJZCkge1xuICB0aGlzLmxvZy5pbmZvKGBRdWVyeWluZyB0aGUgc3RhdGUgb2YgJyR7YXBwSWR9J2ApO1xuICBpZiAoIWF3YWl0IHRoaXMuYWRiLmlzQXBwSW5zdGFsbGVkKGFwcElkKSkge1xuICAgIHJldHVybiBBUFBfU1RBVEUuTk9UX0lOU1RBTExFRDtcbiAgfVxuICBpZiAoIWF3YWl0IHRoaXMuYWRiLnByb2Nlc3NFeGlzdHMoYXBwSWQpKSB7XG4gICAgcmV0dXJuIEFQUF9TVEFURS5OT1RfUlVOTklORztcbiAgfVxuICBjb25zdCBhcHBJZFJlID0gbmV3IFJlZ0V4cChgXFxcXGIke18uZXNjYXBlUmVnRXhwKGFwcElkKX0vYCk7XG4gIGZvciAoY29uc3QgbGluZSBvZiAoYXdhaXQgdGhpcy5hZGIuZHVtcFdpbmRvd3MoKSkuc3BsaXQoJ1xcbicpKSB7XG4gICAgaWYgKGFwcElkUmUudGVzdChsaW5lKSAmJiBbJ21DdXJyZW50Rm9jdXMnLCAnbUZvY3VzZWRBcHAnXS5zb21lKCh4KSA9PiBsaW5lLmluY2x1ZGVzKHgpKSkge1xuICAgICAgcmV0dXJuIEFQUF9TVEFURS5SVU5OSU5HX0lOX0ZPUkVHUk9VTkQ7XG4gICAgfVxuICB9XG4gIHJldHVybiBBUFBfU1RBVEUuUlVOTklOR19JTl9CQUNLR1JPVU5EO1xufTtcblxuLyoqXG4gKiBAdHlwZWRlZiB7T2JqZWN0fSBNb2JpbGVRdWVyeUFwcFN0YXRlT3B0aW9uc1xuICogQHByb3BlcnR5IHtzdHJpbmd9IGFwcElkIC0gQXBwbGljYXRpb24gcGFja2FnZSBpZGVudGlmaWVyLiBNdXN0IGJlIGFsd2F5cyBwcm92aWRlZC5cbiAqL1xuXG4vKipcbiAqIFF1ZXJpZXMgdGhlIGN1cnJlbnQgc3RhdGUgb2YgdGhlIGFwcC5cbiAqXG4gKiBAcGFyYW0ge01vYmlsZVF1ZXJ5QXBwU3RhdGVPcHRpb25zfSBvcHRzXG4gKiBAcmV0dXJucyB7bnVtYmVyfSBTYW1lIGFzIGluIGBxdWVyeUFwcFN0YXRlYFxuICovXG5jb21tYW5kcy5tb2JpbGVRdWVyeUFwcFN0YXRlID0gYXN5bmMgZnVuY3Rpb24gbW9iaWxlUXVlcnlBcHBTdGF0ZSAob3B0cyA9IHt9KSB7XG4gIGNvbnN0IHsgYXBwSWQgfSA9IHJlcXVpcmVBcmdzKCdhcHBJZCcsIG9wdHMpO1xuICByZXR1cm4gYXdhaXQgdGhpcy5xdWVyeUFwcFN0YXRlKGFwcElkKTtcbn07XG5cbi8qKlxuICogQWN0aXZhdGVzIHRoZSBnaXZlbiBhcHBsaWNhdGlvbiBvciBsYXVuY2hlcyBpdCBpZiBuZWNlc3NhcnkuXG4gKiBUaGUgYWN0aW9uIGxpdGVyYWxseSBzaW11bGF0ZXNcbiAqIGNsaWNraW5nIHRoZSBjb3JyZXNwb25kaW5nIGFwcGxpY2F0aW9uIGljb24gb24gdGhlIGRhc2hib2FyZC5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gYXBwSWQgLSBBcHBsaWNhdGlvbiBwYWNrYWdlIGlkZW50aWZpZXJcbiAqIEB0aHJvd3Mge0Vycm9yfSBJZiB0aGUgYXBwIGNhbm5vdCBiZSBhY3RpdmF0ZWRcbiAqL1xuY29tbWFuZHMuYWN0aXZhdGVBcHAgPSBhc3luYyBmdW5jdGlvbiBhY3RpdmF0ZUFwcCAoYXBwSWQpIHtcbiAgdGhpcy5sb2cuZGVidWcoYEFjdGl2YXRpbmcgJyR7YXBwSWR9J2ApO1xuICBjb25zdCBhcGlMZXZlbCA9IGF3YWl0IHRoaXMuYWRiLmdldEFwaUxldmVsKCk7XG4gIC8vIEZhbGxiYWNrIHRvIE1vbmtleSBpbiBvbGRlciBBUElzXG4gIGlmIChhcGlMZXZlbCA8IDI0KSB7XG4gICAgLy8gVGhlIG1vbmtleSBjb21tYW5kIGNvdWxkIHJhaXNlIGFuIGlzc3VlIGFzIGh0dHBzOi8vc3RhY2tvdmVyZmxvdy5jb20vcXVlc3Rpb25zLzQ0ODYwNDc1L2hvdy10by11c2UtdGhlLW1vbmtleS1jb21tYW5kLXdpdGgtYW4tYW5kcm9pZC1zeXN0ZW0tdGhhdC1kb2VzbnQtaGF2ZS1waHlzaWNhbFxuICAgIC8vIGJ1dCAnLS1wY3Qtc3lza2V5cyAwJyBjb3VsZCBjYXVzZSBhbm90aGVyIGJhY2tncm91bmQgcHJvY2VzcyBpc3N1ZS4gaHR0cHM6Ly9naXRodWIuY29tL2FwcGl1bS9hcHBpdW0vaXNzdWVzLzE2OTQxI2lzc3VlY29tbWVudC0xMTI5ODM3Mjg1XG4gICAgY29uc3QgY21kID0gWydtb25rZXknLFxuICAgICAgJy1wJywgYXBwSWQsXG4gICAgICAnLWMnLCAnYW5kcm9pZC5pbnRlbnQuY2F0ZWdvcnkuTEFVTkNIRVInLFxuICAgICAgJzEnXTtcbiAgICBsZXQgb3V0cHV0ID0gJyc7XG4gICAgdHJ5IHtcbiAgICAgIG91dHB1dCA9IGF3YWl0IHRoaXMuYWRiLnNoZWxsKGNtZCk7XG4gICAgICB0aGlzLmxvZy5kZWJ1ZyhgQ29tbWFuZCBzdGRvdXQ6ICR7b3V0cHV0fWApO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIHRoaXMubG9nLmVycm9yQW5kVGhyb3coYENhbm5vdCBhY3RpdmF0ZSAnJHthcHBJZH0nLiBPcmlnaW5hbCBlcnJvcjogJHtlLm1lc3NhZ2V9YCk7XG4gICAgfVxuICAgIGlmIChvdXRwdXQuaW5jbHVkZXMoJ21vbmtleSBhYm9ydGVkJykpIHtcbiAgICAgIHRoaXMubG9nLmVycm9yQW5kVGhyb3coYENhbm5vdCBhY3RpdmF0ZSAnJHthcHBJZH0nLiBBcmUgeW91IHN1cmUgaXQgaXMgaW5zdGFsbGVkP2ApO1xuICAgIH1cbiAgICByZXR1cm47XG4gIH1cblxuICBsZXQgYWN0aXZpdHlOYW1lID0gYXdhaXQgdGhpcy5hZGIucmVzb2x2ZUxhdW5jaGFibGVBY3Rpdml0eShhcHBJZCk7XG4gIGlmIChhY3Rpdml0eU5hbWUgPT09IFJFU09MVkVSX0FDVElWSVRZX05BTUUpIHtcbiAgICAvLyBodHRwczovL2dpdGh1Yi5jb20vYXBwaXVtL2FwcGl1bS9pc3N1ZXMvMTcxMjhcbiAgICB0aGlzLmxvZy5kZWJ1ZyhcbiAgICAgIGBUaGUgbGF1bmNoYWJsZSBhY3Rpdml0eSBuYW1lIG9mICcke2FwcElkfScgd2FzIHJlc29sdmVkIHRvICcke2FjdGl2aXR5TmFtZX0nLiBgICtcbiAgICAgIGBTd2l0Y2hpbmcgdGhlIHJlc29sdmVyIHRvIG5vdCB1c2UgY21kYFxuICAgICk7XG4gICAgYWN0aXZpdHlOYW1lID0gYXdhaXQgdGhpcy5hZGIucmVzb2x2ZUxhdW5jaGFibGVBY3Rpdml0eShhcHBJZCwge3ByZWZlckNtZDogZmFsc2V9KTtcbiAgfVxuXG4gIGNvbnN0IHN0ZG91dCA9IGF3YWl0IHRoaXMuYWRiLnNoZWxsKFtcbiAgICAnYW0nLCAoYXBpTGV2ZWwgPCAyNikgPyAnc3RhcnQnIDogJ3N0YXJ0LWFjdGl2aXR5JyxcbiAgICAnLWEnLCAnYW5kcm9pZC5pbnRlbnQuYWN0aW9uLk1BSU4nLFxuICAgICctYycsICdhbmRyb2lkLmludGVudC5jYXRlZ29yeS5MQVVOQ0hFUicsXG4gICAgLy8gRkxBR19BQ1RJVklUWV9ORVdfVEFTSyB8IEZMQUdfQUNUSVZJVFlfUkVTRVRfVEFTS19JRl9ORUVERURcbiAgICAvLyBodHRwczovL2RldmVsb3Blci5hbmRyb2lkLmNvbS9yZWZlcmVuY2UvYW5kcm9pZC9jb250ZW50L0ludGVudCNGTEFHX0FDVElWSVRZX05FV19UQVNLXG4gICAgLy8gaHR0cHM6Ly9kZXZlbG9wZXIuYW5kcm9pZC5jb20vcmVmZXJlbmNlL2FuZHJvaWQvY29udGVudC9JbnRlbnQjRkxBR19BQ1RJVklUWV9SRVNFVF9UQVNLX0lGX05FRURFRFxuICAgICctZicsICcweDEwMjAwMDAwJyxcbiAgICAnLW4nLCBhY3Rpdml0eU5hbWUsXG4gIF0pO1xuICB0aGlzLmxvZy5kZWJ1ZyhzdGRvdXQpO1xuICBpZiAoL15lcnJvcjovbWkudGVzdChzdGRvdXQpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBDYW5ub3QgYWN0aXZhdGUgJyR7YXBwSWR9Jy4gT3JpZ2luYWwgZXJyb3I6ICR7c3Rkb3V0fWApO1xuICB9XG59O1xuXG4vKipcbiAqIEB0eXBlZGVmIHtPYmplY3R9IE1vYmlsZUFjdGl2YXRlQXBwT3B0aW9uc1xuICogQHByb3BlcnR5IHtzdHJpbmd9IGFwcElkIC0gQXBwbGljYXRpb24gcGFja2FnZSBpZGVudGlmaWVyLiBNdXN0IGJlIGFsd2F5cyBwcm92aWRlZC5cbiAqL1xuXG4vKipcbiAqIEFjdGl2YXRlcyB0aGUgZ2l2ZW4gYXBwbGljYXRpb24gb3IgbGF1bmNoZXMgaXQgaWYgbmVjZXNzYXJ5LlxuICogVGhlIGFjdGlvbiBsaXRlcmFsbHkgc2ltdWxhdGVzXG4gKiBjbGlja2luZyB0aGUgY29ycmVzcG9uZGluZyBhcHBsaWNhdGlvbiBpY29uIG9uIHRoZSBkYXNoYm9hcmQuXG4gKlxuICogQHBhcmFtIHtNb2JpbGVBY3RpdmF0ZUFwcE9wdGlvbnN9IG9wdHNcbiAqIEB0aHJvd3Mge0Vycm9yfSBJZiB0aGUgYXBwIGNhbm5vdCBiZSBhY3RpdmF0ZWRcbiAqL1xuY29tbWFuZHMubW9iaWxlQWN0aXZhdGVBcHAgPSBhc3luYyBmdW5jdGlvbiBtb2JpbGVBY3RpdmF0ZUFwcCAob3B0cyA9IHt9KSB7XG4gIGNvbnN0IHsgYXBwSWQgfSA9IHJlcXVpcmVBcmdzKCdhcHBJZCcsIG9wdHMpO1xuICByZXR1cm4gYXdhaXQgdGhpcy5hY3RpdmF0ZUFwcChhcHBJZCk7XG59O1xuXG4vKipcbiAqIEB0eXBlZGVmIHtPYmplY3R9IFVuaW5zdGFsbE9wdGlvbnNcbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSB0aW1lb3V0IFsyMDAwMF0gLSBUaGUgY291bnQgb2YgbWlsbGlzZWNvbmRzIHRvIHdhaXQgdW50aWwgdGhlXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXBwIGlzIHVuaW5zdGFsbGVkLlxuICogQHByb3BlcnR5IHtib29sZWFufSBrZWVwRGF0YSBbZmFsc2VdIC0gU2V0IHRvIHRydWUgaW4gb3JkZXIgdG8ga2VlcCB0aGVcbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFwcGxpY2F0aW9uIGRhdGEgYW5kIGNhY2hlIGZvbGRlcnMgYWZ0ZXIgdW5pbnN0YWxsLlxuICovXG5cbi8qKlxuICogUmVtb3ZlIHRoZSBjb3JyZXNwb25kaW5nIGFwcGxpY2F0aW9uIGlmIGlzIGluc3RhbGxlZC5cbiAqIFRoZSBjYWxsIGlzIGlnbm9yZWQgaWYgdGhlIGFwcCBpcyBub3QgaW5zdGFsbGVkLlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBhcHBJZCAtIEFwcGxpY2F0aW9uIHBhY2thZ2UgaWRlbnRpZmllclxuICogQHBhcmFtIHs/VW5pbnN0YWxsT3B0aW9uc30gb3B0aW9ucyAtIFRoZSBzZXQgb2YgcmVtb3ZhbCBvcHRpb25zXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gVHJ1ZSBpZiB0aGUgcGFja2FnZSB3YXMgZm91bmQgb24gdGhlIGRldmljZSBhbmRcbiAqICAgICAgICAgICAgICAgICAgICBzdWNjZXNzZnVsbHkgdW5pbnN0YWxsZWQuXG4gKi9cbmNvbW1hbmRzLnJlbW92ZUFwcCA9IGFzeW5jIGZ1bmN0aW9uIHJlbW92ZUFwcCAoYXBwSWQsIG9wdGlvbnMgPSB7fSkge1xuICByZXR1cm4gYXdhaXQgdGhpcy5hZGIudW5pbnN0YWxsQXBrKGFwcElkLCBvcHRpb25zKTtcbn07XG5cbi8qKlxuICogQHR5cGVkZWYge09iamVjdH0gTW9iaWxlUmVtb3ZlQXBwT3B0aW9uc1xuICogQHByb3BlcnR5IHtzdHJpbmd9IGFwcElkIC0gQXBwbGljYXRpb24gcGFja2FnZSBpZGVudGlmaWVyLiBNdXN0IGJlIGFsd2F5cyBwcm92aWRlZC5cbiAqL1xuXG4vKipcbiAqIFJlbW92ZSB0aGUgY29ycmVzcG9uZGluZyBhcHBsaWNhdGlvbiBpZiBpcyBpbnN0YWxsZWQuXG4gKiBUaGUgY2FsbCBpcyBpZ25vcmVkIGlmIHRoZSBhcHAgaXMgbm90IGluc3RhbGxlZC5cbiAqXG4gKiBAcGFyYW0ge01vYmlsZVJlbW92ZUFwcE9wdGlvbnN9IG9wdHNcbiAqIEByZXR1cm5zIHtib29sZWFufSBTYW1lIGFzIGluIGByZW1vdmVBcHBgXG4gKi9cbmNvbW1hbmRzLm1vYmlsZVJlbW92ZUFwcCA9IGFzeW5jIGZ1bmN0aW9uIG1vYmlsZVJlbW92ZUFwcCAob3B0cyA9IHt9KSB7XG4gIGNvbnN0IHsgYXBwSWQgfSA9IHJlcXVpcmVBcmdzKCdhcHBJZCcsIG9wdHMpO1xuICByZXR1cm4gYXdhaXQgdGhpcy5yZW1vdmVBcHAoYXBwSWQsIG9wdHMpO1xufTtcblxuLyoqXG4gKiBAdHlwZWRlZiB7T2JqZWN0fSBUZXJtaW5hdGVPcHRpb25zXG4gKiBAcHJvcGVydHkge251bWJlcnxzdHJpbmd9IHRpbWVvdXQgWzUwMF0gLSBUaGUgY291bnQgb2YgbWlsbGlzZWNvbmRzIHRvIHdhaXQgdW50aWwgdGhlXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcHAgaXMgdGVybWluYXRlZC4gVGhlIG1ldGhvZCB3aWxsIHNraXBcbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoZWNraW5nIHRoZSBhcHAgc3RhdGUgY2hlY2sgaWYgdGhlIHRpbWVvdXRcbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdhcyBsb3dlciBvciBlcXVhbCB0byB6ZXJvLiBUaGVuLCB0aGUgcmV0dXJuXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSB3aWxsIGJlIHRydWUuXG4gKi9cblxuLyoqXG4gKiBUZXJtaW5hdGVzIHRoZSBhcHAgaWYgaXQgaXMgcnVubmluZy4gSWYgdGhlIGdpdmVuIHRpbWVvdXQgd2FzIGxvd2VyIG9yIGVxdWFsIHRvIHplcm8sXG4gKiBpdCByZXR1cm5zIHRydWUgYWZ0ZXIgdGVybWluYXRpbmcgdGhlIGFwcCB3aXRob3V0IGNoZWNraW5nIHRoZSBhcHAgc3RhdGUuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IGFwcElkIC0gQXBwbGljYXRpb24gcGFja2FnZSBpZGVudGlmaWVyXG4gKiBAcGFyYW0gez9UZXJtaW5hdGVPcHRpb25zfSBvcHRpb25zIC0gVGhlIHNldCBvZiBhcHBsaWNhdGlvbiB0ZXJtaW5hdGlvbiBvcHRpb25zXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gVHJ1ZSBpZiB0aGUgYXBwIGhhcyBiZWVuIHN1Y2Nlc3NmdWxseSB0ZXJtaW5hdGVkLlxuICogQHRocm93cyB7RXJyb3J9IGlmIHRoZSBhcHAgaGFzIG5vdCBiZWVuIHRlcm1pbmF0ZWQgd2l0aGluIHRoZSBnaXZlbiB0aW1lb3V0LlxuICovXG5jb21tYW5kcy50ZXJtaW5hdGVBcHAgPSBhc3luYyBmdW5jdGlvbiB0ZXJtaW5hdGVBcHAgKGFwcElkLCBvcHRpb25zID0ge30pIHtcbiAgdGhpcy5sb2cuaW5mbyhgVGVybWluYXRpbmcgJyR7YXBwSWR9J2ApO1xuICBpZiAoIShhd2FpdCB0aGlzLmFkYi5wcm9jZXNzRXhpc3RzKGFwcElkKSkpIHtcbiAgICB0aGlzLmxvZy5pbmZvKGBUaGUgYXBwICcke2FwcElkfScgaXMgbm90IHJ1bm5pbmdgKTtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgYXdhaXQgdGhpcy5hZGIuZm9yY2VTdG9wKGFwcElkKTtcbiAgY29uc3QgdGltZW91dCA9IHV0aWwuaGFzVmFsdWUob3B0aW9ucy50aW1lb3V0KSAmJiAhaXNOYU4ob3B0aW9ucy50aW1lb3V0KSA/IHBhcnNlSW50KG9wdGlvbnMudGltZW91dCwgMTApIDogNTAwO1xuXG4gIGlmICh0aW1lb3V0IDw9IDApIHtcbiAgICB0aGlzLmxvZy5pbmZvKGAnJHthcHBJZH0nIGhhcyBiZWVuIHRlcm1pbmF0ZWQuIFNraXAgY2hlY2tpbmcgdGhlIGFwcGxpY2F0aW9uIHByb2Nlc3Mgc3RhdGUgYCArXG4gICAgICBgc2luY2UgdGhlIHRpbWVvdXQgd2FzIHNldCBhcyAke3RpbWVvdXR9bXNgKTtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIHRyeSB7XG4gICAgYXdhaXQgd2FpdEZvckNvbmRpdGlvbihhc3luYyAoKSA9PiBhd2FpdCB0aGlzLnF1ZXJ5QXBwU3RhdGUoYXBwSWQpIDw9IEFQUF9TVEFURS5OT1RfUlVOTklORyxcbiAgICAgIHt3YWl0TXM6IHRpbWVvdXQsIGludGVydmFsTXM6IDEwMH0pO1xuICB9IGNhdGNoIChlKSB7XG4gICAgdGhpcy5sb2cuZXJyb3JBbmRUaHJvdyhgJyR7YXBwSWR9JyBpcyBzdGlsbCBydW5uaW5nIGFmdGVyICR7dGltZW91dH1tcyB0aW1lb3V0YCk7XG4gIH1cbiAgdGhpcy5sb2cuaW5mbyhgJyR7YXBwSWR9JyBoYXMgYmVlbiBzdWNjZXNzZnVsbHkgdGVybWluYXRlZGApO1xuICByZXR1cm4gdHJ1ZTtcbn07XG5cbi8qKlxuICogQHR5cGVkZWYge09iamVjdH0gTW9iaWxlVGVybWluYXRlQXBwT3B0aW9uc1xuICogQHByb3BlcnR5IHtzdHJpbmd9IGFwcElkIC0gQXBwbGljYXRpb24gcGFja2FnZSBpZGVudGlmaWVyLiBNdXN0IGJlIGFsd2F5cyBwcm92aWRlZC5cbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfHN0cmluZ30gdGltZW91dCBbNTAwXSAtIFRoZSBjb3VudCBvZiBtaWxsaXNlY29uZHMgdG8gd2FpdCB1bnRpbCB0aGVcbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFwcCBpcyB0ZXJtaW5hdGVkLlxuICovXG5cbi8qKlxuICogVGVybWluYXRlcyB0aGUgYXBwIGlmIGl0IGlzIHJ1bm5pbmcuXG4gKlxuICogQHBhcmFtIHtNb2JpbGVUZXJtaW5hdGVBcHBPcHRpb25zfSBvcHRzXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gU2FtZSBhcyBpbiBgdGVybWluYXRlQXBwYFxuICogQHRocm93cyB7RXJyb3J9IGlmIHRoZSBhcHAgaGFzIG5vdCBiZWVuIHRlcm1pbmF0ZWQgd2l0aGluIHRoZSBnaXZlbiB0aW1lb3V0LlxuICovXG5jb21tYW5kcy5tb2JpbGVUZXJtaW5hdGVBcHAgPSBhc3luYyBmdW5jdGlvbiBtb2JpbGVUZXJtaW5hdGVBcHAgKG9wdHMgPSB7fSkge1xuICBjb25zdCB7IGFwcElkIH0gPSByZXF1aXJlQXJncygnYXBwSWQnLCBvcHRzKTtcbiAgcmV0dXJuIGF3YWl0IHRoaXMudGVybWluYXRlQXBwKGFwcElkLCBvcHRzKTtcbn07XG5cbi8qKlxuICogQHR5cGVkZWYge09iamVjdH0gSW5zdGFsbE9wdGlvbnNcbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSB0aW1lb3V0IFs2MDAwMF0gLSBUaGUgY291bnQgb2YgbWlsbGlzZWNvbmRzIHRvIHdhaXQgdW50aWwgdGhlXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXBwIGlzIGluc3RhbGxlZC5cbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gYWxsb3dUZXN0UGFja2FnZXMgW2ZhbHNlXSAtIFNldCB0byB0cnVlIGluIG9yZGVyIHRvIGFsbG93IHRlc3RcbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhY2thZ2VzIGluc3RhbGxhdGlvbi5cbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gdXNlU2RjYXJkIFtmYWxzZV0gLSBTZXQgdG8gdHJ1ZSB0byBpbnN0YWxsIHRoZSBhcHAgb24gc2RjYXJkXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5zdGVhZCBvZiB0aGUgZGV2aWNlIG1lbW9yeS5cbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gZ3JhbnRQZXJtaXNzaW9ucyBbZmFsc2VdIC0gU2V0IHRvIHRydWUgaW4gb3JkZXIgdG8gZ3JhbnQgYWxsIHRoZVxuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwZXJtaXNzaW9ucyByZXF1ZXN0ZWQgaW4gdGhlIGFwcGxpY2F0aW9uJ3MgbWFuaWZlc3RcbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXV0b21hdGljYWxseSBhZnRlciB0aGUgaW5zdGFsbGF0aW9uIGlzIGNvbXBsZXRlZFxuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bmRlciBBbmRyb2lkIDYrLlxuICogQHByb3BlcnR5IHtib29sZWFufSByZXBsYWNlIFt0cnVlXSAtIFNldCBpdCB0byBmYWxzZSBpZiB5b3UgZG9uJ3Qgd2FudFxuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBhcHBsaWNhdGlvbiB0byBiZSB1cGdyYWRlZC9yZWluc3RhbGxlZFxuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIGl0IGlzIGFscmVhZHkgcHJlc2VudCBvbiB0aGUgZGV2aWNlLlxuICovXG5cbi8qKlxuICogSW5zdGFsbHMgdGhlIGdpdmVuIGFwcGxpY2F0aW9uIHRvIHRoZSBkZXZpY2UgdW5kZXIgdGVzdFxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBhcHBQYXRoIC0gVGhlIGxvY2FsIGFwayBwYXRoIG9yIGEgcmVtb3RlIHVybFxuICogQHBhcmFtIHs/SW5zdGFsbE9wdGlvbnN9IG9wdGlvbnMgLSBUaGUgc2V0IG9mIGluc3RhbGxhdGlvbiBvcHRpb25zXG4gKiBAdGhyb3dzIHtFcnJvcn0gaWYgdGhlIGdpdmVuIGFwayBkb2VzIG5vdCBleGlzdCBvciBpcyBub3QgcmVhY2hhYmxlXG4gKi9cbmNvbW1hbmRzLmluc3RhbGxBcHAgPSBhc3luYyBmdW5jdGlvbiBpbnN0YWxsQXBwIChhcHBQYXRoLCBvcHRpb25zID0ge30pIHtcbiAgY29uc3QgbG9jYWxQYXRoID0gYXdhaXQgdGhpcy5oZWxwZXJzLmNvbmZpZ3VyZUFwcChhcHBQYXRoLCBBUFBfRVhURU5TSU9OUyk7XG4gIGF3YWl0IHRoaXMuYWRiLmluc3RhbGwobG9jYWxQYXRoLCBvcHRpb25zKTtcbn07XG5cbi8qKlxuICogQHR5cGVkZWYge09iamVjdH0gTW9iaWxlSW5zdGFsbEFwcE9wdGlvbnNcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBhcHBQYXRoIC0gVGhlIGxvY2FsIGFwayBwYXRoIG9yIGEgcmVtb3RlIHVybC4gTXVzdCBiZSBhbHdheXMgcHJvdmlkZWQuXG4gKiBAcHJvcGVydHkge251bWJlcn0gdGltZW91dCBbNjAwMDBdIC0gVGhlIGNvdW50IG9mIG1pbGxpc2Vjb25kcyB0byB3YWl0IHVudGlsIHRoZVxuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFwcCBpcyBpbnN0YWxsZWQuXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IGFsbG93VGVzdFBhY2thZ2VzIFtmYWxzZV0gLSBTZXQgdG8gdHJ1ZSBpbiBvcmRlciB0byBhbGxvdyB0ZXN0XG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYWNrYWdlcyBpbnN0YWxsYXRpb24uXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IHVzZVNkY2FyZCBbZmFsc2VdIC0gU2V0IHRvIHRydWUgdG8gaW5zdGFsbCB0aGUgYXBwIG9uIHNkY2FyZFxuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluc3RlYWQgb2YgdGhlIGRldmljZSBtZW1vcnkuXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IGdyYW50UGVybWlzc2lvbnMgW2ZhbHNlXSAtIFNldCB0byB0cnVlIGluIG9yZGVyIHRvIGdyYW50IGFsbCB0aGVcbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGVybWlzc2lvbnMgcmVxdWVzdGVkIGluIHRoZSBhcHBsaWNhdGlvbidzIG1hbmlmZXN0XG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1dG9tYXRpY2FsbHkgYWZ0ZXIgdGhlIGluc3RhbGxhdGlvbiBpcyBjb21wbGV0ZWRcbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5kZXIgQW5kcm9pZCA2Ky5cbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gcmVwbGFjZSBbdHJ1ZV0gLSBTZXQgaXQgdG8gZmFsc2UgaWYgeW91IGRvbid0IHdhbnRcbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgYXBwbGljYXRpb24gdG8gYmUgdXBncmFkZWQvcmVpbnN0YWxsZWRcbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiBpdCBpcyBhbHJlYWR5IHByZXNlbnQgb24gdGhlIGRldmljZS5cbiAqL1xuXG4vKipcbiAqIEluc3RhbGxzIHRoZSBnaXZlbiBhcHBsaWNhdGlvbiB0byB0aGUgZGV2aWNlIHVuZGVyIHRlc3RcbiAqXG4gKiBAcGFyYW0ge01vYmlsZUluc3RhbGxBcHBPcHRpb25zfSBvcHRzXG4gKiBAdGhyb3dzIHtFcnJvcn0gaWYgdGhlIGdpdmVuIGFwayBkb2VzIG5vdCBleGlzdCBvciBpcyBub3QgcmVhY2hhYmxlXG4gKi9cbmNvbW1hbmRzLm1vYmlsZUluc3RhbGxBcHAgPSBhc3luYyBmdW5jdGlvbiBtb2JpbGVJbnN0YWxsQXBwIChvcHRzID0ge30pIHtcbiAgY29uc3QgeyBhcHBQYXRoIH0gPSByZXF1aXJlQXJncygnYXBwUGF0aCcsIG9wdHMpO1xuICByZXR1cm4gYXdhaXQgdGhpcy5pbnN0YWxsQXBwKGFwcFBhdGgsIG9wdHMpO1xufTtcblxuLyoqXG4gKiBAdHlwZWRlZiB7T2JqZWN0fSBDbGVhckFwcE9wdGlvbnNcbiAqIEBwcm9wZXJ0eSB7IXN0cmluZ30gYXBwSWQgVGhlIGlkZW50aWZpZXIgb2YgdGhlIGFwcGxpY2F0aW9uIHBhY2thZ2UgdG8gYmUgY2xlYXJlZFxuICovXG5cbi8qKlxuICogRGVsZXRlcyBhbGwgZGF0YSBhc3NvY2lhdGVkIHdpdGggYSBwYWNrYWdlLlxuICpcbiAqIEBwYXJhbSB7Q2xlYXJBcHBPcHRpb25zfSBvcHRzXG4gKiBAdGhyb3dzIHtFcnJvcn0gSWYgY2xlYW5pbmcgb2YgdGhlIGFwcCBkYXRhIGZhaWxzXG4gKi9cbmNvbW1hbmRzLm1vYmlsZUNsZWFyQXBwID0gYXN5bmMgZnVuY3Rpb24gbW9iaWxlQ2xlYXJBcHAgKG9wdHMgPSB7fSkge1xuICBjb25zdCB7YXBwSWR9ID0gb3B0cztcbiAgaWYgKCFhcHBJZCkge1xuICAgIHRocm93IG5ldyBlcnJvcnMuSW52YWxpZEFyZ3VtZW50RXJyb3IoYFRoZSAnYXBwSWQnIGFyZ3VtZW50IGlzIHJlcXVpcmVkYCk7XG4gIH1cbiAgYXdhaXQgdGhpcy5hZGIuY2xlYXIoYXBwSWQpO1xufTtcblxuZXhwb3J0IHsgY29tbWFuZHMgfTtcbmV4cG9ydCBkZWZhdWx0IGNvbW1hbmRzO1xuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7OztBQUFBLElBQUFBLE9BQUEsR0FBQUMsc0JBQUEsQ0FBQUMsT0FBQTtBQUNBLElBQUFDLFNBQUEsR0FBQUQsT0FBQTtBQUNBLElBQUFFLFFBQUEsR0FBQUYsT0FBQTtBQUNBLElBQUFHLGVBQUEsR0FBQUgsT0FBQTtBQUNBLElBQUFJLE9BQUEsR0FBQUosT0FBQTtBQUNBLElBQUFLLE1BQUEsR0FBQUwsT0FBQTtBQUVBLE1BQU1NLGNBQWMsR0FBRyxDQUFDLE1BQU0sRUFBRSxPQUFPLENBQUM7QUFDeEMsTUFBTUMsc0JBQXNCLEdBQUcsbURBQW1EO0FBRWxGLE1BQU1DLFFBQVEsR0FBRyxDQUFDLENBQUM7QUFBQ0MsT0FBQSxDQUFBRCxRQUFBLEdBQUFBLFFBQUE7QUFRcEJBLFFBQVEsQ0FBQ0UsY0FBYyxHQUFHLGVBQWVBLGNBQWNBLENBQUVDLEtBQUssRUFBRTtFQUM5RCxPQUFPLE1BQU0sSUFBSSxDQUFDQyxHQUFHLENBQUNGLGNBQWMsQ0FBQ0MsS0FBSyxDQUFDO0FBQzdDLENBQUM7QUFhREgsUUFBUSxDQUFDSyxvQkFBb0IsR0FBRyxlQUFlQSxvQkFBb0JBLENBQUVDLElBQUksR0FBRyxDQUFDLENBQUMsRUFBRTtFQUM5RSxNQUFNO0lBQUVIO0VBQU0sQ0FBQyxHQUFHLElBQUFJLGtCQUFXLEVBQUMsT0FBTyxFQUFFRCxJQUFJLENB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
312
+ exports.default = commands;
313
+ //# sourceMappingURL=app-management.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"app-management.js","names":["_lodash","_interopRequireDefault","require","_asyncbox","_support","_androidHelpers","_driver","_utils","APP_EXTENSIONS","RESOLVER_ACTIVITY_NAME","commands","exports","isAppInstalled","appId","adb","mobileIsAppInstalled","opts","requireArgs","queryAppState","log","info","APP_STATE","NOT_INSTALLED","processExists","NOT_RUNNING","appIdRe","RegExp","_","escapeRegExp","line","dumpWindows","split","test","some","x","includes","RUNNING_IN_FOREGROUND","RUNNING_IN_BACKGROUND","mobileQueryAppState","activateApp","debug","apiLevel","getApiLevel","cmd","output","shell","e","errorAndThrow","message","activityName","resolveLaunchableActivity","preferCmd","stdout","Error","mobileActivateApp","removeApp","options","uninstallApk","mobileRemoveApp","terminateApp","forceStop","timeout","util","hasValue","isNaN","parseInt","waitForCondition","waitMs","intervalMs","mobileTerminateApp","installApp","appPath","localPath","helpers","configureApp","install","mobileInstallApp","mobileClearApp","errors","InvalidArgumentError","clear","_default","default"],"sources":["../../../lib/commands/app-management.js"],"sourcesContent":["import _ from 'lodash';\nimport { waitForCondition } from 'asyncbox';\nimport { util } from '@appium/support';\nimport { APP_STATE } from '../android-helpers';\nimport { errors } from 'appium/driver';\nimport { requireArgs } from '../utils';\n\nconst APP_EXTENSIONS = ['.apk', '.apks'];\nconst RESOLVER_ACTIVITY_NAME = 'android/com.android.internal.app.ResolverActivity';\n\nconst commands = {};\n\n/**\n * Verify whether an application is installed or not\n *\n * @param {string} appId - Application package identifier\n * @returns {boolean} true if the app is installed\n */\ncommands.isAppInstalled = async function isAppInstalled (appId) {\n return await this.adb.isAppInstalled(appId);\n};\n\n/**\n * @typedef {Object} MobileAppInstalledOptions\n * @property {string} appId - Application package identifier. Must be always provided.\n */\n\n/**\n * Verify whether an application is installed or not\n *\n * @param {MobileAppInstalledOptions} opts\n * @returns {boolean} Same as in `isAppInstalled`\n */\ncommands.mobileIsAppInstalled = async function mobileIsAppInstalled (opts = {}) {\n const { appId } = requireArgs('appId', opts);\n return await this.isAppInstalled(appId);\n};\n\n/**\n * Queries the current state of the app.\n *\n * @param {string} appId - Application package identifier\n * @returns {number} The corresponding constant, which describes\n * the current application state:\n * 0 - is the app is not installed\n * 1 - if the app is installed, but is not running\n * 3 - if the app is running in the background\n * 4 - if the app is running in the foreground\n */\ncommands.queryAppState = async function queryAppState (appId) {\n this.log.info(`Querying the state of '${appId}'`);\n if (!await this.adb.isAppInstalled(appId)) {\n return APP_STATE.NOT_INSTALLED;\n }\n if (!await this.adb.processExists(appId)) {\n return APP_STATE.NOT_RUNNING;\n }\n const appIdRe = new RegExp(`\\\\b${_.escapeRegExp(appId)}/`);\n for (const line of (await this.adb.dumpWindows()).split('\\n')) {\n if (appIdRe.test(line) && ['mCurrentFocus', 'mFocusedApp'].some((x) => line.includes(x))) {\n return APP_STATE.RUNNING_IN_FOREGROUND;\n }\n }\n return APP_STATE.RUNNING_IN_BACKGROUND;\n};\n\n/**\n * @typedef {Object} MobileQueryAppStateOptions\n * @property {string} appId - Application package identifier. Must be always provided.\n */\n\n/**\n * Queries the current state of the app.\n *\n * @param {MobileQueryAppStateOptions} opts\n * @returns {number} Same as in `queryAppState`\n */\ncommands.mobileQueryAppState = async function mobileQueryAppState (opts = {}) {\n const { appId } = requireArgs('appId', opts);\n return await this.queryAppState(appId);\n};\n\n/**\n * Activates the given application or launches it if necessary.\n * The action literally simulates\n * clicking the corresponding application icon on the dashboard.\n *\n * @param {string} appId - Application package identifier\n * @throws {Error} If the app cannot be activated\n */\ncommands.activateApp = async function activateApp (appId) {\n this.log.debug(`Activating '${appId}'`);\n const apiLevel = await this.adb.getApiLevel();\n // Fallback to Monkey in older APIs\n if (apiLevel < 24) {\n // The monkey command could raise an issue as https://stackoverflow.com/questions/44860475/how-to-use-the-monkey-command-with-an-android-system-that-doesnt-have-physical\n // but '--pct-syskeys 0' could cause another background process issue. https://github.com/appium/appium/issues/16941#issuecomment-1129837285\n const cmd = ['monkey',\n '-p', appId,\n '-c', 'android.intent.category.LAUNCHER',\n '1'];\n let output = '';\n try {\n output = await this.adb.shell(cmd);\n this.log.debug(`Command stdout: ${output}`);\n } catch (e) {\n this.log.errorAndThrow(`Cannot activate '${appId}'. Original error: ${e.message}`);\n }\n if (output.includes('monkey aborted')) {\n this.log.errorAndThrow(`Cannot activate '${appId}'. Are you sure it is installed?`);\n }\n return;\n }\n\n let activityName = await this.adb.resolveLaunchableActivity(appId);\n if (activityName === RESOLVER_ACTIVITY_NAME) {\n // https://github.com/appium/appium/issues/17128\n this.log.debug(\n `The launchable activity name of '${appId}' was resolved to '${activityName}'. ` +\n `Switching the resolver to not use cmd`\n );\n activityName = await this.adb.resolveLaunchableActivity(appId, {preferCmd: false});\n }\n\n const stdout = await this.adb.shell([\n 'am', (apiLevel < 26) ? 'start' : 'start-activity',\n '-a', 'android.intent.action.MAIN',\n '-c', 'android.intent.category.LAUNCHER',\n // FLAG_ACTIVITY_NEW_TASK | FLAG_ACTIVITY_RESET_TASK_IF_NEEDED\n // https://developer.android.com/reference/android/content/Intent#FLAG_ACTIVITY_NEW_TASK\n // https://developer.android.com/reference/android/content/Intent#FLAG_ACTIVITY_RESET_TASK_IF_NEEDED\n '-f', '0x10200000',\n '-n', activityName,\n ]);\n this.log.debug(stdout);\n if (/^error:/mi.test(stdout)) {\n throw new Error(`Cannot activate '${appId}'. Original error: ${stdout}`);\n }\n};\n\n/**\n * @typedef {Object} MobileActivateAppOptions\n * @property {string} appId - Application package identifier. Must be always provided.\n */\n\n/**\n * Activates the given application or launches it if necessary.\n * The action literally simulates\n * clicking the corresponding application icon on the dashboard.\n *\n * @param {MobileActivateAppOptions} opts\n * @throws {Error} If the app cannot be activated\n */\ncommands.mobileActivateApp = async function mobileActivateApp (opts = {}) {\n const { appId } = requireArgs('appId', opts);\n return await this.activateApp(appId);\n};\n\n/**\n * @typedef {Object} UninstallOptions\n * @property {number} timeout [20000] - The count of milliseconds to wait until the\n * app is uninstalled.\n * @property {boolean} keepData [false] - Set to true in order to keep the\n * application data and cache folders after uninstall.\n */\n\n/**\n * Remove the corresponding application if is installed.\n * The call is ignored if the app is not installed.\n *\n * @param {string} appId - Application package identifier\n * @param {?UninstallOptions} options - The set of removal options\n * @returns {boolean} True if the package was found on the device and\n * successfully uninstalled.\n */\ncommands.removeApp = async function removeApp (appId, options = {}) {\n return await this.adb.uninstallApk(appId, options);\n};\n\n/**\n * @typedef {Object} MobileRemoveAppOptions\n * @property {string} appId - Application package identifier. Must be always provided.\n */\n\n/**\n * Remove the corresponding application if is installed.\n * The call is ignored if the app is not installed.\n *\n * @param {MobileRemoveAppOptions} opts\n * @returns {boolean} Same as in `removeApp`\n */\ncommands.mobileRemoveApp = async function mobileRemoveApp (opts = {}) {\n const { appId } = requireArgs('appId', opts);\n return await this.removeApp(appId, opts);\n};\n\n/**\n * @typedef {Object} TerminateOptions\n * @property {number|string} timeout [500] - The count of milliseconds to wait until the\n * app is terminated. The method will skip\n * checking the app state check if the timeout\n * was lower or equal to zero. Then, the return\n * value will be true.\n */\n\n/**\n * Terminates the app if it is running. If the given timeout was lower or equal to zero,\n * it returns true after terminating the app without checking the app state.\n *\n * @param {string} appId - Application package identifier\n * @param {?TerminateOptions} options - The set of application termination options\n * @returns {boolean} True if the app has been successfully terminated.\n * @throws {Error} if the app has not been terminated within the given timeout.\n */\ncommands.terminateApp = async function terminateApp (appId, options = {}) {\n this.log.info(`Terminating '${appId}'`);\n if (!(await this.adb.processExists(appId))) {\n this.log.info(`The app '${appId}' is not running`);\n return false;\n }\n await this.adb.forceStop(appId);\n const timeout = util.hasValue(options.timeout) && !isNaN(options.timeout) ? parseInt(options.timeout, 10) : 500;\n\n if (timeout <= 0) {\n this.log.info(`'${appId}' has been terminated. Skip checking the application process state ` +\n `since the timeout was set as ${timeout}ms`);\n return true;\n }\n\n try {\n await waitForCondition(async () => await this.queryAppState(appId) <= APP_STATE.NOT_RUNNING,\n {waitMs: timeout, intervalMs: 100});\n } catch (e) {\n this.log.errorAndThrow(`'${appId}' is still running after ${timeout}ms timeout`);\n }\n this.log.info(`'${appId}' has been successfully terminated`);\n return true;\n};\n\n/**\n * @typedef {Object} MobileTerminateAppOptions\n * @property {string} appId - Application package identifier. Must be always provided.\n * @property {number|string} timeout [500] - The count of milliseconds to wait until the\n * app is terminated.\n */\n\n/**\n * Terminates the app if it is running.\n *\n * @param {MobileTerminateAppOptions} opts\n * @returns {boolean} Same as in `terminateApp`\n * @throws {Error} if the app has not been terminated within the given timeout.\n */\ncommands.mobileTerminateApp = async function mobileTerminateApp (opts = {}) {\n const { appId } = requireArgs('appId', opts);\n return await this.terminateApp(appId, opts);\n};\n\n/**\n * @typedef {Object} InstallOptions\n * @property {number} timeout [60000] - The count of milliseconds to wait until the\n * app is installed.\n * @property {boolean} allowTestPackages [false] - Set to true in order to allow test\n * packages installation.\n * @property {boolean} useSdcard [false] - Set to true to install the app on sdcard\n * instead of the device memory.\n * @property {boolean} grantPermissions [false] - Set to true in order to grant all the\n * permissions requested in the application's manifest\n * automatically after the installation is completed\n * under Android 6+.\n * @property {boolean} replace [true] - Set it to false if you don't want\n * the application to be upgraded/reinstalled\n * if it is already present on the device.\n */\n\n/**\n * Installs the given application to the device under test\n *\n * @param {string} appPath - The local apk path or a remote url\n * @param {?InstallOptions} options - The set of installation options\n * @throws {Error} if the given apk does not exist or is not reachable\n */\ncommands.installApp = async function installApp (appPath, options = {}) {\n const localPath = await this.helpers.configureApp(appPath, APP_EXTENSIONS);\n await this.adb.install(localPath, options);\n};\n\n/**\n * @typedef {Object} MobileInstallAppOptions\n * @property {string} appPath - The local apk path or a remote url. Must be always provided.\n * @property {number} timeout [60000] - The count of milliseconds to wait until the\n * app is installed.\n * @property {boolean} allowTestPackages [false] - Set to true in order to allow test\n * packages installation.\n * @property {boolean} useSdcard [false] - Set to true to install the app on sdcard\n * instead of the device memory.\n * @property {boolean} grantPermissions [false] - Set to true in order to grant all the\n * permissions requested in the application's manifest\n * automatically after the installation is completed\n * under Android 6+.\n * @property {boolean} replace [true] - Set it to false if you don't want\n * the application to be upgraded/reinstalled\n * if it is already present on the device.\n */\n\n/**\n * Installs the given application to the device under test\n *\n * @param {MobileInstallAppOptions} opts\n * @throws {Error} if the given apk does not exist or is not reachable\n */\ncommands.mobileInstallApp = async function mobileInstallApp (opts = {}) {\n const { appPath } = requireArgs('appPath', opts);\n return await this.installApp(appPath, opts);\n};\n\n/**\n * @typedef {Object} ClearAppOptions\n * @property {!string} appId The identifier of the application package to be cleared\n */\n\n/**\n * Deletes all data associated with a package.\n *\n * @param {ClearAppOptions} opts\n * @throws {Error} If cleaning of the app data fails\n */\ncommands.mobileClearApp = async function mobileClearApp (opts = {}) {\n const {appId} = opts;\n if (!appId) {\n throw new errors.InvalidArgumentError(`The 'appId' argument is required`);\n }\n await this.adb.clear(appId);\n};\n\nexport { commands };\nexport default commands;\n"],"mappings":"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"}
1
+ {"version":3,"file":"app-management.js","sourceRoot":"","sources":["../../../lib/commands/app-management.js"],"names":[],"mappings":"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"}
@@ -0,0 +1,94 @@
1
+ export default extensions;
2
+ export type WebviewsMapping = {
3
+ /**
4
+ * The name of the Devtools Unix socket
5
+ */
6
+ proc: string;
7
+ /**
8
+ * The web view alias. Looks like `WEBVIEW_`
9
+ * prefix plus PID or package name
10
+ */
11
+ webview: string;
12
+ /**
13
+ * Webview information as it is retrieved by
14
+ * /json/version CDP endpoint
15
+ */
16
+ info: any | null;
17
+ /**
18
+ * Webview pages list as it is retrieved by
19
+ * /json/list CDP endpoint
20
+ */
21
+ pages: Array<any> | null;
22
+ };
23
+ export namespace commands {
24
+ function getCurrentContext(): Promise<any>;
25
+ function getContexts(): Promise<any>;
26
+ function setContext(name: any): Promise<void>;
27
+ /**
28
+ * @typedef {Object} WebviewsMapping
29
+ * @property {string} proc The name of the Devtools Unix socket
30
+ * @property {string} webview The web view alias. Looks like `WEBVIEW_`
31
+ * prefix plus PID or package name
32
+ * @property {?Object} info Webview information as it is retrieved by
33
+ * /json/version CDP endpoint
34
+ * @property {?Array<Object>} pages Webview pages list as it is retrieved by
35
+ * /json/list CDP endpoint
36
+ * @propery {?string} webviewName An actual webview name for switching context.
37
+ * This value becomes null when failing to find a PID for a webview.
38
+ *
39
+ * The following json demonstrates the example of WebviewsMapping object.
40
+ * Note that `description` in `page` can be an empty string most likely when it comes to Mobile Chrome)
41
+ * {
42
+ * "proc": "@webview_devtools_remote_22138",
43
+ * "webview": "WEBVIEW_22138",
44
+ * "info": {
45
+ * "Android-Package": "io.appium.settings",
46
+ * "Browser": "Chrome/74.0.3729.185",
47
+ * "Protocol-Version": "1.3",
48
+ * "User-Agent": "Mozilla/5.0 (Linux; Android 10; Android SDK built for x86 Build/QSR1.190920.001; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/74.0.3729.185 Mobile Safari/537.36",
49
+ * "V8-Version": "7.4.288.28",
50
+ * "WebKit-Version": "537.36 (@22955682f94ce09336197bfb8dffea991fa32f0d)",
51
+ * "webSocketDebuggerUrl": "ws://127.0.0.1:10900/devtools/browser"
52
+ * },
53
+ * "pages": [
54
+ * {
55
+ * "description": "{\"attached\":true,\"empty\":false,\"height\":1458,\"screenX\":0,\"screenY\":336,\"visible\":true,\"width\":1080}",
56
+ * "devtoolsFrontendUrl": "http://chrome-devtools-frontend.appspot.com/serve_rev/@22955682f94ce09336197bfb8dffea991fa32f0d/inspector.html?ws=127.0.0.1:10900/devtools/page/27325CC50B600D31B233F45E09487B1F",
57
+ * "id": "27325CC50B600D31B233F45E09487B1F",
58
+ * "title": "Releases · appium/appium · GitHub",
59
+ * "type": "page",
60
+ * "url": "https://github.com/appium/appium/releases",
61
+ * "webSocketDebuggerUrl": "ws://127.0.0.1:10900/devtools/page/27325CC50B600D31B233F45E09487B1F"
62
+ * }
63
+ * ],
64
+ * "webviewName": "WEBVIEW_com.io.appium.setting"
65
+ * }
66
+ */
67
+ /**
68
+ * Returns a webviewsMapping based on CDP endpoints
69
+ *
70
+ * @return {Array<WebviewsMapping>} webviewsMapping
71
+ */
72
+ function mobileGetContexts(): WebviewsMapping[];
73
+ }
74
+ export namespace helpers {
75
+ function assignContexts(webviewsMapping: any): string[];
76
+ function switchContext(name: any, webviewsMapping: any): Promise<void>;
77
+ function defaultContextName(): string;
78
+ function defaultWebviewName(): string;
79
+ function isWebContext(): boolean;
80
+ function startChromedriverProxy(context: any, webviewsMapping: any): Promise<void>;
81
+ function suspendChromedriverProxy(): void;
82
+ function onChromedriverStop(context: any): Promise<void>;
83
+ function stopChromedriverProxies(): Promise<void>;
84
+ function isChromedriverContext(viewName: any): boolean;
85
+ function shouldDismissChromeWelcome(): any;
86
+ function dismissChromeWelcome(): Promise<void>;
87
+ function startChromeSession(): Promise<void>;
88
+ function isChromedriverAutodownloadEnabled(): boolean;
89
+ function setupNewChromedriver(opts: any, curDeviceId: any, adb: any, context?: null): Promise<Chromedriver>;
90
+ }
91
+ export function setupNewChromedriver(opts: any, curDeviceId: any, adb: any, context?: null): Promise<Chromedriver>;
92
+ declare let extensions: {};
93
+ import Chromedriver from 'appium-chromedriver';
94
+ //# sourceMappingURL=context.d.ts.map