UsbService.java revision 674019065bceb4150190bfb1aa63cda9de0a8560
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; 20fc3f24b4b60c10e0d3f41f70df37e11ea311cc2cJeff Sharkeyimport android.content.BroadcastReceiver; 212423607a32d63a0c646b17758ebeb4dc1d0b791fMike Lockwoodimport android.content.Context; 22fc3f24b4b60c10e0d3f41f70df37e11ea311cc2cJeff Sharkeyimport android.content.Intent; 23fc3f24b4b60c10e0d3f41f70df37e11ea311cc2cJeff Sharkeyimport android.content.IntentFilter; 2402eb8746de2d60563ec2751a34d20923192e4293Mike Lockwoodimport android.content.pm.PackageManager; 25c4308f01c965571dc2354107c3574df113e397eeMike Lockwoodimport android.hardware.usb.IUsbManager; 26c4308f01c965571dc2354107c3574df113e397eeMike Lockwoodimport android.hardware.usb.UsbAccessory; 27c4308f01c965571dc2354107c3574df113e397eeMike Lockwoodimport android.hardware.usb.UsbDevice; 28e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwoodimport android.os.Bundle; 29e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwoodimport android.os.ParcelFileDescriptor; 30fc3f24b4b60c10e0d3f41f70df37e11ea311cc2cJeff Sharkeyimport android.os.UserHandle; 311848d31c2cbb5404be383ad44049e58e36b258baEmily Bernierimport android.os.UserManager; 32fc3f24b4b60c10e0d3f41f70df37e11ea311cc2cJeff Sharkeyimport android.util.SparseArray; 33fc3f24b4b60c10e0d3f41f70df37e11ea311cc2cJeff Sharkey 348b2c3a14603d163d7564e6f60286995079687690Jeff Sharkeyimport com.android.internal.annotations.GuardedBy; 35fc3f24b4b60c10e0d3f41f70df37e11ea311cc2cJeff Sharkeyimport com.android.internal.util.IndentingPrintWriter; 362cb6c60c0d2de3bc743c043aca963db6fe52662fAdam Lesinskiimport com.android.server.SystemService; 372423607a32d63a0c646b17758ebeb4dc1d0b791fMike Lockwood 382423607a32d63a0c646b17758ebeb4dc1d0b791fMike Lockwoodimport java.io.File; 3902eb8746de2d60563ec2751a34d20923192e4293Mike Lockwoodimport java.io.FileDescriptor; 4002eb8746de2d60563ec2751a34d20923192e4293Mike Lockwoodimport java.io.PrintWriter; 412423607a32d63a0c646b17758ebeb4dc1d0b791fMike Lockwood 422423607a32d63a0c646b17758ebeb4dc1d0b791fMike Lockwood/** 4346d0adf8256a42416584765625852b6e48497c90Mike Lockwood * UsbService manages all USB related state, including both host and device support. 4446d0adf8256a42416584765625852b6e48497c90Mike Lockwood * Host related events and calls are delegated to UsbHostManager, and device related 4546d0adf8256a42416584765625852b6e48497c90Mike Lockwood * support is delegated to UsbDeviceManager. 462423607a32d63a0c646b17758ebeb4dc1d0b791fMike Lockwood */ 4702eb8746de2d60563ec2751a34d20923192e4293Mike Lockwoodpublic class UsbService extends IUsbManager.Stub { 482cb6c60c0d2de3bc743c043aca963db6fe52662fAdam Lesinski 492cb6c60c0d2de3bc743c043aca963db6fe52662fAdam Lesinski public static class Lifecycle extends SystemService { 502cb6c60c0d2de3bc743c043aca963db6fe52662fAdam Lesinski private UsbService mUsbService; 512cb6c60c0d2de3bc743c043aca963db6fe52662fAdam Lesinski 522cb6c60c0d2de3bc743c043aca963db6fe52662fAdam Lesinski public Lifecycle(Context context) { 532cb6c60c0d2de3bc743c043aca963db6fe52662fAdam Lesinski super(context); 542cb6c60c0d2de3bc743c043aca963db6fe52662fAdam Lesinski } 552cb6c60c0d2de3bc743c043aca963db6fe52662fAdam Lesinski 562cb6c60c0d2de3bc743c043aca963db6fe52662fAdam Lesinski @Override 572cb6c60c0d2de3bc743c043aca963db6fe52662fAdam Lesinski public void onStart() { 582cb6c60c0d2de3bc743c043aca963db6fe52662fAdam Lesinski mUsbService = new UsbService(getContext()); 592cb6c60c0d2de3bc743c043aca963db6fe52662fAdam Lesinski publishBinderService(Context.USB_SERVICE, mUsbService); 602cb6c60c0d2de3bc743c043aca963db6fe52662fAdam Lesinski } 612cb6c60c0d2de3bc743c043aca963db6fe52662fAdam Lesinski 622cb6c60c0d2de3bc743c043aca963db6fe52662fAdam Lesinski @Override 632cb6c60c0d2de3bc743c043aca963db6fe52662fAdam Lesinski public void onBootPhase(int phase) { 642cb6c60c0d2de3bc743c043aca963db6fe52662fAdam Lesinski if (phase == SystemService.PHASE_ACTIVITY_MANAGER_READY) { 652cb6c60c0d2de3bc743c043aca963db6fe52662fAdam Lesinski mUsbService.systemReady(); 662cb6c60c0d2de3bc743c043aca963db6fe52662fAdam Lesinski } 672cb6c60c0d2de3bc743c043aca963db6fe52662fAdam Lesinski } 682cb6c60c0d2de3bc743c043aca963db6fe52662fAdam Lesinski } 692cb6c60c0d2de3bc743c043aca963db6fe52662fAdam Lesinski 70fc3f24b4b60c10e0d3f41f70df37e11ea311cc2cJeff Sharkey private static final String TAG = "UsbService"; 71fc3f24b4b60c10e0d3f41f70df37e11ea311cc2cJeff Sharkey 722423607a32d63a0c646b17758ebeb4dc1d0b791fMike Lockwood private final Context mContext; 73fc3f24b4b60c10e0d3f41f70df37e11ea311cc2cJeff Sharkey 7446d0adf8256a42416584765625852b6e48497c90Mike Lockwood private UsbDeviceManager mDeviceManager; 7546d0adf8256a42416584765625852b6e48497c90Mike Lockwood private UsbHostManager mHostManager; 762e3434149e00f921ca3555ae55cba04d3c64eeb1Mike Lockwood private final UsbAlsaManager mAlsaManager; 77ddc6cade00bbc08fa668cf937f606538f5c29a80Mike Lockwood 78fc3f24b4b60c10e0d3f41f70df37e11ea311cc2cJeff Sharkey private final Object mLock = new Object(); 79fc3f24b4b60c10e0d3f41f70df37e11ea311cc2cJeff Sharkey 80fc3f24b4b60c10e0d3f41f70df37e11ea311cc2cJeff Sharkey /** Map from {@link UserHandle} to {@link UsbSettingsManager} */ 818b2c3a14603d163d7564e6f60286995079687690Jeff Sharkey @GuardedBy("mLock") 82fc3f24b4b60c10e0d3f41f70df37e11ea311cc2cJeff Sharkey private final SparseArray<UsbSettingsManager> 83fc3f24b4b60c10e0d3f41f70df37e11ea311cc2cJeff Sharkey mSettingsByUser = new SparseArray<UsbSettingsManager>(); 84fc3f24b4b60c10e0d3f41f70df37e11ea311cc2cJeff Sharkey 85fc3f24b4b60c10e0d3f41f70df37e11ea311cc2cJeff Sharkey private UsbSettingsManager getSettingsForUser(int userId) { 86fc3f24b4b60c10e0d3f41f70df37e11ea311cc2cJeff Sharkey synchronized (mLock) { 87fc3f24b4b60c10e0d3f41f70df37e11ea311cc2cJeff Sharkey UsbSettingsManager settings = mSettingsByUser.get(userId); 88fc3f24b4b60c10e0d3f41f70df37e11ea311cc2cJeff Sharkey if (settings == null) { 89fc3f24b4b60c10e0d3f41f70df37e11ea311cc2cJeff Sharkey settings = new UsbSettingsManager(mContext, new UserHandle(userId)); 90fc3f24b4b60c10e0d3f41f70df37e11ea311cc2cJeff Sharkey mSettingsByUser.put(userId, settings); 91fc3f24b4b60c10e0d3f41f70df37e11ea311cc2cJeff Sharkey } 92fc3f24b4b60c10e0d3f41f70df37e11ea311cc2cJeff Sharkey return settings; 93fc3f24b4b60c10e0d3f41f70df37e11ea311cc2cJeff Sharkey } 94fc3f24b4b60c10e0d3f41f70df37e11ea311cc2cJeff Sharkey } 951c0e543638fa940651b675645146fd71c2ebd9b9Mike Lockwood 96770126a678ccc9328a89407ffc82f4d998b25427Mike Lockwood public UsbService(Context context) { 97770126a678ccc9328a89407ffc82f4d998b25427Mike Lockwood mContext = context; 98fc3f24b4b60c10e0d3f41f70df37e11ea311cc2cJeff Sharkey 992e3434149e00f921ca3555ae55cba04d3c64eeb1Mike Lockwood mAlsaManager = new UsbAlsaManager(context); 1002e3434149e00f921ca3555ae55cba04d3c64eeb1Mike Lockwood 101fc3f24b4b60c10e0d3f41f70df37e11ea311cc2cJeff Sharkey final PackageManager pm = mContext.getPackageManager(); 10246d0adf8256a42416584765625852b6e48497c90Mike Lockwood if (pm.hasSystemFeature(PackageManager.FEATURE_USB_HOST)) { 1032e3434149e00f921ca3555ae55cba04d3c64eeb1Mike Lockwood mHostManager = new UsbHostManager(context, mAlsaManager); 1042423607a32d63a0c646b17758ebeb4dc1d0b791fMike Lockwood } 10502e4569b5f126ca916a7473117ddd17d4f2ccbbbMike Lockwood if (new File("/sys/class/android_usb").exists()) { 1062e3434149e00f921ca3555ae55cba04d3c64eeb1Mike Lockwood mDeviceManager = new UsbDeviceManager(context, mAlsaManager); 107fc3f24b4b60c10e0d3f41f70df37e11ea311cc2cJeff Sharkey } 108fc3f24b4b60c10e0d3f41f70df37e11ea311cc2cJeff Sharkey 109fc3f24b4b60c10e0d3f41f70df37e11ea311cc2cJeff Sharkey setCurrentUser(UserHandle.USER_OWNER); 110fc3f24b4b60c10e0d3f41f70df37e11ea311cc2cJeff Sharkey 111fc3f24b4b60c10e0d3f41f70df37e11ea311cc2cJeff Sharkey final IntentFilter userFilter = new IntentFilter(); 112fc3f24b4b60c10e0d3f41f70df37e11ea311cc2cJeff Sharkey userFilter.addAction(Intent.ACTION_USER_SWITCHED); 113fc3f24b4b60c10e0d3f41f70df37e11ea311cc2cJeff Sharkey userFilter.addAction(Intent.ACTION_USER_STOPPED); 114fc3f24b4b60c10e0d3f41f70df37e11ea311cc2cJeff Sharkey mContext.registerReceiver(mUserReceiver, userFilter, null, null); 115fc3f24b4b60c10e0d3f41f70df37e11ea311cc2cJeff Sharkey } 116fc3f24b4b60c10e0d3f41f70df37e11ea311cc2cJeff Sharkey 117fc3f24b4b60c10e0d3f41f70df37e11ea311cc2cJeff Sharkey private BroadcastReceiver mUserReceiver = new BroadcastReceiver() { 118fc3f24b4b60c10e0d3f41f70df37e11ea311cc2cJeff Sharkey @Override 119fc3f24b4b60c10e0d3f41f70df37e11ea311cc2cJeff Sharkey public void onReceive(Context context, Intent intent) { 120fc3f24b4b60c10e0d3f41f70df37e11ea311cc2cJeff Sharkey final int userId = intent.getIntExtra(Intent.EXTRA_USER_HANDLE, -1); 121fc3f24b4b60c10e0d3f41f70df37e11ea311cc2cJeff Sharkey final String action = intent.getAction(); 122fc3f24b4b60c10e0d3f41f70df37e11ea311cc2cJeff Sharkey if (Intent.ACTION_USER_SWITCHED.equals(action)) { 123fc3f24b4b60c10e0d3f41f70df37e11ea311cc2cJeff Sharkey setCurrentUser(userId); 124fc3f24b4b60c10e0d3f41f70df37e11ea311cc2cJeff Sharkey } else if (Intent.ACTION_USER_STOPPED.equals(action)) { 125fc3f24b4b60c10e0d3f41f70df37e11ea311cc2cJeff Sharkey synchronized (mLock) { 126fc3f24b4b60c10e0d3f41f70df37e11ea311cc2cJeff Sharkey mSettingsByUser.remove(userId); 127fc3f24b4b60c10e0d3f41f70df37e11ea311cc2cJeff Sharkey } 128fc3f24b4b60c10e0d3f41f70df37e11ea311cc2cJeff Sharkey } 129fc3f24b4b60c10e0d3f41f70df37e11ea311cc2cJeff Sharkey } 130fc3f24b4b60c10e0d3f41f70df37e11ea311cc2cJeff Sharkey }; 131fc3f24b4b60c10e0d3f41f70df37e11ea311cc2cJeff Sharkey 132fc3f24b4b60c10e0d3f41f70df37e11ea311cc2cJeff Sharkey private void setCurrentUser(int userId) { 133fc3f24b4b60c10e0d3f41f70df37e11ea311cc2cJeff Sharkey final UsbSettingsManager userSettings = getSettingsForUser(userId); 134fc3f24b4b60c10e0d3f41f70df37e11ea311cc2cJeff Sharkey if (mHostManager != null) { 135fc3f24b4b60c10e0d3f41f70df37e11ea311cc2cJeff Sharkey mHostManager.setCurrentSettings(userSettings); 136fc3f24b4b60c10e0d3f41f70df37e11ea311cc2cJeff Sharkey } 137fc3f24b4b60c10e0d3f41f70df37e11ea311cc2cJeff Sharkey if (mDeviceManager != null) { 138fc3f24b4b60c10e0d3f41f70df37e11ea311cc2cJeff Sharkey mDeviceManager.setCurrentSettings(userSettings); 139a8e3a898a2bc004ca1fcd278b68f5da5c344afbbMike Lockwood } 140da39f0e87814c5acb8b6319a1877b93197fb910eMike Lockwood } 141da39f0e87814c5acb8b6319a1877b93197fb910eMike Lockwood 14202eb8746de2d60563ec2751a34d20923192e4293Mike Lockwood public void systemReady() { 1432e3434149e00f921ca3555ae55cba04d3c64eeb1Mike Lockwood mAlsaManager.systemReady(); 1442e3434149e00f921ca3555ae55cba04d3c64eeb1Mike Lockwood 14546d0adf8256a42416584765625852b6e48497c90Mike Lockwood if (mDeviceManager != null) { 14646d0adf8256a42416584765625852b6e48497c90Mike Lockwood mDeviceManager.systemReady(); 14746d0adf8256a42416584765625852b6e48497c90Mike Lockwood } 14846d0adf8256a42416584765625852b6e48497c90Mike Lockwood if (mHostManager != null) { 14946d0adf8256a42416584765625852b6e48497c90Mike Lockwood mHostManager.systemReady(); 1502423607a32d63a0c646b17758ebeb4dc1d0b791fMike Lockwood } 1512423607a32d63a0c646b17758ebeb4dc1d0b791fMike Lockwood } 1522423607a32d63a0c646b17758ebeb4dc1d0b791fMike Lockwood 153ddc6cade00bbc08fa668cf937f606538f5c29a80Mike Lockwood /* Returns a list of all currently attached USB devices (host mdoe) */ 154fc3f24b4b60c10e0d3f41f70df37e11ea311cc2cJeff Sharkey @Override 155e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood public void getDeviceList(Bundle devices) { 15646d0adf8256a42416584765625852b6e48497c90Mike Lockwood if (mHostManager != null) { 15746d0adf8256a42416584765625852b6e48497c90Mike Lockwood mHostManager.getDeviceList(devices); 158e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood } 159e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood } 160e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood 161ddc6cade00bbc08fa668cf937f606538f5c29a80Mike Lockwood /* Opens the specified USB device (host mode) */ 162fc3f24b4b60c10e0d3f41f70df37e11ea311cc2cJeff Sharkey @Override 163e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood public ParcelFileDescriptor openDevice(String deviceName) { 16446d0adf8256a42416584765625852b6e48497c90Mike Lockwood if (mHostManager != null) { 16546d0adf8256a42416584765625852b6e48497c90Mike Lockwood return mHostManager.openDevice(deviceName); 16646d0adf8256a42416584765625852b6e48497c90Mike Lockwood } else { 16746d0adf8256a42416584765625852b6e48497c90Mike Lockwood return null; 1688b682ad08a8e55b3ce2cf58f3aff6d3464ab668bMike Lockwood } 169e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood } 170e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood 171ddc6cade00bbc08fa668cf937f606538f5c29a80Mike Lockwood /* returns the currently attached USB accessory (device mode) */ 172fc3f24b4b60c10e0d3f41f70df37e11ea311cc2cJeff Sharkey @Override 1739182d3c4eb1f9065cb33df5a3594969dd0d42accMike Lockwood public UsbAccessory getCurrentAccessory() { 17446d0adf8256a42416584765625852b6e48497c90Mike Lockwood if (mDeviceManager != null) { 17546d0adf8256a42416584765625852b6e48497c90Mike Lockwood return mDeviceManager.getCurrentAccessory(); 17646d0adf8256a42416584765625852b6e48497c90Mike Lockwood } else { 17746d0adf8256a42416584765625852b6e48497c90Mike Lockwood return null; 17846d0adf8256a42416584765625852b6e48497c90Mike Lockwood } 1799182d3c4eb1f9065cb33df5a3594969dd0d42accMike Lockwood } 1809182d3c4eb1f9065cb33df5a3594969dd0d42accMike Lockwood 181ddc6cade00bbc08fa668cf937f606538f5c29a80Mike Lockwood /* opens the currently attached USB accessory (device mode) */ 182fc3f24b4b60c10e0d3f41f70df37e11ea311cc2cJeff Sharkey @Override 18302eb8746de2d60563ec2751a34d20923192e4293Mike Lockwood public ParcelFileDescriptor openAccessory(UsbAccessory accessory) { 18446d0adf8256a42416584765625852b6e48497c90Mike Lockwood if (mDeviceManager != null) { 18502e4569b5f126ca916a7473117ddd17d4f2ccbbbMike Lockwood return mDeviceManager.openAccessory(accessory); 18646d0adf8256a42416584765625852b6e48497c90Mike Lockwood } else { 18746d0adf8256a42416584765625852b6e48497c90Mike Lockwood return null; 18802eb8746de2d60563ec2751a34d20923192e4293Mike Lockwood } 18902eb8746de2d60563ec2751a34d20923192e4293Mike Lockwood } 19002eb8746de2d60563ec2751a34d20923192e4293Mike Lockwood 191fc3f24b4b60c10e0d3f41f70df37e11ea311cc2cJeff Sharkey @Override 192fc3f24b4b60c10e0d3f41f70df37e11ea311cc2cJeff Sharkey public void setDevicePackage(UsbDevice device, String packageName, int userId) { 1937a976a43700a17a29a0671c8456e41ec0a1086b9Mike Lockwood mContext.enforceCallingOrSelfPermission(android.Manifest.permission.MANAGE_USB, null); 194fc3f24b4b60c10e0d3f41f70df37e11ea311cc2cJeff Sharkey getSettingsForUser(userId).setDevicePackage(device, packageName); 19502eb8746de2d60563ec2751a34d20923192e4293Mike Lockwood } 19602eb8746de2d60563ec2751a34d20923192e4293Mike Lockwood 197fc3f24b4b60c10e0d3f41f70df37e11ea311cc2cJeff Sharkey @Override 198fc3f24b4b60c10e0d3f41f70df37e11ea311cc2cJeff Sharkey public void setAccessoryPackage(UsbAccessory accessory, String packageName, int userId) { 1997a976a43700a17a29a0671c8456e41ec0a1086b9Mike Lockwood mContext.enforceCallingOrSelfPermission(android.Manifest.permission.MANAGE_USB, null); 200fc3f24b4b60c10e0d3f41f70df37e11ea311cc2cJeff Sharkey getSettingsForUser(userId).setAccessoryPackage(accessory, packageName); 20102eb8746de2d60563ec2751a34d20923192e4293Mike Lockwood } 20202eb8746de2d60563ec2751a34d20923192e4293Mike Lockwood 203fc3f24b4b60c10e0d3f41f70df37e11ea311cc2cJeff Sharkey @Override 2043a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood public boolean hasDevicePermission(UsbDevice device) { 205fc3f24b4b60c10e0d3f41f70df37e11ea311cc2cJeff Sharkey final int userId = UserHandle.getCallingUserId(); 206fc3f24b4b60c10e0d3f41f70df37e11ea311cc2cJeff Sharkey return getSettingsForUser(userId).hasPermission(device); 2073a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood } 2083a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood 209fc3f24b4b60c10e0d3f41f70df37e11ea311cc2cJeff Sharkey @Override 2103a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood public boolean hasAccessoryPermission(UsbAccessory accessory) { 211fc3f24b4b60c10e0d3f41f70df37e11ea311cc2cJeff Sharkey final int userId = UserHandle.getCallingUserId(); 212fc3f24b4b60c10e0d3f41f70df37e11ea311cc2cJeff Sharkey return getSettingsForUser(userId).hasPermission(accessory); 2133a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood } 2143a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood 215fc3f24b4b60c10e0d3f41f70df37e11ea311cc2cJeff Sharkey @Override 216fc3f24b4b60c10e0d3f41f70df37e11ea311cc2cJeff Sharkey public void requestDevicePermission(UsbDevice device, String packageName, PendingIntent pi) { 217fc3f24b4b60c10e0d3f41f70df37e11ea311cc2cJeff Sharkey final int userId = UserHandle.getCallingUserId(); 218fc3f24b4b60c10e0d3f41f70df37e11ea311cc2cJeff Sharkey getSettingsForUser(userId).requestPermission(device, packageName, pi); 2193a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood } 2203a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood 221fc3f24b4b60c10e0d3f41f70df37e11ea311cc2cJeff Sharkey @Override 222fc3f24b4b60c10e0d3f41f70df37e11ea311cc2cJeff Sharkey public void requestAccessoryPermission( 223fc3f24b4b60c10e0d3f41f70df37e11ea311cc2cJeff Sharkey UsbAccessory accessory, String packageName, PendingIntent pi) { 224fc3f24b4b60c10e0d3f41f70df37e11ea311cc2cJeff Sharkey final int userId = UserHandle.getCallingUserId(); 225fc3f24b4b60c10e0d3f41f70df37e11ea311cc2cJeff Sharkey getSettingsForUser(userId).requestPermission(accessory, packageName, pi); 2263a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood } 2273a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood 228fc3f24b4b60c10e0d3f41f70df37e11ea311cc2cJeff Sharkey @Override 22902eb8746de2d60563ec2751a34d20923192e4293Mike Lockwood public void grantDevicePermission(UsbDevice device, int uid) { 2307a976a43700a17a29a0671c8456e41ec0a1086b9Mike Lockwood mContext.enforceCallingOrSelfPermission(android.Manifest.permission.MANAGE_USB, null); 231fc3f24b4b60c10e0d3f41f70df37e11ea311cc2cJeff Sharkey final int userId = UserHandle.getUserId(uid); 232fc3f24b4b60c10e0d3f41f70df37e11ea311cc2cJeff Sharkey getSettingsForUser(userId).grantDevicePermission(device, uid); 23302eb8746de2d60563ec2751a34d20923192e4293Mike Lockwood } 23402eb8746de2d60563ec2751a34d20923192e4293Mike Lockwood 235fc3f24b4b60c10e0d3f41f70df37e11ea311cc2cJeff Sharkey @Override 23602eb8746de2d60563ec2751a34d20923192e4293Mike Lockwood public void grantAccessoryPermission(UsbAccessory accessory, int uid) { 2377a976a43700a17a29a0671c8456e41ec0a1086b9Mike Lockwood mContext.enforceCallingOrSelfPermission(android.Manifest.permission.MANAGE_USB, null); 238fc3f24b4b60c10e0d3f41f70df37e11ea311cc2cJeff Sharkey final int userId = UserHandle.getUserId(uid); 239fc3f24b4b60c10e0d3f41f70df37e11ea311cc2cJeff Sharkey getSettingsForUser(userId).grantAccessoryPermission(accessory, uid); 24002eb8746de2d60563ec2751a34d20923192e4293Mike Lockwood } 24102eb8746de2d60563ec2751a34d20923192e4293Mike Lockwood 242fc3f24b4b60c10e0d3f41f70df37e11ea311cc2cJeff Sharkey @Override 243fc3f24b4b60c10e0d3f41f70df37e11ea311cc2cJeff Sharkey public boolean hasDefaults(String packageName, int userId) { 2447a976a43700a17a29a0671c8456e41ec0a1086b9Mike Lockwood mContext.enforceCallingOrSelfPermission(android.Manifest.permission.MANAGE_USB, null); 245fc3f24b4b60c10e0d3f41f70df37e11ea311cc2cJeff Sharkey return getSettingsForUser(userId).hasDefaults(packageName); 24602eb8746de2d60563ec2751a34d20923192e4293Mike Lockwood } 24702eb8746de2d60563ec2751a34d20923192e4293Mike Lockwood 248fc3f24b4b60c10e0d3f41f70df37e11ea311cc2cJeff Sharkey @Override 249fc3f24b4b60c10e0d3f41f70df37e11ea311cc2cJeff Sharkey public void clearDefaults(String packageName, int userId) { 2507a976a43700a17a29a0671c8456e41ec0a1086b9Mike Lockwood mContext.enforceCallingOrSelfPermission(android.Manifest.permission.MANAGE_USB, null); 251fc3f24b4b60c10e0d3f41f70df37e11ea311cc2cJeff Sharkey getSettingsForUser(userId).clearDefaults(packageName); 2529182d3c4eb1f9065cb33df5a3594969dd0d42accMike Lockwood } 2539182d3c4eb1f9065cb33df5a3594969dd0d42accMike Lockwood 254fc3f24b4b60c10e0d3f41f70df37e11ea311cc2cJeff Sharkey @Override 255fcf10f7c12cb3107bdfedce6f76a8c866d154f3cNick Kralevich public void setCurrentFunction(String function) { 25602e4569b5f126ca916a7473117ddd17d4f2ccbbbMike Lockwood mContext.enforceCallingOrSelfPermission(android.Manifest.permission.MANAGE_USB, null); 2571848d31c2cbb5404be383ad44049e58e36b258baEmily Bernier 2581848d31c2cbb5404be383ad44049e58e36b258baEmily Bernier // If attempt to change USB function while file transfer is restricted, ensure that 2591848d31c2cbb5404be383ad44049e58e36b258baEmily Bernier // the current function is set to "none", and return. 2601848d31c2cbb5404be383ad44049e58e36b258baEmily Bernier UserManager userManager = (UserManager) mContext.getSystemService(Context.USER_SERVICE); 2611848d31c2cbb5404be383ad44049e58e36b258baEmily Bernier if (userManager.hasUserRestriction(UserManager.DISALLOW_USB_FILE_TRANSFER)) { 262fcf10f7c12cb3107bdfedce6f76a8c866d154f3cNick Kralevich if (mDeviceManager != null) mDeviceManager.setCurrentFunctions("none"); 2631848d31c2cbb5404be383ad44049e58e36b258baEmily Bernier return; 2641848d31c2cbb5404be383ad44049e58e36b258baEmily Bernier } 2651848d31c2cbb5404be383ad44049e58e36b258baEmily Bernier 26602e4569b5f126ca916a7473117ddd17d4f2ccbbbMike Lockwood if (mDeviceManager != null) { 267fcf10f7c12cb3107bdfedce6f76a8c866d154f3cNick Kralevich mDeviceManager.setCurrentFunctions(function); 26802e4569b5f126ca916a7473117ddd17d4f2ccbbbMike Lockwood } else { 26902e4569b5f126ca916a7473117ddd17d4f2ccbbbMike Lockwood throw new IllegalStateException("USB device mode not supported"); 27002e4569b5f126ca916a7473117ddd17d4f2ccbbbMike Lockwood } 27102e4569b5f126ca916a7473117ddd17d4f2ccbbbMike Lockwood } 27202e4569b5f126ca916a7473117ddd17d4f2ccbbbMike Lockwood 273fc3f24b4b60c10e0d3f41f70df37e11ea311cc2cJeff Sharkey @Override 274674019065bceb4150190bfb1aa63cda9de0a8560Nick Kralevich public void setUsbDataUnlocked(boolean unlocked) { 275674019065bceb4150190bfb1aa63cda9de0a8560Nick Kralevich mContext.enforceCallingOrSelfPermission(android.Manifest.permission.MANAGE_USB, null); 276674019065bceb4150190bfb1aa63cda9de0a8560Nick Kralevich mDeviceManager.setUsbDataUnlocked(unlocked); 277674019065bceb4150190bfb1aa63cda9de0a8560Nick Kralevich } 278674019065bceb4150190bfb1aa63cda9de0a8560Nick Kralevich 279674019065bceb4150190bfb1aa63cda9de0a8560Nick Kralevich @Override 280674019065bceb4150190bfb1aa63cda9de0a8560Nick Kralevich public boolean isUsbDataUnlocked() { 281674019065bceb4150190bfb1aa63cda9de0a8560Nick Kralevich mContext.enforceCallingOrSelfPermission(android.Manifest.permission.MANAGE_USB, null); 282674019065bceb4150190bfb1aa63cda9de0a8560Nick Kralevich return mDeviceManager.isUsbDataUnlocked(); 283674019065bceb4150190bfb1aa63cda9de0a8560Nick Kralevich } 284674019065bceb4150190bfb1aa63cda9de0a8560Nick Kralevich 285674019065bceb4150190bfb1aa63cda9de0a8560Nick Kralevich @Override 2864e68bd420b6cfdbeadb5e69aa6448665b2da762bBenoit Goby public void allowUsbDebugging(boolean alwaysAllow, String publicKey) { 2874e68bd420b6cfdbeadb5e69aa6448665b2da762bBenoit Goby mContext.enforceCallingOrSelfPermission(android.Manifest.permission.MANAGE_USB, null); 2884e68bd420b6cfdbeadb5e69aa6448665b2da762bBenoit Goby mDeviceManager.allowUsbDebugging(alwaysAllow, publicKey); 2894e68bd420b6cfdbeadb5e69aa6448665b2da762bBenoit Goby } 2904e68bd420b6cfdbeadb5e69aa6448665b2da762bBenoit Goby 291fc3f24b4b60c10e0d3f41f70df37e11ea311cc2cJeff Sharkey @Override 2924e68bd420b6cfdbeadb5e69aa6448665b2da762bBenoit Goby public void denyUsbDebugging() { 2934e68bd420b6cfdbeadb5e69aa6448665b2da762bBenoit Goby mContext.enforceCallingOrSelfPermission(android.Manifest.permission.MANAGE_USB, null); 2944e68bd420b6cfdbeadb5e69aa6448665b2da762bBenoit Goby mDeviceManager.denyUsbDebugging(); 2954e68bd420b6cfdbeadb5e69aa6448665b2da762bBenoit Goby } 2964e68bd420b6cfdbeadb5e69aa6448665b2da762bBenoit Goby 29702eb8746de2d60563ec2751a34d20923192e4293Mike Lockwood @Override 298cd7a17c645761ac0b64c75346b159dd30cbcb01cBenoit Goby public void clearUsbDebuggingKeys() { 299cd7a17c645761ac0b64c75346b159dd30cbcb01cBenoit Goby mContext.enforceCallingOrSelfPermission(android.Manifest.permission.MANAGE_USB, null); 300cd7a17c645761ac0b64c75346b159dd30cbcb01cBenoit Goby mDeviceManager.clearUsbDebuggingKeys(); 301cd7a17c645761ac0b64c75346b159dd30cbcb01cBenoit Goby } 302cd7a17c645761ac0b64c75346b159dd30cbcb01cBenoit Goby 303cd7a17c645761ac0b64c75346b159dd30cbcb01cBenoit Goby @Override 304fc3f24b4b60c10e0d3f41f70df37e11ea311cc2cJeff Sharkey public void dump(FileDescriptor fd, PrintWriter writer, String[] args) { 305fc3f24b4b60c10e0d3f41f70df37e11ea311cc2cJeff Sharkey mContext.enforceCallingOrSelfPermission(android.Manifest.permission.DUMP, TAG); 306fc3f24b4b60c10e0d3f41f70df37e11ea311cc2cJeff Sharkey final IndentingPrintWriter pw = new IndentingPrintWriter(writer, " "); 30702eb8746de2d60563ec2751a34d20923192e4293Mike Lockwood 30846d0adf8256a42416584765625852b6e48497c90Mike Lockwood pw.println("USB Manager State:"); 30946d0adf8256a42416584765625852b6e48497c90Mike Lockwood if (mDeviceManager != null) { 31002eb8746de2d60563ec2751a34d20923192e4293Mike Lockwood mDeviceManager.dump(fd, pw); 31102eb8746de2d60563ec2751a34d20923192e4293Mike Lockwood } 31246d0adf8256a42416584765625852b6e48497c90Mike Lockwood if (mHostManager != null) { 31346d0adf8256a42416584765625852b6e48497c90Mike Lockwood mHostManager.dump(fd, pw); 31446d0adf8256a42416584765625852b6e48497c90Mike Lockwood } 3152e3434149e00f921ca3555ae55cba04d3c64eeb1Mike Lockwood mAlsaManager.dump(fd, pw); 316fc3f24b4b60c10e0d3f41f70df37e11ea311cc2cJeff Sharkey 317fc3f24b4b60c10e0d3f41f70df37e11ea311cc2cJeff Sharkey synchronized (mLock) { 318fc3f24b4b60c10e0d3f41f70df37e11ea311cc2cJeff Sharkey for (int i = 0; i < mSettingsByUser.size(); i++) { 319fc3f24b4b60c10e0d3f41f70df37e11ea311cc2cJeff Sharkey final int userId = mSettingsByUser.keyAt(i); 320fc3f24b4b60c10e0d3f41f70df37e11ea311cc2cJeff Sharkey final UsbSettingsManager settings = mSettingsByUser.valueAt(i); 321fc3f24b4b60c10e0d3f41f70df37e11ea311cc2cJeff Sharkey pw.increaseIndent(); 322fc3f24b4b60c10e0d3f41f70df37e11ea311cc2cJeff Sharkey pw.println("Settings for user " + userId + ":"); 323fc3f24b4b60c10e0d3f41f70df37e11ea311cc2cJeff Sharkey settings.dump(fd, pw); 324fc3f24b4b60c10e0d3f41f70df37e11ea311cc2cJeff Sharkey pw.decreaseIndent(); 325fc3f24b4b60c10e0d3f41f70df37e11ea311cc2cJeff Sharkey } 326fc3f24b4b60c10e0d3f41f70df37e11ea311cc2cJeff Sharkey } 327fc3f24b4b60c10e0d3f41f70df37e11ea311cc2cJeff Sharkey pw.decreaseIndent(); 32802eb8746de2d60563ec2751a34d20923192e4293Mike Lockwood } 3292423607a32d63a0c646b17758ebeb4dc1d0b791fMike Lockwood} 330