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

Commit 1fc831d5 authored by Michael Groover's avatar Michael Groover
Browse files

Keep USB disconnected receiver active when ADB activity in bg

When a new adb connection is attempted adbd will send the system's key
to the framework to prompt the user for consent to authorize the
connection. If another app is displayed over the adb prompt and the
user is not able to switch foreground apps (for instance during setup
wizard) the user will not be able to authorize the connection. This
commit keeps the USB disconnected receiver active even when the ADB
activity is in the background; if the user reseats the USB cable the
existing activity will be able to notify adbd and terminate, and a
new activity can be displayed in the foreground allowing the user to
authorize the connection.

Fixes: 152630548
Test: Manually verified the activity terminated and a new prompt was
      displayed after reseating the cable with the ADB activity in bg
Change-Id: I3293536639a20557982113ff9f6ac2bf6f7c1975
parent 8c8fa358
Loading
Loading
Loading
Loading
+14 −20
Original line number Diff line number Diff line
@@ -70,6 +70,8 @@ public class UsbDebuggingActivity extends AlertActivity

        if (SystemProperties.getInt("service.adb.tcp.port", 0) == 0) {
            mDisconnectedReceiver = new UsbDisconnectedReceiver(this);
            IntentFilter filter = new IntentFilter(UsbManager.ACTION_USB_STATE);
            mBroadcastDispatcher.registerReceiver(mDisconnectedReceiver, filter);
        }

        Intent intent = getIntent();
@@ -119,6 +121,7 @@ public class UsbDebuggingActivity extends AlertActivity
            }
            boolean connected = intent.getBooleanExtra(UsbManager.USB_CONNECTED, false);
            if (!connected) {
                Log.d(TAG, "USB disconnected, notifying service");
                notifyService(false);
                mActivity.finish();
            }
@@ -126,30 +129,21 @@ 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() {
    protected void onDestroy() {
        if (mDisconnectedReceiver != null) {
            mBroadcastDispatcher.unregisterReceiver(mDisconnectedReceiver);
        }
        super.onStop();
    }

    @Override
    protected void onDestroy() {
        // Only notify the service if the activity is finishing; if onDestroy has been called due to
        // a configuration change then allow the user to still authorize the connection the next
        // time the activity is in the foreground.
        if (isFinishing()) {
            // 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.
            // other way then notify the service to deny the connection to ensure system_server
            // sends a response to adbd.
            if (!mServiceNotified) {
                notifyService(false);
            }
        }
        super.onDestroy();
    }