summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorStanislav Zholnin <zholnin@google.com>2019-05-23 18:50:02 +0100
committerStanislav Zholnin <zholnin@google.com>2019-06-21 18:13:53 +0100
commitca55f2759fc40596bec8afa3f79b9e784d4bf31f (patch)
tree0be4a87543de68491774531398465a34ca98a8c6
parent44237b47bddeb8c512e82ecd0e71402dab187ed6 (diff)
downloadandroid_packages_apps_PackageInstaller-ca55f2759fc40596bec8afa3f79b9e784d4bf31f.tar.gz
android_packages_apps_PackageInstaller-ca55f2759fc40596bec8afa3f79b9e784d4bf31f.tar.bz2
android_packages_apps_PackageInstaller-ca55f2759fc40596bec8afa3f79b9e784d4bf31f.zip
Add logging of user actions in AppPermissionFragment.
Test: make statsd_testdrive && ./out/host/linux-x86/bin/statsd_testdrive -p com.google.android.permissioncontroller 215 Bug:133401502 Change-Id: Ic586a22e676cefbf67a9f7e638655fad58bd5613
-rw-r--r--src/com/android/packageinstaller/permission/ui/handheld/AppPermissionFragment.java87
1 files changed, 87 insertions, 0 deletions
diff --git a/src/com/android/packageinstaller/permission/ui/handheld/AppPermissionFragment.java b/src/com/android/packageinstaller/permission/ui/handheld/AppPermissionFragment.java
index bca59da2..214d7202 100644
--- a/src/com/android/packageinstaller/permission/ui/handheld/AppPermissionFragment.java
+++ b/src/com/android/packageinstaller/permission/ui/handheld/AppPermissionFragment.java
@@ -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;
@@ -69,7 +70,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.
@@ -334,6 +337,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) {
@@ -717,6 +787,7 @@ public class AppPermissionFragment extends SettingsWithLargeHeader {
}
if (requestGrant) {
+ ArrayList<PermissionState> stateBefore = createPermissionSnapshot();
if ((changeTarget & CHANGE_FOREGROUND) != 0) {
if (!mGroup.areRuntimePermissionsGranted()) {
SafetyNetLogger.logPermissionToggled(mGroup);
@@ -733,6 +804,7 @@ public class AppPermissionFragment extends SettingsWithLargeHeader {
mGroup.getBackgroundPermissions().grantRuntimePermissions(false);
}
}
+ logPermissionChanges(stateBefore);
} else {
boolean showDefaultDenyDialog = false;
@@ -757,6 +829,7 @@ public class AppPermissionFragment extends SettingsWithLargeHeader {
updateButtons();
return false;
} else {
+ ArrayList<PermissionState> stateBefore = createPermissionSnapshot();
if ((changeTarget & CHANGE_FOREGROUND) != 0
&& mGroup.areRuntimePermissionsGranted()) {
if (mGroup.areRuntimePermissionsGranted()) {
@@ -775,6 +848,7 @@ public class AppPermissionFragment extends SettingsWithLargeHeader {
mGroup.getBackgroundPermissions().revokeRuntimePermissions(false);
}
}
+ logPermissionChanges(stateBefore);
}
}
@@ -831,6 +905,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);
@@ -850,6 +925,7 @@ public class AppPermissionFragment extends SettingsWithLargeHeader {
mGroup.getBackgroundPermissions().hasGrantedByDefaultPermission();
}
}
+ logPermissionChanges(stateBefore);
if (hasDefaultPermissions || !mGroup.doesSupportRuntimePermissions()) {
mHasConfirmedRevoke = true;
@@ -903,4 +979,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;
+ }
+ }
+
}