Merge "Address review comments in aosp/2677976" into main
diff --git a/staticlibs/device/com/android/net/module/util/DeviceConfigUtils.java b/staticlibs/device/com/android/net/module/util/DeviceConfigUtils.java
index bea227d..5edf1b9 100644
--- a/staticlibs/device/com/android/net/module/util/DeviceConfigUtils.java
+++ b/staticlibs/device/com/android/net/module/util/DeviceConfigUtils.java
@@ -335,15 +335,19 @@
/**
* Check whether one specific experimental feature in tethering module from {@link DeviceConfig}
- * is disabled by setting a non-zero value in the property.
+ * is not disabled. Feature can be disabled by setting a non-zero value in the property.
+ * If the feature is enabled by default and disabled by flag push (kill switch), this method
+ * should be used.
+ * If the feature is disabled by default and enabled by flag push,
+ * {@link #isFeatureEnabled(Context, String, String, String, boolean)} should be used.
*
* @param name The name of the property to look up.
- * @return true if this feature is force disabled, or false if not disabled.
+ * @return true if this feature is enabled, or false if disabled.
*/
- public static boolean isTetheringFeatureForceDisabled(String name) {
+ public static boolean isTetheringFeatureNotChickenedOut(String name) {
final int propertyVersion = getDeviceConfigPropertyInt(NAMESPACE_TETHERING, name,
0 /* default value */);
- return propertyVersion != 0;
+ return propertyVersion == 0;
}
/**
diff --git a/staticlibs/lint-baseline.xml b/staticlibs/lint-baseline.xml
new file mode 100644
index 0000000..d413b2a
--- /dev/null
+++ b/staticlibs/lint-baseline.xml
@@ -0,0 +1,70 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<issues format="6" by="lint 8.0.0-dev" type="baseline" dependencies="true" variant="all" version="8.0.0-dev">
+
+ <issue
+ id="NewApi"
+ message="Call requires API level 30 (current min is 29): `android.net.LinkProperties#getAddresses`"
+ errorLine1=" final Collection<InetAddress> leftAddresses = left.getAddresses();"
+ errorLine2=" ~~~~~~~~~~~~">
+ <location
+ file="frameworks/libs/net/common/framework/com/android/net/module/util/LinkPropertiesUtils.java"
+ line="158"
+ column="60"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Call requires API level 30 (current min is 29): `android.net.LinkProperties#getAddresses`"
+ errorLine1=" final Collection<InetAddress> rightAddresses = right.getAddresses();"
+ errorLine2=" ~~~~~~~~~~~~">
+ <location
+ file="frameworks/libs/net/common/framework/com/android/net/module/util/LinkPropertiesUtils.java"
+ line="159"
+ column="62"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Call requires API level 30 (current min is 29): `android.net.NetworkStats#addEntry`"
+ errorLine1=" stats = stats.addEntry(entry);"
+ errorLine2=" ~~~~~~~~">
+ <location
+ file="frameworks/libs/net/common/framework/com/android/net/module/util/NetworkStatsUtils.java"
+ line="113"
+ column="27"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Call requires API level 30 (current min is 29): `new android.net.NetworkStats.Entry`"
+ errorLine1=" return new android.net.NetworkStats.Entry("
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/libs/net/common/framework/com/android/net/module/util/NetworkStatsUtils.java"
+ line="120"
+ column="16"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Call requires API level 30 (current min is 29): `new android.net.NetworkStats`"
+ errorLine1=" android.net.NetworkStats stats = new android.net.NetworkStats(0L, 0);"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/libs/net/common/framework/com/android/net/module/util/NetworkStatsUtils.java"
+ line="108"
+ column="42"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Call requires API level 31 (current min is 29): `new android.system.NetlinkSocketAddress`"
+ errorLine1=" return new NetlinkSocketAddress(portId, groupsMask);"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="frameworks/libs/net/common/device/com/android/net/module/util/SocketUtils.java"
+ line="44"
+ column="16"/>
+ </issue>
+
+</issues>
\ No newline at end of file
diff --git a/staticlibs/netd/Android.bp b/staticlibs/netd/Android.bp
index 525160d..d135a1c 100644
--- a/staticlibs/netd/Android.bp
+++ b/staticlibs/netd/Android.bp
@@ -187,7 +187,7 @@
srcs: [
"binder/android/net/metrics/INetdEventListener.aidl",
],
- versions: ["1"],
+
backend: {
ndk: {
apex_available: [
@@ -205,6 +205,19 @@
min_sdk_version: "29",
},
},
+ versions_with_info: [
+ {
+ version: "1",
+ imports: [],
+ },
+ {
+ version: "2",
+ imports: [],
+ },
+
+ ],
+ frozen: true,
+
}
java_library {
diff --git a/staticlibs/netd/aidl_api/netd_event_listener_interface/2/.hash b/staticlibs/netd/aidl_api/netd_event_listener_interface/2/.hash
new file mode 100644
index 0000000..67c55b7
--- /dev/null
+++ b/staticlibs/netd/aidl_api/netd_event_listener_interface/2/.hash
@@ -0,0 +1 @@
+1b765b02815e970a124de92e793e42e0ceff5384
diff --git a/staticlibs/netd/aidl_api/netd_event_listener_interface/2/android/net/metrics/INetdEventListener.aidl b/staticlibs/netd/aidl_api/netd_event_listener_interface/2/android/net/metrics/INetdEventListener.aidl
new file mode 100644
index 0000000..1b0fe13
--- /dev/null
+++ b/staticlibs/netd/aidl_api/netd_event_listener_interface/2/android/net/metrics/INetdEventListener.aidl
@@ -0,0 +1,51 @@
+/**
+ * Copyright (c) 2016, 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.
+ */
+///////////////////////////////////////////////////////////////////////////////
+// THIS FILE IS IMMUTABLE. DO NOT EDIT IN ANY CASE. //
+///////////////////////////////////////////////////////////////////////////////
+
+// This file is a snapshot of an AIDL file. Do not edit it manually. There are
+// two cases:
+// 1). this is a frozen version file - do not edit this in any case.
+// 2). this is a 'current' file. If you make a backwards compatible change to
+// the interface (from the latest frozen version), the build system will
+// prompt you to update this file with `m <name>-update-api`.
+//
+// You must not make a backward incompatible change to any AIDL file built
+// with the aidl_interface module type with versions property set. The module
+// type is used to build AIDL files in a way that they can be used across
+// independently updatable components of the system. If a device is shipped
+// with such a backward incompatible change, it has a high risk of breaking
+// later when a module using the interface is updated, e.g., Mainline modules.
+
+package android.net.metrics;
+/* @hide */
+interface INetdEventListener {
+ oneway void onDnsEvent(int netId, int eventType, int returnCode, int latencyMs, @utf8InCpp String hostname, in @utf8InCpp String[] ipAddresses, int ipAddressesCount, int uid);
+ oneway void onPrivateDnsValidationEvent(int netId, String ipAddress, String hostname, boolean validated);
+ oneway void onConnectEvent(int netId, int error, int latencyMs, String ipAddr, int port, int uid);
+ oneway void onWakeupEvent(String prefix, int uid, int ethertype, int ipNextHeader, in byte[] dstHw, String srcIp, String dstIp, int srcPort, int dstPort, long timestampNs);
+ oneway void onTcpSocketStatsEvent(in int[] networkIds, in int[] sentPackets, in int[] lostPackets, in int[] rttUs, in int[] sentAckDiffMs);
+ oneway void onNat64PrefixEvent(int netId, boolean added, @utf8InCpp String prefixString, int prefixLength);
+ const int EVENT_GETADDRINFO = 1;
+ const int EVENT_GETHOSTBYNAME = 2;
+ const int EVENT_GETHOSTBYADDR = 3;
+ const int EVENT_RES_NSEND = 4;
+ const int REPORTING_LEVEL_NONE = 0;
+ const int REPORTING_LEVEL_METRICS = 1;
+ const int REPORTING_LEVEL_FULL = 2;
+ const int DNS_REPORTED_IP_ADDRESSES_LIMIT = 10;
+}
diff --git a/staticlibs/tests/unit/src/com/android/net/module/util/DeviceConfigUtilsTest.java b/staticlibs/tests/unit/src/com/android/net/module/util/DeviceConfigUtilsTest.java
index 7946244..cc17f9f 100644
--- a/staticlibs/tests/unit/src/com/android/net/module/util/DeviceConfigUtilsTest.java
+++ b/staticlibs/tests/unit/src/com/android/net/module/util/DeviceConfigUtilsTest.java
@@ -424,10 +424,10 @@
public void testIsTetheringFeatureForceDisabled() throws Exception {
doReturn("0").when(() -> DeviceConfig.getProperty(
eq(NAMESPACE_TETHERING), eq(TEST_EXPERIMENT_FLAG)));
- assertFalse(DeviceConfigUtils.isTetheringFeatureForceDisabled(TEST_EXPERIMENT_FLAG));
+ assertTrue(DeviceConfigUtils.isTetheringFeatureNotChickenedOut(TEST_EXPERIMENT_FLAG));
doReturn(TEST_FLAG_VALUE_STRING).when(
() -> DeviceConfig.getProperty(eq(NAMESPACE_TETHERING), eq(TEST_EXPERIMENT_FLAG)));
- assertTrue(DeviceConfigUtils.isTetheringFeatureForceDisabled(TEST_EXPERIMENT_FLAG));
+ assertFalse(DeviceConfigUtils.isTetheringFeatureNotChickenedOut(TEST_EXPERIMENT_FLAG));
}
}
diff --git a/staticlibs/testutils/devicetests/com/android/testutils/TestableNetworkCallback.kt b/staticlibs/testutils/devicetests/com/android/testutils/TestableNetworkCallback.kt
index 4b6aea2..df9c61a 100644
--- a/staticlibs/testutils/devicetests/com/android/testutils/TestableNetworkCallback.kt
+++ b/staticlibs/testutils/devicetests/com/android/testutils/TestableNetworkCallback.kt
@@ -389,7 +389,8 @@
from: Int = mark,
crossinline predicate: (T) -> Boolean = { true }
): T = history.poll(timeoutMs, from) { it is T && predicate(it) }.also {
- assertNotNull(it, "Callback ${T::class} not received within ${timeoutMs}ms")
+ assertNotNull(it, "Callback ${T::class} not received within ${timeoutMs}ms. " +
+ "Got ${history.backtrace()}")
} as T
@JvmOverloads
@@ -398,7 +399,8 @@
timeoutMs: Long = defaultTimeoutMs,
predicate: (cb: T) -> Boolean = { true }
) = history.poll(timeoutMs) { type.java.isInstance(it) && predicate(it as T) }.also {
- assertNotNull(it, "Callback ${type.java} not received within ${timeoutMs}ms")
+ assertNotNull(it, "Callback ${type.java} not received within ${timeoutMs}ms. " +
+ "Got ${history.backtrace()}")
} as T
fun <T : CallbackEntry> eventuallyExpect(
@@ -407,7 +409,8 @@
from: Int = mark,
predicate: (cb: T) -> Boolean = { true }
) = history.poll(timeoutMs, from) { type.java.isInstance(it) && predicate(it as T) }.also {
- assertNotNull(it, "Callback ${type.java} not received within ${timeoutMs}ms")
+ assertNotNull(it, "Callback ${type.java} not received within ${timeoutMs}ms. " +
+ "Got ${history.backtrace()}")
} as T
// Expects onAvailable and the callbacks that follow it. These are:
diff --git a/staticlibs/testutils/hostdevice/com/android/net/module/util/TrackRecord.kt b/staticlibs/testutils/hostdevice/com/android/net/module/util/TrackRecord.kt
index efd77d1..f24e4f1 100644
--- a/staticlibs/testutils/hostdevice/com/android/net/module/util/TrackRecord.kt
+++ b/staticlibs/testutils/hostdevice/com/android/net/module/util/TrackRecord.kt
@@ -213,6 +213,9 @@
private val slock = StampedLock()
private var readHead = 0
+ // A special mark used to track the start of the last poll() operation.
+ private var pollMark = 0
+
/**
* @return the current value of the mark.
*/
@@ -223,6 +226,7 @@
val stamp = slock.tryWriteLock()
if (0L == stamp) concurrentAccessDetected()
readHead = v
+ pollMark = v
slock.unlockWrite(stamp)
}
@@ -261,6 +265,7 @@
fun poll(timeoutMs: Long, predicate: (E) -> Boolean = { true }): E? {
val stamp = slock.tryWriteLock()
if (0L == stamp) concurrentAccessDetected()
+ pollMark = readHead
try {
lock.withLock {
val index = pollForIndexReadLocked(timeoutMs, readHead, predicate)
@@ -273,6 +278,25 @@
}
/**
+ * Returns a list of events that were observed since the last time poll() was called on this
+ * ReadHead.
+ *
+ * @return list of events since poll() was called.
+ */
+ fun backtrace(): List<E> {
+ val stamp = slock.tryReadLock()
+ if (0L == stamp) concurrentAccessDetected()
+
+ try {
+ lock.withLock {
+ return ArrayList(subList(pollMark, mark))
+ }
+ } finally {
+ slock.unlockRead(stamp)
+ }
+ }
+
+ /**
* Returns the first element after the mark or null. This never blocks.
*
* This method is subject to threading restrictions. It can be used concurrently on