From 8da6297350b7cbb3574b2488dba5700bc6964dc3 Mon Sep 17 00:00:00 2001 From: Simo Kinnunen Date: Thu, 11 Dec 2014 18:46:15 +0900 Subject: [PATCH] Make screenshots work again. --- lib/units/device/plugins/screen.js | 55 +++++++++++++++++++++++++++++- 1 file changed, 54 insertions(+), 1 deletion(-) diff --git a/lib/units/device/plugins/screen.js b/lib/units/device/plugins/screen.js index 0e215dd4..8564da82 100644 --- a/lib/units/device/plugins/screen.js +++ b/lib/units/device/plugins/screen.js @@ -5,15 +5,21 @@ var http = require('http') var Promise = require('bluebird') var syrup = require('stf-syrup') var httpProxy = require('http-proxy') +var adbkit = require('adbkit') var logger = require('../../../util/logger') var lifecycle = require('../../../util/lifecycle') var streamutil = require('../../../util/streamutil') +var wire = require('../../../wire') +var wireutil = require('../../../wire/util') module.exports = syrup.serial() .dependency(require('../support/adb')) + .dependency(require('../support/router')) + .dependency(require('../support/push')) + .dependency(require('../support/storage')) .dependency(require('../resources/minicap')) - .define(function(options, adb, minicap) { + .define(function(options, adb, router, push, storage, minicap) { var log = logger.createLogger('device:plugins:screen') var plugin = Object.create(null) @@ -110,6 +116,53 @@ module.exports = syrup.serial() }) } + plugin.capture = function() { + log.info('Capturing screenshot') + + var file = util.format('/data/local/tmp/minicap_%d.jpg', Date.now()) + return run(util.format('-s >%s', file)) + .then(adbkit.util.readAll) + .then(function() { + return adb.stat(options.serial, file) + }) + .then(function(stats) { + if (stats.size === 0) { + throw new Error('Empty screenshot; possibly secure screen?') + } + + return adb.pull(options.serial, file) + .then(function(transfer) { + return storage.store('image', transfer, { + filename: util.format('%s.jpg', options.serial) + , contentType: 'image/jpeg' + , knownLength: stats.size + }) + }) + }) + .finally(function() { + return adb.shell(options.serial, ['rm', '-f', file]) + .then(adbkit.util.readAll) + }) + } + + router.on(wire.ScreenCaptureMessage, function(channel) { + var reply = wireutil.reply(options.serial) + plugin.capture() + .then(function(file) { + push.send([ + channel + , reply.okay('success', file) + ]) + }) + .catch(function(err) { + log.error('Screen capture failed', err.stack) + push.send([ + channel + , reply.fail(err.message) + ]) + }) + }) + return startService() .then(forwardService) .then(startProxy)