Notify adb service on usb disconnect and activity stop
When a system with a new key attempts to connect to adb adbd passes the
key to the system_server which then launches an activity to prompt the
user to allow the key; adbd then waits for a response from the
system_server. For adb over usb if the user disconnects the usb cable
before responding to the prompt the system_server will not send a
response to adbd requiring a restart of adbd before a new connection
can be established. This commit notifies the adb service when the usb
cable is disconnected or when the activity is stopped through some other
means (back, home, or recent apps buttons); the system_server then sends
a response to adbd to deny the connection which allows subsequent
connections to succeed.
Fixes: 156323450
Test: Disconnected usb cable, used back, home, and recent buttons to
stop app and verified subsequent connections displayed a prompt
and adb sessions were successful when allowed.
Change-Id: I50d5ce3a4a1fbdc2caa843b85e2905260a37a7e9
This commit is contained in:
@@ -51,6 +51,7 @@ public class UsbDebuggingActivity extends AlertActivity
|
||||
private UsbDisconnectedReceiver mDisconnectedReceiver;
|
||||
private final BroadcastDispatcher mBroadcastDispatcher;
|
||||
private String mKey;
|
||||
private boolean mServiceNotified;
|
||||
|
||||
@Inject
|
||||
public UsbDebuggingActivity(BroadcastDispatcher broadcastDispatcher) {
|
||||
@@ -118,6 +119,7 @@ public class UsbDebuggingActivity extends AlertActivity
|
||||
}
|
||||
boolean connected = intent.getBooleanExtra(UsbManager.USB_CONNECTED, false);
|
||||
if (!connected) {
|
||||
notifyService(false);
|
||||
mActivity.finish();
|
||||
}
|
||||
}
|
||||
@@ -126,8 +128,10 @@ public class UsbDebuggingActivity extends AlertActivity
|
||||
@Override
|
||||
public void onStart() {
|
||||
super.onStart();
|
||||
IntentFilter filter = new IntentFilter(UsbManager.ACTION_USB_STATE);
|
||||
mBroadcastDispatcher.registerReceiver(mDisconnectedReceiver, filter);
|
||||
if (mDisconnectedReceiver != null) {
|
||||
IntentFilter filter = new IntentFilter(UsbManager.ACTION_USB_STATE);
|
||||
mBroadcastDispatcher.registerReceiver(mDisconnectedReceiver, filter);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -135,6 +139,12 @@ public class UsbDebuggingActivity extends AlertActivity
|
||||
if (mDisconnectedReceiver != null) {
|
||||
mBroadcastDispatcher.unregisterReceiver(mDisconnectedReceiver);
|
||||
}
|
||||
// If the ADB service has not yet been notified due to this dialog being closed in some
|
||||
// other way then notify the service to deny the connection to ensure system_server sends
|
||||
// a response to adbd.
|
||||
if (!mServiceNotified) {
|
||||
notifyService(false);
|
||||
}
|
||||
super.onStop();
|
||||
}
|
||||
|
||||
@@ -142,6 +152,30 @@ public class UsbDebuggingActivity extends AlertActivity
|
||||
public void onClick(DialogInterface dialog, int which) {
|
||||
boolean allow = (which == AlertDialog.BUTTON_POSITIVE);
|
||||
boolean alwaysAllow = allow && mAlwaysAllow.isChecked();
|
||||
notifyService(allow, alwaysAllow);
|
||||
finish();
|
||||
}
|
||||
|
||||
/**
|
||||
* Notifies the ADB service as to whether the current ADB request should be allowed; if the
|
||||
* request is allowed it is only allowed for this session, and the user should be prompted again
|
||||
* on subsequent requests from this key.
|
||||
*
|
||||
* @param allow whether the connection should be allowed for this session
|
||||
*/
|
||||
private void notifyService(boolean allow) {
|
||||
notifyService(allow, false);
|
||||
}
|
||||
|
||||
/**
|
||||
* Notifies the ADB service as to whether the current ADB request should be allowed, and if
|
||||
* subsequent requests from this key should be allowed without user consent.
|
||||
*
|
||||
* @param allow whether the connection should be allowed
|
||||
* @param alwaysAllow whether subsequent requests from this key should be allowed without user
|
||||
* consent
|
||||
*/
|
||||
private void notifyService(boolean allow, boolean alwaysAllow) {
|
||||
try {
|
||||
IBinder b = ServiceManager.getService(ADB_SERVICE);
|
||||
IAdbManager service = IAdbManager.Stub.asInterface(b);
|
||||
@@ -150,9 +184,9 @@ public class UsbDebuggingActivity extends AlertActivity
|
||||
} else {
|
||||
service.denyDebugging();
|
||||
}
|
||||
mServiceNotified = true;
|
||||
} catch (Exception e) {
|
||||
Log.e(TAG, "Unable to notify Usb service", e);
|
||||
}
|
||||
finish();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -22,9 +22,14 @@ import android.content.Context;
|
||||
import android.content.DialogInterface;
|
||||
import android.content.Intent;
|
||||
import android.content.IntentFilter;
|
||||
import android.debug.IAdbManager;
|
||||
import android.hardware.usb.UsbManager;
|
||||
import android.os.Bundle;
|
||||
import android.os.IBinder;
|
||||
import android.os.RemoteException;
|
||||
import android.os.ServiceManager;
|
||||
import android.os.SystemProperties;
|
||||
import android.util.Log;
|
||||
|
||||
import com.android.internal.app.AlertActivity;
|
||||
import com.android.internal.app.AlertController;
|
||||
@@ -35,6 +40,7 @@ import javax.inject.Inject;
|
||||
|
||||
public class UsbDebuggingSecondaryUserActivity extends AlertActivity
|
||||
implements DialogInterface.OnClickListener {
|
||||
private static final String TAG = "UsbDebuggingSecondaryUserActivity";
|
||||
private UsbDisconnectedReceiver mDisconnectedReceiver;
|
||||
private final BroadcastDispatcher mBroadcastDispatcher;
|
||||
|
||||
@@ -81,9 +87,10 @@ public class UsbDebuggingSecondaryUserActivity extends AlertActivity
|
||||
@Override
|
||||
public void onStart() {
|
||||
super.onStart();
|
||||
|
||||
IntentFilter filter = new IntentFilter(UsbManager.ACTION_USB_STATE);
|
||||
mBroadcastDispatcher.registerReceiver(mDisconnectedReceiver, filter);
|
||||
if (mDisconnectedReceiver != null) {
|
||||
IntentFilter filter = new IntentFilter(UsbManager.ACTION_USB_STATE);
|
||||
mBroadcastDispatcher.registerReceiver(mDisconnectedReceiver, filter);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -91,6 +98,13 @@ public class UsbDebuggingSecondaryUserActivity extends AlertActivity
|
||||
if (mDisconnectedReceiver != null) {
|
||||
mBroadcastDispatcher.unregisterReceiver(mDisconnectedReceiver);
|
||||
}
|
||||
try {
|
||||
IBinder b = ServiceManager.getService(ADB_SERVICE);
|
||||
IAdbManager service = IAdbManager.Stub.asInterface(b);
|
||||
service.denyDebugging();
|
||||
} catch (RemoteException e) {
|
||||
Log.e(TAG, "Unable to notify Usb service", e);
|
||||
}
|
||||
super.onStop();
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user