diff --git a/lib/db/api.js b/lib/db/api.js index d96e6312..b3d2c154 100644 --- a/lib/db/api.js +++ b/lib/db/api.js @@ -115,6 +115,7 @@ dbapi.saveDeviceIdentity = function(serial, identity) { , sdk: identity.sdk , display: identity.display , browsers: identity.browsers + , phone: identity.phone })) } diff --git a/lib/roles/device/plugins/identity.js b/lib/roles/device/plugins/identity.js index 5fd861b6..24634e58 100644 --- a/lib/roles/device/plugins/identity.js +++ b/lib/roles/device/plugins/identity.js @@ -7,7 +7,8 @@ module.exports = syrup.serial() .dependency(require('../support/properties')) .dependency(require('./display')) .dependency(require('./browsers')) - .define(function(options, properties, display, browsers) { + .dependency(require('./phone')) + .define(function(options, properties, display, browsers, phone) { var log = logger.createLogger('device:plugins:identity') function solve() { @@ -15,6 +16,7 @@ module.exports = syrup.serial() var identity = devutil.makeIdentity(options.serial, properties) identity.display = display identity.browsers = browsers + identity.phone = phone return identity } diff --git a/lib/roles/device/plugins/input.js b/lib/roles/device/plugins/input.js index 0be82f57..a44635d3 100644 --- a/lib/roles/device/plugins/input.js +++ b/lib/roles/device/plugins/input.js @@ -303,6 +303,25 @@ module.exports = syrup.serial() }) } + function getProperties(properties) { + return runServiceCommand( + apk.serviceProto.RequestType.GET_PROPERTIES + , new apk.serviceProto.GetPropertiesRequest(properties) + ) + .timeout(15000) + .then(function(data) { + var response = apk.serviceProto.GetPropertiesResponse.decode(data) + if (response.success) { + var mapped = Object.create(null) + response.properties.forEach(function(property) { + mapped[property.name] = property.value + }) + return mapped + } + throw new Error('Unable to get properties') + }) + } + function runServiceCommand(type, cmd) { var resolver = Promise.defer() service.writer.write(new apk.serviceProto.RequestEnvelope( @@ -372,6 +391,7 @@ module.exports = syrup.serial() } , copy: getClipboard , getBrowsers: getBrowsers + , getProperties: getProperties } }) }) diff --git a/lib/roles/device/plugins/phone.js b/lib/roles/device/plugins/phone.js new file mode 100644 index 00000000..443dc08a --- /dev/null +++ b/lib/roles/device/plugins/phone.js @@ -0,0 +1,16 @@ +var syrup = require('syrup') + +var logger = require('../../../util/logger') + +module.exports = syrup.serial() + .dependency(require('./input')) + .define(function(options, input) { + var log = logger.createLogger('device:plugins:phone') + + function fetch() { + log.info('Fetching phone info') + return input.getProperties(['imei', 'phoneNumber']) + } + + return fetch() + }) diff --git a/lib/roles/device/plugins/solo.js b/lib/roles/device/plugins/solo.js index 22e42bfe..6a76dfa4 100644 --- a/lib/roles/device/plugins/solo.js +++ b/lib/roles/device/plugins/solo.js @@ -53,6 +53,7 @@ module.exports = syrup.serial() ) }) ) + , new wire.DevicePhoneMessage(identity.phone) )) ]) }) diff --git a/lib/wire/wire.proto b/lib/wire/wire.proto index 9dbeca96..fa1952e2 100644 --- a/lib/wire/wire.proto +++ b/lib/wire/wire.proto @@ -139,6 +139,11 @@ message DeviceBrowsersMessage { repeated DeviceBrowserAppMessage apps = 2; } +message DevicePhoneMessage { + optional string imei = 1; + optional string phoneNumber = 2; +} + message DeviceIdentityMessage { required string serial = 1; required string platform = 2; @@ -150,6 +155,7 @@ message DeviceIdentityMessage { required string sdk = 8; required DeviceDisplayMessage display = 9; required DeviceBrowsersMessage browsers = 10; + required DevicePhoneMessage phone = 11; } message DeviceProperty {