diff --git a/lib/roles/app.js b/lib/roles/app.js index 72f623c2..6abc2fae 100644 --- a/lib/roles/app.js +++ b/lib/roles/app.js @@ -556,6 +556,16 @@ module.exports = function(options) { ) ]) }) + .on('browser.open', function(channel, responseChannel, data) { + joinChannel(responseChannel) + push.send([ + channel + , wireutil.transaction( + responseChannel + , new wire.BrowserOpenMessage(data) + ) + ]) + }) }) .finally(function() { // Clean up all listeners and subscriptions @@ -582,8 +592,6 @@ module.exports = function(options) { socket.on('forward', function(data) {}) socket.on('refresh', function(data) {}) socket.on('internal.relaunch', function(data) {}) - socket.on('browser.open', function(data) {}) - socket.on('chrome.open', function(data) {}) socket.on('browser.clear', function(data) {}) socket.on('chrome.clear', function(data) {}) socket.on('internal.clear', function(data) {}) diff --git a/lib/roles/device/plugins/browsers.js b/lib/roles/device/plugins/browsers.js index afd2c6e7..e8338bf2 100644 --- a/lib/roles/device/plugins/browsers.js +++ b/lib/roles/device/plugins/browsers.js @@ -1,51 +1,63 @@ -var util = require('util') - var syrup = require('syrup') var logger = require('../../../util/logger') +var wire = require('../../../wire') +var wireutil = require('../../../wire/util') module.exports = syrup.serial() - .dependency(require('../support/http')) + .dependency(require('../support/router')) + .dependency(require('../support/push')) + .dependency(require('../support/adb')) .dependency(require('./input')) - .define(function(options, http, input) { + .define(function(options, router, push, adb, input) { var log = logger.createLogger('device:plugins:browsers') log.info('Fetching browser list') return input.getBrowsers() .timeout(15000) .then(function(browsers) { - var icons = Object.create(null) - browsers.apps.forEach(function(app) { - icons[app.component] = app.icon.toBuffer() - app.icon = util.format( - '%s/api/v1/browsers/%s/icon' - , http.get('public url') - , app.component - ) + var pkg = app.component.split('/', 1)[0] + + switch (pkg) { + case 'com.android.chrome': + app.type = 'chrome' + break + case 'com.sec.android.app.sbrowser': + app.type = 'samsung-chrome' + break + case 'com.android.browser': + app.type = 'default' + break + } + + app.id = app.component + + delete app.icon + delete app.component }) - http.get( - '/api/v1/browsers/:package/:activity/icon' - , function(req, res) { - var component = util.format( - '%s/%s' - , req.params.package - , req.params.activity - ) - - var icon = icons[component] - - if (icon) { - res.set('Content-Type', 'image/png') - res.set('Content-Length', icon.length) - res.send(200, icon) - } - else { - res.send(404) - } - } - ) + router.on(wire.BrowserOpenMessage, function(channel, message) { + var reply = wireutil.reply(options.serial) + adb.startActivity(options.serial, { + action: 'android.intent.action.VIEW' + , component: message.browser + , data: message.url + }) + .then(function() { + push.send([ + channel + , reply.okay() + ]) + }) + .catch(function(err) { + log.error('Browser could not be opened', err.stack) + push.send([ + channel + , reply.fail() + ]) + }) + }) return browsers }) diff --git a/lib/roles/device/plugins/solo.js b/lib/roles/device/plugins/solo.js index 6a76dfa4..bd5c1f91 100644 --- a/lib/roles/device/plugins/solo.js +++ b/lib/roles/device/plugins/solo.js @@ -46,10 +46,10 @@ module.exports = syrup.serial() identity.browsers.selected , identity.browsers.apps.map(function(app) { return new wire.DeviceBrowserAppMessage( - app.name - , app.component + app.id + , app.type + , app.name , app.selected - , app.icon ) }) ) diff --git a/lib/wire/util.js b/lib/wire/util.js index 23e7a47b..1d543a06 100644 --- a/lib/wire/util.js +++ b/lib/wire/util.js @@ -45,7 +45,7 @@ var wireutil = { source , seq++ , true - , data + , data || 'success' , body ? JSON.stringify(body) : null )) } @@ -54,7 +54,7 @@ var wireutil = { source , seq++ , false - , data + , data || 'fail' )) } , progress: function(data, progress) { diff --git a/lib/wire/wire.proto b/lib/wire/wire.proto index 4cc81031..1597b3ce 100644 --- a/lib/wire/wire.proto +++ b/lib/wire/wire.proto @@ -41,6 +41,7 @@ enum MessageType { ForwardRemoveMessage = 38; LogcatStartMessage = 39; LogcatStopMessage = 40; + BrowserOpenMessage = 41; } message Envelope { @@ -136,10 +137,10 @@ message DeviceDisplayMessage { } message DeviceBrowserAppMessage { - required string name = 1; - required string component = 2; - required bool selected = 3; - required string icon = 4; + required string id = 1; + required string type = 2; + required string name = 3; + required bool selected = 4; } message DeviceBrowsersMessage { @@ -376,3 +377,8 @@ message ForwardCreateMessage { message ForwardRemoveMessage { required uint32 devicePort = 1; } + +message BrowserOpenMessage { + required string url = 1; + optional string browser = 2; +} diff --git a/res/app/components/stf/control/control-service.js b/res/app/components/stf/control/control-service.js index c0374d6d..5844144c 100644 --- a/res/app/components/stf/control/control-service.js +++ b/res/app/components/stf/control/control-service.js @@ -197,6 +197,13 @@ module.exports = function ControlServiceFactory( this.stopLogcat = function() { return sendTwoWay('logcat.stop') } + + this.openBrowser = function(browser, url) { + return sendTwoWay('browser.open', { + url: url + , browser: browser.id + }) + } } controlService.create = function(target, channel) {