Add UsbMonitor
[rtmpclient.git] / app / src / main / java / ai / suanzi / rtmpclient / UsbMonitor.java
index fc8bbdd..f1e06f0 100644 (file)
@@ -1,4 +1,112 @@
 package ai.suanzi.rtmpclient;
 
+import android.hardware.usb.UsbManager;
+import android.content.Context;
+import android.hardware.usb.UsbDevice;
+import android.hardware.usb.UsbDeviceConnection;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.ListIterator;
+import java.util.List;
+import org.apache.log4j.Logger;
+import android.app.PendingIntent;
+import android.content.Intent;
+import android.content.IntentFilter;
+import android.content.BroadcastReceiver;
+
 public class UsbMonitor {
+
+    private UsbListener mListener;
+    private Context mContext;
+    private UsbManager mUsbManager;
+    private List<UsbDevice> mUsbCameraList = new ArrayList<>();
+
+    private static Logger gLogger = Logger.getLogger("UsbMonitor");
+
+    public UsbMonitor(UsbListener listener, Context context){
+        mListener = listener;
+        mContext = context;
+        mUsbManager = (UsbManager) mContext.getSystemService(Context.USB_SERVICE);
+
+        HashMap<String, UsbDevice> deviceList = mUsbManager.getDeviceList();
+        gLogger.error("device list size : " + deviceList.size());
+        Iterator<UsbDevice> deviceIterator = deviceList.values().iterator();
+        //PendingIntent mPermissionIntent = PendingIntent.getBroadcast(mContext, 0, new Intent(ACTION_USB_PERMISSION), 0);
+        IntentFilter filter = new IntentFilter(UsbManager.ACTION_USB_DEVICE_DETACHED);
+        mContext.registerReceiver(mUsbReceiver, filter);
+        filter = new IntentFilter(UsbManager.ACTION_USB_DEVICE_ATTACHED);
+        mContext.registerReceiver(mUsbReceiver, filter);
+        filter = new IntentFilter(ACTION_USB_PERMISSION);
+        mContext.registerReceiver(mUsbReceiver, filter);
+
+        while (deviceIterator.hasNext()) {
+            UsbDevice device = deviceIterator.next();
+            gLogger.error(device.toString());
+            if(isUvcCamera(device))  mUsbCameraList.add(device);
+        }
+            //mUsbManager.requestPermission(device, mPermissionIntent);
+    }
+
+    private boolean isUvcCamera(UsbDevice device){
+        return (device.getDeviceProtocol() == 1 && device.getProductName().contains("Camera"));
+    }
+
+    public boolean hasUsbCamera(){
+        gLogger.error("hasUsbCamera - size: " + mUsbCameraList.size());
+        return (mUsbCameraList.size() > 0 ? true : false);
+    }
+
+    public int getUsbCameraCount(){
+        return mUsbCameraList.size();
+    }
+
+    private static final String ACTION_USB_PERMISSION =  "ai.suanzi.rtmpclient.UsbMonitor.USB_PERMISSION";
+
+    private final BroadcastReceiver mUsbReceiver = new BroadcastReceiver() {
+
+        public void onReceive(Context context, Intent intent) {
+            gLogger.error("onReceive");
+            String action = intent.getAction();
+            if (ACTION_USB_PERMISSION.equals(action)) {
+                synchronized (this) {
+                    UsbDevice device = (UsbDevice)intent.getParcelableExtra(UsbManager.EXTRA_DEVICE);
+
+                    if (intent.getBooleanExtra(UsbManager.EXTRA_PERMISSION_GRANTED, true)) {
+                        if(device != null){
+                            gLogger.error( "extra permission granted");
+                            //call method to set up device communication
+                        }
+                    }
+                    else {
+                        gLogger.error("permission denied for device. " + device);
+                    }
+                }
+            } else if (UsbManager.ACTION_USB_DEVICE_DETACHED.equals(action)){
+                UsbDevice device = (UsbDevice)intent.getParcelableExtra(UsbManager.EXTRA_DEVICE);
+                if (device != null){
+                    gLogger.error("Device plug out");
+                    gLogger.error(device.toString());
+                    if(isUvcCamera(device)) {
+                        mUsbCameraList.remove(device);
+                        mListener.onCameraConnected();
+                    }
+                }
+            } else if (UsbManager.ACTION_USB_DEVICE_ATTACHED.equals(action)) {
+                UsbDevice device = (UsbDevice)intent.getParcelableExtra(UsbManager.EXTRA_DEVICE);
+                gLogger.error("Device plug in");
+                gLogger.error(device.toString());
+                if(isUvcCamera(device)) {
+                    mUsbCameraList.add(device);
+                    mListener.onCameraDisconnected();
+                }
+            }
+        }
+    };
+
+    public interface UsbListener {
+        void onCameraConnected();
+        void onCameraDisconnected();
+    }
 }