diff --git a/lib/db/api.js b/lib/db/api.js index 2750dd0a..4b193553 100644 --- a/lib/db/api.js +++ b/lib/db/api.js @@ -193,7 +193,6 @@ dbapi.saveDeviceIdentity = function(serial, identity) { , abi: identity.abi , sdk: identity.sdk , display: identity.display - , browser: identity.browser , phone: identity.phone })) } diff --git a/lib/roles/app.js b/lib/roles/app.js index 03675a6a..a55e8aef 100644 --- a/lib/roles/app.js +++ b/lib/roles/app.js @@ -344,7 +344,7 @@ module.exports = function(options) { , battery: message }) }) - .on(wire.BrowserPackageEvent, function(channel, message) { + .on(wire.DeviceBrowserMessage, function(channel, message) { var serial = message.serial delete message.serial socket.emit('device.change', { diff --git a/lib/roles/device.js b/lib/roles/device.js index c5202935..c28a59a7 100644 --- a/lib/roles/device.js +++ b/lib/roles/device.js @@ -21,6 +21,7 @@ module.exports = function(options) { .dependency(require('./device/plugins/display')) .dependency(require('./device/plugins/http')) .dependency(require('./device/plugins/service')) + .dependency(require('./device/plugins/browser')) .dependency(require('./device/plugins/clipboard')) .dependency(require('./device/plugins/logcat')) .dependency(require('./device/plugins/shell')) diff --git a/lib/roles/device/plugins/browser.js b/lib/roles/device/plugins/browser.js index 2c1813c2..3b30d66d 100644 --- a/lib/roles/device/plugins/browser.js +++ b/lib/roles/device/plugins/browser.js @@ -4,122 +4,113 @@ var logger = require('../../../util/logger') var wire = require('../../../wire') var wireutil = require('../../../wire/util') +var mapping = { + 'com.android.chrome': 'chrome' +, 'com.chrome.beta': 'chrome-beta' +, 'com.sec.android.app.sbrowser': 'samsung-chrome' +, 'com.android.browser': 'android' +, 'org.mozilla.firefox': 'firefox' +, 'org.mozilla.firefox_beta': 'firefox-beta' +, 'com.opera.browser': 'opera' +, 'com.opera.mini.android': 'opera-mini' +, 'com.opera.browser.beta': 'opera-beta' +, 'com.UCMobile.intl': 'uc' +, 'com.explore.web.browser': 'lightning' +, 'com.baidu.browser.inter': 'baidu' +, 'com.tencent.ibibo.mtt': 'one' +} + module.exports = syrup.serial() .dependency(require('../support/router')) .dependency(require('../support/push')) .dependency(require('../support/adb')) .dependency(require('./service')) .define(function(options, router, push, adb, service) { - var log = logger.createLogger('device:plugins:browsers') + var log = logger.createLogger('device:plugins:browser') function pkg(component) { return component.split('/', 1)[0] } - log.info('Fetching browser list') - return service.getBrowsers() - .timeout(15000) - .then(function(browsers) { - browsers.apps.forEach(function(app) { - switch (pkg(app.component)) { - case 'com.android.chrome': - app.type = 'chrome' - break - case 'com.chrome.beta': - app.type = 'chrome-beta' - break - case 'com.sec.android.app.sbrowser': - app.type = 'samsung-chrome' - break - case 'com.android.browser': - app.type = 'android' - break - case 'org.mozilla.firefox': - app.type = 'firefox' - break - case 'org.mozilla.firefox_beta': - app.type = 'firefox-beta' - break - case 'com.opera.browser': - app.type = 'opera' - break - case 'com.opera.mini.android': - app.type = 'opera-mini' - break - case 'com.opera.browser.beta': - app.type = 'opera-beta' - break - case 'com.UCMobile.intl': - app.type = 'uc' - break - case 'com.explore.web.browser': - app.type = 'lightning' - break - case 'com.baidu.browser.inter': - app.type = 'baidu' - break - case 'com.tencent.ibibo.mtt': - app.type = 'one' - break - default: - app.type = app.name.toLowerCase() - .replace(/\s+/g, '-') - } + function processApp(app) { + return { + id: app.component + , type: mapping[pkg(app.component)] || + app.name.toLowerCase().replace(/\s+/g, '-') + , name: app.name + , selected: app.selected + } + } - app.id = app.component + function updateBrowsers(data) { + log.info('Updating browser list') + push.send([ + wireutil.global + , wireutil.envelope(new wire.DeviceBrowserMessage( + options.serial + , data.selected + , data.apps.map(function(app) { + return new wire.DeviceBrowserAppMessage(processApp(app)) + }) + )) + ]) + } - delete app.icon - delete app.component + function loadBrowsers() { + log.info('Loading browser list') + return service.getBrowsers() + .then(updateBrowsers) + } + + service.on('browserPackageChange', updateBrowsers) + + router.on(wire.BrowserOpenMessage, function(channel, message) { + if (message.browser) { + log.info('Opening "%s" in "%s"', message.url, message.browser) + } + else { + log.info('Opening "%s"', message.url) + } + + var reply = wireutil.reply(options.serial) + adb.startActivity(options.serial, { + action: 'android.intent.action.VIEW' + , component: message.browser + , data: message.url }) - - router.on(wire.BrowserOpenMessage, function(channel, message) { - if (message.browser) { - log.info('Opening "%s" in "%s"', message.url, message.browser) - } - else { - log.info('Opening "%s"', message.url) - } - - 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() - ]) - }) + .then(function() { + push.send([ + channel + , reply.okay() + ]) }) - - router.on(wire.BrowserClearMessage, function(channel, message) { - log.info('Clearing "%s"', message.browser) - var reply = wireutil.reply(options.serial) - adb.clear(options.serial, pkg(message.browser)) - .then(function() { - push.send([ - channel - , reply.okay() - ]) - }) - .catch(function(err) { - log.error('Browser could not be cleared', err.stack) - push.send([ - channel - , reply.fail() - ]) - }) + .catch(function(err) { + log.error('Browser could not be opened', err.stack) + push.send([ + channel + , reply.fail() + ]) }) + }) - return browsers - }) + router.on(wire.BrowserClearMessage, function(channel, message) { + log.info('Clearing "%s"', message.browser) + var reply = wireutil.reply(options.serial) + adb.clear(options.serial, pkg(message.browser)) + .then(function() { + push.send([ + channel + , reply.okay() + ]) + }) + .catch(function(err) { + log.error('Browser could not be cleared', err.stack) + push.send([ + channel + , reply.fail() + ]) + }) + }) + + return loadBrowsers() }) diff --git a/lib/roles/device/plugins/identity.js b/lib/roles/device/plugins/identity.js index 2244774d..1f46f674 100644 --- a/lib/roles/device/plugins/identity.js +++ b/lib/roles/device/plugins/identity.js @@ -6,16 +6,14 @@ var logger = require('../../../util/logger') module.exports = syrup.serial() .dependency(require('../support/properties')) .dependency(require('./display')) - .dependency(require('./browser')) .dependency(require('./phone')) - .define(function(options, properties, display, browser, phone) { + .define(function(options, properties, display, phone) { var log = logger.createLogger('device:plugins:identity') function solve() { log.info('Solving identity') var identity = devutil.makeIdentity(options.serial, properties) identity.display = display - identity.browser = browser identity.phone = phone return identity } diff --git a/lib/roles/device/plugins/service.js b/lib/roles/device/plugins/service.js index d1a22369..ffacad45 100644 --- a/lib/roles/device/plugins/service.js +++ b/lib/roles/device/plugins/service.js @@ -1,4 +1,5 @@ var util = require('util') +var events = require('events') var syrup = require('syrup') var Promise = require('bluebird') @@ -37,6 +38,7 @@ module.exports = syrup.serial() .define(function(options, adb, router, push, apk) { var log = logger.createLogger('device:plugins:service') var messageResolver = new MessageResolver() + var plugin = new events.EventEmitter() var agent = { socket: null @@ -182,6 +184,7 @@ module.exports = syrup.serial() , message.enabled )) ]) + plugin.emit('airplaneModeChange', message) break case apk.wire.MessageType.EVENT_BATTERY: var message = apk.wire.BatteryEvent.decode(envelope.message) @@ -198,23 +201,11 @@ module.exports = syrup.serial() , message.voltage )) ]) + plugin.emit('batteryChange', message) break case apk.wire.MessageType.EVENT_BROWSER_PACKAGE: var message = apk.wire.BrowserPackageEvent.decode(envelope.message) - push.send([ - wireutil.global - , wireutil.envelope(new wire.BrowserPackageEvent( - options.serial - , message.selected - , message.apps.map(function(app) { - return new wire.BrowserApp( - app.name - , app.component - , app.selected - ) - }) - )) - ]) + plugin.emit('browserPackageChange', message) break case apk.wire.MessageType.EVENT_CONNECTIVITY: var message = apk.wire.ConnectivityEvent.decode(envelope.message) @@ -229,6 +220,7 @@ module.exports = syrup.serial() , message.roaming )) ]) + plugin.emit('connectivityChange', message) break case apk.wire.MessageType.EVENT_PHONE_STATE: var message = apk.wire.PhoneStateEvent.decode(envelope.message) @@ -241,6 +233,7 @@ module.exports = syrup.serial() , message.operator )) ]) + plugin.emit('phoneStateChange', message) break case apk.wire.MessageType.EVENT_ROTATION: var message = apk.wire.RotationEvent.decode(envelope.message) @@ -251,6 +244,7 @@ module.exports = syrup.serial() , message.rotation )) ]) + plugin.emit('rotationChange', message) break } } @@ -267,14 +261,14 @@ module.exports = syrup.serial() ) } - function type(text) { + plugin.type = function(text) { return runAgentCommand( apk.wire.MessageType.DO_TYPE , new apk.wire.DoTypeRequest(text) ) } - function paste(text) { + plugin.paste = function(text) { return setClipboard(text) .then(function() { keyEvent({ @@ -285,28 +279,28 @@ module.exports = syrup.serial() }) } - function wake() { + plugin.wake = function() { return runAgentCommand( apk.wire.MessageType.DO_WAKE , new apk.wire.DoWakeRequest() ) } - function freezeRotation(rotation) { + plugin.freezeRotation = function(rotation) { return runAgentCommand( apk.wire.MessageType.SET_ROTATION , new apk.wire.SetRotationRequest(rotation, true) ) } - function thawRotation() { + plugin.thawRotation = function() { return runAgentCommand( apk.wire.MessageType.SET_ROTATION , new apk.wire.SetRotationRequest(0, false) ) } - function version() { + plugin.version = function() { return runServiceCommand( apk.wire.MessageType.GET_VERSION , new apk.wire.GetVersionRequest() @@ -321,7 +315,7 @@ module.exports = syrup.serial() }) } - function unlock() { + plugin.unlock = function() { return runServiceCommand( apk.wire.MessageType.SET_KEYGUARD_STATE , new apk.wire.SetKeyguardStateRequest(false) @@ -335,7 +329,7 @@ module.exports = syrup.serial() }) } - function lock() { + plugin.lock = function() { return runServiceCommand( apk.wire.MessageType.SET_KEYGUARD_STATE , new apk.wire.SetKeyguardStateRequest(true) @@ -349,7 +343,7 @@ module.exports = syrup.serial() }) } - function acquireWakeLock() { + plugin.acquireWakeLock = function() { return runServiceCommand( apk.wire.MessageType.SET_WAKE_LOCK , new apk.wire.SetWakeLockRequest(true) @@ -363,7 +357,7 @@ module.exports = syrup.serial() }) } - function releaseWakeLock() { + plugin.releaseWakeLock = function() { return runServiceCommand( apk.wire.MessageType.SET_WAKE_LOCK , new apk.wire.SetWakeLockRequest(false) @@ -377,7 +371,7 @@ module.exports = syrup.serial() }) } - function identity() { + plugin.identity = function() { return runServiceCommand( apk.wire.MessageType.DO_IDENTIFY , new apk.wire.DoIdentifyRequest(options.serial) @@ -391,7 +385,7 @@ module.exports = syrup.serial() }) } - function setClipboard(text) { + plugin.setClipboard = function(text) { return runServiceCommand( apk.wire.MessageType.SET_CLIPBOARD , new apk.wire.SetClipboardRequest( @@ -408,7 +402,7 @@ module.exports = syrup.serial() }) } - function getClipboard() { + plugin.getClipboard = function() { return runServiceCommand( apk.wire.MessageType.GET_CLIPBOARD , new apk.wire.GetClipboardRequest( @@ -428,7 +422,7 @@ module.exports = syrup.serial() }) } - function getBrowsers() { + plugin.getBrowsers = function() { return runServiceCommand( apk.wire.MessageType.GET_BROWSERS , new apk.wire.GetBrowsersRequest() @@ -444,7 +438,7 @@ module.exports = syrup.serial() }) } - function getProperties(properties) { + plugin.getProperties = function(properties) { return runServiceCommand( apk.wire.MessageType.GET_PROPERTIES , new apk.wire.GetPropertiesRequest(properties) @@ -488,7 +482,7 @@ module.exports = syrup.serial() router .on(wire.PhysicalIdentifyMessage, function(channel) { var reply = wireutil.reply(options.serial) - identity() + plugin.identity() push.send([ channel , reply.okay() @@ -513,29 +507,16 @@ module.exports = syrup.serial() }) }) .on(wire.TypeMessage, function(channel, message) { - type(message.text) + plugin.type(message.text) }) .on(wire.RotateMessage, function(channel, message) { if (message.rotation >= 0) { - freezeRotation(message.rotation) + plugin.freezeRotation(message.rotation) } else { - thawRotation() + plugin.thawRotation() } }) - - return { - acquireWakeLock: acquireWakeLock - , copy: getClipboard - , getBrowsers: getBrowsers - , getProperties: getProperties - , identity: identity - , lock: lock - , paste: paste - , releaseWakeLock: releaseWakeLock - , unlock: unlock - , version: version - , wake: wake - } }) + .return(plugin) }) diff --git a/lib/roles/device/plugins/solo.js b/lib/roles/device/plugins/solo.js index 25cc6b77..6728d291 100644 --- a/lib/roles/device/plugins/solo.js +++ b/lib/roles/device/plugins/solo.js @@ -42,17 +42,6 @@ module.exports = syrup.serial() , identity.display.secure , identity.display.url ) - , new wire.DeviceBrowserMessage( - identity.browser.selected - , identity.browser.apps.map(function(app) { - return new wire.DeviceBrowserAppMessage( - app.id - , app.type - , app.name - , app.selected - ) - }) - ) , new wire.DevicePhoneMessage(identity.phone) )) ]) diff --git a/lib/roles/processor.js b/lib/roles/processor.js index 724643c2..f786e016 100644 --- a/lib/roles/processor.js +++ b/lib/roles/processor.js @@ -102,7 +102,7 @@ module.exports = function(options) { dbapi.setDeviceBattery(message.serial, message) appDealer.send([channel, data]) }) - .on(wire.BrowserPackageEvent, function(channel, message, data) { + .on(wire.DeviceBrowserMessage, function(channel, message, data) { dbapi.setDeviceBrowser(message.serial, message) appDealer.send([channel, data]) }) diff --git a/lib/wire/wire.proto b/lib/wire/wire.proto index 8842677e..6abad464 100644 --- a/lib/wire/wire.proto +++ b/lib/wire/wire.proto @@ -45,7 +45,7 @@ enum MessageType { BrowserClearMessage = 42; AirplaneModeEvent = 43; BatteryEvent = 44; - BrowserPackageEvent = 45; + DeviceBrowserMessage = 45; ConnectivityEvent = 46; PhoneStateEvent = 47; RotationEvent = 48; @@ -151,8 +151,9 @@ message DeviceBrowserAppMessage { } message DeviceBrowserMessage { - required bool selected = 1; - repeated DeviceBrowserAppMessage apps = 2; + required string serial = 1; + required bool selected = 2; + repeated DeviceBrowserAppMessage apps = 3; } message DevicePhoneMessage { @@ -172,7 +173,6 @@ message DeviceIdentityMessage { required string abi = 7; required string sdk = 8; required DeviceDisplayMessage display = 9; - required DeviceBrowserMessage browser = 10; required DevicePhoneMessage phone = 11; } @@ -413,18 +413,6 @@ message BatteryEvent { required double voltage = 8; } -message BrowserApp { - required string name = 1; - required string component = 2; - required bool selected = 3; -} - -message BrowserPackageEvent { - required string serial = 1; - required bool selected = 2; - repeated BrowserApp apps = 3; -} - message ConnectivityEvent { required string serial = 1; required bool connected = 2;