UsbResolverActivity.java revision bce6f8f249ff2b65df9ed790cc460053ab8eccec
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
173a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwoodpackage com.android.systemui.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;
24c4308f01c965571dc2354107c3574df113e397eeMike Lockwoodimport android.hardware.usb.IUsbManager;
25c4308f01c965571dc2354107c3574df113e397eeMike Lockwoodimport android.hardware.usb.UsbAccessory;
26c4308f01c965571dc2354107c3574df113e397eeMike Lockwoodimport android.hardware.usb.UsbDevice;
27c4308f01c965571dc2354107c3574df113e397eeMike Lockwoodimport android.hardware.usb.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
42d591357524091254483849e37697255cc8fce2adMike Lockwood    private UsbDevice mDevice;
43d591357524091254483849e37697255cc8fce2adMike Lockwood    private UsbAccessory mAccessory;
44d591357524091254483849e37697255cc8fce2adMike Lockwood    private UsbDisconnectedReceiver mDisconnectedReceiver;
45d591357524091254483849e37697255cc8fce2adMike Lockwood
4602eb8746de2d60563ec2751a34d20923192e4293Mike Lockwood    @Override
4702eb8746de2d60563ec2751a34d20923192e4293Mike Lockwood    protected void onCreate(Bundle savedInstanceState) {
4802eb8746de2d60563ec2751a34d20923192e4293Mike Lockwood        Intent intent = getIntent();
4902eb8746de2d60563ec2751a34d20923192e4293Mike Lockwood        Parcelable targetParcelable = intent.getParcelableExtra(Intent.EXTRA_INTENT);
5002eb8746de2d60563ec2751a34d20923192e4293Mike Lockwood        if (!(targetParcelable instanceof Intent)) {
5102eb8746de2d60563ec2751a34d20923192e4293Mike Lockwood            Log.w("UsbResolverActivity", "Target is not an intent: " + targetParcelable);
5202eb8746de2d60563ec2751a34d20923192e4293Mike Lockwood            finish();
5302eb8746de2d60563ec2751a34d20923192e4293Mike Lockwood            return;
5402eb8746de2d60563ec2751a34d20923192e4293Mike Lockwood        }
5502eb8746de2d60563ec2751a34d20923192e4293Mike Lockwood        Intent target = (Intent)targetParcelable;
5602eb8746de2d60563ec2751a34d20923192e4293Mike Lockwood        ArrayList<ResolveInfo> rList = intent.getParcelableArrayListExtra(EXTRA_RESOLVE_INFOS);
5702eb8746de2d60563ec2751a34d20923192e4293Mike Lockwood        CharSequence title = getResources().getText(com.android.internal.R.string.chooseUsbActivity);
5802eb8746de2d60563ec2751a34d20923192e4293Mike Lockwood        super.onCreate(savedInstanceState, target, title, null, rList,
59bce6f8f249ff2b65df9ed790cc460053ab8eccecMike Lockwood                true /* Set alwaysUseOption to true to enable "always use this app" checkbox. */ );
60d591357524091254483849e37697255cc8fce2adMike Lockwood
61d591357524091254483849e37697255cc8fce2adMike Lockwood        mDevice = (UsbDevice)target.getParcelableExtra(UsbManager.EXTRA_DEVICE);
62d591357524091254483849e37697255cc8fce2adMike Lockwood        if (mDevice != null) {
63d591357524091254483849e37697255cc8fce2adMike Lockwood            mDisconnectedReceiver = new UsbDisconnectedReceiver(this, mDevice);
64d591357524091254483849e37697255cc8fce2adMike Lockwood        } else {
65d591357524091254483849e37697255cc8fce2adMike Lockwood            mAccessory = (UsbAccessory)target.getParcelableExtra(UsbManager.EXTRA_ACCESSORY);
66d591357524091254483849e37697255cc8fce2adMike Lockwood            if (mAccessory == null) {
67d591357524091254483849e37697255cc8fce2adMike Lockwood                Log.e(TAG, "no device or accessory");
68d591357524091254483849e37697255cc8fce2adMike Lockwood                finish();
69d591357524091254483849e37697255cc8fce2adMike Lockwood                return;
70d591357524091254483849e37697255cc8fce2adMike Lockwood            }
71d591357524091254483849e37697255cc8fce2adMike Lockwood            mDisconnectedReceiver = new UsbDisconnectedReceiver(this, mAccessory);
72d591357524091254483849e37697255cc8fce2adMike Lockwood        }
73d591357524091254483849e37697255cc8fce2adMike Lockwood    }
74d591357524091254483849e37697255cc8fce2adMike Lockwood
75d591357524091254483849e37697255cc8fce2adMike Lockwood    @Override
76d591357524091254483849e37697255cc8fce2adMike Lockwood    protected void onDestroy() {
77d591357524091254483849e37697255cc8fce2adMike Lockwood        if (mDisconnectedReceiver != null) {
78d591357524091254483849e37697255cc8fce2adMike Lockwood            unregisterReceiver(mDisconnectedReceiver);
79d591357524091254483849e37697255cc8fce2adMike Lockwood        }
80d591357524091254483849e37697255cc8fce2adMike Lockwood        super.onDestroy();
8102eb8746de2d60563ec2751a34d20923192e4293Mike Lockwood    }
8202eb8746de2d60563ec2751a34d20923192e4293Mike Lockwood
8302eb8746de2d60563ec2751a34d20923192e4293Mike Lockwood    protected void onIntentSelected(ResolveInfo ri, Intent intent, boolean alwaysCheck) {
8402eb8746de2d60563ec2751a34d20923192e4293Mike Lockwood        try {
8502eb8746de2d60563ec2751a34d20923192e4293Mike Lockwood            IBinder b = ServiceManager.getService(USB_SERVICE);
8602eb8746de2d60563ec2751a34d20923192e4293Mike Lockwood            IUsbManager service = IUsbManager.Stub.asInterface(b);
8702eb8746de2d60563ec2751a34d20923192e4293Mike Lockwood            int uid = ri.activityInfo.applicationInfo.uid;
8802eb8746de2d60563ec2751a34d20923192e4293Mike Lockwood
89d591357524091254483849e37697255cc8fce2adMike Lockwood            if (mDevice != null) {
9002eb8746de2d60563ec2751a34d20923192e4293Mike Lockwood                // grant permission for the device
91d591357524091254483849e37697255cc8fce2adMike Lockwood                service.grantDevicePermission(mDevice, uid);
9202eb8746de2d60563ec2751a34d20923192e4293Mike Lockwood                // set or clear default setting
9302eb8746de2d60563ec2751a34d20923192e4293Mike Lockwood                if (alwaysCheck) {
94d591357524091254483849e37697255cc8fce2adMike Lockwood                    service.setDevicePackage(mDevice, ri.activityInfo.packageName);
9502eb8746de2d60563ec2751a34d20923192e4293Mike Lockwood                } else {
96d591357524091254483849e37697255cc8fce2adMike Lockwood                    service.setDevicePackage(mDevice, null);
9702eb8746de2d60563ec2751a34d20923192e4293Mike Lockwood                }
98d591357524091254483849e37697255cc8fce2adMike Lockwood            } else if (mAccessory != null) {
9902eb8746de2d60563ec2751a34d20923192e4293Mike Lockwood                // grant permission for the accessory
100d591357524091254483849e37697255cc8fce2adMike Lockwood                service.grantAccessoryPermission(mAccessory, uid);
10102eb8746de2d60563ec2751a34d20923192e4293Mike Lockwood                // set or clear default setting
10202eb8746de2d60563ec2751a34d20923192e4293Mike Lockwood                if (alwaysCheck) {
103d591357524091254483849e37697255cc8fce2adMike Lockwood                    service.setAccessoryPackage(mAccessory, ri.activityInfo.packageName);
10402eb8746de2d60563ec2751a34d20923192e4293Mike Lockwood                } else {
105d591357524091254483849e37697255cc8fce2adMike Lockwood                    service.setAccessoryPackage(mAccessory, null);
10602eb8746de2d60563ec2751a34d20923192e4293Mike Lockwood                }
10702eb8746de2d60563ec2751a34d20923192e4293Mike Lockwood            }
10802eb8746de2d60563ec2751a34d20923192e4293Mike Lockwood
10902eb8746de2d60563ec2751a34d20923192e4293Mike Lockwood            try {
11002eb8746de2d60563ec2751a34d20923192e4293Mike Lockwood                startActivity(intent);
11102eb8746de2d60563ec2751a34d20923192e4293Mike Lockwood            } catch (ActivityNotFoundException e) {
11202eb8746de2d60563ec2751a34d20923192e4293Mike Lockwood                Log.e(TAG, "startActivity failed", e);
11302eb8746de2d60563ec2751a34d20923192e4293Mike Lockwood            }
11402eb8746de2d60563ec2751a34d20923192e4293Mike Lockwood        } catch (RemoteException e) {
11502eb8746de2d60563ec2751a34d20923192e4293Mike Lockwood            Log.e(TAG, "onIntentSelected failed", e);
11602eb8746de2d60563ec2751a34d20923192e4293Mike Lockwood        }
11702eb8746de2d60563ec2751a34d20923192e4293Mike Lockwood    }
11802eb8746de2d60563ec2751a34d20923192e4293Mike Lockwood}
119