diff --git a/lib/cli.js b/lib/cli.js index 4e67e9bf..a6e2d95f 100644 --- a/lib/cli.js +++ b/lib/cli.js @@ -68,6 +68,8 @@ program , 'adb connect URL pattern' , String , '${publicIp}:${publicPort}') + .option('--mute-master' + , 'whether to mute master volume when devices are being used') .action(function() { var serials = cliutil.allUnknownArgs(arguments) , options = cliutil.lastArg(arguments) @@ -107,7 +109,8 @@ program , '--screen-ws-url-pattern', options.screenWsUrlPattern , '--connect-url-pattern', options.connectUrlPattern , '--heartbeat-interval', options.heartbeatInterval - ]) + ] + .concat(options.muteMaster ? ['--mute-master'] : [])) } , endpoints: { sub: options.connectSub @@ -167,6 +170,8 @@ program , 'heartbeat interval' , Number , 10000) + .option('--mute-master' + , 'whether to mute master volume when devices are being used') .action(function(serial, options) { if (!options.connectSub) { this.missingArgument('--connect-sub') @@ -204,6 +209,7 @@ program , connectUrlPattern: options.connectUrlPattern , connectPort: options.connectPort , heartbeatInterval: options.heartbeatInterval + , muteMaster: options.muteMaster }) }) @@ -911,6 +917,8 @@ program .option('--user-profile-url ' , 'URL to external user profile page' , String) + .option('--mute-master' + , 'whether to mute master volume when devices are being used') .action(function() { var log = logger.createLogger('cli:local') , args = arguments @@ -976,6 +984,7 @@ program , '--adb-port', options.adbPort ] .concat(options.allowRemote ? ['--allow-remote'] : []) + .concat(options.muteMaster ? ['--mute-master'] : []) .concat(cliutil.allUnknownArgs(args))) // auth diff --git a/lib/units/device/index.js b/lib/units/device/index.js index 461b79c4..fa2a3a29 100644 --- a/lib/units/device/index.js +++ b/lib/units/device/index.js @@ -25,6 +25,7 @@ module.exports = function(options) { .dependency(require('./plugins/store')) .dependency(require('./plugins/clipboard')) .dependency(require('./plugins/logcat')) + .dependency(require('./plugins/mute')) .dependency(require('./plugins/shell')) .dependency(require('./plugins/touch')) .dependency(require('./plugins/install')) diff --git a/lib/units/device/plugins/mute.js b/lib/units/device/plugins/mute.js new file mode 100644 index 00000000..fd23c75b --- /dev/null +++ b/lib/units/device/plugins/mute.js @@ -0,0 +1,30 @@ +var Promise = require('bluebird') +var syrup = require('stf-syrup') + +var logger = require('../../../util/logger') + +module.exports = syrup.serial() + .dependency(require('./group')) + .dependency(require('./service')) + .define(function(options, group, service) { + var log = logger.createLogger('device:plugins:mute') + + if (options.muteMaster) { + log.info('Will mute master volume during use') + + group.on('join', function() { + log.info('Muting master volume'); + service.setMasterMute(true) + }) + + group.on('leave', function() { + log.info('Unmuting master volume'); + service.setMasterMute(false) + }) + } + else { + log.info('Will not mute master volume during use') + } + + return Promise.resolve() + }) diff --git a/lib/units/device/plugins/service.js b/lib/units/device/plugins/service.js index e61442be..5f8ce68f 100644 --- a/lib/units/device/plugins/service.js +++ b/lib/units/device/plugins/service.js @@ -671,6 +671,20 @@ module.exports = syrup.serial() return Promise.resolve(true) } + plugin.setMasterMute = function(mode) { + return runServiceCommand( + apk.wire.MessageType.SET_MASTER_MUTE + , new apk.wire.SetMasterMuteRequest(mode) + ) + .timeout(10000) + .then(function(data) { + var response = apk.wire.SetMasterMuteResponse.decode(data) + if (!response.success) { + throw new Error('Unable to set master mute') + } + }) + } + function runServiceCommand(type, cmd) { var resolver = Promise.defer() var id = Math.floor(Math.random() * 0xFFFFFF) diff --git a/lib/units/device/resources/service.js b/lib/units/device/resources/service.js index 29b2210e..09d89a50 100644 --- a/lib/units/device/resources/service.js +++ b/lib/units/device/resources/service.js @@ -17,7 +17,7 @@ module.exports = syrup.serial() pathutil.vendor('STFService/wire.proto')) var resource = { - requiredVersion: '1.0.0' + requiredVersion: '1.0.1' , pkg: 'jp.co.cyberagent.stf' , main: 'jp.co.cyberagent.stf.Agent' , apk: pathutil.vendor('STFService/STFService.apk') diff --git a/vendor/STFService/STFService.apk b/vendor/STFService/STFService.apk index 2477c0a5..322bf510 100644 Binary files a/vendor/STFService/STFService.apk and b/vendor/STFService/STFService.apk differ diff --git a/vendor/STFService/wire.proto b/vendor/STFService/wire.proto index 44b07565..e38b9ac3 100644 --- a/vendor/STFService/wire.proto +++ b/vendor/STFService/wire.proto @@ -24,6 +24,7 @@ enum MessageType { SET_ROTATION = 12; SET_WAKE_LOCK = 11; SET_WIFI_ENABLED = 22; + SET_MASTER_MUTE = 28; EVENT_AIRPLANE_MODE = 13; EVENT_BATTERY = 14; EVENT_CONNECTIVITY = 15; @@ -251,6 +252,14 @@ message GetSdStatusResponse { required bool mounted = 2; } +message SetMasterMuteRequest { + required bool enabled = 1; +} + +message SetMasterMuteResponse { + required bool success = 1; +} + // Agent enum KeyEvent {