diff options
| -rw-r--r-- | api/current.txt | 2 | ||||
| -rw-r--r-- | core/java/android/os/IUserManager.aidl | 2 | ||||
| -rw-r--r-- | core/java/android/os/UserManager.java | 51 | ||||
| -rw-r--r-- | services/core/java/com/android/server/pm/UserManagerService.java | 29 |
4 files changed, 68 insertions, 16 deletions
diff --git a/api/current.txt b/api/current.txt index 92a89e660ac6..a307fa430ac3 100644 --- a/api/current.txt +++ b/api/current.txt @@ -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 diff --git a/core/java/android/os/IUserManager.aidl b/core/java/android/os/IUserManager.aidl index edaaf81cd906..33d613152bc1 100644 --- a/core/java/android/os/IUserManager.aidl +++ b/core/java/android/os/IUserManager.aidl @@ -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(); diff --git a/core/java/android/os/UserManager.java b/core/java/android/os/UserManager.java index 2eaefca0efa3..12e843c87481 100644 --- a/core/java/android/os/UserManager.java +++ b/core/java/android/os/UserManager.java @@ -133,6 +133,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. */ @@ -3216,6 +3232,25 @@ public class UserManager { } /** + * 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 * the {@link android.Manifest.permission#MANAGE_USERS} permission. @@ -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(); } diff --git a/services/core/java/com/android/server/pm/UserManagerService.java b/services/core/java/com/android/server/pm/UserManagerService.java index 66a2b013e299..2a249d2c92ec 100644 --- a/services/core/java/com/android/server/pm/UserManagerService.java +++ b/services/core/java/com/android/server/pm/UserManagerService.java @@ -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 { - boolean needToShowConfirmCredential = - mLockPatternUtils.isSecure(userId) - && !StorageManager.isUserKeyUnlocked(userId); - if (needToShowConfirmCredential) { - showConfirmCredentialToDisableQuietMode(userId, target); - } else { - setQuietModeEnabled( - userId, false /* enableQuietMode */, target, callingPackage); - result = true; + 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); + return false; } - return result; + setQuietModeEnabled( + userId, false /* enableQuietMode */, target, callingPackage); + return true; } finally { Binder.restoreCallingIdentity(identity); } |