Search in sources :

Example 71 with UserInfo

use of android.content.pm.UserInfo in project platform_frameworks_base by android.

the class UserController method unlockUserCleared.

boolean unlockUserCleared(final int userId, byte[] token, byte[] secret, IProgressListener listener) {
    UserState uss;
    synchronized (mService) {
        // TODO Move this block outside of synchronized if it causes lock contention
        if (!StorageManager.isUserKeyUnlocked(userId)) {
            final UserInfo userInfo = getUserInfo(userId);
            final IMountService mountService = getMountService();
            try {
                // We always want to unlock user storage, even user is not started yet
                mountService.unlockUserKey(userId, userInfo.serialNumber, token, secret);
            } catch (RemoteException | RuntimeException e) {
                Slog.w(TAG, "Failed to unlock: " + e.getMessage());
            }
        }
        // Bail if user isn't actually running, otherwise register the given
        // listener to watch for unlock progress
        uss = mStartedUsers.get(userId);
        if (uss == null) {
            notifyFinished(userId, listener);
            return false;
        } else {
            uss.mUnlockProgress.addListener(listener);
            uss.tokenProvided = (token != null);
        }
    }
    finishUserUnlocking(uss);
    final ArraySet<Integer> childProfilesToUnlock = new ArraySet<>();
    synchronized (mService) {
        // managed profiles under that user.
        for (int i = 0; i < mStartedUsers.size(); i++) {
            final int testUserId = mStartedUsers.keyAt(i);
            final UserInfo parent = getUserManager().getProfileParent(testUserId);
            if (parent != null && parent.id == userId && testUserId != userId) {
                Slog.d(TAG, "User " + testUserId + " (parent " + parent.id + "): attempting unlock because parent was just unlocked");
                childProfilesToUnlock.add(testUserId);
            }
        }
    }
    final int size = childProfilesToUnlock.size();
    for (int i = 0; i < size; i++) {
        maybeUnlockUser(childProfilesToUnlock.valueAt(i));
    }
    return true;
}
Also used : AtomicInteger(java.util.concurrent.atomic.AtomicInteger) ArraySet(android.util.ArraySet) IMountService(android.os.storage.IMountService) UserInfo(android.content.pm.UserInfo) RemoteException(android.os.RemoteException)

Example 72 with UserInfo

use of android.content.pm.UserInfo in project platform_frameworks_base by android.

the class UserController method startUser.

/**
     * Start user, if its not already running.
     * <p>The user will be brought to the foreground, if {@code foreground} parameter is set.
     * When starting the user, multiple intents will be broadcast in the following order:</p>
     * <ul>
     *     <li>{@link Intent#ACTION_USER_STARTED} - sent to registered receivers of the new user
     *     <li>{@link Intent#ACTION_USER_BACKGROUND} - sent to registered receivers of the outgoing
     *     user and all profiles of this user. Sent only if {@code foreground} parameter is true
     *     <li>{@link Intent#ACTION_USER_FOREGROUND} - sent to registered receivers of the new
     *     user and all profiles of this user. Sent only if {@code foreground} parameter is true
     *     <li>{@link Intent#ACTION_USER_SWITCHED} - sent to registered receivers of the new user.
     *     Sent only if {@code foreground} parameter is true
     *     <li>{@link Intent#ACTION_USER_STARTING} - ordered broadcast sent to registered receivers
     *     of the new fg user
     *     <li>{@link Intent#ACTION_LOCKED_BOOT_COMPLETED} - ordered broadcast sent to receivers of
     *     the new user
     *     <li>{@link Intent#ACTION_USER_UNLOCKED} - sent to registered receivers of the new user
     *     <li>{@link Intent#ACTION_PRE_BOOT_COMPLETED} - ordered broadcast sent to receivers of the
     *     new user. Sent only when the user is booting after a system update.
     *     <li>{@link Intent#ACTION_USER_INITIALIZE} - ordered broadcast sent to receivers of the
     *     new user. Sent only the first time a user is starting.
     *     <li>{@link Intent#ACTION_BOOT_COMPLETED} - ordered broadcast sent to receivers of the new
     *     user. Indicates that the user has finished booting.
     * </ul>
     *
     * @param userId ID of the user to start
     * @param foreground true if user should be brought to the foreground
     * @return true if the user has been successfully started
     */
