| /* |
| * Copyright (C) 2010 The Android Open Source Project |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions an |
| * limitations under the License. |
| */ |
| |
| package com.android.server.usb; |
| |
| import android.app.PendingIntent; |
| import android.content.Context; |
| import android.content.pm.PackageManager; |
| import android.hardware.usb.IUsbManager; |
| import android.hardware.usb.UsbAccessory; |
| import android.hardware.usb.UsbDevice; |
| import android.net.Uri; |
| import android.os.Binder; |
| import android.os.Bundle; |
| import android.os.ParcelFileDescriptor; |
| |
| import java.io.File; |
| import java.io.FileDescriptor; |
| import java.io.PrintWriter; |
| |
| /** |
| * UsbService manages all USB related state, including both host and device support. |
| * Host related events and calls are delegated to UsbHostManager, and device related |
| * support is delegated to UsbDeviceManager. |
| */ |
| public class UsbService extends IUsbManager.Stub { |
| private final Context mContext; |
| private UsbDeviceManager mDeviceManager; |
| private UsbHostManager mHostManager; |
| private final UsbSettingsManager mSettingsManager; |
| |
| |
| public UsbService(Context context) { |
| mContext = context; |
| mSettingsManager = new UsbSettingsManager(context); |
| PackageManager pm = mContext.getPackageManager(); |
| if (pm.hasSystemFeature(PackageManager.FEATURE_USB_HOST)) { |
| mHostManager = new UsbHostManager(context, mSettingsManager); |
| } |
| if (new File("/sys/class/android_usb").exists()) { |
| mDeviceManager = new UsbDeviceManager(context, mSettingsManager); |
| } |
| } |
| |
| public void systemReady() { |
| if (mDeviceManager != null) { |
| mDeviceManager.systemReady(); |
| } |
| if (mHostManager != null) { |
| mHostManager.systemReady(); |
| } |
| } |
| |
| /* Returns a list of all currently attached USB devices (host mdoe) */ |
| public void getDeviceList(Bundle devices) { |
| if (mHostManager != null) { |
| mHostManager.getDeviceList(devices); |
| } |
| } |
| |
| /* Opens the specified USB device (host mode) */ |
| public ParcelFileDescriptor openDevice(String deviceName) { |
| if (mHostManager != null) { |
| return mHostManager.openDevice(deviceName); |
| } else { |
| return null; |
| } |
| } |
| |
| /* returns the currently attached USB accessory (device mode) */ |
| public UsbAccessory getCurrentAccessory() { |
| if (mDeviceManager != null) { |
| return mDeviceManager.getCurrentAccessory(); |
| } else { |
| return null; |
| } |
| } |
| |
| /* opens the currently attached USB accessory (device mode) */ |
| public ParcelFileDescriptor openAccessory(UsbAccessory accessory) { |
| if (mDeviceManager != null) { |
| return mDeviceManager.openAccessory(accessory); |
| } else { |
| return null; |
| } |
| } |
| |
| public void setDevicePackage(UsbDevice device, String packageName) { |
| mContext.enforceCallingOrSelfPermission(android.Manifest.permission.MANAGE_USB, null); |
| mSettingsManager.setDevicePackage(device, packageName); |
| } |
| |
| public void setAccessoryPackage(UsbAccessory accessory, String packageName) { |
| mContext.enforceCallingOrSelfPermission(android.Manifest.permission.MANAGE_USB, null); |
| mSettingsManager.setAccessoryPackage(accessory, packageName); |
| } |
| |
| public boolean hasDevicePermission(UsbDevice device) { |
| return mSettingsManager.hasPermission(device); |
| } |
| |
| public boolean hasAccessoryPermission(UsbAccessory accessory) { |
| return mSettingsManager.hasPermission(accessory); |
| } |
| |
| public void requestDevicePermission(UsbDevice device, String packageName, |
| PendingIntent pi) { |
| mSettingsManager.requestPermission(device, packageName, pi); |
| } |
| |
| public void requestAccessoryPermission(UsbAccessory accessory, String packageName, |
| PendingIntent pi) { |
| mSettingsManager.requestPermission(accessory, packageName, pi); |
| } |
| |
| public void grantDevicePermission(UsbDevice device, int uid) { |
| mContext.enforceCallingOrSelfPermission(android.Manifest.permission.MANAGE_USB, null); |
| mSettingsManager.grantDevicePermission(device, uid); |
| } |
| |
| public void grantAccessoryPermission(UsbAccessory accessory, int uid) { |
| mContext.enforceCallingOrSelfPermission(android.Manifest.permission.MANAGE_USB, null); |
| mSettingsManager.grantAccessoryPermission(accessory, uid); |
| } |
| |
| public boolean hasDefaults(String packageName) { |
| mContext.enforceCallingOrSelfPermission(android.Manifest.permission.MANAGE_USB, null); |
| return mSettingsManager.hasDefaults(packageName); |
| } |
| |
| public void clearDefaults(String packageName) { |
| mContext.enforceCallingOrSelfPermission(android.Manifest.permission.MANAGE_USB, null); |
| mSettingsManager.clearDefaults(packageName); |
| } |
| |
| public void setCurrentFunction(String function, boolean makeDefault) { |
| mContext.enforceCallingOrSelfPermission(android.Manifest.permission.MANAGE_USB, null); |
| if (mDeviceManager != null) { |
| mDeviceManager.setCurrentFunction(function, makeDefault); |
| } else { |
| throw new IllegalStateException("USB device mode not supported"); |
| } |
| } |
| |
| public void setMassStorageBackingFile(String path) { |
| mContext.enforceCallingOrSelfPermission(android.Manifest.permission.MANAGE_USB, null); |
| if (mDeviceManager != null) { |
| mDeviceManager.setMassStorageBackingFile(path); |
| } else { |
| throw new IllegalStateException("USB device mode not supported"); |
| } |
| } |
| |
| @Override |
| public void dump(FileDescriptor fd, PrintWriter pw, String[] args) { |
| if (mContext.checkCallingOrSelfPermission(android.Manifest.permission.DUMP) |
| != PackageManager.PERMISSION_GRANTED) { |
| pw.println("Permission Denial: can't dump UsbManager from from pid=" |
| + Binder.getCallingPid() |
| + ", uid=" + Binder.getCallingUid()); |
| return; |
| } |
| |
| pw.println("USB Manager State:"); |
| |
| if (mDeviceManager != null) { |
| mDeviceManager.dump(fd, pw); |
| } |
| if (mHostManager != null) { |
| mHostManager.dump(fd, pw); |
| } |
| mSettingsManager.dump(fd, pw); |
| } |
| } |