blob: 629f5fa4bda843142d6cb183149e214af30d40cf [file] [log] [blame]
Mike Lockwood24236072010-06-23 17:36:36 -04001/*
2 * Copyright (C) 2010 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
Mike Lockwood46d0adf2011-05-26 10:27:39 -040013 * See the License for the specific language governing permissions an
Mike Lockwood24236072010-06-23 17:36:36 -040014 * limitations under the License.
15 */
16
Mike Lockwood02eb8742011-02-27 09:10:37 -080017package com.android.server.usb;
Mike Lockwood24236072010-06-23 17:36:36 -040018
Mike Lockwood3a68b832011-03-08 10:08:59 -050019import android.app.PendingIntent;
Jeff Sharkeyfc3f24b2012-10-01 21:45:52 -070020import android.content.BroadcastReceiver;
Mike Lockwood24236072010-06-23 17:36:36 -040021import android.content.Context;
Jeff Sharkeyfc3f24b2012-10-01 21:45:52 -070022import android.content.Intent;
23import android.content.IntentFilter;
Mike Lockwood02eb8742011-02-27 09:10:37 -080024import android.content.pm.PackageManager;
Mike Lockwoodc4308f02011-03-01 08:04:54 -080025import android.hardware.usb.IUsbManager;
26import android.hardware.usb.UsbAccessory;
Mike Lockwoodc4308f02011-03-01 08:04:54 -080027import android.hardware.usb.UsbDevice;
Mike Lockwoode7d511e2010-12-30 13:39:37 -050028import android.os.Bundle;
Mike Lockwoode7d511e2010-12-30 13:39:37 -050029import android.os.ParcelFileDescriptor;
Jeff Sharkeyfc3f24b2012-10-01 21:45:52 -070030import android.os.UserHandle;
31import android.util.SparseArray;
32
33import com.android.internal.util.IndentingPrintWriter;
Mike Lockwood24236072010-06-23 17:36:36 -040034
35import java.io.File;
Mike Lockwood02eb8742011-02-27 09:10:37 -080036import java.io.FileDescriptor;
Mike Lockwood02eb8742011-02-27 09:10:37 -080037import java.io.PrintWriter;
Mike Lockwood24236072010-06-23 17:36:36 -040038
39/**
Mike Lockwood46d0adf2011-05-26 10:27:39 -040040 * UsbService manages all USB related state, including both host and device support.
41 * Host related events and calls are delegated to UsbHostManager, and device related
42 * support is delegated to UsbDeviceManager.
Mike Lockwood24236072010-06-23 17:36:36 -040043 */
Mike Lockwood02eb8742011-02-27 09:10:37 -080044public class UsbService extends IUsbManager.Stub {
Jeff Sharkeyfc3f24b2012-10-01 21:45:52 -070045 private static final String TAG = "UsbService";
46
Mike Lockwood24236072010-06-23 17:36:36 -040047 private final Context mContext;
Jeff Sharkeyfc3f24b2012-10-01 21:45:52 -070048
Mike Lockwood46d0adf2011-05-26 10:27:39 -040049 private UsbDeviceManager mDeviceManager;
50 private UsbHostManager mHostManager;
Mike Lockwood24236072010-06-23 17:36:36 -040051
Jeff Sharkeyfc3f24b2012-10-01 21:45:52 -070052 private final Object mLock = new Object();
53
54 /** Map from {@link UserHandle} to {@link UsbSettingsManager} */
55 // @GuardedBy("mLock")
56 private final SparseArray<UsbSettingsManager>
57 mSettingsByUser = new SparseArray<UsbSettingsManager>();
58
59 private UsbSettingsManager getSettingsForUser(int userId) {
60 synchronized (mLock) {
61 UsbSettingsManager settings = mSettingsByUser.get(userId);
62 if (settings == null) {
63 settings = new UsbSettingsManager(mContext, new UserHandle(userId));
64 mSettingsByUser.put(userId, settings);
65 }
66 return settings;
67 }
68 }
Mike Lockwood1c0e5432011-03-19 12:03:46 -040069
Mike Lockwood770126a2010-12-09 22:30:37 -080070 public UsbService(Context context) {
71 mContext = context;
Jeff Sharkeyfc3f24b2012-10-01 21:45:52 -070072
73 final PackageManager pm = mContext.getPackageManager();
Mike Lockwood46d0adf2011-05-26 10:27:39 -040074 if (pm.hasSystemFeature(PackageManager.FEATURE_USB_HOST)) {
Jeff Sharkeyfc3f24b2012-10-01 21:45:52 -070075 mHostManager = new UsbHostManager(context);
David 'Digit' Turner49db8532011-01-17 00:19:37 +010076 }
Mike Lockwood02e45692011-06-14 15:43:51 -040077 if (new File("/sys/class/android_usb").exists()) {
Jeff Sharkeyfc3f24b2012-10-01 21:45:52 -070078 mDeviceManager = new UsbDeviceManager(context);
79 }
80
81 setCurrentUser(UserHandle.USER_OWNER);
82
83 final IntentFilter userFilter = new IntentFilter();
84 userFilter.addAction(Intent.ACTION_USER_SWITCHED);
85 userFilter.addAction(Intent.ACTION_USER_STOPPED);
86 mContext.registerReceiver(mUserReceiver, userFilter, null, null);
87 }
88
89 private BroadcastReceiver mUserReceiver = new BroadcastReceiver() {
90 @Override
91 public void onReceive(Context context, Intent intent) {
92 final int userId = intent.getIntExtra(Intent.EXTRA_USER_HANDLE, -1);
93 final String action = intent.getAction();
94 if (Intent.ACTION_USER_SWITCHED.equals(action)) {
95 setCurrentUser(userId);
96 } else if (Intent.ACTION_USER_STOPPED.equals(action)) {
97 synchronized (mLock) {
98 mSettingsByUser.remove(userId);
99 }
100 }
101 }
102 };
103
104 private void setCurrentUser(int userId) {
105 final UsbSettingsManager userSettings = getSettingsForUser(userId);
106 if (mHostManager != null) {
107 mHostManager.setCurrentSettings(userSettings);
108 }
109 if (mDeviceManager != null) {
110 mDeviceManager.setCurrentSettings(userSettings);
Mike Lockwood24236072010-06-23 17:36:36 -0400111 }
Mike Lockwoodda39f0e2010-07-27 18:44:30 -0400112 }
113
Mike Lockwood02eb8742011-02-27 09:10:37 -0800114 public void systemReady() {
Mike Lockwood46d0adf2011-05-26 10:27:39 -0400115 if (mDeviceManager != null) {
116 mDeviceManager.systemReady();
Mike Lockwood24236072010-06-23 17:36:36 -0400117 }
Mike Lockwood46d0adf2011-05-26 10:27:39 -0400118 if (mHostManager != null) {
119 mHostManager.systemReady();
120 }
Mike Lockwood24236072010-06-23 17:36:36 -0400121 }
122
Mike Lockwoodddc6cad2011-02-17 09:21:25 -0500123 /* Returns a list of all currently attached USB devices (host mdoe) */
Jeff Sharkeyfc3f24b2012-10-01 21:45:52 -0700124 @Override
Mike Lockwoode7d511e2010-12-30 13:39:37 -0500125 public void getDeviceList(Bundle devices) {
Mike Lockwood46d0adf2011-05-26 10:27:39 -0400126 if (mHostManager != null) {
127 mHostManager.getDeviceList(devices);
Mike Lockwoode7d511e2010-12-30 13:39:37 -0500128 }
129 }
130
Mike Lockwoodddc6cad2011-02-17 09:21:25 -0500131 /* Opens the specified USB device (host mode) */
Jeff Sharkeyfc3f24b2012-10-01 21:45:52 -0700132 @Override
Mike Lockwoode7d511e2010-12-30 13:39:37 -0500133 public ParcelFileDescriptor openDevice(String deviceName) {
Mike Lockwood46d0adf2011-05-26 10:27:39 -0400134 if (mHostManager != null) {
135 return mHostManager.openDevice(deviceName);
136 } else {
137 return null;
Mike Lockwooda8e3a892011-02-01 13:46:50 -0500138 }
Mike Lockwoode7d511e2010-12-30 13:39:37 -0500139 }
140
Mike Lockwoodddc6cad2011-02-17 09:21:25 -0500141 /* returns the currently attached USB accessory (device mode) */
Jeff Sharkeyfc3f24b2012-10-01 21:45:52 -0700142 @Override
Mike Lockwood9182d3c2011-02-15 09:50:22 -0500143 public UsbAccessory getCurrentAccessory() {
Mike Lockwood46d0adf2011-05-26 10:27:39 -0400144 if (mDeviceManager != null) {
145 return mDeviceManager.getCurrentAccessory();
146 } else {
147 return null;
148 }
Mike Lockwood9182d3c2011-02-15 09:50:22 -0500149 }
150
Mike Lockwoodddc6cad2011-02-17 09:21:25 -0500151 /* opens the currently attached USB accessory (device mode) */
Jeff Sharkeyfc3f24b2012-10-01 21:45:52 -0700152 @Override
Mike Lockwood02eb8742011-02-27 09:10:37 -0800153 public ParcelFileDescriptor openAccessory(UsbAccessory accessory) {
Mike Lockwood46d0adf2011-05-26 10:27:39 -0400154 if (mDeviceManager != null) {
Mike Lockwood02e45692011-06-14 15:43:51 -0400155 return mDeviceManager.openAccessory(accessory);
Mike Lockwood46d0adf2011-05-26 10:27:39 -0400156 } else {
157 return null;
Mike Lockwood02eb8742011-02-27 09:10:37 -0800158 }
159 }
160
Jeff Sharkeyfc3f24b2012-10-01 21:45:52 -0700161 @Override
162 public void setDevicePackage(UsbDevice device, String packageName, int userId) {
Mike Lockwood7a976a42011-03-01 09:40:07 -0800163 mContext.enforceCallingOrSelfPermission(android.Manifest.permission.MANAGE_USB, null);
Jeff Sharkeyfc3f24b2012-10-01 21:45:52 -0700164 getSettingsForUser(userId).setDevicePackage(device, packageName);
Mike Lockwood02eb8742011-02-27 09:10:37 -0800165 }
166
Jeff Sharkeyfc3f24b2012-10-01 21:45:52 -0700167 @Override
168 public void setAccessoryPackage(UsbAccessory accessory, String packageName, int userId) {
Mike Lockwood7a976a42011-03-01 09:40:07 -0800169 mContext.enforceCallingOrSelfPermission(android.Manifest.permission.MANAGE_USB, null);
Jeff Sharkeyfc3f24b2012-10-01 21:45:52 -0700170 getSettingsForUser(userId).setAccessoryPackage(accessory, packageName);
Mike Lockwood02eb8742011-02-27 09:10:37 -0800171 }
172
Jeff Sharkeyfc3f24b2012-10-01 21:45:52 -0700173 @Override
Mike Lockwood3a68b832011-03-08 10:08:59 -0500174 public boolean hasDevicePermission(UsbDevice device) {
Jeff Sharkeyfc3f24b2012-10-01 21:45:52 -0700175 final int userId = UserHandle.getCallingUserId();
176 return getSettingsForUser(userId).hasPermission(device);
Mike Lockwood3a68b832011-03-08 10:08:59 -0500177 }
178
Jeff Sharkeyfc3f24b2012-10-01 21:45:52 -0700179 @Override
Mike Lockwood3a68b832011-03-08 10:08:59 -0500180 public boolean hasAccessoryPermission(UsbAccessory accessory) {
Jeff Sharkeyfc3f24b2012-10-01 21:45:52 -0700181 final int userId = UserHandle.getCallingUserId();
182 return getSettingsForUser(userId).hasPermission(accessory);
Mike Lockwood3a68b832011-03-08 10:08:59 -0500183 }
184
Jeff Sharkeyfc3f24b2012-10-01 21:45:52 -0700185 @Override
186 public void requestDevicePermission(UsbDevice device, String packageName, PendingIntent pi) {
187 final int userId = UserHandle.getCallingUserId();
188 getSettingsForUser(userId).requestPermission(device, packageName, pi);
Mike Lockwood3a68b832011-03-08 10:08:59 -0500189 }
190
Jeff Sharkeyfc3f24b2012-10-01 21:45:52 -0700191 @Override
192 public void requestAccessoryPermission(
193 UsbAccessory accessory, String packageName, PendingIntent pi) {
194 final int userId = UserHandle.getCallingUserId();
195 getSettingsForUser(userId).requestPermission(accessory, packageName, pi);
Mike Lockwood3a68b832011-03-08 10:08:59 -0500196 }
197
Jeff Sharkeyfc3f24b2012-10-01 21:45:52 -0700198 @Override
Mike Lockwood02eb8742011-02-27 09:10:37 -0800199 public void grantDevicePermission(UsbDevice device, int uid) {
Mike Lockwood7a976a42011-03-01 09:40:07 -0800200 mContext.enforceCallingOrSelfPermission(android.Manifest.permission.MANAGE_USB, null);
Jeff Sharkeyfc3f24b2012-10-01 21:45:52 -0700201 final int userId = UserHandle.getUserId(uid);
202 getSettingsForUser(userId).grantDevicePermission(device, uid);
Mike Lockwood02eb8742011-02-27 09:10:37 -0800203 }
204
Jeff Sharkeyfc3f24b2012-10-01 21:45:52 -0700205 @Override
Mike Lockwood02eb8742011-02-27 09:10:37 -0800206 public void grantAccessoryPermission(UsbAccessory accessory, int uid) {
Mike Lockwood7a976a42011-03-01 09:40:07 -0800207 mContext.enforceCallingOrSelfPermission(android.Manifest.permission.MANAGE_USB, null);
Jeff Sharkeyfc3f24b2012-10-01 21:45:52 -0700208 final int userId = UserHandle.getUserId(uid);
209 getSettingsForUser(userId).grantAccessoryPermission(accessory, uid);
Mike Lockwood02eb8742011-02-27 09:10:37 -0800210 }
211
Jeff Sharkeyfc3f24b2012-10-01 21:45:52 -0700212 @Override
213 public boolean hasDefaults(String packageName, int userId) {
Mike Lockwood7a976a42011-03-01 09:40:07 -0800214 mContext.enforceCallingOrSelfPermission(android.Manifest.permission.MANAGE_USB, null);
Jeff Sharkeyfc3f24b2012-10-01 21:45:52 -0700215 return getSettingsForUser(userId).hasDefaults(packageName);
Mike Lockwood02eb8742011-02-27 09:10:37 -0800216 }
217
Jeff Sharkeyfc3f24b2012-10-01 21:45:52 -0700218 @Override
219 public void clearDefaults(String packageName, int userId) {
Mike Lockwood7a976a42011-03-01 09:40:07 -0800220 mContext.enforceCallingOrSelfPermission(android.Manifest.permission.MANAGE_USB, null);
Jeff Sharkeyfc3f24b2012-10-01 21:45:52 -0700221 getSettingsForUser(userId).clearDefaults(packageName);
Mike Lockwood9182d3c2011-02-15 09:50:22 -0500222 }
223
Jeff Sharkeyfc3f24b2012-10-01 21:45:52 -0700224 @Override
Mike Lockwoodf59717d2011-06-22 15:19:33 -0400225 public void setCurrentFunction(String function, boolean makeDefault) {
Mike Lockwood02e45692011-06-14 15:43:51 -0400226 mContext.enforceCallingOrSelfPermission(android.Manifest.permission.MANAGE_USB, null);
227 if (mDeviceManager != null) {
Mike Lockwood166b05e2012-04-24 10:45:18 -0700228 mDeviceManager.setCurrentFunctions(function, makeDefault);
Mike Lockwood02e45692011-06-14 15:43:51 -0400229 } else {
230 throw new IllegalStateException("USB device mode not supported");
231 }
232 }
233
Jeff Sharkeyfc3f24b2012-10-01 21:45:52 -0700234 @Override
Mike Lockwood02e45692011-06-14 15:43:51 -0400235 public void setMassStorageBackingFile(String path) {
236 mContext.enforceCallingOrSelfPermission(android.Manifest.permission.MANAGE_USB, null);
237 if (mDeviceManager != null) {
238 mDeviceManager.setMassStorageBackingFile(path);
239 } else {
240 throw new IllegalStateException("USB device mode not supported");
241 }
242 }
243
Jeff Sharkeyfc3f24b2012-10-01 21:45:52 -0700244 @Override
Benoit Goby4e68bd42012-04-25 18:06:00 -0700245 public void allowUsbDebugging(boolean alwaysAllow, String publicKey) {
246 mContext.enforceCallingOrSelfPermission(android.Manifest.permission.MANAGE_USB, null);
247 mDeviceManager.allowUsbDebugging(alwaysAllow, publicKey);
248 }
249
Jeff Sharkeyfc3f24b2012-10-01 21:45:52 -0700250 @Override
Benoit Goby4e68bd42012-04-25 18:06:00 -0700251 public void denyUsbDebugging() {
252 mContext.enforceCallingOrSelfPermission(android.Manifest.permission.MANAGE_USB, null);
253 mDeviceManager.denyUsbDebugging();
254 }
255
Mike Lockwood02eb8742011-02-27 09:10:37 -0800256 @Override
Jeff Sharkeyfc3f24b2012-10-01 21:45:52 -0700257 public void dump(FileDescriptor fd, PrintWriter writer, String[] args) {
258 mContext.enforceCallingOrSelfPermission(android.Manifest.permission.DUMP, TAG);
259 final IndentingPrintWriter pw = new IndentingPrintWriter(writer, " ");
Mike Lockwood02eb8742011-02-27 09:10:37 -0800260
Mike Lockwood46d0adf2011-05-26 10:27:39 -0400261 pw.println("USB Manager State:");
Mike Lockwood46d0adf2011-05-26 10:27:39 -0400262 if (mDeviceManager != null) {
Mike Lockwood02eb8742011-02-27 09:10:37 -0800263 mDeviceManager.dump(fd, pw);
264 }
Mike Lockwood46d0adf2011-05-26 10:27:39 -0400265 if (mHostManager != null) {
266 mHostManager.dump(fd, pw);
267 }
Jeff Sharkeyfc3f24b2012-10-01 21:45:52 -0700268
269 synchronized (mLock) {
270 for (int i = 0; i < mSettingsByUser.size(); i++) {
271 final int userId = mSettingsByUser.keyAt(i);
272 final UsbSettingsManager settings = mSettingsByUser.valueAt(i);
273 pw.increaseIndent();
274 pw.println("Settings for user " + userId + ":");
275 settings.dump(fd, pw);
276 pw.decreaseIndent();
277 }
278 }
279 pw.decreaseIndent();
Mike Lockwood02eb8742011-02-27 09:10:37 -0800280 }
Mike Lockwood24236072010-06-23 17:36:36 -0400281}