61481ee7380edc9d36857431c014e44a64b85fcf
[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     private boolean isUvcCamera(UsbDevice device){
51         return (device.getDeviceProtocol() == 1 && device.getProductName().contains("Camera"));
52     }
53
54     public boolean hasUsbCamera(){
55         gLogger.error("hasUsbCamera - size: " + mUsbCameraList.size());
56         return (mUsbCameraList.size() > 0 ? true : false);
57     }
58
59     public int getUsbCameraCount(){
60         return mUsbCameraList.size();
61     }
62
63     private static final String ACTION_USB_PERMISSION =  "ai.suanzi.rtmpclient.UsbMonitor.USB_PERMISSION";
64
65     private final BroadcastReceiver mUsbReceiver = new BroadcastReceiver() {
66
67         public void onReceive(Context context, Intent intent) {
68             gLogger.error("onReceive");
69             String action = intent.getAction();
70             if (ACTION_USB_PERMISSION.equals(action)) {
71                 synchronized (this) {
72                     UsbDevice device = (UsbDevice)intent.getParcelableExtra(UsbManager.EXTRA_DEVICE);
73
74                     if (intent.getBooleanExtra(UsbManager.EXTRA_PERMISSION_GRANTED, true)) {
75                         if(device != null){
76                             gLogger.error( "extra permission granted");
77                             //call method to set up device communication
78                         }
79                     }
80                     else {
81                         gLogger.error("permission denied for device. " + device);
82                     }
83                 }
84             } else if (UsbManager.ACTION_USB_DEVICE_DETACHED.equals(action)){
85                 UsbDevice device = (UsbDevice)intent.getParcelableExtra(UsbManager.EXTRA_DEVICE);
86                 if (device != null){
87                     gLogger.error("Device plug out");
88                     gLogger.error(device.toString());
89                     if(isUvcCamera(device)) {
90                         mUsbCameraList.remove(device);
91                         mListener.onCameraConnected();
92                     }
93                 }
94             } else if (UsbManager.ACTION_USB_DEVICE_ATTACHED.equals(action)) {
95                 UsbDevice device = (UsbDevice)intent.getParcelableExtra(UsbManager.EXTRA_DEVICE);
96                 gLogger.error("Device plug in");
97                 gLogger.error(device.toString());
98                 if(isUvcCamera(device)) {
99                     mUsbCameraList.add(device);
100                     mListener.onCameraDisconnected();
101                 }
102             }
103         }
104     };
105
106     public interface UsbListener {
107         void onCameraConnected();
108         void onCameraDisconnected();
109     }
110 }