Merge "Multi-user MTP." into jb-mr1-dev

This commit is contained in:
Jeff Sharkey
2012-09-18 14:52:46 -07:00
committed by Android (Google) Code Review
6 changed files with 55 additions and 60 deletions

View File

@@ -129,32 +129,33 @@ class ReceiverRestrictedContext extends ContextWrapper {
@Override
public Intent registerReceiver(BroadcastReceiver receiver, IntentFilter filter,
String broadcastPermission, Handler scheduler) {
throw new ReceiverCallNotAllowedException(
"IntentReceiver components are not allowed to register to receive intents");
//ex.fillInStackTrace();
//Log.e("IntentReceiver", ex.getMessage(), ex);
//return mContext.registerReceiver(receiver, filter, broadcastPermission,
// scheduler);
if (receiver == null) {
// Allow retrieving current sticky broadcast; this is safe since we
// aren't actually registering a receiver.
return super.registerReceiver(null, filter, broadcastPermission, scheduler);
} else {
throw new ReceiverCallNotAllowedException(
"BroadcastReceiver components are not allowed to register to receive intents");
}
}
@Override
public Intent registerReceiverAsUser(BroadcastReceiver receiver, UserHandle user,
IntentFilter filter, String broadcastPermission, Handler scheduler) {
throw new ReceiverCallNotAllowedException(
"IntentReceiver components are not allowed to register to receive intents");
//ex.fillInStackTrace();
//Log.e("IntentReceiver", ex.getMessage(), ex);
//return mContext.registerReceiver(receiver, filter, broadcastPermission,
// scheduler);
if (receiver == null) {
// Allow retrieving current sticky broadcast; this is safe since we
// aren't actually registering a receiver.
return super.registerReceiverAsUser(null, user, filter, broadcastPermission, scheduler);
} else {
throw new ReceiverCallNotAllowedException(
"BroadcastReceiver components are not allowed to register to receive intents");
}
}
@Override
public boolean bindService(Intent service, ServiceConnection conn, int flags) {
throw new ReceiverCallNotAllowedException(
"IntentReceiver components are not allowed to bind to services");
//ex.fillInStackTrace();
//Log.e("IntentReceiver", ex.getMessage(), ex);
//return mContext.bindService(service, interfaceName, conn, flags);
"BroadcastReceiver components are not allowed to bind to services");
}
}

View File

