Skip to content

Commit 1ed299f

Browse files
jsharkeyAndroid (Google) Code Review
authored andcommitted
Merge "Make USB services multi-user aware." into jb-mr1-dev
2 parents 031e9d2 + fc3f24b commit 1ed299f

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)