Fix browser plugin not updating in real time.

This commit is contained in:
Simo Kinnunen
2014-05-01 20:13:29 +09:00
parent 26b2b1acc6
commit 98ecf57d49
9 changed files with 128 additions and 181 deletions

View File

@@ -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()
})