@@ -19,6 +19,7 @@ import com.android.internal.R;
import android.content.Context;
import android.content.pm.UserInfo;
import android.graphics.Bitmap;
import android.content.res.Resources;
import android.util.Log;
import java.util.List;
@@ -232,8 +233,9 @@ public class UserManager {
* @hide
* @return a value greater than or equal to 1
*/
public int getMaxSupportedUsers() {
return mContext.getResources().getInteger(R.integer.config_multiuserMaximumUsers);
public static int getMaxSupportedUsers() {
return SystemProperties.getInt("fw.max_users",
Resources.getSystem().getInteger(R.integer.config_multiuserMaximumUsers));
}
/**

View File

@@ -549,34 +549,6 @@ class MountService extends IMountService.Stub
}
}
private final BroadcastReceiver mBootReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
final int userId = intent.getIntExtra(Intent.EXTRA_USER_HANDLE, -1);
if (userId == -1) return;
final UserHandle user = new UserHandle(userId);
Slog.d(TAG, "BOOT_COMPLETED for " + user);
// Broadcast mounted volumes to newly booted user. This kicks off
// media scanner when a user becomes active.
synchronized (mVolumesLock) {
for (StorageVolume volume : mVolumes) {
final UserHandle owner = volume.getOwner();
final boolean ownerMatch = owner == null
|| owner.getIdentifier() == user.getIdentifier();
final String state = mVolumeStates.get(volume.getPath());
if (ownerMatch && (Environment.MEDIA_MOUNTED.equals(state)
|| Environment.MEDIA_MOUNTED_READ_ONLY.equals(state))) {
sendStorageIntent(Intent.ACTION_MEDIA_MOUNTED, volume, user);
}
}
}
}
};
private final BroadcastReceiver mUserReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
@@ -1309,10 +1281,6 @@ class MountService extends IMountService.Stub
mHandlerThread.start();
mHandler = new MountServiceHandler(mHandlerThread.getLooper());
// Watch for user boot completion
mContext.registerReceiverAsUser(mBootReceiver, UserHandle.ALL,
new IntentFilter(Intent.ACTION_BOOT_COMPLETED), null, mHandler);
// Watch for user changes
final IntentFilter userFilter = new IntentFilter();
userFilter.addAction(Intent.ACTION_USER_ADDED);

View File

@@ -14224,12 +14224,14 @@ public final class ActivityManagerService extends ActivityManagerNative
@Override
public UserInfo getCurrentUser() {
if (checkCallingPermission(android.Manifest.permission.INTERACT_ACROSS_USERS_FULL)
!= PackageManager.PERMISSION_GRANTED) {
if ((checkCallingPermission(android.Manifest.permission.INTERACT_ACROSS_USERS)
!= PackageManager.PERMISSION_GRANTED) && (
checkCallingPermission(android.Manifest.permission.INTERACT_ACROSS_USERS_FULL)
!= PackageManager.PERMISSION_GRANTED)) {
String msg = "Permission Denial: getCurrentUser() from pid="
+ Binder.getCallingPid()
+ ", uid=" + Binder.getCallingUid()
+ " requires " + android.Manifest.permission.INTERACT_ACROSS_USERS_FULL;
+ " requires " + android.Manifest.permission.INTERACT_ACROSS_USERS;
Slog.w(TAG, msg);
throw new SecurityException(msg);
}

View File

@@ -39,6 +39,7 @@ import android.os.ParcelFileDescriptor;
import android.os.Process;
import android.os.RemoteException;
import android.os.UserHandle;
import android.os.UserManager;
import android.util.AtomicFile;
import android.util.Slog;
import android.util.SparseArray;
@@ -85,8 +86,6 @@ public class UserManagerService extends IUserManager.Stub {
private SparseArray<UserInfo> mUsers = new SparseArray<UserInfo>();
private final int mUserLimit;
private int[] mUserIds;
private boolean mGuestEnabled;
private int mNextSerialNumber;
@@ -129,8 +128,6 @@ public class UserManagerService extends IUserManager.Stub {
mPm = pm;
mInstallLock = installLock;
mPackagesLock = packagesLock;
mUserLimit = mContext.getResources().getInteger(
com.android.internal.R.integer.config_multiuserMaximumUsers);
mUsersDir = new File(dataDir, USER_INFO_DIR);
mUsersDir.mkdirs();
// Make zeroth user directory, for services to migrate their files to that location
@@ -275,7 +272,7 @@ public class UserManagerService extends IUserManager.Stub {
*/
private boolean isUserLimitReachedLocked() {
int nUsers = mUsers.size();
return nUsers >= mUserLimit;
return nUsers >= UserManager.getMaxSupportedUsers();
}
/**

View File

@@ -91,6 +91,7 @@ public class UsbDeviceManager {
private static final int MSG_SET_CURRENT_FUNCTIONS = 2;
private static final int MSG_SYSTEM_READY = 3;
private static final int MSG_BOOT_COMPLETED = 4;
private static final int MSG_USER_SWITCHED = 5;
private static final int AUDIO_MODE_NONE = 0;
private static final int AUDIO_MODE_SOURCE = 1;
@@ -295,14 +296,24 @@ public class UsbDeviceManager {
private UsbAccessory mCurrentAccessory;
private int mUsbNotificationId;
private boolean mAdbNotificationShown;
private int mCurrentUser = UserHandle.USER_NULL;
private final BroadcastReceiver mBootCompletedReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
if (DEBUG) Slog.d(TAG, "boot completed");
mHandler.sendEmptyMessage(MSG_BOOT_COMPLETED);
}
};
private final BroadcastReceiver mUserSwitchedReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
final int userId = intent.getIntExtra(Intent.EXTRA_USER_HANDLE, -1);
mHandler.obtainMessage(MSG_USER_SWITCHED, userId, 0).sendToTarget();
}
};
public UsbHandler(Looper looper) {
super(looper);
try {
@@ -347,8 +358,10 @@ public class UsbDeviceManager {
mUEventObserver.startObserving(USB_STATE_MATCH);
mUEventObserver.startObserving(ACCESSORY_START_MATCH);
mContext.registerReceiver(mBootCompletedReceiver,
new IntentFilter(Intent.ACTION_BOOT_COMPLETED));
mContext.registerReceiver(
mBootCompletedReceiver, new IntentFilter(Intent.ACTION_BOOT_COMPLETED));
mContext.registerReceiver(
mUserSwitchedReceiver, new IntentFilter(Intent.ACTION_USER_SWITCHED));
} catch (Exception e) {
Slog.e(TAG, "Error initializing UsbHandler", e);
}
@@ -611,6 +624,18 @@ public class UsbDeviceManager {
mDebuggingManager.setAdbEnabled(mAdbEnabled);
}
break;
case MSG_USER_SWITCHED: {
final boolean mtpActive =
containsFunction(mCurrentFunctions, UsbManager.USB_FUNCTION_MTP)
|| containsFunction(mCurrentFunctions, UsbManager.USB_FUNCTION_PTP);
if (mtpActive && mCurrentUser != UserHandle.USER_NULL) {
Slog.v(TAG, "Current user switched; resetting USB host stack for MTP");
setUsbConfig("none");
setUsbConfig(mCurrentFunctions);
}
mCurrentUser = msg.arg1;
break;
}
}
}