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

Commit cc3d8039 authored by Stanislav Zholnin's avatar Stanislav Zholnin Committed by android-build-merger
Browse files

Add logging of user actions in AppPermissionFragment. am: ca55f275 am: bd779442

am: c0591c48

Change-Id: I3b7b6030c1b4578ae5c752825825fbe7a922acf5
parents 1e3a993a c0591c48
Loading
Loading
Loading
Loading
+87 −0
Original line number Diff line number Diff line
@@ -18,6 +18,7 @@ package com.android.packageinstaller.permission.ui.handheld;

import static com.android.packageinstaller.Constants.EXTRA_SESSION_ID;
import static com.android.packageinstaller.Constants.INVALID_SESSION_ID;
import static com.android.packageinstaller.PermissionControllerStatsLog.APP_PERMISSION_FRAGMENT_ACTION_REPORTED;
import static com.android.packageinstaller.PermissionControllerStatsLog.APP_PERMISSION_FRAGMENT_VIEWED;

import static java.lang.annotation.RetentionPolicy.SOURCE;
@@ -71,7 +72,9 @@ import com.android.settingslib.RestrictedLockUtils.EnforcedAdmin;
import com.android.settingslib.widget.ActionBarShadowController;

import java.lang.annotation.Retention;
import java.util.ArrayList;
import java.util.List;
import java.util.Random;

/**
 * Show and manage a single permission group for an app.
@@ -423,6 +426,73 @@ public class AppPermissionFragment extends SettingsWithLargeHeader {
        return super.onOptionsItemSelected(item);
    }

    private ArrayList<PermissionState> createPermissionSnapshot() {
        ArrayList<PermissionState> permissionSnapshot = new ArrayList<>();
        ArrayList<Permission> permissions = mGroup.getPermissions();
        int numPermissions = permissions.size();

        for (int i = 0; i < numPermissions; i++) {
            Permission permission = permissions.get(i);
            permissionSnapshot.add(new PermissionState(permission.getName(),
                    permission.isGrantedIncludingAppOp()));
        }

        AppPermissionGroup permissionGroup = mGroup.getBackgroundPermissions();

        if (permissionGroup == null) {
            return permissionSnapshot;
        }

        permissions = mGroup.getPermissions();
        numPermissions = permissions.size();

        for (int i = 0; i < numPermissions; i++) {
            Permission permission = permissions.get(i);
            permissionSnapshot.add(new PermissionState(permission.getName(),
                    permission.isGrantedIncludingAppOp()));
        }

        return permissionSnapshot;
    }

    private void logPermissionChanges(ArrayList<PermissionState> previousPermissionSnapshot) {
        long changeId = new Random().nextLong();
        int numPermissions = previousPermissionSnapshot.size();
        long sessionId = getArguments().getLong(EXTRA_SESSION_ID, INVALID_SESSION_ID);

        for (int i = 0; i < numPermissions; i++) {
            PermissionState permissionState = previousPermissionSnapshot.get(i);
            boolean wasGranted = permissionState.permissionGranted;
            Permission permission = mGroup.getPermission(permissionState.permissionName);

            if (permission == null) {
                if (mGroup.getBackgroundPermissions() == null) {
                    continue;
                }
                permission = mGroup.getBackgroundPermissions().getPermission(
                        permissionState.permissionName);
            }

            boolean isGranted = permission.isGrantedIncludingAppOp();

            if (wasGranted != isGranted) {
                logAppPermissionFragmentActionReported(sessionId, changeId,
                        permissionState.permissionName, isGranted);
            }
        }
    }

    private void logAppPermissionFragmentActionReported(
            long sessionId, long changeId, String permissionName, boolean isGranted) {
        PermissionControllerStatsLog.write(APP_PERMISSION_FRAGMENT_ACTION_REPORTED, sessionId,
                changeId, mGroup.getApp().applicationInfo.uid, mGroup.getApp().packageName,
                permissionName, isGranted);
        Log.v(LOG_TAG, "Permission changed via UI with sessionId=" + sessionId + " changeId="
                + changeId + " uid=" + mGroup.getApp().applicationInfo.uid + " packageName="
                + mGroup.getApp().packageName + " permission="
                + permissionName + " isGranted=" + isGranted);
    }

    private void updateButtons() {
        Context context = getContext();
        if (context == null) {
@@ -806,6 +876,7 @@ public class AppPermissionFragment extends SettingsWithLargeHeader {
        }

        if (requestGrant) {
            ArrayList<PermissionState> stateBefore = createPermissionSnapshot();
            if ((changeTarget & CHANGE_FOREGROUND) != 0) {
                if (!mGroup.areRuntimePermissionsGranted()) {
                    SafetyNetLogger.logPermissionToggled(mGroup);
@@ -822,6 +893,7 @@ public class AppPermissionFragment extends SettingsWithLargeHeader {
                    mGroup.getBackgroundPermissions().grantRuntimePermissions(false);
                }
            }
            logPermissionChanges(stateBefore);
        } else {
            boolean showDefaultDenyDialog = false;

@@ -846,6 +918,7 @@ public class AppPermissionFragment extends SettingsWithLargeHeader {
                updateButtons();
                return false;
            } else {
                ArrayList<PermissionState> stateBefore = createPermissionSnapshot();
                if ((changeTarget & CHANGE_FOREGROUND) != 0
                        && mGroup.areRuntimePermissionsGranted()) {
                    if (mGroup.areRuntimePermissionsGranted()) {
@@ -864,6 +937,7 @@ public class AppPermissionFragment extends SettingsWithLargeHeader {
                        mGroup.getBackgroundPermissions().revokeRuntimePermissions(false);
                    }
                }
                logPermissionChanges(stateBefore);
            }
        }

@@ -920,6 +994,7 @@ public class AppPermissionFragment extends SettingsWithLargeHeader {
     */
    void onDenyAnyWay(@ChangeTarget int changeTarget) {
        boolean hasDefaultPermissions = false;
        ArrayList<PermissionState> stateBefore = createPermissionSnapshot();
        if ((changeTarget & CHANGE_FOREGROUND) != 0) {
            if (mGroup.areRuntimePermissionsGranted()) {
                SafetyNetLogger.logPermissionToggled(mGroup);
@@ -939,6 +1014,7 @@ public class AppPermissionFragment extends SettingsWithLargeHeader {
                        mGroup.getBackgroundPermissions().hasGrantedByDefaultPermission();
            }
        }
        logPermissionChanges(stateBefore);

        if (hasDefaultPermissions || !mGroup.doesSupportRuntimePermissions()) {
            mHasConfirmedRevoke = true;
@@ -992,4 +1068,15 @@ public class AppPermissionFragment extends SettingsWithLargeHeader {
            }
        }
    }

    private static class PermissionState {
        @NonNull public final String permissionName;
        public final boolean permissionGranted;

        PermissionState(@NonNull String permissionName, boolean permissionGranted) {
            this.permissionName = permissionName;
            this.permissionGranted = permissionGranted;
        }
    }

}