summaryrefslogtreecommitdiffstats
path: root/services/java
diff options
context:
space:
mode:
authorMike Lockwood <lockwood@android.com>2010-08-23 08:58:53 -0400
committerMike Lockwood <lockwood@android.com>2010-08-23 14:50:49 -0400
commit6eef5c687677b5965f769c62f50edda25abb431e (patch)
tree509157c906ffe2e9ce38eb852b17c5c042be2a6b /services/java
parent2b342f0a76f3237e97f15dc2f4e8a0b72dd7c023 (diff)
downloadframeworks_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.java26
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();