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