boolean startUser(final int userId, final boolean foreground) {
    if (mService.checkCallingPermission(INTERACT_ACROSS_USERS_FULL) != PackageManager.PERMISSION_GRANTED) {
        String msg = "Permission Denial: switchUser() from pid=" + Binder.getCallingPid() + ", uid=" + Binder.getCallingUid() + " requires " + INTERACT_ACROSS_USERS_FULL;
        Slog.w(TAG, msg);
        throw new SecurityException(msg);
    }
    Slog.i(TAG, "Starting userid:" + userId + " fg:" + foreground);
    final long ident = Binder.clearCallingIdentity();
    try {
        synchronized (mService) {
            final int oldUserId = mCurrentUserId;
            if (oldUserId == userId) {
                return true;
            }
            mService.mStackSupervisor.setLockTaskModeLocked(null, ActivityManager.LOCK_TASK_MODE_NONE, "startUser", false);
            final UserInfo userInfo = getUserInfo(userId);
            if (userInfo == null) {
                Slog.w(TAG, "No user info for user #" + userId);
                return false;
            }
            if (foreground && userInfo.isManagedProfile()) {
                Slog.w(TAG, "Cannot switch to User #" + userId + ": not a full user");
                return false;
            }
            if (foreground) {
                mService.mWindowManager.startFreezingScreen(R.anim.screen_user_exit, R.anim.screen_user_enter);
            }
            boolean needStart = false;
            // we need to start it now.
            if (mStartedUsers.get(userId) == null) {
                UserState userState = new UserState(UserHandle.of(userId));
                mStartedUsers.put(userId, userState);
                getUserManagerInternal().setUserState(userId, userState.state);
                updateStartedUserArrayLocked();
                needStart = true;
            }
            final UserState uss = mStartedUsers.get(userId);
            final Integer userIdInt = userId;
            mUserLru.remove(userIdInt);
            mUserLru.add(userIdInt);
            if (foreground) {
                mCurrentUserId = userId;
                mService.updateUserConfigurationLocked();
                // reset, mCurrentUserId has caught up
                mTargetUserId = UserHandle.USER_NULL;
                updateCurrentProfileIdsLocked();
                mService.mWindowManager.setCurrentUser(userId, mCurrentProfileIds);
                // Once the internal notion of the active user has switched, we lock the device
                // with the option to show the user switcher on the keyguard.
                mService.mWindowManager.lockNow(null);
            } else {
                final Integer currentUserIdInt = mCurrentUserId;
                updateCurrentProfileIdsLocked();
                mService.mWindowManager.setCurrentProfileIds(mCurrentProfileIds);
                mUserLru.remove(currentUserIdInt);
                mUserLru.add(currentUserIdInt);
            }
            // stopping, we need to knock that off.
            if (uss.state == UserState.STATE_STOPPING) {
                // If we are stopping, we haven't sent ACTION_SHUTDOWN,
                // so we can just fairly silently bring the user back from
                // the almost-dead.
                uss.setState(uss.lastState);
                getUserManagerInternal().setUserState(userId, uss.state);
                updateStartedUserArrayLocked();
                needStart = true;
            } else if (uss.state == UserState.STATE_SHUTDOWN) {
                // This means ACTION_SHUTDOWN has been sent, so we will
                // need to treat this as a new boot of the user.
                uss.setState(UserState.STATE_BOOTING);
                getUserManagerInternal().setUserState(userId, uss.state);
                updateStartedUserArrayLocked();
                needStart = true;
            }
            if (uss.state == UserState.STATE_BOOTING) {
                // Give user manager a chance to propagate user restrictions
                // to other services and prepare app storage
                getUserManager().onBeforeStartUser(userId);
                // Booting up a new user, need to tell system services about it.
                // Note that this is on the same handler as scheduling of broadcasts,
                // which is important because it needs to go first.
                mHandler.sendMessage(mHandler.obtainMessage(SYSTEM_USER_START_MSG, userId, 0));
            }
            if (foreground) {
                mHandler.sendMessage(mHandler.obtainMessage(SYSTEM_USER_CURRENT_MSG, userId, oldUserId));
                mHandler.removeMessages(REPORT_USER_SWITCH_MSG);
                mHandler.removeMessages(USER_SWITCH_TIMEOUT_MSG);
                mHandler.sendMessage(mHandler.obtainMessage(REPORT_USER_SWITCH_MSG, oldUserId, userId, uss));
                mHandler.sendMessageDelayed(mHandler.obtainMessage(USER_SWITCH_TIMEOUT_MSG, oldUserId, userId, uss), USER_SWITCH_TIMEOUT);
            }
            if (needStart) {
                // Send USER_STARTED broadcast
                Intent intent = new Intent(Intent.ACTION_USER_STARTED);
                intent.addFlags(Intent.FLAG_RECEIVER_REGISTERED_ONLY | Intent.FLAG_RECEIVER_FOREGROUND);
                intent.putExtra(Intent.EXTRA_USER_HANDLE, userId);
                mService.broadcastIntentLocked(null, null, intent, null, null, 0, null, null, null, AppOpsManager.OP_NONE, null, false, false, MY_PID, SYSTEM_UID, userId);
            }
            if (foreground) {
                moveUserToForegroundLocked(uss, oldUserId, userId);
            } else {
                mService.mUserController.finishUserBoot(uss);
            }
            if (needStart) {
                Intent intent = new Intent(Intent.ACTION_USER_STARTING);
                intent.addFlags(Intent.FLAG_RECEIVER_REGISTERED_ONLY);
                intent.putExtra(Intent.EXTRA_USER_HANDLE, userId);
                mService.broadcastIntentLocked(null, null, intent, null, new IIntentReceiver.Stub() {

                    @Override
                    public void performReceive(Intent intent, int resultCode, String data, Bundle extras, boolean ordered, boolean sticky, int sendingUser) throws RemoteException {
                    }
                }, 0, null, null, new String[] { INTERACT_ACROSS_USERS }, AppOpsManager.OP_NONE, null, true, false, MY_PID, SYSTEM_UID, UserHandle.USER_ALL);
            }
        }
    } finally {
        Binder.restoreCallingIdentity(ident);
    }
    return true;
}
Also used : Bundle(android.os.Bundle) UserInfo(android.content.pm.UserInfo) Intent(android.content.Intent) AtomicInteger(java.util.concurrent.atomic.AtomicInteger) IIntentReceiver(android.content.IIntentReceiver) RemoteException(android.os.RemoteException)

