Merge "Multi-user MTP." into jb-mr1-dev
This commit is contained in:
@@ -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");
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -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));
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
@@ -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();
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user