From d5d60d50eafd3a722871e2797c3fd4c305d387ce Mon Sep 17 00:00:00 2001 From: Michael Groover Date: Mon, 8 Jun 2020 18:39:57 -0700 Subject: [PATCH] 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 --- .../systemui/usb/UsbDebuggingActivity.java | 40 +++++++++++++++++-- .../UsbDebuggingSecondaryUserActivity.java | 20 ++++++++-- 2 files changed, 54 insertions(+), 6 deletions(-) diff --git a/packages/SystemUI/src/com/android/systemui/usb/UsbDebuggingActivity.java b/packages/SystemUI/src/com/android/systemui/usb/UsbDebuggingActivity.java index 6e041f6f9ee0f..bc2a55c8d5c49 100644 --- a/packages/SystemUI/src/com/android/systemui/usb/UsbDebuggingActivity.java +++ b/packages/SystemUI/src/com/android/systemui/usb/UsbDebuggingActivity.java @@ -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(); } } diff --git a/packages/SystemUI/src/com/android/systemui/usb/UsbDebuggingSecondaryUserActivity.java b/packages/SystemUI/src/com/android/systemui/usb/UsbDebuggingSecondaryUserActivity.java index 8d3428a52e3b8..4850a025b6841 100644 --- a/packages/SystemUI/src/com/android/systemui/usb/UsbDebuggingSecondaryUserActivity.java +++ b/packages/SystemUI/src/com/android/systemui/usb/UsbDebuggingSecondaryUserActivity.java @@ -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(); }