diff options
| -rw-r--r-- | services/usb/java/com/android/server/usb/UsbDeviceManager.java | 45 |
1 files changed, 25 insertions, 20 deletions
diff --git a/services/usb/java/com/android/server/usb/UsbDeviceManager.java b/services/usb/java/com/android/server/usb/UsbDeviceManager.java index 0544fae6dee6..b86a85be9f33 100644 --- a/services/usb/java/com/android/server/usb/UsbDeviceManager.java +++ b/services/usb/java/com/android/server/usb/UsbDeviceManager.java @@ -119,6 +119,7 @@ public class UsbDeviceManager { private static final int MSG_USER_SWITCHED = 5; private static final int MSG_UPDATE_USER_RESTRICTIONS = 6; private static final int MSG_UPDATE_HOST_STATE = 7; + private static final int MSG_ACCESSORY_MODE_ENTER_TIMEOUT = 8; private static final int AUDIO_MODE_SOURCE = 1; @@ -127,9 +128,6 @@ 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; @@ -297,7 +295,8 @@ public class UsbDeviceManager { } if (functions != null) { - mAccessoryModeRequestTime = SystemClock.elapsedRealtime(); + mHandler.sendMessageDelayed(mHandler.obtainMessage(MSG_ACCESSORY_MODE_ENTER_TIMEOUT), + ACCESSORY_REQUEST_TIMEOUT); setCurrentFunctions(functions, false); } } @@ -586,14 +585,10 @@ public class UsbDeviceManager { private void updateCurrentAccessory() { // 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; + boolean enteringAccessoryMode = hasMessages(MSG_ACCESSORY_MODE_ENTER_TIMEOUT); if (mConfigured && enteringAccessoryMode) { // successfully entered accessory mode - if (mAccessoryStrings != null) { mCurrentAccessory = new UsbAccessory(mAccessoryStrings); Slog.d(TAG, "entering USB accessory mode: " + mCurrentAccessory); @@ -604,19 +599,23 @@ public class UsbDeviceManager { } else { Slog.e(TAG, "nativeGetAccessoryStrings failed"); } - } else if (!enteringAccessoryMode) { - // make sure accessory mode is off - // and restore default functions - Slog.d(TAG, "exited USB accessory mode"); - setEnabledFunctions(null, false, false); + } else if (!mConnected && !enteringAccessoryMode) { + notifyAccessoryModeExit(); + } + } - if (mCurrentAccessory != null) { - if (mBootCompleted) { - mSettingsManager.usbAccessoryRemoved(mCurrentAccessory); - } - mCurrentAccessory = null; - mAccessoryStrings = null; + private void notifyAccessoryModeExit() { + // make sure accessory mode is off + // and restore default functions + Slog.d(TAG, "exited USB accessory mode"); + setEnabledFunctions(null, false, false); + + if (mCurrentAccessory != null) { + if (mBootCompleted) { + mSettingsManager.usbAccessoryRemoved(mCurrentAccessory); } + mCurrentAccessory = null; + mAccessoryStrings = null; } } @@ -805,6 +804,12 @@ public class UsbDeviceManager { } break; } + case MSG_ACCESSORY_MODE_ENTER_TIMEOUT: { + if (!mConnected) { + notifyAccessoryModeExit(); + } + break; + } } } |