AppSecurityPermissions: changes from Android 6

This commit is contained in:
Dominik Schürmann 2016-05-02 00:35:19 +02:00
parent a2cb5f1ccf
commit 06a8ff5787
3 changed files with 25 additions and 45 deletions

View File

@ -65,16 +65,19 @@ import java.util.Set;
/** /**
* NOTES: * NOTES:
* Based on AOSP core/java/android/widget/AppSecurityPermissions * Based on AOSP core/java/android/widget/AppSecurityPermissions
* ec2d48b96d1f95fb266914df294a27c210f8c3f5 * latest included commit: a3f68ef2f6811cf72f1282214c0883db5a30901d
*
* To update this file:
* - Open https://github.com/android/platform_frameworks_base/commits/master/core/java/android/widget/AppSecurityPermissions.java
* - Start from latest included commit and include changes until the newest commit with care
*/ */
@TargetApi(Build.VERSION_CODES.M) @TargetApi(Build.VERSION_CODES.M)
public class AppSecurityPermissions { public class AppSecurityPermissions {
private static final String TAG = "AppSecurityPermissions"; private static final String TAG = "AppSecurityPermissions";
public static final int WHICH_PERSONAL = 1 << 0; public static final int WHICH_NEW = 1<<2;
public static final int WHICH_DEVICE = 1 << 1; public static final int WHICH_ALL = 0xffff;
public static final int WHICH_NEW = 1 << 2;
private final Context mContext; private final Context mContext;
private final LayoutInflater mInflater; private final LayoutInflater mInflater;
@ -89,8 +92,6 @@ public class AppSecurityPermissions {
CharSequence mLabel; CharSequence mLabel;
final List<MyPermissionInfo> mNewPermissions = new ArrayList<>(); final List<MyPermissionInfo> mNewPermissions = new ArrayList<>();
final List<MyPermissionInfo> mPersonalPermissions = new ArrayList<>();
final List<MyPermissionInfo> mDevicePermissions = new ArrayList<>();
final List<MyPermissionInfo> mAllPermissions = new ArrayList<>(); final List<MyPermissionInfo> mAllPermissions = new ArrayList<>();
MyPermissionGroupInfo(PermissionInfo perm) { MyPermissionGroupInfo(PermissionInfo perm) {
@ -102,17 +103,12 @@ public class AppSecurityPermissions {
super(info); super(info);
} }
public Drawable loadGroupIcon(PackageManager pm) { public Drawable loadGroupIcon(Context context, PackageManager pm) {
if (icon != 0) { if (icon != 0) {
return (Build.VERSION.SDK_INT < 22) ? loadIcon(pm) : loadUnbadgedIcon(pm); return (Build.VERSION.SDK_INT < 22) ? loadIcon(pm) : loadUnbadgedIcon(pm);
} else {
return context.getDrawable(R.drawable.ic_perm_device_info);
} }
try {
ApplicationInfo appInfo = pm.getApplicationInfo(packageName, 0);
return (Build.VERSION.SDK_INT < 22) ? appInfo.loadIcon(pm) : appInfo.loadUnbadgedIcon(pm);
} catch (NameNotFoundException e) {
// ignore
}
return null;
} }
public int flags() { public int flags() {
@ -166,7 +162,7 @@ public class AppSecurityPermissions {
PackageManager pm = getContext().getPackageManager(); PackageManager pm = getContext().getPackageManager();
Drawable icon = null; Drawable icon = null;
if (first) { if (first) {
icon = grp.loadGroupIcon(pm); icon = grp.loadGroupIcon(getContext(), pm);
} }
CharSequence label = perm.mLabel; CharSequence label = perm.mLabel;
if (perm.mNew && newPermPrefix != null) { if (perm.mNew && newPermPrefix != null) {
@ -210,7 +206,7 @@ public class AppSecurityPermissions {
R.string.perms_description_app, appName) + "\n\n" + mPerm.name); R.string.perms_description_app, appName) + "\n\n" + mPerm.name);
} }
builder.setCancelable(true); builder.setCancelable(true);
builder.setIcon(mGroup.loadGroupIcon(pm)); builder.setIcon(mGroup.loadGroupIcon(getContext(), pm));
mDialog = builder.show(); mDialog = builder.show();
mDialog.setCanceledOnTouchOutside(true); mDialog.setCanceledOnTouchOutside(true);
} }
@ -254,7 +250,6 @@ public class AppSecurityPermissions {
setPermissions(new ArrayList<>(permSet)); setPermissions(new ArrayList<>(permSet));
} }
@TargetApi(Build.VERSION_CODES.JELLY_BEAN)
private int[] getRequestedPermissionFlags(PackageInfo info) { private int[] getRequestedPermissionFlags(PackageInfo info) {
if (Build.VERSION.SDK_INT < 16) { if (Build.VERSION.SDK_INT < 16) {
return new int[info.requestedPermissions.length]; return new int[info.requestedPermissions.length];
@ -262,7 +257,6 @@ public class AppSecurityPermissions {
return info.requestedPermissionsFlags; return info.requestedPermissionsFlags;
} }
@TargetApi(Build.VERSION_CODES.JELLY_BEAN)
private void extractPerms(PackageInfo info, Set<MyPermissionInfo> permSet, private void extractPerms(PackageInfo info, Set<MyPermissionInfo> permSet,
PackageInfo installedPkgInfo) { PackageInfo installedPkgInfo) {
@ -274,11 +268,6 @@ public class AppSecurityPermissions {
for (int i = 0; i < strList.length; i++) { for (int i = 0; i < strList.length; i++) {
String permName = strList[i]; String permName = strList[i];
// If we are only looking at an existing app, then we only
// care about permissions that have actually been granted to it.
if (installedPkgInfo != null && info == installedPkgInfo && (flagsList[i] & PackageInfo.REQUESTED_PERMISSION_GRANTED) == 0) {
continue;
}
try { try {
PermissionInfo tmpPermInfo = mPm.getPermissionInfo(permName, 0); PermissionInfo tmpPermInfo = mPm.getPermissionInfo(permName, 0);
if (tmpPermInfo == null) { if (tmpPermInfo == null) {
@ -348,10 +337,6 @@ public class AppSecurityPermissions {
switch (which) { switch (which) {
case WHICH_NEW: case WHICH_NEW:
return grp.mNewPermissions; return grp.mNewPermissions;
case WHICH_PERSONAL:
return grp.mPersonalPermissions;
case WHICH_DEVICE:
return grp.mDevicePermissions;
default: default:
return grp.mAllPermissions; return grp.mAllPermissions;
} }
@ -422,11 +407,18 @@ public class AppSecurityPermissions {
return permView; return permView;
} }
@TargetApi(Build.VERSION_CODES.JELLY_BEAN)
private boolean isDisplayablePermission(PermissionInfo pInfo, int existingReqFlags) { private boolean isDisplayablePermission(PermissionInfo pInfo, int existingReqFlags) {
final int base = pInfo.protectionLevel & PermissionInfo.PROTECTION_MASK_BASE; final int base = pInfo.protectionLevel & PermissionInfo.PROTECTION_MASK_BASE;
final boolean isNormal = base == PermissionInfo.PROTECTION_NORMAL; final boolean isNormal = base == PermissionInfo.PROTECTION_NORMAL;
final boolean isDangerous = base == PermissionInfo.PROTECTION_DANGEROUS;
// TODO: do we want this in F-Droid?
// // We do not show normal permissions in the UI.
// if (isNormal) {
// return false;
// }
final boolean isDangerous = base == PermissionInfo.PROTECTION_DANGEROUS
|| ((pInfo.protectionLevel & PermissionInfo.PROTECTION_FLAG_PRE23) != 0);
// Dangerous and normal permissions are always shown to the user // Dangerous and normal permissions are always shown to the user
if (isNormal || isDangerous) { if (isNormal || isDangerous) {
@ -446,16 +438,7 @@ public class AppSecurityPermissions {
private final Collator sCollator = Collator.getInstance(); private final Collator sCollator = Collator.getInstance();
PermissionGroupInfoComparator() {
}
public final int compare(MyPermissionGroupInfo a, MyPermissionGroupInfo b) { public final int compare(MyPermissionGroupInfo a, MyPermissionGroupInfo b) {
if (((a.flags() ^ b.flags()) & PermissionGroupInfo.FLAG_PERSONAL_INFO) != 0) {
return ((a.flags() & PermissionGroupInfo.FLAG_PERSONAL_INFO) != 0) ? -1 : 1;
}
if (a.priority() != b.priority()) {
return a.priority() > b.priority() ? -1 : 1;
}
return sCollator.compare(a.mLabel, b.mLabel); return sCollator.compare(a.mLabel, b.mLabel);
} }
} }
@ -498,11 +481,6 @@ public class AppSecurityPermissions {
if (pInfo.mNew) { if (pInfo.mNew) {
addPermToList(group.mNewPermissions, pInfo); addPermToList(group.mNewPermissions, pInfo);
} }
if ((group.flags() & PermissionGroupInfo.FLAG_PERSONAL_INFO) != 0) {
addPermToList(group.mPersonalPermissions, pInfo);
} else {
addPermToList(group.mDevicePermissions, pInfo);
}
} }
} }
} }

View File

@ -33,7 +33,8 @@
android:layout_marginStart="16dp" android:layout_marginStart="16dp"
android:layout_marginRight="8dp" android:layout_marginRight="8dp"
android:layout_marginEnd="8dp" android:layout_marginEnd="8dp"
android:scaleType="fitCenter" /> android:scaleType="fitCenter"
android:tint="@android:color/black" />
<ImageView <ImageView
android:layout_width="wrap_content" android:layout_width="wrap_content"

View File

@ -32,7 +32,8 @@
android:layout_marginStart="16dp" android:layout_marginStart="16dp"
android:layout_marginRight="8dp" android:layout_marginRight="8dp"
android:layout_marginEnd="8dp" android:layout_marginEnd="8dp"
android:scaleType="fitCenter" /> android:scaleType="fitCenter"
android:tint="@android:color/black" />
<ImageView <ImageView
android:layout_width="wrap_content" android:layout_width="wrap_content"