UsbService.java revision 46d0adf8256a42416584765625852b6e48497c90
12423607a32d63a0c646b17758ebeb4dc1d0b791fMike Lockwood/* 22423607a32d63a0c646b17758ebeb4dc1d0b791fMike Lockwood * Copyright (C) 2010 The Android Open Source Project 32423607a32d63a0c646b17758ebeb4dc1d0b791fMike Lockwood * 42423607a32d63a0c646b17758ebeb4dc1d0b791fMike Lockwood * Licensed under the Apache License, Version 2.0 (the "License"); 52423607a32d63a0c646b17758ebeb4dc1d0b791fMike Lockwood * you may not use this file except in compliance with the License. 62423607a32d63a0c646b17758ebeb4dc1d0b791fMike Lockwood * You may obtain a copy of the License at 72423607a32d63a0c646b17758ebeb4dc1d0b791fMike Lockwood * 82423607a32d63a0c646b17758ebeb4dc1d0b791fMike Lockwood * http://www.apache.org/licenses/LICENSE-2.0 92423607a32d63a0c646b17758ebeb4dc1d0b791fMike Lockwood * 102423607a32d63a0c646b17758ebeb4dc1d0b791fMike Lockwood * Unless required by applicable law or agreed to in writing, software 112423607a32d63a0c646b17758ebeb4dc1d0b791fMike Lockwood * distributed under the License is distributed on an "AS IS" BASIS, 122423607a32d63a0c646b17758ebeb4dc1d0b791fMike Lockwood * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 1346d0adf8256a42416584765625852b6e48497c90Mike Lockwood * See the License for the specific language governing permissions an 142423607a32d63a0c646b17758ebeb4dc1d0b791fMike Lockwood * limitations under the License. 152423607a32d63a0c646b17758ebeb4dc1d0b791fMike Lockwood */ 162423607a32d63a0c646b17758ebeb4dc1d0b791fMike Lockwood 1702eb8746de2d60563ec2751a34d20923192e4293Mike Lockwoodpackage com.android.server.usb; 182423607a32d63a0c646b17758ebeb4dc1d0b791fMike Lockwood 193a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwoodimport android.app.PendingIntent; 202423607a32d63a0c646b17758ebeb4dc1d0b791fMike Lockwoodimport android.content.Context; 2102eb8746de2d60563ec2751a34d20923192e4293Mike Lockwoodimport android.content.pm.PackageManager; 22c4308f01c965571dc2354107c3574df113e397eeMike Lockwoodimport android.hardware.usb.IUsbManager; 23c4308f01c965571dc2354107c3574df113e397eeMike Lockwoodimport android.hardware.usb.UsbAccessory; 24c4308f01c965571dc2354107c3574df113e397eeMike Lockwoodimport android.hardware.usb.UsbDevice; 252423607a32d63a0c646b17758ebeb4dc1d0b791fMike Lockwoodimport android.net.Uri; 2602eb8746de2d60563ec2751a34d20923192e4293Mike Lockwoodimport android.os.Binder; 27e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwoodimport android.os.Bundle; 28e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwoodimport android.os.ParcelFileDescriptor; 292423607a32d63a0c646b17758ebeb4dc1d0b791fMike Lockwood 302423607a32d63a0c646b17758ebeb4dc1d0b791fMike Lockwoodimport java.io.File; 3102eb8746de2d60563ec2751a34d20923192e4293Mike Lockwoodimport java.io.FileDescriptor; 3202eb8746de2d60563ec2751a34d20923192e4293Mike Lockwoodimport java.io.PrintWriter; 332423607a32d63a0c646b17758ebeb4dc1d0b791fMike Lockwood 342423607a32d63a0c646b17758ebeb4dc1d0b791fMike Lockwood/** 3546d0adf8256a42416584765625852b6e48497c90Mike Lockwood * UsbService manages all USB related state, including both host and device support. 3646d0adf8256a42416584765625852b6e48497c90Mike Lockwood * Host related events and calls are delegated to UsbHostManager, and device related 3746d0adf8256a42416584765625852b6e48497c90Mike Lockwood * support is delegated to UsbDeviceManager. 382423607a32d63a0c646b17758ebeb4dc1d0b791fMike Lockwood */ 3902eb8746de2d60563ec2751a34d20923192e4293Mike Lockwoodpublic class UsbService extends IUsbManager.Stub { 402423607a32d63a0c646b17758ebeb4dc1d0b791fMike Lockwood private final Context mContext; 4146d0adf8256a42416584765625852b6e48497c90Mike Lockwood private UsbDeviceManager mDeviceManager; 4246d0adf8256a42416584765625852b6e48497c90Mike Lockwood private UsbHostManager mHostManager; 4346d0adf8256a42416584765625852b6e48497c90Mike Lockwood private final UsbSettingsManager mSettingsManager; 44ddc6cade00bbc08fa668cf937f606538f5c29a80Mike Lockwood 451c0e543638fa940651b675645146fd71c2ebd9b9Mike Lockwood 46770126a678ccc9328a89407ffc82f4d998b25427Mike Lockwood public UsbService(Context context) { 47770126a678ccc9328a89407ffc82f4d998b25427Mike Lockwood mContext = context; 4846d0adf8256a42416584765625852b6e48497c90Mike Lockwood mSettingsManager = new UsbSettingsManager(context); 49f4ca247158ffb83139d675ac0e1d25239c310be2Mike Lockwood PackageManager pm = mContext.getPackageManager(); 5046d0adf8256a42416584765625852b6e48497c90Mike Lockwood if (pm.hasSystemFeature(PackageManager.FEATURE_USB_HOST)) { 5146d0adf8256a42416584765625852b6e48497c90Mike Lockwood mHostManager = new UsbHostManager(context, mSettingsManager); 522423607a32d63a0c646b17758ebeb4dc1d0b791fMike Lockwood } 5346d0adf8256a42416584765625852b6e48497c90Mike Lockwood if (new File("/sys/class/usb_composite").exists()) { 5446d0adf8256a42416584765625852b6e48497c90Mike Lockwood mDeviceManager = new UsbDeviceManager(context, mSettingsManager); 55a8e3a898a2bc004ca1fcd278b68f5da5c344afbbMike Lockwood } 56da39f0e87814c5acb8b6319a1877b93197fb910eMike Lockwood } 57da39f0e87814c5acb8b6319a1877b93197fb910eMike Lockwood 5802eb8746de2d60563ec2751a34d20923192e4293Mike Lockwood public void systemReady() { 5946d0adf8256a42416584765625852b6e48497c90Mike Lockwood if (mDeviceManager != null) { 6046d0adf8256a42416584765625852b6e48497c90Mike Lockwood mDeviceManager.systemReady(); 6146d0adf8256a42416584765625852b6e48497c90Mike Lockwood } 6246d0adf8256a42416584765625852b6e48497c90Mike Lockwood if (mHostManager != null) { 6346d0adf8256a42416584765625852b6e48497c90Mike Lockwood mHostManager.systemReady(); 642423607a32d63a0c646b17758ebeb4dc1d0b791fMike Lockwood } 652423607a32d63a0c646b17758ebeb4dc1d0b791fMike Lockwood } 662423607a32d63a0c646b17758ebeb4dc1d0b791fMike Lockwood 67ddc6cade00bbc08fa668cf937f606538f5c29a80Mike Lockwood /* Returns a list of all currently attached USB devices (host mdoe) */ 68e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood public void getDeviceList(Bundle devices) { 6946d0adf8256a42416584765625852b6e48497c90Mike Lockwood if (mHostManager != null) { 7046d0adf8256a42416584765625852b6e48497c90Mike Lockwood mHostManager.getDeviceList(devices); 71e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood } 72e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood } 73e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood 74ddc6cade00bbc08fa668cf937f606538f5c29a80Mike Lockwood /* Opens the specified USB device (host mode) */ 75e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood public ParcelFileDescriptor openDevice(String deviceName) { 7646d0adf8256a42416584765625852b6e48497c90Mike Lockwood if (mHostManager != null) { 7746d0adf8256a42416584765625852b6e48497c90Mike Lockwood return mHostManager.openDevice(deviceName); 7846d0adf8256a42416584765625852b6e48497c90Mike Lockwood } else { 7946d0adf8256a42416584765625852b6e48497c90Mike Lockwood return null; 808b682ad08a8e55b3ce2cf58f3aff6d3464ab668bMike Lockwood } 81e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood } 82e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood 83ddc6cade00bbc08fa668cf937f606538f5c29a80Mike Lockwood /* returns the currently attached USB accessory (device mode) */ 849182d3c4eb1f9065cb33df5a3594969dd0d42accMike Lockwood public UsbAccessory getCurrentAccessory() { 8546d0adf8256a42416584765625852b6e48497c90Mike Lockwood if (mDeviceManager != null) { 8646d0adf8256a42416584765625852b6e48497c90Mike Lockwood return mDeviceManager.getCurrentAccessory(); 8746d0adf8256a42416584765625852b6e48497c90Mike Lockwood } else { 8846d0adf8256a42416584765625852b6e48497c90Mike Lockwood return null; 8946d0adf8256a42416584765625852b6e48497c90Mike Lockwood } 909182d3c4eb1f9065cb33df5a3594969dd0d42accMike Lockwood } 919182d3c4eb1f9065cb33df5a3594969dd0d42accMike Lockwood 92ddc6cade00bbc08fa668cf937f606538f5c29a80Mike Lockwood /* opens the currently attached USB accessory (device mode) */ 9302eb8746de2d60563ec2751a34d20923192e4293Mike Lockwood public ParcelFileDescriptor openAccessory(UsbAccessory accessory) { 9446d0adf8256a42416584765625852b6e48497c90Mike Lockwood if (mDeviceManager != null) { 9546d0adf8256a42416584765625852b6e48497c90Mike Lockwood return openAccessory(accessory); 9646d0adf8256a42416584765625852b6e48497c90Mike Lockwood } else { 9746d0adf8256a42416584765625852b6e48497c90Mike Lockwood return null; 9802eb8746de2d60563ec2751a34d20923192e4293Mike Lockwood } 9902eb8746de2d60563ec2751a34d20923192e4293Mike Lockwood } 10002eb8746de2d60563ec2751a34d20923192e4293Mike Lockwood 10102eb8746de2d60563ec2751a34d20923192e4293Mike Lockwood public void setDevicePackage(UsbDevice device, String packageName) { 1027a976a43700a17a29a0671c8456e41ec0a1086b9Mike Lockwood mContext.enforceCallingOrSelfPermission(android.Manifest.permission.MANAGE_USB, null); 10346d0adf8256a42416584765625852b6e48497c90Mike Lockwood mSettingsManager.setDevicePackage(device, packageName); 10402eb8746de2d60563ec2751a34d20923192e4293Mike Lockwood } 10502eb8746de2d60563ec2751a34d20923192e4293Mike Lockwood 10602eb8746de2d60563ec2751a34d20923192e4293Mike Lockwood public void setAccessoryPackage(UsbAccessory accessory, String packageName) { 1077a976a43700a17a29a0671c8456e41ec0a1086b9Mike Lockwood mContext.enforceCallingOrSelfPermission(android.Manifest.permission.MANAGE_USB, null); 10846d0adf8256a42416584765625852b6e48497c90Mike Lockwood mSettingsManager.setAccessoryPackage(accessory, packageName); 10902eb8746de2d60563ec2751a34d20923192e4293Mike Lockwood } 11002eb8746de2d60563ec2751a34d20923192e4293Mike Lockwood 1113a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood public boolean hasDevicePermission(UsbDevice device) { 11246d0adf8256a42416584765625852b6e48497c90Mike Lockwood return mSettingsManager.hasPermission(device); 1133a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood } 1143a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood 1153a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood public boolean hasAccessoryPermission(UsbAccessory accessory) { 11646d0adf8256a42416584765625852b6e48497c90Mike Lockwood return mSettingsManager.hasPermission(accessory); 1173a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood } 1183a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood 1193a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood public void requestDevicePermission(UsbDevice device, String packageName, 1203a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood PendingIntent pi) { 12146d0adf8256a42416584765625852b6e48497c90Mike Lockwood mSettingsManager.requestPermission(device, packageName, pi); 1223a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood } 1233a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood 1243a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood public void requestAccessoryPermission(UsbAccessory accessory, String packageName, 1253a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood PendingIntent pi) { 12646d0adf8256a42416584765625852b6e48497c90Mike Lockwood mSettingsManager.requestPermission(accessory, packageName, pi); 1273a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood } 1283a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood 12902eb8746de2d60563ec2751a34d20923192e4293Mike Lockwood public void grantDevicePermission(UsbDevice device, int uid) { 1307a976a43700a17a29a0671c8456e41ec0a1086b9Mike Lockwood mContext.enforceCallingOrSelfPermission(android.Manifest.permission.MANAGE_USB, null); 13146d0adf8256a42416584765625852b6e48497c90Mike Lockwood mSettingsManager.grantDevicePermission(device, uid); 13202eb8746de2d60563ec2751a34d20923192e4293Mike Lockwood } 13302eb8746de2d60563ec2751a34d20923192e4293Mike Lockwood 13402eb8746de2d60563ec2751a34d20923192e4293Mike Lockwood public void grantAccessoryPermission(UsbAccessory accessory, int uid) { 1357a976a43700a17a29a0671c8456e41ec0a1086b9Mike Lockwood mContext.enforceCallingOrSelfPermission(android.Manifest.permission.MANAGE_USB, null); 13646d0adf8256a42416584765625852b6e48497c90Mike Lockwood mSettingsManager.grantAccessoryPermission(accessory, uid); 13702eb8746de2d60563ec2751a34d20923192e4293Mike Lockwood } 13802eb8746de2d60563ec2751a34d20923192e4293Mike Lockwood 139c6f23e8521dedac7a07119031913235be3ca37c3Mike Lockwood public boolean hasDefaults(String packageName) { 1407a976a43700a17a29a0671c8456e41ec0a1086b9Mike Lockwood mContext.enforceCallingOrSelfPermission(android.Manifest.permission.MANAGE_USB, null); 14146d0adf8256a42416584765625852b6e48497c90Mike Lockwood return mSettingsManager.hasDefaults(packageName); 14202eb8746de2d60563ec2751a34d20923192e4293Mike Lockwood } 14302eb8746de2d60563ec2751a34d20923192e4293Mike Lockwood 144c6f23e8521dedac7a07119031913235be3ca37c3Mike Lockwood public void clearDefaults(String packageName) { 1457a976a43700a17a29a0671c8456e41ec0a1086b9Mike Lockwood mContext.enforceCallingOrSelfPermission(android.Manifest.permission.MANAGE_USB, null); 14646d0adf8256a42416584765625852b6e48497c90Mike Lockwood mSettingsManager.clearDefaults(packageName); 1479182d3c4eb1f9065cb33df5a3594969dd0d42accMike Lockwood } 1489182d3c4eb1f9065cb33df5a3594969dd0d42accMike Lockwood 14902eb8746de2d60563ec2751a34d20923192e4293Mike Lockwood @Override 15002eb8746de2d60563ec2751a34d20923192e4293Mike Lockwood public void dump(FileDescriptor fd, PrintWriter pw, String[] args) { 15102eb8746de2d60563ec2751a34d20923192e4293Mike Lockwood if (mContext.checkCallingOrSelfPermission(android.Manifest.permission.DUMP) 15202eb8746de2d60563ec2751a34d20923192e4293Mike Lockwood != PackageManager.PERMISSION_GRANTED) { 15302eb8746de2d60563ec2751a34d20923192e4293Mike Lockwood pw.println("Permission Denial: can't dump UsbManager from from pid=" 15402eb8746de2d60563ec2751a34d20923192e4293Mike Lockwood + Binder.getCallingPid() 15502eb8746de2d60563ec2751a34d20923192e4293Mike Lockwood + ", uid=" + Binder.getCallingUid()); 15602eb8746de2d60563ec2751a34d20923192e4293Mike Lockwood return; 15702eb8746de2d60563ec2751a34d20923192e4293Mike Lockwood } 15802eb8746de2d60563ec2751a34d20923192e4293Mike Lockwood 15946d0adf8256a42416584765625852b6e48497c90Mike Lockwood pw.println("USB Manager State:"); 16002eb8746de2d60563ec2751a34d20923192e4293Mike Lockwood 16146d0adf8256a42416584765625852b6e48497c90Mike Lockwood if (mDeviceManager != null) { 16202eb8746de2d60563ec2751a34d20923192e4293Mike Lockwood mDeviceManager.dump(fd, pw); 16302eb8746de2d60563ec2751a34d20923192e4293Mike Lockwood } 16446d0adf8256a42416584765625852b6e48497c90Mike Lockwood if (mHostManager != null) { 16546d0adf8256a42416584765625852b6e48497c90Mike Lockwood mHostManager.dump(fd, pw); 16646d0adf8256a42416584765625852b6e48497c90Mike Lockwood } 16746d0adf8256a42416584765625852b6e48497c90Mike Lockwood mSettingsManager.dump(fd, pw); 16802eb8746de2d60563ec2751a34d20923192e4293Mike Lockwood } 1692423607a32d63a0c646b17758ebeb4dc1d0b791fMike Lockwood} 170