UsbDeviceManager.java revision 50cdf7c3069eb2cf82acbad73c322b7a5f3af4b1
146d0adf8256a42416584765625852b6e48497c90Mike Lockwood/* 246d0adf8256a42416584765625852b6e48497c90Mike Lockwood * Copyright (C) 2011 The Android Open Source Project 346d0adf8256a42416584765625852b6e48497c90Mike Lockwood * 446d0adf8256a42416584765625852b6e48497c90Mike Lockwood * Licensed under the Apache License, Version 2.0 (the "License"); 546d0adf8256a42416584765625852b6e48497c90Mike Lockwood * you may not use this file except in compliance with the License. 646d0adf8256a42416584765625852b6e48497c90Mike Lockwood * You may obtain a copy of the License at 746d0adf8256a42416584765625852b6e48497c90Mike Lockwood * 846d0adf8256a42416584765625852b6e48497c90Mike Lockwood * http://www.apache.org/licenses/LICENSE-2.0 946d0adf8256a42416584765625852b6e48497c90Mike Lockwood * 1046d0adf8256a42416584765625852b6e48497c90Mike Lockwood * Unless required by applicable law or agreed to in writing, software 1146d0adf8256a42416584765625852b6e48497c90Mike Lockwood * distributed under the License is distributed on an "AS IS" BASIS, 1246d0adf8256a42416584765625852b6e48497c90Mike Lockwood * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 1346d0adf8256a42416584765625852b6e48497c90Mike Lockwood * See the License for the specific language governing permissions an 1446d0adf8256a42416584765625852b6e48497c90Mike Lockwood * limitations under the License. 1546d0adf8256a42416584765625852b6e48497c90Mike Lockwood */ 1646d0adf8256a42416584765625852b6e48497c90Mike Lockwood 1746d0adf8256a42416584765625852b6e48497c90Mike Lockwoodpackage com.android.server.usb; 1846d0adf8256a42416584765625852b6e48497c90Mike Lockwood 1946d0adf8256a42416584765625852b6e48497c90Mike Lockwoodimport android.app.PendingIntent; 20541c9949ae9c05636d3e0442aa5080815121a042Mike Lockwoodimport android.app.Notification; 21541c9949ae9c05636d3e0442aa5080815121a042Mike Lockwoodimport android.app.NotificationManager; 22d462ecf8f82076d21c85bdeeefbd16a1a91d2805Mike Lockwoodimport android.content.BroadcastReceiver; 23541c9949ae9c05636d3e0442aa5080815121a042Mike Lockwoodimport android.content.ComponentName; 2446d0adf8256a42416584765625852b6e48497c90Mike Lockwoodimport android.content.ContentResolver; 2546d0adf8256a42416584765625852b6e48497c90Mike Lockwoodimport android.content.Context; 2646d0adf8256a42416584765625852b6e48497c90Mike Lockwoodimport android.content.Intent; 2746d0adf8256a42416584765625852b6e48497c90Mike Lockwoodimport android.content.IntentFilter; 2846d0adf8256a42416584765625852b6e48497c90Mike Lockwoodimport android.content.pm.PackageManager; 29541c9949ae9c05636d3e0442aa5080815121a042Mike Lockwoodimport android.content.res.Resources; 30541c9949ae9c05636d3e0442aa5080815121a042Mike Lockwoodimport android.database.ContentObserver; 3146d0adf8256a42416584765625852b6e48497c90Mike Lockwoodimport android.hardware.usb.UsbAccessory; 3246d0adf8256a42416584765625852b6e48497c90Mike Lockwoodimport android.hardware.usb.UsbManager; 3346d0adf8256a42416584765625852b6e48497c90Mike Lockwoodimport android.net.Uri; 3446d0adf8256a42416584765625852b6e48497c90Mike Lockwoodimport android.os.Binder; 3546d0adf8256a42416584765625852b6e48497c90Mike Lockwoodimport android.os.Bundle; 3602e4569b5f126ca916a7473117ddd17d4f2ccbbbMike Lockwoodimport android.os.FileUtils; 3746d0adf8256a42416584765625852b6e48497c90Mike Lockwoodimport android.os.Handler; 3802e4569b5f126ca916a7473117ddd17d4f2ccbbbMike Lockwoodimport android.os.HandlerThread; 3902e4569b5f126ca916a7473117ddd17d4f2ccbbbMike Lockwoodimport android.os.Looper; 4046d0adf8256a42416584765625852b6e48497c90Mike Lockwoodimport android.os.Message; 4146d0adf8256a42416584765625852b6e48497c90Mike Lockwoodimport android.os.Parcelable; 4246d0adf8256a42416584765625852b6e48497c90Mike Lockwoodimport android.os.ParcelFileDescriptor; 4302e4569b5f126ca916a7473117ddd17d4f2ccbbbMike Lockwoodimport android.os.Process; 445ac72a29593ab9a20337a2225df52bdf4754be02Dianne Hackbornimport android.os.UserHandle; 4502e4569b5f126ca916a7473117ddd17d4f2ccbbbMike Lockwoodimport android.os.storage.StorageManager; 4602e4569b5f126ca916a7473117ddd17d4f2ccbbbMike Lockwoodimport android.os.storage.StorageVolume; 47dab2072365565b4892be7910b0cdb870e83689f6RoboErikimport android.os.SystemClock; 48541c9949ae9c05636d3e0442aa5080815121a042Mike Lockwoodimport android.os.SystemProperties; 4946d0adf8256a42416584765625852b6e48497c90Mike Lockwoodimport android.os.UEventObserver; 5046d0adf8256a42416584765625852b6e48497c90Mike Lockwoodimport android.provider.Settings; 51afd8f1820eeee21e960be44b22113dc2cecacf98Kazuhiro Ondoimport android.util.Pair; 5246d0adf8256a42416584765625852b6e48497c90Mike Lockwoodimport android.util.Slog; 5346d0adf8256a42416584765625852b6e48497c90Mike Lockwood 5446d0adf8256a42416584765625852b6e48497c90Mike Lockwoodimport java.io.File; 5546d0adf8256a42416584765625852b6e48497c90Mike Lockwoodimport java.io.FileDescriptor; 5646d0adf8256a42416584765625852b6e48497c90Mike Lockwoodimport java.io.FileNotFoundException; 5702e4569b5f126ca916a7473117ddd17d4f2ccbbbMike Lockwoodimport java.io.IOException; 5846d0adf8256a42416584765625852b6e48497c90Mike Lockwoodimport java.io.PrintWriter; 5946d0adf8256a42416584765625852b6e48497c90Mike Lockwoodimport java.util.ArrayList; 60afd8f1820eeee21e960be44b22113dc2cecacf98Kazuhiro Ondoimport java.util.LinkedList; 6146d0adf8256a42416584765625852b6e48497c90Mike Lockwoodimport java.util.List; 62afd8f1820eeee21e960be44b22113dc2cecacf98Kazuhiro Ondoimport java.util.HashMap; 63afd8f1820eeee21e960be44b22113dc2cecacf98Kazuhiro Ondoimport java.util.Map; 649d5a4be05b6d51ebb768e5fbcfa27ed9a39269b3Mike Lockwoodimport java.util.Scanner; 6546d0adf8256a42416584765625852b6e48497c90Mike Lockwood 6646d0adf8256a42416584765625852b6e48497c90Mike Lockwood/** 6746d0adf8256a42416584765625852b6e48497c90Mike Lockwood * UsbDeviceManager manages USB state in device mode. 6846d0adf8256a42416584765625852b6e48497c90Mike Lockwood */ 6946d0adf8256a42416584765625852b6e48497c90Mike Lockwoodpublic class UsbDeviceManager { 7002e4569b5f126ca916a7473117ddd17d4f2ccbbbMike Lockwood 7146d0adf8256a42416584765625852b6e48497c90Mike Lockwood private static final String TAG = UsbDeviceManager.class.getSimpleName(); 72fdc0c2984d05e32954608f46514c4cbe3a5a9424Mike Lockwood private static final boolean DEBUG = false; 7346d0adf8256a42416584765625852b6e48497c90Mike Lockwood 7402e4569b5f126ca916a7473117ddd17d4f2ccbbbMike Lockwood private static final String USB_STATE_MATCH = 7502e4569b5f126ca916a7473117ddd17d4f2ccbbbMike Lockwood "DEVPATH=/devices/virtual/android_usb/android0"; 7602e4569b5f126ca916a7473117ddd17d4f2ccbbbMike Lockwood private static final String ACCESSORY_START_MATCH = 7702e4569b5f126ca916a7473117ddd17d4f2ccbbbMike Lockwood "DEVPATH=/devices/virtual/misc/usb_accessory"; 7802e4569b5f126ca916a7473117ddd17d4f2ccbbbMike Lockwood private static final String FUNCTIONS_PATH = 7902e4569b5f126ca916a7473117ddd17d4f2ccbbbMike Lockwood "/sys/class/android_usb/android0/functions"; 8002e4569b5f126ca916a7473117ddd17d4f2ccbbbMike Lockwood private static final String STATE_PATH = 8102e4569b5f126ca916a7473117ddd17d4f2ccbbbMike Lockwood "/sys/class/android_usb/android0/state"; 8202e4569b5f126ca916a7473117ddd17d4f2ccbbbMike Lockwood private static final String MASS_STORAGE_FILE_PATH = 83629b149ff584bc247f68014a676101d1d5787d27Mike Lockwood "/sys/class/android_usb/android0/f_mass_storage/lun/file"; 84629b149ff584bc247f68014a676101d1d5787d27Mike Lockwood private static final String RNDIS_ETH_ADDR_PATH = 85629b149ff584bc247f68014a676101d1d5787d27Mike Lockwood "/sys/class/android_usb/android0/f_rndis/ethaddr"; 869d5a4be05b6d51ebb768e5fbcfa27ed9a39269b3Mike Lockwood private static final String AUDIO_SOURCE_PCM_PATH = 879d5a4be05b6d51ebb768e5fbcfa27ed9a39269b3Mike Lockwood "/sys/class/android_usb/android0/f_audio_source/pcm"; 8846d0adf8256a42416584765625852b6e48497c90Mike Lockwood 8946d0adf8256a42416584765625852b6e48497c90Mike Lockwood private static final int MSG_UPDATE_STATE = 0; 9002e4569b5f126ca916a7473117ddd17d4f2ccbbbMike Lockwood private static final int MSG_ENABLE_ADB = 1; 91166b05e0ce913711d27ce1a116b3f1fd906822e4Mike Lockwood private static final int MSG_SET_CURRENT_FUNCTIONS = 2; 92f59717ddb5ef324ee3fdb12b83e7d1b709793d28Mike Lockwood private static final int MSG_SYSTEM_READY = 3; 93d462ecf8f82076d21c85bdeeefbd16a1a91d2805Mike Lockwood private static final int MSG_BOOT_COMPLETED = 4; 9427bd34d9d9fe99f11b80aa0bbdb402fb47ef4158Jeff Sharkey private static final int MSG_USER_SWITCHED = 5; 9546d0adf8256a42416584765625852b6e48497c90Mike Lockwood 96166b05e0ce913711d27ce1a116b3f1fd906822e4Mike Lockwood private static final int AUDIO_MODE_NONE = 0; 97166b05e0ce913711d27ce1a116b3f1fd906822e4Mike Lockwood private static final int AUDIO_MODE_SOURCE = 1; 98166b05e0ce913711d27ce1a116b3f1fd906822e4Mike Lockwood 9946d0adf8256a42416584765625852b6e48497c90Mike Lockwood // Delay for debouncing USB disconnects. 10046d0adf8256a42416584765625852b6e48497c90Mike Lockwood // We often get rapid connect/disconnect events when enabling USB functions, 10146d0adf8256a42416584765625852b6e48497c90Mike Lockwood // which need debouncing. 10246d0adf8256a42416584765625852b6e48497c90Mike Lockwood private static final int UPDATE_DELAY = 1000; 10346d0adf8256a42416584765625852b6e48497c90Mike Lockwood 104afd8f1820eeee21e960be44b22113dc2cecacf98Kazuhiro Ondo private static final String BOOT_MODE_PROPERTY = "ro.bootmode"; 105afd8f1820eeee21e960be44b22113dc2cecacf98Kazuhiro Ondo 10602e4569b5f126ca916a7473117ddd17d4f2ccbbbMike Lockwood private UsbHandler mHandler; 107d462ecf8f82076d21c85bdeeefbd16a1a91d2805Mike Lockwood private boolean mBootCompleted; 10846d0adf8256a42416584765625852b6e48497c90Mike Lockwood 10946d0adf8256a42416584765625852b6e48497c90Mike Lockwood private final Context mContext; 11002e4569b5f126ca916a7473117ddd17d4f2ccbbbMike Lockwood private final ContentResolver mContentResolver; 11146d0adf8256a42416584765625852b6e48497c90Mike Lockwood private final UsbSettingsManager mSettingsManager; 112541c9949ae9c05636d3e0442aa5080815121a042Mike Lockwood private NotificationManager mNotificationManager; 11346d0adf8256a42416584765625852b6e48497c90Mike Lockwood private final boolean mHasUsbAccessory; 1145787a2d5b4e5bd60087eb7fbb13c97c7d0ba113eMike Lockwood private boolean mUseUsbNotification; 115541c9949ae9c05636d3e0442aa5080815121a042Mike Lockwood private boolean mAdbEnabled; 1169d5a4be05b6d51ebb768e5fbcfa27ed9a39269b3Mike Lockwood private boolean mAudioSourceEnabled; 117afd8f1820eeee21e960be44b22113dc2cecacf98Kazuhiro Ondo private Map<String, List<Pair<String, String>>> mOemModeMap; 118166b05e0ce913711d27ce1a116b3f1fd906822e4Mike Lockwood private String[] mAccessoryStrings; 1194e68bd420b6cfdbeadb5e69aa6448665b2da762bBenoit Goby private UsbDebuggingManager mDebuggingManager; 120541c9949ae9c05636d3e0442aa5080815121a042Mike Lockwood 121541c9949ae9c05636d3e0442aa5080815121a042Mike Lockwood private class AdbSettingsObserver extends ContentObserver { 122541c9949ae9c05636d3e0442aa5080815121a042Mike Lockwood public AdbSettingsObserver() { 123541c9949ae9c05636d3e0442aa5080815121a042Mike Lockwood super(null); 124541c9949ae9c05636d3e0442aa5080815121a042Mike Lockwood } 125541c9949ae9c05636d3e0442aa5080815121a042Mike Lockwood @Override 126541c9949ae9c05636d3e0442aa5080815121a042Mike Lockwood public void onChange(boolean selfChange) { 12702e4569b5f126ca916a7473117ddd17d4f2ccbbbMike Lockwood boolean enable = (Settings.Secure.getInt(mContentResolver, 12802e4569b5f126ca916a7473117ddd17d4f2ccbbbMike Lockwood Settings.Secure.ADB_ENABLED, 0) > 0); 12902e4569b5f126ca916a7473117ddd17d4f2ccbbbMike Lockwood mHandler.sendMessage(MSG_ENABLE_ADB, enable); 130541c9949ae9c05636d3e0442aa5080815121a042Mike Lockwood } 131541c9949ae9c05636d3e0442aa5080815121a042Mike Lockwood } 132541c9949ae9c05636d3e0442aa5080815121a042Mike Lockwood 13346d0adf8256a42416584765625852b6e48497c90Mike Lockwood /* 13446d0adf8256a42416584765625852b6e48497c90Mike Lockwood * Listens for uevent messages from the kernel to monitor the USB state 13546d0adf8256a42416584765625852b6e48497c90Mike Lockwood */ 13646d0adf8256a42416584765625852b6e48497c90Mike Lockwood private final UEventObserver mUEventObserver = new UEventObserver() { 13746d0adf8256a42416584765625852b6e48497c90Mike Lockwood @Override 13846d0adf8256a42416584765625852b6e48497c90Mike Lockwood public void onUEvent(UEventObserver.UEvent event) { 139fdc0c2984d05e32954608f46514c4cbe3a5a9424Mike Lockwood if (DEBUG) Slog.v(TAG, "USB UEVENT: " + event.toString()); 14046d0adf8256a42416584765625852b6e48497c90Mike Lockwood 14102e4569b5f126ca916a7473117ddd17d4f2ccbbbMike Lockwood String state = event.get("USB_STATE"); 14202e4569b5f126ca916a7473117ddd17d4f2ccbbbMike Lockwood String accessory = event.get("ACCESSORY"); 14302e4569b5f126ca916a7473117ddd17d4f2ccbbbMike Lockwood if (state != null) { 14402e4569b5f126ca916a7473117ddd17d4f2ccbbbMike Lockwood mHandler.updateState(state); 14502e4569b5f126ca916a7473117ddd17d4f2ccbbbMike Lockwood } else if ("START".equals(accessory)) { 146fdc0c2984d05e32954608f46514c4cbe3a5a9424Mike Lockwood if (DEBUG) Slog.d(TAG, "got accessory start"); 147166b05e0ce913711d27ce1a116b3f1fd906822e4Mike Lockwood startAccessoryMode(); 14846d0adf8256a42416584765625852b6e48497c90Mike Lockwood } 14946d0adf8256a42416584765625852b6e48497c90Mike Lockwood } 15046d0adf8256a42416584765625852b6e48497c90Mike Lockwood }; 15146d0adf8256a42416584765625852b6e48497c90Mike Lockwood 15246d0adf8256a42416584765625852b6e48497c90Mike Lockwood public UsbDeviceManager(Context context, UsbSettingsManager settingsManager) { 15346d0adf8256a42416584765625852b6e48497c90Mike Lockwood mContext = context; 154541c9949ae9c05636d3e0442aa5080815121a042Mike Lockwood mContentResolver = context.getContentResolver(); 15546d0adf8256a42416584765625852b6e48497c90Mike Lockwood mSettingsManager = settingsManager; 15646d0adf8256a42416584765625852b6e48497c90Mike Lockwood PackageManager pm = mContext.getPackageManager(); 15746d0adf8256a42416584765625852b6e48497c90Mike Lockwood mHasUsbAccessory = pm.hasSystemFeature(PackageManager.FEATURE_USB_ACCESSORY); 158629b149ff584bc247f68014a676101d1d5787d27Mike Lockwood initRndisAddress(); 15946d0adf8256a42416584765625852b6e48497c90Mike Lockwood 160afd8f1820eeee21e960be44b22113dc2cecacf98Kazuhiro Ondo readOemUsbOverrideConfig(); 161afd8f1820eeee21e960be44b22113dc2cecacf98Kazuhiro Ondo 16202e4569b5f126ca916a7473117ddd17d4f2ccbbbMike Lockwood // create a thread for our Handler 16302e4569b5f126ca916a7473117ddd17d4f2ccbbbMike Lockwood HandlerThread thread = new HandlerThread("UsbDeviceManager", 1643fd13eb6322e09f1ffe5476e28d55732da391151Mike Lockwood Process.THREAD_PRIORITY_BACKGROUND); 16502e4569b5f126ca916a7473117ddd17d4f2ccbbbMike Lockwood thread.start(); 1663fd13eb6322e09f1ffe5476e28d55732da391151Mike Lockwood mHandler = new UsbHandler(thread.getLooper()); 167d462ecf8f82076d21c85bdeeefbd16a1a91d2805Mike Lockwood 168d462ecf8f82076d21c85bdeeefbd16a1a91d2805Mike Lockwood if (nativeIsStartRequested()) { 169d462ecf8f82076d21c85bdeeefbd16a1a91d2805Mike Lockwood if (DEBUG) Slog.d(TAG, "accessory attached at boot"); 170166b05e0ce913711d27ce1a116b3f1fd906822e4Mike Lockwood startAccessoryMode(); 171d462ecf8f82076d21c85bdeeefbd16a1a91d2805Mike Lockwood } 1724e68bd420b6cfdbeadb5e69aa6448665b2da762bBenoit Goby 1734e68bd420b6cfdbeadb5e69aa6448665b2da762bBenoit Goby if ("1".equals(SystemProperties.get("ro.adb.secure"))) { 1744e68bd420b6cfdbeadb5e69aa6448665b2da762bBenoit Goby mDebuggingManager = new UsbDebuggingManager(context); 1754e68bd420b6cfdbeadb5e69aa6448665b2da762bBenoit Goby } 17602e4569b5f126ca916a7473117ddd17d4f2ccbbbMike Lockwood } 17702e4569b5f126ca916a7473117ddd17d4f2ccbbbMike Lockwood 17802e4569b5f126ca916a7473117ddd17d4f2ccbbbMike Lockwood public void systemReady() { 179d462ecf8f82076d21c85bdeeefbd16a1a91d2805Mike Lockwood if (DEBUG) Slog.d(TAG, "systemReady"); 18002e4569b5f126ca916a7473117ddd17d4f2ccbbbMike Lockwood 18102e4569b5f126ca916a7473117ddd17d4f2ccbbbMike Lockwood mNotificationManager = (NotificationManager) 18202e4569b5f126ca916a7473117ddd17d4f2ccbbbMike Lockwood mContext.getSystemService(Context.NOTIFICATION_SERVICE); 18346d0adf8256a42416584765625852b6e48497c90Mike Lockwood 1845787a2d5b4e5bd60087eb7fbb13c97c7d0ba113eMike Lockwood // We do not show the USB notification if the primary volume supports mass storage. 1855787a2d5b4e5bd60087eb7fbb13c97c7d0ba113eMike Lockwood // The legacy mass storage UI will be used instead. 1865787a2d5b4e5bd60087eb7fbb13c97c7d0ba113eMike Lockwood boolean massStorageSupported = false; 187b049e212ab7fe8967893c202efcb30fecfdb82fbJeff Sharkey final StorageManager storageManager = StorageManager.from(mContext); 188b049e212ab7fe8967893c202efcb30fecfdb82fbJeff Sharkey final StorageVolume primary = storageManager.getPrimaryVolume(); 189b049e212ab7fe8967893c202efcb30fecfdb82fbJeff Sharkey massStorageSupported = primary != null && primary.allowMassStorage(); 1905787a2d5b4e5bd60087eb7fbb13c97c7d0ba113eMike Lockwood mUseUsbNotification = !massStorageSupported; 1915787a2d5b4e5bd60087eb7fbb13c97c7d0ba113eMike Lockwood 19202e4569b5f126ca916a7473117ddd17d4f2ccbbbMike Lockwood // make sure the ADB_ENABLED setting value matches the current state 19302e4569b5f126ca916a7473117ddd17d4f2ccbbbMike Lockwood Settings.Secure.putInt(mContentResolver, Settings.Secure.ADB_ENABLED, mAdbEnabled ? 1 : 0); 194541c9949ae9c05636d3e0442aa5080815121a042Mike Lockwood 19502e4569b5f126ca916a7473117ddd17d4f2ccbbbMike Lockwood mHandler.sendEmptyMessage(MSG_SYSTEM_READY); 19602e4569b5f126ca916a7473117ddd17d4f2ccbbbMike Lockwood } 197541c9949ae9c05636d3e0442aa5080815121a042Mike Lockwood 198166b05e0ce913711d27ce1a116b3f1fd906822e4Mike Lockwood private void startAccessoryMode() { 199166b05e0ce913711d27ce1a116b3f1fd906822e4Mike Lockwood mAccessoryStrings = nativeGetAccessoryStrings(); 200166b05e0ce913711d27ce1a116b3f1fd906822e4Mike Lockwood boolean enableAudio = (nativeGetAudioMode() == AUDIO_MODE_SOURCE); 201166b05e0ce913711d27ce1a116b3f1fd906822e4Mike Lockwood // don't start accessory mode if our mandatory strings have not been set 202166b05e0ce913711d27ce1a116b3f1fd906822e4Mike Lockwood boolean enableAccessory = (mAccessoryStrings != null && 203166b05e0ce913711d27ce1a116b3f1fd906822e4Mike Lockwood mAccessoryStrings[UsbAccessory.MANUFACTURER_STRING] != null && 204166b05e0ce913711d27ce1a116b3f1fd906822e4Mike Lockwood mAccessoryStrings[UsbAccessory.MODEL_STRING] != null); 205166b05e0ce913711d27ce1a116b3f1fd906822e4Mike Lockwood String functions = null; 206166b05e0ce913711d27ce1a116b3f1fd906822e4Mike Lockwood 207166b05e0ce913711d27ce1a116b3f1fd906822e4Mike Lockwood if (enableAccessory && enableAudio) { 208166b05e0ce913711d27ce1a116b3f1fd906822e4Mike Lockwood functions = UsbManager.USB_FUNCTION_ACCESSORY + "," 209166b05e0ce913711d27ce1a116b3f1fd906822e4Mike Lockwood + UsbManager.USB_FUNCTION_AUDIO_SOURCE; 210166b05e0ce913711d27ce1a116b3f1fd906822e4Mike Lockwood } else if (enableAccessory) { 211166b05e0ce913711d27ce1a116b3f1fd906822e4Mike Lockwood functions = UsbManager.USB_FUNCTION_ACCESSORY; 212166b05e0ce913711d27ce1a116b3f1fd906822e4Mike Lockwood } else if (enableAudio) { 213166b05e0ce913711d27ce1a116b3f1fd906822e4Mike Lockwood functions = UsbManager.USB_FUNCTION_AUDIO_SOURCE; 214166b05e0ce913711d27ce1a116b3f1fd906822e4Mike Lockwood } 215166b05e0ce913711d27ce1a116b3f1fd906822e4Mike Lockwood 216166b05e0ce913711d27ce1a116b3f1fd906822e4Mike Lockwood if (functions != null) { 217166b05e0ce913711d27ce1a116b3f1fd906822e4Mike Lockwood setCurrentFunctions(functions, false); 218166b05e0ce913711d27ce1a116b3f1fd906822e4Mike Lockwood } 219166b05e0ce913711d27ce1a116b3f1fd906822e4Mike Lockwood } 220166b05e0ce913711d27ce1a116b3f1fd906822e4Mike Lockwood 221629b149ff584bc247f68014a676101d1d5787d27Mike Lockwood private static void initRndisAddress() { 222629b149ff584bc247f68014a676101d1d5787d27Mike Lockwood // configure RNDIS ethernet address based on our serial number using the same algorithm 223629b149ff584bc247f68014a676101d1d5787d27Mike Lockwood // we had been previously using in kernel board files 224629b149ff584bc247f68014a676101d1d5787d27Mike Lockwood final int ETH_ALEN = 6; 225629b149ff584bc247f68014a676101d1d5787d27Mike Lockwood int address[] = new int[ETH_ALEN]; 226629b149ff584bc247f68014a676101d1d5787d27Mike Lockwood // first byte is 0x02 to signify a locally administered address 227629b149ff584bc247f68014a676101d1d5787d27Mike Lockwood address[0] = 0x02; 228629b149ff584bc247f68014a676101d1d5787d27Mike Lockwood 229629b149ff584bc247f68014a676101d1d5787d27Mike Lockwood String serial = SystemProperties.get("ro.serialno", "1234567890ABCDEF"); 230629b149ff584bc247f68014a676101d1d5787d27Mike Lockwood int serialLength = serial.length(); 231629b149ff584bc247f68014a676101d1d5787d27Mike Lockwood // XOR the USB serial across the remaining 5 bytes 232629b149ff584bc247f68014a676101d1d5787d27Mike Lockwood for (int i = 0; i < serialLength; i++) { 233629b149ff584bc247f68014a676101d1d5787d27Mike Lockwood address[i % (ETH_ALEN - 1) + 1] ^= (int)serial.charAt(i); 234629b149ff584bc247f68014a676101d1d5787d27Mike Lockwood } 235629b149ff584bc247f68014a676101d1d5787d27Mike Lockwood String addrString = String.format("%02X:%02X:%02X:%02X:%02X:%02X", 236629b149ff584bc247f68014a676101d1d5787d27Mike Lockwood address[0], address[1], address[2], address[3], address[4], address[5]); 237629b149ff584bc247f68014a676101d1d5787d27Mike Lockwood try { 238629b149ff584bc247f68014a676101d1d5787d27Mike Lockwood FileUtils.stringToFile(RNDIS_ETH_ADDR_PATH, addrString); 239629b149ff584bc247f68014a676101d1d5787d27Mike Lockwood } catch (IOException e) { 240629b149ff584bc247f68014a676101d1d5787d27Mike Lockwood Slog.e(TAG, "failed to write to " + RNDIS_ETH_ADDR_PATH); 241629b149ff584bc247f68014a676101d1d5787d27Mike Lockwood } 242629b149ff584bc247f68014a676101d1d5787d27Mike Lockwood } 243629b149ff584bc247f68014a676101d1d5787d27Mike Lockwood 24402e4569b5f126ca916a7473117ddd17d4f2ccbbbMike Lockwood private static String addFunction(String functions, String function) { 245dab2072365565b4892be7910b0cdb870e83689f6RoboErik if ("none".equals(functions)) { 246dab2072365565b4892be7910b0cdb870e83689f6RoboErik return function; 247dab2072365565b4892be7910b0cdb870e83689f6RoboErik } 24802e4569b5f126ca916a7473117ddd17d4f2ccbbbMike Lockwood if (!containsFunction(functions, function)) { 24902e4569b5f126ca916a7473117ddd17d4f2ccbbbMike Lockwood if (functions.length() > 0) { 25002e4569b5f126ca916a7473117ddd17d4f2ccbbbMike Lockwood functions += ","; 25146d0adf8256a42416584765625852b6e48497c90Mike Lockwood } 25202e4569b5f126ca916a7473117ddd17d4f2ccbbbMike Lockwood functions += function; 25346d0adf8256a42416584765625852b6e48497c90Mike Lockwood } 25402e4569b5f126ca916a7473117ddd17d4f2ccbbbMike Lockwood return functions; 25546d0adf8256a42416584765625852b6e48497c90Mike Lockwood } 25646d0adf8256a42416584765625852b6e48497c90Mike Lockwood 25702e4569b5f126ca916a7473117ddd17d4f2ccbbbMike Lockwood private static String removeFunction(String functions, String function) { 25802e4569b5f126ca916a7473117ddd17d4f2ccbbbMike Lockwood String[] split = functions.split(","); 25902e4569b5f126ca916a7473117ddd17d4f2ccbbbMike Lockwood for (int i = 0; i < split.length; i++) { 26002e4569b5f126ca916a7473117ddd17d4f2ccbbbMike Lockwood if (function.equals(split[i])) { 26102e4569b5f126ca916a7473117ddd17d4f2ccbbbMike Lockwood split[i] = null; 26202e4569b5f126ca916a7473117ddd17d4f2ccbbbMike Lockwood } 26302e4569b5f126ca916a7473117ddd17d4f2ccbbbMike Lockwood } 264dab2072365565b4892be7910b0cdb870e83689f6RoboErik if (split.length == 1 && split[0] == null) { 265dab2072365565b4892be7910b0cdb870e83689f6RoboErik return "none"; 266dab2072365565b4892be7910b0cdb870e83689f6RoboErik } 26702e4569b5f126ca916a7473117ddd17d4f2ccbbbMike Lockwood StringBuilder builder = new StringBuilder(); 26802e4569b5f126ca916a7473117ddd17d4f2ccbbbMike Lockwood for (int i = 0; i < split.length; i++) { 26902e4569b5f126ca916a7473117ddd17d4f2ccbbbMike Lockwood String s = split[i]; 27002e4569b5f126ca916a7473117ddd17d4f2ccbbbMike Lockwood if (s != null) { 27102e4569b5f126ca916a7473117ddd17d4f2ccbbbMike Lockwood if (builder.length() > 0) { 27202e4569b5f126ca916a7473117ddd17d4f2ccbbbMike Lockwood builder.append(","); 27302e4569b5f126ca916a7473117ddd17d4f2ccbbbMike Lockwood } 27402e4569b5f126ca916a7473117ddd17d4f2ccbbbMike Lockwood builder.append(s); 27502e4569b5f126ca916a7473117ddd17d4f2ccbbbMike Lockwood } 27602e4569b5f126ca916a7473117ddd17d4f2ccbbbMike Lockwood } 27702e4569b5f126ca916a7473117ddd17d4f2ccbbbMike Lockwood return builder.toString(); 27802e4569b5f126ca916a7473117ddd17d4f2ccbbbMike Lockwood } 27946d0adf8256a42416584765625852b6e48497c90Mike Lockwood 28002e4569b5f126ca916a7473117ddd17d4f2ccbbbMike Lockwood private static boolean containsFunction(String functions, String function) { 28102e4569b5f126ca916a7473117ddd17d4f2ccbbbMike Lockwood int index = functions.indexOf(function); 28202e4569b5f126ca916a7473117ddd17d4f2ccbbbMike Lockwood if (index < 0) return false; 28302e4569b5f126ca916a7473117ddd17d4f2ccbbbMike Lockwood if (index > 0 && functions.charAt(index - 1) != ',') return false; 28402e4569b5f126ca916a7473117ddd17d4f2ccbbbMike Lockwood int charAfter = index + function.length(); 28502e4569b5f126ca916a7473117ddd17d4f2ccbbbMike Lockwood if (charAfter < functions.length() && functions.charAt(charAfter) != ',') return false; 28602e4569b5f126ca916a7473117ddd17d4f2ccbbbMike Lockwood return true; 28702e4569b5f126ca916a7473117ddd17d4f2ccbbbMike Lockwood } 28802e4569b5f126ca916a7473117ddd17d4f2ccbbbMike Lockwood 28902e4569b5f126ca916a7473117ddd17d4f2ccbbbMike Lockwood private final class UsbHandler extends Handler { 29002e4569b5f126ca916a7473117ddd17d4f2ccbbbMike Lockwood 29102e4569b5f126ca916a7473117ddd17d4f2ccbbbMike Lockwood // current USB state 29202e4569b5f126ca916a7473117ddd17d4f2ccbbbMike Lockwood private boolean mConnected; 29302e4569b5f126ca916a7473117ddd17d4f2ccbbbMike Lockwood private boolean mConfigured; 29402e4569b5f126ca916a7473117ddd17d4f2ccbbbMike Lockwood private String mCurrentFunctions; 29502e4569b5f126ca916a7473117ddd17d4f2ccbbbMike Lockwood private String mDefaultFunctions; 29602e4569b5f126ca916a7473117ddd17d4f2ccbbbMike Lockwood private UsbAccessory mCurrentAccessory; 297d8404d2fdd7036435748548a6791063fb6d6c909Mike Lockwood private int mUsbNotificationId; 298d8404d2fdd7036435748548a6791063fb6d6c909Mike Lockwood private boolean mAdbNotificationShown; 29927bd34d9d9fe99f11b80aa0bbdb402fb47ef4158Jeff Sharkey private int mCurrentUser = UserHandle.USER_NULL; 300d8404d2fdd7036435748548a6791063fb6d6c909Mike Lockwood 301d462ecf8f82076d21c85bdeeefbd16a1a91d2805Mike Lockwood private final BroadcastReceiver mBootCompletedReceiver = new BroadcastReceiver() { 30227bd34d9d9fe99f11b80aa0bbdb402fb47ef4158Jeff Sharkey @Override 303d462ecf8f82076d21c85bdeeefbd16a1a91d2805Mike Lockwood public void onReceive(Context context, Intent intent) { 304d462ecf8f82076d21c85bdeeefbd16a1a91d2805Mike Lockwood if (DEBUG) Slog.d(TAG, "boot completed"); 305d462ecf8f82076d21c85bdeeefbd16a1a91d2805Mike Lockwood mHandler.sendEmptyMessage(MSG_BOOT_COMPLETED); 306d462ecf8f82076d21c85bdeeefbd16a1a91d2805Mike Lockwood } 307d462ecf8f82076d21c85bdeeefbd16a1a91d2805Mike Lockwood }; 308d462ecf8f82076d21c85bdeeefbd16a1a91d2805Mike Lockwood 30927bd34d9d9fe99f11b80aa0bbdb402fb47ef4158Jeff Sharkey private final BroadcastReceiver mUserSwitchedReceiver = new BroadcastReceiver() { 31027bd34d9d9fe99f11b80aa0bbdb402fb47ef4158Jeff Sharkey @Override 31127bd34d9d9fe99f11b80aa0bbdb402fb47ef4158Jeff Sharkey public void onReceive(Context context, Intent intent) { 31227bd34d9d9fe99f11b80aa0bbdb402fb47ef4158Jeff Sharkey final int userId = intent.getIntExtra(Intent.EXTRA_USER_HANDLE, -1); 31327bd34d9d9fe99f11b80aa0bbdb402fb47ef4158Jeff Sharkey mHandler.obtainMessage(MSG_USER_SWITCHED, userId, 0).sendToTarget(); 31427bd34d9d9fe99f11b80aa0bbdb402fb47ef4158Jeff Sharkey } 31527bd34d9d9fe99f11b80aa0bbdb402fb47ef4158Jeff Sharkey }; 31627bd34d9d9fe99f11b80aa0bbdb402fb47ef4158Jeff Sharkey 3173fd13eb6322e09f1ffe5476e28d55732da391151Mike Lockwood public UsbHandler(Looper looper) { 3183fd13eb6322e09f1ffe5476e28d55732da391151Mike Lockwood super(looper); 31902e4569b5f126ca916a7473117ddd17d4f2ccbbbMike Lockwood try { 320c264afeb5528733a215a472e761b51cc59bba454Mike Lockwood // persist.sys.usb.config should never be unset. But if it is, set it to "adb" 321c264afeb5528733a215a472e761b51cc59bba454Mike Lockwood // so we have a chance of debugging what happened. 322c264afeb5528733a215a472e761b51cc59bba454Mike Lockwood mDefaultFunctions = SystemProperties.get("persist.sys.usb.config", "adb"); 323afd8f1820eeee21e960be44b22113dc2cecacf98Kazuhiro Ondo 324afd8f1820eeee21e960be44b22113dc2cecacf98Kazuhiro Ondo // Check if USB mode needs to be overridden depending on OEM specific bootmode. 325afd8f1820eeee21e960be44b22113dc2cecacf98Kazuhiro Ondo mDefaultFunctions = processOemUsbOverride(mDefaultFunctions); 326afd8f1820eeee21e960be44b22113dc2cecacf98Kazuhiro Ondo 327de296f64483713fdf164f3e8bf41dc12d1cff59eMike Lockwood // sanity check the sys.usb.config system property 328de296f64483713fdf164f3e8bf41dc12d1cff59eMike Lockwood // this may be necessary if we crashed while switching USB configurations 329de296f64483713fdf164f3e8bf41dc12d1cff59eMike Lockwood String config = SystemProperties.get("sys.usb.config", "none"); 330c264afeb5528733a215a472e761b51cc59bba454Mike Lockwood if (!config.equals(mDefaultFunctions)) { 331c264afeb5528733a215a472e761b51cc59bba454Mike Lockwood Slog.w(TAG, "resetting config to persistent property: " + mDefaultFunctions); 332c264afeb5528733a215a472e761b51cc59bba454Mike Lockwood SystemProperties.set("sys.usb.config", mDefaultFunctions); 333de296f64483713fdf164f3e8bf41dc12d1cff59eMike Lockwood } 334de296f64483713fdf164f3e8bf41dc12d1cff59eMike Lockwood 335c264afeb5528733a215a472e761b51cc59bba454Mike Lockwood mCurrentFunctions = mDefaultFunctions; 33602e4569b5f126ca916a7473117ddd17d4f2ccbbbMike Lockwood String state = FileUtils.readTextFile(new File(STATE_PATH), 0, null).trim(); 33702e4569b5f126ca916a7473117ddd17d4f2ccbbbMike Lockwood updateState(state); 33802e4569b5f126ca916a7473117ddd17d4f2ccbbbMike Lockwood mAdbEnabled = containsFunction(mCurrentFunctions, UsbManager.USB_FUNCTION_ADB); 33902e4569b5f126ca916a7473117ddd17d4f2ccbbbMike Lockwood 34002e4569b5f126ca916a7473117ddd17d4f2ccbbbMike Lockwood // Upgrade step for previous versions that used persist.service.adb.enable 34102e4569b5f126ca916a7473117ddd17d4f2ccbbbMike Lockwood String value = SystemProperties.get("persist.service.adb.enable", ""); 34202e4569b5f126ca916a7473117ddd17d4f2ccbbbMike Lockwood if (value.length() > 0) { 34302e4569b5f126ca916a7473117ddd17d4f2ccbbbMike Lockwood char enable = value.charAt(0); 34402e4569b5f126ca916a7473117ddd17d4f2ccbbbMike Lockwood if (enable == '1') { 34502e4569b5f126ca916a7473117ddd17d4f2ccbbbMike Lockwood setAdbEnabled(true); 34602e4569b5f126ca916a7473117ddd17d4f2ccbbbMike Lockwood } else if (enable == '0') { 34702e4569b5f126ca916a7473117ddd17d4f2ccbbbMike Lockwood setAdbEnabled(false); 34802e4569b5f126ca916a7473117ddd17d4f2ccbbbMike Lockwood } 34902e4569b5f126ca916a7473117ddd17d4f2ccbbbMike Lockwood SystemProperties.set("persist.service.adb.enable", ""); 35002e4569b5f126ca916a7473117ddd17d4f2ccbbbMike Lockwood } 35102e4569b5f126ca916a7473117ddd17d4f2ccbbbMike Lockwood 35202e4569b5f126ca916a7473117ddd17d4f2ccbbbMike Lockwood // register observer to listen for settings changes 35302e4569b5f126ca916a7473117ddd17d4f2ccbbbMike Lockwood mContentResolver.registerContentObserver( 35402e4569b5f126ca916a7473117ddd17d4f2ccbbbMike Lockwood Settings.Secure.getUriFor(Settings.Secure.ADB_ENABLED), 35502e4569b5f126ca916a7473117ddd17d4f2ccbbbMike Lockwood false, new AdbSettingsObserver()); 35602e4569b5f126ca916a7473117ddd17d4f2ccbbbMike Lockwood 35702e4569b5f126ca916a7473117ddd17d4f2ccbbbMike Lockwood // Watch for USB configuration changes 35802e4569b5f126ca916a7473117ddd17d4f2ccbbbMike Lockwood mUEventObserver.startObserving(USB_STATE_MATCH); 35902e4569b5f126ca916a7473117ddd17d4f2ccbbbMike Lockwood mUEventObserver.startObserving(ACCESSORY_START_MATCH); 360d462ecf8f82076d21c85bdeeefbd16a1a91d2805Mike Lockwood 36127bd34d9d9fe99f11b80aa0bbdb402fb47ef4158Jeff Sharkey mContext.registerReceiver( 36227bd34d9d9fe99f11b80aa0bbdb402fb47ef4158Jeff Sharkey mBootCompletedReceiver, new IntentFilter(Intent.ACTION_BOOT_COMPLETED)); 36327bd34d9d9fe99f11b80aa0bbdb402fb47ef4158Jeff Sharkey mContext.registerReceiver( 36427bd34d9d9fe99f11b80aa0bbdb402fb47ef4158Jeff Sharkey mUserSwitchedReceiver, new IntentFilter(Intent.ACTION_USER_SWITCHED)); 36502e4569b5f126ca916a7473117ddd17d4f2ccbbbMike Lockwood } catch (Exception e) { 36602e4569b5f126ca916a7473117ddd17d4f2ccbbbMike Lockwood Slog.e(TAG, "Error initializing UsbHandler", e); 36702e4569b5f126ca916a7473117ddd17d4f2ccbbbMike Lockwood } 36846d0adf8256a42416584765625852b6e48497c90Mike Lockwood } 36902e4569b5f126ca916a7473117ddd17d4f2ccbbbMike Lockwood 37002e4569b5f126ca916a7473117ddd17d4f2ccbbbMike Lockwood public void sendMessage(int what, boolean arg) { 37102e4569b5f126ca916a7473117ddd17d4f2ccbbbMike Lockwood removeMessages(what); 37202e4569b5f126ca916a7473117ddd17d4f2ccbbbMike Lockwood Message m = Message.obtain(this, what); 37302e4569b5f126ca916a7473117ddd17d4f2ccbbbMike Lockwood m.arg1 = (arg ? 1 : 0); 37402e4569b5f126ca916a7473117ddd17d4f2ccbbbMike Lockwood sendMessage(m); 37546d0adf8256a42416584765625852b6e48497c90Mike Lockwood } 37646d0adf8256a42416584765625852b6e48497c90Mike Lockwood 37702e4569b5f126ca916a7473117ddd17d4f2ccbbbMike Lockwood public void sendMessage(int what, Object arg) { 37802e4569b5f126ca916a7473117ddd17d4f2ccbbbMike Lockwood removeMessages(what); 37902e4569b5f126ca916a7473117ddd17d4f2ccbbbMike Lockwood Message m = Message.obtain(this, what); 38002e4569b5f126ca916a7473117ddd17d4f2ccbbbMike Lockwood m.obj = arg; 38102e4569b5f126ca916a7473117ddd17d4f2ccbbbMike Lockwood sendMessage(m); 38202e4569b5f126ca916a7473117ddd17d4f2ccbbbMike Lockwood } 38302e4569b5f126ca916a7473117ddd17d4f2ccbbbMike Lockwood 384f59717ddb5ef324ee3fdb12b83e7d1b709793d28Mike Lockwood public void sendMessage(int what, Object arg0, boolean arg1) { 385f59717ddb5ef324ee3fdb12b83e7d1b709793d28Mike Lockwood removeMessages(what); 386f59717ddb5ef324ee3fdb12b83e7d1b709793d28Mike Lockwood Message m = Message.obtain(this, what); 387f59717ddb5ef324ee3fdb12b83e7d1b709793d28Mike Lockwood m.obj = arg0; 388f59717ddb5ef324ee3fdb12b83e7d1b709793d28Mike Lockwood m.arg1 = (arg1 ? 1 : 0); 389f59717ddb5ef324ee3fdb12b83e7d1b709793d28Mike Lockwood sendMessage(m); 390f59717ddb5ef324ee3fdb12b83e7d1b709793d28Mike Lockwood } 391f59717ddb5ef324ee3fdb12b83e7d1b709793d28Mike Lockwood 39202e4569b5f126ca916a7473117ddd17d4f2ccbbbMike Lockwood public void updateState(String state) { 39302e4569b5f126ca916a7473117ddd17d4f2ccbbbMike Lockwood int connected, configured; 39402e4569b5f126ca916a7473117ddd17d4f2ccbbbMike Lockwood 39502e4569b5f126ca916a7473117ddd17d4f2ccbbbMike Lockwood if ("DISCONNECTED".equals(state)) { 39602e4569b5f126ca916a7473117ddd17d4f2ccbbbMike Lockwood connected = 0; 39702e4569b5f126ca916a7473117ddd17d4f2ccbbbMike Lockwood configured = 0; 39802e4569b5f126ca916a7473117ddd17d4f2ccbbbMike Lockwood } else if ("CONNECTED".equals(state)) { 39902e4569b5f126ca916a7473117ddd17d4f2ccbbbMike Lockwood connected = 1; 40002e4569b5f126ca916a7473117ddd17d4f2ccbbbMike Lockwood configured = 0; 40102e4569b5f126ca916a7473117ddd17d4f2ccbbbMike Lockwood } else if ("CONFIGURED".equals(state)) { 40202e4569b5f126ca916a7473117ddd17d4f2ccbbbMike Lockwood connected = 1; 40302e4569b5f126ca916a7473117ddd17d4f2ccbbbMike Lockwood configured = 1; 40402e4569b5f126ca916a7473117ddd17d4f2ccbbbMike Lockwood } else { 40502e4569b5f126ca916a7473117ddd17d4f2ccbbbMike Lockwood Slog.e(TAG, "unknown state " + state); 40602e4569b5f126ca916a7473117ddd17d4f2ccbbbMike Lockwood return; 40702e4569b5f126ca916a7473117ddd17d4f2ccbbbMike Lockwood } 40802e4569b5f126ca916a7473117ddd17d4f2ccbbbMike Lockwood removeMessages(MSG_UPDATE_STATE); 40902e4569b5f126ca916a7473117ddd17d4f2ccbbbMike Lockwood Message msg = Message.obtain(this, MSG_UPDATE_STATE); 41002e4569b5f126ca916a7473117ddd17d4f2ccbbbMike Lockwood msg.arg1 = connected; 41102e4569b5f126ca916a7473117ddd17d4f2ccbbbMike Lockwood msg.arg2 = configured; 41202e4569b5f126ca916a7473117ddd17d4f2ccbbbMike Lockwood // debounce disconnects to avoid problems bringing up USB tethering 41302e4569b5f126ca916a7473117ddd17d4f2ccbbbMike Lockwood sendMessageDelayed(msg, (connected == 0) ? UPDATE_DELAY : 0); 41402e4569b5f126ca916a7473117ddd17d4f2ccbbbMike Lockwood } 41502e4569b5f126ca916a7473117ddd17d4f2ccbbbMike Lockwood 416f59717ddb5ef324ee3fdb12b83e7d1b709793d28Mike Lockwood private boolean waitForState(String state) { 41702e4569b5f126ca916a7473117ddd17d4f2ccbbbMike Lockwood // wait for the transition to complete. 41802e4569b5f126ca916a7473117ddd17d4f2ccbbbMike Lockwood // give up after 1 second. 41902e4569b5f126ca916a7473117ddd17d4f2ccbbbMike Lockwood for (int i = 0; i < 20; i++) { 42068736cbf938935f7d7e1eb2b3f9ec911fcb0da72Mike Lockwood // State transition is done when sys.usb.state is set to the new configuration 421f59717ddb5ef324ee3fdb12b83e7d1b709793d28Mike Lockwood if (state.equals(SystemProperties.get("sys.usb.state"))) return true; 422dab2072365565b4892be7910b0cdb870e83689f6RoboErik SystemClock.sleep(50); 42302e4569b5f126ca916a7473117ddd17d4f2ccbbbMike Lockwood } 424fdc0c2984d05e32954608f46514c4cbe3a5a9424Mike Lockwood Slog.e(TAG, "waitForState(" + state + ") FAILED"); 42502e4569b5f126ca916a7473117ddd17d4f2ccbbbMike Lockwood return false; 42602e4569b5f126ca916a7473117ddd17d4f2ccbbbMike Lockwood } 42702e4569b5f126ca916a7473117ddd17d4f2ccbbbMike Lockwood 428f59717ddb5ef324ee3fdb12b83e7d1b709793d28Mike Lockwood private boolean setUsbConfig(String config) { 429fdc0c2984d05e32954608f46514c4cbe3a5a9424Mike Lockwood if (DEBUG) Slog.d(TAG, "setUsbConfig(" + config + ")"); 430f59717ddb5ef324ee3fdb12b83e7d1b709793d28Mike Lockwood // set the new configuration 431f59717ddb5ef324ee3fdb12b83e7d1b709793d28Mike Lockwood SystemProperties.set("sys.usb.config", config); 432f59717ddb5ef324ee3fdb12b83e7d1b709793d28Mike Lockwood return waitForState(config); 433f59717ddb5ef324ee3fdb12b83e7d1b709793d28Mike Lockwood } 434f59717ddb5ef324ee3fdb12b83e7d1b709793d28Mike Lockwood 43502e4569b5f126ca916a7473117ddd17d4f2ccbbbMike Lockwood private void setAdbEnabled(boolean enable) { 436de296f64483713fdf164f3e8bf41dc12d1cff59eMike Lockwood if (DEBUG) Slog.d(TAG, "setAdbEnabled: " + enable); 43702e4569b5f126ca916a7473117ddd17d4f2ccbbbMike Lockwood if (enable != mAdbEnabled) { 43802e4569b5f126ca916a7473117ddd17d4f2ccbbbMike Lockwood mAdbEnabled = enable; 439f59717ddb5ef324ee3fdb12b83e7d1b709793d28Mike Lockwood // Due to the persist.sys.usb.config property trigger, changing adb state requires 440f59717ddb5ef324ee3fdb12b83e7d1b709793d28Mike Lockwood // switching to default function 4411984e79d1593b80adf46b16666862f5787157aedMike Lockwood setEnabledFunctions(mDefaultFunctions, true); 442d8404d2fdd7036435748548a6791063fb6d6c909Mike Lockwood updateAdbNotification(); 44302e4569b5f126ca916a7473117ddd17d4f2ccbbbMike Lockwood } 4444e68bd420b6cfdbeadb5e69aa6448665b2da762bBenoit Goby if (mDebuggingManager != null) { 4454e68bd420b6cfdbeadb5e69aa6448665b2da762bBenoit Goby mDebuggingManager.setAdbEnabled(mAdbEnabled); 4464e68bd420b6cfdbeadb5e69aa6448665b2da762bBenoit Goby } 44702e4569b5f126ca916a7473117ddd17d4f2ccbbbMike Lockwood } 44802e4569b5f126ca916a7473117ddd17d4f2ccbbbMike Lockwood 44968736cbf938935f7d7e1eb2b3f9ec911fcb0da72Mike Lockwood private void setEnabledFunctions(String functions, boolean makeDefault) { 450afd8f1820eeee21e960be44b22113dc2cecacf98Kazuhiro Ondo 451afd8f1820eeee21e960be44b22113dc2cecacf98Kazuhiro Ondo // Do not update persystent.sys.usb.config if the device is booted up 452afd8f1820eeee21e960be44b22113dc2cecacf98Kazuhiro Ondo // with OEM specific mode. 453afd8f1820eeee21e960be44b22113dc2cecacf98Kazuhiro Ondo if (functions != null && makeDefault && !needsOemUsbOverride()) { 454afd8f1820eeee21e960be44b22113dc2cecacf98Kazuhiro Ondo 4558b4d36e8661e25fcb893e00be15ba02da0950055Mike Lockwood if (mAdbEnabled) { 4568b4d36e8661e25fcb893e00be15ba02da0950055Mike Lockwood functions = addFunction(functions, UsbManager.USB_FUNCTION_ADB); 4578b4d36e8661e25fcb893e00be15ba02da0950055Mike Lockwood } else { 4588b4d36e8661e25fcb893e00be15ba02da0950055Mike Lockwood functions = removeFunction(functions, UsbManager.USB_FUNCTION_ADB); 4598b4d36e8661e25fcb893e00be15ba02da0950055Mike Lockwood } 46068736cbf938935f7d7e1eb2b3f9ec911fcb0da72Mike Lockwood if (!mDefaultFunctions.equals(functions)) { 46168736cbf938935f7d7e1eb2b3f9ec911fcb0da72Mike Lockwood if (!setUsbConfig("none")) { 46268736cbf938935f7d7e1eb2b3f9ec911fcb0da72Mike Lockwood Slog.e(TAG, "Failed to disable USB"); 46368736cbf938935f7d7e1eb2b3f9ec911fcb0da72Mike Lockwood // revert to previous configuration if we fail 46468736cbf938935f7d7e1eb2b3f9ec911fcb0da72Mike Lockwood setUsbConfig(mCurrentFunctions); 46568736cbf938935f7d7e1eb2b3f9ec911fcb0da72Mike Lockwood return; 46668736cbf938935f7d7e1eb2b3f9ec911fcb0da72Mike Lockwood } 46768736cbf938935f7d7e1eb2b3f9ec911fcb0da72Mike Lockwood // setting this property will also change the current USB state 46868736cbf938935f7d7e1eb2b3f9ec911fcb0da72Mike Lockwood // via a property trigger 46968736cbf938935f7d7e1eb2b3f9ec911fcb0da72Mike Lockwood SystemProperties.set("persist.sys.usb.config", functions); 47068736cbf938935f7d7e1eb2b3f9ec911fcb0da72Mike Lockwood if (waitForState(functions)) { 47168736cbf938935f7d7e1eb2b3f9ec911fcb0da72Mike Lockwood mCurrentFunctions = functions; 47268736cbf938935f7d7e1eb2b3f9ec911fcb0da72Mike Lockwood mDefaultFunctions = functions; 47368736cbf938935f7d7e1eb2b3f9ec911fcb0da72Mike Lockwood } else { 47468736cbf938935f7d7e1eb2b3f9ec911fcb0da72Mike Lockwood Slog.e(TAG, "Failed to switch persistent USB config to " + functions); 47568736cbf938935f7d7e1eb2b3f9ec911fcb0da72Mike Lockwood // revert to previous configuration if we fail 47668736cbf938935f7d7e1eb2b3f9ec911fcb0da72Mike Lockwood SystemProperties.set("persist.sys.usb.config", mDefaultFunctions); 47768736cbf938935f7d7e1eb2b3f9ec911fcb0da72Mike Lockwood } 47868736cbf938935f7d7e1eb2b3f9ec911fcb0da72Mike Lockwood } 47968736cbf938935f7d7e1eb2b3f9ec911fcb0da72Mike Lockwood } else { 48068736cbf938935f7d7e1eb2b3f9ec911fcb0da72Mike Lockwood if (functions == null) { 48168736cbf938935f7d7e1eb2b3f9ec911fcb0da72Mike Lockwood functions = mDefaultFunctions; 48268736cbf938935f7d7e1eb2b3f9ec911fcb0da72Mike Lockwood } 483afd8f1820eeee21e960be44b22113dc2cecacf98Kazuhiro Ondo 484afd8f1820eeee21e960be44b22113dc2cecacf98Kazuhiro Ondo // Override with bootmode specific usb mode if needed 485afd8f1820eeee21e960be44b22113dc2cecacf98Kazuhiro Ondo functions = processOemUsbOverride(functions); 486afd8f1820eeee21e960be44b22113dc2cecacf98Kazuhiro Ondo 4878b4d36e8661e25fcb893e00be15ba02da0950055Mike Lockwood if (mAdbEnabled) { 4888b4d36e8661e25fcb893e00be15ba02da0950055Mike Lockwood functions = addFunction(functions, UsbManager.USB_FUNCTION_ADB); 4898b4d36e8661e25fcb893e00be15ba02da0950055Mike Lockwood } else { 4908b4d36e8661e25fcb893e00be15ba02da0950055Mike Lockwood functions = removeFunction(functions, UsbManager.USB_FUNCTION_ADB); 4918b4d36e8661e25fcb893e00be15ba02da0950055Mike Lockwood } 49268736cbf938935f7d7e1eb2b3f9ec911fcb0da72Mike Lockwood if (!mCurrentFunctions.equals(functions)) { 49368736cbf938935f7d7e1eb2b3f9ec911fcb0da72Mike Lockwood if (!setUsbConfig("none")) { 49468736cbf938935f7d7e1eb2b3f9ec911fcb0da72Mike Lockwood Slog.e(TAG, "Failed to disable USB"); 49568736cbf938935f7d7e1eb2b3f9ec911fcb0da72Mike Lockwood // revert to previous configuration if we fail 49668736cbf938935f7d7e1eb2b3f9ec911fcb0da72Mike Lockwood setUsbConfig(mCurrentFunctions); 49768736cbf938935f7d7e1eb2b3f9ec911fcb0da72Mike Lockwood return; 49868736cbf938935f7d7e1eb2b3f9ec911fcb0da72Mike Lockwood } 49968736cbf938935f7d7e1eb2b3f9ec911fcb0da72Mike Lockwood if (setUsbConfig(functions)) { 50068736cbf938935f7d7e1eb2b3f9ec911fcb0da72Mike Lockwood mCurrentFunctions = functions; 50168736cbf938935f7d7e1eb2b3f9ec911fcb0da72Mike Lockwood } else { 50268736cbf938935f7d7e1eb2b3f9ec911fcb0da72Mike Lockwood Slog.e(TAG, "Failed to switch USB config to " + functions); 50368736cbf938935f7d7e1eb2b3f9ec911fcb0da72Mike Lockwood // revert to previous configuration if we fail 50468736cbf938935f7d7e1eb2b3f9ec911fcb0da72Mike Lockwood setUsbConfig(mCurrentFunctions); 50568736cbf938935f7d7e1eb2b3f9ec911fcb0da72Mike Lockwood } 50668736cbf938935f7d7e1eb2b3f9ec911fcb0da72Mike Lockwood } 50702e4569b5f126ca916a7473117ddd17d4f2ccbbbMike Lockwood } 50802e4569b5f126ca916a7473117ddd17d4f2ccbbbMike Lockwood } 50902e4569b5f126ca916a7473117ddd17d4f2ccbbbMike Lockwood 51002e4569b5f126ca916a7473117ddd17d4f2ccbbbMike Lockwood private void updateCurrentAccessory() { 51102e4569b5f126ca916a7473117ddd17d4f2ccbbbMike Lockwood if (!mHasUsbAccessory) return; 51202e4569b5f126ca916a7473117ddd17d4f2ccbbbMike Lockwood 51302e4569b5f126ca916a7473117ddd17d4f2ccbbbMike Lockwood if (mConfigured) { 514166b05e0ce913711d27ce1a116b3f1fd906822e4Mike Lockwood if (mAccessoryStrings != null) { 515166b05e0ce913711d27ce1a116b3f1fd906822e4Mike Lockwood mCurrentAccessory = new UsbAccessory(mAccessoryStrings); 516fdc0c2984d05e32954608f46514c4cbe3a5a9424Mike Lockwood Slog.d(TAG, "entering USB accessory mode: " + mCurrentAccessory); 51702e4569b5f126ca916a7473117ddd17d4f2ccbbbMike Lockwood // defer accessoryAttached if system is not ready 518d462ecf8f82076d21c85bdeeefbd16a1a91d2805Mike Lockwood if (mBootCompleted) { 51902e4569b5f126ca916a7473117ddd17d4f2ccbbbMike Lockwood mSettingsManager.accessoryAttached(mCurrentAccessory); 520d462ecf8f82076d21c85bdeeefbd16a1a91d2805Mike Lockwood } // else handle in mBootCompletedReceiver 52102e4569b5f126ca916a7473117ddd17d4f2ccbbbMike Lockwood } else { 522fdc0c2984d05e32954608f46514c4cbe3a5a9424Mike Lockwood Slog.e(TAG, "nativeGetAccessoryStrings failed"); 52302e4569b5f126ca916a7473117ddd17d4f2ccbbbMike Lockwood } 52402e4569b5f126ca916a7473117ddd17d4f2ccbbbMike Lockwood } else if (!mConnected) { 52502e4569b5f126ca916a7473117ddd17d4f2ccbbbMike Lockwood // make sure accessory mode is off 52602e4569b5f126ca916a7473117ddd17d4f2ccbbbMike Lockwood // and restore default functions 527fdc0c2984d05e32954608f46514c4cbe3a5a9424Mike Lockwood Slog.d(TAG, "exited USB accessory mode"); 52868736cbf938935f7d7e1eb2b3f9ec911fcb0da72Mike Lockwood setEnabledFunctions(mDefaultFunctions, false); 52902e4569b5f126ca916a7473117ddd17d4f2ccbbbMike Lockwood 53002e4569b5f126ca916a7473117ddd17d4f2ccbbbMike Lockwood if (mCurrentAccessory != null) { 531d462ecf8f82076d21c85bdeeefbd16a1a91d2805Mike Lockwood if (mBootCompleted) { 53202e4569b5f126ca916a7473117ddd17d4f2ccbbbMike Lockwood mSettingsManager.accessoryDetached(mCurrentAccessory); 53302e4569b5f126ca916a7473117ddd17d4f2ccbbbMike Lockwood } 53402e4569b5f126ca916a7473117ddd17d4f2ccbbbMike Lockwood mCurrentAccessory = null; 535166b05e0ce913711d27ce1a116b3f1fd906822e4Mike Lockwood mAccessoryStrings = null; 53646d0adf8256a42416584765625852b6e48497c90Mike Lockwood } 53746d0adf8256a42416584765625852b6e48497c90Mike Lockwood } 53846d0adf8256a42416584765625852b6e48497c90Mike Lockwood } 53946d0adf8256a42416584765625852b6e48497c90Mike Lockwood 54002e4569b5f126ca916a7473117ddd17d4f2ccbbbMike Lockwood private void updateUsbState() { 54102e4569b5f126ca916a7473117ddd17d4f2ccbbbMike Lockwood // send a sticky broadcast containing current USB state 54202e4569b5f126ca916a7473117ddd17d4f2ccbbbMike Lockwood Intent intent = new Intent(UsbManager.ACTION_USB_STATE); 54302e4569b5f126ca916a7473117ddd17d4f2ccbbbMike Lockwood intent.addFlags(Intent.FLAG_RECEIVER_REPLACE_PENDING); 54402e4569b5f126ca916a7473117ddd17d4f2ccbbbMike Lockwood intent.putExtra(UsbManager.USB_CONNECTED, mConnected); 54502e4569b5f126ca916a7473117ddd17d4f2ccbbbMike Lockwood intent.putExtra(UsbManager.USB_CONFIGURED, mConfigured); 54602e4569b5f126ca916a7473117ddd17d4f2ccbbbMike Lockwood 54702e4569b5f126ca916a7473117ddd17d4f2ccbbbMike Lockwood if (mCurrentFunctions != null) { 54802e4569b5f126ca916a7473117ddd17d4f2ccbbbMike Lockwood String[] functions = mCurrentFunctions.split(","); 54902e4569b5f126ca916a7473117ddd17d4f2ccbbbMike Lockwood for (int i = 0; i < functions.length; i++) { 55002e4569b5f126ca916a7473117ddd17d4f2ccbbbMike Lockwood intent.putExtra(functions[i], true); 55102e4569b5f126ca916a7473117ddd17d4f2ccbbbMike Lockwood } 55246d0adf8256a42416584765625852b6e48497c90Mike Lockwood } 55302e4569b5f126ca916a7473117ddd17d4f2ccbbbMike Lockwood 5545ac72a29593ab9a20337a2225df52bdf4754be02Dianne Hackborn mContext.sendStickyBroadcastAsUser(intent, UserHandle.ALL); 55546d0adf8256a42416584765625852b6e48497c90Mike Lockwood } 55646d0adf8256a42416584765625852b6e48497c90Mike Lockwood 557bf91046872dd711019e8dec543441601576cc950Mike Lockwood private void updateAudioSourceFunction() { 558bf91046872dd711019e8dec543441601576cc950Mike Lockwood boolean enabled = containsFunction(mCurrentFunctions, 559bf91046872dd711019e8dec543441601576cc950Mike Lockwood UsbManager.USB_FUNCTION_AUDIO_SOURCE); 560bf91046872dd711019e8dec543441601576cc950Mike Lockwood if (enabled != mAudioSourceEnabled) { 561bf91046872dd711019e8dec543441601576cc950Mike Lockwood // send a sticky broadcast containing current USB state 562bf91046872dd711019e8dec543441601576cc950Mike Lockwood Intent intent = new Intent(Intent.ACTION_USB_AUDIO_ACCESSORY_PLUG); 563bf91046872dd711019e8dec543441601576cc950Mike Lockwood intent.addFlags(Intent.FLAG_RECEIVER_REPLACE_PENDING); 564bf91046872dd711019e8dec543441601576cc950Mike Lockwood intent.addFlags(Intent.FLAG_RECEIVER_REGISTERED_ONLY); 565bf91046872dd711019e8dec543441601576cc950Mike Lockwood intent.putExtra("state", (enabled ? 1 : 0)); 566bf91046872dd711019e8dec543441601576cc950Mike Lockwood if (enabled) { 567bf91046872dd711019e8dec543441601576cc950Mike Lockwood try { 568bf91046872dd711019e8dec543441601576cc950Mike Lockwood Scanner scanner = new Scanner(new File(AUDIO_SOURCE_PCM_PATH)); 569bf91046872dd711019e8dec543441601576cc950Mike Lockwood int card = scanner.nextInt(); 570bf91046872dd711019e8dec543441601576cc950Mike Lockwood int device = scanner.nextInt(); 571bf91046872dd711019e8dec543441601576cc950Mike Lockwood intent.putExtra("card", card); 572bf91046872dd711019e8dec543441601576cc950Mike Lockwood intent.putExtra("device", device); 573bf91046872dd711019e8dec543441601576cc950Mike Lockwood } catch (FileNotFoundException e) { 574bf91046872dd711019e8dec543441601576cc950Mike Lockwood Slog.e(TAG, "could not open audio source PCM file", e); 575bf91046872dd711019e8dec543441601576cc950Mike Lockwood } 5769d5a4be05b6d51ebb768e5fbcfa27ed9a39269b3Mike Lockwood } 5775ac72a29593ab9a20337a2225df52bdf4754be02Dianne Hackborn mContext.sendStickyBroadcastAsUser(intent, UserHandle.ALL); 578bf91046872dd711019e8dec543441601576cc950Mike Lockwood mAudioSourceEnabled = enabled; 5799d5a4be05b6d51ebb768e5fbcfa27ed9a39269b3Mike Lockwood } 5809d5a4be05b6d51ebb768e5fbcfa27ed9a39269b3Mike Lockwood } 5819d5a4be05b6d51ebb768e5fbcfa27ed9a39269b3Mike Lockwood 58202e4569b5f126ca916a7473117ddd17d4f2ccbbbMike Lockwood @Override 58302e4569b5f126ca916a7473117ddd17d4f2ccbbbMike Lockwood public void handleMessage(Message msg) { 58402e4569b5f126ca916a7473117ddd17d4f2ccbbbMike Lockwood switch (msg.what) { 58502e4569b5f126ca916a7473117ddd17d4f2ccbbbMike Lockwood case MSG_UPDATE_STATE: 58602e4569b5f126ca916a7473117ddd17d4f2ccbbbMike Lockwood mConnected = (msg.arg1 == 1); 58702e4569b5f126ca916a7473117ddd17d4f2ccbbbMike Lockwood mConfigured = (msg.arg2 == 1); 588d8404d2fdd7036435748548a6791063fb6d6c909Mike Lockwood updateUsbNotification(); 589d8404d2fdd7036435748548a6791063fb6d6c909Mike Lockwood updateAdbNotification(); 59002e4569b5f126ca916a7473117ddd17d4f2ccbbbMike Lockwood if (containsFunction(mCurrentFunctions, 59102e4569b5f126ca916a7473117ddd17d4f2ccbbbMike Lockwood UsbManager.USB_FUNCTION_ACCESSORY)) { 59202e4569b5f126ca916a7473117ddd17d4f2ccbbbMike Lockwood updateCurrentAccessory(); 59302e4569b5f126ca916a7473117ddd17d4f2ccbbbMike Lockwood } 59402e4569b5f126ca916a7473117ddd17d4f2ccbbbMike Lockwood 59502e4569b5f126ca916a7473117ddd17d4f2ccbbbMike Lockwood if (!mConnected) { 59602e4569b5f126ca916a7473117ddd17d4f2ccbbbMike Lockwood // restore defaults when USB is disconnected 59768736cbf938935f7d7e1eb2b3f9ec911fcb0da72Mike Lockwood setEnabledFunctions(mDefaultFunctions, false); 59802e4569b5f126ca916a7473117ddd17d4f2ccbbbMike Lockwood } 599d462ecf8f82076d21c85bdeeefbd16a1a91d2805Mike Lockwood if (mBootCompleted) { 60002e4569b5f126ca916a7473117ddd17d4f2ccbbbMike Lockwood updateUsbState(); 601bf91046872dd711019e8dec543441601576cc950Mike Lockwood updateAudioSourceFunction(); 60202e4569b5f126ca916a7473117ddd17d4f2ccbbbMike Lockwood } 60302e4569b5f126ca916a7473117ddd17d4f2ccbbbMike Lockwood break; 60402e4569b5f126ca916a7473117ddd17d4f2ccbbbMike Lockwood case MSG_ENABLE_ADB: 60502e4569b5f126ca916a7473117ddd17d4f2ccbbbMike Lockwood setAdbEnabled(msg.arg1 == 1); 60602e4569b5f126ca916a7473117ddd17d4f2ccbbbMike Lockwood break; 607166b05e0ce913711d27ce1a116b3f1fd906822e4Mike Lockwood case MSG_SET_CURRENT_FUNCTIONS: 608166b05e0ce913711d27ce1a116b3f1fd906822e4Mike Lockwood String functions = (String)msg.obj; 609f59717ddb5ef324ee3fdb12b83e7d1b709793d28Mike Lockwood boolean makeDefault = (msg.arg1 == 1); 610166b05e0ce913711d27ce1a116b3f1fd906822e4Mike Lockwood setEnabledFunctions(functions, makeDefault); 61102e4569b5f126ca916a7473117ddd17d4f2ccbbbMike Lockwood break; 61202e4569b5f126ca916a7473117ddd17d4f2ccbbbMike Lockwood case MSG_SYSTEM_READY: 613d8404d2fdd7036435748548a6791063fb6d6c909Mike Lockwood updateUsbNotification(); 614d8404d2fdd7036435748548a6791063fb6d6c909Mike Lockwood updateAdbNotification(); 61502e4569b5f126ca916a7473117ddd17d4f2ccbbbMike Lockwood updateUsbState(); 616bf91046872dd711019e8dec543441601576cc950Mike Lockwood updateAudioSourceFunction(); 617d462ecf8f82076d21c85bdeeefbd16a1a91d2805Mike Lockwood break; 618d462ecf8f82076d21c85bdeeefbd16a1a91d2805Mike Lockwood case MSG_BOOT_COMPLETED: 619d462ecf8f82076d21c85bdeeefbd16a1a91d2805Mike Lockwood mBootCompleted = true; 620d462ecf8f82076d21c85bdeeefbd16a1a91d2805Mike Lockwood if (mCurrentAccessory != null) { 62102e4569b5f126ca916a7473117ddd17d4f2ccbbbMike Lockwood mSettingsManager.accessoryAttached(mCurrentAccessory); 62202e4569b5f126ca916a7473117ddd17d4f2ccbbbMike Lockwood } 6234e68bd420b6cfdbeadb5e69aa6448665b2da762bBenoit Goby if (mDebuggingManager != null) { 6244e68bd420b6cfdbeadb5e69aa6448665b2da762bBenoit Goby mDebuggingManager.setAdbEnabled(mAdbEnabled); 6254e68bd420b6cfdbeadb5e69aa6448665b2da762bBenoit Goby } 62602e4569b5f126ca916a7473117ddd17d4f2ccbbbMike Lockwood break; 62727bd34d9d9fe99f11b80aa0bbdb402fb47ef4158Jeff Sharkey case MSG_USER_SWITCHED: { 62827bd34d9d9fe99f11b80aa0bbdb402fb47ef4158Jeff Sharkey final boolean mtpActive = 62927bd34d9d9fe99f11b80aa0bbdb402fb47ef4158Jeff Sharkey containsFunction(mCurrentFunctions, UsbManager.USB_FUNCTION_MTP) 63027bd34d9d9fe99f11b80aa0bbdb402fb47ef4158Jeff Sharkey || containsFunction(mCurrentFunctions, UsbManager.USB_FUNCTION_PTP); 63127bd34d9d9fe99f11b80aa0bbdb402fb47ef4158Jeff Sharkey if (mtpActive && mCurrentUser != UserHandle.USER_NULL) { 63227bd34d9d9fe99f11b80aa0bbdb402fb47ef4158Jeff Sharkey Slog.v(TAG, "Current user switched; resetting USB host stack for MTP"); 63327bd34d9d9fe99f11b80aa0bbdb402fb47ef4158Jeff Sharkey setUsbConfig("none"); 63427bd34d9d9fe99f11b80aa0bbdb402fb47ef4158Jeff Sharkey setUsbConfig(mCurrentFunctions); 63527bd34d9d9fe99f11b80aa0bbdb402fb47ef4158Jeff Sharkey } 63627bd34d9d9fe99f11b80aa0bbdb402fb47ef4158Jeff Sharkey mCurrentUser = msg.arg1; 63727bd34d9d9fe99f11b80aa0bbdb402fb47ef4158Jeff Sharkey break; 63827bd34d9d9fe99f11b80aa0bbdb402fb47ef4158Jeff Sharkey } 63946d0adf8256a42416584765625852b6e48497c90Mike Lockwood } 64046d0adf8256a42416584765625852b6e48497c90Mike Lockwood } 64146d0adf8256a42416584765625852b6e48497c90Mike Lockwood 64202e4569b5f126ca916a7473117ddd17d4f2ccbbbMike Lockwood public UsbAccessory getCurrentAccessory() { 64302e4569b5f126ca916a7473117ddd17d4f2ccbbbMike Lockwood return mCurrentAccessory; 64402e4569b5f126ca916a7473117ddd17d4f2ccbbbMike Lockwood } 64502e4569b5f126ca916a7473117ddd17d4f2ccbbbMike Lockwood 646d8404d2fdd7036435748548a6791063fb6d6c909Mike Lockwood private void updateUsbNotification() { 647d8404d2fdd7036435748548a6791063fb6d6c909Mike Lockwood if (mNotificationManager == null || !mUseUsbNotification) return; 648fadd2b8e0ffea0d5b4bf3ca16af4d5cea001b561Mike Lockwood int id = 0; 649a5010431bfcdff88ac9d96e68d8308071c13472bMike Lockwood Resources r = mContext.getResources(); 650d8404d2fdd7036435748548a6791063fb6d6c909Mike Lockwood if (mConnected) { 651d8404d2fdd7036435748548a6791063fb6d6c909Mike Lockwood if (containsFunction(mCurrentFunctions, UsbManager.USB_FUNCTION_MTP)) { 652fadd2b8e0ffea0d5b4bf3ca16af4d5cea001b561Mike Lockwood id = com.android.internal.R.string.usb_mtp_notification_title; 653d8404d2fdd7036435748548a6791063fb6d6c909Mike Lockwood } else if (containsFunction(mCurrentFunctions, UsbManager.USB_FUNCTION_PTP)) { 654fadd2b8e0ffea0d5b4bf3ca16af4d5cea001b561Mike Lockwood id = com.android.internal.R.string.usb_ptp_notification_title; 655d8404d2fdd7036435748548a6791063fb6d6c909Mike Lockwood } else if (containsFunction(mCurrentFunctions, 656d8404d2fdd7036435748548a6791063fb6d6c909Mike Lockwood UsbManager.USB_FUNCTION_MASS_STORAGE)) { 657fadd2b8e0ffea0d5b4bf3ca16af4d5cea001b561Mike Lockwood id = com.android.internal.R.string.usb_cd_installer_notification_title; 6586e680dea3bc9e2d4ba1a09f428c303cd2a59c051Mike Lockwood } else if (containsFunction(mCurrentFunctions, UsbManager.USB_FUNCTION_ACCESSORY)) { 659fadd2b8e0ffea0d5b4bf3ca16af4d5cea001b561Mike Lockwood id = com.android.internal.R.string.usb_accessory_notification_title; 660d8404d2fdd7036435748548a6791063fb6d6c909Mike Lockwood } else { 661a5010431bfcdff88ac9d96e68d8308071c13472bMike Lockwood // There is a different notification for USB tethering so we don't need one here 662a5010431bfcdff88ac9d96e68d8308071c13472bMike Lockwood if (!containsFunction(mCurrentFunctions, UsbManager.USB_FUNCTION_RNDIS)) { 663a5010431bfcdff88ac9d96e68d8308071c13472bMike Lockwood Slog.e(TAG, "No known USB function in updateUsbNotification"); 664d8404d2fdd7036435748548a6791063fb6d6c909Mike Lockwood } 665d8404d2fdd7036435748548a6791063fb6d6c909Mike Lockwood } 666a5010431bfcdff88ac9d96e68d8308071c13472bMike Lockwood } 667a5010431bfcdff88ac9d96e68d8308071c13472bMike Lockwood if (id != mUsbNotificationId) { 668a5010431bfcdff88ac9d96e68d8308071c13472bMike Lockwood // clear notification if title needs changing 669fadd2b8e0ffea0d5b4bf3ca16af4d5cea001b561Mike Lockwood if (mUsbNotificationId != 0) { 67050cdf7c3069eb2cf82acbad73c322b7a5f3af4b1Dianne Hackborn mNotificationManager.cancelAsUser(null, mUsbNotificationId, 67150cdf7c3069eb2cf82acbad73c322b7a5f3af4b1Dianne Hackborn UserHandle.ALL); 672fadd2b8e0ffea0d5b4bf3ca16af4d5cea001b561Mike Lockwood mUsbNotificationId = 0; 673a5010431bfcdff88ac9d96e68d8308071c13472bMike Lockwood } 674fadd2b8e0ffea0d5b4bf3ca16af4d5cea001b561Mike Lockwood if (id != 0) { 675d8404d2fdd7036435748548a6791063fb6d6c909Mike Lockwood CharSequence message = r.getText( 676d8404d2fdd7036435748548a6791063fb6d6c909Mike Lockwood com.android.internal.R.string.usb_notification_message); 677fadd2b8e0ffea0d5b4bf3ca16af4d5cea001b561Mike Lockwood CharSequence title = r.getText(id); 678d8404d2fdd7036435748548a6791063fb6d6c909Mike Lockwood 679d8404d2fdd7036435748548a6791063fb6d6c909Mike Lockwood Notification notification = new Notification(); 680d8404d2fdd7036435748548a6791063fb6d6c909Mike Lockwood notification.icon = com.android.internal.R.drawable.stat_sys_data_usb; 681d8404d2fdd7036435748548a6791063fb6d6c909Mike Lockwood notification.when = 0; 682d8404d2fdd7036435748548a6791063fb6d6c909Mike Lockwood notification.flags = Notification.FLAG_ONGOING_EVENT; 683d8404d2fdd7036435748548a6791063fb6d6c909Mike Lockwood notification.tickerText = title; 684d8404d2fdd7036435748548a6791063fb6d6c909Mike Lockwood notification.defaults = 0; // please be quiet 685d8404d2fdd7036435748548a6791063fb6d6c909Mike Lockwood notification.sound = null; 686d8404d2fdd7036435748548a6791063fb6d6c909Mike Lockwood notification.vibrate = null; 68749a2ad1f404622803faba0bc5937b8a39aba02b3Daniel Sandler notification.priority = Notification.PRIORITY_MIN; 688d8404d2fdd7036435748548a6791063fb6d6c909Mike Lockwood 689765f97d5e608031bc1de4156c6e681e4d178c7eeChristopher Tate Intent intent = Intent.makeRestartActivityTask( 690765f97d5e608031bc1de4156c6e681e4d178c7eeChristopher Tate new ComponentName("com.android.settings", 691765f97d5e608031bc1de4156c6e681e4d178c7eeChristopher Tate "com.android.settings.UsbSettings")); 69250cdf7c3069eb2cf82acbad73c322b7a5f3af4b1Dianne Hackborn PendingIntent pi = PendingIntent.getActivityAsUser(mContext, 0, 69350cdf7c3069eb2cf82acbad73c322b7a5f3af4b1Dianne Hackborn intent, 0, null, UserHandle.CURRENT); 694d8404d2fdd7036435748548a6791063fb6d6c909Mike Lockwood notification.setLatestEventInfo(mContext, title, message, pi); 69550cdf7c3069eb2cf82acbad73c322b7a5f3af4b1Dianne Hackborn mNotificationManager.notifyAsUser(null, id, notification, 69650cdf7c3069eb2cf82acbad73c322b7a5f3af4b1Dianne Hackborn UserHandle.ALL); 697d8404d2fdd7036435748548a6791063fb6d6c909Mike Lockwood mUsbNotificationId = id; 698d8404d2fdd7036435748548a6791063fb6d6c909Mike Lockwood } 699d8404d2fdd7036435748548a6791063fb6d6c909Mike Lockwood } 700d8404d2fdd7036435748548a6791063fb6d6c909Mike Lockwood } 701d8404d2fdd7036435748548a6791063fb6d6c909Mike Lockwood 702d8404d2fdd7036435748548a6791063fb6d6c909Mike Lockwood private void updateAdbNotification() { 703d8404d2fdd7036435748548a6791063fb6d6c909Mike Lockwood if (mNotificationManager == null) return; 704fadd2b8e0ffea0d5b4bf3ca16af4d5cea001b561Mike Lockwood final int id = com.android.internal.R.string.adb_active_notification_title; 705d8404d2fdd7036435748548a6791063fb6d6c909Mike Lockwood if (mAdbEnabled && mConnected) { 706d8404d2fdd7036435748548a6791063fb6d6c909Mike Lockwood if ("0".equals(SystemProperties.get("persist.adb.notify"))) return; 707d8404d2fdd7036435748548a6791063fb6d6c909Mike Lockwood 708d8404d2fdd7036435748548a6791063fb6d6c909Mike Lockwood if (!mAdbNotificationShown) { 709d8404d2fdd7036435748548a6791063fb6d6c909Mike Lockwood Resources r = mContext.getResources(); 710fadd2b8e0ffea0d5b4bf3ca16af4d5cea001b561Mike Lockwood CharSequence title = r.getText(id); 711d8404d2fdd7036435748548a6791063fb6d6c909Mike Lockwood CharSequence message = r.getText( 712d8404d2fdd7036435748548a6791063fb6d6c909Mike Lockwood com.android.internal.R.string.adb_active_notification_message); 713d8404d2fdd7036435748548a6791063fb6d6c909Mike Lockwood 714d8404d2fdd7036435748548a6791063fb6d6c909Mike Lockwood Notification notification = new Notification(); 715d8404d2fdd7036435748548a6791063fb6d6c909Mike Lockwood notification.icon = com.android.internal.R.drawable.stat_sys_adb; 716d8404d2fdd7036435748548a6791063fb6d6c909Mike Lockwood notification.when = 0; 717d8404d2fdd7036435748548a6791063fb6d6c909Mike Lockwood notification.flags = Notification.FLAG_ONGOING_EVENT; 718d8404d2fdd7036435748548a6791063fb6d6c909Mike Lockwood notification.tickerText = title; 719d8404d2fdd7036435748548a6791063fb6d6c909Mike Lockwood notification.defaults = 0; // please be quiet 720d8404d2fdd7036435748548a6791063fb6d6c909Mike Lockwood notification.sound = null; 721d8404d2fdd7036435748548a6791063fb6d6c909Mike Lockwood notification.vibrate = null; 722a25079e6bafcfd77135a852f0e838738d80606efDaniel Sandler notification.priority = Notification.PRIORITY_LOW; 723d8404d2fdd7036435748548a6791063fb6d6c909Mike Lockwood 724765f97d5e608031bc1de4156c6e681e4d178c7eeChristopher Tate Intent intent = Intent.makeRestartActivityTask( 725765f97d5e608031bc1de4156c6e681e4d178c7eeChristopher Tate new ComponentName("com.android.settings", 726765f97d5e608031bc1de4156c6e681e4d178c7eeChristopher Tate "com.android.settings.DevelopmentSettings")); 72750cdf7c3069eb2cf82acbad73c322b7a5f3af4b1Dianne Hackborn PendingIntent pi = PendingIntent.getActivityAsUser(mContext, 0, 72850cdf7c3069eb2cf82acbad73c322b7a5f3af4b1Dianne Hackborn intent, 0, null, UserHandle.CURRENT); 729d8404d2fdd7036435748548a6791063fb6d6c909Mike Lockwood notification.setLatestEventInfo(mContext, title, message, pi); 730d8404d2fdd7036435748548a6791063fb6d6c909Mike Lockwood mAdbNotificationShown = true; 73150cdf7c3069eb2cf82acbad73c322b7a5f3af4b1Dianne Hackborn mNotificationManager.notifyAsUser(null, id, notification, 73250cdf7c3069eb2cf82acbad73c322b7a5f3af4b1Dianne Hackborn UserHandle.ALL); 733d8404d2fdd7036435748548a6791063fb6d6c909Mike Lockwood } 734d8404d2fdd7036435748548a6791063fb6d6c909Mike Lockwood } else if (mAdbNotificationShown) { 735d8404d2fdd7036435748548a6791063fb6d6c909Mike Lockwood mAdbNotificationShown = false; 73650cdf7c3069eb2cf82acbad73c322b7a5f3af4b1Dianne Hackborn mNotificationManager.cancelAsUser(null, id, UserHandle.ALL); 737d8404d2fdd7036435748548a6791063fb6d6c909Mike Lockwood } 738d8404d2fdd7036435748548a6791063fb6d6c909Mike Lockwood } 739d8404d2fdd7036435748548a6791063fb6d6c909Mike Lockwood 74002e4569b5f126ca916a7473117ddd17d4f2ccbbbMike Lockwood public void dump(FileDescriptor fd, PrintWriter pw) { 74102e4569b5f126ca916a7473117ddd17d4f2ccbbbMike Lockwood pw.println(" USB Device State:"); 74202e4569b5f126ca916a7473117ddd17d4f2ccbbbMike Lockwood pw.println(" Current Functions: " + mCurrentFunctions); 74302e4569b5f126ca916a7473117ddd17d4f2ccbbbMike Lockwood pw.println(" Default Functions: " + mDefaultFunctions); 74402e4569b5f126ca916a7473117ddd17d4f2ccbbbMike Lockwood pw.println(" mConnected: " + mConnected); 74502e4569b5f126ca916a7473117ddd17d4f2ccbbbMike Lockwood pw.println(" mConfigured: " + mConfigured); 74602e4569b5f126ca916a7473117ddd17d4f2ccbbbMike Lockwood pw.println(" mCurrentAccessory: " + mCurrentAccessory); 7476ea146c239f2468563b4e8766b446d14ae4a1ff5Mike Lockwood try { 7486ea146c239f2468563b4e8766b446d14ae4a1ff5Mike Lockwood pw.println(" Kernel state: " 7496ea146c239f2468563b4e8766b446d14ae4a1ff5Mike Lockwood + FileUtils.readTextFile(new File(STATE_PATH), 0, null).trim()); 7506ea146c239f2468563b4e8766b446d14ae4a1ff5Mike Lockwood pw.println(" Kernel function list: " 7516ea146c239f2468563b4e8766b446d14ae4a1ff5Mike Lockwood + FileUtils.readTextFile(new File(FUNCTIONS_PATH), 0, null).trim()); 7526ea146c239f2468563b4e8766b446d14ae4a1ff5Mike Lockwood pw.println(" Mass storage backing file: " 7536ea146c239f2468563b4e8766b446d14ae4a1ff5Mike Lockwood + FileUtils.readTextFile(new File(MASS_STORAGE_FILE_PATH), 0, null).trim()); 7546ea146c239f2468563b4e8766b446d14ae4a1ff5Mike Lockwood } catch (IOException e) { 7556ea146c239f2468563b4e8766b446d14ae4a1ff5Mike Lockwood pw.println("IOException: " + e); 7566ea146c239f2468563b4e8766b446d14ae4a1ff5Mike Lockwood } 75702e4569b5f126ca916a7473117ddd17d4f2ccbbbMike Lockwood } 75846d0adf8256a42416584765625852b6e48497c90Mike Lockwood } 75946d0adf8256a42416584765625852b6e48497c90Mike Lockwood 76002e4569b5f126ca916a7473117ddd17d4f2ccbbbMike Lockwood /* returns the currently attached USB accessory */ 76146d0adf8256a42416584765625852b6e48497c90Mike Lockwood public UsbAccessory getCurrentAccessory() { 76202e4569b5f126ca916a7473117ddd17d4f2ccbbbMike Lockwood return mHandler.getCurrentAccessory(); 76346d0adf8256a42416584765625852b6e48497c90Mike Lockwood } 76446d0adf8256a42416584765625852b6e48497c90Mike Lockwood 76502e4569b5f126ca916a7473117ddd17d4f2ccbbbMike Lockwood /* opens the currently attached USB accessory */ 766abc4ac6d48c52bd8b69026441bf261e5c68c24f4Mike Lockwood public ParcelFileDescriptor openAccessory(UsbAccessory accessory) { 767abc4ac6d48c52bd8b69026441bf261e5c68c24f4Mike Lockwood UsbAccessory currentAccessory = mHandler.getCurrentAccessory(); 768abc4ac6d48c52bd8b69026441bf261e5c68c24f4Mike Lockwood if (currentAccessory == null) { 769abc4ac6d48c52bd8b69026441bf261e5c68c24f4Mike Lockwood throw new IllegalArgumentException("no accessory attached"); 77046d0adf8256a42416584765625852b6e48497c90Mike Lockwood } 771abc4ac6d48c52bd8b69026441bf261e5c68c24f4Mike Lockwood if (!currentAccessory.equals(accessory)) { 772abc4ac6d48c52bd8b69026441bf261e5c68c24f4Mike Lockwood String error = accessory.toString() 773abc4ac6d48c52bd8b69026441bf261e5c68c24f4Mike Lockwood + " does not match current accessory " 774abc4ac6d48c52bd8b69026441bf261e5c68c24f4Mike Lockwood + currentAccessory; 775abc4ac6d48c52bd8b69026441bf261e5c68c24f4Mike Lockwood throw new IllegalArgumentException(error); 776abc4ac6d48c52bd8b69026441bf261e5c68c24f4Mike Lockwood } 777abc4ac6d48c52bd8b69026441bf261e5c68c24f4Mike Lockwood mSettingsManager.checkPermission(accessory); 778abc4ac6d48c52bd8b69026441bf261e5c68c24f4Mike Lockwood return nativeOpenAccessory(); 779abc4ac6d48c52bd8b69026441bf261e5c68c24f4Mike Lockwood } 78002e4569b5f126ca916a7473117ddd17d4f2ccbbbMike Lockwood 781166b05e0ce913711d27ce1a116b3f1fd906822e4Mike Lockwood public void setCurrentFunctions(String functions, boolean makeDefault) { 782166b05e0ce913711d27ce1a116b3f1fd906822e4Mike Lockwood if (DEBUG) Slog.d(TAG, "setCurrentFunctions(" + functions + ") default: " + makeDefault); 783166b05e0ce913711d27ce1a116b3f1fd906822e4Mike Lockwood mHandler.sendMessage(MSG_SET_CURRENT_FUNCTIONS, functions, makeDefault); 78402e4569b5f126ca916a7473117ddd17d4f2ccbbbMike Lockwood } 78546d0adf8256a42416584765625852b6e48497c90Mike Lockwood 78602e4569b5f126ca916a7473117ddd17d4f2ccbbbMike Lockwood public void setMassStorageBackingFile(String path) { 78702e4569b5f126ca916a7473117ddd17d4f2ccbbbMike Lockwood if (path == null) path = ""; 78802e4569b5f126ca916a7473117ddd17d4f2ccbbbMike Lockwood try { 78902e4569b5f126ca916a7473117ddd17d4f2ccbbbMike Lockwood FileUtils.stringToFile(MASS_STORAGE_FILE_PATH, path); 79002e4569b5f126ca916a7473117ddd17d4f2ccbbbMike Lockwood } catch (IOException e) { 79102e4569b5f126ca916a7473117ddd17d4f2ccbbbMike Lockwood Slog.e(TAG, "failed to write to " + MASS_STORAGE_FILE_PATH); 79246d0adf8256a42416584765625852b6e48497c90Mike Lockwood } 79302e4569b5f126ca916a7473117ddd17d4f2ccbbbMike Lockwood } 79446d0adf8256a42416584765625852b6e48497c90Mike Lockwood 795afd8f1820eeee21e960be44b22113dc2cecacf98Kazuhiro Ondo private void readOemUsbOverrideConfig() { 796afd8f1820eeee21e960be44b22113dc2cecacf98Kazuhiro Ondo String[] configList = mContext.getResources().getStringArray( 797afd8f1820eeee21e960be44b22113dc2cecacf98Kazuhiro Ondo com.android.internal.R.array.config_oemUsbModeOverride); 798afd8f1820eeee21e960be44b22113dc2cecacf98Kazuhiro Ondo 799afd8f1820eeee21e960be44b22113dc2cecacf98Kazuhiro Ondo if (configList != null) { 800afd8f1820eeee21e960be44b22113dc2cecacf98Kazuhiro Ondo for (String config: configList) { 801afd8f1820eeee21e960be44b22113dc2cecacf98Kazuhiro Ondo String[] items = config.split(":"); 802afd8f1820eeee21e960be44b22113dc2cecacf98Kazuhiro Ondo if (items.length == 3) { 803afd8f1820eeee21e960be44b22113dc2cecacf98Kazuhiro Ondo if (mOemModeMap == null) { 804afd8f1820eeee21e960be44b22113dc2cecacf98Kazuhiro Ondo mOemModeMap = new HashMap<String, List<Pair<String, String>>>(); 805afd8f1820eeee21e960be44b22113dc2cecacf98Kazuhiro Ondo } 806afd8f1820eeee21e960be44b22113dc2cecacf98Kazuhiro Ondo List overrideList = mOemModeMap.get(items[0]); 807afd8f1820eeee21e960be44b22113dc2cecacf98Kazuhiro Ondo if (overrideList == null) { 808afd8f1820eeee21e960be44b22113dc2cecacf98Kazuhiro Ondo overrideList = new LinkedList<Pair<String, String>>(); 809afd8f1820eeee21e960be44b22113dc2cecacf98Kazuhiro Ondo mOemModeMap.put(items[0], overrideList); 810afd8f1820eeee21e960be44b22113dc2cecacf98Kazuhiro Ondo } 811afd8f1820eeee21e960be44b22113dc2cecacf98Kazuhiro Ondo overrideList.add(new Pair<String, String>(items[1], items[2])); 812afd8f1820eeee21e960be44b22113dc2cecacf98Kazuhiro Ondo } 813afd8f1820eeee21e960be44b22113dc2cecacf98Kazuhiro Ondo } 814afd8f1820eeee21e960be44b22113dc2cecacf98Kazuhiro Ondo } 815afd8f1820eeee21e960be44b22113dc2cecacf98Kazuhiro Ondo } 816afd8f1820eeee21e960be44b22113dc2cecacf98Kazuhiro Ondo 817afd8f1820eeee21e960be44b22113dc2cecacf98Kazuhiro Ondo private boolean needsOemUsbOverride() { 818afd8f1820eeee21e960be44b22113dc2cecacf98Kazuhiro Ondo if (mOemModeMap == null) return false; 819afd8f1820eeee21e960be44b22113dc2cecacf98Kazuhiro Ondo 820afd8f1820eeee21e960be44b22113dc2cecacf98Kazuhiro Ondo String bootMode = SystemProperties.get(BOOT_MODE_PROPERTY, "unknown"); 821afd8f1820eeee21e960be44b22113dc2cecacf98Kazuhiro Ondo return (mOemModeMap.get(bootMode) != null) ? true : false; 822afd8f1820eeee21e960be44b22113dc2cecacf98Kazuhiro Ondo } 823afd8f1820eeee21e960be44b22113dc2cecacf98Kazuhiro Ondo 824afd8f1820eeee21e960be44b22113dc2cecacf98Kazuhiro Ondo private String processOemUsbOverride(String usbFunctions) { 825afd8f1820eeee21e960be44b22113dc2cecacf98Kazuhiro Ondo if ((usbFunctions == null) || (mOemModeMap == null)) return usbFunctions; 826afd8f1820eeee21e960be44b22113dc2cecacf98Kazuhiro Ondo 827afd8f1820eeee21e960be44b22113dc2cecacf98Kazuhiro Ondo String bootMode = SystemProperties.get(BOOT_MODE_PROPERTY, "unknown"); 828afd8f1820eeee21e960be44b22113dc2cecacf98Kazuhiro Ondo 829afd8f1820eeee21e960be44b22113dc2cecacf98Kazuhiro Ondo List<Pair<String, String>> overrides = mOemModeMap.get(bootMode); 830afd8f1820eeee21e960be44b22113dc2cecacf98Kazuhiro Ondo if (overrides != null) { 831afd8f1820eeee21e960be44b22113dc2cecacf98Kazuhiro Ondo for (Pair<String, String> pair: overrides) { 832afd8f1820eeee21e960be44b22113dc2cecacf98Kazuhiro Ondo if (pair.first.equals(usbFunctions)) { 833afd8f1820eeee21e960be44b22113dc2cecacf98Kazuhiro Ondo Slog.d(TAG, "OEM USB override: " + pair.first + " ==> " + pair.second); 834afd8f1820eeee21e960be44b22113dc2cecacf98Kazuhiro Ondo return pair.second; 835afd8f1820eeee21e960be44b22113dc2cecacf98Kazuhiro Ondo } 836afd8f1820eeee21e960be44b22113dc2cecacf98Kazuhiro Ondo } 837afd8f1820eeee21e960be44b22113dc2cecacf98Kazuhiro Ondo } 838afd8f1820eeee21e960be44b22113dc2cecacf98Kazuhiro Ondo // return passed in functions as is. 839afd8f1820eeee21e960be44b22113dc2cecacf98Kazuhiro Ondo return usbFunctions; 840afd8f1820eeee21e960be44b22113dc2cecacf98Kazuhiro Ondo } 841afd8f1820eeee21e960be44b22113dc2cecacf98Kazuhiro Ondo 8424e68bd420b6cfdbeadb5e69aa6448665b2da762bBenoit Goby public void allowUsbDebugging(boolean alwaysAllow, String publicKey) { 8434e68bd420b6cfdbeadb5e69aa6448665b2da762bBenoit Goby if (mDebuggingManager != null) { 8444e68bd420b6cfdbeadb5e69aa6448665b2da762bBenoit Goby mDebuggingManager.allowUsbDebugging(alwaysAllow, publicKey); 8454e68bd420b6cfdbeadb5e69aa6448665b2da762bBenoit Goby } 8464e68bd420b6cfdbeadb5e69aa6448665b2da762bBenoit Goby } 8474e68bd420b6cfdbeadb5e69aa6448665b2da762bBenoit Goby 8484e68bd420b6cfdbeadb5e69aa6448665b2da762bBenoit Goby public void denyUsbDebugging() { 8494e68bd420b6cfdbeadb5e69aa6448665b2da762bBenoit Goby if (mDebuggingManager != null) { 8504e68bd420b6cfdbeadb5e69aa6448665b2da762bBenoit Goby mDebuggingManager.denyUsbDebugging(); 8514e68bd420b6cfdbeadb5e69aa6448665b2da762bBenoit Goby } 8524e68bd420b6cfdbeadb5e69aa6448665b2da762bBenoit Goby } 8534e68bd420b6cfdbeadb5e69aa6448665b2da762bBenoit Goby 85446d0adf8256a42416584765625852b6e48497c90Mike Lockwood public void dump(FileDescriptor fd, PrintWriter pw) { 85502e4569b5f126ca916a7473117ddd17d4f2ccbbbMike Lockwood if (mHandler != null) { 85602e4569b5f126ca916a7473117ddd17d4f2ccbbbMike Lockwood mHandler.dump(fd, pw); 85746d0adf8256a42416584765625852b6e48497c90Mike Lockwood } 8584e68bd420b6cfdbeadb5e69aa6448665b2da762bBenoit Goby if (mDebuggingManager != null) { 8594e68bd420b6cfdbeadb5e69aa6448665b2da762bBenoit Goby mDebuggingManager.dump(fd, pw); 8604e68bd420b6cfdbeadb5e69aa6448665b2da762bBenoit Goby } 86146d0adf8256a42416584765625852b6e48497c90Mike Lockwood } 86246d0adf8256a42416584765625852b6e48497c90Mike Lockwood 86346d0adf8256a42416584765625852b6e48497c90Mike Lockwood private native String[] nativeGetAccessoryStrings(); 86446d0adf8256a42416584765625852b6e48497c90Mike Lockwood private native ParcelFileDescriptor nativeOpenAccessory(); 865d462ecf8f82076d21c85bdeeefbd16a1a91d2805Mike Lockwood private native boolean nativeIsStartRequested(); 866166b05e0ce913711d27ce1a116b3f1fd906822e4Mike Lockwood private native int nativeGetAudioMode(); 86746d0adf8256a42416584765625852b6e48497c90Mike Lockwood} 868