Merge "Allow callers holding PACKAGE_USAGE_STATS permission to call ActivityManager#getPackageImportance()" into mnc-dev

This commit is contained in:
Adam Lesinski
2015-06-24 21:32:36 +00:00
committed by Android (Google) Code Review
5 changed files with 26 additions and 8 deletions

View File

@@ -1688,7 +1688,7 @@ public class Am extends BaseCommand {
private void runPackageImportance() throws Exception {
String packageName = nextArgRequired();
try {
int procState = mAm.getPackageProcessState(packageName);
int procState = mAm.getPackageProcessState(packageName, "com.android.shell");
System.out.println(
ActivityManager.RunningAppProcessInfo.procStateToImportance(procState));
} catch (RemoteException e) {

View File

@@ -2345,7 +2345,8 @@ public class ActivityManager {
@SystemApi
public int getPackageImportance(String packageName) {
try {
int procState = ActivityManagerNative.getDefault().getPackageProcessState(packageName);
int procState = ActivityManagerNative.getDefault().getPackageProcessState(packageName,
mContext.getOpPackageName());
return RunningAppProcessInfo.procStateToImportance(procState);
} catch (RemoteException e) {
return RunningAppProcessInfo.IMPORTANCE_GONE;

View File

@@ -2539,7 +2539,8 @@ public abstract class ActivityManagerNative extends Binder implements IActivityM
case GET_PACKAGE_PROCESS_STATE_TRANSACTION: {
data.enforceInterface(IActivityManager.descriptor);
String pkg = data.readString();
int res = getPackageProcessState(pkg);
String callingPackage = data.readString();
int res = getPackageProcessState(pkg, callingPackage);
reply.writeNoException();
reply.writeInt(res);
return true;
@@ -5868,11 +5869,13 @@ class ActivityManagerProxy implements IActivityManager
}
@Override
public int getPackageProcessState(String packageName) throws RemoteException {
public int getPackageProcessState(String packageName, String callingPackage)
throws RemoteException {
Parcel data = Parcel.obtain();
Parcel reply = Parcel.obtain();
data.writeInterfaceToken(IActivityManager.descriptor);
data.writeString(packageName);
data.writeString(callingPackage);
mRemote.transact(GET_PACKAGE_PROCESS_STATE_TRANSACTION, data, reply, 0);
reply.readException();
int res = reply.readInt();

View File

@@ -503,7 +503,8 @@ public interface IActivityManager extends IInterface {
public void updateLockTaskPackages(int userId, String[] packages) throws RemoteException;
public void updateDeviceOwner(String packageName) throws RemoteException;
public int getPackageProcessState(String packageName) throws RemoteException;
public int getPackageProcessState(String packageName, String callingPackage)
throws RemoteException;
public boolean setProcessMemoryTrimLevel(String process, int uid, int level)
throws RemoteException;

View File

@@ -3583,10 +3583,23 @@ public final class ActivityManagerService extends ActivityManagerNative
}
}
private boolean hasUsageStatsPermission(String callingPackage) {
final int mode = mAppOpsService.checkOperation(AppOpsManager.OP_GET_USAGE_STATS,
Binder.getCallingUid(), callingPackage);
if (mode == AppOpsManager.MODE_DEFAULT) {
return checkCallingPermission(Manifest.permission.PACKAGE_USAGE_STATS)
== PackageManager.PERMISSION_GRANTED;
}
return mode == AppOpsManager.MODE_ALLOWED;
}
@Override
public int getPackageProcessState(String packageName) {
enforceCallingPermission(android.Manifest.permission.GET_PACKAGE_IMPORTANCE,
"getPackageProcessState");
public int getPackageProcessState(String packageName, String callingPackage) {
if (!hasUsageStatsPermission(callingPackage)) {
enforceCallingPermission(android.Manifest.permission.GET_PACKAGE_IMPORTANCE,
"getPackageProcessState");
}
int procState = ActivityManager.PROCESS_STATE_NONEXISTENT;
synchronized (this) {
for (int i=mLruProcesses.size()-1; i>=0; i--) {