Fix Galaxy S5's display information segfaulting by trying to use the public SDK methods first. SurfaceComposerClient's getDisplayInfo is practically unusable on Galaxy S5 due to weird memory corruption issues.

This commit is contained in:
Simo Kinnunen
2014-06-18 15:50:05 +09:00
parent 2f5a882099
commit 6bb07d7c34
16 changed files with 87 additions and 40 deletions

View File

@@ -3,13 +3,22 @@ var syrup = require('syrup')
var logger = require('../../../util/logger')
module.exports = syrup.serial()
.dependency(require('./service'))
.dependency(require('./http'))
.define(function(options, http) {
.define(function(options, service, http) {
var log = logger.createLogger('device:plugins:display')
function fetch() {
log.info('Fetching display info')
return http.getDisplay(0)
return service.getDisplay(0)
.catch(function() {
log.info('Falling back to HTTP API')
return http.getDisplay(0)
})
.then(function(display) {
display.url = http.getDisplayUrl(display.id)
return display
})
}
return fetch()

View File

@@ -123,14 +123,21 @@ module.exports = syrup.serial()
.then(function(args) {
var display = args[1]
assert.ok('id' in display, 'Invalid response from HTTP API')
display.url = util.format(
'%s/api/v1/displays/%d/screenshot.jpg'
, service.publicUrl
, id
)
// Fix rotation's old name
if ('orientation' in display) {
display.rotation = display.orientation
delete display.orientation
}
return display
})
}
, getDisplayUrl: function(id) {
return util.format(
'%s/api/v1/displays/%d/screenshot.jpg'
, service.publicUrl
, id
)
}
}
})
})

View File

@@ -280,6 +280,31 @@ module.exports = syrup.serial()
return plugin.getClipboard()
}
plugin.getDisplay = function(id) {
return runServiceCommand(
apk.wire.MessageType.GET_DISPLAY
, new apk.wire.GetDisplayRequest(id)
)
.timeout(10000)
.then(function(data) {
var response = apk.wire.GetDisplayResponse.decode(data)
if (response.success) {
return {
id: id
, width: response.width
, height: response.height
, xdpi: response.xdpi
, ydpi: response.ydpi
, fps: response.fps
, density: response.density
, rotation: response.rotation
, secure: response.secure
}
}
throw new Error('Unable to retrieve display information')
})
}
plugin.wake = function() {
return runAgentCommand(
apk.wire.MessageType.DO_WAKE

View File

@@ -28,18 +28,7 @@ module.exports = syrup.serial()
, identity.version
, identity.abi
, identity.sdk
, new wire.DeviceDisplayMessage(
identity.display.id
, identity.display.width
, identity.display.height
, identity.display.orientation
, identity.display.xdpi
, identity.display.ydpi
, identity.display.fps
, identity.display.density
, identity.display.secure
, identity.display.url
)
, new wire.DeviceDisplayMessage(identity.display)
, new wire.DevicePhoneMessage(identity.phone)
))
])