appium-android-driver 4.46.0 → 4.47.0
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/build/lib/commands/execute.js +2 -1
- package/build/lib/commands/index.js +3 -3
- package/build/lib/commands/intent.js +193 -0
- package/lib/commands/execute.js +1 -0
- package/lib/commands/index.js +2 -2
- package/lib/commands/intent.js +292 -0
- package/package.json +1 -1
- package/build/lib/commands/services.js +0 -62
- package/lib/commands/services.js +0 -80
|
@@ -54,6 +54,7 @@ extensions.executeMobile = async function executeMobile(mobileCommand, opts = {}
|
|
|
54
54
|
deleteFile: 'mobileDeleteFile',
|
|
55
55
|
startService: 'mobileStartService',
|
|
56
56
|
stopService: 'mobileStopService',
|
|
57
|
+
startActivity: 'mobileStartActivity',
|
|
57
58
|
getContexts: 'mobileGetContexts'
|
|
58
59
|
};
|
|
59
60
|
|
|
@@ -68,4 +69,4 @@ var _default = extensions;
|
|
|
68
69
|
exports.default = _default;require('source-map-support').install();
|
|
69
70
|
|
|
70
71
|
|
|
71
|
-
//# sourceMappingURL=data:application/json;charset=utf8;base64,
|
|
72
|
+
//# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImxpYi9jb21tYW5kcy9leGVjdXRlLmpzIl0sIm5hbWVzIjpbImV4dGVuc2lvbnMiLCJleGVjdXRlIiwic2NyaXB0IiwiYXJncyIsIm1hdGNoIiwibG9nZ2VyIiwiaW5mbyIsInJlcGxhY2UiLCJ0cmltIiwiZXhlY3V0ZU1vYmlsZSIsIl8iLCJpc0FycmF5IiwiaXNXZWJDb250ZXh0IiwiZXJyb3JzIiwiTm90SW1wbGVtZW50ZWRFcnJvciIsImVuZHBvaW50IiwiY2hyb21lZHJpdmVyIiwiandwcm94eSIsImRvd25zdHJlYW1Qcm90b2NvbCIsIlBST1RPQ09MUyIsIk1KU09OV1AiLCJjb21tYW5kIiwibW9iaWxlQ29tbWFuZCIsIm9wdHMiLCJtb2JpbGVDb21tYW5kc01hcHBpbmciLCJzaGVsbCIsImV4ZWNFbXVDb25zb2xlQ29tbWFuZCIsInN0YXJ0TG9nc0Jyb2FkY2FzdCIsInN0b3BMb2dzQnJvYWRjYXN0IiwiY2hhbmdlUGVybWlzc2lvbnMiLCJnZXRQZXJtaXNzaW9ucyIsInBlcmZvcm1FZGl0b3JBY3Rpb24iLCJzZW5zb3JTZXQiLCJnZXREZXZpY2VUaW1lIiwic3RhcnRTY3JlZW5TdHJlYW1pbmciLCJzdG9wU2NyZWVuU3RyZWFtaW5nIiwiZ2V0Tm90aWZpY2F0aW9ucyIsImxpc3RTbXMiLCJkZWxldGVGaWxlIiwic3RhcnRTZXJ2aWNlIiwic3RvcFNlcnZpY2UiLCJzdGFydEFjdGl2aXR5IiwiZ2V0Q29udGV4dHMiLCJoYXMiLCJVbmtub3duQ29tbWFuZEVycm9yIiwia2V5cyJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7QUFBQTs7QUFDQTs7QUFDQTs7QUFFQSxJQUFJQSxVQUFVLEdBQUcsRUFBakI7O0FBRUFBLFVBQVUsQ0FBQ0MsT0FBWCxHQUFxQixlQUFlQSxPQUFmLENBQXdCQyxNQUF4QixFQUFnQ0MsSUFBaEMsRUFBc0M7QUFDekQsTUFBSUQsTUFBTSxDQUFDRSxLQUFQLENBQWEsVUFBYixDQUFKLEVBQThCO0FBQzVCQyxvQkFBT0MsSUFBUCxDQUFhLDZCQUE0QkosTUFBTyxHQUFoRDs7QUFDQUEsSUFBQUEsTUFBTSxHQUFHQSxNQUFNLENBQUNLLE9BQVAsQ0FBZSxVQUFmLEVBQTJCLEVBQTNCLEVBQStCQyxJQUEvQixFQUFUO0FBQ0EsV0FBTyxNQUFNLEtBQUtDLGFBQUwsQ0FBbUJQLE1BQW5CLEVBQTJCUSxnQkFBRUMsT0FBRixDQUFVUixJQUFWLElBQWtCQSxJQUFJLENBQUMsQ0FBRCxDQUF0QixHQUE0QkEsSUFBdkQsQ0FBYjtBQUNEOztBQUNELE1BQUksQ0FBQyxLQUFLUyxZQUFMLEVBQUwsRUFBMEI7QUFDeEIsVUFBTSxJQUFJQyx5QkFBT0MsbUJBQVgsRUFBTjtBQUNEOztBQUNELFFBQU1DLFFBQVEsR0FBRyxLQUFLQyxZQUFMLENBQWtCQyxPQUFsQixDQUEwQkMsa0JBQTFCLEtBQWlEQyw0QkFBVUMsT0FBM0QsR0FDYixVQURhLEdBRWIsZUFGSjtBQUdBLFNBQU8sTUFBTSxLQUFLSixZQUFMLENBQWtCQyxPQUFsQixDQUEwQkksT0FBMUIsQ0FBa0NOLFFBQWxDLEVBQTRDLE1BQTVDLEVBQW9EO0FBQy9EYixJQUFBQSxNQUQrRDtBQUUvREMsSUFBQUE7QUFGK0QsR0FBcEQsQ0FBYjtBQUlELENBaEJEOztBQWtCQUgsVUFBVSxDQUFDUyxhQUFYLEdBQTJCLGVBQWVBLGFBQWYsQ0FBOEJhLGFBQTlCLEVBQTZDQyxJQUFJLEdBQUcsRUFBcEQsRUFBd0Q7QUFDakYsUUFBTUMscUJBQXFCLEdBQUc7QUFDNUJDLElBQUFBLEtBQUssRUFBRSxhQURxQjtBQUc1QkMsSUFBQUEscUJBQXFCLEVBQUUsNkJBSEs7QUFLNUJDLElBQUFBLGtCQUFrQixFQUFFLDBCQUxRO0FBTTVCQyxJQUFBQSxpQkFBaUIsRUFBRSx5QkFOUztBQVE1QkMsSUFBQUEsaUJBQWlCLEVBQUUseUJBUlM7QUFTNUJDLElBQUFBLGNBQWMsRUFBRSxzQkFUWTtBQVc1QkMsSUFBQUEsbUJBQW1CLEVBQUUsMkJBWE87QUFhNUJDLElBQUFBLFNBQVMsRUFBRSxXQWJpQjtBQWU1QkMsSUFBQUEsYUFBYSxFQUFFLHFCQWZhO0FBaUI1QkMsSUFBQUEsb0JBQW9CLEVBQUUsNEJBakJNO0FBa0I1QkMsSUFBQUEsbUJBQW1CLEVBQUUsMkJBbEJPO0FBb0I1QkMsSUFBQUEsZ0JBQWdCLEVBQUUsd0JBcEJVO0FBc0I1QkMsSUFBQUEsT0FBTyxFQUFFLGVBdEJtQjtBQXdCNUJDLElBQUFBLFVBQVUsRUFBRSxrQkF4QmdCO0FBMEI1QkMsSUFBQUEsWUFBWSxFQUFFLG9CQTFCYztBQTJCNUJDLElBQUFBLFdBQVcsRUFBRSxtQkEzQmU7QUE0QjVCQyxJQUFBQSxhQUFhLEVBQUUscUJBNUJhO0FBOEI1QkMsSUFBQUEsV0FBVyxFQUFFO0FBOUJlLEdBQTlCOztBQWlDQSxNQUFJLENBQUNoQyxnQkFBRWlDLEdBQUYsQ0FBTW5CLHFCQUFOLEVBQTZCRixhQUE3QixDQUFMLEVBQWtEO0FBQ2hELFVBQU0sSUFBSVQseUJBQU8rQixtQkFBWCxDQUFnQywyQkFBMEJ0QixhQUFjLEtBQXpDLEdBQ2xDLFFBQU9aLGdCQUFFbUMsSUFBRixDQUFPckIscUJBQVAsQ0FBOEIsMEJBRGxDLENBQU47QUFFRDs7QUFDRCxTQUFPLE1BQU0sS0FBS0EscUJBQXFCLENBQUNGLGFBQUQsQ0FBMUIsRUFBMkNDLElBQTNDLENBQWI7QUFDRCxDQXZDRDs7ZUF5Q2V2QixVIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IF8gZnJvbSAnbG9kYXNoJztcbmltcG9ydCB7IGVycm9ycywgUFJPVE9DT0xTIH0gZnJvbSAnYXBwaXVtLWJhc2UtZHJpdmVyJztcbmltcG9ydCBsb2dnZXIgZnJvbSAnLi4vbG9nZ2VyJztcblxubGV0IGV4dGVuc2lvbnMgPSB7fTtcblxuZXh0ZW5zaW9ucy5leGVjdXRlID0gYXN5bmMgZnVuY3Rpb24gZXhlY3V0ZSAoc2NyaXB0LCBhcmdzKSB7XG4gIGlmIChzY3JpcHQubWF0Y2goL15tb2JpbGU6LykpIHtcbiAgICBsb2dnZXIuaW5mbyhgRXhlY3V0aW5nIG5hdGl2ZSBjb21tYW5kICcke3NjcmlwdH0nYCk7XG4gICAgc2NyaXB0ID0gc2NyaXB0LnJlcGxhY2UoL15tb2JpbGU6LywgJycpLnRyaW0oKTtcbiAgICByZXR1cm4gYXdhaXQgdGhpcy5leGVjdXRlTW9iaWxlKHNjcmlwdCwgXy5pc0FycmF5KGFyZ3MpID8gYXJnc1swXSA6IGFyZ3MpO1xuICB9XG4gIGlmICghdGhpcy5pc1dlYkNvbnRleHQoKSkge1xuICAgIHRocm93IG5ldyBlcnJvcnMuTm90SW1wbGVtZW50ZWRFcnJvcigpO1xuICB9XG4gIGNvbnN0IGVuZHBvaW50ID0gdGhpcy5jaHJvbWVkcml2ZXIuandwcm94eS5kb3duc3RyZWFtUHJvdG9jb2wgPT09IFBST1RPQ09MUy5NSlNPTldQXG4gICAgPyAnL2V4ZWN1dGUnXG4gICAgOiAnL2V4ZWN1dGUvc3luYyc7XG4gIHJldHVybiBhd2FpdCB0aGlzLmNocm9tZWRyaXZlci5qd3Byb3h5LmNvbW1hbmQoZW5kcG9pbnQsICdQT1NUJywge1xuICAgIHNjcmlwdCxcbiAgICBhcmdzLFxuICB9KTtcbn07XG5cbmV4dGVuc2lvbnMuZXhlY3V0ZU1vYmlsZSA9IGFzeW5jIGZ1bmN0aW9uIGV4ZWN1dGVNb2JpbGUgKG1vYmlsZUNvbW1hbmQsIG9wdHMgPSB7fSkge1xuICBjb25zdCBtb2JpbGVDb21tYW5kc01hcHBpbmcgPSB7XG4gICAgc2hlbGw6ICdtb2JpbGVTaGVsbCcsXG5cbiAgICBleGVjRW11Q29uc29sZUNvbW1hbmQ6ICdtb2JpbGVFeGVjRW11Q29uc29sZUNvbW1hbmQnLFxuXG4gICAgc3RhcnRMb2dzQnJvYWRjYXN0OiAnbW9iaWxlU3RhcnRMb2dzQnJvYWRjYXN0JyxcbiAgICBzdG9wTG9nc0Jyb2FkY2FzdDogJ21vYmlsZVN0b3BMb2dzQnJvYWRjYXN0JyxcblxuICAgIGNoYW5nZVBlcm1pc3Npb25zOiAnbW9iaWxlQ2hhbmdlUGVybWlzc2lvbnMnLFxuICAgIGdldFBlcm1pc3Npb25zOiAnbW9iaWxlR2V0UGVybWlzc2lvbnMnLFxuXG4gICAgcGVyZm9ybUVkaXRvckFjdGlvbjogJ21vYmlsZVBlcmZvcm1FZGl0b3JBY3Rpb24nLFxuXG4gICAgc2Vuc29yU2V0OiAnc2Vuc29yU2V0JyxcblxuICAgIGdldERldmljZVRpbWU6ICdtb2JpbGVHZXREZXZpY2VUaW1lJyxcblxuICAgIHN0YXJ0U2NyZWVuU3RyZWFtaW5nOiAnbW9iaWxlU3RhcnRTY3JlZW5TdHJlYW1pbmcnLFxuICAgIHN0b3BTY3JlZW5TdHJlYW1pbmc6ICdtb2JpbGVTdG9wU2NyZWVuU3RyZWFtaW5nJyxcblxuICAgIGdldE5vdGlmaWNhdGlvbnM6ICdtb2JpbGVHZXROb3RpZmljYXRpb25zJyxcblxuICAgIGxpc3RTbXM6ICdtb2JpbGVMaXN0U21zJyxcblxuICAgIGRlbGV0ZUZpbGU6ICdtb2JpbGVEZWxldGVGaWxlJyxcblxuICAgIHN0YXJ0U2VydmljZTogJ21vYmlsZVN0YXJ0U2VydmljZScsXG4gICAgc3RvcFNlcnZpY2U6ICdtb2JpbGVTdG9wU2VydmljZScsXG4gICAgc3RhcnRBY3Rpdml0eTogJ21vYmlsZVN0YXJ0QWN0aXZpdHknLFxuXG4gICAgZ2V0Q29udGV4dHM6ICdtb2JpbGVHZXRDb250ZXh0cycsXG4gIH07XG5cbiAgaWYgKCFfLmhhcyhtb2JpbGVDb21tYW5kc01hcHBpbmcsIG1vYmlsZUNvbW1hbmQpKSB7XG4gICAgdGhyb3cgbmV3IGVycm9ycy5Vbmtub3duQ29tbWFuZEVycm9yKGBVbmtub3duIG1vYmlsZSBjb21tYW5kIFwiJHttb2JpbGVDb21tYW5kfVwiLiBgICtcbiAgICAgIGBPbmx5ICR7Xy5rZXlzKG1vYmlsZUNvbW1hbmRzTWFwcGluZyl9IGNvbW1hbmRzIGFyZSBzdXBwb3J0ZWQuYCk7XG4gIH1cbiAgcmV0dXJuIGF3YWl0IHRoaXNbbW9iaWxlQ29tbWFuZHNNYXBwaW5nW21vYmlsZUNvbW1hbmRdXShvcHRzKTtcbn07XG5cbmV4cG9ydCBkZWZhdWx0IGV4dGVuc2lvbnM7XG4iXSwiZmlsZSI6ImxpYi9jb21tYW5kcy9leGVjdXRlLmpzIiwic291cmNlUm9vdCI6Ii4uLy4uLy4uIn0=
|
|
@@ -45,15 +45,15 @@ var _fileActions = _interopRequireDefault(require("./file-actions"));
|
|
|
45
45
|
|
|
46
46
|
var _appManagement = _interopRequireDefault(require("./app-management"));
|
|
47
47
|
|
|
48
|
-
var
|
|
48
|
+
var _intent = _interopRequireDefault(require("./intent"));
|
|
49
49
|
|
|
50
50
|
var _log = _interopRequireDefault(require("./log"));
|
|
51
51
|
|
|
52
52
|
let commands = {};
|
|
53
53
|
exports.commands = commands;
|
|
54
|
-
Object.assign(commands, _find.default, _general.default, _alert.default, _element.default, _context.default, _actions.default, _touch.default, _ime.default, _network.default, _coverage.default, _recordscreen.default,
|
|
54
|
+
Object.assign(commands, _find.default, _general.default, _alert.default, _element.default, _context.default, _actions.default, _touch.default, _ime.default, _network.default, _coverage.default, _recordscreen.default, _intent.default, _streamscreen.default, _performance.default, _execute.default, _shell.default, _emuConsole.default, _appManagement.default, _fileActions.default, _log.default);
|
|
55
55
|
var _default = commands;
|
|
56
56
|
exports.default = _default;require('source-map-support').install();
|
|
57
57
|
|
|
58
58
|
|
|
59
|
-
//# sourceMappingURL=data:application/json;charset=utf8;base64,
|
|
59
|
+
//# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImxpYi9jb21tYW5kcy9pbmRleC5qcyJdLCJuYW1lcyI6WyJjb21tYW5kcyIsIk9iamVjdCIsImFzc2lnbiIsImZpbmRDbWRzIiwiZ2VuZXJhbENtZHMiLCJhbGVydENtZHMiLCJlbGVtZW50Q21kcyIsImNvbnRleHRDbWRzIiwiYWN0aW9uQ21kcyIsInRvdWNoQ21kcyIsImltZUNtZHMiLCJuZXR3b3JrQ21kcyIsImNvdmVyYWdlQ21kcyIsInJlY29yZHNjcmVlbkNtZHMiLCJpbnRlbnRDbWRzIiwic2NyZWVuU3RyZWFtQ21kcyIsInBlcmZvcm1hbmNlQ21kcyIsImV4ZWN1dGVDbWRzIiwic2hlbGxDbWRzIiwiZW11Q29uc29sZUNtZHMiLCJhcHBNYW5hZ2VtZW50Q21kcyIsImZpbGVBY3Rpb25zQ21kcyIsImxvZ0NtZHMiXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7O0FBQUE7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBR0EsSUFBSUEsUUFBUSxHQUFHLEVBQWY7O0FBQ0FDLE1BQU0sQ0FBQ0MsTUFBUCxDQUNFRixRQURGLEVBRUVHLGFBRkYsRUFHRUMsZ0JBSEYsRUFJRUMsY0FKRixFQUtFQyxnQkFMRixFQU1FQyxnQkFORixFQU9FQyxnQkFQRixFQVFFQyxjQVJGLEVBU0VDLFlBVEYsRUFVRUMsZ0JBVkYsRUFXRUMsaUJBWEYsRUFZRUMscUJBWkYsRUFhRUMsZUFiRixFQWNFQyxxQkFkRixFQWVFQyxvQkFmRixFQWdCRUMsZ0JBaEJGLEVBaUJFQyxjQWpCRixFQWtCRUMsbUJBbEJGLEVBbUJFQyxzQkFuQkYsRUFvQkVDLG9CQXBCRixFQXFCRUMsWUFyQkY7ZUEwQmV0QixRIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IGZpbmRDbWRzIGZyb20gJy4vZmluZCc7XG5pbXBvcnQgZ2VuZXJhbENtZHMgZnJvbSAnLi9nZW5lcmFsJztcbmltcG9ydCBhbGVydENtZHMgZnJvbSAnLi9hbGVydCc7XG5pbXBvcnQgZWxlbWVudENtZHMgZnJvbSAnLi9lbGVtZW50JztcbmltcG9ydCBjb250ZXh0Q21kcyBmcm9tICcuL2NvbnRleHQnO1xuaW1wb3J0IGFjdGlvbkNtZHMgZnJvbSAnLi9hY3Rpb25zJztcbmltcG9ydCB0b3VjaENtZHMgZnJvbSAnLi90b3VjaCc7XG5pbXBvcnQgaW1lQ21kcyBmcm9tICcuL2ltZSc7XG5pbXBvcnQgbmV0d29ya0NtZHMgZnJvbSAnLi9uZXR3b3JrJztcbmltcG9ydCBjb3ZlcmFnZUNtZHMgZnJvbSAnLi9jb3ZlcmFnZSc7XG5pbXBvcnQgcmVjb3Jkc2NyZWVuQ21kcyBmcm9tICcuL3JlY29yZHNjcmVlbic7XG5pbXBvcnQgc2NyZWVuU3RyZWFtQ21kcyBmcm9tICcuL3N0cmVhbXNjcmVlbic7XG5pbXBvcnQgcGVyZm9ybWFuY2VDbWRzIGZyb20gJy4vcGVyZm9ybWFuY2UnO1xuaW1wb3J0IGV4ZWN1dGVDbWRzIGZyb20gJy4vZXhlY3V0ZSc7XG5pbXBvcnQgc2hlbGxDbWRzIGZyb20gJy4vc2hlbGwnO1xuaW1wb3J0IGVtdUNvbnNvbGVDbWRzIGZyb20gJy4vZW11LWNvbnNvbGUnO1xuaW1wb3J0IGZpbGVBY3Rpb25zQ21kcyBmcm9tICcuL2ZpbGUtYWN0aW9ucyc7XG5pbXBvcnQgYXBwTWFuYWdlbWVudENtZHMgZnJvbSAnLi9hcHAtbWFuYWdlbWVudCc7XG5pbXBvcnQgaW50ZW50Q21kcyBmcm9tICcuL2ludGVudCc7XG5pbXBvcnQgbG9nQ21kcyBmcm9tICcuL2xvZyc7XG5cblxubGV0IGNvbW1hbmRzID0ge307XG5PYmplY3QuYXNzaWduKFxuICBjb21tYW5kcyxcbiAgZmluZENtZHMsXG4gIGdlbmVyYWxDbWRzLFxuICBhbGVydENtZHMsXG4gIGVsZW1lbnRDbWRzLFxuICBjb250ZXh0Q21kcyxcbiAgYWN0aW9uQ21kcyxcbiAgdG91Y2hDbWRzLFxuICBpbWVDbWRzLFxuICBuZXR3b3JrQ21kcyxcbiAgY292ZXJhZ2VDbWRzLFxuICByZWNvcmRzY3JlZW5DbWRzLFxuICBpbnRlbnRDbWRzLFxuICBzY3JlZW5TdHJlYW1DbWRzLFxuICBwZXJmb3JtYW5jZUNtZHMsXG4gIGV4ZWN1dGVDbWRzLFxuICBzaGVsbENtZHMsXG4gIGVtdUNvbnNvbGVDbWRzLFxuICBhcHBNYW5hZ2VtZW50Q21kcyxcbiAgZmlsZUFjdGlvbnNDbWRzLFxuICBsb2dDbWRzLFxuICAvLyBhZGQgb3RoZXIgY29tbWFuZCB0eXBlcyBoZXJlXG4pO1xuXG5leHBvcnQgeyBjb21tYW5kcyB9O1xuZXhwb3J0IGRlZmF1bHQgY29tbWFuZHM7XG4iXSwiZmlsZSI6ImxpYi9jb21tYW5kcy9pbmRleC5qcyIsInNvdXJjZVJvb3QiOiIuLi8uLi8uLiJ9
|
|
@@ -0,0 +1,193 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
|
|
4
|
+
|
|
5
|
+
Object.defineProperty(exports, "__esModule", {
|
|
6
|
+
value: true
|
|
7
|
+
});
|
|
8
|
+
exports.default = exports.commands = void 0;
|
|
9
|
+
|
|
10
|
+
require("source-map-support/register");
|
|
11
|
+
|
|
12
|
+
var _lodash = _interopRequireDefault(require("lodash"));
|
|
13
|
+
|
|
14
|
+
var _appiumBaseDriver = require("appium-base-driver");
|
|
15
|
+
|
|
16
|
+
const NO_VALUE_ARG_TYPE = 'sn';
|
|
17
|
+
const SUPPORTED_EXTRA_TYPES = ['s', NO_VALUE_ARG_TYPE, 'z', 'i', 'l', 'f', 'u', 'cn', 'ia', 'ial', 'la', 'lal', 'fa', 'fal', 'sa', 'sal'];
|
|
18
|
+
const API_LEVEL_ANDROID_8 = 26;
|
|
19
|
+
const commands = {};
|
|
20
|
+
exports.commands = commands;
|
|
21
|
+
|
|
22
|
+
function requireOptions(opts, requiredKeys = []) {
|
|
23
|
+
const missingKeys = _lodash.default.difference(requiredKeys, _lodash.default.keys(opts));
|
|
24
|
+
|
|
25
|
+
if (!_lodash.default.isEmpty(missingKeys)) {
|
|
26
|
+
throw new _appiumBaseDriver.errors.InvalidArgumentError(`The following options are required: ${missingKeys}`);
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
return opts;
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
function parseCommonIntentArguments(opts = {}) {
|
|
33
|
+
const {
|
|
34
|
+
action,
|
|
35
|
+
uri,
|
|
36
|
+
mimeType,
|
|
37
|
+
identifier,
|
|
38
|
+
categories,
|
|
39
|
+
component,
|
|
40
|
+
extras,
|
|
41
|
+
flags
|
|
42
|
+
} = opts;
|
|
43
|
+
const resultArgs = [];
|
|
44
|
+
|
|
45
|
+
if (action) {
|
|
46
|
+
resultArgs.push('-a', action);
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
if (uri) {
|
|
50
|
+
resultArgs.push('-d', uri);
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
if (mimeType) {
|
|
54
|
+
resultArgs.push('-t', mimeType);
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
if (!_lodash.default.isNil(identifier)) {
|
|
58
|
+
resultArgs.push('-i', identifier);
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
if (categories) {
|
|
62
|
+
if (_lodash.default.isArray(categories)) {
|
|
63
|
+
resultArgs.push(..._lodash.default.flatMap(categories.map(cName => ['-c', cName])));
|
|
64
|
+
} else {
|
|
65
|
+
resultArgs.push('-c', categories);
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
if (component) {
|
|
70
|
+
resultArgs.push('-n', component);
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
if (extras) {
|
|
74
|
+
if (!_lodash.default.isArray(extras)) {
|
|
75
|
+
throw new _appiumBaseDriver.errors.InvalidArgumentError(`'extras' must be an array`);
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
for (const item of extras) {
|
|
79
|
+
let type;
|
|
80
|
+
let value;
|
|
81
|
+
|
|
82
|
+
if (_lodash.default.isArray(item)) {
|
|
83
|
+
[type, value] = item;
|
|
84
|
+
} else {
|
|
85
|
+
type = item;
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
if (!_lodash.default.includes(SUPPORTED_EXTRA_TYPES, type)) {
|
|
89
|
+
throw new _appiumBaseDriver.errors.InvalidArgumentError(`Intent argument type '${type}' is not known. ` + `Supported intent argument types are: ${SUPPORTED_EXTRA_TYPES}`);
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
if (type === NO_VALUE_ARG_TYPE) {
|
|
93
|
+
resultArgs.push(`--e${type}`);
|
|
94
|
+
} else if (_lodash.default.isUndefined(value)) {
|
|
95
|
+
throw new _appiumBaseDriver.errors.InvalidArgumentError(`Intent argument type '${type}' requires a ` + `value to be provided`);
|
|
96
|
+
} else {
|
|
97
|
+
resultArgs.push(`--e${type}`, value);
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
if (flags) {
|
|
103
|
+
resultArgs.push('-f', flags);
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
return resultArgs;
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
commands.mobileStartActivity = async function mobileStartActivity(opts = {}) {
|
|
110
|
+
const {
|
|
111
|
+
intent,
|
|
112
|
+
user,
|
|
113
|
+
wait,
|
|
114
|
+
stop,
|
|
115
|
+
windowingMode,
|
|
116
|
+
activityType,
|
|
117
|
+
display
|
|
118
|
+
} = requireOptions(opts, ['intent']);
|
|
119
|
+
const cmd = ['am', (await this.adb.getApiLevel()) < API_LEVEL_ANDROID_8 ? 'start' : 'start-activity'];
|
|
120
|
+
|
|
121
|
+
if (!_lodash.default.isNil(user)) {
|
|
122
|
+
cmd.push('--user', user);
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
if (wait) {
|
|
126
|
+
cmd.push('-W');
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
if (stop) {
|
|
130
|
+
cmd.push('-S');
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
if (!_lodash.default.isNil(windowingMode)) {
|
|
134
|
+
cmd.push('--windowingMode', windowingMode);
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
if (!_lodash.default.isNil(activityType)) {
|
|
138
|
+
cmd.push('--activityType', activityType);
|
|
139
|
+
}
|
|
140
|
+
|
|
141
|
+
if (!_lodash.default.isNil(display)) {
|
|
142
|
+
cmd.push('--display', display);
|
|
143
|
+
}
|
|
144
|
+
|
|
145
|
+
cmd.push(...parseCommonIntentArguments(opts));
|
|
146
|
+
cmd.push(intent);
|
|
147
|
+
return await this.adb.shell(cmd);
|
|
148
|
+
};
|
|
149
|
+
|
|
150
|
+
commands.mobileStartService = async function mobileStartService(opts = {}) {
|
|
151
|
+
const {
|
|
152
|
+
intent,
|
|
153
|
+
user,
|
|
154
|
+
foreground
|
|
155
|
+
} = requireOptions(opts, ['intent']);
|
|
156
|
+
const cmd = ['am'];
|
|
157
|
+
|
|
158
|
+
if ((await this.adb.getApiLevel()) < API_LEVEL_ANDROID_8) {
|
|
159
|
+
cmd.push('startservice');
|
|
160
|
+
} else {
|
|
161
|
+
cmd.push(foreground ? 'start-foreground-service' : 'start-service');
|
|
162
|
+
}
|
|
163
|
+
|
|
164
|
+
if (!_lodash.default.isNil(user)) {
|
|
165
|
+
cmd.push('--user', user);
|
|
166
|
+
}
|
|
167
|
+
|
|
168
|
+
cmd.push(...parseCommonIntentArguments(opts));
|
|
169
|
+
cmd.push(intent);
|
|
170
|
+
return await this.adb.shell(cmd);
|
|
171
|
+
};
|
|
172
|
+
|
|
173
|
+
commands.mobileStopService = async function mobileStopService(opts = {}) {
|
|
174
|
+
const {
|
|
175
|
+
intent,
|
|
176
|
+
user
|
|
177
|
+
} = requireOptions(opts, ['intent']);
|
|
178
|
+
const cmd = ['am', (await this.adb.getApiLevel()) < API_LEVEL_ANDROID_8 ? 'stopservice' : 'stop-service'];
|
|
179
|
+
|
|
180
|
+
if (!_lodash.default.isNil(user)) {
|
|
181
|
+
cmd.push('--user', user);
|
|
182
|
+
}
|
|
183
|
+
|
|
184
|
+
cmd.push(...parseCommonIntentArguments(opts));
|
|
185
|
+
cmd.push(intent);
|
|
186
|
+
return await this.adb.shell(cmd);
|
|
187
|
+
};
|
|
188
|
+
|
|
189
|
+
var _default = commands;
|
|
190
|
+
exports.default = _default;require('source-map-support').install();
|
|
191
|
+
|
|
192
|
+
|
|
193
|
+
//# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImxpYi9jb21tYW5kcy9pbnRlbnQuanMiXSwibmFtZXMiOlsiTk9fVkFMVUVfQVJHX1RZUEUiLCJTVVBQT1JURURfRVhUUkFfVFlQRVMiLCJBUElfTEVWRUxfQU5EUk9JRF84IiwiY29tbWFuZHMiLCJyZXF1aXJlT3B0aW9ucyIsIm9wdHMiLCJyZXF1aXJlZEtleXMiLCJtaXNzaW5nS2V5cyIsIl8iLCJkaWZmZXJlbmNlIiwia2V5cyIsImlzRW1wdHkiLCJlcnJvcnMiLCJJbnZhbGlkQXJndW1lbnRFcnJvciIsInBhcnNlQ29tbW9uSW50ZW50QXJndW1lbnRzIiwiYWN0aW9uIiwidXJpIiwibWltZVR5cGUiLCJpZGVudGlmaWVyIiwiY2F0ZWdvcmllcyIsImNvbXBvbmVudCIsImV4dHJhcyIsImZsYWdzIiwicmVzdWx0QXJncyIsInB1c2giLCJpc05pbCIsImlzQXJyYXkiLCJmbGF0TWFwIiwibWFwIiwiY05hbWUiLCJpdGVtIiwidHlwZSIsInZhbHVlIiwiaW5jbHVkZXMiLCJpc1VuZGVmaW5lZCIsIm1vYmlsZVN0YXJ0QWN0aXZpdHkiLCJpbnRlbnQiLCJ1c2VyIiwid2FpdCIsInN0b3AiLCJ3aW5kb3dpbmdNb2RlIiwiYWN0aXZpdHlUeXBlIiwiZGlzcGxheSIsImNtZCIsImFkYiIsImdldEFwaUxldmVsIiwic2hlbGwiLCJtb2JpbGVTdGFydFNlcnZpY2UiLCJmb3JlZ3JvdW5kIiwibW9iaWxlU3RvcFNlcnZpY2UiXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7O0FBQUE7O0FBQ0E7O0FBRUEsTUFBTUEsaUJBQWlCLEdBQUcsSUFBMUI7QUFDQSxNQUFNQyxxQkFBcUIsR0FBRyxDQUM1QixHQUQ0QixFQUN2QkQsaUJBRHVCLEVBQ0osR0FESSxFQUNDLEdBREQsRUFDTSxHQUROLEVBQ1csR0FEWCxFQUNnQixHQURoQixFQUNxQixJQURyQixFQUU1QixJQUY0QixFQUV0QixLQUZzQixFQUVmLElBRmUsRUFFVCxLQUZTLEVBRUYsSUFGRSxFQUVJLEtBRkosRUFFVyxJQUZYLEVBRWlCLEtBRmpCLENBQTlCO0FBSUEsTUFBTUUsbUJBQW1CLEdBQUcsRUFBNUI7QUFFQSxNQUFNQyxRQUFRLEdBQUcsRUFBakI7OztBQUVBLFNBQVNDLGNBQVQsQ0FBeUJDLElBQXpCLEVBQStCQyxZQUFZLEdBQUcsRUFBOUMsRUFBa0Q7QUFDaEQsUUFBTUMsV0FBVyxHQUFHQyxnQkFBRUMsVUFBRixDQUFhSCxZQUFiLEVBQTJCRSxnQkFBRUUsSUFBRixDQUFPTCxJQUFQLENBQTNCLENBQXBCOztBQUNBLE1BQUksQ0FBQ0csZ0JBQUVHLE9BQUYsQ0FBVUosV0FBVixDQUFMLEVBQTZCO0FBQzNCLFVBQU0sSUFBSUsseUJBQU9DLG9CQUFYLENBQWlDLHVDQUFzQ04sV0FBWSxFQUFuRixDQUFOO0FBQ0Q7O0FBQ0QsU0FBT0YsSUFBUDtBQUNEOztBQUVELFNBQVNTLDBCQUFULENBQXFDVCxJQUFJLEdBQUcsRUFBNUMsRUFBZ0Q7QUFDOUMsUUFBTTtBQUNKVSxJQUFBQSxNQURJO0FBRUpDLElBQUFBLEdBRkk7QUFHSkMsSUFBQUEsUUFISTtBQUlKQyxJQUFBQSxVQUpJO0FBS0pDLElBQUFBLFVBTEk7QUFNSkMsSUFBQUEsU0FOSTtBQU9KQyxJQUFBQSxNQVBJO0FBUUpDLElBQUFBO0FBUkksTUFTRmpCLElBVEo7QUFVQSxRQUFNa0IsVUFBVSxHQUFHLEVBQW5COztBQUNBLE1BQUlSLE1BQUosRUFBWTtBQUNWUSxJQUFBQSxVQUFVLENBQUNDLElBQVgsQ0FBZ0IsSUFBaEIsRUFBc0JULE1BQXRCO0FBQ0Q7O0FBQ0QsTUFBSUMsR0FBSixFQUFTO0FBQ1BPLElBQUFBLFVBQVUsQ0FBQ0MsSUFBWCxDQUFnQixJQUFoQixFQUFzQlIsR0FBdEI7QUFDRDs7QUFDRCxNQUFJQyxRQUFKLEVBQWM7QUFDWk0sSUFBQUEsVUFBVSxDQUFDQyxJQUFYLENBQWdCLElBQWhCLEVBQXNCUCxRQUF0QjtBQUNEOztBQUNELE1BQUksQ0FBQ1QsZ0JBQUVpQixLQUFGLENBQVFQLFVBQVIsQ0FBTCxFQUEwQjtBQUN4QkssSUFBQUEsVUFBVSxDQUFDQyxJQUFYLENBQWdCLElBQWhCLEVBQXNCTixVQUF0QjtBQUNEOztBQUNELE1BQUlDLFVBQUosRUFBZ0I7QUFDZCxRQUFJWCxnQkFBRWtCLE9BQUYsQ0FBVVAsVUFBVixDQUFKLEVBQTJCO0FBQ3pCSSxNQUFBQSxVQUFVLENBQUNDLElBQVgsQ0FBZ0IsR0FBSWhCLGdCQUFFbUIsT0FBRixDQUFVUixVQUFVLENBQUNTLEdBQVgsQ0FBZ0JDLEtBQUQsSUFBVyxDQUFDLElBQUQsRUFBT0EsS0FBUCxDQUExQixDQUFWLENBQXBCO0FBQ0QsS0FGRCxNQUVPO0FBQ0xOLE1BQUFBLFVBQVUsQ0FBQ0MsSUFBWCxDQUFnQixJQUFoQixFQUFzQkwsVUFBdEI7QUFDRDtBQUNGOztBQUNELE1BQUlDLFNBQUosRUFBZTtBQUNiRyxJQUFBQSxVQUFVLENBQUNDLElBQVgsQ0FBZ0IsSUFBaEIsRUFBc0JKLFNBQXRCO0FBQ0Q7O0FBQ0QsTUFBSUMsTUFBSixFQUFZO0FBQ1YsUUFBSSxDQUFDYixnQkFBRWtCLE9BQUYsQ0FBVUwsTUFBVixDQUFMLEVBQXdCO0FBQ3RCLFlBQU0sSUFBSVQseUJBQU9DLG9CQUFYLENBQWlDLDJCQUFqQyxDQUFOO0FBQ0Q7O0FBQ0QsU0FBSyxNQUFNaUIsSUFBWCxJQUFtQlQsTUFBbkIsRUFBMkI7QUFDekIsVUFBSVUsSUFBSjtBQUNBLFVBQUlDLEtBQUo7O0FBQ0EsVUFBSXhCLGdCQUFFa0IsT0FBRixDQUFVSSxJQUFWLENBQUosRUFBcUI7QUFDbkIsU0FBQ0MsSUFBRCxFQUFPQyxLQUFQLElBQWdCRixJQUFoQjtBQUNELE9BRkQsTUFFTztBQUNMQyxRQUFBQSxJQUFJLEdBQUdELElBQVA7QUFDRDs7QUFDRCxVQUFJLENBQUN0QixnQkFBRXlCLFFBQUYsQ0FBV2hDLHFCQUFYLEVBQWtDOEIsSUFBbEMsQ0FBTCxFQUE4QztBQUM1QyxjQUFNLElBQUluQix5QkFBT0Msb0JBQVgsQ0FBaUMseUJBQXdCa0IsSUFBSyxrQkFBOUIsR0FDbkMsd0NBQXVDOUIscUJBQXNCLEVBRDFELENBQU47QUFFRDs7QUFDRCxVQUFJOEIsSUFBSSxLQUFLL0IsaUJBQWIsRUFBZ0M7QUFDOUJ1QixRQUFBQSxVQUFVLENBQUNDLElBQVgsQ0FBaUIsTUFBS08sSUFBSyxFQUEzQjtBQUNELE9BRkQsTUFFTyxJQUFJdkIsZ0JBQUUwQixXQUFGLENBQWNGLEtBQWQsQ0FBSixFQUEwQjtBQUMvQixjQUFNLElBQUlwQix5QkFBT0Msb0JBQVgsQ0FBaUMseUJBQXdCa0IsSUFBSyxlQUE5QixHQUNuQyxzQkFERyxDQUFOO0FBRUQsT0FITSxNQUdBO0FBQ0xSLFFBQUFBLFVBQVUsQ0FBQ0MsSUFBWCxDQUFpQixNQUFLTyxJQUFLLEVBQTNCLEVBQThCQyxLQUE5QjtBQUNEO0FBQ0Y7QUFDRjs7QUFDRCxNQUFJVixLQUFKLEVBQVc7QUFDVEMsSUFBQUEsVUFBVSxDQUFDQyxJQUFYLENBQWdCLElBQWhCLEVBQXNCRixLQUF0QjtBQUNEOztBQUNELFNBQU9DLFVBQVA7QUFDRDs7QUErRERwQixRQUFRLENBQUNnQyxtQkFBVCxHQUErQixlQUFlQSxtQkFBZixDQUFvQzlCLElBQUksR0FBRyxFQUEzQyxFQUErQztBQUM1RSxRQUFNO0FBQ0orQixJQUFBQSxNQURJO0FBRUpDLElBQUFBLElBRkk7QUFHSkMsSUFBQUEsSUFISTtBQUlKQyxJQUFBQSxJQUpJO0FBS0pDLElBQUFBLGFBTEk7QUFNSkMsSUFBQUEsWUFOSTtBQU9KQyxJQUFBQTtBQVBJLE1BUUZ0QyxjQUFjLENBQUNDLElBQUQsRUFBTyxDQUFDLFFBQUQsQ0FBUCxDQVJsQjtBQVNBLFFBQU1zQyxHQUFHLEdBQUcsQ0FDVixJQURVLEVBQ0gsT0FBTSxLQUFLQyxHQUFMLENBQVNDLFdBQVQsRUFBTixJQUErQjNDLG1CQUFoQyxHQUF1RCxPQUF2RCxHQUFpRSxnQkFEN0QsQ0FBWjs7QUFHQSxNQUFJLENBQUNNLGdCQUFFaUIsS0FBRixDQUFRWSxJQUFSLENBQUwsRUFBb0I7QUFDbEJNLElBQUFBLEdBQUcsQ0FBQ25CLElBQUosQ0FBUyxRQUFULEVBQW1CYSxJQUFuQjtBQUNEOztBQUNELE1BQUlDLElBQUosRUFBVTtBQUNSSyxJQUFBQSxHQUFHLENBQUNuQixJQUFKLENBQVMsSUFBVDtBQUNEOztBQUNELE1BQUllLElBQUosRUFBVTtBQUNSSSxJQUFBQSxHQUFHLENBQUNuQixJQUFKLENBQVMsSUFBVDtBQUNEOztBQUNELE1BQUksQ0FBQ2hCLGdCQUFFaUIsS0FBRixDQUFRZSxhQUFSLENBQUwsRUFBNkI7QUFDM0JHLElBQUFBLEdBQUcsQ0FBQ25CLElBQUosQ0FBUyxpQkFBVCxFQUE0QmdCLGFBQTVCO0FBQ0Q7O0FBQ0QsTUFBSSxDQUFDaEMsZ0JBQUVpQixLQUFGLENBQVFnQixZQUFSLENBQUwsRUFBNEI7QUFDMUJFLElBQUFBLEdBQUcsQ0FBQ25CLElBQUosQ0FBUyxnQkFBVCxFQUEyQmlCLFlBQTNCO0FBQ0Q7O0FBQ0QsTUFBSSxDQUFDakMsZ0JBQUVpQixLQUFGLENBQVFpQixPQUFSLENBQUwsRUFBdUI7QUFDckJDLElBQUFBLEdBQUcsQ0FBQ25CLElBQUosQ0FBUyxXQUFULEVBQXNCa0IsT0FBdEI7QUFDRDs7QUFDREMsRUFBQUEsR0FBRyxDQUFDbkIsSUFBSixDQUFTLEdBQUlWLDBCQUEwQixDQUFDVCxJQUFELENBQXZDO0FBQ0FzQyxFQUFBQSxHQUFHLENBQUNuQixJQUFKLENBQVNZLE1BQVQ7QUFDQSxTQUFPLE1BQU0sS0FBS1EsR0FBTCxDQUFTRSxLQUFULENBQWVILEdBQWYsQ0FBYjtBQUNELENBbENEOztBQXlGQXhDLFFBQVEsQ0FBQzRDLGtCQUFULEdBQThCLGVBQWVBLGtCQUFmLENBQW1DMUMsSUFBSSxHQUFHLEVBQTFDLEVBQThDO0FBQzFFLFFBQU07QUFDSitCLElBQUFBLE1BREk7QUFFSkMsSUFBQUEsSUFGSTtBQUdKVyxJQUFBQTtBQUhJLE1BSUY1QyxjQUFjLENBQUNDLElBQUQsRUFBTyxDQUFDLFFBQUQsQ0FBUCxDQUpsQjtBQUtBLFFBQU1zQyxHQUFHLEdBQUcsQ0FBQyxJQUFELENBQVo7O0FBQ0EsTUFBSSxPQUFNLEtBQUtDLEdBQUwsQ0FBU0MsV0FBVCxFQUFOLElBQStCM0MsbUJBQW5DLEVBQXdEO0FBQ3REeUMsSUFBQUEsR0FBRyxDQUFDbkIsSUFBSixDQUFTLGNBQVQ7QUFDRCxHQUZELE1BRU87QUFDTG1CLElBQUFBLEdBQUcsQ0FBQ25CLElBQUosQ0FBU3dCLFVBQVUsR0FBRywwQkFBSCxHQUFnQyxlQUFuRDtBQUNEOztBQUNELE1BQUksQ0FBQ3hDLGdCQUFFaUIsS0FBRixDQUFRWSxJQUFSLENBQUwsRUFBb0I7QUFDbEJNLElBQUFBLEdBQUcsQ0FBQ25CLElBQUosQ0FBUyxRQUFULEVBQW1CYSxJQUFuQjtBQUNEOztBQUNETSxFQUFBQSxHQUFHLENBQUNuQixJQUFKLENBQVMsR0FBSVYsMEJBQTBCLENBQUNULElBQUQsQ0FBdkM7QUFDQXNDLEVBQUFBLEdBQUcsQ0FBQ25CLElBQUosQ0FBU1ksTUFBVDtBQUNBLFNBQU8sTUFBTSxLQUFLUSxHQUFMLENBQVNFLEtBQVQsQ0FBZUgsR0FBZixDQUFiO0FBQ0QsQ0FsQkQ7O0FBb0NBeEMsUUFBUSxDQUFDOEMsaUJBQVQsR0FBNkIsZUFBZUEsaUJBQWYsQ0FBa0M1QyxJQUFJLEdBQUcsRUFBekMsRUFBNkM7QUFDeEUsUUFBTTtBQUNKK0IsSUFBQUEsTUFESTtBQUVKQyxJQUFBQTtBQUZJLE1BR0ZqQyxjQUFjLENBQUNDLElBQUQsRUFBTyxDQUFDLFFBQUQsQ0FBUCxDQUhsQjtBQUlBLFFBQU1zQyxHQUFHLEdBQUcsQ0FDVixJQURVLEVBRVQsT0FBTSxLQUFLQyxHQUFMLENBQVNDLFdBQVQsRUFBTixJQUErQjNDLG1CQUFoQyxHQUF1RCxhQUF2RCxHQUF1RSxjQUY3RCxDQUFaOztBQUlBLE1BQUksQ0FBQ00sZ0JBQUVpQixLQUFGLENBQVFZLElBQVIsQ0FBTCxFQUFvQjtBQUNsQk0sSUFBQUEsR0FBRyxDQUFDbkIsSUFBSixDQUFTLFFBQVQsRUFBbUJhLElBQW5CO0FBQ0Q7O0FBQ0RNLEVBQUFBLEdBQUcsQ0FBQ25CLElBQUosQ0FBUyxHQUFJViwwQkFBMEIsQ0FBQ1QsSUFBRCxDQUF2QztBQUNBc0MsRUFBQUEsR0FBRyxDQUFDbkIsSUFBSixDQUFTWSxNQUFUO0FBQ0EsU0FBTyxNQUFNLEtBQUtRLEdBQUwsQ0FBU0UsS0FBVCxDQUFlSCxHQUFmLENBQWI7QUFDRCxDQWZEOztlQW1CZXhDLFEiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgXyBmcm9tICdsb2Rhc2gnO1xuaW1wb3J0IHsgZXJyb3JzIH0gZnJvbSAnYXBwaXVtLWJhc2UtZHJpdmVyJztcblxuY29uc3QgTk9fVkFMVUVfQVJHX1RZUEUgPSAnc24nO1xuY29uc3QgU1VQUE9SVEVEX0VYVFJBX1RZUEVTID0gW1xuICAncycsIE5PX1ZBTFVFX0FSR19UWVBFLCAneicsICdpJywgJ2wnLCAnZicsICd1JywgJ2NuJyxcbiAgJ2lhJywgJ2lhbCcsICdsYScsICdsYWwnLCAnZmEnLCAnZmFsJywgJ3NhJywgJ3NhbCcsXG5dO1xuY29uc3QgQVBJX0xFVkVMX0FORFJPSURfOCA9IDI2O1xuXG5jb25zdCBjb21tYW5kcyA9IHt9O1xuXG5mdW5jdGlvbiByZXF1aXJlT3B0aW9ucyAob3B0cywgcmVxdWlyZWRLZXlzID0gW10pIHtcbiAgY29uc3QgbWlzc2luZ0tleXMgPSBfLmRpZmZlcmVuY2UocmVxdWlyZWRLZXlzLCBfLmtleXMob3B0cykpO1xuICBpZiAoIV8uaXNFbXB0eShtaXNzaW5nS2V5cykpIHtcbiAgICB0aHJvdyBuZXcgZXJyb3JzLkludmFsaWRBcmd1bWVudEVycm9yKGBUaGUgZm9sbG93aW5nIG9wdGlvbnMgYXJlIHJlcXVpcmVkOiAke21pc3NpbmdLZXlzfWApO1xuICB9XG4gIHJldHVybiBvcHRzO1xufVxuXG5mdW5jdGlvbiBwYXJzZUNvbW1vbkludGVudEFyZ3VtZW50cyAob3B0cyA9IHt9KSB7XG4gIGNvbnN0IHtcbiAgICBhY3Rpb24sXG4gICAgdXJpLFxuICAgIG1pbWVUeXBlLFxuICAgIGlkZW50aWZpZXIsXG4gICAgY2F0ZWdvcmllcyxcbiAgICBjb21wb25lbnQsXG4gICAgZXh0cmFzLFxuICAgIGZsYWdzLFxuICB9ID0gb3B0cztcbiAgY29uc3QgcmVzdWx0QXJncyA9IFtdO1xuICBpZiAoYWN0aW9uKSB7XG4gICAgcmVzdWx0QXJncy5wdXNoKCctYScsIGFjdGlvbik7XG4gIH1cbiAgaWYgKHVyaSkge1xuICAgIHJlc3VsdEFyZ3MucHVzaCgnLWQnLCB1cmkpO1xuICB9XG4gIGlmIChtaW1lVHlwZSkge1xuICAgIHJlc3VsdEFyZ3MucHVzaCgnLXQnLCBtaW1lVHlwZSk7XG4gIH1cbiAgaWYgKCFfLmlzTmlsKGlkZW50aWZpZXIpKSB7XG4gICAgcmVzdWx0QXJncy5wdXNoKCctaScsIGlkZW50aWZpZXIpO1xuICB9XG4gIGlmIChjYXRlZ29yaWVzKSB7XG4gICAgaWYgKF8uaXNBcnJheShjYXRlZ29yaWVzKSkge1xuICAgICAgcmVzdWx0QXJncy5wdXNoKC4uLihfLmZsYXRNYXAoY2F0ZWdvcmllcy5tYXAoKGNOYW1lKSA9PiBbJy1jJywgY05hbWVdKSkpKTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmVzdWx0QXJncy5wdXNoKCctYycsIGNhdGVnb3JpZXMpO1xuICAgIH1cbiAgfVxuICBpZiAoY29tcG9uZW50KSB7XG4gICAgcmVzdWx0QXJncy5wdXNoKCctbicsIGNvbXBvbmVudCk7XG4gIH1cbiAgaWYgKGV4dHJhcykge1xuICAgIGlmICghXy5pc0FycmF5KGV4dHJhcykpIHtcbiAgICAgIHRocm93IG5ldyBlcnJvcnMuSW52YWxpZEFyZ3VtZW50RXJyb3IoYCdleHRyYXMnIG11c3QgYmUgYW4gYXJyYXlgKTtcbiAgICB9XG4gICAgZm9yIChjb25zdCBpdGVtIG9mIGV4dHJhcykge1xuICAgICAgbGV0IHR5cGU7XG4gICAgICBsZXQgdmFsdWU7XG4gICAgICBpZiAoXy5pc0FycmF5KGl0ZW0pKSB7XG4gICAgICAgIFt0eXBlLCB2YWx1ZV0gPSBpdGVtO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdHlwZSA9IGl0ZW07XG4gICAgICB9XG4gICAgICBpZiAoIV8uaW5jbHVkZXMoU1VQUE9SVEVEX0VYVFJBX1RZUEVTLCB0eXBlKSkge1xuICAgICAgICB0aHJvdyBuZXcgZXJyb3JzLkludmFsaWRBcmd1bWVudEVycm9yKGBJbnRlbnQgYXJndW1lbnQgdHlwZSAnJHt0eXBlfScgaXMgbm90IGtub3duLiBgICtcbiAgICAgICAgICBgU3VwcG9ydGVkIGludGVudCBhcmd1bWVudCB0eXBlcyBhcmU6ICR7U1VQUE9SVEVEX0VYVFJBX1RZUEVTfWApO1xuICAgICAgfVxuICAgICAgaWYgKHR5cGUgPT09IE5PX1ZBTFVFX0FSR19UWVBFKSB7XG4gICAgICAgIHJlc3VsdEFyZ3MucHVzaChgLS1lJHt0eXBlfWApO1xuICAgICAgfSBlbHNlIGlmIChfLmlzVW5kZWZpbmVkKHZhbHVlKSkge1xuICAgICAgICB0aHJvdyBuZXcgZXJyb3JzLkludmFsaWRBcmd1bWVudEVycm9yKGBJbnRlbnQgYXJndW1lbnQgdHlwZSAnJHt0eXBlfScgcmVxdWlyZXMgYSBgICtcbiAgICAgICAgICBgdmFsdWUgdG8gYmUgcHJvdmlkZWRgKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJlc3VsdEFyZ3MucHVzaChgLS1lJHt0eXBlfWAsIHZhbHVlKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgaWYgKGZsYWdzKSB7XG4gICAgcmVzdWx0QXJncy5wdXNoKCctZicsIGZsYWdzKTtcbiAgfVxuICByZXR1cm4gcmVzdWx0QXJncztcbn1cblxuLyoqXG4gKiBAdHlwZWRlZiB7T2JqZWN0fSBTdGFydEFjdGl2aXR5T3B0aW9uc1xuICogQHByb3BlcnR5IHshc3RyaW5nfSBpbnRlbnQgLSBUaGUgbmFtZSBvZiB0aGUgYWN0aXZpdHkgaW50ZW50IHRvIHN0YXJ0LCBmb3IgZXhhbXBsZVxuICogYGNvbS5zb21lLnBhY2thZ2UubmFtZS8uWW91clNlcnZpY2VTdWJDbGFzc05hbWVgLiBUaGlzIG9wdGlvbiBpcyBtYW5kYXRvcnkuXG4gKiBAcHJvcGVydHkgez9zdHJpbmd8bnVtYmVyfSB1c2VyIFsnY3VycmVudCddIC0gVGhlIHVzZXIgSUQgZm9yIHdoaWNoIHRoZSBzZXJ2aWNlIGlzIHN0YXJ0ZWQuXG4gKiBUaGUgYGN1cnJlbnRgIHVzZXIgaWQgaXMgdXNlZCBieSBkZWZhdWx0XG4gKiBAcHJvcGVydHkgez9ib29sZWFufSB3YWl0IFtmYWxzZV0gLSBTZXQgaXQgdG8gYHRydWVgIGlmIHlvdSB3YW50IHRvIGJsb2NrIHRoZSBtZXRob2QgY2FsbFxuICogdW50aWwgdGhlIGFjdGl2aXR5IG1hbmFnZXIncyBwcm9jZXNzIHJldHVybnMgdGhlIGNvbnRyb2wgdG8gdGhlIHN5c3RlbS5cbiAqIEBwcm9wZXJ0eSB7P2Jvb2xlYW59IHN0b3AgW2ZhbHNlXSAtIFNldCBpdCB0byBgdHJ1ZWAgdG8gZm9yY2Ugc3RvcCB0aGUgdGFyZ2V0XG4gKiBhcHAgYmVmb3JlIHN0YXJ0aW5nIHRoZSBhY3Rpdml0eVxuICogQHByb3BlcnR5IHs/bnVtYmVyfHN0cmluZ30gd2luZG93aW5nTW9kZSAtIFRoZSB3aW5kb3dpbmcgbW9kZSB0byBsYXVuY2ggdGhlIGFjdGl2aXR5IGludG8uXG4gKiBDaGVjayBodHRwczovL2FuZHJvaWQuZ29vZ2xlc291cmNlLmNvbS9wbGF0Zm9ybS9mcmFtZXdvcmtzL2Jhc2UvKy9tYXN0ZXIvY29yZS9qYXZhL2FuZHJvaWQvYXBwL1dpbmRvd0NvbmZpZ3VyYXRpb24uamF2YVxuICogZm9yIG1vcmUgZGV0YWlscyBvbiBwb3NzaWJsZSB3aW5kb3dpbmcgbW9kZXMgKGNvbnN0YW50cyBzdGFydGluZyB3aXRoIGBXSU5ET1dJTkdfTU9ERV9gKS5cbiAqIEBwcm9wZXJ0eSB7P251bWJlcnxzdHJpbmd9IGFjdGl2aXR5VHlwZSAtIFRoZSBhY3Rpdml0eSB0eXBlIHRvIGxhdW5jaCB0aGUgYWN0aXZpdHkgYXMuXG4gKiBDaGVjayBodHRwczovL2FuZHJvaWQuZ29vZ2xlc291cmNlLmNvbS9wbGF0Zm9ybS9mcmFtZXdvcmtzL2Jhc2UvKy9tYXN0ZXIvY29yZS9qYXZhL2FuZHJvaWQvYXBwL1dpbmRvd0NvbmZpZ3VyYXRpb24uamF2YVxuICogZm9yIG1vcmUgZGV0YWlscyBvbiBwb3NzaWJsZSBhY3Rpdml0eSB0eXBlcyAoY29uc3RhbnRzIHN0YXJ0aW5nIHdpdGggYEFDVElWSVRZX1RZUEVfYCkuXG4gKiBAcHJvcGVydHkgez9udW1iZXJ8c3RyaW5nfSBkaXNwbGF5IC0gVGhlIGRpc3BsYXkgaWRlbnRpZmllciB0byBsYXVuY2ggdGhlIGFjdGl2aXR5IGludG8uXG4gKiBAcHJvcGVydHkgez9zdHJpbmd9IGFjdGlvbiAtIEFjdGlvbiBuYW1lXG4gKiBAcHJvcGVydHkgez9zdHJpbmd9IHVyaSAtIFVuaWZpZWQgcmVzb3VyY2UgaWRlbnRpZmllclxuICogQHByb3BlcnR5IHs/c3RyaW5nfSBtaW1lVHlwZSAtIE1pbWUgdHlwZVxuICogQHByb3BlcnR5IHs/c3RyaW5nfSBpZGVudGlmaWVyIC0gT3B0aW9uYWwgaWRlbnRpZmllclxuICogQHByb3BlcnR5IHs/c3RyaW5nfEFycmF5PHN0cmluZz59IGNhdGVnb3JpZXMgLSBPbmUgb3IgbW9yZSBjYXRlZ29yeSBuYW1lc1xuICogQHByb3BlcnR5IHs/c3RyaW5nfSBjb21wb25lbnQgLSBDb21wb25lbnQgbmFtZVxuICogQHByb3BlcnR5IHtBcnJheTxzdHJpbmd8QXJyYXk8c3RyaW5nPj59IGV4dHJhcyAtIE9wdGlvbmFsIGludGVudCBhcmd1bWVudHMuIE11c3QgYmUgcmVwcmVzZW50ZWRcbiAqIGFzIGFycmF5IG9mIGFycmF5cywgd2hlcmUgZWFjaCBzdWJhcnJheSBpdGVtIGNvbnRhaW5zIHR3byBpdGVtczogdmFsdWUgdHlwZSBhbmQgdGhlIHZhbHVlIGl0c2VsZi5cbiAqIFN1cHBvcnRlZCB2YWx1ZSB0eXBlcyBhcmU6XG4gKiAtIHM6IHN0cmluZy4gVmFsdWUgbXVzdCBiZSBhIHZhbGlkIHN0cmluZ1xuICogLSBzbjogbnVsbC4gVmFsdWUgaXMgaWdub3JlZCBmb3IgdGhpcyB0eXBlXG4gKiAtIHo6IGJvb2xlYW4uIFZhbHVlIG11c3QgYmUgZWl0aGVyIGB0cnVlYCBvciBgZmFsc2VgXG4gKiAtIGk6IGludGVnZXIuIFZhbHVlIG11c3QgYmUgYSB2YWxpZCA0LWJ5dGUgaW50ZWdlciBudW1iZXJcbiAqIC0gbDogbG9uZy4gVmFsdWUgbXVzdCBiZSBhIHZhbGlkIDgtYnl0ZSBsb25nIG51bWJlclxuICogLSBmOiBmbG9hdDogVmFsdWUgbXVzdCBiZSBhIHZhbGlkIGZsb2F0IG51bWJlclxuICogLSB1OiB1cmkuIFZhbHVlIG11c3QgYmUgYSB2YWxpZCB1bmlmb3JtIHJlc291cmNlIGlkZW50aWZpZXIgc3RyaW5nXG4gKiAtIGNuOiBjb21wb25lbnQgbmFtZS4gVmFsdWUgbXVzdCBiZSBhIHZhbGlkIGNvbXBvbmVudCBuYW1lIHN0cmluZ1xuICogLSBpYTogSW50ZWdlcltdLiBWYWx1ZSBtdXN0IGJlIGEgc3RyaW5nIG9mIGNvbW1hLXNlcGFyYXRlZCBpbnRlZ2Vyc1xuICogLSBpYWw6IExpc3Q8SW50ZWdlcj4uIFZhbHVlIG11c3QgYmUgYSBzdHJpbmcgb2YgY29tbWEtc2VwYXJhdGVkIGludGVnZXJzXG4gKiAtIGxhOiBMb25nW10uIFZhbHVlIG11c3QgYmUgYSBzdHJpbmcgb2YgY29tbWEtc2VwYXJhdGVkIGxvbmcgbnVtYmVyc1xuICogLSBsYWw6IExpc3Q8TG9uZz4uIFZhbHVlIG11c3QgYmUgYSBzdHJpbmcgb2YgY29tbWEtc2VwYXJhdGVkIGxvbmcgbnVtYmVyc1xuICogLSBmYTogRmxvYXRbXS4gVmFsdWUgbXVzdCBiZSBhIHN0cmluZyBvZiBjb21tYS1zZXBhcmF0ZWQgZmxvYXQgbnVtYmVyc1xuICogLSBmYWw6IExpc3Q8RmxvYXQ+LiBWYWx1ZSBtdXN0IGJlIGEgc3RyaW5nIG9mIGNvbW1hLXNlcGFyYXRlZCBmbG9hdCBudW1iZXJzXG4gKiAtIHNhOiBTdHJpbmdbXS4gVmFsdWUgbXVzdCBiZSBjb21tYS1zZXBhcmF0ZWQgc3RyaW5ncy4gVG8gZW1iZWQgYSBjb21tYSBpbnRvIGEgc3RyaW5nLFxuICogZXNjYXBlIGl0IHVzaW5nIFwiXFwsXCJcbiAqIC0gc2FsOiBMaXN0PFN0cmluZz4uIFZhbHVlIG11c3QgYmUgY29tbWEtc2VwYXJhdGVkIHN0cmluZ3MuIFRvIGVtYmVkIGEgY29tbWEgaW50byBhIHN0cmluZyxcbiAqIGVzY2FwZSBpdCB1c2luZyBcIlxcLFwiXG4gKiBGb3IgZXhhbXBsZTogW1sncycsICdNeSBTdHJpbmcxJ10sIFsncycsICdNeSBTdHJpbmcyJ10sIFsnaWEnLCAnMSwyLDMsNCddXVxuICogQHByb3BlcnR5IHs/c3RyaW5nfSBmbGFncyAtIEludGVudCBzdGFydHVwLXNwZWNpZmljIGZsYWdzIGFzIGEgaGV4YWRlY2ltYWwgc3RyaW5nLlxuICogU2VlIGh0dHBzOi8vZGV2ZWxvcGVyLmFuZHJvaWQuY29tL3JlZmVyZW5jZS9hbmRyb2lkL2NvbnRlbnQvSW50ZW50Lmh0bWxcbiAqIGZvciB0aGUgbGlzdCBvZiBhdmFpbGFibGUgZmxhZyB2YWx1ZXMgKGNvbnN0YW50cyBzdGFydGluZyB3aXRoIEZMQUdfQUNUSVZJVFlfKS5cbiAqIEZsYWcgdmFsdWVzIGNvdWxkIGJlIG1lcmdlZCB1c2luZyB0aGUgbG9naWNhbCAnb3InIG9wZXJhdGlvbi5cbiAqIEZvciBleGFtcGxlLCAweDEwMjAwMDAwIGlzIHRoZSBjb21iaW5hdGlvbiBvZiB0d28gZmxhZ3M6XG4gKiAweDEwMDAwMDAwIGBGTEFHX0FDVElWSVRZX05FV19UQVNLYCB8IDB4MDAyMDAwMDAgYEZMQUdfQUNUSVZJVFlfUkVTRVRfVEFTS19JRl9ORUVERURgXG4gKi9cblxuLyoqXG4gKiBTdGFydHMgdGhlIGdpdmVuIGFjdGl2aXR5IGludGVudC5cbiAqXG4gKiBAcGFyYW0ge1N0YXJ0QWN0aXZpdHlPcHRpb25zfSBvcHRzXG4gKiBAcmV0dXJucyB7c3RyaW5nfSBUaGUgY29tbWFuZCBvdXRwdXRcbiAqIEB0aHJvd3Mge0Vycm9yfSBJZiB0aGVyZSB3YXMgYSBmYWlsdXJlIHdoaWxlIHN0YXJ0aW5nIHRoZSBhY3Rpdml0eVxuICogb3IgcmVxdWlyZWQgb3B0aW9ucyBhcmUgbWlzc2luZ1xuICovXG5jb21tYW5kcy5tb2JpbGVTdGFydEFjdGl2aXR5ID0gYXN5bmMgZnVuY3Rpb24gbW9iaWxlU3RhcnRBY3Rpdml0eSAob3B0cyA9IHt9KSB7XG4gIGNvbnN0IHtcbiAgICBpbnRlbnQsXG4gICAgdXNlcixcbiAgICB3YWl0LFxuICAgIHN0b3AsXG4gICAgd2luZG93aW5nTW9kZSxcbiAgICBhY3Rpdml0eVR5cGUsXG4gICAgZGlzcGxheSxcbiAgfSA9IHJlcXVpcmVPcHRpb25zKG9wdHMsIFsnaW50ZW50J10pO1xuICBjb25zdCBjbWQgPSBbXG4gICAgJ2FtJywgKGF3YWl0IHRoaXMuYWRiLmdldEFwaUxldmVsKCkgPCBBUElfTEVWRUxfQU5EUk9JRF84KSA/ICdzdGFydCcgOiAnc3RhcnQtYWN0aXZpdHknLFxuICBdO1xuICBpZiAoIV8uaXNOaWwodXNlcikpIHtcbiAgICBjbWQucHVzaCgnLS11c2VyJywgdXNlcik7XG4gIH1cbiAgaWYgKHdhaXQpIHtcbiAgICBjbWQucHVzaCgnLVcnKTtcbiAgfVxuICBpZiAoc3RvcCkge1xuICAgIGNtZC5wdXNoKCctUycpO1xuICB9XG4gIGlmICghXy5pc05pbCh3aW5kb3dpbmdNb2RlKSkge1xuICAgIGNtZC5wdXNoKCctLXdpbmRvd2luZ01vZGUnLCB3aW5kb3dpbmdNb2RlKTtcbiAgfVxuICBpZiAoIV8uaXNOaWwoYWN0aXZpdHlUeXBlKSkge1xuICAgIGNtZC5wdXNoKCctLWFjdGl2aXR5VHlwZScsIGFjdGl2aXR5VHlwZSk7XG4gIH1cbiAgaWYgKCFfLmlzTmlsKGRpc3BsYXkpKSB7XG4gICAgY21kLnB1c2goJy0tZGlzcGxheScsIGRpc3BsYXkpO1xuICB9XG4gIGNtZC5wdXNoKC4uLihwYXJzZUNvbW1vbkludGVudEFyZ3VtZW50cyhvcHRzKSkpO1xuICBjbWQucHVzaChpbnRlbnQpO1xuICByZXR1cm4gYXdhaXQgdGhpcy5hZGIuc2hlbGwoY21kKTtcbn07XG5cbi8qKlxuICogQHR5cGVkZWYge09iamVjdH0gU3RhcnRTZXJ2aWNlT3B0aW9uc1xuICogQHByb3BlcnR5IHshc3RyaW5nfSBpbnRlbnQgLSBUaGUgbmFtZSBvZiB0aGUgc2VydmljZSBpbnRlbnQgdG8gc3RhcnQsIGZvciBleGFtcGxlXG4gKiBgY29tLnNvbWUucGFja2FnZS5uYW1lLy5Zb3VyU2VydmljZVN1YkNsYXNzTmFtZWAuIFRoaXMgb3B0aW9uIGlzIG1hbmRhdG9yeS5cbiAqIEBwcm9wZXJ0eSB7P3N0cmluZ3xudW1iZXJ9IHVzZXIgWydjdXJyZW50J10gLSBUaGUgdXNlciBJRCBmb3Igd2hpY2ggdGhlIHNlcnZpY2UgaXMgc3RhcnRlZC5cbiAqIFRoZSBgY3VycmVudGAgdXNlciBpZCBpcyB1c2VkIGJ5IGRlZmF1bHRcbiAqIEBwcm9wZXJ0eSB7P2Jvb2xlYW59IGZvcmVncm91bmQgW2ZhbHNlXSAtIFNldCBpdCB0byBgdHJ1ZWAgaWYgeW91ciBzZXJ2aWNlIG11c3QgYmVcbiAqIHN0YXJ0ZWQgYXMgZm9yZWdyb3VuZCBzZXJ2aWNlLiBUaGlzIG9wdGlvbiBpcyBpZ25vcmVkIGlmIHRoZSBBUEkgbGV2ZWwgb2YgdGhlXG4gKiBkZXZpY2UgdW5kZXIgdGVzdCBpcyBiZWxvdyAyNiAoQW5kcm9pZCA4KS5cbiAqIEBwcm9wZXJ0eSB7P3N0cmluZ30gYWN0aW9uIC0gQWN0aW9uIG5hbWVcbiAqIEBwcm9wZXJ0eSB7P3N0cmluZ30gdXJpIC0gVW5pZmllZCByZXNvdXJjZSBpZGVudGlmaWVyXG4gKiBAcHJvcGVydHkgez9zdHJpbmd9IG1pbWVUeXBlIC0gTWltZSB0eXBlXG4gKiBAcHJvcGVydHkgez9zdHJpbmd9IGlkZW50aWZpZXIgLSBPcHRpb25hbCBpZGVudGlmaWVyXG4gKiBAcHJvcGVydHkgez9zdHJpbmd8QXJyYXk8c3RyaW5nPn0gY2F0ZWdvcmllcyAtIE9uZSBvciBtb3JlIGNhdGVnb3J5IG5hbWVzXG4gKiBAcHJvcGVydHkgez9zdHJpbmd9IGNvbXBvbmVudCAtIENvbXBvbmVudCBuYW1lXG4gKiBAcHJvcGVydHkge0FycmF5PHN0cmluZ3xBcnJheTxzdHJpbmc+Pn0gZXh0cmFzIC0gT3B0aW9uYWwgaW50ZW50IGFyZ3VtZW50cy4gTXVzdCBiZSByZXByZXNlbnRlZFxuICogYXMgYXJyYXkgb2YgYXJyYXlzLCB3aGVyZSBlYWNoIHN1YmFycmF5IGl0ZW0gY29udGFpbnMgdHdvIGl0ZW1zOiB2YWx1ZSB0eXBlIGFuZCB0aGUgdmFsdWUgaXRzZWxmLlxuICogU3VwcG9ydGVkIHZhbHVlIHR5cGVzIGFyZTpcbiAqIC0gczogc3RyaW5nLiBWYWx1ZSBtdXN0IGJlIGEgdmFsaWQgc3RyaW5nXG4gKiAtIHNuOiBudWxsLiBWYWx1ZSBpcyBpZ25vcmVkIGZvciB0aGlzIHR5cGVcbiAqIC0gejogYm9vbGVhbi4gVmFsdWUgbXVzdCBiZSBlaXRoZXIgYHRydWVgIG9yIGBmYWxzZWBcbiAqIC0gaTogaW50ZWdlci4gVmFsdWUgbXVzdCBiZSBhIHZhbGlkIDQtYnl0ZSBpbnRlZ2VyIG51bWJlclxuICogLSBsOiBsb25nLiBWYWx1ZSBtdXN0IGJlIGEgdmFsaWQgOC1ieXRlIGxvbmcgbnVtYmVyXG4gKiAtIGY6IGZsb2F0OiBWYWx1ZSBtdXN0IGJlIGEgdmFsaWQgZmxvYXQgbnVtYmVyXG4gKiAtIHU6IHVyaS4gVmFsdWUgbXVzdCBiZSBhIHZhbGlkIHVuaWZvcm0gcmVzb3VyY2UgaWRlbnRpZmllciBzdHJpbmdcbiAqIC0gY246IGNvbXBvbmVudCBuYW1lLiBWYWx1ZSBtdXN0IGJlIGEgdmFsaWQgY29tcG9uZW50IG5hbWUgc3RyaW5nXG4gKiAtIGlhOiBJbnRlZ2VyW10uIFZhbHVlIG11c3QgYmUgYSBzdHJpbmcgb2YgY29tbWEtc2VwYXJhdGVkIGludGVnZXJzXG4gKiAtIGlhbDogTGlzdDxJbnRlZ2VyPi4gVmFsdWUgbXVzdCBiZSBhIHN0cmluZyBvZiBjb21tYS1zZXBhcmF0ZWQgaW50ZWdlcnNcbiAqIC0gbGE6IExvbmdbXS4gVmFsdWUgbXVzdCBiZSBhIHN0cmluZyBvZiBjb21tYS1zZXBhcmF0ZWQgbG9uZyBudW1iZXJzXG4gKiAtIGxhbDogTGlzdDxMb25nPi4gVmFsdWUgbXVzdCBiZSBhIHN0cmluZyBvZiBjb21tYS1zZXBhcmF0ZWQgbG9uZyBudW1iZXJzXG4gKiAtIGZhOiBGbG9hdFtdLiBWYWx1ZSBtdXN0IGJlIGEgc3RyaW5nIG9mIGNvbW1hLXNlcGFyYXRlZCBmbG9hdCBudW1iZXJzXG4gKiAtIGZhbDogTGlzdDxGbG9hdD4uIFZhbHVlIG11c3QgYmUgYSBzdHJpbmcgb2YgY29tbWEtc2VwYXJhdGVkIGZsb2F0IG51bWJlcnNcbiAqIC0gc2E6IFN0cmluZ1tdLiBWYWx1ZSBtdXN0IGJlIGNvbW1hLXNlcGFyYXRlZCBzdHJpbmdzLiBUbyBlbWJlZCBhIGNvbW1hIGludG8gYSBzdHJpbmcsXG4gKiBlc2NhcGUgaXQgdXNpbmcgXCJcXCxcIlxuICogLSBzYWw6IExpc3Q8U3RyaW5nPi4gVmFsdWUgbXVzdCBiZSBjb21tYS1zZXBhcmF0ZWQgc3RyaW5ncy4gVG8gZW1iZWQgYSBjb21tYSBpbnRvIGEgc3RyaW5nLFxuICogZXNjYXBlIGl0IHVzaW5nIFwiXFwsXCJcbiAqIEZvciBleGFtcGxlOiBbWydzJywgJ015IFN0cmluZzEnXSwgWydzJywgJ015IFN0cmluZzInXSwgWydpYScsICcxLDIsMyw0J11dXG4gKiBAcHJvcGVydHkgez9zdHJpbmd9IGZsYWdzIC0gSW50ZW50IHN0YXJ0dXAtc3BlY2lmaWMgZmxhZ3MgYXMgYSBoZXhhZGVjaW1hbCBzdHJpbmcuXG4gKiBTZWUgaHR0cHM6Ly9kZXZlbG9wZXIuYW5kcm9pZC5jb20vcmVmZXJlbmNlL2FuZHJvaWQvY29udGVudC9JbnRlbnQuaHRtbFxuICogZm9yIHRoZSBsaXN0IG9mIGF2YWlsYWJsZSBmbGFnIHZhbHVlcyAoY29uc3RhbnRzIHN0YXJ0aW5nIHdpdGggRkxBR19BQ1RJVklUWV8pLlxuICogRmxhZyB2YWx1ZXMgY291bGQgYmUgbWVyZ2VkIHVzaW5nIHRoZSBsb2dpY2FsICdvcicgb3BlcmF0aW9uLlxuICogRm9yIGV4YW1wbGUsIDB4MTAyMDAwMDAgaXMgdGhlIGNvbWJpbmF0aW9uIG9mIHR3byBmbGFnczpcbiAqIDB4MTAwMDAwMDAgYEZMQUdfQUNUSVZJVFlfTkVXX1RBU0tgIHwgMHgwMDIwMDAwMCBgRkxBR19BQ1RJVklUWV9SRVNFVF9UQVNLX0lGX05FRURFRGBcbiAqL1xuXG4vKipcbiAqIFN0YXJ0cyB0aGUgZ2l2ZW4gc2VydmljZSBpbnRlbnQuXG4gKlxuICogQHBhcmFtIHtTdGFydFNlcnZpY2VPcHRpb25zfSBvcHRzXG4gKiBAcmV0dXJucyB7c3RyaW5nfSBUaGUgY29tbWFuZCBvdXRwdXRcbiAqIEB0aHJvd3Mge0Vycm9yfSBJZiB0aGVyZSB3YXMgYSBmYWlsdXJlIHdoaWxlIHN0YXJ0aW5nIHRoZSBzZXJ2aWNlXG4gKiBvciByZXF1aXJlZCBvcHRpb25zIGFyZSBtaXNzaW5nXG4gKi9cbmNvbW1hbmRzLm1vYmlsZVN0YXJ0U2VydmljZSA9IGFzeW5jIGZ1bmN0aW9uIG1vYmlsZVN0YXJ0U2VydmljZSAob3B0cyA9IHt9KSB7XG4gIGNvbnN0IHtcbiAgICBpbnRlbnQsXG4gICAgdXNlcixcbiAgICBmb3JlZ3JvdW5kLFxuICB9ID0gcmVxdWlyZU9wdGlvbnMob3B0cywgWydpbnRlbnQnXSk7XG4gIGNvbnN0IGNtZCA9IFsnYW0nXTtcbiAgaWYgKGF3YWl0IHRoaXMuYWRiLmdldEFwaUxldmVsKCkgPCBBUElfTEVWRUxfQU5EUk9JRF84KSB7XG4gICAgY21kLnB1c2goJ3N0YXJ0c2VydmljZScpO1xuICB9IGVsc2Uge1xuICAgIGNtZC5wdXNoKGZvcmVncm91bmQgPyAnc3RhcnQtZm9yZWdyb3VuZC1zZXJ2aWNlJyA6ICdzdGFydC1zZXJ2aWNlJyk7XG4gIH1cbiAgaWYgKCFfLmlzTmlsKHVzZXIpKSB7XG4gICAgY21kLnB1c2goJy0tdXNlcicsIHVzZXIpO1xuICB9XG4gIGNtZC5wdXNoKC4uLihwYXJzZUNvbW1vbkludGVudEFyZ3VtZW50cyhvcHRzKSkpO1xuICBjbWQucHVzaChpbnRlbnQpO1xuICByZXR1cm4gYXdhaXQgdGhpcy5hZGIuc2hlbGwoY21kKTtcbn07XG5cbi8qKlxuICogQHR5cGVkZWYge09iamVjdH0gU3RvcFNlcnZpY2VPcHRpb25zXG4gKiBAcHJvcGVydHkgeyFzdHJpbmd9IGludGVudCAtIFRoZSBuYW1lIG9mIHRoZSBzZXJ2aWNlIGludGVudCB0byBzdG9wLCBmb3IgZXhhbXBsZVxuICogYGNvbS5zb21lLnBhY2thZ2UubmFtZS8uWW91clNlcnZpY2VTdWJDbGFzc05hbWVgLiBUaGlzIG9wdGlvbiBpcyBtYW5kYXRvcnkuXG4gKiBAcHJvcGVydHkge3N0cmluZ3xudW1iZXJ9IHVzZXIgWydjdXJyZW50J10gLSBUaGUgdXNlciBJRCBmb3Igd2hpY2ggdGhlIHNlcnZpY2UgaXMgcnVubmluZy5cbiAqIFRoZSBgY3VycmVudGAgdXNlciBpZCBpcyB1c2VkIGJ5IGRlZmF1bHRcbiAqL1xuXG4vKipcbiAqIFN0b3BzIHRoZSBnaXZlbiBzZXJ2aWNlIGludGVudC5cbiAqXG4gKiBAcGFyYW0ge1N0b3BTZXJ2aWNlT3B0aW9uc30gb3B0c1xuICogQHJldHVybnMge3N0cmluZ30gVGhlIGNvbW1hbmQgb3V0cHV0XG4gKiBAdGhyb3dzIHtFcnJvcn0gSWYgdGhlcmUgd2FzIGEgZmFpbHVyZSB3aGlsZSBzdG9wcGluZyB0aGUgc2VydmljZVxuICogb3IgcmVxdWlyZWQgb3B0aW9ucyBhcmUgbWlzc2luZ1xuICovXG5jb21tYW5kcy5tb2JpbGVTdG9wU2VydmljZSA9IGFzeW5jIGZ1bmN0aW9uIG1vYmlsZVN0b3BTZXJ2aWNlIChvcHRzID0ge30pIHtcbiAgY29uc3Qge1xuICAgIGludGVudCxcbiAgICB1c2VyLFxuICB9ID0gcmVxdWlyZU9wdGlvbnMob3B0cywgWydpbnRlbnQnXSk7XG4gIGNvbnN0IGNtZCA9IFtcbiAgICAnYW0nLFxuICAgIChhd2FpdCB0aGlzLmFkYi5nZXRBcGlMZXZlbCgpIDwgQVBJX0xFVkVMX0FORFJPSURfOCkgPyAnc3RvcHNlcnZpY2UnIDogJ3N0b3Atc2VydmljZSdcbiAgXTtcbiAgaWYgKCFfLmlzTmlsKHVzZXIpKSB7XG4gICAgY21kLnB1c2goJy0tdXNlcicsIHVzZXIpO1xuICB9XG4gIGNtZC5wdXNoKC4uLihwYXJzZUNvbW1vbkludGVudEFyZ3VtZW50cyhvcHRzKSkpO1xuICBjbWQucHVzaChpbnRlbnQpO1xuICByZXR1cm4gYXdhaXQgdGhpcy5hZGIuc2hlbGwoY21kKTtcbn07XG5cblxuZXhwb3J0IHsgY29tbWFuZHMgfTtcbmV4cG9ydCBkZWZhdWx0IGNvbW1hbmRzO1xuIl0sImZpbGUiOiJsaWIvY29tbWFuZHMvaW50ZW50LmpzIiwic291cmNlUm9vdCI6Ii4uLy4uLy4uIn0=
|
package/lib/commands/execute.js
CHANGED
package/lib/commands/index.js
CHANGED
|
@@ -16,7 +16,7 @@ import shellCmds from './shell';
|
|
|
16
16
|
import emuConsoleCmds from './emu-console';
|
|
17
17
|
import fileActionsCmds from './file-actions';
|
|
18
18
|
import appManagementCmds from './app-management';
|
|
19
|
-
import
|
|
19
|
+
import intentCmds from './intent';
|
|
20
20
|
import logCmds from './log';
|
|
21
21
|
|
|
22
22
|
|
|
@@ -34,7 +34,7 @@ Object.assign(
|
|
|
34
34
|
networkCmds,
|
|
35
35
|
coverageCmds,
|
|
36
36
|
recordscreenCmds,
|
|
37
|
-
|
|
37
|
+
intentCmds,
|
|
38
38
|
screenStreamCmds,
|
|
39
39
|
performanceCmds,
|
|
40
40
|
executeCmds,
|
|
@@ -0,0 +1,292 @@
|
|
|
1
|
+
import _ from 'lodash';
|
|
2
|
+
import { errors } from 'appium-base-driver';
|
|
3
|
+
|
|
4
|
+
const NO_VALUE_ARG_TYPE = 'sn';
|
|
5
|
+
const SUPPORTED_EXTRA_TYPES = [
|
|
6
|
+
's', NO_VALUE_ARG_TYPE, 'z', 'i', 'l', 'f', 'u', 'cn',
|
|
7
|
+
'ia', 'ial', 'la', 'lal', 'fa', 'fal', 'sa', 'sal',
|
|
8
|
+
];
|
|
9
|
+
const API_LEVEL_ANDROID_8 = 26;
|
|
10
|
+
|
|
11
|
+
const commands = {};
|
|
12
|
+
|
|
13
|
+
function requireOptions (opts, requiredKeys = []) {
|
|
14
|
+
const missingKeys = _.difference(requiredKeys, _.keys(opts));
|
|
15
|
+
if (!_.isEmpty(missingKeys)) {
|
|
16
|
+
throw new errors.InvalidArgumentError(`The following options are required: ${missingKeys}`);
|
|
17
|
+
}
|
|
18
|
+
return opts;
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
function parseCommonIntentArguments (opts = {}) {
|
|
22
|
+
const {
|
|
23
|
+
action,
|
|
24
|
+
uri,
|
|
25
|
+
mimeType,
|
|
26
|
+
identifier,
|
|
27
|
+
categories,
|
|
28
|
+
component,
|
|
29
|
+
extras,
|
|
30
|
+
flags,
|
|
31
|
+
} = opts;
|
|
32
|
+
const resultArgs = [];
|
|
33
|
+
if (action) {
|
|
34
|
+
resultArgs.push('-a', action);
|
|
35
|
+
}
|
|
36
|
+
if (uri) {
|
|
37
|
+
resultArgs.push('-d', uri);
|
|
38
|
+
}
|
|
39
|
+
if (mimeType) {
|
|
40
|
+
resultArgs.push('-t', mimeType);
|
|
41
|
+
}
|
|
42
|
+
if (!_.isNil(identifier)) {
|
|
43
|
+
resultArgs.push('-i', identifier);
|
|
44
|
+
}
|
|
45
|
+
if (categories) {
|
|
46
|
+
if (_.isArray(categories)) {
|
|
47
|
+
resultArgs.push(...(_.flatMap(categories.map((cName) => ['-c', cName]))));
|
|
48
|
+
} else {
|
|
49
|
+
resultArgs.push('-c', categories);
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
if (component) {
|
|
53
|
+
resultArgs.push('-n', component);
|
|
54
|
+
}
|
|
55
|
+
if (extras) {
|
|
56
|
+
if (!_.isArray(extras)) {
|
|
57
|
+
throw new errors.InvalidArgumentError(`'extras' must be an array`);
|
|
58
|
+
}
|
|
59
|
+
for (const item of extras) {
|
|
60
|
+
let type;
|
|
61
|
+
let value;
|
|
62
|
+
if (_.isArray(item)) {
|
|
63
|
+
[type, value] = item;
|
|
64
|
+
} else {
|
|
65
|
+
type = item;
|
|
66
|
+
}
|
|
67
|
+
if (!_.includes(SUPPORTED_EXTRA_TYPES, type)) {
|
|
68
|
+
throw new errors.InvalidArgumentError(`Intent argument type '${type}' is not known. ` +
|
|
69
|
+
`Supported intent argument types are: ${SUPPORTED_EXTRA_TYPES}`);
|
|
70
|
+
}
|
|
71
|
+
if (type === NO_VALUE_ARG_TYPE) {
|
|
72
|
+
resultArgs.push(`--e${type}`);
|
|
73
|
+
} else if (_.isUndefined(value)) {
|
|
74
|
+
throw new errors.InvalidArgumentError(`Intent argument type '${type}' requires a ` +
|
|
75
|
+
`value to be provided`);
|
|
76
|
+
} else {
|
|
77
|
+
resultArgs.push(`--e${type}`, value);
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
if (flags) {
|
|
82
|
+
resultArgs.push('-f', flags);
|
|
83
|
+
}
|
|
84
|
+
return resultArgs;
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
/**
|
|
88
|
+
* @typedef {Object} StartActivityOptions
|
|
89
|
+
* @property {!string} intent - The name of the activity intent to start, for example
|
|
90
|
+
* `com.some.package.name/.YourServiceSubClassName`. This option is mandatory.
|
|
91
|
+
* @property {?string|number} user ['current'] - The user ID for which the service is started.
|
|
92
|
+
* The `current` user id is used by default
|
|
93
|
+
* @property {?boolean} wait [false] - Set it to `true` if you want to block the method call
|
|
94
|
+
* until the activity manager's process returns the control to the system.
|
|
95
|
+
* @property {?boolean} stop [false] - Set it to `true` to force stop the target
|
|
96
|
+
* app before starting the activity
|
|
97
|
+
* @property {?number|string} windowingMode - The windowing mode to launch the activity into.
|
|
98
|
+
* Check https://android.googlesource.com/platform/frameworks/base/+/master/core/java/android/app/WindowConfiguration.java
|
|
99
|
+
* for more details on possible windowing modes (constants starting with `WINDOWING_MODE_`).
|
|
100
|
+
* @property {?number|string} activityType - The activity type to launch the activity as.
|
|
101
|
+
* Check https://android.googlesource.com/platform/frameworks/base/+/master/core/java/android/app/WindowConfiguration.java
|
|
102
|
+
* for more details on possible activity types (constants starting with `ACTIVITY_TYPE_`).
|
|
103
|
+
* @property {?number|string} display - The display identifier to launch the activity into.
|
|
104
|
+
* @property {?string} action - Action name
|
|
105
|
+
* @property {?string} uri - Unified resource identifier
|
|
106
|
+
* @property {?string} mimeType - Mime type
|
|
107
|
+
* @property {?string} identifier - Optional identifier
|
|
108
|
+
* @property {?string|Array<string>} categories - One or more category names
|
|
109
|
+
* @property {?string} component - Component name
|
|
110
|
+
* @property {Array<string|Array<string>>} extras - Optional intent arguments. Must be represented
|
|
111
|
+
* as array of arrays, where each subarray item contains two items: value type and the value itself.
|
|
112
|
+
* Supported value types are:
|
|
113
|
+
* - s: string. Value must be a valid string
|
|
114
|
+
* - sn: null. Value is ignored for this type
|
|
115
|
+
* - z: boolean. Value must be either `true` or `false`
|
|
116
|
+
* - i: integer. Value must be a valid 4-byte integer number
|
|
117
|
+
* - l: long. Value must be a valid 8-byte long number
|
|
118
|
+
* - f: float: Value must be a valid float number
|
|
119
|
+
* - u: uri. Value must be a valid uniform resource identifier string
|
|
120
|
+
* - cn: component name. Value must be a valid component name string
|
|
121
|
+
* - ia: Integer[]. Value must be a string of comma-separated integers
|
|
122
|
+
* - ial: List<Integer>. Value must be a string of comma-separated integers
|
|
123
|
+
* - la: Long[]. Value must be a string of comma-separated long numbers
|
|
124
|
+
* - lal: List<Long>. Value must be a string of comma-separated long numbers
|
|
125
|
+
* - fa: Float[]. Value must be a string of comma-separated float numbers
|
|
126
|
+
* - fal: List<Float>. Value must be a string of comma-separated float numbers
|
|
127
|
+
* - sa: String[]. Value must be comma-separated strings. To embed a comma into a string,
|
|
128
|
+
* escape it using "\,"
|
|
129
|
+
* - sal: List<String>. Value must be comma-separated strings. To embed a comma into a string,
|
|
130
|
+
* escape it using "\,"
|
|
131
|
+
* For example: [['s', 'My String1'], ['s', 'My String2'], ['ia', '1,2,3,4']]
|
|
132
|
+
* @property {?string} flags - Intent startup-specific flags as a hexadecimal string.
|
|
133
|
+
* See https://developer.android.com/reference/android/content/Intent.html
|
|
134
|
+
* for the list of available flag values (constants starting with FLAG_ACTIVITY_).
|
|
135
|
+
* Flag values could be merged using the logical 'or' operation.
|
|
136
|
+
* For example, 0x10200000 is the combination of two flags:
|
|
137
|
+
* 0x10000000 `FLAG_ACTIVITY_NEW_TASK` | 0x00200000 `FLAG_ACTIVITY_RESET_TASK_IF_NEEDED`
|
|
138
|
+
*/
|
|
139
|
+
|
|
140
|
+
/**
|
|
141
|
+
* Starts the given activity intent.
|
|
142
|
+
*
|
|
143
|
+
* @param {StartActivityOptions} opts
|
|
144
|
+
* @returns {string} The command output
|
|
145
|
+
* @throws {Error} If there was a failure while starting the activity
|
|
146
|
+
* or required options are missing
|
|
147
|
+
*/
|
|
148
|
+
commands.mobileStartActivity = async function mobileStartActivity (opts = {}) {
|
|
149
|
+
const {
|
|
150
|
+
intent,
|
|
151
|
+
user,
|
|
152
|
+
wait,
|
|
153
|
+
stop,
|
|
154
|
+
windowingMode,
|
|
155
|
+
activityType,
|
|
156
|
+
display,
|
|
157
|
+
} = requireOptions(opts, ['intent']);
|
|
158
|
+
const cmd = [
|
|
159
|
+
'am', (await this.adb.getApiLevel() < API_LEVEL_ANDROID_8) ? 'start' : 'start-activity',
|
|
160
|
+
];
|
|
161
|
+
if (!_.isNil(user)) {
|
|
162
|
+
cmd.push('--user', user);
|
|
163
|
+
}
|
|
164
|
+
if (wait) {
|
|
165
|
+
cmd.push('-W');
|
|
166
|
+
}
|
|
167
|
+
if (stop) {
|
|
168
|
+
cmd.push('-S');
|
|
169
|
+
}
|
|
170
|
+
if (!_.isNil(windowingMode)) {
|
|
171
|
+
cmd.push('--windowingMode', windowingMode);
|
|
172
|
+
}
|
|
173
|
+
if (!_.isNil(activityType)) {
|
|
174
|
+
cmd.push('--activityType', activityType);
|
|
175
|
+
}
|
|
176
|
+
if (!_.isNil(display)) {
|
|
177
|
+
cmd.push('--display', display);
|
|
178
|
+
}
|
|
179
|
+
cmd.push(...(parseCommonIntentArguments(opts)));
|
|
180
|
+
cmd.push(intent);
|
|
181
|
+
return await this.adb.shell(cmd);
|
|
182
|
+
};
|
|
183
|
+
|
|
184
|
+
/**
|
|
185
|
+
* @typedef {Object} StartServiceOptions
|
|
186
|
+
* @property {!string} intent - The name of the service intent to start, for example
|
|
187
|
+
* `com.some.package.name/.YourServiceSubClassName`. This option is mandatory.
|
|
188
|
+
* @property {?string|number} user ['current'] - The user ID for which the service is started.
|
|
189
|
+
* The `current` user id is used by default
|
|
190
|
+
* @property {?boolean} foreground [false] - Set it to `true` if your service must be
|
|
191
|
+
* started as foreground service. This option is ignored if the API level of the
|
|
192
|
+
* device under test is below 26 (Android 8).
|
|
193
|
+
* @property {?string} action - Action name
|
|
194
|
+
* @property {?string} uri - Unified resource identifier
|
|
195
|
+
* @property {?string} mimeType - Mime type
|
|
196
|
+
* @property {?string} identifier - Optional identifier
|
|
197
|
+
* @property {?string|Array<string>} categories - One or more category names
|
|
198
|
+
* @property {?string} component - Component name
|
|
199
|
+
* @property {Array<string|Array<string>>} extras - Optional intent arguments. Must be represented
|
|
200
|
+
* as array of arrays, where each subarray item contains two items: value type and the value itself.
|
|
201
|
+
* Supported value types are:
|
|
202
|
+
* - s: string. Value must be a valid string
|
|
203
|
+
* - sn: null. Value is ignored for this type
|
|
204
|
+
* - z: boolean. Value must be either `true` or `false`
|
|
205
|
+
* - i: integer. Value must be a valid 4-byte integer number
|
|
206
|
+
* - l: long. Value must be a valid 8-byte long number
|
|
207
|
+
* - f: float: Value must be a valid float number
|
|
208
|
+
* - u: uri. Value must be a valid uniform resource identifier string
|
|
209
|
+
* - cn: component name. Value must be a valid component name string
|
|
210
|
+
* - ia: Integer[]. Value must be a string of comma-separated integers
|
|
211
|
+
* - ial: List<Integer>. Value must be a string of comma-separated integers
|
|
212
|
+
* - la: Long[]. Value must be a string of comma-separated long numbers
|
|
213
|
+
* - lal: List<Long>. Value must be a string of comma-separated long numbers
|
|
214
|
+
* - fa: Float[]. Value must be a string of comma-separated float numbers
|
|
215
|
+
* - fal: List<Float>. Value must be a string of comma-separated float numbers
|
|
216
|
+
* - sa: String[]. Value must be comma-separated strings. To embed a comma into a string,
|
|
217
|
+
* escape it using "\,"
|
|
218
|
+
* - sal: List<String>. Value must be comma-separated strings. To embed a comma into a string,
|
|
219
|
+
* escape it using "\,"
|
|
220
|
+
* For example: [['s', 'My String1'], ['s', 'My String2'], ['ia', '1,2,3,4']]
|
|
221
|
+
* @property {?string} flags - Intent startup-specific flags as a hexadecimal string.
|
|
222
|
+
* See https://developer.android.com/reference/android/content/Intent.html
|
|
223
|
+
* for the list of available flag values (constants starting with FLAG_ACTIVITY_).
|
|
224
|
+
* Flag values could be merged using the logical 'or' operation.
|
|
225
|
+
* For example, 0x10200000 is the combination of two flags:
|
|
226
|
+
* 0x10000000 `FLAG_ACTIVITY_NEW_TASK` | 0x00200000 `FLAG_ACTIVITY_RESET_TASK_IF_NEEDED`
|
|
227
|
+
*/
|
|
228
|
+
|
|
229
|
+
/**
|
|
230
|
+
* Starts the given service intent.
|
|
231
|
+
*
|
|
232
|
+
* @param {StartServiceOptions} opts
|
|
233
|
+
* @returns {string} The command output
|
|
234
|
+
* @throws {Error} If there was a failure while starting the service
|
|
235
|
+
* or required options are missing
|
|
236
|
+
*/
|
|
237
|
+
commands.mobileStartService = async function mobileStartService (opts = {}) {
|
|
238
|
+
const {
|
|
239
|
+
intent,
|
|
240
|
+
user,
|
|
241
|
+
foreground,
|
|
242
|
+
} = requireOptions(opts, ['intent']);
|
|
243
|
+
const cmd = ['am'];
|
|
244
|
+
if (await this.adb.getApiLevel() < API_LEVEL_ANDROID_8) {
|
|
245
|
+
cmd.push('startservice');
|
|
246
|
+
} else {
|
|
247
|
+
cmd.push(foreground ? 'start-foreground-service' : 'start-service');
|
|
248
|
+
}
|
|
249
|
+
if (!_.isNil(user)) {
|
|
250
|
+
cmd.push('--user', user);
|
|
251
|
+
}
|
|
252
|
+
cmd.push(...(parseCommonIntentArguments(opts)));
|
|
253
|
+
cmd.push(intent);
|
|
254
|
+
return await this.adb.shell(cmd);
|
|
255
|
+
};
|
|
256
|
+
|
|
257
|
+
/**
|
|
258
|
+
* @typedef {Object} StopServiceOptions
|
|
259
|
+
* @property {!string} intent - The name of the service intent to stop, for example
|
|
260
|
+
* `com.some.package.name/.YourServiceSubClassName`. This option is mandatory.
|
|
261
|
+
* @property {string|number} user ['current'] - The user ID for which the service is running.
|
|
262
|
+
* The `current` user id is used by default
|
|
263
|
+
*/
|
|
264
|
+
|
|
265
|
+
/**
|
|
266
|
+
* Stops the given service intent.
|
|
267
|
+
*
|
|
268
|
+
* @param {StopServiceOptions} opts
|
|
269
|
+
* @returns {string} The command output
|
|
270
|
+
* @throws {Error} If there was a failure while stopping the service
|
|
271
|
+
* or required options are missing
|
|
272
|
+
*/
|
|
273
|
+
commands.mobileStopService = async function mobileStopService (opts = {}) {
|
|
274
|
+
const {
|
|
275
|
+
intent,
|
|
276
|
+
user,
|
|
277
|
+
} = requireOptions(opts, ['intent']);
|
|
278
|
+
const cmd = [
|
|
279
|
+
'am',
|
|
280
|
+
(await this.adb.getApiLevel() < API_LEVEL_ANDROID_8) ? 'stopservice' : 'stop-service'
|
|
281
|
+
];
|
|
282
|
+
if (!_.isNil(user)) {
|
|
283
|
+
cmd.push('--user', user);
|
|
284
|
+
}
|
|
285
|
+
cmd.push(...(parseCommonIntentArguments(opts)));
|
|
286
|
+
cmd.push(intent);
|
|
287
|
+
return await this.adb.shell(cmd);
|
|
288
|
+
};
|
|
289
|
+
|
|
290
|
+
|
|
291
|
+
export { commands };
|
|
292
|
+
export default commands;
|
package/package.json
CHANGED
|
@@ -1,62 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
|
|
3
|
-
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
|
|
4
|
-
|
|
5
|
-
Object.defineProperty(exports, "__esModule", {
|
|
6
|
-
value: true
|
|
7
|
-
});
|
|
8
|
-
exports.default = exports.commands = void 0;
|
|
9
|
-
|
|
10
|
-
require("source-map-support/register");
|
|
11
|
-
|
|
12
|
-
var _lodash = _interopRequireDefault(require("lodash"));
|
|
13
|
-
|
|
14
|
-
const commands = {};
|
|
15
|
-
exports.commands = commands;
|
|
16
|
-
|
|
17
|
-
function requireOptions(opts, requiredKeys = []) {
|
|
18
|
-
const missingKeys = _lodash.default.difference(requiredKeys, _lodash.default.keys(opts));
|
|
19
|
-
|
|
20
|
-
if (!_lodash.default.isEmpty(missingKeys)) {
|
|
21
|
-
throw new Error(`The following options are required: ${missingKeys}`);
|
|
22
|
-
}
|
|
23
|
-
|
|
24
|
-
return opts;
|
|
25
|
-
}
|
|
26
|
-
|
|
27
|
-
commands.mobileStartService = async function mobileStartService(opts = {}) {
|
|
28
|
-
const {
|
|
29
|
-
intent,
|
|
30
|
-
user,
|
|
31
|
-
foreground
|
|
32
|
-
} = requireOptions(opts, ['intent']);
|
|
33
|
-
const cmd = ['am', foreground ? 'start-foreground-service' : 'start-service'];
|
|
34
|
-
|
|
35
|
-
if (user) {
|
|
36
|
-
cmd.push('--user', user);
|
|
37
|
-
}
|
|
38
|
-
|
|
39
|
-
cmd.push(intent);
|
|
40
|
-
return await this.adb.shell(cmd);
|
|
41
|
-
};
|
|
42
|
-
|
|
43
|
-
commands.mobileStopService = async function mobileStopService(opts = {}) {
|
|
44
|
-
const {
|
|
45
|
-
intent,
|
|
46
|
-
user
|
|
47
|
-
} = requireOptions(opts, ['intent']);
|
|
48
|
-
const cmd = ['am', 'stop-service'];
|
|
49
|
-
|
|
50
|
-
if (user) {
|
|
51
|
-
cmd.push('--user', user);
|
|
52
|
-
}
|
|
53
|
-
|
|
54
|
-
cmd.push(intent);
|
|
55
|
-
return await this.adb.shell(cmd);
|
|
56
|
-
};
|
|
57
|
-
|
|
58
|
-
var _default = commands;
|
|
59
|
-
exports.default = _default;require('source-map-support').install();
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
//# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImxpYi9jb21tYW5kcy9zZXJ2aWNlcy5qcyJdLCJuYW1lcyI6WyJjb21tYW5kcyIsInJlcXVpcmVPcHRpb25zIiwib3B0cyIsInJlcXVpcmVkS2V5cyIsIm1pc3NpbmdLZXlzIiwiXyIsImRpZmZlcmVuY2UiLCJrZXlzIiwiaXNFbXB0eSIsIkVycm9yIiwibW9iaWxlU3RhcnRTZXJ2aWNlIiwiaW50ZW50IiwidXNlciIsImZvcmVncm91bmQiLCJjbWQiLCJwdXNoIiwiYWRiIiwic2hlbGwiLCJtb2JpbGVTdG9wU2VydmljZSJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7QUFBQTs7QUFFQSxNQUFNQSxRQUFRLEdBQUcsRUFBakI7OztBQUVBLFNBQVNDLGNBQVQsQ0FBeUJDLElBQXpCLEVBQStCQyxZQUFZLEdBQUcsRUFBOUMsRUFBa0Q7QUFDaEQsUUFBTUMsV0FBVyxHQUFHQyxnQkFBRUMsVUFBRixDQUFhSCxZQUFiLEVBQTJCRSxnQkFBRUUsSUFBRixDQUFPTCxJQUFQLENBQTNCLENBQXBCOztBQUNBLE1BQUksQ0FBQ0csZ0JBQUVHLE9BQUYsQ0FBVUosV0FBVixDQUFMLEVBQTZCO0FBQzNCLFVBQU0sSUFBSUssS0FBSixDQUFXLHVDQUFzQ0wsV0FBWSxFQUE3RCxDQUFOO0FBQ0Q7O0FBQ0QsU0FBT0YsSUFBUDtBQUNEOztBQW9CREYsUUFBUSxDQUFDVSxrQkFBVCxHQUE4QixlQUFlQSxrQkFBZixDQUFtQ1IsSUFBSSxHQUFHLEVBQTFDLEVBQThDO0FBQzFFLFFBQU07QUFDSlMsSUFBQUEsTUFESTtBQUVKQyxJQUFBQSxJQUZJO0FBR0pDLElBQUFBO0FBSEksTUFJRlosY0FBYyxDQUFDQyxJQUFELEVBQU8sQ0FBQyxRQUFELENBQVAsQ0FKbEI7QUFLQSxRQUFNWSxHQUFHLEdBQUcsQ0FDVixJQURVLEVBQ0pELFVBQVUsR0FBRywwQkFBSCxHQUFnQyxlQUR0QyxDQUFaOztBQUdBLE1BQUlELElBQUosRUFBVTtBQUNSRSxJQUFBQSxHQUFHLENBQUNDLElBQUosQ0FBUyxRQUFULEVBQW1CSCxJQUFuQjtBQUNEOztBQUNERSxFQUFBQSxHQUFHLENBQUNDLElBQUosQ0FBU0osTUFBVDtBQUNBLFNBQU8sTUFBTSxLQUFLSyxHQUFMLENBQVNDLEtBQVQsQ0FBZUgsR0FBZixDQUFiO0FBQ0QsQ0FkRDs7QUFnQ0FkLFFBQVEsQ0FBQ2tCLGlCQUFULEdBQTZCLGVBQWVBLGlCQUFmLENBQWtDaEIsSUFBSSxHQUFHLEVBQXpDLEVBQTZDO0FBQ3hFLFFBQU07QUFDSlMsSUFBQUEsTUFESTtBQUVKQyxJQUFBQTtBQUZJLE1BR0ZYLGNBQWMsQ0FBQ0MsSUFBRCxFQUFPLENBQUMsUUFBRCxDQUFQLENBSGxCO0FBSUEsUUFBTVksR0FBRyxHQUFHLENBQ1YsSUFEVSxFQUNKLGNBREksQ0FBWjs7QUFHQSxNQUFJRixJQUFKLEVBQVU7QUFDUkUsSUFBQUEsR0FBRyxDQUFDQyxJQUFKLENBQVMsUUFBVCxFQUFtQkgsSUFBbkI7QUFDRDs7QUFDREUsRUFBQUEsR0FBRyxDQUFDQyxJQUFKLENBQVNKLE1BQVQ7QUFDQSxTQUFPLE1BQU0sS0FBS0ssR0FBTCxDQUFTQyxLQUFULENBQWVILEdBQWYsQ0FBYjtBQUNELENBYkQ7O2VBaUJlZCxRIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IF8gZnJvbSAnbG9kYXNoJztcblxuY29uc3QgY29tbWFuZHMgPSB7fTtcblxuZnVuY3Rpb24gcmVxdWlyZU9wdGlvbnMgKG9wdHMsIHJlcXVpcmVkS2V5cyA9IFtdKSB7XG4gIGNvbnN0IG1pc3NpbmdLZXlzID0gXy5kaWZmZXJlbmNlKHJlcXVpcmVkS2V5cywgXy5rZXlzKG9wdHMpKTtcbiAgaWYgKCFfLmlzRW1wdHkobWlzc2luZ0tleXMpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBUaGUgZm9sbG93aW5nIG9wdGlvbnMgYXJlIHJlcXVpcmVkOiAke21pc3NpbmdLZXlzfWApO1xuICB9XG4gIHJldHVybiBvcHRzO1xufVxuXG4vKipcbiAqIEB0eXBlZGVmIHtPYmplY3R9IFN0YXJ0U2VydmljZU9wdGlvbnNcbiAqIEBwcm9wZXJ0eSB7IXN0cmluZ30gaW50ZW50IC0gVGhlIG5hbWUgb2YgdGhlIHNlcnZpY2UgaW50ZW50IHRvIHN0YXJ0LCBmb3IgZXhhbXBsZVxuICogYGNvbS5zb21lLnBhY2thZ2UubmFtZS8uWW91clNlcnZpY2VTdWJDbGFzc05hbWVgLiBUaGlzIG9wdGlvbiBpcyBtYW5kYXRvcnkuXG4gKiBAcHJvcGVydHkge3N0cmluZ3xudW1iZXJ9IHVzZXIgWydjdXJyZW50J10gLSBUaGUgdXNlciBJRCBmb3Igd2hpY2ggdGhlIHNlcnZpY2UgaXMgc3RhcnRlZC5cbiAqIFRoZSBgY3VycmVudGAgdXNlciBpZCBpcyB1c2VkIGJ5IGRlZmF1bHRcbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gZm9yZWdyb3VuZCBbZmFsc2VdIC0gU2V0IGl0IHRvIGB0cnVlYCBpZiB5b3VyIHNlcnZpY2UgbXVzdCBiZVxuICogc3RhcnRlZCBhcyBmb3JlZ3JvdW5kIHNlcnZpY2UuXG4gKi9cblxuLyoqXG4gKiBTdGFydHMgdGhlIGdpdmVuIHNlcnZpY2UgaW50ZW50LlxuICpcbiAqIEBwYXJhbSB7U3RhcnRTZXJ2aWNlT3B0aW9uc30gb3B0c1xuICogQHJldHVybnMge3N0cmluZ30gVGhlIGNvbW1hbmQgb3V0cHV0XG4gKiBAdGhyb3dzIHtFcnJvcn0gSWYgdGhlcmUgd2FzIGEgZmFpbHVyZSB3aGlsZSBzdGFydGluZyB0aGUgc2VydmljZVxuICogb3IgcmVxdWlyZWQgb3B0aW9ucyBhcmUgbWlzc2luZ1xuICovXG5jb21tYW5kcy5tb2JpbGVTdGFydFNlcnZpY2UgPSBhc3luYyBmdW5jdGlvbiBtb2JpbGVTdGFydFNlcnZpY2UgKG9wdHMgPSB7fSkge1xuICBjb25zdCB7XG4gICAgaW50ZW50LFxuICAgIHVzZXIsXG4gICAgZm9yZWdyb3VuZCxcbiAgfSA9IHJlcXVpcmVPcHRpb25zKG9wdHMsIFsnaW50ZW50J10pO1xuICBjb25zdCBjbWQgPSBbXG4gICAgJ2FtJywgZm9yZWdyb3VuZCA/ICdzdGFydC1mb3JlZ3JvdW5kLXNlcnZpY2UnIDogJ3N0YXJ0LXNlcnZpY2UnLFxuICBdO1xuICBpZiAodXNlcikge1xuICAgIGNtZC5wdXNoKCctLXVzZXInLCB1c2VyKTtcbiAgfVxuICBjbWQucHVzaChpbnRlbnQpO1xuICByZXR1cm4gYXdhaXQgdGhpcy5hZGIuc2hlbGwoY21kKTtcbn07XG5cbi8qKlxuICogQHR5cGVkZWYge09iamVjdH0gU3RvcFNlcnZpY2VPcHRpb25zXG4gKiBAcHJvcGVydHkgeyFzdHJpbmd9IGludGVudCAtIFRoZSBuYW1lIG9mIHRoZSBzZXJ2aWNlIGludGVudCB0byBzdG9wLCBmb3IgZXhhbXBsZVxuICogYGNvbS5zb21lLnBhY2thZ2UubmFtZS8uWW91clNlcnZpY2VTdWJDbGFzc05hbWVgLiBUaGlzIG9wdGlvbiBpcyBtYW5kYXRvcnkuXG4gKiBAcHJvcGVydHkge3N0cmluZ3xudW1iZXJ9IHVzZXIgWydjdXJyZW50J10gLSBUaGUgdXNlciBJRCBmb3Igd2hpY2ggdGhlIHNlcnZpY2UgaXMgcnVubmluZy5cbiAqIFRoZSBgY3VycmVudGAgdXNlciBpZCBpcyB1c2VkIGJ5IGRlZmF1bHRcbiAqL1xuXG4vKipcbiAqIFN0b3BzIHRoZSBnaXZlbiBzZXJ2aWNlIGludGVudC5cbiAqXG4gKiBAcGFyYW0ge1N0b3BTZXJ2aWNlT3B0aW9uc30gb3B0c1xuICogQHJldHVybnMge3N0cmluZ30gVGhlIGNvbW1hbmQgb3V0cHV0XG4gKiBAdGhyb3dzIHtFcnJvcn0gSWYgdGhlcmUgd2FzIGEgZmFpbHVyZSB3aGlsZSBzdG9wcGluZyB0aGUgc2VydmljZVxuICogb3IgcmVxdWlyZWQgb3B0aW9ucyBhcmUgbWlzc2luZ1xuICovXG5jb21tYW5kcy5tb2JpbGVTdG9wU2VydmljZSA9IGFzeW5jIGZ1bmN0aW9uIG1vYmlsZVN0b3BTZXJ2aWNlIChvcHRzID0ge30pIHtcbiAgY29uc3Qge1xuICAgIGludGVudCxcbiAgICB1c2VyLFxuICB9ID0gcmVxdWlyZU9wdGlvbnMob3B0cywgWydpbnRlbnQnXSk7XG4gIGNvbnN0IGNtZCA9IFtcbiAgICAnYW0nLCAnc3RvcC1zZXJ2aWNlJyxcbiAgXTtcbiAgaWYgKHVzZXIpIHtcbiAgICBjbWQucHVzaCgnLS11c2VyJywgdXNlcik7XG4gIH1cbiAgY21kLnB1c2goaW50ZW50KTtcbiAgcmV0dXJuIGF3YWl0IHRoaXMuYWRiLnNoZWxsKGNtZCk7XG59O1xuXG5cbmV4cG9ydCB7IGNvbW1hbmRzIH07XG5leHBvcnQgZGVmYXVsdCBjb21tYW5kcztcbiJdLCJmaWxlIjoibGliL2NvbW1hbmRzL3NlcnZpY2VzLmpzIiwic291cmNlUm9vdCI6Ii4uLy4uLy4uIn0=
|
package/lib/commands/services.js
DELETED
|
@@ -1,80 +0,0 @@
|
|
|
1
|
-
import _ from 'lodash';
|
|
2
|
-
|
|
3
|
-
const commands = {};
|
|
4
|
-
|
|
5
|
-
function requireOptions (opts, requiredKeys = []) {
|
|
6
|
-
const missingKeys = _.difference(requiredKeys, _.keys(opts));
|
|
7
|
-
if (!_.isEmpty(missingKeys)) {
|
|
8
|
-
throw new Error(`The following options are required: ${missingKeys}`);
|
|
9
|
-
}
|
|
10
|
-
return opts;
|
|
11
|
-
}
|
|
12
|
-
|
|
13
|
-
/**
|
|
14
|
-
* @typedef {Object} StartServiceOptions
|
|
15
|
-
* @property {!string} intent - The name of the service intent to start, for example
|
|
16
|
-
* `com.some.package.name/.YourServiceSubClassName`. This option is mandatory.
|
|
17
|
-
* @property {string|number} user ['current'] - The user ID for which the service is started.
|
|
18
|
-
* The `current` user id is used by default
|
|
19
|
-
* @property {boolean} foreground [false] - Set it to `true` if your service must be
|
|
20
|
-
* started as foreground service.
|
|
21
|
-
*/
|
|
22
|
-
|
|
23
|
-
/**
|
|
24
|
-
* Starts the given service intent.
|
|
25
|
-
*
|
|
26
|
-
* @param {StartServiceOptions} opts
|
|
27
|
-
* @returns {string} The command output
|
|
28
|
-
* @throws {Error} If there was a failure while starting the service
|
|
29
|
-
* or required options are missing
|
|
30
|
-
*/
|
|
31
|
-
commands.mobileStartService = async function mobileStartService (opts = {}) {
|
|
32
|
-
const {
|
|
33
|
-
intent,
|
|
34
|
-
user,
|
|
35
|
-
foreground,
|
|
36
|
-
} = requireOptions(opts, ['intent']);
|
|
37
|
-
const cmd = [
|
|
38
|
-
'am', foreground ? 'start-foreground-service' : 'start-service',
|
|
39
|
-
];
|
|
40
|
-
if (user) {
|
|
41
|
-
cmd.push('--user', user);
|
|
42
|
-
}
|
|
43
|
-
cmd.push(intent);
|
|
44
|
-
return await this.adb.shell(cmd);
|
|
45
|
-
};
|
|
46
|
-
|
|
47
|
-
/**
|
|
48
|
-
* @typedef {Object} StopServiceOptions
|
|
49
|
-
* @property {!string} intent - The name of the service intent to stop, for example
|
|
50
|
-
* `com.some.package.name/.YourServiceSubClassName`. This option is mandatory.
|
|
51
|
-
* @property {string|number} user ['current'] - The user ID for which the service is running.
|
|
52
|
-
* The `current` user id is used by default
|
|
53
|
-
*/
|
|
54
|
-
|
|
55
|
-
/**
|
|
56
|
-
* Stops the given service intent.
|
|
57
|
-
*
|
|
58
|
-
* @param {StopServiceOptions} opts
|
|
59
|
-
* @returns {string} The command output
|
|
60
|
-
* @throws {Error} If there was a failure while stopping the service
|
|
61
|
-
* or required options are missing
|
|
62
|
-
*/
|
|
63
|
-
commands.mobileStopService = async function mobileStopService (opts = {}) {
|
|
64
|
-
const {
|
|
65
|
-
intent,
|
|
66
|
-
user,
|
|
67
|
-
} = requireOptions(opts, ['intent']);
|
|
68
|
-
const cmd = [
|
|
69
|
-
'am', 'stop-service',
|
|
70
|
-
];
|
|
71
|
-
if (user) {
|
|
72
|
-
cmd.push('--user', user);
|
|
73
|
-
}
|
|
74
|
-
cmd.push(intent);
|
|
75
|
-
return await this.adb.shell(cmd);
|
|
76
|
-
};
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
export { commands };
|
|
80
|
-
export default commands;
|