diff --git a/lib/roles/device/plugins/install.js b/lib/roles/device/plugins/install.js index 9b0ba19b..de4cded4 100644 --- a/lib/roles/device/plugins/install.js +++ b/lib/roles/device/plugins/install.js @@ -19,6 +19,16 @@ module.exports = syrup.serial() var source = new stream.Readable().wrap(request(message.url)) var seq = 0 adb.install(options.serial, source) + .then(function() { + if (message.launchActivity) { + log.info( + 'Launching activity with action "%s" on component "%s"' + , message.launchActivity.action + , message.launchActivity.component + ) + return adb.startActivity(options.serial, message.launchActivity) + } + }) .then(function() { log.info('Installed "%s"', message.url) push.send([ diff --git a/lib/roles/storage/temp.js b/lib/roles/storage/temp.js index 0e70106c..cfece85b 100644 --- a/lib/roles/storage/temp.js +++ b/lib/roles/storage/temp.js @@ -4,6 +4,7 @@ var util = require('util') var express = require('express') var formidable = require('formidable') var Promise = require('bluebird') +var ApkReader = require('adbkit-apkreader') var logger = require('../../util/logger') var Storage = require('../../util/storage') @@ -30,16 +31,27 @@ module.exports = function(options) { form.parseAsync(req) .spread(function(fields, files) { if (files.file) { - var id = storage.store(files.file) - res.json(201, { - success: true - , url: util.format( - 'http://%s:%s/api/v1/resources/%s' - , options.publicIp - , options.port - , id - ) - }) + try { + var reader = ApkReader.readFile(files.file.path) + var manifest = reader.readManifestSync() + var id = storage.store(files.file) + res.json(201, { + success: true + , url: util.format( + 'http://%s:%s/api/v1/resources/%s' + , options.publicIp + , options.port + , id + ) + , manifest: manifest + }) + } + catch (err) { + log.error('ApkReader had an error', err.stack) + res.json(500, { + success: false + }) + } } else { res.json(400, { diff --git a/lib/wire/wire.proto b/lib/wire/wire.proto index b82ef62f..00d668df 100644 --- a/lib/wire/wire.proto +++ b/lib/wire/wire.proto @@ -18,6 +18,7 @@ enum MessageType { KeyDownMessage = 12; KeyPressMessage = 13; KeyUpMessage = 14; + LaunchActivityMessage = 31; LeaveGroupMessage = 15; LogcatApplyFiltersMessage = 16; ProbeMessage = 17; @@ -293,4 +294,12 @@ message ShellKeepAliveMessage { message InstallMessage { required string url = 1; + optional LaunchActivityMessage launchActivity = 2; +} + +message LaunchActivityMessage { + required string action = 1; + required string component = 2; + repeated string category = 3; + optional uint32 flags = 4; } diff --git a/res/app/components/stf/control/control-service.js b/res/app/components/stf/control/control-service.js index a10a159e..e264eeca 100644 --- a/res/app/components/stf/control/control-service.js +++ b/res/app/components/stf/control/control-service.js @@ -96,10 +96,21 @@ module.exports = function ControlServiceFactory($rootScope, $upload, socket, Tra }) .success(function(data) { console.log('success', arguments) + var app = data.manifest.application var tx = TransactionService.create(devices) - socket.emit('device.install', channel, tx.channel, { + var params = { url: data.url - }) + } + if (app.launcherActivities.length) { + var activity = app.launcherActivities[0] + params.launchActivity = { + action: 'android.intent.action.MAIN' + , component: data.manifest.package + '/' + activity.name + , category: ['android.intent.category.LAUNCHER'] + , flags: 0x10200000 + } + } + socket.emit('device.install', channel, tx.channel, params) return tx }) .error(function() {