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.
|
// which need debouncing.
|
||||||
private static final int UPDATE_DELAY = 1000;
|
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 static final String BOOT_MODE_PROPERTY = "ro.bootmode";
|
||||||
|
|
||||||
private UsbHandler mHandler;
|
private UsbHandler mHandler;
|
||||||
@ -205,6 +212,8 @@ public class UsbDeviceManager {
|
|||||||
}
|
}
|
||||||
|
|
||||||
private void startAccessoryMode() {
|
private void startAccessoryMode() {
|
||||||
|
if (!mHasUsbAccessory) return;
|
||||||
|
|
||||||
mAccessoryStrings = nativeGetAccessoryStrings();
|
mAccessoryStrings = nativeGetAccessoryStrings();
|
||||||
boolean enableAudio = (nativeGetAudioMode() == AUDIO_MODE_SOURCE);
|
boolean enableAudio = (nativeGetAudioMode() == AUDIO_MODE_SOURCE);
|
||||||
// don't start accessory mode if our mandatory strings have not been set
|
// don't start accessory mode if our mandatory strings have not been set
|
||||||
@ -223,6 +232,7 @@ public class UsbDeviceManager {
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (functions != null) {
|
if (functions != null) {
|
||||||
|
mAccessoryModeRequestTime = SystemClock.elapsedRealtime();
|
||||||
setCurrentFunctions(functions, false);
|
setCurrentFunctions(functions, false);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -456,6 +466,8 @@ public class UsbDeviceManager {
|
|||||||
}
|
}
|
||||||
|
|
||||||
private void setEnabledFunctions(String functions, boolean makeDefault) {
|
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
|
// Do not update persystent.sys.usb.config if the device is booted up
|
||||||
// with OEM specific mode.
|
// with OEM specific mode.
|
||||||
@ -517,9 +529,17 @@ public class UsbDeviceManager {
|
|||||||
}
|
}
|
||||||
|
|
||||||
private void updateCurrentAccessory() {
|
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) {
|
if (mAccessoryStrings != null) {
|
||||||
mCurrentAccessory = new UsbAccessory(mAccessoryStrings);
|
mCurrentAccessory = new UsbAccessory(mAccessoryStrings);
|
||||||
Slog.d(TAG, "entering USB accessory mode: " + mCurrentAccessory);
|
Slog.d(TAG, "entering USB accessory mode: " + mCurrentAccessory);
|
||||||
@ -530,7 +550,7 @@ public class UsbDeviceManager {
|
|||||||
} else {
|
} else {
|
||||||
Slog.e(TAG, "nativeGetAccessoryStrings failed");
|
Slog.e(TAG, "nativeGetAccessoryStrings failed");
|
||||||
}
|
}
|
||||||
} else if (!mConnected) {
|
} else if (!enteringAccessoryMode) {
|
||||||
// make sure accessory mode is off
|
// make sure accessory mode is off
|
||||||
// and restore default functions
|
// and restore default functions
|
||||||
Slog.d(TAG, "exited USB accessory mode");
|
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);
|
mContext.sendStickyBroadcastAsUser(intent, UserHandle.ALL);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -599,9 +621,7 @@ public class UsbDeviceManager {
|
|||||||
if (containsFunction(mCurrentFunctions,
|
if (containsFunction(mCurrentFunctions,
|
||||||
UsbManager.USB_FUNCTION_ACCESSORY)) {
|
UsbManager.USB_FUNCTION_ACCESSORY)) {
|
||||||
updateCurrentAccessory();
|
updateCurrentAccessory();
|
||||||
}
|
} else if (!mConnected) {
|
||||||
|
|
||||||
if (!mConnected) {
|
|
||||||
// restore defaults when USB is disconnected
|
// restore defaults when USB is disconnected
|
||||||
setEnabledFunctions(mDefaultFunctions, false);
|
setEnabledFunctions(mDefaultFunctions, false);
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user