Skip to content

Commit fc3f24b

Browse files
committed
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
1 parent c6e570d commit fc3f24b

File tree

10 files changed

+311
-146
lines changed

10 files changed

+311
-146
lines changed

core/java/android/app/ContextImpl.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1703,6 +1703,7 @@ public Context createPackageContextAsUser(String packageName, int flags, UserHan
17031703
if (packageName.equals("system") || packageName.equals("android")) {
17041704
final ContextImpl context = new ContextImpl(mMainThread.getSystemContext());
17051705
context.mBasePackageName = mBasePackageName;
1706+
context.mUser = user;
17061707
return context;
17071708
}
17081709

core/java/android/hardware/usb/IUsbManager.aidl

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -44,12 +44,12 @@ interface IUsbManager
4444
/* Sets the default package for a USB device
4545
* (or clears it if the package name is null)
4646
*/
47-
void setDevicePackage(in UsbDevice device, String packageName);
47+
void setDevicePackage(in UsbDevice device, String packageName, int userId);
4848

4949
/* Sets the default package for a USB accessory
5050
* (or clears it if the package name is null)
5151
*/
52-
void setAccessoryPackage(in UsbAccessory accessory, String packageName);
52+
void setAccessoryPackage(in UsbAccessory accessory, String packageName, int userId);
5353

5454
/* Returns true if the caller has permission to access the device. */
5555
boolean hasDevicePermission(in UsbDevice device);
@@ -77,10 +77,10 @@ interface IUsbManager
7777
void grantAccessoryPermission(in UsbAccessory accessory, int uid);
7878

7979
/* Returns true if the USB manager has default preferences or permissions for the package */
80-
boolean hasDefaults(String packageName);
80+
boolean hasDefaults(String packageName, int userId);
8181

8282
/* Clears default preferences and permissions for the package */
83-
void clearDefaults(String packageName);
83+
void clearDefaults(String packageName, int userId);
8484

8585
/* Sets the current USB function. */
8686
void setCurrentFunction(String function, boolean makeDefault);

packages/SystemUI/src/com/android/systemui/usb/UsbAccessoryUriActivity.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@
2626
import android.hardware.usb.UsbAccessory;
2727
import android.hardware.usb.UsbManager;
2828
import android.os.Bundle;
29+
import android.os.UserHandle;
2930
import android.util.Log;
3031

3132
import com.android.internal.app.AlertActivity;
@@ -90,7 +91,7 @@ public void onClick(DialogInterface dialog, int which) {
9091
intent.addCategory(Intent.CATEGORY_BROWSABLE);
9192
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
9293
try {
93-
startActivity(intent);
94+
startActivityAsUser(intent, UserHandle.CURRENT);
9495
} catch (ActivityNotFoundException e) {
9596
Log.e(TAG, "startActivity failed for " + mUri);
9697
}

packages/SystemUI/src/com/android/systemui/usb/UsbConfirmActivity.java

Lines changed: 14 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -16,23 +16,21 @@
1616

1717
package com.android.systemui.usb;
1818

19-
import android.app.Activity;
2019
import android.app.AlertDialog;
2120
import android.content.ComponentName;
2221
import android.content.Context;
2322
import android.content.DialogInterface;
2423
import android.content.Intent;
25-
import android.content.pm.ApplicationInfo;
2624
import android.content.pm.PackageManager;
2725
import android.content.pm.ResolveInfo;
2826
import android.hardware.usb.IUsbManager;
29-
import android.hardware.usb.UsbDevice;
3027
import android.hardware.usb.UsbAccessory;
28+
import android.hardware.usb.UsbDevice;
3129
import android.hardware.usb.UsbManager;
3230
import android.os.Bundle;
3331
import android.os.IBinder;
34-
import android.os.RemoteException;
3532
import android.os.ServiceManager;
33+
import android.os.UserHandle;
3634
import android.util.Log;
3735
import android.view.LayoutInflater;
3836
import android.view.View;
@@ -42,7 +40,6 @@
4240

4341
import com.android.internal.app.AlertActivity;
4442
import com.android.internal.app.AlertController;
45-
4643
import com.android.systemui.R;
4744

4845
public class UsbConfirmActivity extends AlertActivity
@@ -62,10 +59,10 @@ public class UsbConfirmActivity extends AlertActivity
6259
public void onCreate(Bundle icicle) {
6360
super.onCreate(icicle);
6461

65-
Intent intent = getIntent();
66-
mDevice = (UsbDevice)intent.getParcelableExtra(UsbManager.EXTRA_DEVICE);
62+
Intent intent = getIntent();
63+
mDevice = (UsbDevice) intent.getParcelableExtra(UsbManager.EXTRA_DEVICE);
6764
mAccessory = (UsbAccessory)intent.getParcelableExtra(UsbManager.EXTRA_ACCESSORY);
68-
mResolveInfo = (ResolveInfo)intent.getParcelableExtra("rinfo");
65+
mResolveInfo = (ResolveInfo) intent.getParcelableExtra("rinfo");
6966

7067
PackageManager packageManager = getPackageManager();
7168
String appName = mResolveInfo.loadLabel(packageManager).toString();
@@ -117,7 +114,8 @@ public void onClick(DialogInterface dialog, int which) {
117114
try {
118115
IBinder b = ServiceManager.getService(USB_SERVICE);
119116
IUsbManager service = IUsbManager.Stub.asInterface(b);
120-
int uid = mResolveInfo.activityInfo.applicationInfo.uid;
117+
final int uid = mResolveInfo.activityInfo.applicationInfo.uid;
118+
final int userId = UserHandle.myUserId();
121119
boolean alwaysUse = mAlwaysUse.isChecked();
122120
Intent intent = null;
123121

@@ -129,9 +127,10 @@ public void onClick(DialogInterface dialog, int which) {
129127
service.grantDevicePermission(mDevice, uid);
130128
// set or clear default setting
131129
if (alwaysUse) {
132-
service.setDevicePackage(mDevice, mResolveInfo.activityInfo.packageName);
130+
service.setDevicePackage(
131+
mDevice, mResolveInfo.activityInfo.packageName, userId);
133132
} else {
134-
service.setDevicePackage(mDevice, null);
133+
service.setDevicePackage(mDevice, null, userId);
135134
}
136135
} else if (mAccessory != null) {
137136
intent = new Intent(UsbManager.ACTION_USB_ACCESSORY_ATTACHED);
@@ -141,18 +140,18 @@ public void onClick(DialogInterface dialog, int which) {
141140
service.grantAccessoryPermission(mAccessory, uid);
142141
// set or clear default setting
143142
if (alwaysUse) {
144-
service.setAccessoryPackage(mAccessory,
145-
mResolveInfo.activityInfo.packageName);
143+
service.setAccessoryPackage(
144+
mAccessory, mResolveInfo.activityInfo.packageName, userId);
146145
} else {
147-
service.setAccessoryPackage(mAccessory, null);
146+
service.setAccessoryPackage(mAccessory, null, userId);
148147
}
149148
}
150149

151150
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
152151
intent.setComponent(
153152
new ComponentName(mResolveInfo.activityInfo.packageName,
154153
mResolveInfo.activityInfo.name));
155-
startActivity(intent);
154+
startActivityAsUser(intent, new UserHandle(userId));
156155
} catch (Exception e) {
157156
Log.e(TAG, "Unable to start activity", e);
158157
}

packages/SystemUI/src/com/android/systemui/usb/UsbPermissionActivity.java

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@
3232
import android.os.IBinder;
3333
import android.os.RemoteException;
3434
import android.os.ServiceManager;
35+
import android.os.UserHandle;
3536
import android.util.Log;
3637
import android.view.LayoutInflater;
3738
import android.view.View;
@@ -67,7 +68,7 @@ public void onCreate(Bundle icicle) {
6768
mDevice = (UsbDevice)intent.getParcelableExtra(UsbManager.EXTRA_DEVICE);
6869
mAccessory = (UsbAccessory)intent.getParcelableExtra(UsbManager.EXTRA_ACCESSORY);
6970
mPendingIntent = (PendingIntent)intent.getParcelableExtra(Intent.EXTRA_INTENT);
70-
mUid = intent.getIntExtra("uid", 0);
71+
mUid = intent.getIntExtra(Intent.EXTRA_UID, -1);
7172
mPackageName = intent.getStringExtra("package");
7273

7374
PackageManager packageManager = getPackageManager();
@@ -128,7 +129,8 @@ public void onDestroy() {
128129
if (mPermissionGranted) {
129130
service.grantDevicePermission(mDevice, mUid);
130131
if (mAlwaysUse.isChecked()) {
131-
service.setDevicePackage(mDevice, mPackageName);
132+
final int userId = UserHandle.getUserId(mUid);
133+
service.setDevicePackage(mDevice, mPackageName, userId);
132134
}
133135
}
134136
}
@@ -137,7 +139,8 @@ public void onDestroy() {
137139
if (mPermissionGranted) {
138140
service.grantAccessoryPermission(mAccessory, mUid);
139141
if (mAlwaysUse.isChecked()) {
140-
service.setAccessoryPackage(mAccessory, mPackageName);
142+
final int userId = UserHandle.getUserId(mUid);
143+
service.setAccessoryPackage(mAccessory, mPackageName, userId);
141144
}
142145
}
143146
}

packages/SystemUI/src/com/android/systemui/usb/UsbResolverActivity.java

Lines changed: 10 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -16,8 +16,6 @@
1616

1717
package com.android.systemui.usb;
1818

19-
import com.android.internal.app.ResolverActivity;
20-
2119
import android.content.ActivityNotFoundException;
2220
import android.content.Intent;
2321
import android.content.pm.ResolveInfo;
@@ -30,9 +28,11 @@
3028
import android.os.Parcelable;
3129
import android.os.RemoteException;
3230
import android.os.ServiceManager;
31+
import android.os.UserHandle;
3332
import android.util.Log;
3433
import android.widget.CheckBox;
3534

35+
import com.android.internal.app.ResolverActivity;
3636
import com.android.systemui.R;
3737

3838
import java.util.ArrayList;
@@ -92,34 +92,36 @@ protected void onDestroy() {
9292
super.onDestroy();
9393
}
9494

95+
@Override
9596
protected void onIntentSelected(ResolveInfo ri, Intent intent, boolean alwaysCheck) {
9697
try {
9798
IBinder b = ServiceManager.getService(USB_SERVICE);
9899
IUsbManager service = IUsbManager.Stub.asInterface(b);
99-
int uid = ri.activityInfo.applicationInfo.uid;
100+
final int uid = ri.activityInfo.applicationInfo.uid;
101+
final int userId = UserHandle.myUserId();
100102

101103
if (mDevice != null) {
102104
// grant permission for the device
103105
service.grantDevicePermission(mDevice, uid);
104106
// set or clear default setting
105107
if (alwaysCheck) {
106-
service.setDevicePackage(mDevice, ri.activityInfo.packageName);
108+
service.setDevicePackage(mDevice, ri.activityInfo.packageName, userId);
107109
} else {
108-
service.setDevicePackage(mDevice, null);
110+
service.setDevicePackage(mDevice, null, userId);
109111
}
110112
} else if (mAccessory != null) {
111113
// grant permission for the accessory
112114
service.grantAccessoryPermission(mAccessory, uid);
113115
// set or clear default setting
114116
if (alwaysCheck) {
115-
service.setAccessoryPackage(mAccessory, ri.activityInfo.packageName);
117+
service.setAccessoryPackage(mAccessory, ri.activityInfo.packageName, userId);
116118
} else {
117-
service.setAccessoryPackage(mAccessory, null);
119+
service.setAccessoryPackage(mAccessory, null, userId);
118120
}
119121
}
120122

121123
try {
122-
startActivity(intent);
124+
startActivityAsUser(intent, new UserHandle(userId));
123125
} catch (ActivityNotFoundException e) {
124126
Log.e(TAG, "startActivity failed", e);
125127
}

services/java/com/android/server/usb/UsbDeviceManager.java

Lines changed: 26 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -16,9 +16,9 @@
1616

1717
package com.android.server.usb;
1818

19-
import android.app.PendingIntent;
2019
import android.app.Notification;
2120
import android.app.NotificationManager;
21+
import android.app.PendingIntent;
2222
import android.content.BroadcastReceiver;
2323
import android.content.ComponentName;
2424
import android.content.ContentResolver;
@@ -30,23 +30,19 @@
3030
import android.database.ContentObserver;
3131
import android.hardware.usb.UsbAccessory;
3232
import android.hardware.usb.UsbManager;
33-
import android.net.Uri;
34-
import android.os.Binder;
35-
import android.os.Bundle;
3633
import android.os.FileUtils;
3734
import android.os.Handler;
3835
import android.os.HandlerThread;
3936
import android.os.Looper;
4037
import android.os.Message;
41-
import android.os.Parcelable;
4238
import android.os.ParcelFileDescriptor;
4339
import android.os.Process;
44-
import android.os.UserHandle;
45-
import android.os.storage.StorageManager;
46-
import android.os.storage.StorageVolume;
4740
import android.os.SystemClock;
4841
import android.os.SystemProperties;
4942
import android.os.UEventObserver;
43+
import android.os.UserHandle;
44+
import android.os.storage.StorageManager;
45+
import android.os.storage.StorageVolume;
5046
import android.provider.Settings;
5147
import android.util.Pair;
5248
import android.util.Slog;
@@ -56,10 +52,9 @@
5652
import java.io.FileNotFoundException;
5753
import java.io.IOException;
5854
import java.io.PrintWriter;
59-
import java.util.ArrayList;
55+
import java.util.HashMap;
6056
import java.util.LinkedList;
6157
import java.util.List;
62-
import java.util.HashMap;
6358
import java.util.Map;
6459
import java.util.Scanner;
6560

@@ -106,9 +101,12 @@ public class UsbDeviceManager {
106101
private UsbHandler mHandler;
107102
private boolean mBootCompleted;
108103

104+
private final Object mLock = new Object();
105+
109106
private final Context mContext;
110107
private final ContentResolver mContentResolver;
111-
private final UsbSettingsManager mSettingsManager;
108+
// @GuardedBy("mLock")
109+
private UsbSettingsManager mCurrentSettings;
112110
private NotificationManager mNotificationManager;
113111
private final boolean mHasUsbAccessory;
114112
private boolean mUseUsbNotification;
@@ -149,10 +147,9 @@ public void onUEvent(UEventObserver.UEvent event) {
149147
}
150148
};
151149

152-
public UsbDeviceManager(Context context, UsbSettingsManager settingsManager) {
150+
public UsbDeviceManager(Context context) {
153151
mContext = context;
154152
mContentResolver = context.getContentResolver();
155-
mSettingsManager = settingsManager;
156153
PackageManager pm = mContext.getPackageManager();
157154
mHasUsbAccessory = pm.hasSystemFeature(PackageManager.FEATURE_USB_ACCESSORY);
158155
initRndisAddress();
@@ -175,6 +172,18 @@ public UsbDeviceManager(Context context, UsbSettingsManager settingsManager) {
175172
}
176173
}
177174

175+
public void setCurrentSettings(UsbSettingsManager settings) {
176+
synchronized (mLock) {
177+
mCurrentSettings = settings;
178+
}
179+
}
180+
181+
private UsbSettingsManager getCurrentSettings() {
182+
synchronized (mLock) {
183+
return mCurrentSettings;
184+
}
185+
}
186+
178187
public void systemReady() {
179188
if (DEBUG) Slog.d(TAG, "systemReady");
180189

@@ -516,7 +525,7 @@ private void updateCurrentAccessory() {
516525
Slog.d(TAG, "entering USB accessory mode: " + mCurrentAccessory);
517526
// defer accessoryAttached if system is not ready
518527
if (mBootCompleted) {
519-
mSettingsManager.accessoryAttached(mCurrentAccessory);
528+
getCurrentSettings().accessoryAttached(mCurrentAccessory);
520529
} // else handle in mBootCompletedReceiver
521530
} else {
522531
Slog.e(TAG, "nativeGetAccessoryStrings failed");
@@ -529,7 +538,7 @@ private void updateCurrentAccessory() {
529538

530539
if (mCurrentAccessory != null) {
531540
if (mBootCompleted) {
532-
mSettingsManager.accessoryDetached(mCurrentAccessory);
541+
getCurrentSettings().accessoryDetached(mCurrentAccessory);
533542
}
534543
mCurrentAccessory = null;
535544
mAccessoryStrings = null;
@@ -618,7 +627,7 @@ public void handleMessage(Message msg) {
618627
case MSG_BOOT_COMPLETED:
619628
mBootCompleted = true;
620629
if (mCurrentAccessory != null) {
621-
mSettingsManager.accessoryAttached(mCurrentAccessory);
630+
getCurrentSettings().accessoryAttached(mCurrentAccessory);
622631
}
623632
if (mDebuggingManager != null) {
624633
mDebuggingManager.setAdbEnabled(mAdbEnabled);
@@ -774,7 +783,7 @@ public ParcelFileDescriptor openAccessory(UsbAccessory accessory) {
774783
+ currentAccessory;
775784
throw new IllegalArgumentException(error);
776785
}
777-
mSettingsManager.checkPermission(accessory);
786+
getCurrentSettings().checkPermission(accessory);
778787
return nativeOpenAccessory();
779788
}
780789

0 commit comments

Comments
 (0)