From 1652c32d5124ec1240cf94f059197a112a56536e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Dominik=20Sch=C3=BCrmann?= Date: Mon, 6 Jun 2016 18:06:39 +0200 Subject: [PATCH] Move permission getter in Apk class Also fix permissions list based on the fact that F-Droid deletes android.permission. prefix only for default Android permissions, not custom ones. --- .../java/org/fdroid/fdroid/AppDetails.java | 7 ++-- .../java/org/fdroid/fdroid/Permission.java | 14 +------ .../main/java/org/fdroid/fdroid/data/Apk.java | 39 +++++++++++++++++++ .../fdroid/privileged/views/AppDiff.java | 13 +------ 4 files changed, 46 insertions(+), 27 deletions(-) diff --git a/app/src/main/java/org/fdroid/fdroid/AppDetails.java b/app/src/main/java/org/fdroid/fdroid/AppDetails.java index 1f3f0db53..71fa35b30 100644 --- a/app/src/main/java/org/fdroid/fdroid/AppDetails.java +++ b/app/src/main/java/org/fdroid/fdroid/AppDetails.java @@ -92,6 +92,7 @@ import org.fdroid.fdroid.installer.InstallerService; import org.fdroid.fdroid.net.Downloader; import org.fdroid.fdroid.net.DownloaderService; +import java.util.ArrayList; import java.util.Iterator; import java.util.List; @@ -1375,14 +1376,12 @@ public class AppDetails extends AppCompatActivity { private void buildPermissionInfo() { final TextView permissionListView = (TextView) llViewMorePermissions.findViewById(R.id.permissions_list); - CommaSeparatedList permsList = appDetails.getApks().getItem(0).permissions; + ArrayList permsList = appDetails.getApks().getItem(0).getFullPermissionList(); if (permsList == null) { permissionListView.setText(R.string.no_permissions); } else { - Iterator permissions = permsList.iterator(); StringBuilder sb = new StringBuilder(); - while (permissions.hasNext()) { - final String permissionName = permissions.next(); + for (String permissionName : permsList) { try { final Permission permission = new Permission(getActivity(), permissionName); // TODO: Make this list RTL friendly diff --git a/app/src/main/java/org/fdroid/fdroid/Permission.java b/app/src/main/java/org/fdroid/fdroid/Permission.java index 986290b61..8a688854e 100644 --- a/app/src/main/java/org/fdroid/fdroid/Permission.java +++ b/app/src/main/java/org/fdroid/fdroid/Permission.java @@ -4,7 +4,7 @@ import android.content.Context; import android.content.pm.PackageManager; import android.content.pm.PermissionInfo; -class Permission { +public class Permission { private final PackageManager packageManager; private final PermissionInfo permissionInfo; @@ -13,17 +13,7 @@ class Permission { throws PackageManager.NameNotFoundException { this.packageManager = context.getPackageManager(); this.permissionInfo = this.packageManager.getPermissionInfo( - fdroidToAndroid(permission), PackageManager.GET_META_DATA); - } - - /** - * It appears that all of the permissions in android.Manifest.permissions - * are prefixed with "android.permission." and then the constant name. - * FDroid just includes the constant name in the apk list, so we prefix it - * with "android.permission." - */ - private static String fdroidToAndroid(String permission) { - return "android.permission." + permission; + permission, PackageManager.GET_META_DATA); } public CharSequence getName() { diff --git a/app/src/main/java/org/fdroid/fdroid/data/Apk.java b/app/src/main/java/org/fdroid/fdroid/data/Apk.java index 1f6b92220..5d90b4e2a 100644 --- a/app/src/main/java/org/fdroid/fdroid/data/Apk.java +++ b/app/src/main/java/org/fdroid/fdroid/data/Apk.java @@ -5,9 +5,11 @@ import android.content.ContentValues; import android.database.Cursor; import android.os.Build; import android.os.Parcelable; +import android.util.Log; import org.fdroid.fdroid.Utils; +import java.util.ArrayList; import java.util.Date; public class Apk extends ValueObject implements Comparable { @@ -141,6 +143,43 @@ public class Apk extends ValueObject implements Comparable { return repoAddress + "/" + apkName.replace(" ", "%20"); } + public ArrayList getFullPermissionList() { + if (this.permissions == null) { + return null; + } + + ArrayList permissionsFull = new ArrayList<>(); + for (String perm : this.permissions) { + permissionsFull.add(fdroidToAndroidPermission(perm)); + } + return permissionsFull; + } + + public String[] getFullPermissionsArray() { + ArrayList fullPermissions = getFullPermissionList(); + if (fullPermissions == null) { + return null; + } + + return fullPermissions.toArray(new String[fullPermissions.size()]); + } + + /** + * It appears that the default Android permissions in android.Manifest.permissions + * are prefixed with "android.permission." and then the constant name. + * FDroid just includes the constant name in the apk list, so we prefix it + * with "android.permission." + * + * see https://gitlab.com/fdroid/fdroidserver/blob/master/fdroidserver/update.py#L535# + */ + public static String fdroidToAndroidPermission(String permission) { + if (!permission.contains(".")) { + return "android.permission." + permission; + } + + return permission; + } + @Override public String toString() { return packageName + " (version " + versionCode + ")"; diff --git a/app/src/main/java/org/fdroid/fdroid/privileged/views/AppDiff.java b/app/src/main/java/org/fdroid/fdroid/privileged/views/AppDiff.java index ee61311b3..58d10cfdb 100644 --- a/app/src/main/java/org/fdroid/fdroid/privileged/views/AppDiff.java +++ b/app/src/main/java/org/fdroid/fdroid/privileged/views/AppDiff.java @@ -24,6 +24,7 @@ import android.content.pm.PackageInfo; import android.content.pm.PackageManager; import android.os.Build; +import org.fdroid.fdroid.Permission; import org.fdroid.fdroid.data.Apk; import java.util.ArrayList; @@ -45,17 +46,7 @@ public class AppDiff { mPkgInfo = new PackageInfo(); mPkgInfo.packageName = apk.packageName; mPkgInfo.applicationInfo = new ApplicationInfo(); - - if (apk.permissions == null) { - mPkgInfo.requestedPermissions = null; - } else { - // TODO: duplicate code with Permission.fdroidToAndroid - ArrayList permissionsFixed = new ArrayList<>(); - for (String perm : apk.permissions.toArrayList()) { - permissionsFixed.add("android.permission." + perm); - } - mPkgInfo.requestedPermissions = permissionsFixed.toArray(new String[permissionsFixed.size()]); - } + mPkgInfo.requestedPermissions = apk.getFullPermissionsArray(); init(); }