From f81a09f4ca0a3580e829ece420757157d48886ed Mon Sep 17 00:00:00 2001 From: Badhri Jagan Sridharan Date: Thu, 12 Jan 2023 08:34:01 +0000 Subject: [PATCH] Do not debounce disconnect while resetUsbGadget When resetUsbGadget is requested, do not debounce disconnect to allow falling back to the the default configuration. Also remove accessory mode enter timeout messages to prevent leaving AOAP enabled when resetUsbGadget is requested. Bug: 260145166 Change-Id: I538f405312049846839297dc3835ec2ff7d75084 Merged-in: I538f405312049846839297dc3835ec2ff7d75084 (cherry picked from commit 0b2be9a6fb59cdbfe28cf2a088f56593e5d8c83c) --- .../android/server/usb/UsbDeviceManager.java | 38 ++++++++++++++++--- 1 file changed, 33 insertions(+), 5 deletions(-) diff --git a/services/usb/java/com/android/server/usb/UsbDeviceManager.java b/services/usb/java/com/android/server/usb/UsbDeviceManager.java index 1b92699b4b7bf..e256f54048a2f 100644 --- a/services/usb/java/com/android/server/usb/UsbDeviceManager.java +++ b/services/usb/java/com/android/server/usb/UsbDeviceManager.java @@ -535,7 +535,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; @@ -568,7 +567,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; @@ -713,15 +717,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) { @@ -971,7 +989,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) { @@ -2116,9 +2137,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;