device_api-android 1.2.8 → 1.2.9
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 +4 -4
- data/README.md +30 -2
- data/lib/device_api/android/adb.rb +37 -5
- data/lib/device_api/android/device/kindle.rb +5 -1
- data/lib/device_api/android/device.rb +20 -2
- data/lib/device_api/android.rb +28 -6
- metadata +3 -3
    
        checksums.yaml
    CHANGED
    
    | @@ -1,7 +1,7 @@ | |
| 1 1 | 
             
            ---
         | 
| 2 2 | 
             
            SHA1:
         | 
| 3 | 
            -
              metadata.gz:  | 
| 4 | 
            -
              data.tar.gz:  | 
| 3 | 
            +
              metadata.gz: c09f0413dc5506bd026fdaa5f8bf85af6a18a404
         | 
| 4 | 
            +
              data.tar.gz: 2bc91a6a0affe29634f881f5592d3be10bde1efb
         | 
| 5 5 | 
             
            SHA512:
         | 
| 6 | 
            -
              metadata.gz:  | 
| 7 | 
            -
              data.tar.gz:  | 
| 6 | 
            +
              metadata.gz: 5247d30f5ce2233891a6f3770c5283b753466f6e9fd81249e1184ec14ea9a9064843228f924c01ea07325449b95a76c3e119b933634d95f81558068188438856
         | 
| 7 | 
            +
              data.tar.gz: 9fb2718ad39a1ceceaefa7ce4e1b2251d0b39d5afbbb109819f299b635d0d75b1438f8d76d7f28f8d4e48f3462775aaf1c2cfef578ffbc2fac41e97054c30855
         | 
    
        data/README.md
    CHANGED
    
    | @@ -25,6 +25,34 @@ Try connecting an android device with usb, and run: | |
| 25 25 |  | 
| 26 26 | 
             
            You might need to set your device to developer mode, and turn on usb debugging so that the android debug bridge can detect your device.
         | 
| 27 27 |  | 
| 28 | 
            +
            ### Connecting and disconnecting from Remote Devices
         | 
| 29 | 
            +
             | 
| 30 | 
            +
            You can connect to devices via their IP address and port number. The syntax is:
         | 
| 31 | 
            +
             | 
| 32 | 
            +
                DeviceAPI::Android.connect(<IP address>,<port number>=5555)
         | 
| 33 | 
            +
             | 
| 34 | 
            +
            This should add a device to the already connected devices, which you can query with DeviceAPI::Android.devices. You can disconnect from a device like so:
         | 
| 35 | 
            +
             | 
| 36 | 
            +
                DeviceAPI::Android.disconnect(<IP address>,<port number>=5555)
         | 
| 37 | 
            +
             | 
