Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit d5d60d50 authored by Michael Groover's avatar Michael Groover
Browse files

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
parent 580483eb
Loading
Loading
Loading
Loading
+37 −3
Original line number Diff line number Diff line
@@ -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,15 +128,23 @@ public class UsbDebuggingActivity extends AlertActivity
    @Override
    public void onStart() {
        super.onStart();
        if (mDisconnectedReceiver != null) {
            IntentFilter filter = new IntentFilter(UsbManager.ACTION_USB_STATE);
            mBroadcastDispatcher.registerReceiver(mDisconnectedReceiver, filter);
        }
    }

    @Override
    protected void onStop() {
        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();
    }
}
+17 −3
Original line number Diff line number Diff line
@@ -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,16 +87,24 @@ public class UsbDebuggingSecondaryUserActivity extends AlertActivity
    @Override
    public void onStart() {
        super.onStart();

        if (mDisconnectedReceiver != null) {
            IntentFilter filter = new IntentFilter(UsbManager.ACTION_USB_STATE);
            mBroadcastDispatcher.registerReceiver(mDisconnectedReceiver, filter);
        }
    }

    @Override
    protected void onStop() {
        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();
    }