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.
- package/CHANGELOG.md +7 -0
- package/build/index.js +43 -40
- package/build/lib/android-helpers.d.ts +136 -0
- package/build/lib/android-helpers.d.ts.map +1 -0
- package/build/lib/android-helpers.js +760 -679
- package/build/lib/android-helpers.js.map +1 -1
- package/build/lib/bootstrap.d.ts +29 -0
- package/build/lib/bootstrap.d.ts.map +1 -0
- package/build/lib/bootstrap.js +192 -179
- package/build/lib/bootstrap.js.map +1 -1
- package/build/lib/commands/actions.d.ts +209 -0
- package/build/lib/commands/actions.d.ts.map +1 -0
- package/build/lib/commands/actions.js +327 -265
- package/build/lib/commands/actions.js.map +1 -1
- package/build/lib/commands/alert.d.ts +10 -0
- package/build/lib/commands/alert.d.ts.map +1 -0
- package/build/lib/commands/alert.js +12 -18
- package/build/lib/commands/alert.js.map +1 -1
- package/build/lib/commands/app-management.d.ts +314 -0
- package/build/lib/commands/app-management.d.ts.map +1 -0
- package/build/lib/commands/app-management.js +278 -110
- package/build/lib/commands/app-management.js.map +1 -1
- package/build/lib/commands/context.d.ts +94 -0
- package/build/lib/commands/context.d.ts.map +1 -0
- package/build/lib/commands/context.js +412 -260
- package/build/lib/commands/context.js.map +1 -1
- package/build/lib/commands/coverage.d.ts +5 -0
- package/build/lib/commands/coverage.d.ts.map +1 -0
- package/build/lib/commands/coverage.js +14 -17
- package/build/lib/commands/coverage.js.map +1 -1
- package/build/lib/commands/element.d.ts +36 -0
- package/build/lib/commands/element.d.ts.map +1 -0
- package/build/lib/commands/element.js +97 -127
- package/build/lib/commands/element.js.map +1 -1
- package/build/lib/commands/emu-console.d.ts +49 -0
- package/build/lib/commands/emu-console.d.ts.map +1 -0
- package/build/lib/commands/emu-console.js +36 -25
- package/build/lib/commands/emu-console.js.map +1 -1
- package/build/lib/commands/execute.d.ts +6 -0
- package/build/lib/commands/execute.d.ts.map +1 -0
- package/build/lib/commands/execute.js +68 -69
- package/build/lib/commands/execute.js.map +1 -1
- package/build/lib/commands/file-actions.d.ts +129 -0
- package/build/lib/commands/file-actions.d.ts.map +1 -0
- package/build/lib/commands/file-actions.js +321 -178
- package/build/lib/commands/file-actions.js.map +1 -1
- package/build/lib/commands/find.d.ts +13 -0
- package/build/lib/commands/find.d.ts.map +1 -0
- package/build/lib/commands/find.js +69 -51
- package/build/lib/commands/find.js.map +1 -1
- package/build/lib/commands/general.d.ts +133 -0
- package/build/lib/commands/general.d.ts.map +1 -0
- package/build/lib/commands/general.js +275 -216
- package/build/lib/commands/general.js.map +1 -1
- package/build/lib/commands/ime.d.ts +11 -0
- package/build/lib/commands/ime.d.ts.map +1 -0
- package/build/lib/commands/ime.js +27 -33
- package/build/lib/commands/ime.js.map +1 -1
- package/build/lib/commands/index.d.ts +3 -0
- package/build/lib/commands/index.d.ts.map +1 -0
- package/build/lib/commands/index.js +32 -35
- package/build/lib/commands/index.js.map +1 -1
- package/build/lib/commands/intent.d.ts +418 -0
- package/build/lib/commands/intent.d.ts.map +1 -0
- package/build/lib/commands/intent.js +281 -151
- package/build/lib/commands/intent.js.map +1 -1
- package/build/lib/commands/keyboard.d.ts +6 -0
- package/build/lib/commands/keyboard.d.ts.map +1 -0
- package/build/lib/commands/keyboard.js +6 -14
- package/build/lib/commands/keyboard.js.map +1 -1
- package/build/lib/commands/log.d.ts +45 -0
- package/build/lib/commands/log.d.ts.map +1 -0
- package/build/lib/commands/log.js +117 -103
- package/build/lib/commands/log.js.map +1 -1
- package/build/lib/commands/media-projection.d.ts +144 -0
- package/build/lib/commands/media-projection.d.ts.map +1 -0
- package/build/lib/commands/media-projection.js +228 -171
- package/build/lib/commands/media-projection.js.map +1 -1
- package/build/lib/commands/network.d.ts +139 -0
- package/build/lib/commands/network.d.ts.map +1 -0
- package/build/lib/commands/network.js +249 -181
- package/build/lib/commands/network.js.map +1 -1
- package/build/lib/commands/performance.d.ts +101 -0
- package/build/lib/commands/performance.d.ts.map +1 -0
- package/build/lib/commands/performance.js +390 -236
- package/build/lib/commands/performance.js.map +1 -1
- package/build/lib/commands/permissions.d.ts +93 -0
- package/build/lib/commands/permissions.d.ts.map +1 -0
- package/build/lib/commands/permissions.js +133 -93
- package/build/lib/commands/permissions.js.map +1 -1
- package/build/lib/commands/recordscreen.d.ts +194 -0
- package/build/lib/commands/recordscreen.d.ts.map +1 -0
- package/build/lib/commands/recordscreen.js +293 -224
- package/build/lib/commands/recordscreen.js.map +1 -1
- package/build/lib/commands/shell.d.ts +8 -0
- package/build/lib/commands/shell.d.ts.map +1 -0
- package/build/lib/commands/shell.js +38 -43
- package/build/lib/commands/shell.js.map +1 -1
- package/build/lib/commands/streamscreen.d.ts +104 -0
- package/build/lib/commands/streamscreen.d.ts.map +1 -0
- package/build/lib/commands/streamscreen.js +364 -305
- package/build/lib/commands/streamscreen.js.map +1 -1
- package/build/lib/commands/system-bars.d.ts +100 -0
- package/build/lib/commands/system-bars.d.ts.map +1 -0
- package/build/lib/commands/system-bars.js +148 -90
- package/build/lib/commands/system-bars.js.map +1 -1
- package/build/lib/commands/touch.d.ts +30 -0
- package/build/lib/commands/touch.d.ts.map +1 -0
- package/build/lib/commands/touch.js +311 -287
- package/build/lib/commands/touch.js.map +1 -1
- package/build/lib/desired-caps.d.ts +353 -0
- package/build/lib/desired-caps.d.ts.map +1 -0
- package/build/lib/desired-caps.js +291 -292
- package/build/lib/desired-caps.js.map +1 -1
- package/build/lib/driver.d.ts +430 -0
- package/build/lib/driver.d.ts.map +1 -0
- package/build/lib/driver.js +449 -384
- package/build/lib/driver.js.map +1 -1
- package/build/lib/logger.d.ts +3 -0
- package/build/lib/logger.d.ts.map +1 -0
- package/build/lib/logger.js +5 -11
- package/build/lib/logger.js.map +1 -1
- package/build/lib/method-map.d.ts +389 -0
- package/build/lib/method-map.d.ts.map +1 -0
- package/build/lib/method-map.js +220 -394
- package/build/lib/method-map.js.map +1 -1
- package/build/lib/stubs.d.ts +8 -0
- package/build/lib/stubs.d.ts.map +1 -0
- package/build/lib/stubs.js +5 -0
- package/build/lib/stubs.js.map +1 -0
- package/build/lib/uiautomator.d.ts +24 -0
- package/build/lib/uiautomator.d.ts.map +1 -0
- package/build/lib/uiautomator.js +86 -82
- package/build/lib/uiautomator.js.map +1 -1
- package/build/lib/unlock-helpers.d.ts +38 -0
- package/build/lib/unlock-helpers.d.ts.map +1 -0
- package/build/lib/unlock-helpers.js +228 -204
- package/build/lib/unlock-helpers.js.map +1 -1
- package/build/lib/utils.d.ts +11 -0
- package/build/lib/utils.d.ts.map +1 -0
- package/build/lib/utils.js +23 -18
- package/build/lib/utils.js.map +1 -1
- package/build/lib/webview-helpers.d.ts +223 -0
- package/build/lib/webview-helpers.d.ts.map +1 -0
- package/build/lib/webview-helpers.js +476 -298
- package/build/lib/webview-helpers.js.map +1 -1
- package/index.js +3 -1
- package/lib/android-helpers.js +2 -1
- package/lib/stubs.ts +8 -0
- package/lib/unlock-helpers.js +2 -2
- package/package.json +23 -14
|
@@ -1,225 +1,293 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
require("
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
var _bluebird = _interopRequireDefault(require("bluebird"));
|
|
13
|
-
let commands = {},
|
|
14
|
-
helpers = {},
|
|
15
|
-
extensions = {};
|
|
16
|
-
exports.helpers = helpers;
|
|
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.helpers = exports.commands = void 0;
|
|
7
|
+
const lodash_1 = __importDefault(require("lodash"));
|
|
8
|
+
const driver_1 = require("appium/driver");
|
|
9
|
+
const support_1 = require("appium/support");
|
|
10
|
+
const bluebird_1 = __importDefault(require("bluebird"));
|
|
11
|
+
let commands = {}, helpers = {}, extensions = {};
|
|
17
12
|
exports.commands = commands;
|
|
13
|
+
exports.helpers = helpers;
|
|
18
14
|
const AIRPLANE_MODE_MASK = 0b001;
|
|
19
15
|
const WIFI_MASK = 0b010;
|
|
20
16
|
const DATA_MASK = 0b100;
|
|
17
|
+
// The value close to zero, but not zero, is needed
|
|
18
|
+
// to trick JSON generation and send a float value instead of an integer,
|
|
19
|
+
// This allows strictly-typed clients, like Java, to properly
|
|
20
|
+
// parse it. Otherwise float 0.0 is always represented as integer 0 in JS.
|
|
21
|
+
// The value must not be greater than DBL_EPSILON (https://opensource.apple.com/source/Libc/Libc-498/include/float.h)
|
|
21
22
|
const GEO_EPSILON = Number.MIN_VALUE;
|
|
22
23
|
const WIFI_KEY_NAME = 'wifi';
|
|
23
24
|
const DATA_KEY_NAME = 'data';
|
|
24
25
|
const AIRPLANE_MODE_KEY_NAME = 'airplaneMode';
|
|
25
26
|
const SUPPORTED_SERVICE_NAMES = [WIFI_KEY_NAME, DATA_KEY_NAME, AIRPLANE_MODE_KEY_NAME];
|
|
26
27
|
commands.getNetworkConnection = async function getNetworkConnection() {
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
28
|
+
this.log.info('Getting network connection');
|
|
29
|
+
let airplaneModeOn = await this.adb.isAirplaneModeOn();
|
|
30
|
+
let connection = airplaneModeOn ? AIRPLANE_MODE_MASK : 0;
|
|
31
|
+
// no need to check anything else if we are in airplane mode
|
|
32
|
+
if (!airplaneModeOn) {
|
|
33
|
+
let wifiOn = await this.isWifiOn();
|
|
34
|
+
connection |= (wifiOn ? WIFI_MASK : 0);
|
|
35
|
+
let dataOn = await this.adb.isDataOn();
|
|
36
|
+
connection |= (dataOn ? DATA_MASK : 0);
|
|
37
|
+
}
|
|
38
|
+
return connection;
|
|
37
39
|
};
|
|
40
|
+
/**
|
|
41
|
+
* decoupling to override the behaviour in other drivers like UiAutomator2.
|
|
42
|
+
*/
|
|
38
43
|
commands.isWifiOn = async function isWifiOn() {
|
|
39
|
-
|
|
44
|
+
return await this.adb.isWifiOn();
|
|
40
45
|
};
|
|
46
|
+
/**
|
|
47
|
+
* @typedef {Object} SetConnectivityOptions
|
|
48
|
+
* @property {boolean?} wifi Either to enable or disable Wi-Fi.
|
|
49
|
+
* An unset value means to not change the state for the given service.
|
|
50
|
+
* @property {boolean?} data Either to enable or disable mobile data connection.
|
|
51
|
+
* An unset value means to not change the state for the given service.
|
|
52
|
+
* @property {boolean?} airplaneMode Either to enable to disable the Airplane Mode
|
|
53
|
+
* An unset value means to not change the state for the given service.
|
|
54
|
+
*/
|
|
55
|
+
/**
|
|
56
|
+
* Set the connectivity state for different services
|
|
57
|
+
*
|
|
58
|
+
* @param {SetConnectivityOptions} opts
|
|
59
|
+
* @throws {Error} If none of known properties were provided or there was an error
|
|
60
|
+
* while changing connectivity states
|
|
61
|
+
*/
|
|
41
62
|
commands.mobileSetConnectivity = async function mobileSetConnectivity(opts = {}) {
|
|
42
|
-
|
|
43
|
-
wifi,
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
});
|
|
53
|
-
const setters = [];
|
|
54
|
-
if (!_lodash.default.isUndefined(wifi) && currentState.wifi !== Boolean(wifi)) {
|
|
55
|
-
setters.push(this.adb.setWifiState(wifi, this.isEmulator()));
|
|
56
|
-
}
|
|
57
|
-
if (!_lodash.default.isUndefined(data) && currentState.data !== Boolean(data)) {
|
|
58
|
-
setters.push(this.adb.setDataState(data, this.isEmulator()));
|
|
59
|
-
}
|
|
60
|
-
if (!_lodash.default.isUndefined(airplaneMode) && currentState.airplaneMode !== Boolean(airplaneMode)) {
|
|
61
|
-
setters.push(async () => {
|
|
62
|
-
await this.adb.setAirplaneMode(airplaneMode);
|
|
63
|
-
if (this.adb.getApiLevel() < 30) {
|
|
64
|
-
await this.adb.broadcastAirplaneMode(airplaneMode);
|
|
65
|
-
}
|
|
63
|
+
const { wifi, data, airplaneMode, } = opts;
|
|
64
|
+
if (lodash_1.default.every([wifi, data, airplaneMode], lodash_1.default.isUndefined)) {
|
|
65
|
+
throw new driver_1.errors.InvalidArgumentError(`Either one of ${JSON.stringify(SUPPORTED_SERVICE_NAMES)} options must be provided`);
|
|
66
|
+
}
|
|
67
|
+
const currentState = await this.mobileGetConnectivity({
|
|
68
|
+
services: [
|
|
69
|
+
...(lodash_1.default.isUndefined(wifi) ? [] : [WIFI_KEY_NAME]),
|
|
70
|
+
...(lodash_1.default.isUndefined(data) ? [] : [DATA_KEY_NAME]),
|
|
71
|
+
...(lodash_1.default.isUndefined(airplaneMode) ? [] : [AIRPLANE_MODE_KEY_NAME]),
|
|
72
|
+
]
|
|
66
73
|
});
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
74
|
+
const setters = [];
|
|
75
|
+
if (!lodash_1.default.isUndefined(wifi) && currentState.wifi !== Boolean(wifi)) {
|
|
76
|
+
setters.push(this.adb.setWifiState(wifi, this.isEmulator()));
|
|
77
|
+
}
|
|
78
|
+
if (!lodash_1.default.isUndefined(data) && currentState.data !== Boolean(data)) {
|
|
79
|
+
setters.push(this.adb.setDataState(data, this.isEmulator()));
|
|
80
|
+
}
|
|
81
|
+
if (!lodash_1.default.isUndefined(airplaneMode) && currentState.airplaneMode !== Boolean(airplaneMode)) {
|
|
82
|
+
setters.push(async () => {
|
|
83
|
+
await this.adb.setAirplaneMode(airplaneMode);
|
|
84
|
+
if (this.adb.getApiLevel() < 30) {
|
|
85
|
+
await this.adb.broadcastAirplaneMode(airplaneMode);
|
|
86
|
+
}
|
|
87
|
+
});
|
|
88
|
+
}
|
|
89
|
+
if (!lodash_1.default.isEmpty(setters)) {
|
|
90
|
+
await bluebird_1.default.all(setters);
|
|
91
|
+
}
|
|
71
92
|
};
|
|
93
|
+
/**
|
|
94
|
+
* @typedef {Object} GetConnectivityResult
|
|
95
|
+
* @property {boolean} wifi True if wifi is enabled
|
|
96
|
+
* @property {boolean} data True if mobile data connection is enabled
|
|
97
|
+
* @property {boolean} airplaneMode True if Airplane Mode is enabled
|
|
98
|
+
*/
|
|
99
|
+
/**
|
|
100
|
+
* @typedef {Object} GetConnectivityOptions
|
|
101
|
+
* @property {string[]|string?} services one or more services to get the connectivity for.
|
|
102
|
+
* Supported service names are: wifi, data, airplaneMode.
|
|
103
|
+
*/
|
|
104
|
+
/**
|
|
105
|
+
* Retrieves the connectivity properties from the device under test
|
|
106
|
+
*
|
|
107
|
+
* @param {GetConnectivityOptions?} opts If no service names are provided then the
|
|
108
|
+
* connectivity state is returned for all of them.
|
|
109
|
+
* @returns {GetConnectivityResult}
|
|
110
|
+
*/
|
|
72
111
|
commands.mobileGetConnectivity = async function mobileGetConnectivity(opts = {}) {
|
|
73
|
-
|
|
74
|
-
services
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
112
|
+
let { services = SUPPORTED_SERVICE_NAMES, } = opts;
|
|
113
|
+
if (!lodash_1.default.isArray(services)) {
|
|
114
|
+
services = [services];
|
|
115
|
+
}
|
|
116
|
+
const unsupportedServices = lodash_1.default.difference(services, SUPPORTED_SERVICE_NAMES);
|
|
117
|
+
if (!lodash_1.default.isEmpty(unsupportedServices)) {
|
|
118
|
+
throw new driver_1.errors.InvalidArgumentError(`${support_1.util.pluralize('Service name', unsupportedServices.length, false)} ${unsupportedServices} ` +
|
|
119
|
+
`${unsupportedServices.length === 1 ? 'is' : 'are'} not known. Only the following services are ` +
|
|
120
|
+
`suported: ${SUPPORTED_SERVICE_NAMES}`);
|
|
121
|
+
}
|
|
122
|
+
const statePromises = {
|
|
123
|
+
wifi: bluebird_1.default.resolve(services.includes(WIFI_KEY_NAME) ? this.adb.isWifiOn() : undefined),
|
|
124
|
+
data: bluebird_1.default.resolve(services.includes(DATA_KEY_NAME) ? this.adb.isDataOn() : undefined),
|
|
125
|
+
airplaneMode: bluebird_1.default.resolve(services.includes(AIRPLANE_MODE_KEY_NAME) ? this.adb.isAirplaneModeOn() : undefined),
|
|
126
|
+
};
|
|
127
|
+
await bluebird_1.default.all(lodash_1.default.values(statePromises));
|
|
128
|
+
return lodash_1.default.fromPairs(services.map((k) => [k, statePromises[k].value()]));
|
|
90
129
|
};
|
|
91
130
|
commands.setNetworkConnection = async function setNetworkConnection(type) {
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
131
|
+
this.log.info('Setting network connection');
|
|
132
|
+
// decode the input
|
|
133
|
+
const shouldEnableAirplaneMode = (type & AIRPLANE_MODE_MASK) !== 0;
|
|
134
|
+
const shouldEnableWifi = (type & WIFI_MASK) !== 0;
|
|
135
|
+
const shouldEnableDataConnection = (type & DATA_MASK) !== 0;
|
|
136
|
+
const currentState = await this.getNetworkConnection();
|
|
137
|
+
const isAirplaneModeEnabled = (currentState & AIRPLANE_MODE_MASK) !== 0;
|
|
138
|
+
const isWiFiEnabled = (currentState & WIFI_MASK) !== 0;
|
|
139
|
+
const isDataEnabled = (currentState & DATA_MASK) !== 0;
|
|
140
|
+
if (shouldEnableAirplaneMode !== isAirplaneModeEnabled) {
|
|
141
|
+
await this.wrapBootstrapDisconnect(async () => {
|
|
142
|
+
await this.adb.setAirplaneMode(shouldEnableAirplaneMode);
|
|
143
|
+
});
|
|
144
|
+
await this.wrapBootstrapDisconnect(async () => {
|
|
145
|
+
if (await this.adb.getApiLevel() < 30) {
|
|
146
|
+
await this.adb.broadcastAirplaneMode(shouldEnableAirplaneMode);
|
|
147
|
+
}
|
|
148
|
+
});
|
|
149
|
+
}
|
|
150
|
+
else {
|
|
151
|
+
this.log.info(`Not changing airplane mode, since it is already ${shouldEnableAirplaneMode ? 'enabled' : 'disabled'}`);
|
|
152
|
+
}
|
|
153
|
+
if (shouldEnableWifi === isWiFiEnabled && shouldEnableDataConnection === isDataEnabled) {
|
|
154
|
+
this.log.info('Not changing data connection/Wi-Fi states, since they are already set to expected values');
|
|
155
|
+
if (await this.adb.isAirplaneModeOn()) {
|
|
156
|
+
return AIRPLANE_MODE_MASK | currentState;
|
|
157
|
+
}
|
|
158
|
+
return ~AIRPLANE_MODE_MASK & currentState;
|
|
159
|
+
}
|
|
104
160
|
await this.wrapBootstrapDisconnect(async () => {
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
161
|
+
if (shouldEnableWifi !== isWiFiEnabled) {
|
|
162
|
+
await this.setWifiState(shouldEnableWifi);
|
|
163
|
+
}
|
|
164
|
+
else {
|
|
165
|
+
this.log.info(`Not changing Wi-Fi state, since it is already ` +
|
|
166
|
+
`${shouldEnableWifi ? 'enabled' : 'disabled'}`);
|
|
167
|
+
}
|
|
168
|
+
if (shouldEnableAirplaneMode) {
|
|
169
|
+
this.log.info('Not changing data connection state, because airplane mode is enabled');
|
|
170
|
+
}
|
|
171
|
+
else if (shouldEnableDataConnection === isDataEnabled) {
|
|
172
|
+
this.log.info(`Not changing data connection state, since it is already ` +
|
|
173
|
+
`${shouldEnableDataConnection ? 'enabled' : 'disabled'}`);
|
|
174
|
+
}
|
|
175
|
+
else {
|
|
176
|
+
await this.adb.setDataState(shouldEnableDataConnection, this.isEmulator());
|
|
177
|
+
}
|
|
108
178
|
});
|
|
109
|
-
|
|
110
|
-
this.log.info(`Not changing airplane mode, since it is already ${shouldEnableAirplaneMode ? 'enabled' : 'disabled'}`);
|
|
111
|
-
}
|
|
112
|
-
if (shouldEnableWifi === isWiFiEnabled && shouldEnableDataConnection === isDataEnabled) {
|
|
113
|
-
this.log.info('Not changing data connection/Wi-Fi states, since they are already set to expected values');
|
|
114
|
-
if (await this.adb.isAirplaneModeOn()) {
|
|
115
|
-
return AIRPLANE_MODE_MASK | currentState;
|
|
116
|
-
}
|
|
117
|
-
return ~AIRPLANE_MODE_MASK & currentState;
|
|
118
|
-
}
|
|
119
|
-
await this.wrapBootstrapDisconnect(async () => {
|
|
120
|
-
if (shouldEnableWifi !== isWiFiEnabled) {
|
|
121
|
-
await this.setWifiState(shouldEnableWifi);
|
|
122
|
-
} else {
|
|
123
|
-
this.log.info(`Not changing Wi-Fi state, since it is already ` + `${shouldEnableWifi ? 'enabled' : 'disabled'}`);
|
|
124
|
-
}
|
|
125
|
-
if (shouldEnableAirplaneMode) {
|
|
126
|
-
this.log.info('Not changing data connection state, because airplane mode is enabled');
|
|
127
|
-
} else if (shouldEnableDataConnection === isDataEnabled) {
|
|
128
|
-
this.log.info(`Not changing data connection state, since it is already ` + `${shouldEnableDataConnection ? 'enabled' : 'disabled'}`);
|
|
129
|
-
} else {
|
|
130
|
-
await this.adb.setDataState(shouldEnableDataConnection, this.isEmulator());
|
|
131
|
-
}
|
|
132
|
-
});
|
|
133
|
-
return await this.getNetworkConnection();
|
|
179
|
+
return await this.getNetworkConnection();
|
|
134
180
|
};
|
|
181
|
+
/**
|
|
182
|
+
* decoupling to override behaviour in other drivers like UiAutomator2.
|
|
183
|
+
*/
|
|
135
184
|
commands.setWifiState = async function setWifiState(wifi) {
|
|
136
|
-
|
|
185
|
+
await this.adb.setWifiState(wifi, this.isEmulator());
|
|
137
186
|
};
|
|
138
187
|
commands.toggleData = async function toggleData() {
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
}, this.isEmulator());
|
|
145
|
-
});
|
|
188
|
+
let data = !(await this.adb.isDataOn());
|
|
189
|
+
this.log.info(`Turning network data ${data ? 'on' : 'off'}`);
|
|
190
|
+
await this.wrapBootstrapDisconnect(async () => {
|
|
191
|
+
await this.adb.setWifiAndData({ data }, this.isEmulator());
|
|
192
|
+
});
|
|
146
193
|
};
|
|
147
194
|
commands.toggleWiFi = async function toggleWiFi() {
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
}, this.isEmulator());
|
|
154
|
-
});
|
|
195
|
+
let wifi = !(await this.adb.isWifiOn());
|
|
196
|
+
this.log.info(`Turning WiFi ${wifi ? 'on' : 'off'}`);
|
|
197
|
+
await this.wrapBootstrapDisconnect(async () => {
|
|
198
|
+
await this.adb.setWifiAndData({ wifi }, this.isEmulator());
|
|
199
|
+
});
|
|
155
200
|
};
|
|
156
201
|
commands.toggleFlightMode = async function toggleFlightMode() {
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
}
|
|
166
|
-
|
|
202
|
+
/*
|
|
203
|
+
* TODO: Implement isRealDevice(). This method fails on
|
|
204
|
+
* real devices, it should throw a NotYetImplementedError
|
|
205
|
+
*/
|
|
206
|
+
let flightMode = !(await this.adb.isAirplaneModeOn());
|
|
207
|
+
this.log.info(`Turning flight mode ${flightMode ? 'on' : 'off'}`);
|
|
208
|
+
await this.wrapBootstrapDisconnect(async () => {
|
|
209
|
+
await this.adb.setAirplaneMode(flightMode);
|
|
210
|
+
});
|
|
211
|
+
await this.wrapBootstrapDisconnect(async () => {
|
|
212
|
+
if (await this.adb.getApiLevel() < 30) {
|
|
213
|
+
await this.adb.broadcastAirplaneMode(flightMode);
|
|
214
|
+
}
|
|
215
|
+
});
|
|
167
216
|
};
|
|
168
217
|
commands.setGeoLocation = async function setGeoLocation(location) {
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
218
|
+
await this.adb.setGeoLocation(location, this.isEmulator());
|
|
219
|
+
try {
|
|
220
|
+
return await this.getGeoLocation();
|
|
221
|
+
}
|
|
222
|
+
catch (e) {
|
|
223
|
+
this.log.warn(`Could not get the current geolocation info: ${e.message}`);
|
|
224
|
+
this.log.warn(`Returning the default zero'ed values`);
|
|
225
|
+
return {
|
|
226
|
+
latitude: GEO_EPSILON,
|
|
227
|
+
longitude: GEO_EPSILON,
|
|
228
|
+
altitude: GEO_EPSILON,
|
|
229
|
+
};
|
|
230
|
+
}
|
|
181
231
|
};
|
|
232
|
+
/**
|
|
233
|
+
* @typedef {Object} GpsCacheRefreshOptions
|
|
234
|
+
* @property {number} timeoutMs [20000] The maximum number of milliseconds
|
|
235
|
+
* to block until GPS cache is refreshed. Providing zero or a negative
|
|
236
|
+
* value to it skips waiting completely.
|
|
237
|
+
*/
|
|
238
|
+
/**
|
|
239
|
+
* Sends an async request to refresh the GPS cache.
|
|
240
|
+
* This feature only works if the device under test has
|
|
241
|
+
* Google Play Services installed. In case the vanilla
|
|
242
|
+
* LocationManager is used the device API level must be at
|
|
243
|
+
* version 30 (Android R) or higher.
|
|
244
|
+
*
|
|
245
|
+
* @param {GpsCacheRefreshOptions} opts
|
|
246
|
+
*/
|
|
182
247
|
commands.mobileRefreshGpsCache = async function mobileRefreshGpsCache(opts = {}) {
|
|
183
|
-
|
|
184
|
-
timeoutMs
|
|
185
|
-
} = opts;
|
|
186
|
-
await this.adb.refreshGeoLocationCache(timeoutMs);
|
|
248
|
+
const { timeoutMs } = opts;
|
|
249
|
+
await this.adb.refreshGeoLocationCache(timeoutMs);
|
|
187
250
|
};
|
|
188
251
|
commands.getGeoLocation = async function getGeoLocation() {
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
latitude: parseFloat(latitude) || GEO_EPSILON,
|
|
196
|
-
longitude: parseFloat(longitude) || GEO_EPSILON,
|
|
197
|
-
altitude: parseFloat(altitude) || GEO_EPSILON
|
|
198
|
-
};
|
|
252
|
+
const { latitude, longitude, altitude } = await this.adb.getGeoLocation();
|
|
253
|
+
return {
|
|
254
|
+
latitude: parseFloat(latitude) || GEO_EPSILON,
|
|
255
|
+
longitude: parseFloat(longitude) || GEO_EPSILON,
|
|
256
|
+
altitude: parseFloat(altitude) || GEO_EPSILON,
|
|
257
|
+
};
|
|
199
258
|
};
|
|
259
|
+
/**
|
|
260
|
+
* Checks if GPS is enabled
|
|
261
|
+
*
|
|
262
|
+
* @returns {Promise<Boolean>} True if yes
|
|
263
|
+
*/
|
|
200
264
|
commands.isLocationServicesEnabled = async function iLocationServicesEnabled() {
|
|
201
|
-
|
|
265
|
+
return (await this.adb.getLocationProviders()).includes('gps');
|
|
202
266
|
};
|
|
267
|
+
/**
|
|
268
|
+
* Toggles GPS state
|
|
269
|
+
*/
|
|
203
270
|
commands.toggleLocationServices = async function toggleLocationServices() {
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
271
|
+
this.log.info('Toggling location services');
|
|
272
|
+
const isGpsEnabled = await this.isLocationServicesEnabled();
|
|
273
|
+
this.log.debug(`Current GPS state: ${isGpsEnabled}. ` +
|
|
274
|
+
`The service is going to be ${isGpsEnabled ? 'disabled' : 'enabled'}`);
|
|
275
|
+
await this.adb.toggleGPSLocationProvider(!isGpsEnabled);
|
|
208
276
|
};
|
|
209
277
|
helpers.wrapBootstrapDisconnect = async function wrapBootstrapDisconnect(wrapped) {
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
278
|
+
if (!this.bootstrap) {
|
|
279
|
+
return await wrapped();
|
|
280
|
+
}
|
|
281
|
+
this.bootstrap.ignoreUnexpectedShutdown = true;
|
|
282
|
+
try {
|
|
283
|
+
await wrapped();
|
|
284
|
+
await this.adb.restart();
|
|
285
|
+
await this.bootstrap.start(this.opts.appPackage, this.opts.disableAndroidWatchers, this.opts.acceptSslCerts);
|
|
286
|
+
}
|
|
287
|
+
finally {
|
|
288
|
+
this.bootstrap.ignoreUnexpectedShutdown = false;
|
|
289
|
+
}
|
|
221
290
|
};
|
|
222
291
|
Object.assign(extensions, commands, helpers);
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfbG9kYXNoIiwiX2ludGVyb3BSZXF1aXJlRGVmYXVsdCIsInJlcXVpcmUiLCJfZHJpdmVyIiwiX3N1cHBvcnQiLCJfYmx1ZWJpcmQiLCJjb21tYW5kcyIsImhlbHBlcnMiLCJleHRlbnNpb25zIiwiZXhwb3J0cyIsIkFJUlBMQU5FX01PREVfTUFTSyIsIldJRklfTUFTSyIsIkRBVEFfTUFTSyIsIkdFT19FUFNJTE9OIiwiTnVtYmVyIiwiTUlOX1ZBTFVFIiwiV0lGSV9LRVlfTkFNRSIsIkRBVEFfS0VZX05BTUUiLCJBSVJQTEFORV9NT0RFX0tFWV9OQU1FIiwiU1VQUE9SVEVEX1NFUlZJQ0VfTkFNRVMiLCJnZXROZXR3b3JrQ29ubmVjdGlvbiIsImxvZyIsImluZm8iLCJhaXJwbGFuZU1vZGVPbiIsImFkYiIsImlzQWlycGxhbmVNb2RlT24iLCJjb25uZWN0aW9uIiwid2lmaU9uIiwiaXNXaWZpT24iLCJkYXRhT24iLCJpc0RhdGFPbiIsIm1vYmlsZVNldENvbm5lY3Rpdml0eSIsIm9wdHMiLCJ3aWZpIiwiZGF0YSIsImFpcnBsYW5lTW9kZSIsIl8iLCJldmVyeSIsImlzVW5kZWZpbmVkIiwiZXJyb3JzIiwiSW52YWxpZEFyZ3VtZW50RXJyb3IiLCJKU09OIiwic3RyaW5naWZ5IiwiY3VycmVudFN0YXRlIiwibW9iaWxlR2V0Q29ubmVjdGl2aXR5Iiwic2VydmljZXMiLCJzZXR0ZXJzIiwiQm9vbGVhbiIsInB1c2giLCJzZXRXaWZpU3RhdGUiLCJpc0VtdWxhdG9yIiwic2V0RGF0YVN0YXRlIiwic2V0QWlycGxhbmVNb2RlIiwiZ2V0QXBpTGV2ZWwiLCJicm9hZGNhc3RBaXJwbGFuZU1vZGUiLCJpc0VtcHR5IiwiQiIsImFsbCIsImlzQXJyYXkiLCJ1bnN1cHBvcnRlZFNlcnZpY2VzIiwiZGlmZmVyZW5jZSIsInV0aWwiLCJwbHVyYWxpemUiLCJsZW5ndGgiLCJzdGF0ZVByb21pc2VzIiwicmVzb2x2ZSIsImluY2x1ZGVzIiwidW5kZWZpbmVkIiwidmFsdWVzIiwiZnJvbVBhaXJzIiwibWFwIiwiayIsInZhbHVlIiwic2V0TmV0d29ya0Nvbm5lY3Rpb24iLCJ0eXBlIiwic2hvdWxkRW5hYmxlQWlycGxhbmVNb2RlIiwic2hvdWxkRW5hYmxlV2lmaSIsInNob3VsZEVuYWJsZURhdGFDb25uZWN0aW9uIiwiaXNBaXJwbGFuZU1vZGVFbmFibGVkIiwiaXNXaUZpRW5hYmxlZCIsImlzRGF0YUVuYWJsZWQiLCJ3cmFwQm9vdHN0cmFwRGlzY29ubmVjdCIsInRvZ2dsZURhdGEiLCJzZXRXaWZpQW5kRGF0YSIsInRvZ2dsZVdpRmkiLCJ0b2dnbGVGbGlnaHRNb2RlIiwiZmxpZ2h0TW9kZSIsInNldEdlb0xvY2F0aW9uIiwibG9jYXRpb24iLCJnZXRHZW9Mb2NhdGlvbiIsImUiLCJ3YXJuIiwibWVzc2FnZSIsImxhdGl0dWRlIiwibG9uZ2l0dWRlIiwiYWx0aXR1ZGUiLCJtb2JpbGVSZWZyZXNoR3BzQ2FjaGUiLCJ0aW1lb3V0TXMiLCJyZWZyZXNoR2VvTG9jYXRpb25DYWNoZSIsInBhcnNlRmxvYXQiLCJpc0xvY2F0aW9uU2VydmljZXNFbmFibGVkIiwiaUxvY2F0aW9uU2VydmljZXNFbmFibGVkIiwiZ2V0TG9jYXRpb25Qcm92aWRlcnMiLCJ0b2dnbGVMb2NhdGlvblNlcnZpY2VzIiwiaXNHcHNFbmFibGVkIiwiZGVidWciLCJ0b2dnbGVHUFNMb2NhdGlvblByb3ZpZGVyIiwid3JhcHBlZCIsImJvb3RzdHJhcCIsImlnbm9yZVVuZXhwZWN0ZWRTaHV0ZG93biIsInJlc3RhcnQiLCJzdGFydCIsImFwcFBhY2thZ2UiLCJkaXNhYmxlQW5kcm9pZFdhdGNoZXJzIiwiYWNjZXB0U3NsQ2VydHMiLCJPYmplY3QiLCJhc3NpZ24iLCJfZGVmYXVsdCIsImRlZmF1bHQiXSwic291cmNlcyI6WyIuLi8uLi8uLi9saWIvY29tbWFuZHMvbmV0d29yay5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgXyBmcm9tICdsb2Rhc2gnO1xuaW1wb3J0IHsgZXJyb3JzIH0gZnJvbSAnYXBwaXVtL2RyaXZlcic7XG5pbXBvcnQgeyB1dGlsIH0gZnJvbSAnYXBwaXVtL3N1cHBvcnQnO1xuaW1wb3J0IEIgZnJvbSAnYmx1ZWJpcmQnO1xuXG5sZXQgY29tbWFuZHMgPSB7fSwgaGVscGVycyA9IHt9LCBleHRlbnNpb25zID0ge307XG5cbmNvbnN0IEFJUlBMQU5FX01PREVfTUFTSyA9IDBiMDAxO1xuY29uc3QgV0lGSV9NQVNLID0gMGIwMTA7XG5jb25zdCBEQVRBX01BU0sgPSAwYjEwMDtcbi8vIFRoZSB2YWx1ZSBjbG9zZSB0byB6ZXJvLCBidXQgbm90IHplcm8sIGlzIG5lZWRlZFxuLy8gdG8gdHJpY2sgSlNPTiBnZW5lcmF0aW9uIGFuZCBzZW5kIGEgZmxvYXQgdmFsdWUgaW5zdGVhZCBvZiBhbiBpbnRlZ2VyLFxuLy8gVGhpcyBhbGxvd3Mgc3RyaWN0bHktdHlwZWQgY2xpZW50cywgbGlrZSBKYXZhLCB0byBwcm9wZXJseVxuLy8gcGFyc2UgaXQuIE90aGVyd2lzZSBmbG9hdCAwLjAgaXMgYWx3YXlzIHJlcHJlc2VudGVkIGFzIGludGVnZXIgMCBpbiBKUy5cbi8vIFRoZSB2YWx1ZSBtdXN0IG5vdCBiZSBncmVhdGVyIHRoYW4gREJMX0VQU0lMT04gKGh0dHBzOi8vb3BlbnNvdXJjZS5hcHBsZS5jb20vc291cmNlL0xpYmMvTGliYy00OTgvaW5jbHVkZS9mbG9hdC5oKVxuY29uc3QgR0VPX0VQU0lMT04gPSBOdW1iZXIuTUlOX1ZBTFVFO1xuY29uc3QgV0lGSV9LRVlfTkFNRSA9ICd3aWZpJztcbmNvbnN0IERBVEFfS0VZX05BTUUgPSAnZGF0YSc7XG5jb25zdCBBSVJQTEFORV9NT0RFX0tFWV9OQU1FID0gJ2FpcnBsYW5lTW9kZSc7XG5jb25zdCBTVVBQT1JURURfU0VSVklDRV9OQU1FUyA9IFtXSUZJX0tFWV9OQU1FLCBEQVRBX0tFWV9OQU1FLCBBSVJQTEFORV9NT0RFX0tFWV9OQU1FXTtcblxuY29tbWFuZHMuZ2V0TmV0d29ya0Nvbm5lY3Rpb24gPSBhc3luYyBmdW5jdGlvbiBnZXROZXR3b3JrQ29ubmVjdGlvbiAoKSB7XG4gIHRoaXMubG9nLmluZm8oJ0dldHRpbmcgbmV0d29yayBjb25uZWN0aW9uJyk7XG4gIGxldCBhaXJwbGFuZU1vZGVPbiA9IGF3YWl0IHRoaXMuYWRiLmlzQWlycGxhbmVNb2RlT24oKTtcbiAgbGV0IGNvbm5lY3Rpb24gPSBhaXJwbGFuZU1vZGVPbiA/IEFJUlBMQU5FX01PREVfTUFTSyA6IDA7XG5cbiAgLy8gbm8gbmVlZCB0byBjaGVjayBhbnl0aGluZyBlbHNlIGlmIHdlIGFyZSBpbiBhaXJwbGFuZSBtb2RlXG4gIGlmICghYWlycGxhbmVNb2RlT24pIHtcbiAgICBsZXQgd2lmaU9uID0gYXdhaXQgdGhpcy5pc1dpZmlPbigpO1xuICAgIGNvbm5lY3Rpb24gfD0gKHdpZmlPbiA/IFdJRklfTUFTSyA6IDApO1xuICAgIGxldCBkYXRhT24gPSBhd2FpdCB0aGlzLmFkYi5pc0RhdGFPbigpO1xuICAgIGNvbm5lY3Rpb24gfD0gKGRhdGFPbiA/IERBVEFfTUFTSyA6IDApO1xuICB9XG5cbiAgcmV0dXJuIGNvbm5lY3Rpb247XG59O1xuXG4vKipcbiAqIGRlY291cGxpbmcgdG8gb3ZlcnJpZGUgdGhlIGJlaGF2aW91ciBpbiBvdGhlciBkcml2ZXJzIGxpa2UgVWlBdXRvbWF0b3IyLlxuICovXG5jb21tYW5kcy5pc1dpZmlPbiA9IGFzeW5jIGZ1bmN0aW9uIGlzV2lmaU9uICgpIHtcbiAgcmV0dXJuIGF3YWl0IHRoaXMuYWRiLmlzV2lmaU9uKCk7XG59O1xuXG4vKipcbiAqIEB0eXBlZGVmIHtPYmplY3R9IFNldENvbm5lY3Rpdml0eU9wdGlvbnNcbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbj99IHdpZmkgRWl0aGVyIHRvIGVuYWJsZSBvciBkaXNhYmxlIFdpLUZpLlxuICogQW4gdW5zZXQgdmFsdWUgbWVhbnMgdG8gbm90IGNoYW5nZSB0aGUgc3RhdGUgZm9yIHRoZSBnaXZlbiBzZXJ2aWNlLlxuICogQHByb3BlcnR5IHtib29sZWFuP30gZGF0YSBFaXRoZXIgdG8gZW5hYmxlIG9yIGRpc2FibGUgbW9iaWxlIGRhdGEgY29ubmVjdGlvbi5cbiAqIEFuIHVuc2V0IHZhbHVlIG1lYW5zIHRvIG5vdCBjaGFuZ2UgdGhlIHN0YXRlIGZvciB0aGUgZ2l2ZW4gc2VydmljZS5cbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbj99IGFpcnBsYW5lTW9kZSBFaXRoZXIgdG8gZW5hYmxlIHRvIGRpc2FibGUgdGhlIEFpcnBsYW5lIE1vZGVcbiAqIEFuIHVuc2V0IHZhbHVlIG1lYW5zIHRvIG5vdCBjaGFuZ2UgdGhlIHN0YXRlIGZvciB0aGUgZ2l2ZW4gc2VydmljZS5cbiAqL1xuXG4vKipcbiAqIFNldCB0aGUgY29ubmVjdGl2aXR5IHN0YXRlIGZvciBkaWZmZXJlbnQgc2VydmljZXNcbiAqXG4gKiBAcGFyYW0ge1NldENvbm5lY3Rpdml0eU9wdGlvbnN9IG9wdHNcbiAqIEB0aHJvd3Mge0Vycm9yfSBJZiBub25lIG9mIGtub3duIHByb3BlcnRpZXMgd2VyZSBwcm92aWRlZCBvciB0aGVyZSB3YXMgYW4gZXJyb3JcbiAqIHdoaWxlIGNoYW5naW5nIGNvbm5lY3Rpdml0eSBzdGF0ZXNcbiAqL1xuY29tbWFuZHMubW9iaWxlU2V0Q29ubmVjdGl2aXR5ID0gYXN5bmMgZnVuY3Rpb24gbW9iaWxlU2V0Q29ubmVjdGl2aXR5IChvcHRzID0ge30pIHtcbiAgY29uc3Qge1xuICAgIHdpZmksXG4gICAgZGF0YSxcbiAgICBhaXJwbGFuZU1vZGUsXG4gIH0gPSBvcHRzO1xuXG4gIGlmIChfLmV2ZXJ5KFt3aWZpLCBkYXRhLCBhaXJwbGFuZU1vZGVdLCBfLmlzVW5kZWZpbmVkKSkge1xuICAgIHRocm93IG5ldyBlcnJvcnMuSW52YWxpZEFyZ3VtZW50RXJyb3IoXG4gICAgICBgRWl0aGVyIG9uZSBvZiAke0pTT04uc3RyaW5naWZ5KFNVUFBPUlRFRF9TRVJWSUNFX05BTUVTKX0gb3B0aW9ucyBtdXN0IGJlIHByb3ZpZGVkYFxuICAgICk7XG4gIH1cblxuICBjb25zdCBjdXJyZW50U3RhdGUgPSBhd2FpdCB0aGlzLm1vYmlsZUdldENvbm5lY3Rpdml0eSh7XG4gICAgc2VydmljZXM6IFtcbiAgICAgIC4uLihfLmlzVW5kZWZpbmVkKHdpZmkpID8gW10gOiBbV0lGSV9LRVlfTkFNRV0pLFxuICAgICAgLi4uKF8uaXNVbmRlZmluZWQoZGF0YSkgPyBbXSA6IFtEQVRBX0tFWV9OQU1FXSksXG4gICAgICAuLi4oXy5pc1VuZGVmaW5lZChhaXJwbGFuZU1vZGUpID8gW10gOiBbQUlSUExBTkVfTU9ERV9LRVlfTkFNRV0pLFxuICAgIF1cbiAgfSk7XG4gIGNvbnN0IHNldHRlcnMgPSBbXTtcbiAgaWYgKCFfLmlzVW5kZWZpbmVkKHdpZmkpICYmIGN1cnJlbnRTdGF0ZS53aWZpICE9PSBCb29sZWFuKHdpZmkpKSB7XG4gICAgc2V0dGVycy5wdXNoKHRoaXMuYWRiLnNldFdpZmlTdGF0ZSh3aWZpLCB0aGlzLmlzRW11bGF0b3IoKSkpO1xuICB9XG4gIGlmICghXy5pc1VuZGVmaW5lZChkYXRhKSAmJiBjdXJyZW50U3RhdGUuZGF0YSAhPT0gQm9vbGVhbihkYXRhKSkge1xuICAgIHNldHRlcnMucHVzaCh0aGlzLmFkYi5zZXREYXRhU3RhdGUoZGF0YSwgdGhpcy5pc0VtdWxhdG9yKCkpKTtcbiAgfVxuICBpZiAoIV8uaXNVbmRlZmluZWQoYWlycGxhbmVNb2RlKSAmJiBjdXJyZW50U3RhdGUuYWlycGxhbmVNb2RlICE9PSBCb29sZWFuKGFpcnBsYW5lTW9kZSkpIHtcbiAgICBzZXR0ZXJzLnB1c2goYXN5bmMgKCkgPT4ge1xuICAgICAgYXdhaXQgdGhpcy5hZGIuc2V0QWlycGxhbmVNb2RlKGFpcnBsYW5lTW9kZSk7XG4gICAgICBpZiAodGhpcy5hZGIuZ2V0QXBpTGV2ZWwoKSA8IDMwKSB7XG4gICAgICAgIGF3YWl0IHRoaXMuYWRiLmJyb2FkY2FzdEFpcnBsYW5lTW9kZShhaXJwbGFuZU1vZGUpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG4gIGlmICghXy5pc0VtcHR5KHNldHRlcnMpKSB7XG4gICAgYXdhaXQgQi5hbGwoc2V0dGVycyk7XG4gIH1cbn07XG5cbi8qKlxuICogQHR5cGVkZWYge09iamVjdH0gR2V0Q29ubmVjdGl2aXR5UmVzdWx0XG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IHdpZmkgVHJ1ZSBpZiB3aWZpIGlzIGVuYWJsZWRcbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gZGF0YSBUcnVlIGlmIG1vYmlsZSBkYXRhIGNvbm5lY3Rpb24gaXMgZW5hYmxlZFxuICogQHByb3BlcnR5IHtib29sZWFufSBhaXJwbGFuZU1vZGUgVHJ1ZSBpZiBBaXJwbGFuZSBNb2RlIGlzIGVuYWJsZWRcbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtPYmplY3R9IEdldENvbm5lY3Rpdml0eU9wdGlvbnNcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nW118c3RyaW5nP30gc2VydmljZXMgb25lIG9yIG1vcmUgc2VydmljZXMgdG8gZ2V0IHRoZSBjb25uZWN0aXZpdHkgZm9yLlxuICogU3VwcG9ydGVkIHNlcnZpY2UgbmFtZXMgYXJlOiB3aWZpLCBkYXRhLCBhaXJwbGFuZU1vZGUuXG4gKi9cblxuLyoqXG4gKiBSZXRyaWV2ZXMgdGhlIGNvbm5lY3Rpdml0eSBwcm9wZXJ0aWVzIGZyb20gdGhlIGRldmljZSB1bmRlciB0ZXN0XG4gKlxuICogQHBhcmFtIHtHZXRDb25uZWN0aXZpdHlPcHRpb25zP30gb3B0cyBJZiBubyBzZXJ2aWNlIG5hbWVzIGFyZSBwcm92aWRlZCB0aGVuIHRoZVxuICogY29ubmVjdGl2aXR5IHN0YXRlIGlzIHJldHVybmVkIGZvciBhbGwgb2YgdGhlbS5cbiAqIEByZXR1cm5zIHtHZXRDb25uZWN0aXZpdHlSZXN1bHR9XG4gKi9cbmNvbW1hbmRzLm1vYmlsZUdldENvbm5lY3Rpdml0eSA9IGFzeW5jIGZ1bmN0aW9uIG1vYmlsZUdldENvbm5lY3Rpdml0eSAob3B0cyA9IHt9KSB7XG4gIGxldCB7XG4gICAgc2VydmljZXMgPSBTVVBQT1JURURfU0VSVklDRV9OQU1FUyxcbiAgfSA9IG9wdHM7XG4gIGlmICghXy5pc0FycmF5KHNlcnZpY2VzKSkge1xuICAgIHNlcnZpY2VzID0gW3NlcnZpY2VzXTtcbiAgfVxuICBjb25zdCB1bnN1cHBvcnRlZFNlcnZpY2VzID0gXy5kaWZmZXJlbmNlKHNlcnZpY2VzLCBTVVBQT1JURURfU0VSVklDRV9OQU1FUyk7XG4gIGlmICghXy5pc0VtcHR5KHVuc3VwcG9ydGVkU2VydmljZXMpKSB7XG4gICAgdGhyb3cgbmV3IGVycm9ycy5JbnZhbGlkQXJndW1lbnRFcnJvcihcbiAgICAgIGAke3V0aWwucGx1cmFsaXplKCdTZXJ2aWNlIG5hbWUnLCB1bnN1cHBvcnRlZFNlcnZpY2VzLmxlbmd0aCwgZmFsc2UpfSAke3Vuc3VwcG9ydGVkU2VydmljZXN9IGAgK1xuICAgICAgYCR7dW5zdXBwb3J0ZWRTZXJ2aWNlcy5sZW5ndGggPT09IDEgPyAnaXMnIDogJ2FyZSd9IG5vdCBrbm93bi4gT25seSB0aGUgZm9sbG93aW5nIHNlcnZpY2VzIGFyZSBgICtcbiAgICAgIGBzdXBvcnRlZDogJHtTVVBQT1JURURfU0VSVklDRV9OQU1FU31gXG4gICAgKTtcbiAgfVxuXG4gIGNvbnN0IHN0YXRlUHJvbWlzZXMgPSB7XG4gICAgd2lmaTogQi5yZXNvbHZlKHNlcnZpY2VzLmluY2x1ZGVzKFdJRklfS0VZX05BTUUpID8gdGhpcy5hZGIuaXNXaWZpT24oKSA6IHVuZGVmaW5lZCksXG4gICAgZGF0YTogQi5yZXNvbHZlKHNlcnZpY2VzLmluY2x1ZGVzKERBVEFfS0VZX05BTUUpID8gdGhpcy5hZGIuaXNEYXRhT24oKSA6IHVuZGVmaW5lZCksXG4gICAgYWlycGxhbmVNb2RlOiBCLnJlc29sdmUoXG4gICAgICBzZXJ2aWNlcy5pbmNsdWRlcyhBSVJQTEFORV9NT0RFX0tFWV9OQU1FKSA/IHRoaXMuYWRiLmlzQWlycGxhbmVNb2RlT24oKSA6IHVuZGVmaW5lZFxuICAgICksXG4gIH07XG4gIGF3YWl0IEIuYWxsKF8udmFsdWVzKHN0YXRlUHJvbWlzZXMpKTtcbiAgcmV0dXJuIF8uZnJvbVBhaXJzKHNlcnZpY2VzLm1hcCgoaykgPT4gW2ssIHN0YXRlUHJvbWlzZXNba10udmFsdWUoKV0pKTtcbn07XG5cbmNvbW1hbmRzLnNldE5ldHdvcmtDb25uZWN0aW9uID0gYXN5bmMgZnVuY3Rpb24gc2V0TmV0d29ya0Nvbm5lY3Rpb24gKHR5cGUpIHtcbiAgdGhpcy5sb2cuaW5mbygnU2V0dGluZyBuZXR3b3JrIGNvbm5lY3Rpb24nKTtcbiAgLy8gZGVjb2RlIHRoZSBpbnB1dFxuICBjb25zdCBzaG91bGRFbmFibGVBaXJwbGFuZU1vZGUgPSAodHlwZSAmIEFJUlBMQU5FX01PREVfTUFTSykgIT09IDA7XG4gIGNvbnN0IHNob3VsZEVuYWJsZVdpZmkgPSAodHlwZSAmIFdJRklfTUFTSykgIT09IDA7XG4gIGNvbnN0IHNob3VsZEVuYWJsZURhdGFDb25uZWN0aW9uID0gKHR5cGUgJiBEQVRBX01BU0spICE9PSAwO1xuXG4gIGNvbnN0IGN1cnJlbnRTdGF0ZSA9IGF3YWl0IHRoaXMuZ2V0TmV0d29ya0Nvbm5lY3Rpb24oKTtcbiAgY29uc3QgaXNBaXJwbGFuZU1vZGVFbmFibGVkID0gKGN1cnJlbnRTdGF0ZSAmIEFJUlBMQU5FX01PREVfTUFTSykgIT09IDA7XG4gIGNvbnN0IGlzV2lGaUVuYWJsZWQgPSAoY3VycmVudFN0YXRlICYgV0lGSV9NQVNLKSAhPT0gMDtcbiAgY29uc3QgaXNEYXRhRW5hYmxlZCA9IChjdXJyZW50U3RhdGUgJiBEQVRBX01BU0spICE9PSAwO1xuXG4gIGlmIChzaG91bGRFbmFibGVBaXJwbGFuZU1vZGUgIT09IGlzQWlycGxhbmVNb2RlRW5hYmxlZCkge1xuICAgIGF3YWl0IHRoaXMud3JhcEJvb3RzdHJhcERpc2Nvbm5lY3QoYXN5bmMgKCkgPT4ge1xuICAgICAgYXdhaXQgdGhpcy5hZGIuc2V0QWlycGxhbmVNb2RlKHNob3VsZEVuYWJsZUFpcnBsYW5lTW9kZSk7XG4gICAgfSk7XG4gICAgYXdhaXQgdGhpcy53cmFwQm9vdHN0cmFwRGlzY29ubmVjdChhc3luYyAoKSA9PiB7XG4gICAgICBpZiAoYXdhaXQgdGhpcy5hZGIuZ2V0QXBpTGV2ZWwoKSA8IDMwKSB7XG4gICAgICAgIGF3YWl0IHRoaXMuYWRiLmJyb2FkY2FzdEFpcnBsYW5lTW9kZShzaG91bGRFbmFibGVBaXJwbGFuZU1vZGUpO1xuICAgICAgfVxuICAgIH0pO1xuICB9IGVsc2Uge1xuICAgIHRoaXMubG9nLmluZm8oXG4gICAgICBgTm90IGNoYW5naW5nIGFpcnBsYW5lIG1vZGUsIHNpbmNlIGl0IGlzIGFscmVhZHkgJHtzaG91bGRFbmFibGVBaXJwbGFuZU1vZGUgPyAnZW5hYmxlZCcgOiAnZGlzYWJsZWQnfWBcbiAgICApO1xuICB9XG5cbiAgaWYgKHNob3VsZEVuYWJsZVdpZmkgPT09IGlzV2lGaUVuYWJsZWQgJiYgc2hvdWxkRW5hYmxlRGF0YUNvbm5lY3Rpb24gPT09IGlzRGF0YUVuYWJsZWQpIHtcbiAgICB0aGlzLmxvZy5pbmZvKCdOb3QgY2hhbmdpbmcgZGF0YSBjb25uZWN0aW9uL1dpLUZpIHN0YXRlcywgc2luY2UgdGhleSBhcmUgYWxyZWFkeSBzZXQgdG8gZXhwZWN0ZWQgdmFsdWVzJyk7XG4gICAgaWYgKGF3YWl0IHRoaXMuYWRiLmlzQWlycGxhbmVNb2RlT24oKSkge1xuICAgICAgcmV0dXJuIEFJUlBMQU5FX01PREVfTUFTSyB8IGN1cnJlbnRTdGF0ZTtcbiAgICB9XG4gICAgcmV0dXJuIH5BSVJQTEFORV9NT0RFX01BU0sgJiBjdXJyZW50U3RhdGU7XG4gIH1cblxuICBhd2FpdCB0aGlzLndyYXBCb290c3RyYXBEaXNjb25uZWN0KGFzeW5jICgpID0+IHtcbiAgICBpZiAoc2hvdWxkRW5hYmxlV2lmaSAhPT0gaXNXaUZpRW5hYmxlZCkge1xuICAgICAgYXdhaXQgdGhpcy5zZXRXaWZpU3RhdGUoc2hvdWxkRW5hYmxlV2lmaSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMubG9nLmluZm8oYE5vdCBjaGFuZ2luZyBXaS1GaSBzdGF0ZSwgc2luY2UgaXQgaXMgYWxyZWFkeSBgICtcbiAgICAgICAgYCR7c2hvdWxkRW5hYmxlV2lmaSA/ICdlbmFibGVkJyA6ICdkaXNhYmxlZCd9YCk7XG4gICAgfVxuXG4gICAgaWYgKHNob3VsZEVuYWJsZUFpcnBsYW5lTW9kZSkge1xuICAgICAgdGhpcy5sb2cuaW5mbygnTm90IGNoYW5naW5nIGRhdGEgY29ubmVjdGlvbiBzdGF0ZSwgYmVjYXVzZSBhaXJwbGFuZSBtb2RlIGlzIGVuYWJsZWQnKTtcbiAgICB9IGVsc2UgaWYgKHNob3VsZEVuYWJsZURhdGFDb25uZWN0aW9uID09PSBpc0RhdGFFbmFibGVkKSB7XG4gICAgICB0aGlzLmxvZy5pbmZvKGBOb3QgY2hhbmdpbmcgZGF0YSBjb25uZWN0aW9uIHN0YXRlLCBzaW5jZSBpdCBpcyBhbHJlYWR5IGAgK1xuICAgICAgICBgJHtzaG91bGRFbmFibGVEYXRhQ29ubmVjdGlvbiA/ICdlbmFibGVkJyA6ICdkaXNhYmxlZCd9YCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGF3YWl0IHRoaXMuYWRiLnNldERhdGFTdGF0ZShzaG91bGRFbmFibGVEYXRhQ29ubmVjdGlvbiwgdGhpcy5pc0VtdWxhdG9yKCkpO1xuICAgIH1cbiAgfSk7XG5cbiAgcmV0dXJuIGF3YWl0IHRoaXMuZ2V0TmV0d29ya0Nvbm5lY3Rpb24oKTtcbn07XG5cbi8qKlxuICogZGVjb3VwbGluZyB0byBvdmVycmlkZSBiZWhhdmlvdXIgaW4gb3RoZXIgZHJpdmVycyBsaWtlIFVpQXV0b21hdG9yMi5cbiAqL1xuY29tbWFuZHMuc2V0V2lmaVN0YXRlID0gYXN5bmMgZnVuY3Rpb24gc2V0V2lmaVN0YXRlICh3aWZpKSB7XG4gIGF3YWl0IHRoaXMuYWRiLnNldFdpZmlTdGF0ZSh3aWZpLCB0aGlzLmlzRW11bGF0b3IoKSk7XG59O1xuXG5jb21tYW5kcy50b2dnbGVEYXRhID0gYXN5bmMgZnVuY3Rpb24gdG9nZ2xlRGF0YSAoKSB7XG4gIGxldCBkYXRhID0gIShhd2FpdCB0aGlzLmFkYi5pc0RhdGFPbigpKTtcbiAgdGhpcy5sb2cuaW5mbyhgVHVybmluZyBuZXR3b3JrIGRhdGEgJHtkYXRhID8gJ29uJyA6ICdvZmYnfWApO1xuICBhd2FpdCB0aGlzLndyYXBCb290c3RyYXBEaXNjb25uZWN0KGFzeW5jICgpID0+IHtcbiAgICBhd2FpdCB0aGlzLmFkYi5zZXRXaWZpQW5kRGF0YSh7ZGF0YX0sIHRoaXMuaXNFbXVsYXRvcigpKTtcbiAgfSk7XG59O1xuXG5jb21tYW5kcy50b2dnbGVXaUZpID0gYXN5bmMgZnVuY3Rpb24gdG9nZ2xlV2lGaSAoKSB7XG4gIGxldCB3aWZpID0gIShhd2FpdCB0aGlzLmFkYi5pc1dpZmlPbigpKTtcbiAgdGhpcy5sb2cuaW5mbyhgVHVybmluZyBXaUZpICR7d2lmaSA/ICdvbicgOiAnb2ZmJ31gKTtcbiAgYXdhaXQgdGhpcy53cmFwQm9vdHN0cmFwRGlzY29ubmVjdChhc3luYyAoKSA9PiB7XG4gICAgYXdhaXQgdGhpcy5hZGIuc2V0V2lmaUFuZERhdGEoe3dpZml9LCB0aGlzLmlzRW11bGF0b3IoKSk7XG4gIH0pO1xufTtcblxuY29tbWFuZHMudG9nZ2xlRmxpZ2h0TW9kZSA9IGFzeW5jIGZ1bmN0aW9uIHRvZ2dsZUZsaWdodE1vZGUgKCkge1xuICAvKlxuICAgKiBUT0RPOiBJbXBsZW1lbnQgaXNSZWFsRGV2aWNlKCkuIFRoaXMgbWV0aG9kIGZhaWxzIG9uXG4gICAqIHJlYWwgZGV2aWNlcywgaXQgc2hvdWxkIHRocm93IGEgTm90WWV0SW1wbGVtZW50ZWRFcnJvclxuICAgKi9cbiAgbGV0IGZsaWdodE1vZGUgPSAhKGF3YWl0IHRoaXMuYWRiLmlzQWlycGxhbmVNb2RlT24oKSk7XG4gIHRoaXMubG9nLmluZm8oYFR1cm5pbmcgZmxpZ2h0IG1vZGUgJHtmbGlnaHRNb2RlID8gJ29uJyA6ICdvZmYnfWApO1xuICBhd2FpdCB0aGlzLndyYXBCb290c3RyYXBEaXNjb25uZWN0KGFzeW5jICgpID0+IHtcbiAgICBhd2FpdCB0aGlzLmFkYi5zZXRBaXJwbGFuZU1vZGUoZmxpZ2h0TW9kZSk7XG4gIH0pO1xuICBhd2FpdCB0aGlzLndyYXBCb290c3RyYXBEaXNjb25uZWN0KGFzeW5jICgpID0+IHtcbiAgICBpZiAoYXdhaXQgdGhpcy5hZGIuZ2V0QXBpTGV2ZWwoKSA8IDMwKSB7XG4gICAgICBhd2FpdCB0aGlzLmFkYi5icm9hZGNhc3RBaXJwbGFuZU1vZGUoZmxpZ2h0TW9kZSk7XG4gICAgfVxuICB9KTtcbn07XG5cbmNvbW1hbmRzLnNldEdlb0xvY2F0aW9uID0gYXN5bmMgZnVuY3Rpb24gc2V0R2VvTG9jYXRpb24gKGxvY2F0aW9uKSB7XG4gIGF3YWl0IHRoaXMuYWRiLnNldEdlb0xvY2F0aW9uKGxvY2F0aW9uLCB0aGlzLmlzRW11bGF0b3IoKSk7XG4gIHRyeSB7XG4gICAgcmV0dXJuIGF3YWl0IHRoaXMuZ2V0R2VvTG9jYXRpb24oKTtcbiAgfSBjYXRjaCAoZSkge1xuICAgIHRoaXMubG9nLndhcm4oYENvdWxkIG5vdCBnZXQgdGhlIGN1cnJlbnQgZ2VvbG9jYXRpb24gaW5mbzogJHtlLm1lc3NhZ2V9YCk7XG4gICAgdGhpcy5sb2cud2FybihgUmV0dXJuaW5nIHRoZSBkZWZhdWx0IHplcm8nZWQgdmFsdWVzYCk7XG4gICAgcmV0dXJuIHtcbiAgICAgIGxhdGl0dWRlOiBHRU9fRVBTSUxPTixcbiAgICAgIGxvbmdpdHVkZTogR0VPX0VQU0lMT04sXG4gICAgICBhbHRpdHVkZTogR0VPX0VQU0lMT04sXG4gICAgfTtcbiAgfVxufTtcblxuLyoqXG4gKiBAdHlwZWRlZiB7T2JqZWN0fSBHcHNDYWNoZVJlZnJlc2hPcHRpb25zXG4gKiBAcHJvcGVydHkge251bWJlcn0gdGltZW91dE1zIFsyMDAwMF0gVGhlIG1heGltdW0gbnVtYmVyIG9mIG1pbGxpc2Vjb25kc1xuICogdG8gYmxvY2sgdW50aWwgR1BTIGNhY2hlIGlzIHJlZnJlc2hlZC4gUHJvdmlkaW5nIHplcm8gb3IgYSBuZWdhdGl2ZVxuICogdmFsdWUgdG8gaXQgc2tpcHMgd2FpdGluZyBjb21wbGV0ZWx5LlxuICovXG5cbi8qKlxuICogU2VuZHMgYW4gYXN5bmMgcmVxdWVzdCB0byByZWZyZXNoIHRoZSBHUFMgY2FjaGUuXG4gKiBUaGlzIGZlYXR1cmUgb25seSB3b3JrcyBpZiB0aGUgZGV2aWNlIHVuZGVyIHRlc3QgaGFzXG4gKiBHb29nbGUgUGxheSBTZXJ2aWNlcyBpbnN0YWxsZWQuIEluIGNhc2UgdGhlIHZhbmlsbGFcbiAqIExvY2F0aW9uTWFuYWdlciBpcyB1c2VkIHRoZSBkZXZpY2UgQVBJIGxldmVsIG11c3QgYmUgYXRcbiAqIHZlcnNpb24gMzAgKEFuZHJvaWQgUikgb3IgaGlnaGVyLlxuICpcbiAqIEBwYXJhbSB7R3BzQ2FjaGVSZWZyZXNoT3B0aW9uc30gb3B0c1xuICovXG5jb21tYW5kcy5tb2JpbGVSZWZyZXNoR3BzQ2FjaGUgPSBhc3luYyBmdW5jdGlvbiBtb2JpbGVSZWZyZXNoR3BzQ2FjaGUgKG9wdHMgPSB7fSkge1xuICBjb25zdCB7IHRpbWVvdXRNcyB9ID0gb3B0cztcbiAgYXdhaXQgdGhpcy5hZGIucmVmcmVzaEdlb0xvY2F0aW9uQ2FjaGUodGltZW91dE1zKTtcbn07XG5cbmNvbW1hbmRzLmdldEdlb0xvY2F0aW9uID0gYXN5bmMgZnVuY3Rpb24gZ2V0R2VvTG9jYXRpb24gKCkge1xuICBjb25zdCB7bGF0aXR1ZGUsIGxvbmdpdHVkZSwgYWx0aXR1ZGV9ID0gYXdhaXQgdGhpcy5hZGIuZ2V0R2VvTG9jYXRpb24oKTtcbiAgcmV0dXJuIHtcbiAgICBsYXRpdHVkZTogcGFyc2VGbG9hdChsYXRpdHVkZSkgfHwgR0VPX0VQU0lMT04sXG4gICAgbG9uZ2l0dWRlOiBwYXJzZUZsb2F0KGxvbmdpdHVkZSkgfHwgR0VPX0VQU0lMT04sXG4gICAgYWx0aXR1ZGU6IHBhcnNlRmxvYXQoYWx0aXR1ZGUpIHx8IEdFT19FUFNJTE9OLFxuICB9O1xufTtcblxuLyoqXG4gKiBDaGVja3MgaWYgR1BTIGlzIGVuYWJsZWRcbiAqXG4gKiBAcmV0dXJucyB7UHJvbWlzZTxCb29sZWFuPn0gVHJ1ZSBpZiB5ZXNcbiAqL1xuY29tbWFuZHMuaXNMb2NhdGlvblNlcnZpY2VzRW5hYmxlZCA9IGFzeW5jIGZ1bmN0aW9uIGlMb2NhdGlvblNlcnZpY2VzRW5hYmxlZCAoKSB7XG4gIHJldHVybiAoYXdhaXQgdGhpcy5hZGIuZ2V0TG9jYXRpb25Qcm92aWRlcnMoKSkuaW5jbHVkZXMoJ2dwcycpO1xufTtcblxuLyoqXG4gKiBUb2dnbGVzIEdQUyBzdGF0ZVxuICovXG5jb21tYW5kcy50b2dnbGVMb2NhdGlvblNlcnZpY2VzID0gYXN5bmMgZnVuY3Rpb24gdG9nZ2xlTG9jYXRpb25TZXJ2aWNlcyAoKSB7XG4gIHRoaXMubG9nLmluZm8oJ1RvZ2dsaW5nIGxvY2F0aW9uIHNlcnZpY2VzJyk7XG4gIGNvbnN0IGlzR3BzRW5hYmxlZCA9IGF3YWl0IHRoaXMuaXNMb2NhdGlvblNlcnZpY2VzRW5hYmxlZCgpO1xuICB0aGlzLmxvZy5kZWJ1ZyhcbiAgICBgQ3VycmVudCBHUFMgc3RhdGU6ICR7aXNHcHNFbmFibGVkfS4gYCArXG4gICAgYFRoZSBzZXJ2aWNlIGlzIGdvaW5nIHRvIGJlICR7aXNHcHNFbmFibGVkID8gJ2Rpc2FibGVkJyA6ICdlbmFibGVkJ31gXG4gICk7XG4gIGF3YWl0IHRoaXMuYWRiLnRvZ2dsZUdQU0xvY2F0aW9uUHJvdmlkZXIoIWlzR3BzRW5hYmxlZCk7XG59O1xuXG5oZWxwZXJzLndyYXBCb290c3RyYXBEaXNjb25uZWN0ID0gYXN5bmMgZnVuY3Rpb24gd3JhcEJvb3RzdHJhcERpc2Nvbm5lY3QgKHdyYXBwZWQpIHtcbiAgaWYgKCF0aGlzLmJvb3RzdHJhcCkge1xuICAgIHJldHVybiBhd2FpdCB3cmFwcGVkKCk7XG4gIH1cblxuICB0aGlzLmJvb3RzdHJhcC5pZ25vcmVVbmV4cGVjdGVkU2h1dGRvd24gPSB0cnVlO1xuICB0cnkge1xuICAgIGF3YWl0IHdyYXBwZWQoKTtcbiAgICBhd2FpdCB0aGlzLmFkYi5yZXN0YXJ0KCk7XG4gICAgYXdhaXQgdGhpcy5ib290c3RyYXAuc3RhcnQodGhpcy5vcHRzLmFwcFBhY2thZ2UsIHRoaXMub3B0cy5kaXNhYmxlQW5kcm9pZFdhdGNoZXJzLCB0aGlzLm9wdHMuYWNjZXB0U3NsQ2VydHMpO1xuICB9IGZpbmFsbHkge1xuICAgIHRoaXMuYm9vdHN0cmFwLmlnbm9yZVVuZXhwZWN0ZWRTaHV0ZG93biA9IGZhbHNlO1xuICB9XG59O1xuXG5PYmplY3QuYXNzaWduKGV4dGVuc2lvbnMsIGNvbW1hbmRzLCBoZWxwZXJzKTtcbmV4cG9ydCB7IGNvbW1hbmRzLCBoZWxwZXJzIH07XG5leHBvcnQgZGVmYXVsdCBleHRlbnNpb25zO1xuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7OztBQUFBLElBQUFBLE9BQUEsR0FBQUMsc0JBQUEsQ0FBQUMsT0FBQTtBQUNBLElBQUFDLE9BQUEsR0FBQUQsT0FBQTtBQUNBLElBQUFFLFFBQUEsR0FBQUYsT0FBQTtBQUNBLElBQUFHLFNBQUEsR0FBQUosc0JBQUEsQ0FBQUMsT0FBQTtBQUVBLElBQUlJLFFBQVEsR0FBRyxDQUFDLENBQUM7RUFBRUMsT0FBTyxHQUFHLENBQUMsQ0FBQztFQUFFQyxVQUFVLEdBQUcsQ0FBQyxDQUFDO0FBQUNDLE9BQUEsQ0FBQUYsT0FBQSxHQUFBQSxPQUFBO0FBQUFFLE9BQUEsQ0FBQUgsUUFBQSxHQUFBQSxRQUFBO0FBRWpELE1BQU1JLGtCQUFrQixHQUFHLEtBQUs7QUFDaEMsTUFBTUMsU0FBUyxHQUFHLEtBQUs7QUFDdkIsTUFBTUMsU0FBUyxHQUFHLEtBQUs7QUFNdkIsTUFBTUMsV0FBVyxHQUFHQyxNQUFNLENBQUNDLFNBQVM7QUFDcEMsTUFBTUMsYUFBYSxHQUFHLE1BQU07QUFDNUIsTUFBTUMsYUFBYSxHQUFHLE1BQU07QUFDNUIsTUFBTUMsc0JBQXNCLEdBQUcsY0FBYztBQUM3QyxNQUFNQyx1QkFBdUIsR0FBRyxDQUFDSCxhQUFhLEVBQUVDLGFBQWEsRUFBRUMsc0JBQXNCLENBQUM7QUFFdEZaLFFBQVEsQ0FBQ2Msb0JBQW9CLEdBQUcsZUFBZUEsb0JBQW9CQSxDQUFBLEVBQUk7RUFDckUsSUFBSSxDQUFDQyxHQUFHLENBQUNDLElBQUksQ0FBQyw0QkFBNEIsQ0FBQztF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
|
|
292
|
+
exports.default = extensions;
|
|
293
|
+
//# sourceMappingURL=network.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"network.js","names":["_lodash","_interopRequireDefault","require","_driver","_support","_bluebird","commands","helpers","extensions","exports","AIRPLANE_MODE_MASK","WIFI_MASK","DATA_MASK","GEO_EPSILON","Number","MIN_VALUE","WIFI_KEY_NAME","DATA_KEY_NAME","AIRPLANE_MODE_KEY_NAME","SUPPORTED_SERVICE_NAMES","getNetworkConnection","log","info","airplaneModeOn","adb","isAirplaneModeOn","connection","wifiOn","isWifiOn","dataOn","isDataOn","mobileSetConnectivity","opts","wifi","data","airplaneMode","_","every","isUndefined","errors","InvalidArgumentError","JSON","stringify","currentState","mobileGetConnectivity","services","setters","Boolean","push","setWifiState","isEmulator","setDataState","setAirplaneMode","getApiLevel","broadcastAirplaneMode","isEmpty","B","all","isArray","unsupportedServices","difference","util","pluralize","length","statePromises","resolve","includes","undefined","values","fromPairs","map","k","value","setNetworkConnection","type","shouldEnableAirplaneMode","shouldEnableWifi","shouldEnableDataConnection","isAirplaneModeEnabled","isWiFiEnabled","isDataEnabled","wrapBootstrapDisconnect","toggleData","setWifiAndData","toggleWiFi","toggleFlightMode","flightMode","setGeoLocation","location","getGeoLocation","e","warn","message","latitude","longitude","altitude","mobileRefreshGpsCache","timeoutMs","refreshGeoLocationCache","parseFloat","isLocationServicesEnabled","iLocationServicesEnabled","getLocationProviders","toggleLocationServices","isGpsEnabled","debug","toggleGPSLocationProvider","wrapped","bootstrap","ignoreUnexpectedShutdown","restart","start","appPackage","disableAndroidWatchers","acceptSslCerts","Object","assign","_default","default"],"sources":["../../../lib/commands/network.js"],"sourcesContent":["import _ from 'lodash';\nimport { errors } from 'appium/driver';\nimport { util } from 'appium/support';\nimport B from 'bluebird';\n\nlet commands = {}, helpers = {}, extensions = {};\n\nconst AIRPLANE_MODE_MASK = 0b001;\nconst WIFI_MASK = 0b010;\nconst DATA_MASK = 0b100;\n// The value close to zero, but not zero, is needed\n// to trick JSON generation and send a float value instead of an integer,\n// This allows strictly-typed clients, like Java, to properly\n// parse it. Otherwise float 0.0 is always represented as integer 0 in JS.\n// The value must not be greater than DBL_EPSILON (https://opensource.apple.com/source/Libc/Libc-498/include/float.h)\nconst GEO_EPSILON = Number.MIN_VALUE;\nconst WIFI_KEY_NAME = 'wifi';\nconst DATA_KEY_NAME = 'data';\nconst AIRPLANE_MODE_KEY_NAME = 'airplaneMode';\nconst SUPPORTED_SERVICE_NAMES = [WIFI_KEY_NAME, DATA_KEY_NAME, AIRPLANE_MODE_KEY_NAME];\n\ncommands.getNetworkConnection = async function getNetworkConnection () {\n this.log.info('Getting network connection');\n let airplaneModeOn = await this.adb.isAirplaneModeOn();\n let connection = airplaneModeOn ? AIRPLANE_MODE_MASK : 0;\n\n // no need to check anything else if we are in airplane mode\n if (!airplaneModeOn) {\n let wifiOn = await this.isWifiOn();\n connection |= (wifiOn ? WIFI_MASK : 0);\n let dataOn = await this.adb.isDataOn();\n connection |= (dataOn ? DATA_MASK : 0);\n }\n\n return connection;\n};\n\n/**\n * decoupling to override the behaviour in other drivers like UiAutomator2.\n */\ncommands.isWifiOn = async function isWifiOn () {\n return await this.adb.isWifiOn();\n};\n\n/**\n * @typedef {Object} SetConnectivityOptions\n * @property {boolean?} wifi Either to enable or disable Wi-Fi.\n * An unset value means to not change the state for the given service.\n * @property {boolean?} data Either to enable or disable mobile data connection.\n * An unset value means to not change the state for the given service.\n * @property {boolean?} airplaneMode Either to enable to disable the Airplane Mode\n * An unset value means to not change the state for the given service.\n */\n\n/**\n * Set the connectivity state for different services\n *\n * @param {SetConnectivityOptions} opts\n * @throws {Error} If none of known properties were provided or there was an error\n * while changing connectivity states\n */\ncommands.mobileSetConnectivity = async function mobileSetConnectivity (opts = {}) {\n const {\n wifi,\n data,\n airplaneMode,\n } = opts;\n\n if (_.every([wifi, data, airplaneMode], _.isUndefined)) {\n throw new errors.InvalidArgumentError(\n `Either one of ${JSON.stringify(SUPPORTED_SERVICE_NAMES)} options must be provided`\n );\n }\n\n const currentState = await this.mobileGetConnectivity({\n services: [\n ...(_.isUndefined(wifi) ? [] : [WIFI_KEY_NAME]),\n ...(_.isUndefined(data) ? [] : [DATA_KEY_NAME]),\n ...(_.isUndefined(airplaneMode) ? [] : [AIRPLANE_MODE_KEY_NAME]),\n ]\n });\n const setters = [];\n if (!_.isUndefined(wifi) && currentState.wifi !== Boolean(wifi)) {\n setters.push(this.adb.setWifiState(wifi, this.isEmulator()));\n }\n if (!_.isUndefined(data) && currentState.data !== Boolean(data)) {\n setters.push(this.adb.setDataState(data, this.isEmulator()));\n }\n if (!_.isUndefined(airplaneMode) && currentState.airplaneMode !== Boolean(airplaneMode)) {\n setters.push(async () => {\n await this.adb.setAirplaneMode(airplaneMode);\n if (this.adb.getApiLevel() < 30) {\n await this.adb.broadcastAirplaneMode(airplaneMode);\n }\n });\n }\n if (!_.isEmpty(setters)) {\n await B.all(setters);\n }\n};\n\n/**\n * @typedef {Object} GetConnectivityResult\n * @property {boolean} wifi True if wifi is enabled\n * @property {boolean} data True if mobile data connection is enabled\n * @property {boolean} airplaneMode True if Airplane Mode is enabled\n */\n\n/**\n * @typedef {Object} GetConnectivityOptions\n * @property {string[]|string?} services one or more services to get the connectivity for.\n * Supported service names are: wifi, data, airplaneMode.\n */\n\n/**\n * Retrieves the connectivity properties from the device under test\n *\n * @param {GetConnectivityOptions?} opts If no service names are provided then the\n * connectivity state is returned for all of them.\n * @returns {GetConnectivityResult}\n */\ncommands.mobileGetConnectivity = async function mobileGetConnectivity (opts = {}) {\n let {\n services = SUPPORTED_SERVICE_NAMES,\n } = opts;\n if (!_.isArray(services)) {\n services = [services];\n }\n const unsupportedServices = _.difference(services, SUPPORTED_SERVICE_NAMES);\n if (!_.isEmpty(unsupportedServices)) {\n throw new errors.InvalidArgumentError(\n `${util.pluralize('Service name', unsupportedServices.length, false)} ${unsupportedServices} ` +\n `${unsupportedServices.length === 1 ? 'is' : 'are'} not known. Only the following services are ` +\n `suported: ${SUPPORTED_SERVICE_NAMES}`\n );\n }\n\n const statePromises = {\n wifi: B.resolve(services.includes(WIFI_KEY_NAME) ? this.adb.isWifiOn() : undefined),\n data: B.resolve(services.includes(DATA_KEY_NAME) ? this.adb.isDataOn() : undefined),\n airplaneMode: B.resolve(\n services.includes(AIRPLANE_MODE_KEY_NAME) ? this.adb.isAirplaneModeOn() : undefined\n ),\n };\n await B.all(_.values(statePromises));\n return _.fromPairs(services.map((k) => [k, statePromises[k].value()]));\n};\n\ncommands.setNetworkConnection = async function setNetworkConnection (type) {\n this.log.info('Setting network connection');\n // decode the input\n const shouldEnableAirplaneMode = (type & AIRPLANE_MODE_MASK) !== 0;\n const shouldEnableWifi = (type & WIFI_MASK) !== 0;\n const shouldEnableDataConnection = (type & DATA_MASK) !== 0;\n\n const currentState = await this.getNetworkConnection();\n const isAirplaneModeEnabled = (currentState & AIRPLANE_MODE_MASK) !== 0;\n const isWiFiEnabled = (currentState & WIFI_MASK) !== 0;\n const isDataEnabled = (currentState & DATA_MASK) !== 0;\n\n if (shouldEnableAirplaneMode !== isAirplaneModeEnabled) {\n await this.wrapBootstrapDisconnect(async () => {\n await this.adb.setAirplaneMode(shouldEnableAirplaneMode);\n });\n await this.wrapBootstrapDisconnect(async () => {\n if (await this.adb.getApiLevel() < 30) {\n await this.adb.broadcastAirplaneMode(shouldEnableAirplaneMode);\n }\n });\n } else {\n this.log.info(\n `Not changing airplane mode, since it is already ${shouldEnableAirplaneMode ? 'enabled' : 'disabled'}`\n );\n }\n\n if (shouldEnableWifi === isWiFiEnabled && shouldEnableDataConnection === isDataEnabled) {\n this.log.info('Not changing data connection/Wi-Fi states, since they are already set to expected values');\n if (await this.adb.isAirplaneModeOn()) {\n return AIRPLANE_MODE_MASK | currentState;\n }\n return ~AIRPLANE_MODE_MASK & currentState;\n }\n\n await this.wrapBootstrapDisconnect(async () => {\n if (shouldEnableWifi !== isWiFiEnabled) {\n await this.setWifiState(shouldEnableWifi);\n } else {\n this.log.info(`Not changing Wi-Fi state, since it is already ` +\n `${shouldEnableWifi ? 'enabled' : 'disabled'}`);\n }\n\n if (shouldEnableAirplaneMode) {\n this.log.info('Not changing data connection state, because airplane mode is enabled');\n } else if (shouldEnableDataConnection === isDataEnabled) {\n this.log.info(`Not changing data connection state, since it is already ` +\n `${shouldEnableDataConnection ? 'enabled' : 'disabled'}`);\n } else {\n await this.adb.setDataState(shouldEnableDataConnection, this.isEmulator());\n }\n });\n\n return await this.getNetworkConnection();\n};\n\n/**\n * decoupling to override behaviour in other drivers like UiAutomator2.\n */\ncommands.setWifiState = async function setWifiState (wifi) {\n await this.adb.setWifiState(wifi, this.isEmulator());\n};\n\ncommands.toggleData = async function toggleData () {\n let data = !(await this.adb.isDataOn());\n this.log.info(`Turning network data ${data ? 'on' : 'off'}`);\n await this.wrapBootstrapDisconnect(async () => {\n await this.adb.setWifiAndData({data}, this.isEmulator());\n });\n};\n\ncommands.toggleWiFi = async function toggleWiFi () {\n let wifi = !(await this.adb.isWifiOn());\n this.log.info(`Turning WiFi ${wifi ? 'on' : 'off'}`);\n await this.wrapBootstrapDisconnect(async () => {\n await this.adb.setWifiAndData({wifi}, this.isEmulator());\n });\n};\n\ncommands.toggleFlightMode = async function toggleFlightMode () {\n /*\n * TODO: Implement isRealDevice(). This method fails on\n * real devices, it should throw a NotYetImplementedError\n */\n let flightMode = !(await this.adb.isAirplaneModeOn());\n this.log.info(`Turning flight mode ${flightMode ? 'on' : 'off'}`);\n await this.wrapBootstrapDisconnect(async () => {\n await this.adb.setAirplaneMode(flightMode);\n });\n await this.wrapBootstrapDisconnect(async () => {\n if (await this.adb.getApiLevel() < 30) {\n await this.adb.broadcastAirplaneMode(flightMode);\n }\n });\n};\n\ncommands.setGeoLocation = async function setGeoLocation (location) {\n await this.adb.setGeoLocation(location, this.isEmulator());\n try {\n return await this.getGeoLocation();\n } catch (e) {\n this.log.warn(`Could not get the current geolocation info: ${e.message}`);\n this.log.warn(`Returning the default zero'ed values`);\n return {\n latitude: GEO_EPSILON,\n longitude: GEO_EPSILON,\n altitude: GEO_EPSILON,\n };\n }\n};\n\n/**\n * @typedef {Object} GpsCacheRefreshOptions\n * @property {number} timeoutMs [20000] The maximum number of milliseconds\n * to block until GPS cache is refreshed. Providing zero or a negative\n * value to it skips waiting completely.\n */\n\n/**\n * Sends an async request to refresh the GPS cache.\n * This feature only works if the device under test has\n * Google Play Services installed. In case the vanilla\n * LocationManager is used the device API level must be at\n * version 30 (Android R) or higher.\n *\n * @param {GpsCacheRefreshOptions} opts\n */\ncommands.mobileRefreshGpsCache = async function mobileRefreshGpsCache (opts = {}) {\n const { timeoutMs } = opts;\n await this.adb.refreshGeoLocationCache(timeoutMs);\n};\n\ncommands.getGeoLocation = async function getGeoLocation () {\n const {latitude, longitude, altitude} = await this.adb.getGeoLocation();\n return {\n latitude: parseFloat(latitude) || GEO_EPSILON,\n longitude: parseFloat(longitude) || GEO_EPSILON,\n altitude: parseFloat(altitude) || GEO_EPSILON,\n };\n};\n\n/**\n * Checks if GPS is enabled\n *\n * @returns {Promise<Boolean>} True if yes\n */\ncommands.isLocationServicesEnabled = async function iLocationServicesEnabled () {\n return (await this.adb.getLocationProviders()).includes('gps');\n};\n\n/**\n * Toggles GPS state\n */\ncommands.toggleLocationServices = async function toggleLocationServices () {\n this.log.info('Toggling location services');\n const isGpsEnabled = await this.isLocationServicesEnabled();\n this.log.debug(\n `Current GPS state: ${isGpsEnabled}. ` +\n `The service is going to be ${isGpsEnabled ? 'disabled' : 'enabled'}`\n );\n await this.adb.toggleGPSLocationProvider(!isGpsEnabled);\n};\n\nhelpers.wrapBootstrapDisconnect = async function wrapBootstrapDisconnect (wrapped) {\n if (!this.bootstrap) {\n return await wrapped();\n }\n\n this.bootstrap.ignoreUnexpectedShutdown = true;\n try {\n await wrapped();\n await this.adb.restart();\n await this.bootstrap.start(this.opts.appPackage, this.opts.disableAndroidWatchers, this.opts.acceptSslCerts);\n } finally {\n this.bootstrap.ignoreUnexpectedShutdown = false;\n }\n};\n\nObject.assign(extensions, commands, helpers);\nexport { commands, helpers };\nexport default extensions;\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"network.js","sourceRoot":"","sources":["../../../lib/commands/network.js"],"names":[],"mappings":"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"}
|