UsbResolverActivity.java revision 02eb8746de2d60563ec2751a34d20923192e4293
102eb8746de2d60563ec2751a34d20923192e4293Mike Lockwood/*
202eb8746de2d60563ec2751a34d20923192e4293Mike Lockwood * Copyright (C) 2011 The Android Open Source Project
302eb8746de2d60563ec2751a34d20923192e4293Mike Lockwood *
402eb8746de2d60563ec2751a34d20923192e4293Mike Lockwood * Licensed under the Apache License, Version 2.0 (the "License");
502eb8746de2d60563ec2751a34d20923192e4293Mike Lockwood * you may not use this file except in compliance with the License.
602eb8746de2d60563ec2751a34d20923192e4293Mike Lockwood * You may obtain a copy of the License at
702eb8746de2d60563ec2751a34d20923192e4293Mike Lockwood *
802eb8746de2d60563ec2751a34d20923192e4293Mike Lockwood *      http://www.apache.org/licenses/LICENSE-2.0
902eb8746de2d60563ec2751a34d20923192e4293Mike Lockwood *
1002eb8746de2d60563ec2751a34d20923192e4293Mike Lockwood * Unless required by applicable law or agreed to in writing, software
1102eb8746de2d60563ec2751a34d20923192e4293Mike Lockwood * distributed under the License is distributed on an "AS IS" BASIS,
1202eb8746de2d60563ec2751a34d20923192e4293Mike Lockwood * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1302eb8746de2d60563ec2751a34d20923192e4293Mike Lockwood * See the License for the specific language governing permissions and
1402eb8746de2d60563ec2751a34d20923192e4293Mike Lockwood * limitations under the License.
1502eb8746de2d60563ec2751a34d20923192e4293Mike Lockwood */
1602eb8746de2d60563ec2751a34d20923192e4293Mike Lockwood
1702eb8746de2d60563ec2751a34d20923192e4293Mike Lockwoodpackage com.android.server.usb;
1802eb8746de2d60563ec2751a34d20923192e4293Mike Lockwood
1902eb8746de2d60563ec2751a34d20923192e4293Mike Lockwoodimport com.android.internal.app.ResolverActivity;
2002eb8746de2d60563ec2751a34d20923192e4293Mike Lockwood
2102eb8746de2d60563ec2751a34d20923192e4293Mike Lockwoodimport android.content.ActivityNotFoundException;
2202eb8746de2d60563ec2751a34d20923192e4293Mike Lockwoodimport android.content.Intent;
2302eb8746de2d60563ec2751a34d20923192e4293Mike Lockwoodimport android.content.pm.ResolveInfo;
2402eb8746de2d60563ec2751a34d20923192e4293Mike Lockwoodimport android.hardware.IUsbManager;
2502eb8746de2d60563ec2751a34d20923192e4293Mike Lockwoodimport android.hardware.UsbAccessory;
2602eb8746de2d60563ec2751a34d20923192e4293Mike Lockwoodimport android.hardware.UsbDevice;
2702eb8746de2d60563ec2751a34d20923192e4293Mike Lockwoodimport android.hardware.UsbManager;
2802eb8746de2d60563ec2751a34d20923192e4293Mike Lockwoodimport android.os.Bundle;
2902eb8746de2d60563ec2751a34d20923192e4293Mike Lockwoodimport android.os.IBinder;
3002eb8746de2d60563ec2751a34d20923192e4293Mike Lockwoodimport android.os.Parcelable;
3102eb8746de2d60563ec2751a34d20923192e4293Mike Lockwoodimport android.os.RemoteException;
3202eb8746de2d60563ec2751a34d20923192e4293Mike Lockwoodimport android.os.ServiceManager;
3302eb8746de2d60563ec2751a34d20923192e4293Mike Lockwoodimport android.util.Log;
3402eb8746de2d60563ec2751a34d20923192e4293Mike Lockwood
3502eb8746de2d60563ec2751a34d20923192e4293Mike Lockwoodimport java.util.ArrayList;
3602eb8746de2d60563ec2751a34d20923192e4293Mike Lockwood
3702eb8746de2d60563ec2751a34d20923192e4293Mike Lockwood/* Activity for choosing an application for a USB device or accessory */
3802eb8746de2d60563ec2751a34d20923192e4293Mike Lockwoodpublic class UsbResolverActivity extends ResolverActivity {
3902eb8746de2d60563ec2751a34d20923192e4293Mike Lockwood    public static final String TAG = "UsbResolverActivity";
4002eb8746de2d60563ec2751a34d20923192e4293Mike Lockwood    public static final String EXTRA_RESOLVE_INFOS = "rlist";
4102eb8746de2d60563ec2751a34d20923192e4293Mike Lockwood
4202eb8746de2d60563ec2751a34d20923192e4293Mike Lockwood    @Override
4302eb8746de2d60563ec2751a34d20923192e4293Mike Lockwood    protected void onCreate(Bundle savedInstanceState) {
4402eb8746de2d60563ec2751a34d20923192e4293Mike Lockwood        Intent intent = getIntent();
4502eb8746de2d60563ec2751a34d20923192e4293Mike Lockwood        Parcelable targetParcelable = intent.getParcelableExtra(Intent.EXTRA_INTENT);
4602eb8746de2d60563ec2751a34d20923192e4293Mike Lockwood        if (!(targetParcelable instanceof Intent)) {
4702eb8746de2d60563ec2751a34d20923192e4293Mike Lockwood            Log.w("UsbResolverActivity", "Target is not an intent: " + targetParcelable);
4802eb8746de2d60563ec2751a34d20923192e4293Mike Lockwood            finish();
4902eb8746de2d60563ec2751a34d20923192e4293Mike Lockwood            return;
5002eb8746de2d60563ec2751a34d20923192e4293Mike Lockwood        }
5102eb8746de2d60563ec2751a34d20923192e4293Mike Lockwood        Intent target = (Intent)targetParcelable;
5202eb8746de2d60563ec2751a34d20923192e4293Mike Lockwood        ArrayList<ResolveInfo> rList = intent.getParcelableArrayListExtra(EXTRA_RESOLVE_INFOS);
5302eb8746de2d60563ec2751a34d20923192e4293Mike Lockwood        Log.d(TAG, "rList.size() " + rList.size());
5402eb8746de2d60563ec2751a34d20923192e4293Mike Lockwood        CharSequence title = getResources().getText(com.android.internal.R.string.chooseUsbActivity);
5502eb8746de2d60563ec2751a34d20923192e4293Mike Lockwood        super.onCreate(savedInstanceState, target, title, null, rList,
5602eb8746de2d60563ec2751a34d20923192e4293Mike Lockwood                true, /* Set alwaysUseOption to true to enable "always use this app" checkbox. */
5702eb8746de2d60563ec2751a34d20923192e4293Mike Lockwood                true  /* Set alwaysChoose to display activity when only one choice is available.
5802eb8746de2d60563ec2751a34d20923192e4293Mike Lockwood                         This is necessary because this activity is needed for the user to allow
5902eb8746de2d60563ec2751a34d20923192e4293Mike Lockwood                         the application permission to access the device */
6002eb8746de2d60563ec2751a34d20923192e4293Mike Lockwood                );
6102eb8746de2d60563ec2751a34d20923192e4293Mike Lockwood    }
6202eb8746de2d60563ec2751a34d20923192e4293Mike Lockwood
6302eb8746de2d60563ec2751a34d20923192e4293Mike Lockwood    protected void onIntentSelected(ResolveInfo ri, Intent intent, boolean alwaysCheck) {
6402eb8746de2d60563ec2751a34d20923192e4293Mike Lockwood        try {
6502eb8746de2d60563ec2751a34d20923192e4293Mike Lockwood            IBinder b = ServiceManager.getService(USB_SERVICE);
6602eb8746de2d60563ec2751a34d20923192e4293Mike Lockwood            IUsbManager service = IUsbManager.Stub.asInterface(b);
6702eb8746de2d60563ec2751a34d20923192e4293Mike Lockwood            int uid = ri.activityInfo.applicationInfo.uid;
6802eb8746de2d60563ec2751a34d20923192e4293Mike Lockwood            String action = intent.getAction();
6902eb8746de2d60563ec2751a34d20923192e4293Mike Lockwood
7002eb8746de2d60563ec2751a34d20923192e4293Mike Lockwood            if (UsbManager.ACTION_USB_DEVICE_ATTACHED.equals(action)) {
7102eb8746de2d60563ec2751a34d20923192e4293Mike Lockwood                UsbDevice device = (UsbDevice)intent.getParcelableExtra(UsbManager.EXTRA_DEVICE);
7202eb8746de2d60563ec2751a34d20923192e4293Mike Lockwood                // grant permission for the device
7302eb8746de2d60563ec2751a34d20923192e4293Mike Lockwood                service.grantDevicePermission(device, uid);
7402eb8746de2d60563ec2751a34d20923192e4293Mike Lockwood                // set or clear default setting
7502eb8746de2d60563ec2751a34d20923192e4293Mike Lockwood                if (alwaysCheck) {
7602eb8746de2d60563ec2751a34d20923192e4293Mike Lockwood                    service.setDevicePackage(device, ri.activityInfo.packageName);
7702eb8746de2d60563ec2751a34d20923192e4293Mike Lockwood                } else {
7802eb8746de2d60563ec2751a34d20923192e4293Mike Lockwood                    service.setDevicePackage(device, null);
7902eb8746de2d60563ec2751a34d20923192e4293Mike Lockwood                }
8002eb8746de2d60563ec2751a34d20923192e4293Mike Lockwood            } else if (UsbManager.ACTION_USB_ACCESSORY_ATTACHED.equals(action)) {
8102eb8746de2d60563ec2751a34d20923192e4293Mike Lockwood                UsbAccessory accessory = (UsbAccessory)intent.getParcelableExtra(
8202eb8746de2d60563ec2751a34d20923192e4293Mike Lockwood                        UsbManager.EXTRA_ACCESSORY);
8302eb8746de2d60563ec2751a34d20923192e4293Mike Lockwood                // grant permission for the accessory
8402eb8746de2d60563ec2751a34d20923192e4293Mike Lockwood                service.grantAccessoryPermission(accessory, uid);
8502eb8746de2d60563ec2751a34d20923192e4293Mike Lockwood                // set or clear default setting
8602eb8746de2d60563ec2751a34d20923192e4293Mike Lockwood                if (alwaysCheck) {
8702eb8746de2d60563ec2751a34d20923192e4293Mike Lockwood                    service.setAccessoryPackage(accessory, ri.activityInfo.packageName);
8802eb8746de2d60563ec2751a34d20923192e4293Mike Lockwood                } else {
8902eb8746de2d60563ec2751a34d20923192e4293Mike Lockwood                    service.setAccessoryPackage(accessory, null);
9002eb8746de2d60563ec2751a34d20923192e4293Mike Lockwood                }
9102eb8746de2d60563ec2751a34d20923192e4293Mike Lockwood            }
9202eb8746de2d60563ec2751a34d20923192e4293Mike Lockwood
9302eb8746de2d60563ec2751a34d20923192e4293Mike Lockwood            try {
9402eb8746de2d60563ec2751a34d20923192e4293Mike Lockwood                startActivity(intent);
9502eb8746de2d60563ec2751a34d20923192e4293Mike Lockwood            } catch (ActivityNotFoundException e) {
9602eb8746de2d60563ec2751a34d20923192e4293Mike Lockwood                Log.e(TAG, "startActivity failed", e);
9702eb8746de2d60563ec2751a34d20923192e4293Mike Lockwood            }
9802eb8746de2d60563ec2751a34d20923192e4293Mike Lockwood        } catch (RemoteException e) {
9902eb8746de2d60563ec2751a34d20923192e4293Mike Lockwood            Log.e(TAG, "onIntentSelected failed", e);
10002eb8746de2d60563ec2751a34d20923192e4293Mike Lockwood        }
10102eb8746de2d60563ec2751a34d20923192e4293Mike Lockwood    }
10202eb8746de2d60563ec2751a34d20923192e4293Mike Lockwood}
103