[fixed] Replace RemoteCallback with AndroidFuture in PermControler

This is ag/7529281 + fix ag/7572218

Test: atest AddConfigWidgetTest#testConfigCancelled
atest android.permission.cts.PermissionControllerTest
Change-Id: I9d8f28c0665a7ae4040ea471ed6a0187628a0306
diff --git a/core/java/com/android/internal/util/CollectionUtils.java b/core/java/com/android/internal/util/CollectionUtils.java
index 78fdfe4..f9cf23b 100644
--- a/core/java/com/android/internal/util/CollectionUtils.java
+++ b/core/java/com/android/internal/util/CollectionUtils.java
@@ -18,6 +18,7 @@
 
 import android.annotation.NonNull;
 import android.annotation.Nullable;
+import android.util.ArrayMap;
 import android.util.ArraySet;
 import android.util.ExceptionUtils;
 
@@ -29,6 +30,7 @@
 import java.util.List;
 import java.util.Map;
 import java.util.Set;
+import java.util.function.BiConsumer;
 import java.util.function.Function;
 import java.util.function.Predicate;
 import java.util.stream.Stream;
@@ -328,6 +330,33 @@
     }
 
     /**
+     * Applies {@code action} to each element in {@code cur}
+     *
+     * This avoids creating an iterator if the given map is an {@link ArrayMap}
+     * For non-{@link ArrayMap}s it avoids creating {@link Map.Entry} instances
+     */
+    public static <K, V> void forEach(@Nullable Map<K, V> cur, @Nullable BiConsumer<K, V> action) {
+        if (cur == null || action == null) {
+            return;
+        }
+        int size = cur.size();
+        if (size == 0) {
+            return;
+        }
+
+        if (cur instanceof ArrayMap) {
+            ArrayMap<K, V> arrayMap = (ArrayMap<K, V>) cur;
+            for (int i = 0; i < size; i++) {
+                action.accept(arrayMap.keyAt(i), arrayMap.valueAt(i));
+            }
+        } else {
+            for (K key : cur.keySet()) {
+                action.accept(key, cur.get(key));
+            }
+        }
+    }
+
+    /**
      * @return the first element if not empty/null, null otherwise
      */
     public static @Nullable <T> T firstOrNull(@Nullable List<T> cur) {