AppSecurityPermissionspublic class AppSecurityPermissions extends Object This class contains the SecurityPermissions view implementation.
Initially the package's advanced or dangerous security permissions
are displayed under categorized
groups. Clicking on the additional permissions presents
extended information consisting of all groups and permissions.
To use this view define a LinearLayout or any ViewGroup and add this
view by instantiating AppSecurityPermissions and invoking getPermissionsView.
{@hide} |
Fields Summary |
---|
public static final int | WHICH_PERSONAL | public static final int | WHICH_DEVICE | public static final int | WHICH_NEW | public static final int | WHICH_ALL | private static final String | TAG | private static final boolean | localLOGV | private final android.content.Context | mContext | private final android.view.LayoutInflater | mInflater | private final android.content.pm.PackageManager | mPm | private final Map | mPermGroups | private final List | mPermGroupsList | private final PermissionGroupInfoComparator | mPermGroupComparator | private final PermissionInfoComparator | mPermComparator | private final List | mPermsList | private final CharSequence | mNewPermPrefix | private String | mPackageName |
Constructors Summary |
---|
private AppSecurityPermissions(android.content.Context context)
mContext = context;
mInflater = (LayoutInflater) mContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
mPm = mContext.getPackageManager();
// Pick up from framework resources instead.
mNewPermPrefix = mContext.getText(R.string.perms_new_perm_prefix);
| public AppSecurityPermissions(android.content.Context context, String packageName)
this(context);
mPackageName = packageName;
Set<MyPermissionInfo> permSet = new HashSet<MyPermissionInfo>();
PackageInfo pkgInfo;
try {
pkgInfo = mPm.getPackageInfo(packageName, PackageManager.GET_PERMISSIONS);
} catch (NameNotFoundException e) {
Log.w(TAG, "Couldn't retrieve permissions for package:"+packageName);
return;
}
// Extract all user permissions
if((pkgInfo.applicationInfo != null) && (pkgInfo.applicationInfo.uid != -1)) {
getAllUsedPermissions(pkgInfo.applicationInfo.uid, permSet);
}
mPermsList.addAll(permSet);
setPermissions(mPermsList);
| public AppSecurityPermissions(android.content.Context context, android.content.pm.PackageInfo info)
this(context);
Set<MyPermissionInfo> permSet = new HashSet<MyPermissionInfo>();
if(info == null) {
return;
}
mPackageName = info.packageName;
// Convert to a PackageInfo
PackageInfo installedPkgInfo = null;
// Get requested permissions
if (info.requestedPermissions != null) {
try {
installedPkgInfo = mPm.getPackageInfo(info.packageName,
PackageManager.GET_PERMISSIONS);
} catch (NameNotFoundException e) {
}
extractPerms(info, permSet, installedPkgInfo);
}
// Get permissions related to shared user if any
if (info.sharedUserId != null) {
int sharedUid;
try {
sharedUid = mPm.getUidForSharedUser(info.sharedUserId);
getAllUsedPermissions(sharedUid, permSet);
} catch (NameNotFoundException e) {
Log.w(TAG, "Couldn't retrieve shared user id for: " + info.packageName);
}
}
// Retrieve list of permissions
mPermsList.addAll(permSet);
setPermissions(mPermsList);
|
Methods Summary |
---|
private void | addPermToList(java.util.List permList, android.widget.AppSecurityPermissions$MyPermissionInfo pInfo)
if (pInfo.mLabel == null) {
pInfo.mLabel = pInfo.loadLabel(mPm);
}
int idx = Collections.binarySearch(permList, pInfo, mPermComparator);
if(localLOGV) Log.i(TAG, "idx="+idx+", list.size="+permList.size());
if (idx < 0) {
idx = -idx-1;
permList.add(idx, pInfo);
}
| private void | displayPermissions(java.util.List groups, LinearLayout permListView, int which, boolean showRevokeUI)Utility method that displays permissions from a map containing group name and
list of permission descriptions.
permListView.removeAllViews();
int spacing = (int)(8*mContext.getResources().getDisplayMetrics().density);
for (int i=0; i<groups.size(); i++) {
MyPermissionGroupInfo grp = groups.get(i);
final List<MyPermissionInfo> perms = getPermissionList(grp, which);
for (int j=0; j<perms.size(); j++) {
MyPermissionInfo perm = perms.get(j);
View view = getPermissionItemView(grp, perm, j == 0,
which != WHICH_NEW ? mNewPermPrefix : null, showRevokeUI);
LinearLayout.LayoutParams lp = new LinearLayout.LayoutParams(
ViewGroup.LayoutParams.MATCH_PARENT,
ViewGroup.LayoutParams.WRAP_CONTENT);
if (j == 0) {
lp.topMargin = spacing;
}
if (j == grp.mAllPermissions.size()-1) {
lp.bottomMargin = spacing;
}
if (permListView.getChildCount() == 0) {
lp.topMargin *= 2;
}
permListView.addView(view, lp);
}
}
| private void | extractPerms(android.content.pm.PackageInfo info, java.util.Set permSet, android.content.pm.PackageInfo installedPkgInfo)
String[] strList = info.requestedPermissions;
int[] flagsList = info.requestedPermissionsFlags;
if ((strList == null) || (strList.length == 0)) {
return;
}
for (int i=0; i<strList.length; 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) {
if ((flagsList[i]&PackageInfo.REQUESTED_PERMISSION_GRANTED) == 0) {
continue;
}
}
try {
PermissionInfo tmpPermInfo = mPm.getPermissionInfo(permName, 0);
if (tmpPermInfo == null) {
continue;
}
int existingIndex = -1;
if (installedPkgInfo != null
&& installedPkgInfo.requestedPermissions != null) {
for (int j=0; j<installedPkgInfo.requestedPermissions.length; j++) {
if (permName.equals(installedPkgInfo.requestedPermissions[j])) {
existingIndex = j;
break;
}
}
}
final int existingFlags = existingIndex >= 0 ?
installedPkgInfo.requestedPermissionsFlags[existingIndex] : 0;
if (!isDisplayablePermission(tmpPermInfo, flagsList[i], existingFlags)) {
// This is not a permission that is interesting for the user
// to see, so skip it.
continue;
}
final String origGroupName = tmpPermInfo.group;
String groupName = origGroupName;
if (groupName == null) {
groupName = tmpPermInfo.packageName;
tmpPermInfo.group = groupName;
}
MyPermissionGroupInfo group = mPermGroups.get(groupName);
if (group == null) {
PermissionGroupInfo grp = null;
if (origGroupName != null) {
grp = mPm.getPermissionGroupInfo(origGroupName, 0);
}
if (grp != null) {
group = new MyPermissionGroupInfo(grp);
} else {
// We could be here either because the permission
// didn't originally specify a group or the group it
// gave couldn't be found. In either case, we consider
// its group to be the permission's package name.
tmpPermInfo.group = tmpPermInfo.packageName;
group = mPermGroups.get(tmpPermInfo.group);
if (group == null) {
group = new MyPermissionGroupInfo(tmpPermInfo);
}
group = new MyPermissionGroupInfo(tmpPermInfo);
}
mPermGroups.put(tmpPermInfo.group, group);
}
final boolean newPerm = installedPkgInfo != null
&& (existingFlags&PackageInfo.REQUESTED_PERMISSION_GRANTED) == 0;
MyPermissionInfo myPerm = new MyPermissionInfo(tmpPermInfo);
myPerm.mNewReqFlags = flagsList[i];
myPerm.mExistingReqFlags = existingFlags;
// This is a new permission if the app is already installed and
// doesn't currently hold this permission.
myPerm.mNew = newPerm;
permSet.add(myPerm);
} catch (NameNotFoundException e) {
Log.i(TAG, "Ignoring unknown permission:"+permName);
}
}
| private void | getAllUsedPermissions(int sharedUid, java.util.Set permSet)
String sharedPkgList[] = mPm.getPackagesForUid(sharedUid);
if(sharedPkgList == null || (sharedPkgList.length == 0)) {
return;
}
for(String sharedPkg : sharedPkgList) {
getPermissionsForPackage(sharedPkg, permSet);
}
| public int | getPermissionCount(int which)
int N = 0;
for (int i=0; i<mPermGroupsList.size(); i++) {
N += getPermissionList(mPermGroupsList.get(i), which).size();
}
return N;
| public int | getPermissionCount()
return getPermissionCount(WHICH_ALL);
| private android.widget.AppSecurityPermissions$PermissionItemView | getPermissionItemView(android.widget.AppSecurityPermissions$MyPermissionGroupInfo grp, android.widget.AppSecurityPermissions$MyPermissionInfo perm, boolean first, java.lang.CharSequence newPermPrefix, boolean showRevokeUI)
return getPermissionItemView(mContext, mInflater, grp, perm, first, newPermPrefix,
mPackageName, showRevokeUI);
| private static android.widget.AppSecurityPermissions$PermissionItemView | getPermissionItemView(android.content.Context context, android.view.LayoutInflater inflater, android.widget.AppSecurityPermissions$MyPermissionGroupInfo grp, android.widget.AppSecurityPermissions$MyPermissionInfo perm, boolean first, java.lang.CharSequence newPermPrefix, java.lang.String packageName, boolean showRevokeUI)
PermissionItemView permView = (PermissionItemView)inflater.inflate(
(perm.flags & PermissionInfo.FLAG_COSTS_MONEY) != 0
? R.layout.app_permission_item_money : R.layout.app_permission_item,
null);
permView.setPermission(grp, perm, first, newPermPrefix, packageName, showRevokeUI);
return permView;
| public static android.view.View | getPermissionItemView(android.content.Context context, java.lang.CharSequence grpName, java.lang.CharSequence description, boolean dangerous)Utility to retrieve a view displaying a single permission. This provides
the old UI layout for permissions; it is only here for the device admin
settings to continue to use.
LayoutInflater inflater = (LayoutInflater)context.getSystemService(
Context.LAYOUT_INFLATER_SERVICE);
Drawable icon = context.getDrawable(dangerous
? R.drawable.ic_bullet_key_permission : R.drawable.ic_text_dot);
return getPermissionItemViewOld(context, inflater, grpName,
description, dangerous, icon);
| private static android.view.View | getPermissionItemViewOld(android.content.Context context, android.view.LayoutInflater inflater, java.lang.CharSequence grpName, java.lang.CharSequence permList, boolean dangerous, android.graphics.drawable.Drawable icon)
View permView = inflater.inflate(R.layout.app_permission_item_old, null);
TextView permGrpView = (TextView) permView.findViewById(R.id.permission_group);
TextView permDescView = (TextView) permView.findViewById(R.id.permission_list);
ImageView imgView = (ImageView)permView.findViewById(R.id.perm_icon);
imgView.setImageDrawable(icon);
if(grpName != null) {
permGrpView.setText(grpName);
permDescView.setText(permList);
} else {
permGrpView.setText(permList);
permDescView.setVisibility(View.GONE);
}
return permView;
| private java.util.List | getPermissionList(android.widget.AppSecurityPermissions$MyPermissionGroupInfo grp, int which)
if (which == WHICH_NEW) {
return grp.mNewPermissions;
} else if (which == WHICH_PERSONAL) {
return grp.mPersonalPermissions;
} else if (which == WHICH_DEVICE) {
return grp.mDevicePermissions;
} else {
return grp.mAllPermissions;
}
| private void | getPermissionsForPackage(java.lang.String packageName, java.util.Set permSet)
try {
PackageInfo pkgInfo = mPm.getPackageInfo(packageName, PackageManager.GET_PERMISSIONS);
extractPerms(pkgInfo, permSet, pkgInfo);
} catch (NameNotFoundException e) {
Log.w(TAG, "Couldn't retrieve permissions for package: " + packageName);
}
| public android.view.View | getPermissionsView()
return getPermissionsView(WHICH_ALL, false);
| public android.view.View | getPermissionsView(int which)
return getPermissionsView(which, false);
| private android.view.View | getPermissionsView(int which, boolean showRevokeUI)
LinearLayout permsView = (LinearLayout) mInflater.inflate(R.layout.app_perms_summary, null);
LinearLayout displayList = (LinearLayout) permsView.findViewById(R.id.perms_list);
View noPermsView = permsView.findViewById(R.id.no_permissions);
displayPermissions(mPermGroupsList, displayList, which, showRevokeUI);
if (displayList.getChildCount() <= 0) {
noPermsView.setVisibility(View.VISIBLE);
}
return permsView;
| public android.view.View | getPermissionsViewWithRevokeButtons()
return getPermissionsView(WHICH_ALL, true);
| private boolean | isDisplayablePermission(android.content.pm.PermissionInfo pInfo, int newReqFlags, int existingReqFlags)
final int base = pInfo.protectionLevel & PermissionInfo.PROTECTION_MASK_BASE;
final boolean isNormal = (base == PermissionInfo.PROTECTION_NORMAL);
final boolean isDangerous = (base == PermissionInfo.PROTECTION_DANGEROUS);
final boolean isRequired =
((newReqFlags&PackageInfo.REQUESTED_PERMISSION_REQUIRED) != 0);
final boolean isDevelopment =
((pInfo.protectionLevel&PermissionInfo.PROTECTION_FLAG_DEVELOPMENT) != 0);
final boolean wasGranted =
((existingReqFlags&PackageInfo.REQUESTED_PERMISSION_GRANTED) != 0);
final boolean isGranted =
((newReqFlags&PackageInfo.REQUESTED_PERMISSION_GRANTED) != 0);
// Dangerous and normal permissions are always shown to the user if the permission
// is required, or it was previously granted
if ((isNormal || isDangerous) && (isRequired || wasGranted || isGranted)) {
return true;
}
// Development permissions are only shown to the user if they are already
// granted to the app -- if we are installing an app and they are not
// already granted, they will not be granted as part of the install.
if (isDevelopment && wasGranted) {
if (localLOGV) Log.i(TAG, "Special perm " + pInfo.name
+ ": protlevel=0x" + Integer.toHexString(pInfo.protectionLevel));
return true;
}
return false;
| private void | setPermissions(java.util.List permList)
if (permList != null) {
// First pass to group permissions
for (MyPermissionInfo pInfo : permList) {
if(localLOGV) Log.i(TAG, "Processing permission:"+pInfo.name);
if(!isDisplayablePermission(pInfo, pInfo.mNewReqFlags, pInfo.mExistingReqFlags)) {
if(localLOGV) Log.i(TAG, "Permission:"+pInfo.name+" is not displayable");
continue;
}
MyPermissionGroupInfo group = mPermGroups.get(pInfo.group);
if (group != null) {
pInfo.mLabel = pInfo.loadLabel(mPm);
addPermToList(group.mAllPermissions, pInfo);
if (pInfo.mNew) {
addPermToList(group.mNewPermissions, pInfo);
}
if ((group.flags&PermissionGroupInfo.FLAG_PERSONAL_INFO) != 0) {
addPermToList(group.mPersonalPermissions, pInfo);
} else {
addPermToList(group.mDevicePermissions, pInfo);
}
}
}
}
for (MyPermissionGroupInfo pgrp : mPermGroups.values()) {
if (pgrp.labelRes != 0 || pgrp.nonLocalizedLabel != null) {
pgrp.mLabel = pgrp.loadLabel(mPm);
} else {
ApplicationInfo app;
try {
app = mPm.getApplicationInfo(pgrp.packageName, 0);
pgrp.mLabel = app.loadLabel(mPm);
} catch (NameNotFoundException e) {
pgrp.mLabel = pgrp.loadLabel(mPm);
}
}
mPermGroupsList.add(pgrp);
}
Collections.sort(mPermGroupsList, mPermGroupComparator);
if (localLOGV) {
for (MyPermissionGroupInfo grp : mPermGroupsList) {
Log.i(TAG, "Group " + grp.name + " personal="
+ ((grp.flags&PermissionGroupInfo.FLAG_PERSONAL_INFO) != 0)
+ " priority=" + grp.priority);
}
}
|
|