diff options
author | Mike Lockwood <lockwood@android.com> | 2010-08-23 08:58:53 -0400 |
---|---|---|
committer | Mike Lockwood <lockwood@android.com> | 2010-08-23 14:50:49 -0400 |
commit | 6eef5c687677b5965f769c62f50edda25abb431e (patch) | |
tree | 509157c906ffe2e9ce38eb852b17c5c042be2a6b /services/java | |
parent | 2b342f0a76f3237e97f15dc2f4e8a0b72dd7c023 (diff) | |
download | frameworks_base-6eef5c687677b5965f769c62f50edda25abb431e.zip frameworks_base-6eef5c687677b5965f769c62f50edda25abb431e.tar.gz frameworks_base-6eef5c687677b5965f769c62f50edda25abb431e.tar.bz2 |
Tethering: Delay 1000ms before processing USB disconnect events
On some devices, switching the USB configuration to enable RNDIS can
result in multiple USB disconnect/reconnect events being generated.
Change-Id: Id0bfe54293bd51211f84976be2d72f8b1ad0100d
Signed-off-by: Mike Lockwood <lockwood@android.com>
Diffstat (limited to 'services/java')
-rw-r--r-- | services/java/com/android/server/connectivity/Tethering.java | 26 |
1 files changed, 24 insertions, 2 deletions
diff --git a/services/java/com/android/server/connectivity/Tethering.java b/services/java/com/android/server/connectivity/Tethering.java index 949b874..53ce5c0 100644 --- a/services/java/com/android/server/connectivity/Tethering.java +++ b/services/java/com/android/server/connectivity/Tethering.java @@ -34,6 +34,7 @@ import android.net.INetworkManagementEventObserver; import android.net.NetworkInfo; import android.os.Binder; import android.os.Environment; +import android.os.Handler; import android.os.HandlerThread; import android.os.IBinder; import android.os.INetworkManagementService; @@ -114,6 +115,14 @@ public class Tethering extends INetworkManagementEventObserver.Stub { private boolean mUsbMassStorageOff; // track the status of USB Mass Storage private boolean mUsbConnected; // track the status of USB connection + // mUsbHandler message + static final int USB_STATE_CHANGE = 1; + static final int USB_DISCONNECTED = 0; + static final int USB_CONNECTED = 1; + + // Time to delay before processing USB disconnect events + static final long USB_DISCONNECT_DELAY = 1000; + public Tethering(Context context, Looper looper) { Log.d(TAG, "Tethering starting"); mContext = context; @@ -453,12 +462,25 @@ public class Tethering extends INetworkManagementEventObserver.Stub { } } + private Handler mUsbHandler = new Handler() { + @Override + public void handleMessage(Message msg) { + mUsbConnected = (msg.arg1 == USB_CONNECTED); + updateUsbStatus(); + } + }; + private class StateReceiver extends BroadcastReceiver { public void onReceive(Context content, Intent intent) { String action = intent.getAction(); if (action.equals(Usb.ACTION_USB_STATE)) { - mUsbConnected = intent.getExtras().getBoolean(Usb.USB_CONNECTED); - updateUsbStatus(); + // process connect events immediately, but delay handling disconnects + // to debounce USB configuration changes + boolean connected = intent.getExtras().getBoolean(Usb.USB_CONNECTED); + Message msg = Message.obtain(mUsbHandler, USB_STATE_CHANGE, + (connected ? USB_CONNECTED : USB_DISCONNECTED), 0); + mUsbHandler.removeMessages(USB_STATE_CHANGE); + mUsbHandler.sendMessageDelayed(msg, connected ? 0 : USB_DISCONNECT_DELAY); } else if (action.equals(Intent.ACTION_MEDIA_SHARED)) { mUsbMassStorageOff = false; updateUsbStatus(); |