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

Commit fcef90c8 authored by Danny Lin's avatar Danny Lin
Browse files

PermissionController: Implement getPermissionUsages API

This partially reverts commit fe4bf10f.

This restores the implementation of onGetPermissionUsages from the
aforementioned commit and updates it to work with the permission usage
forward-port in commit a48389aa.

Implementing this API is necessary to fix the permissions dashboard
entry point being empty in Settings.

Change-Id: If5e0cba6c87c1f1c7ef2550aeac405ccba7b3227
parent 85a27e7f
Loading
Loading
Loading
Loading
+55 −5
Original line number Diff line number Diff line
@@ -49,7 +49,10 @@ import androidx.annotation.Nullable;

import com.android.permissioncontroller.PermissionControllerProto.PermissionControllerDumpProto;
import com.android.permissioncontroller.PermissionControllerStatsLog;
import com.android.permissioncontroller.permission.debug.PermissionUsages;
import com.android.permissioncontroller.permission.model.AppPermissionGroup;
import com.android.permissioncontroller.permission.model.AppPermissionUsage;
import com.android.permissioncontroller.permission.model.AppPermissionUsage.GroupUsage;
import com.android.permissioncontroller.permission.model.AppPermissions;
import com.android.permissioncontroller.permission.model.Permission;
import com.android.permissioncontroller.permission.model.livedatatypes.AppPermGroupUiInfo;
@@ -476,14 +479,61 @@ public final class PermissionControllerServiceImpl extends PermissionControllerL
                callback);
    }

    /**
     * Deprecated api call, only returns null.
     */
    @Override
    @Deprecated
    public void onGetPermissionUsages(boolean countSystem, long numMillis,
            @NonNull Consumer<List<RuntimePermissionUsageInfo>> callback) {
        callback.accept(null);
        AsyncTask.THREAD_POOL_EXECUTOR.execute(
                () -> callback.accept(onGetPermissionUsages(countSystem, numMillis)));
    }

    private @NonNull List<RuntimePermissionUsageInfo> onGetPermissionUsages(
            boolean countSystem, long numMillis) {
        ArrayMap<String, Integer> groupUsers = new ArrayMap<>();

        long curTime = System.currentTimeMillis();
        PermissionUsages usages = new PermissionUsages(this);
        long filterTimeBeginMillis = Math.max(System.currentTimeMillis() - numMillis, 0);
        usages.load(null, null, filterTimeBeginMillis, Long.MAX_VALUE,
                PermissionUsages.USAGE_FLAG_LAST | PermissionUsages.USAGE_FLAG_HISTORICAL, null,
                false, false, null, true);

        List<AppPermissionUsage> appPermissionUsages = usages.getUsages();
        int numApps = appPermissionUsages.size();
        for (int appNum = 0; appNum < numApps; appNum++) {
            AppPermissionUsage appPermissionUsage = appPermissionUsages.get(appNum);

            List<GroupUsage> appGroups = appPermissionUsage.getGroupUsages();
            int numGroups = appGroups.size();
            for (int groupNum = 0; groupNum < numGroups; groupNum++) {
                GroupUsage groupUsage = appGroups.get(groupNum);

                if (groupUsage.getLastAccessTime() < filterTimeBeginMillis) {
                    continue;
                }
                if (!Utils.shouldShowPermission(this, groupUsage.getGroup())) {
                    continue;
                }
                if (!countSystem && !Utils.isGroupOrBgGroupUserSensitive(groupUsage.getGroup())) {
                    continue;
                }

                String groupName = groupUsage.getGroup().getName();
                Integer numUsers = groupUsers.get(groupName);
                if (numUsers == null) {
                    groupUsers.put(groupName, 1);
                } else {
                    groupUsers.put(groupName, numUsers + 1);
                }
            }
        }

        List<RuntimePermissionUsageInfo> users = new ArrayList<>();
        int numGroups = groupUsers.size();
        for (int groupNum = 0; groupNum < numGroups; groupNum++) {
            users.add(new RuntimePermissionUsageInfo(groupUsers.keyAt(groupNum),
                    groupUsers.valueAt(groupNum)));
        }
        return users;
    }

    @Override