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