]> sigrok.org Git - sigrok-androidutils.git/blob - src/org/sigrok/androidutils/UsbEventMonitor.java
UsbHelper: Add additional methods for device enumeration and monitoring
[sigrok-androidutils.git] / src / org / sigrok / androidutils / UsbEventMonitor.java
1 /*
2  * This file is part of the sigrok-androidutils project.
3  *
4  * Copyright (C) 2016 Marcus Comstedt <marcus@mc.pp.se>
5  *
6  * This program is free software: you can redistribute it and/or modify
7  * it under the terms of the GNU General Public License as published by
8  * the Free Software Foundation, either version 3 of the License, or
9  * (at your option) any later version.
10  *
11  * This program is distributed in the hope that it will be useful,
12  * but WITHOUT ANY WARRANTY; without even the implied warranty of
13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14  * GNU General Public License for more details.
15  *
16  * You should have received a copy of the GNU General Public License
17  * along with this program.  If not, see <http://www.gnu.org/licenses/>.
18  */
19
20 package org.sigrok.androidutils;
21
22 import android.content.BroadcastReceiver;
23 import android.content.Context;
24 import android.content.Intent;
25 import android.content.IntentFilter;
26 import android.hardware.usb.UsbDevice;
27 import android.hardware.usb.UsbManager;
28 import android.util.Log;
29
30 final class UsbEventMonitor
31 {
32         private final Context context;
33         private final UsbManager manager;
34         private final UsbEventListener listener;
35         private final BroadcastReceiver permReceiver;
36         private final BroadcastReceiver hotplugReceiver;
37         private final IntentFilter permFilter;
38         private final IntentFilter hotplugFilter;
39
40         UsbEventMonitor(Context context, UsbManager manager, UsbEventListener listener)
41         {
42                 this.context = context;
43                 this.manager = manager;
44                 this.listener = listener;
45                 permReceiver = new BroadcastReceiver() {
46                         @Override
47                         public void onReceive(Context context, Intent intent) {
48                                 String action = intent.getAction();
49                                 if (UsbSupplicant.ACTION_USB_PERMISSION.equals(action)) {
50                                         permissionCallback((UsbDevice)intent.getParcelableExtra(
51                                                 UsbManager.EXTRA_DEVICE), intent.getBooleanExtra(
52                                                 UsbManager.EXTRA_PERMISSION_GRANTED, false));
53                                 }
54                         }
55                 };
56                 hotplugReceiver = new BroadcastReceiver() {
57                         @Override
58                         public void onReceive(Context context, Intent intent) {
59                                 if (intent != null && UsbManager.ACTION_USB_DEVICE_ATTACHED.equals(intent.getAction())) {
60                                         attachCallback((UsbDevice)intent.getParcelableExtra(UsbManager.EXTRA_DEVICE));
61                                 } else if (intent != null && UsbManager.ACTION_USB_DEVICE_DETACHED.equals(intent.getAction())) {
62                                         detachCallback((UsbDevice)intent.getParcelableExtra(UsbManager.EXTRA_DEVICE));
63                                 }
64                         }
65                 };
66                 permFilter = new IntentFilter(UsbSupplicant.ACTION_USB_PERMISSION);
67                 hotplugFilter = new IntentFilter(UsbManager.ACTION_USB_DEVICE_ATTACHED);
68                 hotplugFilter.addAction(UsbManager.ACTION_USB_DEVICE_DETACHED);
69         }
70
71         synchronized void start()
72         {
73                 context.registerReceiver(permReceiver, permFilter);
74                 context.registerReceiver(hotplugReceiver, hotplugFilter);
75         }
76
77         synchronized void stop()
78         {
79                 context.unregisterReceiver(hotplugReceiver);
80                 context.unregisterReceiver(permReceiver);
81         }
82
83         private void permissionCallback(UsbDevice dev, boolean granted)
84         {
85                 Log.d("UsbEventMonitor", "permission " +
86                       (granted ? "granted" : "denied") + " for device " + dev);
87                 addRemoveDevice(dev, !granted);
88         }
89
90         private void attachCallback(UsbDevice dev)
91         {
92                 Log.d("UsbEventMonitor", "device " + dev + "added");
93                 if (manager.hasPermission(dev))
94                         addRemoveDevice(dev, false);
95         }
96
97         private void detachCallback(UsbDevice dev)
98         {
99                 Log.d("UsbEventMonitor", "device " + dev + "removed");
100                 addRemoveDevice(dev, true);
101         }
102
103         private synchronized void addRemoveDevice(UsbDevice dev, boolean removed)
104         {
105                 listener.onUsbDeviceAction(dev.getDeviceName(), removed);
106         }
107 }