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:
Michael Groover
2020-06-08 18:39:57 -07:00
parent 580483eb72
commit d5d60d50ea
2 changed files with 54 additions and 6 deletions

View File

@@ -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();
}
}

View File

@@ -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();
}