Merge "Utils : Collections.containsAll, containsAny, Permissions.getGrantedPermissions" am: d2a994be9a
Original change: https://android-review.googlesource.com/c/platform/frameworks/libs/net/+/1977703
Change-Id: I1ac5348dcaad97a664dba83952dbd1e558ea7bf1
diff --git a/common/framework/com/android/net/module/util/CollectionUtils.java b/common/framework/com/android/net/module/util/CollectionUtils.java
index 312ca48..a16ef33 100644
--- a/common/framework/com/android/net/module/util/CollectionUtils.java
+++ b/common/framework/com/android/net/module/util/CollectionUtils.java
@@ -193,4 +193,30 @@
}
return total;
}
+
+ /**
+ * Returns true if the first collection contains any of the elements of the second.
+ * @param haystack where to search
+ * @param needles what to search for
+ * @param <T> type of elements
+ * @return true if |haystack| contains any of the |needles|, false otherwise
+ */
+ public static <T> boolean containsAny(Collection<T> haystack, Collection<? extends T> needles) {
+ for (T needle : needles) {
+ if (haystack.contains(needle)) return true;
+ }
+ return false;
+ }
+
+ /**
+ * Returns true if the first collection contains all of the elements of the second.
+ * @param haystack where to search
+ * @param needles what to search for
+ * @param <T> type of elements
+ * @return true if |haystack| contains all of the |needles|, false otherwise
+ */
+ public static <T> boolean containsAll(Collection<T> haystack, Collection<? extends T> needles) {
+ return haystack.containsAll(needles);
+ }
+
}
diff --git a/common/framework/com/android/net/module/util/PermissionUtils.java b/common/framework/com/android/net/module/util/PermissionUtils.java
index 0f3dc15..be5b0cd 100644
--- a/common/framework/com/android/net/module/util/PermissionUtils.java
+++ b/common/framework/com/android/net/module/util/PermissionUtils.java
@@ -19,17 +19,21 @@
import static android.Manifest.permission.ACCESS_NETWORK_STATE;
import static android.Manifest.permission.CONNECTIVITY_USE_RESTRICTED_NETWORKS;
import static android.Manifest.permission.NETWORK_STACK;
+import static android.content.pm.PackageInfo.REQUESTED_PERMISSION_GRANTED;
import static android.content.pm.PackageManager.PERMISSION_GRANTED;
import static android.net.NetworkStack.PERMISSION_MAINLINE_NETWORK_STACK;
import android.annotation.NonNull;
import android.annotation.Nullable;
import android.content.Context;
+import android.content.pm.PackageInfo;
import android.os.Binder;
import java.io.PrintWriter;
import java.util.ArrayList;
import java.util.Arrays;
+import java.util.Collections;
+import java.util.List;
/**
* Collection of permission utilities.
@@ -144,4 +148,25 @@
throw new UnsupportedOperationException(errorMessage);
}
}
+
+ /**
+ * Get the list of granted permissions for a package info.
+ *
+ * PackageInfo contains the list of requested permissions, and their state (whether they
+ * were granted or not, in particular) as a parallel array. Most users care only about
+ * granted permissions. This method returns the list of them.
+ *
+ * @param packageInfo the package info for the relevant uid.
+ * @return the list of granted permissions.
+ */
+ public static List<String> getGrantedPermissions(final @NonNull PackageInfo packageInfo) {
+ if (null == packageInfo.requestedPermissions) return Collections.emptyList();
+ final ArrayList<String> result = new ArrayList<>(packageInfo.requestedPermissions.length);
+ for (int i = 0; i < packageInfo.requestedPermissions.length; ++i) {
+ if (0 != (REQUESTED_PERMISSION_GRANTED & packageInfo.requestedPermissionsFlags[i])) {
+ result.add(packageInfo.requestedPermissions[i]);
+ }
+ }
+ return result;
+ }
}