| 38 | 
            +
            Once connected, the IP address and port number combination becomes the serial for the device, and you can execute commands such as adb shell through specifying the IP address/port number instead of the serial number. For both Android.connect and Android.disconnect, if port number is not specified, and ip address is only specified, port number defaults to 5555. (Note that Android.disconnect doesn't automagically disconnect you from a connection with a port number that is not 5555 when it is called without a port argument)
         | 
| 39 | 
            +
             | 
| 40 | 
            +
            You can also use the disconnect method on a Android device object, without any arguments to disconnect a device. It will throw an error if the device is not connected. 
         | 
| 41 | 
            +
             | 
| 42 | 
            +
                device.disconnect
         | 
| 43 | 
            +
             | 
| 44 | 
            +
            You can use device.is_remote? to determine if the device is a remote device, e.g. it has a ipaddress and port as an adb serial, and can attempt to be connected to.
         | 
| 45 | 
            +
             | 
| 46 | 
            +
                device.is_remote?
         | 
| 47 | 
            +
             | 
| 48 | 
            +
            DeviceAPI::Android::ADB::DeviceAlreadyConnectedError is raised when DeviceAPI::Android.connect is called on an already connected device.
         | 
| 49 | 
            +
             | 
| 50 | 
            +
            DeviceAPI::Android::DeviceDisconnectedWhenNotARemoteDevice is raised when we are attempting to call disconnect on a device that is not a remote device, e.g. it has no hope of being disconnected from.
         | 
| 51 | 
            +
             | 
| 52 | 
            +
            DeviceAPI::Android::ADBCommandError is raised when we cannot connect to a device, e.g. adb times out.
         | 
| 53 | 
            +
             | 
| 54 | 
            +
            DeviceAPI::Android::ADBCommandError is raised when we cannot disconnect from a device, e.g. adb times out or we were already disconnected.
         | 
| 55 | 
            +
             | 
| 28 56 | 
             
            ### Detecting devices
         | 
| 29 57 |  | 
| 30 58 | 
             
            There are two methods for detecting devices:
         | 
| @@ -105,7 +133,7 @@ You should be presented with something similar to this: | |
| 105 133 | 
             
                        Bus 001 Device 011: ID 05c6:6765 Qualcomm, Inc.
         | 
| 106 134 | 
             
                        Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
         | 
| 107 135 |  | 
| 108 | 
            -
            The important thing to note here is the Vendor ID and Product ID for the device. In the case of the above, the device is a Tesco Hudl (showing as an Archos device) with the  | 
| 136 | 
            +
            The important thing to note here is the Vendor ID and Product ID for the device. In the case of the above, the device is a Tesco Hudl (showing as an Archos device) with the combined ID of 0e79:5009 - 0e79 is the Vendor ID while 5009 is the Product ID. Open the 51-android.rules file and add the following line:
         | 
| 109 137 |  | 
| 110 138 | 
             
                        SUBSYSTEM=="usb", ATTR{idVendor}=="0e79", ATTR{idProduct}=="5009", MODE="0666", OWNER="hive"
         | 
| 111 139 |  | 
| @@ -115,4 +143,4 @@ Change the Vendor and Product IDs where appropriate, also check that the owner m | |
| 115 143 |  | 
| 116 144 | 
             
            *DeviceAPI-Android* is available to everyone under the terms of the MIT open source licence. Take a look at the LICENSE file in the code.
         | 
| 117 145 |  | 
| 118 | 
            -
            Copyright (c)  | 
| 146 | 
            +
            Copyright (c) 2016 BBC
         | 
| @@ -233,6 +233,30 @@ module DeviceAPI | |
| 233 233 | 
             
                    shell(serial, cmd)
         | 
| 234 234 | 
             
                  end
         | 
| 235 235 |  | 
| 236 | 
            +
                  def self.connect(ipaddress, port = 5555)
         | 
| 237 | 
            +
                    ipaddressandport = "#{ipaddress}:#{port}"
         | 
| 238 | 
            +
                    check_ip_address(ipaddressandport)
         | 
| 239 | 
            +
                    cmd = "adb connect #{ipaddressandport}"
         | 
| 240 | 
            +
                    result = execute(cmd)
         | 
| 241 | 
            +
                    if result.stdout.to_s =~ /.*already connected to.*/
         | 
| 242 | 
            +
                      raise DeviceAlreadyConnectedError.new("Device #{ipaddressandport} already connected")
         | 
| 243 | 
            +
                    else 
         | 
| 244 | 
            +
                      unless result.stdout.to_s =~ /.*connected to.*/
         | 
| 245 | 
            +
                        raise ADBCommandError.new("Unable to adb connect to #{ipaddressandport} result was: #{result.stdout}")
         | 
| 246 | 
            +
                      end
         | 
| 247 | 
            +
                    end 
         | 
| 248 | 
            +
                  end
         | 
| 249 | 
            +
             | 
| 250 | 
            +
                  def self.disconnect(ipaddress, port = 5555)
         | 
| 251 | 
            +
                    ipaddressandport = "#{ipaddress}:#{port}"
         | 
| 252 | 
            +
                    check_ip_address(ipaddressandport)
         | 
| 253 | 
            +
                    cmd = "adb disconnect #{ipaddressandport}"
         | 
| 254 | 
            +
                    result = execute(cmd)
         | 
| 255 | 
            +
                    unless result.exit == 0
         | 
| 256 | 
            +
                      raise ADBCommandError.new("Unable to adb disconnect to #{ipaddressandport} result was: #{result.stdout}")
         | 
| 257 | 
            +
                    end
         | 
| 258 | 
            +
                  end
         | 
| 259 | 
            +
             | 
| 236 260 | 
             
                  # Returns wifi status and access point name
         | 
| 237 261 | 
             
                  # @param serial serial number of device
         | 
| 238 262 | 
             
                  # @example
         | 
| @@ -254,8 +278,7 @@ module DeviceAPI | |
| 254 278 | 
             
                  # @param [String] serial serial number of device
         | 
| 255 279 | 
             
                  # @param [String] command command to execute
         | 
| 256 280 | 
             
                  def self.shell(serial, command)
         | 
| 257 | 
            -
                    result = execute("adb -s #{serial} shell #{command}")
         | 
| 258 | 
            -
             | 
| 281 | 
            +
                    result = execute("adb -s '#{serial}' shell #{command}")
         | 
| 259 282 | 
             
                    case result.stderr
         | 
| 260 283 | 
             
                    when /^error: device unauthorized./
         | 
| 261 284 | 
             
                      raise DeviceAPI::UnauthorizedDevice, result.stderr
         | 
| @@ -275,8 +298,8 @@ module DeviceAPI | |
| 275 298 | 
             
                  # @option coords [String] :x_to (0) Coordinate to end on on the X axis
         | 
| 276 299 | 
             
                  # @option coords [String] :y_from (0) Coordinate to start from on the Y axis
         | 
| 277 300 | 
             
                  # @option coords [String] :y_to (0) Coordinate to end on on the Y axis
         | 
| 278 | 
            -
                  def self.swipe(serial, coords = {x_from: 0,  | 
| 279 | 
            -
                    shell(serial, "input swipe #{coords[:x_from]} #{coords[: | 
| 301 | 
            +
                  def self.swipe(serial, coords = {x_from: 0, y_from: 0, x_to: 0, y_to: 0 })
         | 
| 302 | 
            +
                    shell(serial, "input swipe #{coords[:x_from]} #{coords[:y_from]} #{coords[:x_to]} #{coords[:y_to]}").stdout
         | 
| 280 303 | 
             
                  end
         | 
| 281 304 |  | 
| 282 305 | 
             
                  # Starts intent using adb 
         | 
| @@ -315,7 +338,11 @@ module DeviceAPI | |
| 315 338 | 
             
                    result.include?('true')
         | 
| 316 339 | 
             
                  end
         | 
| 317 340 |  | 
| 318 | 
            -
             | 
| 341 | 
            +
                  def self.check_ip_address(ipaddressandport)
         | 
| 342 | 
            +
                    unless ipaddressandport =~ /\A(\d{1,3})\.(\d{1,3})\.(\d{1,3})\.(\d{1,3}):[0-9]+\Z/ 
         | 
| 343 | 
            +
                         raise ADBCommandError.new("Invalid IP address and port #{ipaddressandport}")
         | 
| 344 | 
            +
                    end
         | 
| 345 | 
            +
                  end
         | 
| 319 346 | 
             
                end
         | 
| 320 347 |  | 
| 321 348 | 
             
                # ADB Error class
         | 
| @@ -324,6 +351,11 @@ module DeviceAPI | |
| 324 351 | 
             
                    super(msg)
         | 
| 325 352 | 
             
                  end
         | 
| 326 353 | 
             
                end
         | 
| 354 | 
            +
                class DeviceAlreadyConnectedError < ADBCommandError
         | 
| 355 | 
            +
                  def initialize(msg)
         | 
| 356 | 
            +
                    super(msg)
         | 
| 357 | 
            +
                  end
         | 
| 358 | 
            +
                end
         | 
| 327 359 |  | 
| 328 360 | 
             
              end
         | 
| 329 361 | 
             
            end
         | 
| @@ -7,7 +7,11 @@ module DeviceAPI | |
| 7 7 | 
             
                  # work due to Amazons implementation of the Keyguard.
         | 
| 8 8 | 
             
                  def unlock
         | 
| 9 9 | 
             
                    ADB.keyevent(serial, '26') unless screen_on?
         | 
| 10 | 
            -
                     | 
| 10 | 
            +
                    if orientation == :landscape
         | 
| 11 | 
            +
                      ADB.swipe(serial, { x_from: 500, y_from: 575, x_to: 500, y_to: 250 } )
         | 
| 12 | 
            +
                    else
         | 
| 13 | 
            +
                      ADB.swipe(serial, { x_from: 300, y_from: 900, x_to: 300, y_to: 600 } )
         | 
| 14 | 
            +
                    end
         | 
| 11 15 | 
             
                  end
         | 
| 12 16 | 
             
                end
         | 
| 13 17 | 
             
              end
         | 
| @@ -27,6 +27,11 @@ module DeviceAPI | |
| 27 27 | 
             
                  def initialize(options = {})
         | 
| 28 28 | 
             
                    @serial = options[:serial]
         | 
| 29 29 | 
             
                    @state = options[:state]
         | 
| 30 | 
            +
                    @remote = options[:remote] ? true : false
         | 
| 31 | 
            +
                  end
         | 
| 32 | 
            +
             | 
| 33 | 
            +
                  def is_remote?
         | 
| 34 | 
            +
                    @remote || false
         | 
| 30 35 | 
             
                  end
         | 
| 31 36 |  | 
| 32 37 | 
             
                  # Mapping of device status - used to provide a consistent status across platforms
         | 
| @@ -41,6 +46,13 @@ module DeviceAPI | |
| 41 46 | 
             
                    }[@state]
         | 
| 42 47 | 
             
                  end
         | 
| 43 48 |  | 
| 49 | 
            +
                  def disconnect
         | 
| 50 | 
            +
                    unless is_remote?
         | 
| 51 | 
            +
                      raise DeviceAPI::Android::DeviceDisconnectedWhenNotARemoteDevice.new("Asked to disconnect device #{serial} when it is not a remote device")
         | 
| 52 | 
            +
                    end
         | 
| 53 | 
            +
                    ADB.disconnect(serial)
         | 
| 54 | 
            +
                  end
         | 
| 55 | 
            +
             | 
| 44 56 | 
             
                  # Return the device range
         | 
| 45 57 | 
             
                  # @return (String) device range string
         | 
| 46 58 | 
             
                  def range
         | 
| @@ -278,7 +290,7 @@ module DeviceAPI | |
| 278 290 | 
             
                      wifi[:mac] unless wifi.nil?
         | 
| 279 291 | 
             
                    end
         | 
| 280 292 | 
             
                  end
         | 
| 281 | 
            -
             | 
| 293 | 
            +
             | 
| 282 294 | 
             
                  private
         | 
| 283 295 |  | 
| 284 296 | 
             
                  def get_network_info
         | 
| @@ -323,7 +335,6 @@ module DeviceAPI | |
| 323 335 | 
             
                    ADB.getpowerinfo(serial)
         | 
| 324 336 | 
             
                  end
         | 
| 325 337 |  | 
| 326 | 
            -
             | 
| 327 338 | 
             
                  def get_phoneinfo
         | 
| 328 339 | 
             
                    ADB.getphoneinfo(serial)
         | 
| 329 340 | 
             
                  end
         | 
| @@ -340,5 +351,12 @@ module DeviceAPI | |
| 340 351 | 
             
                    ADB.get_device_dpi(serial)
         | 
| 341 352 | 
             
                  end
         | 
| 342 353 | 
             
                end
         | 
| 354 | 
            +
             | 
| 355 | 
            +
                class DeviceDisconnectedWhenNotARemoteDevice < StandardError
         | 
| 356 | 
            +
                  def initialize(msg)
         | 
| 357 | 
            +
                    super(msg)
         | 
| 358 | 
            +
                  end
         | 
| 359 | 
            +
                end
         | 
| 360 | 
            +
             | 
| 343 361 | 
             
              end
         | 
| 344 362 | 
             
            end
         | 
    
        data/lib/device_api/android.rb
    CHANGED
    
    | @@ -19,7 +19,9 @@ module DeviceAPI | |
| 19 19 | 
             
                def self.devices
         | 
| 20 20 | 
             
                  ADB.devices.map do |d|
         | 
| 21 21 | 
             
                    if d.keys.first && !d.keys.first.include?('?')
         | 
| 22 | 
            -
                       | 
| 22 | 
            +
                      serial = d.keys.first
         | 
| 23 | 
            +
                      remote = check_if_remote_device?(serial)
         | 
| 24 | 
            +
                      DeviceAPI::Android::Device.create( self.get_device_type(d), { serial: serial, state: d.values.first, remote: remote} )
         | 
| 23 25 | 
             
                    end
         | 
| 24 26 | 
             
                  end.compact
         | 
| 25 27 | 
             
                end
         | 
| @@ -30,18 +32,38 @@ module DeviceAPI | |
| 30 32 | 
             
                    raise DeviceAPI::BadSerialString.new("serial was '#{serial.nil? ? 'nil' : serial}'")
         | 
| 31 33 | 
             
                  end
         | 
| 32 34 | 
             
                  state = ADB.get_state(serial)
         | 
| 33 | 
            -
                   | 
| 35 | 
            +
                  remote = check_if_remote_device?(serial)
         | 
| 36 | 
            +
                  DeviceAPI::Android::Device.create( self.get_device_type({ :"#{serial}" => state}),  { serial: serial, state: state, remote: remote })
         | 
| 37 | 
            +
                end
         | 
| 38 | 
            +
             | 
| 39 | 
            +
                def self.connect(ipaddress,port=5555)
         | 
| 40 | 
            +
                  ADB.connect(ipaddress,port)
         | 
| 41 | 
            +
                end
         | 
| 42 | 
            +
             | 
| 43 | 
            +
                def self.disconnect(ipaddress,port=5555)
         | 
| 44 | 
            +
                  ADB.disconnect(ipaddress,port)
         | 
| 45 | 
            +
                end
         | 
| 46 | 
            +
             | 
| 47 | 
            +
                def self.check_if_remote_device?(serial)
         | 
| 48 | 
            +
                  begin
         | 
| 49 | 
            +
                    ADB::check_ip_address(serial)
         | 
| 50 | 
            +
                    true
         | 
| 51 | 
            +
                  rescue ADBCommandError
         | 
| 52 | 
            +
                    false 
         | 
| 53 | 
            +
                  end 
         | 
| 34 54 | 
             
                end
         | 
| 35 55 |  | 
| 36 56 | 
             
                # Return the device type used in determining which Device Object to create
         | 
| 37 57 | 
             
                def self.get_device_type(options)
         | 
| 38 58 | 
             
                  return :default if options.values.first == 'unauthorized'
         | 
| 59 | 
            +
                  serial = options.keys.first
         | 
| 60 | 
            +
                  state = ADB.get_state(serial)
         | 
| 39 61 | 
             
                  begin
         | 
| 40 | 
            -
                    man = Device.new(serial:  | 
| 62 | 
            +
                    man = Device.new(serial: serial, state: state).manufacturer
         | 
| 41 63 | 
             
                  rescue DeviceAPI::DeviceNotFound
         | 
| 42 64 | 
             
                    return :default
         | 
| 43 65 | 
             
                  rescue => e
         | 
| 44 | 
            -
                    puts "Unrecognised exception whilst finding device '#{ | 
| 66 | 
            +
                    puts "Unrecognised exception whilst finding device '#{serial}' (state: #{options.values.first})"
         | 
| 45 67 | 
             
                    puts e.message
         | 
| 46 68 | 
             
                    puts e.backtrace.inspect
         | 
| 47 69 | 
             
                    return :default
         | 
| @@ -57,9 +79,9 @@ module DeviceAPI | |
| 57 79 | 
             
                  end
         | 
| 58 80 | 
             
                  type
         | 
| 59 81 | 
             
                end
         | 
| 60 | 
            -
              end
         | 
| 61 82 |  | 
| 62 83 | 
             
              # Serial error class
         | 
| 63 | 
            -
             | 
| 84 | 
            +
                class BadSerialString < StandardError
         | 
| 85 | 
            +
                end
         | 
| 64 86 | 
             
              end
         | 
| 65 87 | 
             
            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. | 
| 4 | 
            +
              version: 1.2.9
         | 
| 5 5 | 
             
            platform: ruby
         | 
| 6 6 | 
             
            authors:
         | 
| 7 7 | 
             
            - David Buckhurst
         | 
| @@ -11,7 +11,7 @@ authors: | |
| 11 11 | 
             
            autorequire: 
         | 
| 12 12 | 
             
            bindir: bin
         | 
| 13 13 | 
             
            cert_chain: []
         | 
| 14 | 
            -
            date: 2016- | 
| 14 | 
            +
            date: 2016-08-09 00:00:00.000000000 Z
         | 
| 15 15 | 
             
            dependencies:
         | 
| 16 16 | 
             
            - !ruby/object:Gem::Dependency
         | 
| 17 17 | 
             
              name: device_api
         | 
| @@ -79,7 +79,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement | |
| 79 79 | 
             
                  version: '0'
         | 
| 80 80 | 
             
            requirements: []
         | 
| 81 81 | 
             
            rubyforge_project: 
         | 
| 82 | 
            -
            rubygems_version: 2. | 
| 82 | 
            +
            rubygems_version: 2.6.6
         | 
| 83 83 | 
             
            signing_key: 
         | 
| 84 84 | 
             
            specification_version: 4
         | 
| 85 85 | 
             
            summary: Android Device Management API
         |