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