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