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