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