`
Leif_冬
  • 浏览: 48870 次
  • 性别: Icon_minigender_1
  • 来自: 苏州
社区版块
存档分类
最新评论

android 新增一個廣播偵聽USB設備的插拔

 
阅读更多

太懶,直接上patch:

diff --git a/core/java/android/hardware/usb/UsbManager.java b/core/java/android/hardware/usb/UsbManager.java
index 376a4de..be64369 100644
--- a/core/java/android/hardware/usb/UsbManager.java
+++ b/core/java/android/hardware/usb/UsbManager.java
@@ -84,6 +84,21 @@ public class UsbManager {
             "android.hardware.usb.action.USB_STATE";
 
     /**
+     * Broadcast Action: A broadcast for Vehice Cradle state changes.
+     *
+     * This is a sticky broadcast intent for clients that include Vehicle cradle state connected/dis
+     connected state,
+     * <ul>
+     * <li> {@link #VEHICLE_CRADLE_CONNECTED} boolean indicating whether vehicle cradle is connected
+     or disconnected.
+     * </ul>
+     *
+     * @hide
+     */
+    public static final String ACTION_VEHICLE_CRADLE_STATE =
+            "android.hardware.usb.action.VEHICLE_CRADLE_STATE";
+
+    /**
      * Broadcast Action: A broadcast for USB port changes.
      *
      * This intent is sent when a USB port is added, removed, or changes state.
@@ -176,6 +191,14 @@ public class UsbManager {
     public static final String USB_CONFIGURED = "configured";
 
     /**
+     * Boolean extra indicating whether vehicle cradle is connected or disconnected.
+     * Used in extras for the {@link #ACTION_VEHICLE_CRADLE_STATE} broadcast.
+     *
+     * {@hide}
+     */
+    public static final String VEHICLE_CRADLE_CONNECTED = "connected";
+
+    /**
      * Boolean extra indicating whether confidential user data, such as photos, should be
      * made available on the USB connection. This variable will only be set when the user
      * has explicitly asked for this data to be unlocked.
diff --git a/core/res/AndroidManifest.xml b/core/res/AndroidManifest.xml
index 47f1994..1f6a787 100644
--- a/core/res/AndroidManifest.xml
+++ b/core/res/AndroidManifest.xml
@@ -243,6 +243,7 @@
     <protected-broadcast android:name="android.hardware.usb.action.USB_ACCESSORY_DETACHED" />
     <protected-broadcast android:name="android.hardware.usb.action.USB_DEVICE_ATTACHED" />
     <protected-broadcast android:name="android.hardware.usb.action.USB_DEVICE_DETACHED" />
+    <protected-broadcast android:name="android.hardware.usb.action.VEHICLE_CRADLE_STATE" />
 
     <protected-broadcast android:name="android.intent.action.HEADSET_PLUG" />
     <protected-broadcast android:name="android.media.action.HDMI_AUDIO_PLUG" />
diff --git a/services/usb/java/com/android/server/usb/UsbHostManager.java b/services/usb/java/com/android/server/usb/UsbHostManager.java
index c272c76..25033df 100644
--- a/services/usb/java/com/android/server/usb/UsbHostManager.java
+++ b/services/usb/java/com/android/server/usb/UsbHostManager.java
@@ -81,6 +81,11 @@ public class UsbHostManager {
     // contains all connected USB devices
     private final HashMap<String, UsbDevice> mDevices = new HashMap<>();
 
+    private static final String HSUSB_STATE_MATCH =
+                        "DEVPATH=/devices/soc/a800000.ssusb/a800000.dwc3/xhci-hcd.0.auto/usb1/1-1";
+    /*current vehicle cradle state*/
+    private boolean mConnected;
+
     private static final String HSUSB_MSR_MATCH =
             "DEVPATH=/devices/soc/a800000.ssusb/a800000.dwc3/xhci-hcd.0.auto/usb1/1-1";
     // current MSR connection state
@@ -184,6 +189,10 @@ public class UsbHostManager {
         mHostBlacklist = context.getResources().getStringArray(
                 com.android.internal.R.array.config_usbHostBlacklist);
         mUsbAlsaManager = alsaManager;
+        if(ZebraUtils.isZebra()){
+            // Watch for Host USB configuration changes
+            mUsbUEventVehicleCradleObserver.startObserving(HSUSB_STATE_MATCH);
+        }
         mSettingsManager = settingsManager;
         String deviceConnectionHandler = context.getResources().getString(
                 com.android.internal.R.string.config_UsbDeviceConnectionHandling_component);
@@ -485,6 +494,51 @@ public class UsbHostManager {
             mMSRConnected = 0;  // reset flag
         }
     }
+
+     /*
+      * Listens for uevent messages from the kernel to monitor Vehicle Cradle state
+      */
+    private final UEventObserver mUsbUEventVehicleCradleObserver = new UEventObserver() {
+        @Override
+        public void onUEvent(UEventObserver.UEvent event) {
+            if (DEBUG) Slog.v(TAG, "USB UEVENT: " + event.toString());
+
+            String action = event.get("ACTION");
+            String devtype = event.get("DEVTYPE");
+            String product = event.get("PRODUCT");
+            if (action != null && product!= null && devtype != null) {
+                updateVehicleCradleState(action, devtype, product);
+            }
+        }
+    };
+    /*
+     * update Vehicle Cradle state for
+     * vendor id = 1d6b , product id = 0002 , bcddevice = 310
+     */
+    private void updateVehicleCradleState(String action, String devtype, String product) {
+
+        if (("add".equals(action)) && ("usb_device".equals(devtype)) && ("1d6b/2/310".equals(product
+        ))) {
+            mConnected = true;
+            updateVehicleCradleStateBroadcast();
+        } else if (("remove".equals(action)) && ("usb_device".equals(devtype)) && ("1d6b/2/310".equals(product))) {
+            mConnected = false;
+            updateVehicleCradleStateBroadcast();
+        }
+    }
+    /*
+     * broadcast intent on vehicle cradle state change
+     */
+    private void updateVehicleCradleStateBroadcast() {
+        // send a sticky broadcast containing current Vehicle Cradle state
+        Intent intent = new Intent(UsbManager.ACTION_VEHICLE_CRADLE_STATE);
+        intent.addFlags(Intent.FLAG_RECEIVER_REPLACE_PENDING
+                | Intent.FLAG_RECEIVER_FOREGROUND);
+        intent.putExtra(UsbManager.VEHICLE_CRADLE_CONNECTED, mConnected);
+        Slog.i(TAG, "vehicle cradle broadcasting " + intent + " connected: " + mConnected);
+        mContext.sendStickyBroadcastAsUser(intent, UserHandle.ALL);
+    }
+
     /* Called from JNI in monitorUsbHostBus() to report new USB configuration for the device
        currently being added.  Returns true if successful, false in case of error.
      */

 

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics