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