f1e06f042bcabf723a597bd03d4f00cea1ffc805
[rtmpclient.git] / app / src / main / java / ai / suanzi / rtmpclient / UsbMonitor.java
1 package ai.suanzi.rtmpclient;
2
3 import android.hardware.usb.UsbManager;
4 import android.content.Context;
5 import android.hardware.usb.UsbDevice;
6 import android.hardware.usb.UsbDeviceConnection;
7
8 import java.util.ArrayList;
9 import java.util.HashMap;
10 import java.util.Iterator;
11 import java.util.ListIterator;
12 import java.util.List;
13 import org.apache.log4j.Logger;
14 import android.app.PendingIntent;
15 import android.content.Intent;
16 import android.content.IntentFilter;
17 import android.content.BroadcastReceiver;
18
19 public class UsbMonitor {
20
21     private UsbListener mListener;
22     private Context mContext;
23     private UsbManager mUsbManager;
24     private List<UsbDevice> mUsbCameraList = new ArrayList<>();
25
26     private static Logger gLogger = Logger.getLogger("UsbMonitor");
27
28     public UsbMonitor(UsbListener listener, Context context){
29         mListener = listener;
30         mContext = context;
31         mUsbManager = (UsbManager) mContext.getSystemService(Context.USB_SERVICE);
32
33         HashMap<String, UsbDevice> deviceList = mUsbManager.getDeviceList();
34         gLogger.error("device list size : " + deviceList.size());
35         Iterator<UsbDevice> deviceIterator = deviceList.values().iterator();
36         //PendingIntent mPermissionIntent = PendingIntent.getBroadcast(mContext, 0, new Intent(ACTION_USB_PERMISSION), 0);
37         IntentFilter filter = new IntentFilter(UsbManager.ACTION_USB_DEVICE_DETACHED);
38         mContext.registerReceiver(mUsbReceiver, filter);
39         filter = new IntentFilter(UsbManager.ACTION_USB_DEVICE_ATTACHED);
40         mContext.registerReceiver(mUsbReceiver, filter);
41         filter = new IntentFilter(ACTION_USB_PERMISSION);
42         mContext.registerReceiver(mUsbReceiver, filter);
43
44         while (deviceIterator.hasNext()) {
45             UsbDevice device = deviceIterator.next();
46             gLogger.error(device.toString());
47             if(isUvcCamera(device))  mUsbCameraList.add(device);
48         }
49             //mUsbManager.requestPermission(device, mPermissionIntent);
50     }
51
52     private boolean isUvcCamera(UsbDevice device){
53         return (device.getDeviceProtocol() == 1 && device.getProductName().contains("Camera"));
54     }
55
56     public boolean hasUsbCamera(){
57         gLogger.error("hasUsbCamera - size: " + mUsbCameraList.size());
58         return (mUsbCameraList.size() > 0 ? true : false);
59     }
60
61     public int getUsbCameraCount(){
62         return mUsbCameraList.size();
63     }
64
65     private static final String ACTION_USB_PERMISSION =  "ai.suanzi.rtmpclient.UsbMonitor.USB_PERMISSION";
66
67     private final BroadcastReceiver mUsbReceiver = new BroadcastReceiver() {
68
69         public void onReceive(Context context, Intent intent) {
70             gLogger.error("onReceive");
71             String action = intent.getAction();
72             if (ACTION_USB_PERMISSION.equals(action)) {
73                 synchronized (this) {
74                     UsbDevice device = (UsbDevice)intent.getParcelableExtra(UsbManager.EXTRA_DEVICE);
75
76                     if (intent.getBooleanExtra(UsbManager.EXTRA_PERMISSION_GRANTED, true)) {
77                         if(device != null){
78                             gLogger.error( "extra permission granted");
79                             //call method to set up device communication
80                         }
81                     }
82                     else {
83                         gLogger.error("permission denied for device. " + device);
84                     }
85                 }
86             } else if (UsbManager.ACTION_USB_DEVICE_DETACHED.equals(action)){
87                 UsbDevice device = (UsbDevice)intent.getParcelableExtra(UsbManager.EXTRA_DEVICE);
88                 if (device != null){
89                     gLogger.error("Device plug out");
90                     gLogger.error(device.toString());
91                     if(isUvcCamera(device)) {
92                         mUsbCameraList.remove(device);
93                         mListener.onCameraConnected();
94                     }
95                 }
96             } else if (UsbManager.ACTION_USB_DEVICE_ATTACHED.equals(action)) {
97                 UsbDevice device = (UsbDevice)intent.getParcelableExtra(UsbManager.EXTRA_DEVICE);
98                 gLogger.error("Device plug in");
99                 gLogger.error(device.toString());
100                 if(isUvcCamera(device)) {
101                     mUsbCameraList.add(device);
102                     mListener.onCameraDisconnected();
103                 }
104             }
105         }
106     };
107
108     public interface UsbListener {
109         void onCameraConnected();
110         void onCameraDisconnected();
111     }
112 }