Update in DPM delegation documentation.

Add note on DPM#setDelegatedScopes documentation regarding the
broadcast sent to the delegate package to notify its new scopes; and
change the admin ComponentName annotation to @Nullable in
DPM#getDelegatedScopes.

Bug: 33099995
Test: cts-tradefed run cts-dev --module CtsDevicePolicyManagerTestCases --test com.android.cts.devicepolicy.MixedDeviceOwnerTest#testDelegation
Change-Id: I28fe3a631c05a9e6b8dae766ce6c42881f2e3a00
diff --git a/core/java/android/app/admin/DevicePolicyManager.java b/core/java/android/app/admin/DevicePolicyManager.java
index 4be011e..52d7386 100644
--- a/core/java/android/app/admin/DevicePolicyManager.java
+++ b/core/java/android/app/admin/DevicePolicyManager.java
@@ -1177,9 +1177,9 @@
             = "android.app.action.SHOW_DEVICE_MONITORING_DIALOG";
 
     /**
-     * Broadcast Action: Sent after application delegation scopes are changed. The new list of
-     * delegation scopes will be sent in an extra identified by the {@link #EXTRA_DELEGATION_SCOPES}
-     * key.
+     * Broadcast Action: Sent after application delegation scopes are changed. The new delegation
+     * scopes will be sent in an {@code ArrayList<String>} extra identified by the
+     * {@link #EXTRA_DELEGATION_SCOPES} key.
      *
      * <p class=”note”> Note: This is a protected intent that can only be sent by the system.</p>
      */
@@ -1188,7 +1188,7 @@
             "android.app.action.APPLICATION_DELEGATION_SCOPES_CHANGED";
 
     /**
-     * A list of Strings corresponding to the delegation scopes given to an app in the
+     * An {@code ArrayList<String>} corresponding to the delegation scopes given to an app in the
      * {@link #ACTION_APPLICATION_DELEGATION_SCOPES_CHANGED} broadcast.
      */
     public static final String EXTRA_DELEGATION_SCOPES = "android.app.extra.DELEGATION_SCOPES";
@@ -3669,6 +3669,11 @@
      * Granted APIs are determined by {@code scopes}, which is a list of the {@code DELEGATION_*}
      * constants.
      * <p>
+     * A broadcast with the {@link #ACTION_APPLICATION_DELEGATION_SCOPES_CHANGED} action will be
+     * sent to the {@code delegatePackage} with its new scopes in an {@code ArrayList<String>} extra
+     * under the {@link #EXTRA_DELEGATION_SCOPES} key. The broadcast is sent with the
+     * {@link Intent#FLAG_RECEIVER_REGISTERED_ONLY} flag.
+     * <p>
      * Delegated scopes are a per-user state. The delegated access is persistent until it is later
      * cleared by calling this method with an empty {@code scopes} list or uninstalling the
      * {@code delegatePackage}.
@@ -3704,7 +3709,7 @@
      * @throws SecurityException if {@code admin} is not a device or a profile owner.
      */
      @NonNull
-     public List<String> getDelegatedScopes(@NonNull ComponentName admin,
+     public List<String> getDelegatedScopes(@Nullable ComponentName admin,
              @NonNull String delegatedPackage) {
          throwIfParentInstance("getDelegatedScopes");
          if (mService != null) {
diff --git a/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java b/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java
index 5b5e904..3c1d274 100644
--- a/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java
+++ b/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java
@@ -4887,7 +4887,7 @@
             // Set the new delegate in user policies.
             final DevicePolicyData policy = getUserData(userId);
             if (!scopes.isEmpty()) {
-                policy.mDelegationMap.put(delegatePackage, scopes);
+                policy.mDelegationMap.put(delegatePackage, new ArrayList<>(scopes));
             } else {
                 // Remove any delegation info if the given scopes list is empty.
                 policy.mDelegationMap.remove(delegatePackage);
@@ -4902,7 +4902,7 @@
             intent.setPackage(delegatePackage);
             // Include the list of delegated scopes as an extra.
             intent.putStringArrayListExtra(DevicePolicyManager.EXTRA_DELEGATION_SCOPES,
-                (ArrayList<String>) scopes);
+                    (ArrayList<String>) scopes);
             // Send the broadcast.
             mContext.sendBroadcastAsUser(intent, UserHandle.of(userId));