Example 73 with UserInfo

use of android.content.pm.UserInfo in project platform_frameworks_base by android.

the class UserController method finishUserBoot.

private void finishUserBoot(UserState uss, IIntentReceiver resultTo) {
    final int userId = uss.mHandle.getIdentifier();
    Slog.d(TAG, "Finishing user boot " + userId);
    synchronized (mService) {
        // Bail if we ended up with a stale user
        if (mStartedUsers.get(userId) != uss)
            return;
        // storage is already unlocked.
        if (uss.setState(STATE_BOOTING, STATE_RUNNING_LOCKED)) {
            getUserManagerInternal().setUserState(userId, uss.state);
            int uptimeSeconds = (int) (SystemClock.elapsedRealtime() / 1000);
            MetricsLogger.histogram(mService.mContext, "framework_locked_boot_completed", uptimeSeconds);
            Intent intent = new Intent(Intent.ACTION_LOCKED_BOOT_COMPLETED, null);
            intent.putExtra(Intent.EXTRA_USER_HANDLE, userId);
            intent.addFlags(Intent.FLAG_RECEIVER_NO_ABORT | Intent.FLAG_RECEIVER_INCLUDE_BACKGROUND);
            mService.broadcastIntentLocked(null, null, intent, null, resultTo, 0, null, null, new String[] { android.Manifest.permission.RECEIVE_BOOT_COMPLETED }, AppOpsManager.OP_NONE, null, true, false, MY_PID, SYSTEM_UID, userId);
        }
        // is also unlocked.
        if (getUserManager().isManagedProfile(userId)) {
            final UserInfo parent = getUserManager().getProfileParent(userId);
            if (parent != null && isUserRunningLocked(parent.id, ActivityManager.FLAG_AND_UNLOCKED)) {
                Slog.d(TAG, "User " + userId + " (parent " + parent.id + "): attempting unlock because parent is unlocked");
                maybeUnlockUser(userId);
            } else {
                String parentId = (parent == null) ? "<null>" : String.valueOf(parent.id);
                Slog.d(TAG, "User " + userId + " (parent " + parentId + "): delaying unlock because parent is locked");
            }
        } else {
            maybeUnlockUser(userId);
        }
    }
}
Also used : Intent(android.content.Intent) UserInfo(android.content.pm.UserInfo)

