Delegate bugreport consent for system apps.
For system apps with the required permission and an in-built consent page, the report will be approved and the bugreport consent popup will be skipped.
Bug: 324046728
PWG consultation: b/285006273
Test: Build and flash image. Trigger the Send Feedback flow from settings. Ensure the OS bugreport consent popup is skipped. Check logs to verify consent was delegated.
atest CtsRootBugreportTestCases
Flag: android.os.allow_consentless_bugreport_delegated_consent
Change-Id: I720531386a21f32e5dafcd4d9994d4a54c7921bc
diff --git a/services/core/java/com/android/server/incident/PendingReports.java b/services/core/java/com/android/server/incident/PendingReports.java
index adcda0a..35b3673 100644
--- a/services/core/java/com/android/server/incident/PendingReports.java
+++ b/services/core/java/com/android/server/incident/PendingReports.java
@@ -304,16 +304,16 @@
denyReportBeforeAddingRec(listener, callingPackage);
return;
}
+ AttributionSource attributionSource =
+ new AttributionSource.Builder(callingUid)
+ .setPackageName(callingPackage)
+ .build();
// Only with userdebug/eng build: it could check capture consentless bugreport permission
// and approve the report when it's granted.
boolean captureConsentlessBugreportOnUserdebugBuildGranted = false;
if ((Build.IS_USERDEBUG || Build.IS_ENG)
&& (flags & IncidentManager.FLAG_ALLOW_CONSENTLESS_BUGREPORT) != 0) {
- AttributionSource attributionSource =
- new AttributionSource.Builder(callingUid)
- .setPackageName(callingPackage)
- .build();
captureConsentlessBugreportOnUserdebugBuildGranted =
mPermissionManager.checkPermissionForDataDelivery(
Manifest.permission.CAPTURE_CONSENTLESS_BUGREPORT_ON_USERDEBUG_BUILD,
@@ -321,12 +321,32 @@
/* message= */ null)
== PERMISSION_GRANTED;
}
- if (captureConsentlessBugreportOnUserdebugBuildGranted) {
+
+ // Allow system apps to skip the consent dialog and use their in-built consent mechanism
+ // instead.
+ boolean captureConsentlessBugreportDelegatedConsentGranted = false;
+ if ((flags & IncidentManager.FLAG_ALLOW_CONSENTLESS_BUGREPORT) != 0) {
+ captureConsentlessBugreportDelegatedConsentGranted =
+ mPermissionManager.checkPermissionForDataDelivery(
+ Manifest.permission
+ .CAPTURE_CONSENTLESS_BUGREPORT_DELEGATED_CONSENT,
+ attributionSource,
+ /* message= */ null)
+ == PERMISSION_GRANTED;
+ }
+
+ if (captureConsentlessBugreportOnUserdebugBuildGranted
+ || captureConsentlessBugreportDelegatedConsentGranted) {
try {
PendingReportRec rec =
new PendingReportRec(
callingPackage, receiverClass, reportId, flags, listener);
- Log.d(TAG, "approving consentless report: " + rec.getUri());
+ if (captureConsentlessBugreportOnUserdebugBuildGranted) {
+ Log.d(TAG, "approving consentless report: " + rec.getUri());
+ }
+ if (captureConsentlessBugreportDelegatedConsentGranted) {
+ Log.d(TAG, "delegating consent for report: " + rec.getUri());
+ }
listener.onReportApproved();
return;
} catch (RemoteException e) {
diff --git a/services/core/java/com/android/server/incident/TEST_MAPPING b/services/core/java/com/android/server/incident/TEST_MAPPING
new file mode 100644
index 0000000..4f789db
--- /dev/null
+++ b/services/core/java/com/android/server/incident/TEST_MAPPING
@@ -0,0 +1,10 @@
+{
+ "postsubmit": [
+ {
+ "name": "CtsRootBugreportTestCases"
+ },
+ {
+ "name": "BugreportManagerTestCases"
+ }
+ ]
+}
\ No newline at end of file