Merge "Support IPv4/6 address type in Struct." am: 8e555572f0 am: 543b0662f4 am: 4289102e88
Original change: https://android-review.googlesource.com/c/platform/frameworks/libs/net/+/1538747
MUST ONLY BE SUBMITTED BY AUTOMERGER
Change-Id: Ia92a90c1f6b0b87f75590275b72e77b5439c2ae2
diff --git a/staticlibs/Android.bp b/staticlibs/Android.bp
index c6a17fe..ecff6c7 100644
--- a/staticlibs/Android.bp
+++ b/staticlibs/Android.bp
@@ -73,6 +73,7 @@
host_supported: true,
visibility: [
"//frameworks/libs/net/common/tests:__subpackages__",
+ "//frameworks/libs/net/client-libs/tests:__subpackages__",
],
static_libs: [
"kotlin-test"
@@ -162,6 +163,7 @@
":framework-annotations",
],
sdk_version: "system_current",
+ min_sdk_version: "30",
visibility: [
"//frameworks/base/services/net",
],
diff --git a/staticlibs/framework/com/android/net/module/util/CollectionUtils.java b/staticlibs/framework/com/android/net/module/util/CollectionUtils.java
index 74f738d..cb1e3e7 100644
--- a/staticlibs/framework/com/android/net/module/util/CollectionUtils.java
+++ b/staticlibs/framework/com/android/net/module/util/CollectionUtils.java
@@ -66,6 +66,28 @@
}
/**
+ * @return True if all elements satisfy the predicate, false otherwise.
+ * Note that means this always returns true for empty collections.
+ */
+ public static <T> boolean all(@NonNull Collection<T> elem, @NonNull Predicate<T> predicate) {
+ for (final T e : elem) {
+ if (!predicate.test(e)) return false;
+ }
+ return true;
+
+ }
+ /**
+ * @return True if any element satisfies the predicate, false otherwise.
+ * Note that means this always returns false for empty collections.
+ */
+ public static <T> boolean any(@NonNull Collection<T> elem, @NonNull Predicate<T> predicate) {
+ for (final T e : elem) {
+ if (predicate.test(e)) return true;
+ }
+ return false;
+ }
+
+ /**
* @return True if there exists at least one element in the sparse array for which
* condition {@code predicate}
*/
diff --git a/staticlibs/framework/com/android/net/module/util/NetworkIdentityUtils.java b/staticlibs/framework/com/android/net/module/util/NetworkIdentityUtils.java
new file mode 100644
index 0000000..94e6017
--- /dev/null
+++ b/staticlibs/framework/com/android/net/module/util/NetworkIdentityUtils.java
@@ -0,0 +1,51 @@
+/*
+ * Copyright (C) 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.net.module.util;
+
+import android.annotation.NonNull;
+import android.annotation.Nullable;
+
+/**
+ * Utilities to examine {@link android.net.NetworkIdentity}.
+ */
+public class NetworkIdentityUtils {
+ /**
+ * Scrub given IMSI on production builds.
+ */
+ @NonNull
+ public static String scrubSubscriberId(@Nullable String subscriberId) {
+ if (subscriberId != null) {
+ // TODO: parse this as MCC+MNC instead of hard-coding
+ return subscriberId.substring(0, Math.min(6, subscriberId.length())) + "...";
+ } else {
+ return "null";
+ }
+ }
+
+ /**
+ * Scrub given IMSI on production builds.
+ */
+ @Nullable
+ public static String[] scrubSubscriberIds(@Nullable String[] subscriberIds) {
+ if (subscriberIds == null) return null;
+ final String[] res = new String[subscriberIds.length];
+ for (int i = 0; i < res.length; i++) {
+ res[i] = scrubSubscriberId(subscriberIds[i]);
+ }
+ return res;
+ }
+}
diff --git a/staticlibs/tests/unit/src/com/android/net/module/util/CollectionUtilsTest.kt b/staticlibs/tests/unit/src/com/android/net/module/util/CollectionUtilsTest.kt
new file mode 100644
index 0000000..0007742
--- /dev/null
+++ b/staticlibs/tests/unit/src/com/android/net/module/util/CollectionUtilsTest.kt
@@ -0,0 +1,54 @@
+/*
+ * Copyright (C) 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.net.module.util
+
+import androidx.test.filters.SmallTest
+import androidx.test.runner.AndroidJUnit4
+import org.junit.Test
+import org.junit.runner.RunWith
+import kotlin.test.assertFalse
+import kotlin.test.assertTrue
+
+@RunWith(AndroidJUnit4::class)
+@SmallTest
+class CollectionUtilsTest {
+ @Test
+ fun testAny() {
+ assertTrue(CollectionUtils.any(listOf("A", "B", "C", "D", "E")) { it == "E" })
+ assertFalse(CollectionUtils.any(listOf("A", "B", "C", "D", "E")) { it == "F" })
+ assertTrue(CollectionUtils.any(listOf("AA", "BBB")) { it.length >= 3 })
+ assertFalse(CollectionUtils.any(listOf("A", "BB", "CCC")) { it.length >= 4 })
+ assertFalse(CollectionUtils.any(listOf("A", "BB", "CCC")) { it.length < 0 })
+ assertFalse(CollectionUtils.any(listOf<String>()) { true })
+ assertFalse(CollectionUtils.any(listOf<String>()) { false })
+ assertTrue(CollectionUtils.any(listOf("A")) { true })
+ assertFalse(CollectionUtils.any(listOf("A")) { false })
+ }
+
+ @Test
+ fun testAll() {
+ assertFalse(CollectionUtils.all(listOf("A", "B", "C", "D", "E")) { it != "E" })
+ assertTrue(CollectionUtils.all(listOf("A", "B", "C", "D", "E")) { it != "F" })
+ assertFalse(CollectionUtils.all(listOf("A", "BB", "CCC")) { it.length > 2 })
+ assertTrue(CollectionUtils.all(listOf("A", "BB", "CCC")) { it.length >= 1 })
+ assertTrue(CollectionUtils.all(listOf("A", "BB", "CCC")) { it.length < 4 })
+ assertTrue(CollectionUtils.all(listOf<String>()) { true })
+ assertTrue(CollectionUtils.all(listOf<String>()) { false })
+ assertTrue(CollectionUtils.all(listOf(1)) { true })
+ assertFalse(CollectionUtils.all(listOf(1)) { false })
+ }
+}
diff --git a/staticlibs/tests/unit/src/com/android/net/module/util/NetworkIdentityUtilsTest.kt b/staticlibs/tests/unit/src/com/android/net/module/util/NetworkIdentityUtilsTest.kt
new file mode 100644
index 0000000..2904e12
--- /dev/null
+++ b/staticlibs/tests/unit/src/com/android/net/module/util/NetworkIdentityUtilsTest.kt
@@ -0,0 +1,49 @@
+/*
+ * Copyright (C) 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.net.module.util
+
+import androidx.test.filters.SmallTest
+import androidx.test.runner.AndroidJUnit4
+import com.android.net.module.util.NetworkIdentityUtils.scrubSubscriberId
+import com.android.net.module.util.NetworkIdentityUtils.scrubSubscriberIds
+import com.android.testutils.assertContainsStringsExactly
+import org.junit.Test
+import org.junit.runner.RunWith
+import kotlin.test.assertEquals
+import kotlin.test.assertNull
+
+@RunWith(AndroidJUnit4::class)
+@SmallTest
+class NetworkIdentityUtilsTest {
+ @Test
+ fun testScrubSubscriberId() {
+ assertEquals("123456...", scrubSubscriberId("1234567890123"))
+ assertEquals("123456...", scrubSubscriberId("1234567"))
+ assertEquals("123...", scrubSubscriberId("123"))
+ assertEquals("...", scrubSubscriberId(""))
+ assertEquals("null", scrubSubscriberId(null))
+ }
+
+ @Test
+ fun testScrubSubscriberIds() {
+ assertContainsStringsExactly(scrubSubscriberIds(arrayOf("1234567", "", null))!!,
+ "123456...", "...", "null")
+ assertContainsStringsExactly(scrubSubscriberIds(arrayOf("12345"))!!, "12345...")
+ assertContainsStringsExactly(scrubSubscriberIds(arrayOf())!!)
+ assertNull(scrubSubscriberIds(null))
+ }
+}
\ No newline at end of file