summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorandroid-build-team Robot <android-build-team-robot@google.com>2019-06-22 23:13:57 +0000
committerandroid-build-team Robot <android-build-team-robot@google.com>2019-06-22 23:13:57 +0000
commitefe804a59b094d9e0767b400b1b63e6eece9ef20 (patch)
tree0be4a87543de68491774531398465a34ca98a8c6
parentc74f3ae3424873c6578812501ad4a3415e8fa1bf (diff)
parentca55f2759fc40596bec8afa3f79b9e784d4bf31f (diff)
downloadandroid_packages_apps_PackageInstaller-efe804a59b094d9e0767b400b1b63e6eece9ef20.tar.gz
android_packages_apps_PackageInstaller-efe804a59b094d9e0767b400b1b63e6eece9ef20.tar.bz2
android_packages_apps_PackageInstaller-efe804a59b094d9e0767b400b1b63e6eece9ef20.zip
Snap for 5681426 from ca55f2759fc40596bec8afa3f79b9e784d4bf31f to qt-release
Change-Id: I324742a39aed80379a3b94ac683a3eb0f94bcc0c
-rw-r--r--AndroidManifest.xml2
-rw-r--r--res/values/overlayable.xml6
-rw-r--r--src/com/android/packageinstaller/permission/service/LocationAccessCheck.java44
-rw-r--r--src/com/android/packageinstaller/permission/service/RuntimePermissionsUpgradeController.java10
-rw-r--r--src/com/android/packageinstaller/permission/ui/handheld/AppPermissionFragment.java111
-rw-r--r--src/com/android/packageinstaller/permission/ui/handheld/AppPermissionsFragment.java91
-rw-r--r--src/com/android/packageinstaller/permission/ui/handheld/PermissionAppsFragment.java44
7 files changed, 269 insertions, 39 deletions
diff --git a/AndroidManifest.xml b/AndroidManifest.xml
index 7a421e46..9c4bf5bf 100644
--- a/AndroidManifest.xml
+++ b/AndroidManifest.xml
@@ -39,8 +39,6 @@
<uses-permission android:name="android.permission.OPEN_ACCESSIBILITY_DETAILS_SETTINGS" />
<uses-permission android:name="android.permission.READ_PRIVILEGED_PHONE_STATE" />
<uses-permission android:name="android.permission.SUBSTITUTE_NOTIFICATION_APP_NAME" />
- <!-- This permission will be removed in R. -->
- <uses-permission android:name="android.permission.START_ACTIVITIES_FROM_BACKGROUND" />
<uses-sdk android:minSdkVersion="29" android:targetSdkVersion="29" />
diff --git a/res/values/overlayable.xml b/res/values/overlayable.xml
index 759dcf47..82708ed7 100644
--- a/res/values/overlayable.xml
+++ b/res/values/overlayable.xml
@@ -16,10 +16,16 @@
<resources>
+ <!-- TODO(evanseverson) rename this overlayable -->
<overlayable name="PermissionControllerStyles">
<policy type="product|system|vendor">
+ <!-- START HELP LINKS -->
+ <item type="string" name="help_app_permissions" />
+ <item type="string" name="help_permission_usage" />
+ <!-- END HELP LINKS -->
+
<!-- START PERMISSION GRANT DIALOG -->
<item type="style" name="PermissionGrantScrollView" />
<item type="style" name="PermissionGrantSingleton" />
diff --git a/src/com/android/packageinstaller/permission/service/LocationAccessCheck.java b/src/com/android/packageinstaller/permission/service/LocationAccessCheck.java
index 30911e17..727808bc 100644
--- a/src/com/android/packageinstaller/permission/service/LocationAccessCheck.java
+++ b/src/com/android/packageinstaller/permission/service/LocationAccessCheck.java
@@ -48,6 +48,10 @@ import static com.android.packageinstaller.Constants.LOCATION_ACCESS_CHECK_NOTIF
import static com.android.packageinstaller.Constants.PERIODIC_LOCATION_ACCESS_CHECK_JOB_ID;
import static com.android.packageinstaller.Constants.PERMISSION_REMINDER_CHANNEL_ID;
import static com.android.packageinstaller.Constants.PREFERENCES_FILE;
+import static com.android.packageinstaller.PermissionControllerStatsLog.LOCATION_ACCESS_CHECK_NOTIFICATION_ACTION;
+import static com.android.packageinstaller.PermissionControllerStatsLog.LOCATION_ACCESS_CHECK_NOTIFICATION_ACTION__RESULT__NOTIFICATION_CLICKED;
+import static com.android.packageinstaller.PermissionControllerStatsLog.LOCATION_ACCESS_CHECK_NOTIFICATION_ACTION__RESULT__NOTIFICATION_DECLINED;
+import static com.android.packageinstaller.PermissionControllerStatsLog.LOCATION_ACCESS_CHECK_NOTIFICATION_ACTION__RESULT__NOTIFICATION_PRESENTED;
import static com.android.packageinstaller.permission.utils.Utils.OS_PKG;
import static com.android.packageinstaller.permission.utils.Utils.getParcelableExtraSafe;
import static com.android.packageinstaller.permission.utils.Utils.getParentUserContext;
@@ -96,6 +100,7 @@ import androidx.annotation.Nullable;
import androidx.annotation.WorkerThread;
import androidx.core.util.Preconditions;
+import com.android.packageinstaller.PermissionControllerStatsLog;
import com.android.packageinstaller.permission.model.AppPermissionGroup;
import com.android.packageinstaller.permission.ui.AppPermissionActivity;
import com.android.permissioncontroller.R;
@@ -513,21 +518,23 @@ public class LocationAccessCheck {
NotificationManager notificationManager = getSystemServiceSafe(mContext,
NotificationManager.class, user);
- Intent deleteIntent = new Intent(mContext, NotificationDeleteHandler.class);
- deleteIntent.putExtra(EXTRA_PACKAGE_NAME, pkgName);
- deleteIntent.putExtra(EXTRA_USER, user);
- deleteIntent.setFlags(FLAG_RECEIVER_FOREGROUND);
-
long sessionId = INVALID_SESSION_ID;
-
while (sessionId == INVALID_SESSION_ID) {
sessionId = new Random().nextLong();
}
+ Intent deleteIntent = new Intent(mContext, NotificationDeleteHandler.class);
+ deleteIntent.putExtra(EXTRA_PACKAGE_NAME, pkgName);
+ deleteIntent.putExtra(EXTRA_SESSION_ID, sessionId);
+ deleteIntent.putExtra(EXTRA_UID, pkg.applicationInfo.uid);
+ deleteIntent.putExtra(EXTRA_USER, user);
+ deleteIntent.setFlags(FLAG_RECEIVER_FOREGROUND);
+
Intent clickIntent = new Intent(mContext, NotificationClickHandler.class);
clickIntent.putExtra(EXTRA_PACKAGE_NAME, pkgName);
- clickIntent.putExtra(EXTRA_USER, user);
clickIntent.putExtra(EXTRA_SESSION_ID, sessionId);
+ clickIntent.putExtra(EXTRA_UID, pkg.applicationInfo.uid);
+ clickIntent.putExtra(EXTRA_USER, user);
clickIntent.setFlags(FLAG_RECEIVER_FOREGROUND);
CharSequence appName = getNotificationAppName();
@@ -559,6 +566,12 @@ public class LocationAccessCheck {
if (DEBUG) Log.i(LOG_TAG, "Notified " + pkgName);
+ PermissionControllerStatsLog.write(LOCATION_ACCESS_CHECK_NOTIFICATION_ACTION, sessionId,
+ pkg.applicationInfo.uid, pkgName,
+ LOCATION_ACCESS_CHECK_NOTIFICATION_ACTION__RESULT__NOTIFICATION_PRESENTED);
+ Log.v(LOG_TAG, "Location access check notification shown with sessionId=" + sessionId + ""
+ + " uid=" + pkg.applicationInfo.uid + " pkgName=" + pkgName);
+
mSharedPrefs.edit().putLong(KEY_LAST_LOCATION_ACCESS_NOTIFICATION_SHOWN,
currentTimeMillis()).apply();
}
@@ -809,6 +822,15 @@ public class LocationAccessCheck {
public void onReceive(Context context, Intent intent) {
String pkg = getStringExtraSafe(intent, EXTRA_PACKAGE_NAME);
UserHandle user = getParcelableExtraSafe(intent, EXTRA_USER);
+ long sessionId = intent.getLongExtra(EXTRA_SESSION_ID, INVALID_SESSION_ID);
+ int uid = intent.getIntExtra(EXTRA_UID, 0);
+
+ PermissionControllerStatsLog.write(LOCATION_ACCESS_CHECK_NOTIFICATION_ACTION, sessionId,
+ uid, pkg,
+ LOCATION_ACCESS_CHECK_NOTIFICATION_ACTION__RESULT__NOTIFICATION_DECLINED);
+ Log.v(LOG_TAG,
+ "Location access check notification declined with sessionId=" + sessionId + ""
+ + " uid=" + uid + " pkgName=" + pkg);
new LocationAccessCheck(context, null).markAsNotified(pkg, user);
}
@@ -822,10 +844,18 @@ public class LocationAccessCheck {
public void onReceive(Context context, Intent intent) {
String pkg = getStringExtraSafe(intent, EXTRA_PACKAGE_NAME);
UserHandle user = getParcelableExtraSafe(intent, EXTRA_USER);
+ int uid = intent.getIntExtra(EXTRA_UID, 0);
long sessionId = intent.getLongExtra(EXTRA_SESSION_ID, INVALID_SESSION_ID);
new LocationAccessCheck(context, null).markAsNotified(pkg, user);
+ PermissionControllerStatsLog.write(LOCATION_ACCESS_CHECK_NOTIFICATION_ACTION, sessionId,
+ uid, pkg,
+ LOCATION_ACCESS_CHECK_NOTIFICATION_ACTION__RESULT__NOTIFICATION_CLICKED);
+ Log.v(LOG_TAG,
+ "Location access check notification clicked with sessionId=" + sessionId + ""
+ + " uid=" + uid + " pkgName=" + pkg);
+
Intent manageAppPermission = new Intent(context, AppPermissionActivity.class);
manageAppPermission.addFlags(FLAG_ACTIVITY_NEW_TASK | FLAG_ACTIVITY_MULTIPLE_TASK);
manageAppPermission.putExtra(EXTRA_PERMISSION_NAME, ACCESS_FINE_LOCATION);
diff --git a/src/com/android/packageinstaller/permission/service/RuntimePermissionsUpgradeController.java b/src/com/android/packageinstaller/permission/service/RuntimePermissionsUpgradeController.java
index f3a94997..bac015a6 100644
--- a/src/com/android/packageinstaller/permission/service/RuntimePermissionsUpgradeController.java
+++ b/src/com/android/packageinstaller/permission/service/RuntimePermissionsUpgradeController.java
@@ -84,8 +84,6 @@ class RuntimePermissionsUpgradeController {
final int appCount = apps.size();
final boolean sdkUpgradedFromP;
- boolean isFreshInstall = false;
-
if (currentVersion <= -1) {
Log.i(LOG_TAG, "Upgrading from Android P");
@@ -97,10 +95,6 @@ class RuntimePermissionsUpgradeController {
}
if (currentVersion == 0) {
- if (!sdkUpgradedFromP) {
- isFreshInstall = true;
- }
-
Log.i(LOG_TAG, "Grandfathering SMS and CallLog permissions");
final List<String> smsPermissions = Utils.getPlatformPermissionNamesOfGroup(
@@ -189,7 +183,7 @@ class RuntimePermissionsUpgradeController {
}
if (currentVersion == 6) {
- if (!isFreshInstall || sdkUpgradedFromP) {
+ if (sdkUpgradedFromP) {
Log.i(LOG_TAG, "Expanding location permissions");
for (int i = 0; i < appCount; i++) {
@@ -211,7 +205,7 @@ class RuntimePermissionsUpgradeController {
if (group.areRuntimePermissionsGranted()
&& bgGroup != null
- && !bgGroup.isSystemFixed()
+ && !bgGroup.isUserSet() && !bgGroup.isSystemFixed()
&& !bgGroup.isPolicyFixed()) {
bgGroup.grantRuntimePermissions(group.isUserFixed());
diff --git a/src/com/android/packageinstaller/permission/ui/handheld/AppPermissionFragment.java b/src/com/android/packageinstaller/permission/ui/handheld/AppPermissionFragment.java
index b2178c5a..214d7202 100644
--- a/src/com/android/packageinstaller/permission/ui/handheld/AppPermissionFragment.java
+++ b/src/com/android/packageinstaller/permission/ui/handheld/AppPermissionFragment.java
@@ -16,6 +16,11 @@
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;
import android.app.ActionBar;
@@ -51,7 +56,7 @@ import androidx.core.widget.NestedScrollView;
import androidx.fragment.app.DialogFragment;
import androidx.fragment.app.Fragment;
-import com.android.packageinstaller.Constants;
+import com.android.packageinstaller.PermissionControllerStatsLog;
import com.android.packageinstaller.permission.model.AppPermissionGroup;
import com.android.packageinstaller.permission.model.Permission;
import com.android.packageinstaller.permission.ui.AppPermissionActivity;
@@ -65,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.
@@ -123,7 +130,7 @@ public class AppPermissionFragment extends SettingsWithLargeHeader {
}
arguments.putParcelable(Intent.EXTRA_USER, userHandle);
arguments.putString(AppPermissionActivity.EXTRA_CALLER_NAME, caller);
- arguments.putLong(Constants.EXTRA_SESSION_ID, sessionId);
+ arguments.putLong(EXTRA_SESSION_ID, sessionId);
fragment.setArguments(arguments);
return fragment;
}
@@ -145,6 +152,7 @@ public class AppPermissionFragment extends SettingsWithLargeHeader {
getActivity().setTitle(
getPreferenceManager().getContext().getString(R.string.app_permission_title,
mGroup.getFullLabel()));
+ logAppPermissionFragmentViewed();
}
}
@@ -196,7 +204,7 @@ public class AppPermissionFragment extends SettingsWithLargeHeader {
context.getString(R.string.app_permission_header, mGroup.getFullLabel()));
root.requireViewById(R.id.usage_summary).setVisibility(View.GONE);
- long sessionId = getArguments().getLong(Constants.EXTRA_SESSION_ID);
+ long sessionId = getArguments().getLong(EXTRA_SESSION_ID);
TextView footer1Link = root.requireViewById(R.id.footer_link_1);
footer1Link.setText(context.getString(R.string.app_permission_footer_app_permissions_link,
@@ -205,7 +213,7 @@ public class AppPermissionFragment extends SettingsWithLargeHeader {
UserHandle user = UserHandle.getUserHandleForUid(mGroup.getApp().applicationInfo.uid);
Intent intent = new Intent(Intent.ACTION_MANAGE_APP_PERMISSIONS);
intent.putExtra(Intent.EXTRA_PACKAGE_NAME, mGroup.getApp().packageName);
- intent.putExtra(Constants.EXTRA_SESSION_ID, sessionId);
+ intent.putExtra(EXTRA_SESSION_ID, sessionId);
intent.putExtra(Intent.EXTRA_USER, user);
context.startActivity(intent);
});
@@ -215,7 +223,7 @@ public class AppPermissionFragment extends SettingsWithLargeHeader {
footer2Link.setOnClickListener((v) -> {
Intent intent = new Intent(Intent.ACTION_MANAGE_PERMISSION_APPS);
intent.putExtra(Intent.EXTRA_PERMISSION_NAME, mGroup.getName());
- intent.putExtra(Constants.EXTRA_SESSION_ID, sessionId);
+ intent.putExtra(EXTRA_SESSION_ID, sessionId);
context.startActivity(intent);
});
@@ -295,6 +303,15 @@ public class AppPermissionFragment extends SettingsWithLargeHeader {
updateButtons();
}
+ void logAppPermissionFragmentViewed() {
+ long sessionId = getArguments().getLong(EXTRA_SESSION_ID, INVALID_SESSION_ID);
+ PermissionControllerStatsLog.write(APP_PERMISSION_FRAGMENT_VIEWED, sessionId,
+ mGroup.getApp().applicationInfo.uid, mGroup.getApp().packageName, mGroup.getName());
+ Log.v(LOG_TAG, "AppPermission fragment viewed with sessionId=" + sessionId + " uid="
+ + mGroup.getApp().applicationInfo.uid + " packageName="
+ + mGroup.getApp().packageName + " permissionGroupName=" + mGroup.getName());
+ }
+
@Override
public void onStop() {
super.onStop();
@@ -320,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) {
@@ -703,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);
@@ -719,6 +804,7 @@ public class AppPermissionFragment extends SettingsWithLargeHeader {
mGroup.getBackgroundPermissions().grantRuntimePermissions(false);
}
}
+ logPermissionChanges(stateBefore);
} else {
boolean showDefaultDenyDialog = false;
@@ -743,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()) {
@@ -761,6 +848,7 @@ public class AppPermissionFragment extends SettingsWithLargeHeader {
mGroup.getBackgroundPermissions().revokeRuntimePermissions(false);
}
}
+ logPermissionChanges(stateBefore);
}
}
@@ -817,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);
@@ -836,6 +925,7 @@ public class AppPermissionFragment extends SettingsWithLargeHeader {
mGroup.getBackgroundPermissions().hasGrantedByDefaultPermission();
}
}
+ logPermissionChanges(stateBefore);
if (hasDefaultPermissions || !mGroup.doesSupportRuntimePermissions()) {
mHasConfirmedRevoke = true;
@@ -889,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;
+ }
+ }
+
}
diff --git a/src/com/android/packageinstaller/permission/ui/handheld/AppPermissionsFragment.java b/src/com/android/packageinstaller/permission/ui/handheld/AppPermissionsFragment.java
index f427b295..91c08389 100644
--- a/src/com/android/packageinstaller/permission/ui/handheld/AppPermissionsFragment.java
+++ b/src/com/android/packageinstaller/permission/ui/handheld/AppPermissionsFragment.java
@@ -1,23 +1,27 @@
/*
-* Copyright (C) 2015 The Android Open Source Project
-*
-* Licensed under the Apache License, Version 2.0 (the "License");
-* you may not use this file except in compliance with the License.
-* You may obtain a copy of the License at
-*
-* http://www.apache.org/licenses/LICENSE-2.0
-*
-* Unless required by applicable law or agreed to in writing, software
-* distributed under the License is distributed on an "AS IS" BASIS,
-* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-* See the License for the specific language governing permissions and
-* limitations under the License.
-*/
+ * Copyright (C) 2015 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
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_PERMISSIONS_FRAGMENT_VIEWED;
+import static com.android.packageinstaller.PermissionControllerStatsLog.APP_PERMISSIONS_FRAGMENT_VIEWED__CATEGORY__ALLOWED;
+import static com.android.packageinstaller.PermissionControllerStatsLog.APP_PERMISSIONS_FRAGMENT_VIEWED__CATEGORY__ALLOWED_FOREGROUND;
+import static com.android.packageinstaller.PermissionControllerStatsLog.APP_PERMISSIONS_FRAGMENT_VIEWED__CATEGORY__DENIED;
import android.app.ActionBar;
import android.app.Activity;
@@ -44,6 +48,7 @@ import androidx.preference.Preference;
import androidx.preference.PreferenceCategory;
import androidx.preference.PreferenceScreen;
+import com.android.packageinstaller.PermissionControllerStatsLog;
import com.android.packageinstaller.permission.model.AppPermissionGroup;
import com.android.packageinstaller.permission.model.AppPermissions;
import com.android.packageinstaller.permission.utils.Utils;
@@ -52,6 +57,7 @@ import com.android.settingslib.HelpUtils;
import java.text.Collator;
import java.util.ArrayList;
+import java.util.Random;
/**
* Show and manage permission groups for an app.
@@ -63,6 +69,9 @@ public final class AppPermissionsFragment extends SettingsWithLargeHeader {
private static final String LOG_TAG = "ManagePermsFragment";
static final String EXTRA_HIDE_INFO_BUTTON = "hideInfoButton";
+ static final String PREFERENCE_ALLOWED = "allowed";
+ static final String PREFERENCE_DENIED = "denied";
+ static final String PREFERENCE_ALLOWED_FOREGROUND = "allowed_foreground";
private AppPermissions mAppPermissions;
private PreferenceScreen mExtraScreen;
@@ -121,6 +130,7 @@ public final class AppPermissionsFragment extends SettingsWithLargeHeader {
mCollator = Collator.getInstance(
getContext().getResources().getConfiguration().getLocales().get(0));
updatePreferences();
+ logAppPermissionsFragmentView();
}
@Override
@@ -197,13 +207,13 @@ public final class AppPermissionsFragment extends SettingsWithLargeHeader {
return;
}
- PreferenceCategory allowed = (PreferenceCategory) findPreference("allowed");
- PreferenceCategory denied = (PreferenceCategory) findPreference("denied");
+ PreferenceCategory allowed = (PreferenceCategory) findPreference(PREFERENCE_ALLOWED);
+ PreferenceCategory denied = (PreferenceCategory) findPreference(PREFERENCE_DENIED);
allowed.removeAll();
denied.removeAll();
- findPreference("allowed_foreground").setVisible(false);
+ findPreference(PREFERENCE_ALLOWED_FOREGROUND).setVisible(false);
if (mExtraScreen != null) {
mExtraScreen.removeAll();
@@ -292,6 +302,53 @@ public final class AppPermissionsFragment extends SettingsWithLargeHeader {
setLoading(false /* loading */, true /* animate */);
}
+ private void logAppPermissionsFragmentView() {
+ Context context = getPreferenceManager().getContext();
+ if (context == null) {
+ return;
+ }
+ String permissionSubtitleOnlyInForeground =
+ context.getString(R.string.permission_subtitle_only_in_foreground);
+
+
+ long sessionId = getArguments().getLong(EXTRA_SESSION_ID, INVALID_SESSION_ID);
+ long viewId = new Random().nextLong();
+
+ PreferenceCategory allowed = findPreference(PREFERENCE_ALLOWED);
+
+ int numAllowed = allowed.getPreferenceCount();
+ for (int i = 0; i < numAllowed; i++) {
+ Preference preference = allowed.getPreference(i);
+
+ int category = APP_PERMISSIONS_FRAGMENT_VIEWED__CATEGORY__ALLOWED;
+ if (permissionSubtitleOnlyInForeground.contentEquals(preference.getSummary())) {
+ category = APP_PERMISSIONS_FRAGMENT_VIEWED__CATEGORY__ALLOWED_FOREGROUND;
+ }
+
+ logAppPermissionsFragmentViewEntry(sessionId, viewId, preference.getKey(), category);
+ }
+
+ PreferenceCategory denied = findPreference(PREFERENCE_DENIED);
+
+ int numDenied = denied.getPreferenceCount();
+ for (int i = 0; i < numDenied; i++) {
+ Preference preference = denied.getPreference(i);
+ logAppPermissionsFragmentViewEntry(sessionId, viewId, preference.getKey(),
+ APP_PERMISSIONS_FRAGMENT_VIEWED__CATEGORY__DENIED);
+ }
+ }
+
+ private void logAppPermissionsFragmentViewEntry(
+ long sessionId, long viewId, String permissionGroupName, int category) {
+ PermissionControllerStatsLog.write(APP_PERMISSIONS_FRAGMENT_VIEWED, sessionId, viewId,
+ permissionGroupName, mAppPermissions.getPackageInfo().applicationInfo.uid,
+ mAppPermissions.getPackageInfo().packageName, category);
+ Log.v(LOG_TAG, "AppPermissionFragment view logged with sessionId=" + sessionId + " viewId="
+ + viewId + " permissionGroupName=" + permissionGroupName + " uid="
+ + mAppPermissions.getPackageInfo().applicationInfo.uid + " packageName="
+ + mAppPermissions.getPackageInfo().packageName + " category=" + category);
+ }
+
private static PackageInfo getPackageInfo(Activity activity, @NonNull String packageName,
@NonNull UserHandle userHandle) {
try {
diff --git a/src/com/android/packageinstaller/permission/ui/handheld/PermissionAppsFragment.java b/src/com/android/packageinstaller/permission/ui/handheld/PermissionAppsFragment.java
index f8229f3e..304aa38a 100644
--- a/src/com/android/packageinstaller/permission/ui/handheld/PermissionAppsFragment.java
+++ b/src/com/android/packageinstaller/permission/ui/handheld/PermissionAppsFragment.java
@@ -17,6 +17,11 @@ 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.PERMISSION_APPS_FRAGMENT_VIEWED;
+import static com.android.packageinstaller.PermissionControllerStatsLog.PERMISSION_APPS_FRAGMENT_VIEWED__CATEGORY__ALLOWED;
+import static com.android.packageinstaller.PermissionControllerStatsLog.PERMISSION_APPS_FRAGMENT_VIEWED__CATEGORY__ALLOWED_FOREGROUND;
+import static com.android.packageinstaller.PermissionControllerStatsLog.PERMISSION_APPS_FRAGMENT_VIEWED__CATEGORY__DENIED;
+import static com.android.packageinstaller.PermissionControllerStatsLog.PERMISSION_APPS_FRAGMENT_VIEWED__CATEGORY__UNDEFINED;
import android.app.ActionBar;
import android.content.Context;
@@ -24,6 +29,7 @@ import android.content.Intent;
import android.graphics.drawable.Drawable;
import android.os.Bundle;
import android.util.ArrayMap;
+import android.util.Log;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.MenuItem;
@@ -37,6 +43,7 @@ import androidx.preference.PreferenceScreen;
import androidx.preference.SwitchPreferenceCompat;
import com.android.packageinstaller.DeviceUtils;
+import com.android.packageinstaller.PermissionControllerStatsLog;
import com.android.packageinstaller.permission.model.AppPermissionGroup;
import com.android.packageinstaller.permission.model.PermissionApps;
import com.android.packageinstaller.permission.model.PermissionApps.Callback;
@@ -48,6 +55,7 @@ import com.android.settingslib.HelpUtils;
import java.text.Collator;
import java.util.ArrayList;
import java.util.Map;
+import java.util.Random;
/**
* Show and manage apps which request a single permission group.
@@ -57,11 +65,16 @@ import java.util.Map;
public final class PermissionAppsFragment extends SettingsWithLargeHeader implements Callback {
private static final String KEY_SHOW_SYSTEM_PREFS = "_showSystem";
+ private static final String CREATION_LOGGED_SYSTEM_PREFS = "_creationLogged";
private static final String KEY_FOOTER = "_footer";
+ private static final String LOG_TAG = "PermissionAppsFragment";
private static final String SHOW_SYSTEM_KEY = PermissionAppsFragment.class.getName()
+ KEY_SHOW_SYSTEM_PREFS;
+ private static final String CREATION_LOGGED = PermissionAppsFragment.class.getName()
+ + CREATION_LOGGED_SYSTEM_PREFS;
+
/**
* @return A new fragment
*/
@@ -84,6 +97,7 @@ public final class PermissionAppsFragment extends SettingsWithLargeHeader implem
private PreferenceScreen mExtraScreen;
private boolean mShowSystem;
+ private boolean mCreationLogged;
private boolean mHasSystemApps;
private MenuItem mShowSystemMenu;
private MenuItem mHideSystemMenu;
@@ -98,6 +112,7 @@ public final class PermissionAppsFragment extends SettingsWithLargeHeader implem
if (savedInstanceState != null) {
mShowSystem = savedInstanceState.getBoolean(SHOW_SYSTEM_KEY);
+ mCreationLogged = savedInstanceState.getBoolean(CREATION_LOGGED);
}
setLoading(true /* loading */, false /* animate */);
@@ -122,6 +137,7 @@ public final class PermissionAppsFragment extends SettingsWithLargeHeader implem
super.onSaveInstanceState(outState);
outState.putBoolean(SHOW_SYSTEM_KEY, mShowSystem);
+ outState.putBoolean(CREATION_LOGGED, mCreationLogged);
}
@Override
@@ -253,6 +269,7 @@ public final class PermissionAppsFragment extends SettingsWithLargeHeader implem
return result;
});
+ long viewIdForLogging = new Random().nextLong();
long sessionId = getArguments().getLong(EXTRA_SESSION_ID, INVALID_SESSION_ID);
for (int i = 0; i < sortedApps.size(); i++) {
@@ -322,8 +339,13 @@ public final class PermissionAppsFragment extends SettingsWithLargeHeader implem
mExtraScreen.addPreference(pref);
} else {
category.addPreference(pref);
+ if (!mCreationLogged) {
+ logPermissionAppsFragmentCreated(app, viewIdForLogging, category == allowed,
+ category == allowedForeground, category == denied);
+ }
}
}
+ mCreationLogged = true;
if (mExtraScreen != null) {
Preference pref = allowed.findPreference(KEY_SHOW_SYSTEM_PREFS);
@@ -389,6 +411,28 @@ public final class PermissionAppsFragment extends SettingsWithLargeHeader implem
}
}
+ private void logPermissionAppsFragmentCreated(PermissionApp permissionApp, long viewId,
+ boolean isAllowed, boolean isAllowedForeground, boolean isDenied) {
+ long sessionId = getArguments().getLong(EXTRA_SESSION_ID, 0);
+
+ int category = PERMISSION_APPS_FRAGMENT_VIEWED__CATEGORY__UNDEFINED;
+ if (isAllowed) {
+ category = PERMISSION_APPS_FRAGMENT_VIEWED__CATEGORY__ALLOWED;
+ } else if (isAllowedForeground) {
+ category = PERMISSION_APPS_FRAGMENT_VIEWED__CATEGORY__ALLOWED_FOREGROUND;
+ } else if (isDenied) {
+ category = PERMISSION_APPS_FRAGMENT_VIEWED__CATEGORY__DENIED;
+ }
+
+ PermissionControllerStatsLog.write(PERMISSION_APPS_FRAGMENT_VIEWED, sessionId, viewId,
+ mPermissionApps.getGroupName(), permissionApp.getUid(),
+ permissionApp.getPackageName(), category);
+ Log.v(LOG_TAG, "PermissionAppsFragment created with sessionId=" + sessionId
+ + " permissionGroupName=" + mPermissionApps.getGroupName() + " appUid="
+ + permissionApp.getUid() + " packageName=" + permissionApp.getPackageName()
+ + " category=" + category);
+ };
+
public static class SystemAppsFragment extends SettingsWithLargeHeader implements Callback {
PermissionAppsFragment mOuterFragment;