diff --git a/services/usb/java/com/android/server/usb/UsbDeviceManager.java b/services/usb/java/com/android/server/usb/UsbDeviceManager.java index b6aed2dbba65f..a480ebdf1bc7a 100644 --- a/services/usb/java/com/android/server/usb/UsbDeviceManager.java +++ b/services/usb/java/com/android/server/usb/UsbDeviceManager.java @@ -536,7 +536,6 @@ public class UsbDeviceManager implements ActivityTaskManagerInternal.ScreenObser private boolean mInHostModeWithNoAccessoryConnected; private boolean mSourcePower; private boolean mSinkPower; - private boolean mConfigured; private boolean mAudioAccessoryConnected; private boolean mAudioAccessorySupported; private boolean mConnectedToDataDisabledPort; @@ -571,7 +570,12 @@ public class UsbDeviceManager implements ActivityTaskManagerInternal.ScreenObser private final UsbPermissionManager mPermissionManager; private NotificationManager mNotificationManager; + /** + * Do not debounce for the first disconnect after resetUsbGadget. + */ + protected boolean mResetUsbGadgetDisableDebounce; protected boolean mConnected; + protected boolean mConfigured; protected long mScreenUnlockedFunctions; protected boolean mBootCompleted; protected boolean mCurrentFunctionsApplied; @@ -716,15 +720,29 @@ public class UsbDeviceManager implements ActivityTaskManagerInternal.ScreenObser Slog.e(TAG, "unknown state " + state); return; } - if (configured == 0) removeMessages(MSG_UPDATE_STATE); if (connected == 1) removeMessages(MSG_FUNCTION_SWITCH_TIMEOUT); Message msg = Message.obtain(this, MSG_UPDATE_STATE); msg.arg1 = connected; msg.arg2 = configured; - // debounce disconnects to avoid problems bringing up USB tethering - sendMessageDelayed(msg, + if (DEBUG) { + Slog.i(TAG, "mResetUsbGadgetDisableDebounce:" + mResetUsbGadgetDisableDebounce + + " connected:" + connected + "configured:" + configured); + } + if (mResetUsbGadgetDisableDebounce) { + // Do not debounce disconnect after resetUsbGadget. + sendMessage(msg); + if (connected == 1) mResetUsbGadgetDisableDebounce = false; + } else { + if (configured == 0) { + removeMessages(MSG_UPDATE_STATE); + if (DEBUG) Slog.i(TAG, "removeMessages MSG_UPDATE_STATE"); + } + if (connected == 1) removeMessages(MSG_FUNCTION_SWITCH_TIMEOUT); + // debounce disconnects to avoid problems bringing up USB tethering. + sendMessageDelayed(msg, (connected == 0) ? (mScreenLocked ? DEVICE_STATE_UPDATE_DELAY : DEVICE_STATE_UPDATE_DELAY_EXT) : 0); + } } public void updateHostState(UsbPort port, UsbPortStatus status) { @@ -974,7 +992,10 @@ public class UsbDeviceManager implements ActivityTaskManagerInternal.ScreenObser int operationId = sUsbOperationCount.incrementAndGet(); mConnected = (msg.arg1 == 1); mConfigured = (msg.arg2 == 1); - + if (DEBUG) { + Slog.i(TAG, "handleMessage MSG_UPDATE_STATE " + "mConnected:" + mConnected + + " mConfigured:" + mConfigured); + } updateUsbNotification(false); updateAdbNotification(false); if (mBootCompleted) { @@ -2132,9 +2153,16 @@ public class UsbDeviceManager implements ActivityTaskManagerInternal.ScreenObser } try { + // MSG_ACCESSORY_MODE_ENTER_TIMEOUT has to be removed to allow exiting + // AOAP mode during resetUsbGadget. + removeMessages(MSG_ACCESSORY_MODE_ENTER_TIMEOUT); + if (mConfigured) { + mResetUsbGadgetDisableDebounce = true; + } mUsbGadgetHal.reset(); } catch (Exception e) { Slog.e(TAG, "reset Usb Gadget failed", e); + mResetUsbGadgetDisableDebounce = false; } } break;