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 android.content.ActivityNotFoundException;
2002eb8746de2d60563ec2751a34d20923192e4293Mike Lockwoodimport android.content.Intent;
2102eb8746de2d60563ec2751a34d20923192e4293Mike Lockwoodimport android.content.pm.ResolveInfo;
22c4308f01c965571dc2354107c3574df113e397eeMike Lockwoodimport android.hardware.usb.IUsbManager;
23c4308f01c965571dc2354107c3574df113e397eeMike Lockwoodimport android.hardware.usb.UsbAccessory;
24c4308f01c965571dc2354107c3574df113e397eeMike Lockwoodimport android.hardware.usb.UsbDevice;
25c4308f01c965571dc2354107c3574df113e397eeMike Lockwoodimport android.hardware.usb.UsbManager;
2602eb8746de2d60563ec2751a34d20923192e4293Mike Lockwoodimport android.os.Bundle;
2702eb8746de2d60563ec2751a34d20923192e4293Mike Lockwoodimport android.os.IBinder;
2802eb8746de2d60563ec2751a34d20923192e4293Mike Lockwoodimport android.os.Parcelable;
2902eb8746de2d60563ec2751a34d20923192e4293Mike Lockwoodimport android.os.RemoteException;
3002eb8746de2d60563ec2751a34d20923192e4293Mike Lockwoodimport android.os.ServiceManager;
31fc3f24b4b60c10e0d3f41f70df37e11ea311cc2cJeff Sharkeyimport android.os.UserHandle;
3202eb8746de2d60563ec2751a34d20923192e4293Mike Lockwoodimport android.util.Log;
33ad5f83e91b6812a6dee4fea7646fa9061d9f9597Mike Lockwoodimport android.widget.CheckBox;
34ad5f83e91b6812a6dee4fea7646fa9061d9f9597Mike Lockwood
35fc3f24b4b60c10e0d3f41f70df37e11ea311cc2cJeff Sharkeyimport com.android.internal.app.ResolverActivity;
36ad5f83e91b6812a6dee4fea7646fa9061d9f9597Mike Lockwoodimport com.android.systemui.R;
3702eb8746de2d60563ec2751a34d20923192e4293Mike Lockwood
3802eb8746de2d60563ec2751a34d20923192e4293Mike Lockwoodimport java.util.ArrayList;
3902eb8746de2d60563ec2751a34d20923192e4293Mike Lockwood
4002eb8746de2d60563ec2751a34d20923192e4293Mike Lockwood/* Activity for choosing an application for a USB device or accessory */
4102eb8746de2d60563ec2751a34d20923192e4293Mike Lockwoodpublic class UsbResolverActivity extends ResolverActivity {
4202eb8746de2d60563ec2751a34d20923192e4293Mike Lockwood    public static final String TAG = "UsbResolverActivity";
4302eb8746de2d60563ec2751a34d20923192e4293Mike Lockwood    public static final String EXTRA_RESOLVE_INFOS = "rlist";
4402eb8746de2d60563ec2751a34d20923192e4293Mike Lockwood
45d591357524091254483849e37697255cc8fce2adMike Lockwood    private UsbDevice mDevice;
46d591357524091254483849e37697255cc8fce2adMike Lockwood    private UsbAccessory mAccessory;
47d591357524091254483849e37697255cc8fce2adMike Lockwood    private UsbDisconnectedReceiver mDisconnectedReceiver;
48d591357524091254483849e37697255cc8fce2adMike Lockwood
4902eb8746de2d60563ec2751a34d20923192e4293Mike Lockwood    @Override
5002eb8746de2d60563ec2751a34d20923192e4293Mike Lockwood    protected void onCreate(Bundle savedInstanceState) {
5102eb8746de2d60563ec2751a34d20923192e4293Mike Lockwood        Intent intent = getIntent();
5202eb8746de2d60563ec2751a34d20923192e4293Mike Lockwood        Parcelable targetParcelable = intent.getParcelableExtra(Intent.EXTRA_INTENT);
5302eb8746de2d60563ec2751a34d20923192e4293Mike Lockwood        if (!(targetParcelable instanceof Intent)) {
5402eb8746de2d60563ec2751a34d20923192e4293Mike Lockwood            Log.w("UsbResolverActivity", "Target is not an intent: " + targetParcelable);
5502eb8746de2d60563ec2751a34d20923192e4293Mike Lockwood            finish();
5602eb8746de2d60563ec2751a34d20923192e4293Mike Lockwood            return;
5702eb8746de2d60563ec2751a34d20923192e4293Mike Lockwood        }
5802eb8746de2d60563ec2751a34d20923192e4293Mike Lockwood        Intent target = (Intent)targetParcelable;
5902eb8746de2d60563ec2751a34d20923192e4293Mike Lockwood        ArrayList<ResolveInfo> rList = intent.getParcelableArrayListExtra(EXTRA_RESOLVE_INFOS);
6002eb8746de2d60563ec2751a34d20923192e4293Mike Lockwood        CharSequence title = getResources().getText(com.android.internal.R.string.chooseUsbActivity);
6102eb8746de2d60563ec2751a34d20923192e4293Mike Lockwood        super.onCreate(savedInstanceState, target, title, null, rList,
62bce6f8f249ff2b65df9ed790cc460053ab8eccecMike Lockwood                true /* Set alwaysUseOption to true to enable "always use this app" checkbox. */ );
63d591357524091254483849e37697255cc8fce2adMike Lockwood
64ad5f83e91b6812a6dee4fea7646fa9061d9f9597Mike Lockwood        CheckBox alwaysUse = (CheckBox)findViewById(com.android.internal.R.id.alwaysUse);
65ad5f83e91b6812a6dee4fea7646fa9061d9f9597Mike Lockwood        if (alwaysUse != null) {
66ad5f83e91b6812a6dee4fea7646fa9061d9f9597Mike Lockwood            if (mDevice == null) {
67ad5f83e91b6812a6dee4fea7646fa9061d9f9597Mike Lockwood                alwaysUse.setText(R.string.always_use_accessory);
68ad5f83e91b6812a6dee4fea7646fa9061d9f9597Mike Lockwood            } else {
69ad5f83e91b6812a6dee4fea7646fa9061d9f9597Mike Lockwood                alwaysUse.setText(R.string.always_use_device);
70ad5f83e91b6812a6dee4fea7646fa9061d9f9597Mike Lockwood            }
71ad5f83e91b6812a6dee4fea7646fa9061d9f9597Mike Lockwood        }
72ad5f83e91b6812a6dee4fea7646fa9061d9f9597Mike Lockwood
73d591357524091254483849e37697255cc8fce2adMike Lockwood        mDevice = (UsbDevice)target.getParcelableExtra(UsbManager.EXTRA_DEVICE);
74d591357524091254483849e37697255cc8fce2adMike Lockwood        if (mDevice != null) {
75d591357524091254483849e37697255cc8fce2adMike Lockwood            mDisconnectedReceiver = new UsbDisconnectedReceiver(this, mDevice);
76d591357524091254483849e37697255cc8fce2adMike Lockwood        } else {
77d591357524091254483849e37697255cc8fce2adMike Lockwood            mAccessory = (UsbAccessory)target.getParcelableExtra(UsbManager.EXTRA_ACCESSORY);
78d591357524091254483849e37697255cc8fce2adMike Lockwood            if (mAccessory == null) {
79d591357524091254483849e37697255cc8fce2adMike Lockwood                Log.e(TAG, "no device or accessory");
80d591357524091254483849e37697255cc8fce2adMike Lockwood                finish();
81d591357524091254483849e37697255cc8fce2adMike Lockwood                return;
82d591357524091254483849e37697255cc8fce2adMike Lockwood            }
83d591357524091254483849e37697255cc8fce2adMike Lockwood            mDisconnectedReceiver = new UsbDisconnectedReceiver(this, mAccessory);
84d591357524091254483849e37697255cc8fce2adMike Lockwood        }
85d591357524091254483849e37697255cc8fce2adMike Lockwood    }
86d591357524091254483849e37697255cc8fce2adMike Lockwood
87d591357524091254483849e37697255cc8fce2adMike Lockwood    @Override
88d591357524091254483849e37697255cc8fce2adMike Lockwood    protected void onDestroy() {
89d591357524091254483849e37697255cc8fce2adMike Lockwood        if (mDisconnectedReceiver != null) {
90d591357524091254483849e37697255cc8fce2adMike Lockwood            unregisterReceiver(mDisconnectedReceiver);
91d591357524091254483849e37697255cc8fce2adMike Lockwood        }
92d591357524091254483849e37697255cc8fce2adMike Lockwood        super.onDestroy();
9302eb8746de2d60563ec2751a34d20923192e4293Mike Lockwood    }
9402eb8746de2d60563ec2751a34d20923192e4293Mike Lockwood
95fc3f24b4b60c10e0d3f41f70df37e11ea311cc2cJeff Sharkey    @Override
9602eb8746de2d60563ec2751a34d20923192e4293Mike Lockwood    protected void onIntentSelected(ResolveInfo ri, Intent intent, boolean alwaysCheck) {
9702eb8746de2d60563ec2751a34d20923192e4293Mike Lockwood        try {
9802eb8746de2d60563ec2751a34d20923192e4293Mike Lockwood            IBinder b = ServiceManager.getService(USB_SERVICE);
9902eb8746de2d60563ec2751a34d20923192e4293Mike Lockwood            IUsbManager service = IUsbManager.Stub.asInterface(b);
100fc3f24b4b60c10e0d3f41f70df37e11ea311cc2cJeff Sharkey            final int uid = ri.activityInfo.applicationInfo.uid;
101fc3f24b4b60c10e0d3f41f70df37e11ea311cc2cJeff Sharkey            final int userId = UserHandle.myUserId();
10202eb8746de2d60563ec2751a34d20923192e4293Mike Lockwood
103d591357524091254483849e37697255cc8fce2adMike Lockwood            if (mDevice != null) {
10402eb8746de2d60563ec2751a34d20923192e4293Mike Lockwood                // grant permission for the device
105d591357524091254483849e37697255cc8fce2adMike Lockwood                service.grantDevicePermission(mDevice, uid);
10602eb8746de2d60563ec2751a34d20923192e4293Mike Lockwood                // set or clear default setting
10702eb8746de2d60563ec2751a34d20923192e4293Mike Lockwood                if (alwaysCheck) {
108fc3f24b4b60c10e0d3f41f70df37e11ea311cc2cJeff Sharkey                    service.setDevicePackage(mDevice, ri.activityInfo.packageName, userId);
10902eb8746de2d60563ec2751a34d20923192e4293Mike Lockwood                } else {
110fc3f24b4b60c10e0d3f41f70df37e11ea311cc2cJeff Sharkey                    service.setDevicePackage(mDevice, null, userId);
11102eb8746de2d60563ec2751a34d20923192e4293Mike Lockwood                }
112d591357524091254483849e37697255cc8fce2adMike Lockwood            } else if (mAccessory != null) {
11302eb8746de2d60563ec2751a34d20923192e4293Mike Lockwood                // grant permission for the accessory
114d591357524091254483849e37697255cc8fce2adMike Lockwood                service.grantAccessoryPermission(mAccessory, uid);
11502eb8746de2d60563ec2751a34d20923192e4293Mike Lockwood                // set or clear default setting
11602eb8746de2d60563ec2751a34d20923192e4293Mike Lockwood                if (alwaysCheck) {
117fc3f24b4b60c10e0d3f41f70df37e11ea311cc2cJeff Sharkey                    service.setAccessoryPackage(mAccessory, ri.activityInfo.packageName, userId);
11802eb8746de2d60563ec2751a34d20923192e4293Mike Lockwood                } else {
119fc3f24b4b60c10e0d3f41f70df37e11ea311cc2cJeff Sharkey                    service.setAccessoryPackage(mAccessory, null, userId);
12002eb8746de2d60563ec2751a34d20923192e4293Mike Lockwood                }
12102eb8746de2d60563ec2751a34d20923192e4293Mike Lockwood            }
12202eb8746de2d60563ec2751a34d20923192e4293Mike Lockwood
12302eb8746de2d60563ec2751a34d20923192e4293Mike Lockwood            try {
124fc3f24b4b60c10e0d3f41f70df37e11ea311cc2cJeff Sharkey                startActivityAsUser(intent, new UserHandle(userId));
12502eb8746de2d60563ec2751a34d20923192e4293Mike Lockwood            } catch (ActivityNotFoundException e) {
12602eb8746de2d60563ec2751a34d20923192e4293Mike Lockwood                Log.e(TAG, "startActivity failed", e);
12702eb8746de2d60563ec2751a34d20923192e4293Mike Lockwood            }
12802eb8746de2d60563ec2751a34d20923192e4293Mike Lockwood        } catch (RemoteException e) {
12902eb8746de2d60563ec2751a34d20923192e4293Mike Lockwood            Log.e(TAG, "onIntentSelected failed", e);
13002eb8746de2d60563ec2751a34d20923192e4293Mike Lockwood        }
13102eb8746de2d60563ec2751a34d20923192e4293Mike Lockwood    }
13202eb8746de2d60563ec2751a34d20923192e4293Mike Lockwood}
133