1b6af5c511a7f78e6bec870a5a0f660dabda45665Vitalii Tomkiv/*
2b6af5c511a7f78e6bec870a5a0f660dabda45665Vitalii Tomkiv * Copyright (C) 2016 The Android Open Source Project
3b6af5c511a7f78e6bec870a5a0f660dabda45665Vitalii Tomkiv *
4b6af5c511a7f78e6bec870a5a0f660dabda45665Vitalii Tomkiv * Licensed under the Apache License, Version 2.0 (the "License");
5b6af5c511a7f78e6bec870a5a0f660dabda45665Vitalii Tomkiv * you may not use this file except in compliance with the License.
6b6af5c511a7f78e6bec870a5a0f660dabda45665Vitalii Tomkiv * You may obtain a copy of the License at
7b6af5c511a7f78e6bec870a5a0f660dabda45665Vitalii Tomkiv *
8b6af5c511a7f78e6bec870a5a0f660dabda45665Vitalii Tomkiv *      http://www.apache.org/licenses/LICENSE-2.0
9b6af5c511a7f78e6bec870a5a0f660dabda45665Vitalii Tomkiv *
10b6af5c511a7f78e6bec870a5a0f660dabda45665Vitalii Tomkiv * Unless required by applicable law or agreed to in writing, software
11b6af5c511a7f78e6bec870a5a0f660dabda45665Vitalii Tomkiv * distributed under the License is distributed on an "AS IS" BASIS,
12b6af5c511a7f78e6bec870a5a0f660dabda45665Vitalii Tomkiv * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13b6af5c511a7f78e6bec870a5a0f660dabda45665Vitalii Tomkiv * See the License for the specific language governing permissions and
14b6af5c511a7f78e6bec870a5a0f660dabda45665Vitalii Tomkiv * limitations under the License.
15b6af5c511a7f78e6bec870a5a0f660dabda45665Vitalii Tomkiv */
16b6af5c511a7f78e6bec870a5a0f660dabda45665Vitalii Tomkivpackage com.google.android.car.kitchensink.setting.usb;
17b6af5c511a7f78e6bec870a5a0f660dabda45665Vitalii Tomkiv
18b6af5c511a7f78e6bec870a5a0f660dabda45665Vitalii Tomkivimport android.hardware.usb.UsbConstants;
19b6af5c511a7f78e6bec870a5a0f660dabda45665Vitalii Tomkivimport android.hardware.usb.UsbDevice;
20b6af5c511a7f78e6bec870a5a0f660dabda45665Vitalii Tomkivimport android.hardware.usb.UsbInterface;
21b6af5c511a7f78e6bec870a5a0f660dabda45665Vitalii Tomkivimport android.hardware.usb.UsbManager;
22b6af5c511a7f78e6bec870a5a0f660dabda45665Vitalii Tomkivimport android.text.TextUtils;
23b6af5c511a7f78e6bec870a5a0f660dabda45665Vitalii Tomkiv
24b6af5c511a7f78e6bec870a5a0f660dabda45665Vitalii Tomkivimport java.util.HashMap;
25b6af5c511a7f78e6bec870a5a0f660dabda45665Vitalii Tomkivimport java.util.LinkedList;
26b6af5c511a7f78e6bec870a5a0f660dabda45665Vitalii Tomkiv
27b6af5c511a7f78e6bec870a5a0f660dabda45665Vitalii Tomkiv/**
28b6af5c511a7f78e6bec870a5a0f660dabda45665Vitalii Tomkiv * Util methods to work with USB devices.
29b6af5c511a7f78e6bec870a5a0f660dabda45665Vitalii Tomkiv */
30b6af5c511a7f78e6bec870a5a0f660dabda45665Vitalii Tomkivclass UsbUtil {
31b6af5c511a7f78e6bec870a5a0f660dabda45665Vitalii Tomkiv    public static final String ADB_INTERFACE_NAME = "ADB Interface";
32b6af5c511a7f78e6bec870a5a0f660dabda45665Vitalii Tomkiv    public static final String AOAP_INTERFACE_NAME = "Android Accessory Interface";
33b6af5c511a7f78e6bec870a5a0f660dabda45665Vitalii Tomkiv    public static final String MTP_INTERFACE_NAME = "MTP";
34b6af5c511a7f78e6bec870a5a0f660dabda45665Vitalii Tomkiv
35b6af5c511a7f78e6bec870a5a0f660dabda45665Vitalii Tomkiv    public static LinkedList<UsbDevice> findAllPossibleAndroidDevices(UsbManager usbManager) {
36b6af5c511a7f78e6bec870a5a0f660dabda45665Vitalii Tomkiv        HashMap<String, UsbDevice> devices = usbManager.getDeviceList();
37b6af5c511a7f78e6bec870a5a0f660dabda45665Vitalii Tomkiv        LinkedList<UsbDevice> androidDevices = null;
38b6af5c511a7f78e6bec870a5a0f660dabda45665Vitalii Tomkiv        for (UsbDevice device : devices.values()) {
39b6af5c511a7f78e6bec870a5a0f660dabda45665Vitalii Tomkiv            if (possiblyAndroid(device)) {
40b6af5c511a7f78e6bec870a5a0f660dabda45665Vitalii Tomkiv                if (androidDevices == null) {
41b6af5c511a7f78e6bec870a5a0f660dabda45665Vitalii Tomkiv                    androidDevices = new LinkedList<>();
42b6af5c511a7f78e6bec870a5a0f660dabda45665Vitalii Tomkiv                }
43b6af5c511a7f78e6bec870a5a0f660dabda45665Vitalii Tomkiv                androidDevices.add(device);
44b6af5c511a7f78e6bec870a5a0f660dabda45665Vitalii Tomkiv            }
45b6af5c511a7f78e6bec870a5a0f660dabda45665Vitalii Tomkiv        }
46b6af5c511a7f78e6bec870a5a0f660dabda45665Vitalii Tomkiv        return androidDevices;
47b6af5c511a7f78e6bec870a5a0f660dabda45665Vitalii Tomkiv    }
48b6af5c511a7f78e6bec870a5a0f660dabda45665Vitalii Tomkiv
49b6af5c511a7f78e6bec870a5a0f660dabda45665Vitalii Tomkiv    public static boolean possiblyAndroid(UsbDevice device) {
50b6af5c511a7f78e6bec870a5a0f660dabda45665Vitalii Tomkiv        int numInterfaces = device.getInterfaceCount();
51b6af5c511a7f78e6bec870a5a0f660dabda45665Vitalii Tomkiv        for (int i = 0; i < numInterfaces; i++) {
52b6af5c511a7f78e6bec870a5a0f660dabda45665Vitalii Tomkiv            UsbInterface usbInterface = device.getInterface(i);
53b6af5c511a7f78e6bec870a5a0f660dabda45665Vitalii Tomkiv            String interfaceName = usbInterface.getName();
54b6af5c511a7f78e6bec870a5a0f660dabda45665Vitalii Tomkiv            int interfaceClass = usbInterface.getInterfaceClass();
55b6af5c511a7f78e6bec870a5a0f660dabda45665Vitalii Tomkiv            // more thorough check can be added, later
56b6af5c511a7f78e6bec870a5a0f660dabda45665Vitalii Tomkiv            if (AOAP_INTERFACE_NAME.equals(interfaceName)
57b6af5c511a7f78e6bec870a5a0f660dabda45665Vitalii Tomkiv                    || ADB_INTERFACE_NAME.equals(interfaceName)
58b6af5c511a7f78e6bec870a5a0f660dabda45665Vitalii Tomkiv                    || MTP_INTERFACE_NAME.equals(interfaceName)
59b6af5c511a7f78e6bec870a5a0f660dabda45665Vitalii Tomkiv                    || interfaceClass == UsbConstants.USB_CLASS_MASS_STORAGE) {
60b6af5c511a7f78e6bec870a5a0f660dabda45665Vitalii Tomkiv                return true;
61b6af5c511a7f78e6bec870a5a0f660dabda45665Vitalii Tomkiv            }
62b6af5c511a7f78e6bec870a5a0f660dabda45665Vitalii Tomkiv        }
63b6af5c511a7f78e6bec870a5a0f660dabda45665Vitalii Tomkiv        return false;
64b6af5c511a7f78e6bec870a5a0f660dabda45665Vitalii Tomkiv    }
65b6af5c511a7f78e6bec870a5a0f660dabda45665Vitalii Tomkiv
66b6af5c511a7f78e6bec870a5a0f660dabda45665Vitalii Tomkiv    public static boolean isTheSameDevice(UsbDevice l, UsbDevice r) {
67b6af5c511a7f78e6bec870a5a0f660dabda45665Vitalii Tomkiv        if (TextUtils.equals(l.getManufacturerName(), r.getManufacturerName())
68b6af5c511a7f78e6bec870a5a0f660dabda45665Vitalii Tomkiv                && TextUtils.equals(l.getProductName(), r.getProductName())
69b6af5c511a7f78e6bec870a5a0f660dabda45665Vitalii Tomkiv                && TextUtils.equals(l.getSerialNumber(), r.getSerialNumber())) {
70b6af5c511a7f78e6bec870a5a0f660dabda45665Vitalii Tomkiv            return true;
71b6af5c511a7f78e6bec870a5a0f660dabda45665Vitalii Tomkiv        }
72b6af5c511a7f78e6bec870a5a0f660dabda45665Vitalii Tomkiv        return false;
73b6af5c511a7f78e6bec870a5a0f660dabda45665Vitalii Tomkiv    }
74b6af5c511a7f78e6bec870a5a0f660dabda45665Vitalii Tomkiv
75b6af5c511a7f78e6bec870a5a0f660dabda45665Vitalii Tomkiv    public static boolean isDevicesMatching(UsbDevice l, UsbDevice r) {
76b6af5c511a7f78e6bec870a5a0f660dabda45665Vitalii Tomkiv        if (l.getVendorId() == r.getVendorId() && l.getProductId() == r.getProductId()
77b6af5c511a7f78e6bec870a5a0f660dabda45665Vitalii Tomkiv                && TextUtils.equals(l.getSerialNumber(), r.getSerialNumber())) {
78b6af5c511a7f78e6bec870a5a0f660dabda45665Vitalii Tomkiv            return true;
79b6af5c511a7f78e6bec870a5a0f660dabda45665Vitalii Tomkiv        }
80b6af5c511a7f78e6bec870a5a0f660dabda45665Vitalii Tomkiv        return false;
81b6af5c511a7f78e6bec870a5a0f660dabda45665Vitalii Tomkiv    }
82b6af5c511a7f78e6bec870a5a0f660dabda45665Vitalii Tomkiv
83b6af5c511a7f78e6bec870a5a0f660dabda45665Vitalii Tomkiv    public static boolean isDeviceConnected(UsbManager usbManager, UsbDevice device) {
84b6af5c511a7f78e6bec870a5a0f660dabda45665Vitalii Tomkiv        HashMap<String, UsbDevice> devices = usbManager.getDeviceList();
85b6af5c511a7f78e6bec870a5a0f660dabda45665Vitalii Tomkiv        for (UsbDevice dev : devices.values()) {
86b6af5c511a7f78e6bec870a5a0f660dabda45665Vitalii Tomkiv            if (isDevicesMatching(dev, device)) {
87b6af5c511a7f78e6bec870a5a0f660dabda45665Vitalii Tomkiv                return true;
88b6af5c511a7f78e6bec870a5a0f660dabda45665Vitalii Tomkiv            }
89b6af5c511a7f78e6bec870a5a0f660dabda45665Vitalii Tomkiv        }
90b6af5c511a7f78e6bec870a5a0f660dabda45665Vitalii Tomkiv        return false;
91b6af5c511a7f78e6bec870a5a0f660dabda45665Vitalii Tomkiv    }
92b6af5c511a7f78e6bec870a5a0f660dabda45665Vitalii Tomkiv}
93