Skip to content

Commit

Permalink
[Refactor] Fix retrieving and updating permission flags in Android 12…
Browse files Browse the repository at this point in the history
… onwards

Signed-off-by: Muntashir Al-Islam <muntashirakon@riseup.net>
  • Loading branch information
MuntashirAkon committed Mar 18, 2024
1 parent a94bb14 commit 884cc10
Show file tree
Hide file tree
Showing 3 changed files with 52 additions and 11 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -387,7 +387,7 @@ private void backupExtras() throws BackupException {
boolean isGranted = (permissionFlags[i] & PackageInfo.REQUESTED_PERMISSION_GRANTED) != 0;
int permFlags = PermissionCompat.getPermissionFlags(info.name, mPackageName, mUserId);
rules.setPermission(permissions[i], isGranted, permFlags);
} catch (PackageManager.NameNotFoundException | RemoteException ignore) {
} catch (PackageManager.NameNotFoundException ignore) {
}
}
// Backup app ops
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,7 @@
import io.github.muntashirakon.AppManager.ipc.ProxyBinder;
import io.github.muntashirakon.AppManager.logs.Log;
import io.github.muntashirakon.AppManager.settings.Ops;
import io.github.muntashirakon.AppManager.utils.ExUtils;

public final class PermissionCompat {
public static final int FLAG_PERMISSION_NONE = 0;
Expand Down Expand Up @@ -276,13 +277,19 @@ public final class PermissionCompat {
@PermissionFlags
public static int getPermissionFlags(@NonNull String permissionName,
@NonNull String packageName,
@UserIdInt int userId) throws RemoteException {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) {
IPermissionManager permissionManager = getPermissionManager();
return permissionManager.getPermissionFlags(permissionName, packageName, userId);
} else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
return PackageManagerCompat.getPackageManager().getPermissionFlags(permissionName, packageName, userId);
} else return FLAG_PERMISSION_NONE;
@UserIdInt int userId) throws SecurityException {
try {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) {
return getPermissionManager().getPermissionFlags(packageName, permissionName, userId);
} else if (Build.VERSION.SDK_INT == Build.VERSION_CODES.R) {
return getPermissionManager().getPermissionFlags(permissionName, packageName, userId);
} else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
return PackageManagerCompat.getPackageManager().getPermissionFlags(permissionName, packageName, userId);
}
} catch (RemoteException e) {
e.printStackTrace();
}
return FLAG_PERMISSION_NONE;
}

/**
Expand All @@ -306,9 +313,11 @@ public static void updatePermissionFlags(@NonNull String permissionName,
boolean checkAdjustPolicyFlagPermission,
@UserIdInt int userId) throws RemoteException {
IPackageManager pm = PackageManagerCompat.getPackageManager();
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) {
IPermissionManager permissionManager = getPermissionManager();
permissionManager.updatePermissionFlags(permissionName, packageName, flagMask, flagValues,
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) {
getPermissionManager().updatePermissionFlags(packageName, permissionName, flagMask, flagValues,
checkAdjustPolicyFlagPermission, userId);
} else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) {
getPermissionManager().updatePermissionFlags(permissionName, packageName, flagMask, flagValues,
checkAdjustPolicyFlagPermission, userId);
} else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {
pm.updatePermissionFlags(permissionName, packageName, flagMask, flagValues,
Expand Down
32 changes: 32 additions & 0 deletions hiddenapi/src/main/java/android/permission/IPermissionManager.java
Original file line number Diff line number Diff line change
Expand Up @@ -41,8 +41,14 @@ public interface IPermissionManager extends IInterface {

void removePermission(String name) throws RemoteException;

/**
* First two parameters are permuted since Android 12 (S)
*/
int getPermissionFlags(String permName, String packageName, int userId) throws RemoteException;

/**
* First two parameters are permuted since Android 12 (S)
*/
void updatePermissionFlags(String permName, String packageName, int flagMask,
int flagValues, boolean checkAdjustPolicyFlagPermission, int userId) throws RemoteException;

Expand Down Expand Up @@ -105,6 +111,9 @@ boolean removeAllowlistedRestrictedPermission(String packageName, String permiss

void revokeRuntimePermission(String packageName, String permName, int userId, String reason) throws RemoteException;

@RequiresApi(Build.VERSION_CODES.TIRAMISU)
void revokePostNotificationPermissionWithoutKillForTest(String packageName, int userId) throws RemoteException;

/**
* @deprecated Removed in Android 12 (S)
*/
Expand Down Expand Up @@ -171,16 +180,39 @@ boolean removeAllowlistedRestrictedPermission(String packageName, String permiss
@Deprecated
boolean isPermissionEnforced(String permName) throws RemoteException;

/**
* First two parameters are permuted since Android 12 (S)
*/
boolean shouldShowRequestPermissionRationale(String permName, String packageName, int userId)
throws RemoteException;

/**
* First two parameters are permuted since Android 12 (S)
*/
boolean isPermissionRevokedByPolicy(String permName, String packageName, int userId) throws RemoteException;

List<SplitPermissionInfoParcelable> getSplitPermissions() throws RemoteException;

/**
* @deprecated Replaced in Android 13 (Tiramisu) by {@link #startOneTimePermissionSession(String, int, long, long, int, int)}
*/
@Deprecated
void startOneTimePermissionSession(String packageName, int userId, long timeout,
int importanceToResetTimer, int importanceToKeepSessionAlive) throws RemoteException;

/**
* @deprecated Replaced in Android 14 (Upside Down Cake) by {@link #startOneTimePermissionSession(String, int, long, long)}
*/
@Deprecated
@RequiresApi(Build.VERSION_CODES.TIRAMISU)
void startOneTimePermissionSession(String packageName, int userId, long timeout,
long revokeAfterKilledDelay, int importanceToResetTimer,
int importanceToKeepSessionAlive) throws RemoteException;

@RequiresApi(34)
void startOneTimePermissionSession(String packageName, int userId, long timeout,
long revokeAfterKilledDelay) throws RemoteException;

void stopOneTimePermissionSession(String packageName, int userId) throws RemoteException;

List<String> getAutoRevokeExemptionRequestedPackages(int userId) throws RemoteException;
Expand Down

0 comments on commit 884cc10

Please sign in to comment.