]> sigrok.org Git - sigrok-androidutils.git/blame - src/org/sigrok/androidutils/UsbEventMonitor.java
UsbHelper: Add additional methods for device enumeration and monitoring
[sigrok-androidutils.git] / src / org / sigrok / androidutils / UsbEventMonitor.java
CommitLineData
054991d3
MC
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
20package org.sigrok.androidutils;
21
22import android.content.BroadcastReceiver;
23import android.content.Context;
24import android.content.Intent;
25import android.content.IntentFilter;
26import android.hardware.usb.UsbDevice;
27import android.hardware.usb.UsbManager;
28import android.util.Log;
29
30final 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}