diff options
author | android-build-team Robot <android-build-team-robot@google.com> | 2019-06-22 23:13:57 +0000 |
---|---|---|
committer | android-build-team Robot <android-build-team-robot@google.com> | 2019-06-22 23:13:57 +0000 |
commit | efe804a59b094d9e0767b400b1b63e6eece9ef20 (patch) | |
tree | 0be4a87543de68491774531398465a34ca98a8c6 | |
parent | c74f3ae3424873c6578812501ad4a3415e8fa1bf (diff) | |
parent | ca55f2759fc40596bec8afa3f79b9e784d4bf31f (diff) | |
download | android_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
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; |