diff options
author | Jeff Sharkey <jsharkey@android.com> | 2012-10-01 21:45:52 -0700 |
---|---|---|
committer | Jeff Sharkey <jsharkey@android.com> | 2012-10-02 18:09:10 -0700 |
commit | fc3f24b4b60c10e0d3f41f70df37e11ea311cc2c (patch) | |
tree | be61172447392620b42c88517ad58a5210adf5cb /services/java/com/android/server/usb/UsbDeviceManager.java | |
parent | c6e570dbadc3689bc80c0516492a3209d5f6742b (diff) |
Make USB services multi-user aware.
USB settings are now isolated per-user, since they revolve around
installed packages. User-specific settings are returned based on
calling user, or referenced by UserHandle passed to SystemUI. Each
settings Context is wrapped as a specific user, so all broadcasts are
sent correctly. Upgrades any existing USB settings to OWNER.
Physical events, like new devices, are routed to the currently active
user. Switch to using AtomicFile when persisting settings.
Bug: 7244888
Change-Id: I8a723ad3d55ac1bff99276c5f3a3f5e8f013432f
Diffstat (limited to 'services/java/com/android/server/usb/UsbDeviceManager.java')
-rw-r--r-- | services/java/com/android/server/usb/UsbDeviceManager.java | 43 |
1 files changed, 26 insertions, 17 deletions
diff --git a/services/java/com/android/server/usb/UsbDeviceManager.java b/services/java/com/android/server/usb/UsbDeviceManager.java index 10011aadf6cb..95797ef2301e 100644 --- a/services/java/com/android/server/usb/UsbDeviceManager.java +++ b/services/java/com/android/server/usb/UsbDeviceManager.java @@ -16,9 +16,9 @@ package com.android.server.usb; -import android.app.PendingIntent; import android.app.Notification; import android.app.NotificationManager; +import android.app.PendingIntent; import android.content.BroadcastReceiver; import android.content.ComponentName; import android.content.ContentResolver; @@ -30,23 +30,19 @@ import android.content.res.Resources; import android.database.ContentObserver; import android.hardware.usb.UsbAccessory; import android.hardware.usb.UsbManager; -import android.net.Uri; -import android.os.Binder; -import android.os.Bundle; import android.os.FileUtils; import android.os.Handler; import android.os.HandlerThread; import android.os.Looper; import android.os.Message; -import android.os.Parcelable; import android.os.ParcelFileDescriptor; import android.os.Process; -import android.os.UserHandle; -import android.os.storage.StorageManager; -import android.os.storage.StorageVolume; import android.os.SystemClock; import android.os.SystemProperties; import android.os.UEventObserver; +import android.os.UserHandle; +import android.os.storage.StorageManager; +import android.os.storage.StorageVolume; import android.provider.Settings; import android.util.Pair; import android.util.Slog; @@ -56,10 +52,9 @@ import java.io.FileDescriptor; import java.io.FileNotFoundException; import java.io.IOException; import java.io.PrintWriter; -import java.util.ArrayList; +import java.util.HashMap; import java.util.LinkedList; import java.util.List; -import java.util.HashMap; import java.util.Map; import java.util.Scanner; @@ -106,9 +101,12 @@ public class UsbDeviceManager { private UsbHandler mHandler; private boolean mBootCompleted; + private final Object mLock = new Object(); + private final Context mContext; private final ContentResolver mContentResolver; - private final UsbSettingsManager mSettingsManager; + // @GuardedBy("mLock") + private UsbSettingsManager mCurrentSettings; private NotificationManager mNotificationManager; private final boolean mHasUsbAccessory; private boolean mUseUsbNotification; @@ -149,10 +147,9 @@ public class UsbDeviceManager { } }; - public UsbDeviceManager(Context context, UsbSettingsManager settingsManager) { + public UsbDeviceManager(Context context) { mContext = context; mContentResolver = context.getContentResolver(); - mSettingsManager = settingsManager; PackageManager pm = mContext.getPackageManager(); mHasUsbAccessory = pm.hasSystemFeature(PackageManager.FEATURE_USB_ACCESSORY); initRndisAddress(); @@ -175,6 +172,18 @@ public class UsbDeviceManager { } } + public void setCurrentSettings(UsbSettingsManager settings) { + synchronized (mLock) { + mCurrentSettings = settings; + } + } + + private UsbSettingsManager getCurrentSettings() { + synchronized (mLock) { + return mCurrentSettings; + } + } + public void systemReady() { if (DEBUG) Slog.d(TAG, "systemReady"); @@ -516,7 +525,7 @@ public class UsbDeviceManager { Slog.d(TAG, "entering USB accessory mode: " + mCurrentAccessory); // defer accessoryAttached if system is not ready if (mBootCompleted) { - mSettingsManager.accessoryAttached(mCurrentAccessory); + getCurrentSettings().accessoryAttached(mCurrentAccessory); } // else handle in mBootCompletedReceiver } else { Slog.e(TAG, "nativeGetAccessoryStrings failed"); @@ -529,7 +538,7 @@ public class UsbDeviceManager { if (mCurrentAccessory != null) { if (mBootCompleted) { - mSettingsManager.accessoryDetached(mCurrentAccessory); + getCurrentSettings().accessoryDetached(mCurrentAccessory); } mCurrentAccessory = null; mAccessoryStrings = null; @@ -618,7 +627,7 @@ public class UsbDeviceManager { case MSG_BOOT_COMPLETED: mBootCompleted = true; if (mCurrentAccessory != null) { - mSettingsManager.accessoryAttached(mCurrentAccessory); + getCurrentSettings().accessoryAttached(mCurrentAccessory); } if (mDebuggingManager != null) { mDebuggingManager.setAdbEnabled(mAdbEnabled); @@ -774,7 +783,7 @@ public class UsbDeviceManager { + currentAccessory; throw new IllegalArgumentException(error); } - mSettingsManager.checkPermission(accessory); + getCurrentSettings().checkPermission(accessory); return nativeOpenAccessory(); } |