summaryrefslogtreecommitdiffstats
path: root/services/usb
diff options
context:
space:
mode:
authorMike Lockwood <lockwood@google.com>2014-03-14 21:54:13 +0000
committerAndroid Git Automerger <android-git-automerger@android.com>2014-03-14 21:54:13 +0000
commit9428eb82c0cadf897e47475e616d3927cb2524e7 (patch)
tree697d1659b850b8463b72a38c63559274be8991d7 /services/usb
parent421a1dd197a78b014cb9a899a75c0fa43510a59a (diff)
parentc5353ce373f02b549ed9e63aa23f94ca1a726f7e (diff)
downloadframeworks_base-9428eb82c0cadf897e47475e616d3927cb2524e7.zip
frameworks_base-9428eb82c0cadf897e47475e616d3927cb2524e7.tar.gz
frameworks_base-9428eb82c0cadf897e47475e616d3927cb2524e7.tar.bz2
am c5353ce3: am 685831bf: am f9b90434: am ff64f5ed: am 381374b3: Merge "UsbDeviceManager: Fix race condition between accessory start and USB configured uevents" into klp-dev
* commit 'c5353ce373f02b549ed9e63aa23f94ca1a726f7e': UsbDeviceManager: Fix race condition between accessory start and USB configured uevents
Diffstat (limited to 'services/usb')
-rw-r--r--services/usb/java/com/android/server/usb/UsbDeviceManager.java27
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 b925856..efbfb33 100644
--- a/services/usb/java/com/android/server/usb/UsbDeviceManager.java
+++ b/services/usb/java/com/android/server/usb/UsbDeviceManager.java
@@ -90,6 +90,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;
@@ -152,7 +153,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);
}
}
};
@@ -170,7 +171,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);
@@ -232,6 +233,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);
@@ -306,6 +309,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;
@@ -612,6 +616,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,
@@ -625,6 +634,10 @@ public class UsbDeviceManager {
updateUsbState();
updateAudioSourceFunction();
}
+ if (mConnected && mConfigured && mAccessoryStartPending) {
+ startAccessoryMode();
+ mAccessoryStartPending = false;
+ }
break;
case MSG_ENABLE_ADB:
setAdbEnabled(msg.arg1 == 1);
@@ -661,6 +674,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;
}
}