UsbDevice: Add support for retrieving version string for a USB device

Change-Id: Ia8630f5ffd05f90347b971110a81f4927060cc4b
diff --git a/api/current.txt b/api/current.txt
index 1117623..b0dc81d 100644
--- a/api/current.txt
+++ b/api/current.txt
@@ -14025,6 +14025,7 @@
     method public java.lang.String getProductName();
     method public java.lang.String getSerialNumber();
     method public int getVendorId();
+    method public java.lang.String getVersion();
     method public void writeToParcel(android.os.Parcel, int);
     field public static final android.os.Parcelable.Creator<android.hardware.usb.UsbDevice> CREATOR;
   }
diff --git a/api/system-current.txt b/api/system-current.txt
index 7210666..09e8705 100644
--- a/api/system-current.txt
+++ b/api/system-current.txt
@@ -14929,6 +14929,7 @@
     method public java.lang.String getProductName();
     method public java.lang.String getSerialNumber();
     method public int getVendorId();
+    method public java.lang.String getVersion();
     method public void writeToParcel(android.os.Parcel, int);
     field public static final android.os.Parcelable.Creator<android.hardware.usb.UsbDevice> CREATOR;
   }
diff --git a/core/java/android/hardware/usb/UsbDevice.java b/core/java/android/hardware/usb/UsbDevice.java
index 1a42319..410d550 100644
--- a/core/java/android/hardware/usb/UsbDevice.java
+++ b/core/java/android/hardware/usb/UsbDevice.java
@@ -45,6 +45,7 @@
     private final String mName;
     private final String mManufacturerName;
     private final String mProductName;
+    private final String mVersion;
     private final String mSerialNumber;
     private final int mVendorId;
     private final int mProductId;
@@ -62,7 +63,7 @@
      */
     public UsbDevice(String name, int vendorId, int productId,
             int Class, int subClass, int protocol,
-            String manufacturerName, String productName, String serialNumber) {
+            String manufacturerName, String productName, String version, String serialNumber) {
         mName = name;
         mVendorId = vendorId;
         mProductId = productId;
@@ -71,6 +72,7 @@
         mProtocol = protocol;
         mManufacturerName = manufacturerName;
         mProductName = productName;
+        mVersion = version;
         mSerialNumber = serialNumber;
     }
 
@@ -104,6 +106,15 @@
     }
 
     /**
+     * Returns the version number of the device.
+     *
+     * @return the device version
+     */
+    public String getVersion() {
+        return mVersion;
+    }
+
+    /**
      * Returns the serial number of the device.
      *
      * @return the serial number name
@@ -263,7 +274,7 @@
                 ",mVendorId=" + mVendorId + ",mProductId=" + mProductId +
                 ",mClass=" + mClass + ",mSubclass=" + mSubclass + ",mProtocol=" + mProtocol +
                 ",mManufacturerName=" + mManufacturerName + ",mProductName=" + mProductName +
-                ",mSerialNumber=" + mSerialNumber + ",mConfigurations=[");
+                ",mVersion=" + mVersion + ",mSerialNumber=" + mSerialNumber + ",mConfigurations=[");
         for (int i = 0; i < mConfigurations.length; i++) {
             builder.append("\n");
             builder.append(mConfigurations[i].toString());
@@ -283,10 +294,11 @@
             int protocol = in.readInt();
             String manufacturerName = in.readString();
             String productName = in.readString();
+            String version = in.readString();
             String serialNumber = in.readString();
             Parcelable[] configurations = in.readParcelableArray(UsbInterface.class.getClassLoader());
             UsbDevice device = new UsbDevice(name, vendorId, productId, clasz, subClass, protocol,
-                                 manufacturerName, productName, serialNumber);
+                                 manufacturerName, productName, version, serialNumber);
             device.setConfigurations(configurations);
             return device;
         }
@@ -309,6 +321,7 @@
         parcel.writeInt(mProtocol);
         parcel.writeString(mManufacturerName);
         parcel.writeString(mProductName);
+        parcel.writeString(mVersion);
         parcel.writeString(mSerialNumber);
         parcel.writeParcelableArray(mConfigurations, 0);
    }
diff --git a/services/core/jni/com_android_server_UsbHostManager.cpp b/services/core/jni/com_android_server_UsbHostManager.cpp
index ee50ff9..d8c172f 100644
--- a/services/core/jni/com_android_server_UsbHostManager.cpp
+++ b/services/core/jni/com_android_server_UsbHostManager.cpp
@@ -71,6 +71,7 @@
 
     char *manufacturer = usb_device_get_manufacturer_name(device);
     char *product = usb_device_get_product_name(device);
+    int version = usb_device_get_version(device);
     char *serial = usb_device_get_serial(device);
 
     jstring deviceName = env->NewStringUTF(devname);
@@ -81,7 +82,7 @@
     jboolean result = env->CallBooleanMethod(thiz, method_beginUsbDeviceAdded,
             deviceName, usb_device_get_vendor_id(device), usb_device_get_product_id(device),
             deviceDesc->bDeviceClass, deviceDesc->bDeviceSubClass, deviceDesc->bDeviceProtocol,
-            manufacturerName, productName, serialNumber);
+            manufacturerName, productName, version, serialNumber);
 
     env->DeleteLocalRef(serialNumber);
     env->DeleteLocalRef(productName);
@@ -199,7 +200,7 @@
         return -1;
     }
     method_beginUsbDeviceAdded = env->GetMethodID(clazz, "beginUsbDeviceAdded",
-            "(Ljava/lang/String;IIIIILjava/lang/String;Ljava/lang/String;Ljava/lang/String;)Z");
+            "(Ljava/lang/String;IIIIILjava/lang/String;Ljava/lang/String;ILjava/lang/String;)Z");
     if (method_beginUsbDeviceAdded == NULL) {
         ALOGE("Can't find beginUsbDeviceAdded");
         return -1;
diff --git a/services/usb/java/com/android/server/usb/UsbHostManager.java b/services/usb/java/com/android/server/usb/UsbHostManager.java
index 5b58051..f5f2b07 100644
--- a/services/usb/java/com/android/server/usb/UsbHostManager.java
+++ b/services/usb/java/com/android/server/usb/UsbHostManager.java
@@ -112,7 +112,7 @@
      */
     private boolean beginUsbDeviceAdded(String deviceName, int vendorID, int productID,
             int deviceClass, int deviceSubclass, int deviceProtocol,
-            String manufacturerName, String productName, String serialNumber) {
+            String manufacturerName, String productName, int version, String serialNumber) {
 
         if (DEBUG) {
             Slog.d(TAG, "usb:UsbHostManager.beginUsbDeviceAdded(" + deviceName + ")");
@@ -149,9 +149,12 @@
                 return false;
             }
 
+            // Create version string in "%.%" format
+            String versionString = Integer.toString(version >> 8) + "." + (version & 0xFF);
+
             mNewDevice = new UsbDevice(deviceName, vendorID, productID,
                     deviceClass, deviceSubclass, deviceProtocol,
-                    manufacturerName, productName, serialNumber);
+                    manufacturerName, productName, versionString, serialNumber);
 
             mNewConfigurations = new ArrayList<UsbConfiguration>();
             mNewInterfaces = new ArrayList<UsbInterface>();