Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit b21a77fe authored by Adam Lesinski's avatar Adam Lesinski Committed by Android (Google) Code Review
Browse files

Merge "Allow callers holding PACKAGE_USAGE_STATS permission to call...

Merge "Allow callers holding PACKAGE_USAGE_STATS permission to call ActivityManager#getPackageImportance()" into mnc-dev
parents 9336eb5d c30454c1
Loading
Loading
Loading
Loading
+1 −1
Original line number Diff line number Diff line
@@ -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) {
+2 −1
Original line number Diff line number Diff line
@@ -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;
+5 −2
Original line number Diff line number Diff line
@@ -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();
+2 −1
Original line number Diff line number Diff line
@@ -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;
+16 −3
Original line number Diff line number Diff line
@@ -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) {
    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--) {