diff options
| author | 2014-03-14 21:50:44 +0000 | |
|---|---|---|
| committer | 2014-03-14 21:50:44 +0000 | |
| commit | c5353ce373f02b549ed9e63aa23f94ca1a726f7e (patch) | |
| tree | 3ad34ce1300595872395505b48d5a8b3a4799642 | |
| parent | 273fe6a327de8051ac075855ceb7b33a9422c7a7 (diff) | |
| parent | 685831bf8da4f89366ce16c1852f25efad046261 (diff) | |
am 685831bf: am f9b90434: am ff64f5ed: am 381374b3: Merge "UsbDeviceManager: Fix race condition between accessory start and USB configured uevents" into klp-dev
* commit '685831bf8da4f89366ce16c1852f25efad046261':
UsbDeviceManager: Fix race condition between accessory start and USB configured uevents
| -rw-r--r-- | services/usb/java/com/android/server/usb/UsbDeviceManager.java | 27 |
1 files changed, 25 insertions, 2 deletions
diff --git a/services/usb/java/com/android/server/usb/UsbDeviceManager.java b/services/usb/java/com/android/server/usb/UsbDeviceManager.java index bef33b9406c6..1c959709cc21 100644 --- a/services/usb/java/com/android/server/usb/UsbDeviceManager.java +++ b/services/usb/java/com/android/server/usb/UsbDeviceManager.java @@ -89,6 +89,7 @@ public class UsbDeviceManager { private static final int MSG_SYSTEM_READY = 3; private static final int MSG_BOOT_COMPLETED = 4; private static final int MSG_USER_SWITCHED = 5; + private static final int MSG_START_ACCESSORY_MODE = 6; private static final int AUDIO_MODE_NONE = 0; private static final int AUDIO_MODE_SOURCE = 1; @@ -151,7 +152,7 @@ public class UsbDeviceManager { mHandler.updateState(state); } else if ("START".equals(accessory)) { if (DEBUG) Slog.d(TAG, "got accessory start"); - startAccessoryMode(); + mHandler.sendEmptyMessage(MSG_START_ACCESSORY_MODE); } } }; @@ -169,7 +170,7 @@ public class UsbDeviceManager { if (nativeIsStartRequested()) { if (DEBUG) Slog.d(TAG, "accessory attached at boot"); - startAccessoryMode(); + mHandler.sendEmptyMessage(MSG_START_ACCESSORY_MODE); } boolean secureAdbEnabled = SystemProperties.getBoolean("ro.adb.secure", false); @@ -231,6 +232,8 @@ public class UsbDeviceManager { functions = UsbManager.USB_FUNCTION_AUDIO_SOURCE; } + if (DEBUG) Slog.d(TAG, "startAccessoryMode: " + functions); + if (functions != null) { mAccessoryModeRequestTime = SystemClock.elapsedRealtime(); setCurrentFunctions(functions, false); @@ -310,6 +313,7 @@ public class UsbDeviceManager { // current USB state private boolean mConnected; private boolean mConfigured; + private boolean mAccessoryStartPending; private String mCurrentFunctions; private String mDefaultFunctions; private UsbAccessory mCurrentAccessory; @@ -616,6 +620,11 @@ public class UsbDeviceManager { case MSG_UPDATE_STATE: mConnected = (msg.arg1 == 1); mConfigured = (msg.arg2 == 1); + + if (!mConnected) { + mAccessoryStartPending = false; + } + updateUsbNotification(); updateAdbNotification(); if (containsFunction(mCurrentFunctions, @@ -629,6 +638,10 @@ public class UsbDeviceManager { updateUsbState(); updateAudioSourceFunction(); } + if (mConnected && mConfigured && mAccessoryStartPending) { + startAccessoryMode(); + mAccessoryStartPending = false; + } break; case MSG_ENABLE_ADB: setAdbEnabled(msg.arg1 == 1); @@ -665,6 +678,16 @@ public class UsbDeviceManager { mCurrentUser = msg.arg1; break; } + case MSG_START_ACCESSORY_MODE: + if (mConnected && mConfigured) { + startAccessoryMode(); + } else { + // we sometimes receive the kernel "accessory start" uevent + // before the "configured" uevent. In this case we need to defer + // handling this event until after we received the configured event + mAccessoryStartPending = true; + } + break; } } |