device_api-android 1.2.1 → 1.2.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 24478f4505667886d868853cf59a63cfcf9b7853
4
- data.tar.gz: 97885cb308584d1443e7520df7f382c17c24e747
3
+ metadata.gz: 696b2120302134357a63763b3bded0f733d9e3a4
4
+ data.tar.gz: 50845791f6c53132d0718d5648c1960c44e78c67
5
5
  SHA512:
6
- metadata.gz: b4f53c262ba558dd8b63fd501a752d32dc1b334cf3af4567c77c0645e591ad62d82ea8aab244b1148f8e16cd914a8119b3e42a3238e4a81d5f159a1b111118c2
7
- data.tar.gz: 3eedf4979a134ae4521a421a9db11faf4f742c71304ff59203bc4bd8d3fa5492f882e13b5cca9386f4570dfa7e3de06aa3db007a93eadf9cba2c20f2376ee411
6
+ metadata.gz: 4454f5cf73cba899c4f4b7a63054712cbd39b1594a9c86c67d53038e011106735b7561fada022599fbb2342b67ad5721ec08e4d95d19413fba76db18f160d943
7
+ data.tar.gz: a0a41ab17b179a5339ee522b1bc45760e0510e88d33b4c871899e156814305ad453a5ea4b2217601c0f410aefbf03d3ce4188f2cfa9031b8c707ea0396fe1dca
@@ -4,6 +4,7 @@ require 'device_api/android/device'
4
4
  require 'device_api/android/signing'
5
5
 
6
6
  # Load plugins
7
+ require 'device_api/android/plugins/audio'
7
8
  require 'device_api/android/plugins/memory'
8
9
  require 'device_api/android/plugins/battery'
9
10
  require 'device_api/android/plugins/disk'
@@ -38,9 +38,7 @@ module DeviceAPI
38
38
  # @param serial serial number of device
39
39
  # @return (Hash) hash containing device properties
40
40
  def self.getprop(serial)
41
- result = execute("adb -s #{serial} shell getprop")
42
-
43
- raise ADBCommandError.new(result.stderr) if result.exit != 0
41
+ result = shell(serial, 'getprop')
44
42
 
45
43
  lines = result.stdout.encode('UTF-16', 'UTF-8', invalid: :replace, replace: '').encode('UTF-8', 'UTF-16').split("\n")
46
44
 
@@ -73,7 +71,7 @@ module DeviceAPI
73
71
 
74
72
  # Get the network information
75
73
  def self.get_network_info(serial)
76
- lines = execute("adb -s #{serial} shell netcfg")
74
+ lines = shell(serial, 'netcfg')
77
75
  lines.stdout.split("\n").map do |a|
78
76
  b = a.split(" ")
79
77
  { name: b[0], ip: b[2].split('/')[0], mac: b[4] }
@@ -119,8 +117,7 @@ module DeviceAPI
119
117
  # @param serial serial number of device
120
118
  # @return (Array) array of results from adb shell dumpsys
121
119
  def self.dumpsys(serial, command)
122
- result = execute("adb -s #{serial} shell dumpsys #{command}")
123
- raise ADBCommandError.new(result.stderr) if result.exit != 0
120
+ result = shell(serial, "dumpsys #{command}")
124
121
  result.stdout.split("\n").map { |line| line.strip }
125
122
  end
126
123
 
@@ -172,9 +169,7 @@ module DeviceAPI
172
169
  # @param serial serial number of device
173
170
  # @return (Float) uptime in seconds
174
171
  def self.get_uptime(serial)
175
- result = execute("adb -s #{serial} shell cat /proc/uptime")
176
-
177
- raise ADBCommandError.new(result.stderr) if result.exit != 0
172
+ result = shell(serial, 'cat /proc/uptime')
178
173
 
179
174
  lines = result.stdout.split("\n")
180
175
  uptime = 0
@@ -210,11 +205,11 @@ module DeviceAPI
210
205
  seed = args[:seed]
211
206
  throttle = args[:throttle]
212
207
 
213
- cmd = "adb -s #{serial} shell monkey -p #{package} -v #{events}"
208
+ cmd = "monkey -p #{package} -v #{events}"
214
209
  cmd = cmd + " -s #{seed}" if seed
215
210
  cmd = cmd + " -t #{throttle}" if throttle
216
211
 
217
- execute(cmd)
212
+ shell(serial, cmd)
218
213
  end
219
214
 
220
215
  # Take a screenshot from the device
@@ -228,9 +223,9 @@ module DeviceAPI
228
223
  filename = args[:filename] or raise "filename not provided (:filename => '/tmp/myfile.png')"
229
224
 
230
225
  convert_carriage_returns = %q{perl -pe 's/\x0D\x0A/\x0A/g'}
231
- cmd = "adb -s #{serial} shell screencap -p | #{convert_carriage_returns} > #{filename}"
226
+ cmd = "screencap -p | #{convert_carriage_returns} > #{filename}"
232
227
 
233
- execute(cmd)
228
+ shell(serial, cmd)
234
229
  end
235
230
 
236
231
  # Returns wifi status and access point name
