diff --git a/lib/roles/app.js b/lib/roles/app.js index afb79943..6386c9d8 100644 --- a/lib/roles/app.js +++ b/lib/roles/app.js @@ -228,20 +228,56 @@ module.exports = function(options) { )]) }) + function touchSender(klass) { + return function(data) { + push.send([ + group + , wireutil.envelope(new klass( + data.x + , data.y + )) + ]) + } + } + + function keySender(klass) { + return function(data) { + push.send([ + group + , wireutil.envelope(new klass( + data.key + )) + ]) + } + } + + socket.on('input.touchDown', touchSender(wire.TouchDownMessage)) + socket.on('input.touchMove', touchSender(wire.TouchMoveMessage)) + socket.on('input.touchUp', touchSender(wire.TouchUpMessage)) + socket.on('input.tap', touchSender(wire.TapMessage)) + + socket.on('input.keyDown', keySender(wire.KeyDownMessage)) + socket.on('input.keyUp', keySender(wire.KeyUpMessage)) + socket.on('input.keyPress', keySender(wire.KeyPressMessage)) + + socket.on('input.type', function(data) { + push.send([ + group + , wireutil.envelope(new wire.TypeMessage( + data.text + )) + ]) + }) + + // @todo + socket.on('input.back', function(data) {}) + socket.on('input.home', function(data) {}) + socket.on('input.menu', function(data) {}) + socket.on('flick', function(data) {}) socket.on('back', function(data) {}) socket.on('forward', function(data) {}) socket.on('refresh', function(data) {}) - socket.on('monkey.touchDown', function(data) {}) - socket.on('monkey.touchMove', function(data) {}) - socket.on('monkey.touchUp', function(data) {}) - socket.on('monkey.keyDown', function(data) {}) - socket.on('monkey.keyUp', function(data) {}) - socket.on('monkey.press', function(data) {}) - socket.on('monkey.type', function(data) {}) - socket.on('monkey.back', function(data) {}) - socket.on('monkey.home', function(data) {}) - socket.on('monkey.menu', function(data) {}) socket.on('internal.relaunch', function(data) {}) socket.on('browser.open', function(data) {}) socket.on('chrome.open', function(data) {}) diff --git a/lib/roles/device.js b/lib/roles/device.js index fe82a73c..42b686a1 100644 --- a/lib/roles/device.js +++ b/lib/roles/device.js @@ -259,8 +259,10 @@ module.exports = function(options) { return monkey.connectStream(conn) }) .then(function(monkey) { - services.monkey = - vitals.register('device:remote:monkey:monkey', monkey) + services.monkey = vitals.register( + 'device:remote:monkey:monkey' + , Promise.promisifyAll(monkey) + ) }) }) .then(function() { @@ -289,8 +291,10 @@ module.exports = function(options) { return monkey.connectStream(conn) }) .then(function(monkey) { - services.input = - vitals.register('device:remote:input:monkey', monkey) + services.input = vitals.register( + 'device:remote:input:monkey' + , Promise.promisifyAll(monkey) + ) }) }) .then(function() { @@ -349,6 +353,30 @@ module.exports = function(options) { } channels.keepalive(channel) }) + .on(wire.TouchDownMessage, function(channel, message) { + services.input.touchDownAsync(message.x, message.y) + }) + .on(wire.TouchMoveMessage, function(channel, message) { + services.input.touchMoveAsync(message.x, message.y) + }) + .on(wire.TouchUpMessage, function(channel, message) { + services.input.touchUpAsync(message.x, message.y) + }) + .on(wire.TapMessage, function(channel, message) { + services.input.tapAsync(message.x, message.y) + }) + .on(wire.TypeMessage, function(channel, message) { + services.input.typeAsync(message.text) + }) + .on(wire.KeyDownMessage, function(channel, message) { + services.input.keyDownAsync(message.key) + }) + .on(wire.KeyUpMessage, function(channel, message) { + services.input.keyUpAsync(message.key) + }) + .on(wire.KeyPressMessage, function(channel, message) { + services.input.pressAsync(message.key) + }) .on(wire.ShellCommandMessage, function(channel, message) { log.info('Running shell command "%s"', message.command.join(' ')) adb.shellAsync(options.serial, message.command) diff --git a/lib/wire/wire.proto b/lib/wire/wire.proto index f58036dd..bf656bb0 100644 --- a/lib/wire/wire.proto +++ b/lib/wire/wire.proto @@ -17,6 +17,14 @@ enum MessageType { DeviceLogMessage = 14; DevicePresentMessage = 16; DeviceAbsentMessage = 17; + TouchDownMessage = 18; + TouchMoveMessage = 19; + TouchUpMessage = 20; + TapMessage = 21; + TypeMessage = 22; + KeyDownMessage = 23; + KeyUpMessage = 24; + KeyPressMessage = 25; } message Envelope { @@ -135,6 +143,44 @@ message LeaveGroupMessage { required string serial = 1; } +// Input + +message TouchDownMessage { + required uint32 x = 1; + required uint32 y = 2; +} + +message TouchMoveMessage { + required uint32 x = 1; + required uint32 y = 2; +} + +message TouchUpMessage { + required uint32 x = 1; + required uint32 y = 2; +} + +message TapMessage { + required uint32 x = 1; + required uint32 y = 2; +} + +message TypeMessage { + required string text = 1; +} + +message KeyDownMessage { + required uint32 key = 1; +} + +message KeyUpMessage { + required uint32 key = 1; +} + +message KeyPressMessage { + required uint32 key = 1; +} + // Commands message ShellCommandMessage { diff --git a/res/app/scripts/services/groupService.js b/res/app/scripts/services/groupService.js index 46491d2e..8173379c 100644 --- a/res/app/scripts/services/groupService.js +++ b/res/app/scripts/services/groupService.js @@ -21,6 +21,23 @@ define(['./module', 'lodash'], function(mod, _) { $rootScope.$digest() }) + function touchSender(type) { + return function(x, y) { + socket.emit(type, { + x: x + , y: y + }) + } + } + + function keySender(type) { + return function(key) { + socket.emit(type, { + key: key + }) + } + } + groupService.invite = function(requirements) { socket.emit('group.invite', requirements) } @@ -29,6 +46,33 @@ define(['./module', 'lodash'], function(mod, _) { socket.emit('group.kick', requirements) } + groupService.touchDown = touchSender('input.touchDown') + groupService.touchMove = touchSender('input.touchMove') + groupService.touchUp = touchSender('input.touchUp') + groupService.tap = touchSender('input.tap') + + groupService.keyDown = keySender('input.keyDown') + groupService.keyUp = keySender('input.keyUp') + groupService.keyPress = keySender('input.keyPress') + + groupService.home = function() { + socket.emit('input.home') + } + + groupService.menu = function() { + socket.emit('input.menu') + } + + groupService.back = function() { + socket.emit('input.back') + } + + groupService.type = function(text) { + socket.emit('input.type', { + text: text + }) + } + return groupService }