DO NOT MERGE Implement suggested changes in API review for permission mainline.

Test: build
Fixes: 150877494
Change-Id: Ieca5f7a46241032f6722bb379fc08206b9600ddc
This commit is contained in:
Hai Zhang
2020-03-05 13:02:35 -08:00
parent d944bcf2c3
commit 6e84285bcd
12 changed files with 169 additions and 33 deletions

View File

@@ -40,7 +40,7 @@ public interface RuntimePermissionsPersistence {
* @return the runtime permissions read
*/
@Nullable
RuntimePermissionsState readAsUser(@NonNull UserHandle user);
RuntimePermissionsState readForUser(@NonNull UserHandle user);
/**
* Write the runtime permissions to persistence.
@@ -50,7 +50,8 @@ public interface RuntimePermissionsPersistence {
* @param runtimePermissions the runtime permissions to write
* @param user the user to write for
*/
void writeAsUser(@NonNull RuntimePermissionsState runtimePermissions, @NonNull UserHandle user);
void writeForUser(@NonNull RuntimePermissionsState runtimePermissions,
@NonNull UserHandle user);
/**
* Delete the runtime permissions from persistence.
@@ -59,7 +60,7 @@ public interface RuntimePermissionsPersistence {
*
* @param user the user to delete for
*/
void deleteAsUser(@NonNull UserHandle user);
void deleteForUser(@NonNull UserHandle user);
/**
* Create a new instance of {@link RuntimePermissionsPersistence} implementation.

View File

@@ -67,7 +67,7 @@ public class RuntimePermissionsPersistenceImpl implements RuntimePermissionsPers
@Nullable
@Override
public RuntimePermissionsState readAsUser(@NonNull UserHandle user) {
public RuntimePermissionsState readForUser(@NonNull UserHandle user) {
File file = getFile(user);
try (FileInputStream inputStream = new AtomicFile(file).openRead()) {
XmlPullParser parser = Xml.newPullParser();
@@ -172,7 +172,7 @@ public class RuntimePermissionsPersistenceImpl implements RuntimePermissionsPers
}
@Override
public void writeAsUser(@NonNull RuntimePermissionsState runtimePermissions,
public void writeForUser(@NonNull RuntimePermissionsState runtimePermissions,
@NonNull UserHandle user) {
File file = getFile(user);
AtomicFile atomicFile = new AtomicFile(file);
@@ -252,7 +252,7 @@ public class RuntimePermissionsPersistenceImpl implements RuntimePermissionsPers
}
@Override
public void deleteAsUser(@NonNull UserHandle user) {
public void deleteForUser(@NonNull UserHandle user) {
getFile(user).delete();
}

View File

@@ -23,6 +23,7 @@ import android.annotation.SystemApi.Client;
import java.util.List;
import java.util.Map;
import java.util.Objects;
/**
* State of all runtime permissions.
@@ -61,6 +62,14 @@ public final class RuntimePermissionsState {
@NonNull
private final Map<String, List<PermissionState>> mSharedUserPermissions;
/**
* Create a new instance of this class.
*
* @param version the version of the runtime permissions
* @param fingerprint the fingerprint of the runtime permissions
* @param packagePermissions the runtime permissions by packages
* @param sharedUserPermissions the runtime permissions by shared users
*/
public RuntimePermissionsState(int version, @Nullable String fingerprint,
@NonNull Map<String, List<PermissionState>> packagePermissions,
@NonNull Map<String, List<PermissionState>> sharedUserPermissions) {
@@ -70,32 +79,72 @@ public final class RuntimePermissionsState {
mSharedUserPermissions = sharedUserPermissions;
}
/**
* Get the version of the runtime permissions.
*
* @return the version of the runtime permissions
*/
public int getVersion() {
return mVersion;
}
/**
* Get the fingerprint of the runtime permissions.
*
* @return the fingerprint of the runtime permissions
*/
@Nullable
public String getFingerprint() {
return mFingerprint;
}
/**
* Get the runtime permissions by packages.
*
* @return the runtime permissions by packages
*/
@NonNull
public Map<String, List<PermissionState>> getPackagePermissions() {
return mPackagePermissions;
}
/**
* Get the runtime permissions by shared users.
*
* @return the runtime permissions by shared users
*/
@NonNull
public Map<String, List<PermissionState>> getSharedUserPermissions() {
return mSharedUserPermissions;
}
@Override
public boolean equals(Object object) {
if (this == object) {
return true;
}
if (object == null || getClass() != object.getClass()) {
return false;
}
RuntimePermissionsState that = (RuntimePermissionsState) object;
return mVersion == that.mVersion
&& Objects.equals(mFingerprint, that.mFingerprint)
&& Objects.equals(mPackagePermissions, that.mPackagePermissions)
&& Objects.equals(mSharedUserPermissions, that.mSharedUserPermissions);
}
@Override
public int hashCode() {
return Objects.hash(mVersion, mFingerprint, mPackagePermissions, mSharedUserPermissions);
}
/**
* State of a single permission.
*/
public static class PermissionState {
public static final class PermissionState {
/**
* Name of the permission.
* The name of the permission.
*/
@NonNull
private final String mName;
@@ -106,27 +155,68 @@ public final class RuntimePermissionsState {
private final boolean mGranted;
/**
* Flags of the permission.
* The flags of the permission.
*/
private final int mFlags;
/**
* Create a new instance of this class.
*
* @param name the name of the permission
* @param granted whether the permission is granted
* @param flags the flags of the permission
*/
public PermissionState(@NonNull String name, boolean granted, int flags) {
mName = name;
mGranted = granted;
mFlags = flags;
}
/**
* Get the name of the permission.
*
* @return the name of the permission
*/
@NonNull
public String getName() {
return mName;
}
/**
* Get whether the permission is granted.
*
* @return whether the permission is granted
*/
public boolean isGranted() {
return mGranted;
}
/**
* Get the flags of the permission.
*
* @return the flags of the permission
*/
public int getFlags() {
return mFlags;
}
@Override
public boolean equals(Object object) {
if (this == object) {
return true;
}
if (object == null || getClass() != object.getClass()) {
return false;
}
PermissionState that = (PermissionState) object;
return mGranted == that.mGranted
&& mFlags == that.mFlags
&& Objects.equals(mName, that.mName);
}
@Override
public int hashCode() {
return Objects.hash(mName, mGranted, mFlags);
}
}
}

View File

@@ -40,7 +40,7 @@ public interface RolesPersistence {
* @return the roles read
*/
@Nullable
RolesState readAsUser(@NonNull UserHandle user);
RolesState readForUser(@NonNull UserHandle user);
/**
* Write the roles to persistence.
@@ -50,7 +50,7 @@ public interface RolesPersistence {
* @param roles the roles to write
* @param user the user to write for
*/
void writeAsUser(@NonNull RolesState roles, @NonNull UserHandle user);
void writeForUser(@NonNull RolesState roles, @NonNull UserHandle user);
/**
* Delete the roles from persistence.
@@ -59,7 +59,7 @@ public interface RolesPersistence {
*
* @param user the user to delete for
*/
void deleteAsUser(@NonNull UserHandle user);
void deleteForUser(@NonNull UserHandle user);
/**
* Create a new instance of {@link RolesPersistence} implementation.

View File

@@ -65,7 +65,7 @@ public class RolesPersistenceImpl implements RolesPersistence {
@Nullable
@Override
public RolesState readAsUser(@NonNull UserHandle user) {
public RolesState readForUser(@NonNull UserHandle user) {
File file = getFile(user);
try (FileInputStream inputStream = new AtomicFile(file).openRead()) {
XmlPullParser parser = Xml.newPullParser();
@@ -146,7 +146,7 @@ public class RolesPersistenceImpl implements RolesPersistence {
}
@Override
public void writeAsUser(@NonNull RolesState roles, @NonNull UserHandle user) {
public void writeForUser(@NonNull RolesState roles, @NonNull UserHandle user) {
File file = getFile(user);
AtomicFile atomicFile = new AtomicFile(file);
FileOutputStream outputStream = null;
@@ -205,7 +205,7 @@ public class RolesPersistenceImpl implements RolesPersistence {
}
@Override
public void deleteAsUser(@NonNull UserHandle user) {
public void deleteForUser(@NonNull UserHandle user) {
getFile(user).delete();
}

View File

@@ -22,6 +22,7 @@ import android.annotation.SystemApi;
import android.annotation.SystemApi.Client;
import java.util.Map;
import java.util.Objects;
import java.util.Set;
/**
@@ -50,6 +51,13 @@ public final class RolesState {
@NonNull
private final Map<String, Set<String>> mRoles;
/**
* Create a new instance of this class.
*
* @param version the version of the roles
* @param packagesHash the hash of all packages in the system
* @param roles the roles
*/
public RolesState(int version, @Nullable String packagesHash,
@NonNull Map<String, Set<String>> roles) {
mVersion = version;
@@ -57,17 +65,51 @@ public final class RolesState {
mRoles = roles;
}
/**
* Get the version of the roles.
*
* @return the version of the roles
*/
public int getVersion() {
return mVersion;
}
/**
* Get the hash of all packages in the system.
*
* @return the hash of all packages in the system
*/
@Nullable
public String getPackagesHash() {
return mPackagesHash;
}
/**
* Get the roles.
*
* @return the roles
*/
@NonNull
public Map<String, Set<String>> getRoles() {
return mRoles;
}
@Override
public boolean equals(Object object) {
if (this == object) {
return true;
}
if (object == null || getClass() != object.getClass()) {
return false;
}
RolesState that = (RolesState) object;
return mVersion == that.mVersion
&& Objects.equals(mPackagesHash, that.mPackagesHash)
&& Objects.equals(mRoles, that.mRoles);
}
@Override
public int hashCode() {
return Objects.hash(mVersion, mPackagesHash, mRoles);
}
}

View File

@@ -231,6 +231,7 @@ package android {
field public static final String UPDATE_APP_OPS_STATS = "android.permission.UPDATE_APP_OPS_STATS";
field public static final String UPDATE_LOCK = "android.permission.UPDATE_LOCK";
field public static final String UPDATE_TIME_ZONE_RULES = "android.permission.UPDATE_TIME_ZONE_RULES";
field public static final String UPGRADE_RUNTIME_PERMISSIONS = "android.permission.UPGRADE_RUNTIME_PERMISSIONS";
field public static final String USER_ACTIVITY = "android.permission.USER_ACTIVITY";
field public static final String USE_RESERVED_DISK = "android.permission.USE_RESERVED_DISK";
field public static final String WHITELIST_RESTRICTED_PERMISSIONS = "android.permission.WHITELIST_RESTRICTED_PERMISSIONS";
@@ -8948,7 +8949,7 @@ package android.permission {
}
public final class PermissionManager {
method @IntRange(from=0) @RequiresPermission(anyOf={android.Manifest.permission.ADJUST_RUNTIME_PERMISSIONS_POLICY, "android.permission.UPGRADE_RUNTIME_PERMISSIONS"}) public int getRuntimePermissionsVersion();
method @IntRange(from=0) @RequiresPermission(anyOf={android.Manifest.permission.ADJUST_RUNTIME_PERMISSIONS_POLICY, android.Manifest.permission.UPGRADE_RUNTIME_PERMISSIONS}) public int getRuntimePermissionsVersion();
method @NonNull public java.util.List<android.permission.PermissionManager.SplitPermissionInfo> getSplitPermissions();
method @RequiresPermission(android.Manifest.permission.GRANT_RUNTIME_PERMISSIONS_TO_TELEPHONY_DEFAULTS) public void grantDefaultPermissionsToEnabledCarrierApps(@NonNull String[], @NonNull android.os.UserHandle, @NonNull java.util.concurrent.Executor, @NonNull java.util.function.Consumer<java.lang.Boolean>);
method @RequiresPermission(android.Manifest.permission.GRANT_RUNTIME_PERMISSIONS_TO_TELEPHONY_DEFAULTS) public void grantDefaultPermissionsToEnabledImsServices(@NonNull String[], @NonNull android.os.UserHandle, @NonNull java.util.concurrent.Executor, @NonNull java.util.function.Consumer<java.lang.Boolean>);
@@ -8956,7 +8957,7 @@ package android.permission {
method @RequiresPermission(android.Manifest.permission.GRANT_RUNTIME_PERMISSIONS_TO_TELEPHONY_DEFAULTS) public void grantDefaultPermissionsToLuiApp(@NonNull String, @NonNull android.os.UserHandle, @NonNull java.util.concurrent.Executor, @NonNull java.util.function.Consumer<java.lang.Boolean>);
method @RequiresPermission(android.Manifest.permission.GRANT_RUNTIME_PERMISSIONS_TO_TELEPHONY_DEFAULTS) public void revokeDefaultPermissionsFromDisabledTelephonyDataServices(@NonNull String[], @NonNull android.os.UserHandle, @NonNull java.util.concurrent.Executor, @NonNull java.util.function.Consumer<java.lang.Boolean>);
method @RequiresPermission(android.Manifest.permission.GRANT_RUNTIME_PERMISSIONS_TO_TELEPHONY_DEFAULTS) public void revokeDefaultPermissionsFromLuiApps(@NonNull String[], @NonNull android.os.UserHandle, @NonNull java.util.concurrent.Executor, @NonNull java.util.function.Consumer<java.lang.Boolean>);
method @RequiresPermission(anyOf={android.Manifest.permission.ADJUST_RUNTIME_PERMISSIONS_POLICY, "android.permission.UPGRADE_RUNTIME_PERMISSIONS"}) public void setRuntimePermissionsVersion(@IntRange(from=0) int);
method @RequiresPermission(anyOf={android.Manifest.permission.ADJUST_RUNTIME_PERMISSIONS_POLICY, android.Manifest.permission.UPGRADE_RUNTIME_PERMISSIONS}) public void setRuntimePermissionsVersion(@IntRange(from=0) int);
method @RequiresPermission(android.Manifest.permission.MANAGE_ONE_TIME_PERMISSION_SESSIONS) public void startOneTimePermissionSession(@NonNull String, long, int, int);
method @RequiresPermission(android.Manifest.permission.MANAGE_ONE_TIME_PERMISSION_SESSIONS) public void stopOneTimePermissionSession(@NonNull String);
}

View File

@@ -21,6 +21,7 @@ package android {
field public static final String REMOVE_TASKS = "android.permission.REMOVE_TASKS";
field public static final String SUSPEND_APPS = "android.permission.SUSPEND_APPS";
field public static final String TEST_MANAGE_ROLLBACKS = "android.permission.TEST_MANAGE_ROLLBACKS";
field public static final String UPGRADE_RUNTIME_PERMISSIONS = "android.permission.UPGRADE_RUNTIME_PERMISSIONS";
field public static final String WRITE_DEVICE_CONFIG = "android.permission.WRITE_DEVICE_CONFIG";
field @Deprecated public static final String WRITE_MEDIA_STORAGE = "android.permission.WRITE_MEDIA_STORAGE";
field public static final String WRITE_OBB = "android.permission.WRITE_OBB";
@@ -2797,9 +2798,9 @@ package android.permission {
}
public final class PermissionManager {
method @IntRange(from=0) @RequiresPermission(anyOf={"android.permission.ADJUST_RUNTIME_PERMISSIONS_POLICY", "android.permission.UPGRADE_RUNTIME_PERMISSIONS"}) public int getRuntimePermissionsVersion();
method @IntRange(from=0) @RequiresPermission(anyOf={"android.permission.ADJUST_RUNTIME_PERMISSIONS_POLICY", android.Manifest.permission.UPGRADE_RUNTIME_PERMISSIONS}) public int getRuntimePermissionsVersion();
method @NonNull public java.util.List<android.permission.PermissionManager.SplitPermissionInfo> getSplitPermissions();
method @RequiresPermission(anyOf={"android.permission.ADJUST_RUNTIME_PERMISSIONS_POLICY", "android.permission.UPGRADE_RUNTIME_PERMISSIONS"}) public void setRuntimePermissionsVersion(@IntRange(from=0) int);
method @RequiresPermission(anyOf={"android.permission.ADJUST_RUNTIME_PERMISSIONS_POLICY", android.Manifest.permission.UPGRADE_RUNTIME_PERMISSIONS}) public void setRuntimePermissionsVersion(@IntRange(from=0) int);
}
public static final class PermissionManager.SplitPermissionInfo {

View File

@@ -3726,7 +3726,8 @@
<permission android:name="android.permission.ADJUST_RUNTIME_PERMISSIONS_POLICY"
android:protectionLevel="signature|installer" />
<!-- @hide Allows an application to upgrade runtime permissions. -->
<!-- @SystemApi @TestApi Allows an application to upgrade runtime permissions.
@hide -->
<permission android:name="android.permission.UPGRADE_RUNTIME_PERMISSIONS"
android:protectionLevel="signature" />

View File

@@ -3,9 +3,9 @@ package com.android.permission.persistence {
public interface RuntimePermissionsPersistence {
method @NonNull public static com.android.permission.persistence.RuntimePermissionsPersistence createInstance();
method public void deleteAsUser(@NonNull android.os.UserHandle);
method @Nullable public com.android.permission.persistence.RuntimePermissionsState readAsUser(@NonNull android.os.UserHandle);
method public void writeAsUser(@NonNull com.android.permission.persistence.RuntimePermissionsState, @NonNull android.os.UserHandle);
method public void deleteForUser(@NonNull android.os.UserHandle);
method @Nullable public com.android.permission.persistence.RuntimePermissionsState readForUser(@NonNull android.os.UserHandle);
method public void writeForUser(@NonNull com.android.permission.persistence.RuntimePermissionsState, @NonNull android.os.UserHandle);
}
public final class RuntimePermissionsState {
@@ -17,7 +17,7 @@ package com.android.permission.persistence {
field public static final int NO_VERSION = -1; // 0xffffffff
}
public static class RuntimePermissionsState.PermissionState {
public static final class RuntimePermissionsState.PermissionState {
ctor public RuntimePermissionsState.PermissionState(@NonNull String, boolean, int);
method public int getFlags();
method @NonNull public String getName();
@@ -30,9 +30,9 @@ package com.android.role.persistence {
public interface RolesPersistence {
method @NonNull public static com.android.role.persistence.RolesPersistence createInstance();
method public void deleteAsUser(@NonNull android.os.UserHandle);
method @Nullable public com.android.role.persistence.RolesState readAsUser(@NonNull android.os.UserHandle);
method public void writeAsUser(@NonNull com.android.role.persistence.RolesState, @NonNull android.os.UserHandle);
method public void deleteForUser(@NonNull android.os.UserHandle);
method @Nullable public com.android.role.persistence.RolesState readForUser(@NonNull android.os.UserHandle);
method public void writeForUser(@NonNull com.android.role.persistence.RolesState, @NonNull android.os.UserHandle);
}
public final class RolesState {

View File

@@ -5426,7 +5426,7 @@ public final class Settings {
packagePermissions, sharedUserPermissions);
}
mPersistence.writeAsUser(runtimePermissions, UserHandle.of(userId));
mPersistence.writeForUser(runtimePermissions, UserHandle.of(userId));
}
@NonNull
@@ -5480,12 +5480,12 @@ public final class Settings {
}
public void deleteUserRuntimePermissionsFile(int userId) {
mPersistence.deleteAsUser(UserHandle.of(userId));
mPersistence.deleteForUser(UserHandle.of(userId));
}
@GuardedBy("Settings.this.mLock")
public void readStateForUserSyncLPr(int userId) {
RuntimePermissionsState runtimePermissions = mPersistence.readAsUser(UserHandle.of(
RuntimePermissionsState runtimePermissions = mPersistence.readForUser(UserHandle.of(
userId));
if (runtimePermissions == null) {
readLegacyStateForUserSyncLPr(userId);

View File

@@ -364,12 +364,12 @@ public class RoleUserState {
(Map<String, Set<String>>) (Map<String, ?>) snapshotRolesLocked());
}
mPersistence.writeAsUser(roles, UserHandle.of(mUserId));
mPersistence.writeForUser(roles, UserHandle.of(mUserId));
}
private void readFile() {
synchronized (mLock) {
RolesState roles = mPersistence.readAsUser(UserHandle.of(mUserId));
RolesState roles = mPersistence.readForUser(UserHandle.of(mUserId));
if (roles == null) {
readLegacyFileLocked();
scheduleWriteFileLocked();
@@ -545,7 +545,7 @@ public class RoleUserState {
throw new IllegalStateException("This RoleUserState has already been destroyed");
}
mWriteHandler.removeCallbacksAndMessages(null);
mPersistence.deleteAsUser(UserHandle.of(mUserId));
mPersistence.deleteForUser(UserHandle.of(mUserId));
mDestroyed = true;
}
}