Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit d56a615a authored by Pierre Barbier de Reuille's avatar Pierre Barbier de Reuille Committed by Android (Google) Code Review
Browse files

Merge "New UserManager API to request quiet mode."

parents 874951f0 17eaf740
Loading
Loading
Loading
Loading
+2 −0
Original line number Diff line number Diff line
@@ -36228,6 +36228,7 @@ package android.os {
    method public boolean isUserUnlocked();
    method public boolean isUserUnlocked(android.os.UserHandle);
    method public boolean requestQuietModeEnabled(boolean, @NonNull android.os.UserHandle);
    method public boolean requestQuietModeEnabled(boolean, @NonNull android.os.UserHandle, int);
    method @Deprecated public boolean setRestrictionsChallenge(String);
    method @Deprecated public void setUserRestriction(String, boolean);
    method @Deprecated public void setUserRestrictions(android.os.Bundle);
@@ -36289,6 +36290,7 @@ package android.os {
    field public static final String DISALLOW_USER_SWITCH = "no_user_switch";
    field public static final String ENSURE_VERIFY_APPS = "ensure_verify_apps";
    field public static final String KEY_RESTRICTIONS_PENDING = "restrictions_pending";
    field public static final int QUIET_MODE_DISABLE_ONLY_IF_CREDENTIAL_NOT_REQUIRED = 1; // 0x1
    field public static final int USER_CREATION_FAILED_NOT_PERMITTED = 1; // 0x1
    field public static final int USER_CREATION_FAILED_NO_MORE_USERS = 2; // 0x2
    field public static final int USER_OPERATION_ERROR_CURRENT_USER = 4; // 0x4
+1 −1
Original line number Diff line number Diff line
@@ -113,7 +113,7 @@ interface IUserManager {
    boolean isUserRunning(int userId);
    boolean isUserNameSet(int userId);
    boolean hasRestrictedProfiles();
    boolean requestQuietModeEnabled(String callingPackage, boolean enableQuietMode, int userId, in IntentSender target);
    boolean requestQuietModeEnabled(String callingPackage, boolean enableQuietMode, int userId, in IntentSender target, int flags);
    String getUserName();
    long getUserStartRealtime();
    long getUserUnlockRealtime();
+50 −1
Original line number Diff line number Diff line
@@ -132,6 +132,22 @@ public class UserManager {
     */
    public static final String USER_TYPE_SYSTEM_HEADLESS = "android.os.usertype.system.HEADLESS";

    /**
     * Flag passed to {@link #requestQuietModeEnabled} to request disabling quiet mode only if
     * there is no need to confirm the user credentials. If credentials are required to disable
     * quiet mode, {@link #requestQuietModeEnabled} will do nothing and return {@code false}.
     */
    public static final int QUIET_MODE_DISABLE_ONLY_IF_CREDENTIAL_NOT_REQUIRED = 0x1;

    /**
     * List of flags available for the {@link #requestQuietModeEnabled} method.
     * @hide
     */
    @Retention(RetentionPolicy.SOURCE)
    @IntDef(flag = true, prefix = { "QUIET_MODE_" }, value = {
            QUIET_MODE_DISABLE_ONLY_IF_CREDENTIAL_NOT_REQUIRED })
    public @interface QuietModeFlag {}

    /**
     * @hide
     * No user restriction.
@@ -3215,6 +3231,25 @@ public class UserManager {
        return requestQuietModeEnabled(enableQuietMode, userHandle, null);
    }

    /**
     * Perform the same operation as {@link #requestQuietModeEnabled(boolean, UserHandle)}, but
     * with a flag to tweak the behavior of the request.
     *
     * @param enableQuietMode whether quiet mode should be enabled or disabled
     * @param userHandle user handle of the profile
     * @param flags Can be 0 or {@link #QUIET_MODE_DISABLE_ONLY_IF_CREDENTIAL_NOT_REQUIRED}.
     * @return {@code false} if user's credential is needed in order to turn off quiet mode,
     *         {@code true} otherwise
     * @throws SecurityException if the caller is invalid
     * @throws IllegalArgumentException if {@code userHandle} is not a managed profile
     *
     * @see #isQuietModeEnabled(UserHandle)
     */
    public boolean requestQuietModeEnabled(boolean enableQuietMode, @NonNull UserHandle userHandle,
            @QuietModeFlag int flags) {
        return requestQuietModeEnabled(enableQuietMode, userHandle, null, flags);
    }

    /**
     * Similar to {@link #requestQuietModeEnabled(boolean, UserHandle)}, except you can specify
     * a target to start when user is unlocked. If {@code target} is specified, caller must have
@@ -3225,9 +3260,23 @@ public class UserManager {
     */
    public boolean requestQuietModeEnabled(
            boolean enableQuietMode, @NonNull UserHandle userHandle, IntentSender target) {
        return requestQuietModeEnabled(enableQuietMode, userHandle, target, 0);
    }
    /**
     * Similar to {@link #requestQuietModeEnabled(boolean, UserHandle)}, except you can specify
     * a target to start when user is unlocked. If {@code target} is specified, caller must have
     * the {@link android.Manifest.permission#MANAGE_USERS} permission.
     *
     * @see {@link #requestQuietModeEnabled(boolean, UserHandle)}
     * @hide
     */
    public boolean requestQuietModeEnabled(
            boolean enableQuietMode, @NonNull UserHandle userHandle, IntentSender target,
            int flags) {
        try {
            return mService.requestQuietModeEnabled(
                    mContext.getPackageName(), enableQuietMode, userHandle.getIdentifier(), target);
                    mContext.getPackageName(), enableQuietMode, userHandle.getIdentifier(), target,
                    flags);
        } catch (RemoteException re) {
            throw re.rethrowFromSystemServer();
        }
+15 −14
Original line number Diff line number Diff line
@@ -74,6 +74,7 @@ import android.os.SystemProperties;
import android.os.UserHandle;
import android.os.UserManager;
import android.os.UserManager.EnforcingUser;
import android.os.UserManager.QuietModeFlag;
import android.os.UserManagerInternal;
import android.os.UserManagerInternal.UserRestrictionsListener;
import android.os.storage.StorageManager;
@@ -914,7 +915,7 @@ public class UserManagerService extends IUserManager.Stub {

    @Override
    public boolean requestQuietModeEnabled(@NonNull String callingPackage, boolean enableQuietMode,
            @UserIdInt int userId, @Nullable IntentSender target) {
            @UserIdInt int userId, @Nullable IntentSender target, @QuietModeFlag int flags) {
        Objects.requireNonNull(callingPackage);

        if (enableQuietMode && target != null) {
@@ -925,24 +926,24 @@ public class UserManagerService extends IUserManager.Stub {
        ensureCanModifyQuietMode(callingPackage, Binder.getCallingUid(), userId, target != null);
        final long identity = Binder.clearCallingIdentity();
        try {
            boolean result = false;
            if (enableQuietMode) {
                setQuietModeEnabled(
                        userId, true /* enableQuietMode */, target, callingPackage);
                result = true;
            } else {
                return true;
            }
            boolean needToShowConfirmCredential =
                    mLockPatternUtils.isSecure(userId)
                            && !StorageManager.isUserKeyUnlocked(userId);
            if (needToShowConfirmCredential) {
                if ((flags & UserManager.QUIET_MODE_DISABLE_ONLY_IF_CREDENTIAL_NOT_REQUIRED) != 0) {
                    return false;
                }
                showConfirmCredentialToDisableQuietMode(userId, target);
                } else {
                return false;
            }
            setQuietModeEnabled(
                    userId, false /* enableQuietMode */, target, callingPackage);
                    result = true;
                }
            }
            return result;
            return true;
        } finally {
            Binder.restoreCallingIdentity(identity);
        }