diff --git a/res/layout/appinfo.xml b/res/layout/appinfo.xml index 9fbc5ac81..6c86329d0 100644 --- a/res/layout/appinfo.xml +++ b/res/layout/appinfo.xml @@ -28,5 +28,19 @@ android:layout_width="fill_parent" android:layout_height="wrap_content" android:singleLine="false" /> + + + + diff --git a/res/values/strings.xml b/res/values/strings.xml index c632f086b..3e6a8eda1 100644 --- a/res/values/strings.xml +++ b/res/values/strings.xml @@ -163,5 +163,8 @@ Processing application\n%2$d of %3$d from\n%1$s Connecting to\n%1$s Checking apps compatibility with your device… + Permissions for v%s + Show permissions + Display a list of permissions an app needs diff --git a/res/xml/preferences.xml b/res/xml/preferences.xml index 2935561de..d99d4e0af 100644 --- a/res/xml/preferences.xml +++ b/res/xml/preferences.xml @@ -53,6 +53,7 @@ + permissions = permsList != null ? permsList.iterator() : null; + if (null != permissions && permissions.hasNext()) { + StringBuilder sb = new StringBuilder(); + while(permissions.hasNext()) { + String permissionName = permissions.next(); + try { + Permission permission = new Permission(this, permissionName); + sb.append(permission.getName()); + if (permissions.hasNext()) { + sb.append('\n'); + } + } catch (NameNotFoundException e) { + Log.d( "FDroid", + "Can't find permsission '" + permissionName + "'"); + } + } + tv.setText(sb.toString()); + } else { + tv.setText("NONE"); + } + tv = (TextView) infoView.findViewById(R.id.permissions); + tv.setText(getResources().getString( + R.string.permissions, app.apks.get(0).version)); + } else { + tv.setVisibility(View.GONE); + tv = (TextView) infoView.findViewById(R.id.permissions); + tv.setVisibility(View.GONE); + } } @Override diff --git a/src/org/fdroid/fdroid/Permission.java b/src/org/fdroid/fdroid/Permission.java new file mode 100644 index 000000000..1ab88837b --- /dev/null +++ b/src/org/fdroid/fdroid/Permission.java @@ -0,0 +1,42 @@ +package org.fdroid.fdroid; + +import android.content.Context; +import android.content.pm.PackageManager; +import android.content.pm.PermissionInfo; +import android.graphics.drawable.Drawable; + +public class Permission { + + private final PackageManager packageManager; + private final PermissionInfo permissionInfo; + + public Permission(Context context, String 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; + } + + public CharSequence getName() { + return this.permissionInfo.loadLabel(this.packageManager); + } + + public CharSequence getDescription() { + return this.permissionInfo.loadDescription(this.packageManager); + } + + public Drawable getIcon() { + return this.permissionInfo.loadIcon(this.packageManager); + } + +}