@@ -238,21 +233,34 @@ module DeviceAPI
238
233
  # @example
239
234
  # DeviceAPI::ADB.wifi(serial)
240
235
  def self.wifi(serial)
241
- result = execute("adb -s #{serial} shell dumpsys wifi | grep mNetworkInfo")
242
- if result.exit != 0
243
- raise ADBCommandError.new(result.stderr)
244
- else
245
- result = {:status => result.stdout.match("state:(.*?),")[1].strip, :access_point => result.stdout.match("extra:(.*?),")[1].strip.gsub(/"/,'')}
246
- end
247
- result
236
+ result = shell(serial, 'dumpsys wifi | grep mNetworkInfo')
237
+
238
+ {:status => result.stdout.match("state:(.*?),")[1].strip, :access_point => result.stdout.match("extra:(.*?),")[1].strip.gsub(/"/,'')}
248
239
  end
249
240
 
250
241
  # Sends a key event to the specified device
251
242
  # @param [String] serial serial number of device
252
243
  # @param [String] keyevent keyevent to send to the device
253
244
  def self.keyevent(serial, keyevent)
254
- result = execute("adb -s #{serial} shell input keyevent #{keyevent}")
255
- raise ADBCommandError.new(result.stderr) if result.exit != 0
245
+ shell(serial, "input keyevent #{keyevent}").stdout
246
+ end
247
+
248
+ # ADB Shell command
249
+ # @param [String] serial serial number of device
250
+ # @param [String] command command to execute
251
+ def self.shell(serial, command)
252
+ result = execute("adb -s #{serial} shell #{command}")
253
+
254
+ case result.stderr
255
+ when /^error: device unauthorized./
256
+ raise DeviceAPI::UnauthorizedDevice, result.stderr
257
+ when /^error: device not found/
258
+ raise DeviceAPI::DeviceNotFound, result.stderr
259
+ else
260
+ raise ADBCommandError.new(result.stderr)
261
+ end if result.exit != 0
262
+
263
+ result
256
264
  end
257
265
 
258
266
  # Sends a swipe command to the specified device
@@ -263,8 +271,7 @@ module DeviceAPI
263
271
  # @option coords [String] :y_from (0) Coordinate to start from on the Y axis
264
272
  # @option coords [String] :y_to (0) Coordinate to end on on the Y axis
265
273
  def self.swipe(serial, coords = {x_from: 0, x_to: 0, y_from: 0, y_to: 0 })
266
- result = execute("adb -s #{serial} shell input swipe #{coords[:x_from]} #{coords[:x_to]} #{coords[:y_from]} #{coords[:y_to]}")
267
- raise ADBCommandError.new(result.stderr) if result.exit != 0
274
+ shell(serial, "input swipe #{coords[:x_from]} #{coords[:x_to]} #{coords[:y_from]} #{coords[:y_to]}").stdout
268
275
  end
269
276
 
270
277
  # Starts intent using adb
@@ -274,9 +281,7 @@ module DeviceAPI
274
281
  # @example
275
282
  # DeviceAPI::ADB.am(serial, "start -a android.intent.action.MAIN -n com.android.settings/.wifi.WifiSettings")
276
283
  def self.am(serial, command)
277
- result = execute("adb -s #{serial} shell am #{command}")
278
- raise ADBCommandError.new(result.stderr) if result.exit != 0
279
- return result.stdout
284
+ shell(serial, "am #{command}").stdout
280
285
  end
281
286
 
282
287
  # Package manager commands
@@ -284,9 +289,7 @@ module DeviceAPI
284
289
  # @param command command to issue to the package manager
285
290
  # @example DeviceAPI::ADB.pm(serial, 'list packages')
286
291
  def self.pm(serial, command)
287
- result = execute("adb -s #{serial} shell pm #{command}")
288
- raise ADBCommandError.new(result.stderr) if result.exit != 0
289
- return result.stdout
292
+ shell(serial, "pm #{command}").stdout
290
293
  end
291
294
 
292
295
  # Blocks a package, used on Android versions less than KitKat
@@ -306,6 +309,8 @@ module DeviceAPI
306
309
  result = pm(serial, "hide #{package}")
307
310
  result.include?('true')
308
311
  end
312
+
313
+
309
314
  end
310
315
 
311
316
  # ADB Error class
@@ -315,6 +320,5 @@ module DeviceAPI
315
320
  end
316
321
  end
317
322
 
318
-
319
323
  end
320
324
  end
@@ -258,14 +258,14 @@ module DeviceAPI
258
258
  def ip_address
259
259
  network = get_network_info
260
260
  wlan0 = network.detect { |a| a[:name] == 'wlan0' }
261
- wlan0[:ip]
261
+ wlan0[:ip] unless wlan0.nil?
262
262
  end
263
263
 
264
264
  # Returns the Wifi mac address
265
265
  def wifi_mac_address
266
266
  network = get_network_info
267
267
  wifi = network.detect { |a| a[:name] == 'wlan0' }
268
- wifi[:mac]
268
+ wifi[:mac] unless wifi.nil?
269
269
  end
270
270
 
271
271
  private
@@ -0,0 +1,76 @@
1
+ module DeviceAPI
2
+ module Android
3
+ module Plugin
4
+ class Audio
5
+
6
+ attr_reader :serial
7
+
8
+ def initialize(options)
9
+ @serial = options #[:serial]
10
+ end
11
+
12
+ def get_volume_steps
13
+ audio = ADB.dumpsys( @serial, 'audio' )
14
+ vol_steps = audio.detect { |a| a.include?('volume steps:') }
15
+ return nil if vol_steps.nil?
16
+
17
+ vol_steps.scan(/volume steps: (.*)/).flatten.first.to_i
18
+ end
19
+
20
+ def get_current_volume
21
+ system = get_system_volume
22
+ volume = system.select { |a| a.include?('Current') }.first
23
+ volume.scan(/Current: 2:\s(.*?),(:?.*)/).flatten.first.to_i
24
+
25
+ end
26
+
27
+ def is_muted?
28
+ system = get_system_volume
29
+ mute = system.select { |a| a.include?('Mute') }.first
30
+ mute.scan(/Mute count: (.*)/).flatten.first.to_i > 0
31
+ end
32
+
33
+ def volume
34
+ return 0 if is_muted?
35
+ steps = get_volume_steps
36
+ vol = get_current_volume
37
+ ((vol.to_f / steps.to_f) * 100).to_i
38
+ end
39
+
40
+ def max_volume
41
+ vol = get_current_volume
42
+ steps = get_volume_steps
43
+
44
+ change_volume(steps - vol, 24)
45
+
46
+ get_current_volume == steps
47
+ end
48
+
49
+ def min_volume
50
+ vol = get_current_volume
51
+ change_volume(vol, 25)
52
+
53
+ get_current_volume == 0
54
+ # adb shell service call audio 4 i32 1 i32 0 i32 1
55
+ end
56
+
57
+ private
58
+
59
+ def change_volume(op, key)
60
+ op.times do
61
+ ADB.keyevent(@serial, key )
62
+ end
63
+ end
64
+
65
+ def get_system_volume
66
+ audio = ADB.dumpsys( @serial, 'audio' )
67
+ index = audio.index('- STREAM_SYSTEM:')
68
+
69
+ return nil if index.nil?
70
+
71
+ audio[index+1..index+2]
72
+ end
73
+ end
74
+ end
75
+ end
76
+ end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: device_api-android
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.2.1
4
+ version: 1.2.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - David Buckhurst
@@ -11,42 +11,36 @@ authors:
11
11
  autorequire:
12
12
  bindir: bin
13
13
  cert_chain: []
14
- date: 2015-11-30 00:00:00.000000000 Z
14
+ date: 2016-02-09 00:00:00.000000000 Z
15
15
  dependencies:
16
16
  - !ruby/object:Gem::Dependency
17
17
  name: device_api
18
18
  requirement: !ruby/object:Gem::Requirement
19
19
  requirements:
20
- - - ">="
20
+ - - "~>"
21
21
  - !ruby/object:Gem::Version
22
- version: '1.0'
23
- - - "<"
24
- - !ruby/object:Gem::Version
25
- version: '2.0'
22
+ version: 1.0.2
26
23
  type: :runtime
27
24
  prerelease: false
28
25
  version_requirements: !ruby/object:Gem::Requirement
29
26
  requirements:
30
- - - ">="
31
- - !ruby/object:Gem::Version
32
- version: '1.0'
33
- - - "<"
27
+ - - "~>"
34
28
  - !ruby/object:Gem::Version
35
- version: '2.0'
29
+ version: 1.0.2
36
30
  - !ruby/object:Gem::Dependency
37
31
  name: rspec
38
32
  requirement: !ruby/object:Gem::Requirement
39
33
  requirements:
40
- - - ">="
34
+ - - "~>"
41
35
  - !ruby/object:Gem::Version
42
- version: '0'
36
+ version: '3'
43
37
  type: :development
44
38
  prerelease: false
45
39
  version_requirements: !ruby/object:Gem::Requirement
46
40
  requirements:
47
- - - ">="
41
+ - - "~>"
48
42
  - !ruby/object:Gem::Version
49
- version: '0'
43
+ version: '3'
50
44
  description: Android implementation of DeviceAPI
51
45
  email: david.buckhurst@bbc.co.uk
52
46
  executables: []
@@ -60,6 +54,7 @@ files:
60
54
  - lib/device_api/android/device.rb
61
55
  - lib/device_api/android/device/kindle.rb
62
56
  - lib/device_api/android/device/samsung.rb
57
+ - lib/device_api/android/plugins/audio.rb
63
58
  - lib/device_api/android/plugins/battery.rb
64
59
  - lib/device_api/android/plugins/disk.rb
65
60
  - lib/device_api/android/plugins/memory.rb
@@ -84,7 +79,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
84
79
  version: '0'
85
80
  requirements: []
86
81
  rubyforge_project:
87
- rubygems_version: 2.4.8
82
+ rubygems_version: 2.5.0
88
83
  signing_key:
89
84
  specification_version: 4
90
85
  summary: Android Device Management API