Loading AndroidManifest.xml +0 −2 Original line number Diff line number Diff line Loading @@ -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" /> Loading res/values/overlayable.xml +6 −0 Original line number Diff line number Diff line Loading @@ -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" /> Loading src/com/android/packageinstaller/permission/service/LocationAccessCheck.java +37 −7 Original line number Diff line number Diff line Loading @@ -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; Loading Loading @@ -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; Loading Loading @@ -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(); Loading Loading @@ -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(); } Loading Loading @@ -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); } Loading @@ -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); Loading src/com/android/packageinstaller/permission/service/RuntimePermissionsUpgradeController.java +2 −8 Original line number Diff line number Diff line Loading @@ -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"); Loading @@ -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( Loading Loading @@ -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++) { Loading @@ -211,7 +205,7 @@ class RuntimePermissionsUpgradeController { if (group.areRuntimePermissionsGranted() && bgGroup != null && !bgGroup.isSystemFixed() && !bgGroup.isUserSet() && !bgGroup.isSystemFixed() && !bgGroup.isPolicyFixed()) { bgGroup.grantRuntimePermissions(group.isUserFixed()); Loading src/com/android/packageinstaller/permission/ui/handheld/AppPermissionFragment.java +106 −5 Original line number Diff line number Diff line Loading @@ -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; Loading Loading @@ -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; Loading @@ -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. Loading Loading @@ -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; } Loading @@ -145,6 +152,7 @@ public class AppPermissionFragment extends SettingsWithLargeHeader { getActivity().setTitle( getPreferenceManager().getContext().getString(R.string.app_permission_title, mGroup.getFullLabel())); logAppPermissionFragmentViewed(); } } Loading Loading @@ -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, Loading @@ -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); }); Loading @@ -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); }); Loading Loading @@ -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(); Loading @@ -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) { Loading Loading @@ -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); Loading @@ -719,6 +804,7 @@ public class AppPermissionFragment extends SettingsWithLargeHeader { mGroup.getBackgroundPermissions().grantRuntimePermissions(false); } } logPermissionChanges(stateBefore); } else { boolean showDefaultDenyDialog = false; Loading @@ -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()) { Loading @@ -761,6 +848,7 @@ public class AppPermissionFragment extends SettingsWithLargeHeader { mGroup.getBackgroundPermissions().revokeRuntimePermissions(false); } } logPermissionChanges(stateBefore); } } Loading Loading @@ -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); Loading @@ -836,6 +925,7 @@ public class AppPermissionFragment extends SettingsWithLargeHeader { mGroup.getBackgroundPermissions().hasGrantedByDefaultPermission(); } } logPermissionChanges(stateBefore); if (hasDefaultPermissions || !mGroup.doesSupportRuntimePermissions()) { mHasConfirmedRevoke = true; Loading Loading @@ -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; } } } Loading
AndroidManifest.xml +0 −2 Original line number Diff line number Diff line Loading @@ -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" /> Loading
res/values/overlayable.xml +6 −0 Original line number Diff line number Diff line Loading @@ -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" /> Loading
src/com/android/packageinstaller/permission/service/LocationAccessCheck.java +37 −7 Original line number Diff line number Diff line Loading @@ -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; Loading Loading @@ -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; Loading Loading @@ -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(); Loading Loading @@ -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(); } Loading Loading @@ -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); } Loading @@ -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); Loading
src/com/android/packageinstaller/permission/service/RuntimePermissionsUpgradeController.java +2 −8 Original line number Diff line number Diff line Loading @@ -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"); Loading @@ -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( Loading Loading @@ -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++) { Loading @@ -211,7 +205,7 @@ class RuntimePermissionsUpgradeController { if (group.areRuntimePermissionsGranted() && bgGroup != null && !bgGroup.isSystemFixed() && !bgGroup.isUserSet() && !bgGroup.isSystemFixed() && !bgGroup.isPolicyFixed()) { bgGroup.grantRuntimePermissions(group.isUserFixed()); Loading
src/com/android/packageinstaller/permission/ui/handheld/AppPermissionFragment.java +106 −5 Original line number Diff line number Diff line Loading @@ -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; Loading Loading @@ -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; Loading @@ -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. Loading Loading @@ -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; } Loading @@ -145,6 +152,7 @@ public class AppPermissionFragment extends SettingsWithLargeHeader { getActivity().setTitle( getPreferenceManager().getContext().getString(R.string.app_permission_title, mGroup.getFullLabel())); logAppPermissionFragmentViewed(); } } Loading Loading @@ -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, Loading @@ -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); }); Loading @@ -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); }); Loading Loading @@ -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(); Loading @@ -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) { Loading Loading @@ -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); Loading @@ -719,6 +804,7 @@ public class AppPermissionFragment extends SettingsWithLargeHeader { mGroup.getBackgroundPermissions().grantRuntimePermissions(false); } } logPermissionChanges(stateBefore); } else { boolean showDefaultDenyDialog = false; Loading @@ -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()) { Loading @@ -761,6 +848,7 @@ public class AppPermissionFragment extends SettingsWithLargeHeader { mGroup.getBackgroundPermissions().revokeRuntimePermissions(false); } } logPermissionChanges(stateBefore); } } Loading Loading @@ -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); Loading @@ -836,6 +925,7 @@ public class AppPermissionFragment extends SettingsWithLargeHeader { mGroup.getBackgroundPermissions().hasGrantedByDefaultPermission(); } } logPermissionChanges(stateBefore); if (hasDefaultPermissions || !mGroup.doesSupportRuntimePermissions()) { mHasConfirmedRevoke = true; Loading Loading @@ -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; } } }