am da2bbaf2
: am 2c7b913e
: am 5daec5b5
: Merge "UsbDeviceManager: Fix race condition entering USB accessory mode" into klp-dev
* commit 'da2bbaf219117f7507c5c0015c41347a9cc27507': UsbDeviceManager: Fix race condition entering USB accessory mode
This commit is contained in:
@ -98,6 +98,13 @@ public class UsbDeviceManager {
|
||||
// which need debouncing.
|
||||
private static final int UPDATE_DELAY = 1000;
|
||||
|
||||
// Time we received a request to enter USB accessory mode
|
||||
private long mAccessoryModeRequestTime = 0;
|
||||
|
||||
// Timeout for entering USB request mode.
|
||||
// Request is cancelled if host does not configure device within 10 seconds.
|
||||
private static final int ACCESSORY_REQUEST_TIMEOUT = 10 * 1000;
|
||||
|
||||
private static final String BOOT_MODE_PROPERTY = "ro.bootmode";
|
||||
|
||||
private UsbHandler mHandler;
|
||||
@ -205,6 +212,8 @@ public class UsbDeviceManager {
|
||||
}
|
||||
|
||||
private void startAccessoryMode() {
|
||||
if (!mHasUsbAccessory) return;
|
||||
|
||||
mAccessoryStrings = nativeGetAccessoryStrings();
|
||||
boolean enableAudio = (nativeGetAudioMode() == AUDIO_MODE_SOURCE);
|
||||
// don't start accessory mode if our mandatory strings have not been set
|
||||
@ -223,6 +232,7 @@ public class UsbDeviceManager {
|
||||
}
|
||||
|
||||
if (functions != null) {
|
||||
mAccessoryModeRequestTime = SystemClock.elapsedRealtime();
|
||||
setCurrentFunctions(functions, false);
|
||||
}
|
||||
}
|
||||
@ -456,6 +466,8 @@ public class UsbDeviceManager {
|
||||
}
|
||||
|
||||
private void setEnabledFunctions(String functions, boolean makeDefault) {
|
||||
if (DEBUG) Slog.d(TAG, "setEnabledFunctions " + functions
|
||||
+ " makeDefault: " + makeDefault);
|
||||
|
||||
// Do not update persystent.sys.usb.config if the device is booted up
|
||||
// with OEM specific mode.
|
||||
@ -517,9 +529,17 @@ public class UsbDeviceManager {
|
||||
}
|
||||
|
||||
private void updateCurrentAccessory() {
|
||||
if (!mHasUsbAccessory) return;
|
||||
// We are entering accessory mode if we have received a request from the host
|
||||
// and the request has not timed out yet.
|
||||
boolean enteringAccessoryMode =
|
||||
mAccessoryModeRequestTime > 0 &&
|
||||
SystemClock.elapsedRealtime() <
|
||||
mAccessoryModeRequestTime + ACCESSORY_REQUEST_TIMEOUT;
|
||||
|
||||
if (mConfigured && enteringAccessoryMode) {
|
||||
// successfully entered accessory mode
|
||||
mAccessoryModeRequestTime = 0;
|
||||
|
||||
if (mConfigured) {
|
||||
if (mAccessoryStrings != null) {
|
||||
mCurrentAccessory = new UsbAccessory(mAccessoryStrings);
|
||||
Slog.d(TAG, "entering USB accessory mode: " + mCurrentAccessory);
|
||||
@ -530,7 +550,7 @@ public class UsbDeviceManager {
|
||||
} else {
|
||||
Slog.e(TAG, "nativeGetAccessoryStrings failed");
|
||||
}
|
||||
} else if (!mConnected) {
|
||||
} else if (!enteringAccessoryMode) {
|
||||
// make sure accessory mode is off
|
||||
// and restore default functions
|
||||
Slog.d(TAG, "exited USB accessory mode");
|
||||
@ -560,6 +580,8 @@ public class UsbDeviceManager {
|
||||
}
|
||||
}
|
||||
|
||||
if (DEBUG) Slog.d(TAG, "broadcasting " + intent + " connected: " + mConnected
|
||||
+ " configured: " + mConfigured);
|
||||
mContext.sendStickyBroadcastAsUser(intent, UserHandle.ALL);
|
||||
}
|
||||
|
||||
@ -599,9 +621,7 @@ public class UsbDeviceManager {
|
||||
if (containsFunction(mCurrentFunctions,
|
||||
UsbManager.USB_FUNCTION_ACCESSORY)) {
|
||||
updateCurrentAccessory();
|
||||
}
|
||||
|
||||
if (!mConnected) {
|
||||
} else if (!mConnected) {
|
||||
// restore defaults when USB is disconnected
|
||||
setEnabledFunctions(mDefaultFunctions, false);
|
||||
}
|
||||
|
Reference in New Issue
Block a user