var util = require('util') var syrup = require('syrup') var ProtoBuf = require('protobufjs') var semver = require('semver') var pathutil = require('../../../util/pathutil') var streamutil = require('../../../util/streamutil') var promiseutil = require('../../../util/promiseutil') var logger = require('../../../util/logger') module.exports = syrup.serial() .dependency(require('../support/adb')) .define(function(options, adb) { var log = logger.createLogger('device:resources:service') var resource = { requiredVersion: '0.7.8' , pkg: 'jp.co.cyberagent.stf' , main: 'jp.co.cyberagent.stf.Agent' , apk: pathutil.vendor('STFService/STFService.apk') , wire: ProtoBuf.loadProtoFile( pathutil.vendor('STFService/wire.proto') ).build().jp.co.cyberagent.stf.proto , startIntent: { action: 'jp.co.cyberagent.stf.ACTION_START' , component: 'jp.co.cyberagent.stf/.Service' } } function getPath() { return adb.shell(options.serial, ['pm', 'path', resource.pkg]) .timeout(10000) .then(function(out) { return streamutil.findLine(out, (/^package:/)) .timeout(15000) .then(function(line) { return line.substr(8) }) }) } function install() { log.info('Checking whether we need to install STFService') return getPath() .then(function(installedPath) { log.info('Running version check') return adb.shell(options.serial, util.format( "export CLASSPATH='%s';" + " exec app_process /system/bin '%s' --version" , installedPath , resource.main )) .timeout(10000) .then(function(out) { return streamutil.readAll(out) .timeout(10000) .then(function(buffer) { var version = buffer.toString() if (semver.satisfies(version, resource.requiredVersion)) { return installedPath } else { throw new Error(util.format( 'Incompatible version %s' , version )) } }) }) }) .catch(function() { log.info('Installing STFService') // Uninstall first to make sure we don't have any certificate // issues. return adb.uninstall(options.serial, resource.pkg) .timeout(15000) .then(function() { return promiseutil.periodicNotify( adb.install(options.serial, resource.apk) , 10000 ) .timeout(60000) }) .progressed(function() { log.warn( 'STFService installation is taking a long time; ' + 'perhaps you have to accept 3rd party app installation ' + 'on the device?' ) }) .then(function() { return getPath() }) }) } return install() .then(function(path) { log.info('STFService up to date') resource.path = path return resource }) })