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

Commit 5a5ca79a authored by TreeHugger Robot's avatar TreeHugger Robot Committed by Android (Google) Code Review
Browse files

Merge "Link PACKAGE_USAGE_STATS with LOADER_USAGE_STATS"

parents 75906f35 b6aaed1b
Loading
Loading
Loading
Loading
+11 −1
Original line number Diff line number Diff line
@@ -61,17 +61,27 @@ public abstract class AppStateAppOpsBridge extends AppStateBaseBridge {
        this(context, appState, callback, appOpsOpCode, permissions,
                AppGlobals.getPackageManager());
    }
    AppStateAppOpsBridge(Context context, ApplicationsState appState, Callback callback,
            int[] appOpsOpCodes, String[] permissions) {
        this(context, appState, callback, appOpsOpCodes, permissions,
                AppGlobals.getPackageManager());
    }

    @VisibleForTesting
    AppStateAppOpsBridge(Context context, ApplicationsState appState, Callback callback,
            int appOpsOpCode, String[] permissions, IPackageManager packageManager) {
        this(context, appState, callback, new int[] {appOpsOpCode}, permissions,
                packageManager);
    }
    AppStateAppOpsBridge(Context context, ApplicationsState appState, Callback callback,
            int[] appOpsOpCodes, String[] permissions, IPackageManager packageManager) {
        super(appState, callback);
        mContext = context;
        mIPackageManager = packageManager;
        mUserManager = UserManager.get(context);
        mProfiles = mUserManager.getUserProfiles();
        mAppOpsManager = (AppOpsManager) context.getSystemService(Context.APP_OPS_SERVICE);
        mAppOpsOpCodes = new int[] {appOpsOpCode};
        mAppOpsOpCodes = appOpsOpCodes;
        mPermissions = permissions;
    }

+11 −4
Original line number Diff line number Diff line
@@ -33,13 +33,20 @@ public class AppStateUsageBridge extends AppStateAppOpsBridge {
    private static final String TAG = "AppStateUsageBridge";

    private static final String PM_USAGE_STATS = Manifest.permission.PACKAGE_USAGE_STATS;
    private static final int APP_OPS_OP_CODE = AppOpsManager.OP_GET_USAGE_STATS;
    private static final String[] PM_PERMISSION = {
            PM_USAGE_STATS
    private static final String PM_LOADER_STATS = Manifest.permission.LOADER_USAGE_STATS;
    private static final int APP_OPS_USAGE_STATS = AppOpsManager.OP_GET_USAGE_STATS;
    private static final int APP_OPS_LOADER_STATS = AppOpsManager.OP_LOADER_USAGE_STATS;
    private static final int[] APP_OPS_OP_CODES = {
            APP_OPS_USAGE_STATS,
            APP_OPS_LOADER_STATS,
    };
    private static final String[] PM_PERMISSIONS = {
            PM_USAGE_STATS,
            PM_LOADER_STATS,
    };

    public AppStateUsageBridge(Context context, ApplicationsState appState, Callback callback) {
        super(context, appState, callback, APP_OPS_OP_CODE, PM_PERMISSION);
        super(context, appState, callback, APP_OPS_OP_CODES, PM_PERMISSIONS);
    }

    @Override
+24 −2
Original line number Diff line number Diff line
@@ -15,6 +15,10 @@
 */
package com.android.settings.applications;

import static android.app.AppOpsManager.OP_GET_USAGE_STATS;
import static android.app.AppOpsManager.OP_LOADER_USAGE_STATS;

import android.Manifest;
import android.app.AppOpsManager;
import android.app.admin.DevicePolicyManager;
import android.app.settings.SettingsEnums;
@@ -104,10 +108,28 @@ public class UsageAccessDetails extends AppInfoWithHeader implements OnPreferenc
        return false;
    }

    private static boolean doesAnyPermissionMatch(String permissionToMatch, String[] permissions) {
        for (String permission : permissions) {
            if (permissionToMatch.equals(permission)) {
                return true;
            }
        }
        return false;
    }

    private void setHasAccess(boolean newState) {
        logSpecialPermissionChange(newState, mPackageName);
        mAppOpsManager.setMode(AppOpsManager.OP_GET_USAGE_STATS, mPackageInfo.applicationInfo.uid,
                mPackageName, newState ? AppOpsManager.MODE_ALLOWED : AppOpsManager.MODE_IGNORED);

        final int newAppOpMode = newState ? AppOpsManager.MODE_ALLOWED : AppOpsManager.MODE_IGNORED;
        final int uid = mPackageInfo.applicationInfo.uid;
        if (doesAnyPermissionMatch(Manifest.permission.PACKAGE_USAGE_STATS,
                mUsageState.packageInfo.requestedPermissions)) {
            mAppOpsManager.setMode(OP_GET_USAGE_STATS, uid, mPackageName, newAppOpMode);
        }
        if (doesAnyPermissionMatch(Manifest.permission.LOADER_USAGE_STATS,
                mUsageState.packageInfo.requestedPermissions)) {
            mAppOpsManager.setMode(OP_LOADER_USAGE_STATS, uid, mPackageName, newAppOpMode);
        }
    }

    @VisibleForTesting