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