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

Commit d5913575 authored by Mike Lockwood's avatar Mike Lockwood
Browse files

Close USB dialogs if their corresponding accessory or device has disconnected



BUG: 4060065

Change-Id: Ib517e5e4a5422f9f0c8fca601308cecf7743c5d1
Signed-off-by: default avatarMike Lockwood <lockwood@android.com>
parent 3a68b833
Loading
Loading
Loading
Loading
+67 −0
Original line number Diff line number Diff line
/*
 * Copyright (C) 2010 The Android Open Source Project
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package com.android.systemui.usb;

import android.app.Activity;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.hardware.usb.UsbAccessory;
import android.hardware.usb.UsbDevice;
import android.hardware.usb.UsbManager;

// This class is used to close UsbPermissionsActivity and UsbResolverActivity
// if their device/accessory is disconnected while the dialog is still open
class UsbDisconnectedReceiver extends BroadcastReceiver {
    private final Activity mActivity;
    private UsbDevice mDevice;
    private UsbAccessory mAccessory;

    public UsbDisconnectedReceiver(Activity activity, UsbDevice device) {
       mActivity = activity;
        mDevice = device;

        IntentFilter filter = new IntentFilter(UsbManager.ACTION_USB_DEVICE_DETACHED);
        activity.registerReceiver(this, filter);
    }

    public UsbDisconnectedReceiver(Activity activity, UsbAccessory accessory) {
        mActivity = activity;
        mAccessory = accessory;

        IntentFilter filter = new IntentFilter(UsbManager.ACTION_USB_ACCESSORY_DETACHED);
        activity.registerReceiver(this, filter);
    }

    @Override
    public void onReceive(Context context, Intent intent) {
        String action = intent.getAction();
        if (UsbManager.ACTION_USB_DEVICE_DETACHED.equals(action)) {
            UsbDevice device = (UsbDevice)intent.getParcelableExtra(UsbManager.EXTRA_DEVICE);
            if (device != null && device.equals(mDevice)) {
                mActivity.finish();
            }
        } else if (UsbManager.ACTION_USB_ACCESSORY_DETACHED.equals(action)) {
            UsbAccessory accessory =
                    (UsbAccessory)intent.getParcelableExtra(UsbManager.EXTRA_ACCESSORY);
            if (accessory != null && accessory.equals(mAccessory)) {
                mActivity.finish();
            }
        }
    }
}
 No newline at end of file
+6 −0
Original line number Diff line number Diff line
@@ -57,6 +57,7 @@ public class UsbPermissionActivity extends AlertActivity
    private String mPackageName;
    private int mUid;
    private boolean mPermissionGranted;
    private UsbDisconnectedReceiver mDisconnectedReceiver;

    @Override
    public void onCreate(Bundle icicle) {
@@ -85,8 +86,10 @@ public class UsbPermissionActivity extends AlertActivity
        ap.mTitle = appName;
        if (mDevice == null) {
            ap.mMessage = getString(R.string.usb_accessory_permission_prompt, appName);
            mDisconnectedReceiver = new UsbDisconnectedReceiver(this, mAccessory);
        } else {
            ap.mMessage = getString(R.string.usb_device_permission_prompt, appName);
            mDisconnectedReceiver = new UsbDisconnectedReceiver(this, mDevice);
        }
        ap.mPositiveButtonText = getString(com.android.internal.R.string.ok);
        ap.mNegativeButtonText = getString(com.android.internal.R.string.cancel);
@@ -142,6 +145,9 @@ public class UsbPermissionActivity extends AlertActivity
            Log.e(TAG, "IUsbService connection failed", e);
        }

        if (mDisconnectedReceiver != null) {
            unregisterReceiver(mDisconnectedReceiver);
        }
        super.onDestroy();
    }

+33 −12
Original line number Diff line number Diff line
@@ -39,6 +39,10 @@ public class UsbResolverActivity extends ResolverActivity {
    public static final String TAG = "UsbResolverActivity";
    public static final String EXTRA_RESOLVE_INFOS = "rlist";

    private UsbDevice mDevice;
    private UsbAccessory mAccessory;
    private UsbDisconnectedReceiver mDisconnectedReceiver;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        Intent intent = getIntent();
@@ -57,6 +61,27 @@ public class UsbResolverActivity extends ResolverActivity {
                         This is necessary because this activity is needed for the user to allow
                         the application permission to access the device */
                );

        mDevice = (UsbDevice)target.getParcelableExtra(UsbManager.EXTRA_DEVICE);
        if (mDevice != null) {
            mDisconnectedReceiver = new UsbDisconnectedReceiver(this, mDevice);
        } else {
            mAccessory = (UsbAccessory)target.getParcelableExtra(UsbManager.EXTRA_ACCESSORY);
            if (mAccessory == null) {
                Log.e(TAG, "no device or accessory");
                finish();
                return;
            }
            mDisconnectedReceiver = new UsbDisconnectedReceiver(this, mAccessory);
        }
    }

    @Override
    protected void onDestroy() {
        if (mDisconnectedReceiver != null) {
            unregisterReceiver(mDisconnectedReceiver);
        }
        super.onDestroy();
    }

    protected void onIntentSelected(ResolveInfo ri, Intent intent, boolean alwaysCheck) {
@@ -64,28 +89,24 @@ public class UsbResolverActivity extends ResolverActivity {
            IBinder b = ServiceManager.getService(USB_SERVICE);
            IUsbManager service = IUsbManager.Stub.asInterface(b);
            int uid = ri.activityInfo.applicationInfo.uid;
            String action = intent.getAction();

            if (UsbManager.ACTION_USB_DEVICE_ATTACHED.equals(action)) {
                UsbDevice device = (UsbDevice)intent.getParcelableExtra(UsbManager.EXTRA_DEVICE);
            if (mDevice != null) {
                // grant permission for the device
                service.grantDevicePermission(device, uid);
                service.grantDevicePermission(mDevice, uid);
                // set or clear default setting
                if (alwaysCheck) {
                    service.setDevicePackage(device, ri.activityInfo.packageName);
                    service.setDevicePackage(mDevice, ri.activityInfo.packageName);
                } else {
                    service.setDevicePackage(device, null);
                    service.setDevicePackage(mDevice, null);
                }
            } else if (UsbManager.ACTION_USB_ACCESSORY_ATTACHED.equals(action)) {
                UsbAccessory accessory = (UsbAccessory)intent.getParcelableExtra(
                        UsbManager.EXTRA_ACCESSORY);
            } else if (mAccessory != null) {
                // grant permission for the accessory
                service.grantAccessoryPermission(accessory, uid);
                service.grantAccessoryPermission(mAccessory, uid);
                // set or clear default setting
                if (alwaysCheck) {
                    service.setAccessoryPackage(accessory, ri.activityInfo.packageName);
                    service.setAccessoryPackage(mAccessory, ri.activityInfo.packageName);
                } else {
                    service.setAccessoryPackage(accessory, null);
                    service.setAccessoryPackage(mAccessory, null);
                }
            }