| var util = require('util') |
| |
| var syrup = require('stf-syrup') |
| var adbkit = require('adbkit') |
| |
| var logger = require('../../../../util/logger') |
| 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')) |
| .dependency(require('../util/display')) |
| .define(function(options, adb, router, push, storage, minicap, display) { |
| var log = logger.createLogger('device:plugins:screen:capture') |
| var plugin = Object.create(null) |
| |
| function projectionFormat() { |
| return util.format( |
| '%dx%d@%dx%d/%d' |
| , display.properties.width |
| , display.properties.height |
| , display.properties.width |
| , display.properties.height |
| , display.properties.rotation |
| ) |
| } |
| |
| plugin.capture = function() { |
| log.info('Capturing screenshot') |
| |
| var file = util.format('/data/local/tmp/minicap_%d.jpg', Date.now()) |
| return minicap.run(util.format( |
| '-P %s -s >%s', projectionFormat(), 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 plugin |
| }) |