Example 74 with UserInfo

use of android.content.pm.UserInfo in project platform_frameworks_base by android.

the class GlobalActions method addUsersToMenu.

private void addUsersToMenu(ArrayList<Action> items) {
    UserManager um = (UserManager) mContext.getSystemService(Context.USER_SERVICE);
    if (um.isUserSwitcherEnabled()) {
        List<UserInfo> users = um.getUsers();
        UserInfo currentUser = getCurrentUser();
        for (final UserInfo user : users) {
            if (user.supportsSwitchToByUser()) {
                boolean isCurrentUser = currentUser == null ? user.id == 0 : (currentUser.id == user.id);
                Drawable icon = user.iconPath != null ? Drawable.createFromPath(user.iconPath) : null;
                SinglePressAction switchToUser = new SinglePressAction(com.android.internal.R.drawable.ic_menu_cc, icon, (user.name != null ? user.name : "Primary") + (isCurrentUser ? " ✔" : "")) {

                    public void onPress() {
                        try {
                            ActivityManagerNative.getDefault().switchUser(user.id);
                        } catch (RemoteException re) {
                            Log.e(TAG, "Couldn't switch user " + re);
                        }
                    }

                    public boolean showDuringKeyguard() {
                        return true;
                    }

                    public boolean showBeforeProvisioning() {
                        return false;
                    }
                };
                items.add(switchToUser);
            }
        }
    }
}
Also used : UserManager(android.os.UserManager) Drawable(android.graphics.drawable.Drawable) UserInfo(android.content.pm.UserInfo) RemoteException(android.os.RemoteException)

Example 75 with UserInfo

use of android.content.pm.UserInfo in project platform_frameworks_base by android.

the class DevicePolicyManagerService method checkPackagesInPermittedListOrSystem.

/**
     * @return true if all packages in enabledPackages are either in the list
     * permittedList or are a system app.
     */
private boolean checkPackagesInPermittedListOrSystem(List<String> enabledPackages, List<String> permittedList, int userIdToCheck) {
    long id = mInjector.binderClearCallingIdentity();
    try {
        // If we have an enabled packages list for a managed profile the packages
        // we should check are installed for the parent user.
        UserInfo user = getUserInfo(userIdToCheck);
        if (user.isManagedProfile()) {
            userIdToCheck = user.profileGroupId;
        }
        for (String enabledPackage : enabledPackages) {
            boolean systemService = false;
            try {
                ApplicationInfo applicationInfo = mIPackageManager.getApplicationInfo(enabledPackage, PackageManager.GET_UNINSTALLED_PACKAGES, userIdToCheck);
                systemService = (applicationInfo.flags & ApplicationInfo.FLAG_SYSTEM) != 0;
            } catch (RemoteException e) {
                Log.i(LOG_TAG, "Can't talk to package managed", e);
            }
            if (!systemService && !permittedList.contains(enabledPackage)) {
                return false;
            }
        }
    } finally {
        mInjector.binderRestoreCallingIdentity(id);
    }
    return true;
}
Also used : ApplicationInfo(android.content.pm.ApplicationInfo) UserInfo(android.content.pm.UserInfo) ParcelableString(com.android.internal.util.ParcelableString) RemoteException(android.os.RemoteException)

Aggregations

UserInfo (android.content.pm.UserInfo)814 UserManager (android.os.UserManager)156 RemoteException (android.os.RemoteException)144 ArrayList (java.util.ArrayList)73 UserHandle (android.os.UserHandle)66 Intent (android.content.Intent)58 IOException (java.io.IOException)52 File (java.io.File)47 Bundle (android.os.Bundle)43 ApplicationInfo (android.content.pm.ApplicationInfo)40 PackageManager (android.content.pm.PackageManager)39 ComponentName (android.content.ComponentName)32 NameNotFoundException (android.content.pm.PackageManager.NameNotFoundException)31 AtomicInteger (java.util.concurrent.atomic.AtomicInteger)30 XmlPullParserException (org.xmlpull.v1.XmlPullParserException)29 AtomicFile (android.util.AtomicFile)28 PackageInfo (android.content.pm.PackageInfo)26 DevicePolicyManager (android.app.admin.DevicePolicyManager)25 LockPatternUtils (com.android.internal.widget.LockPatternUtils)24 PendingIntent (android.app.PendingIntent)23