Merge "Add newApi linter check for mDNS library" into main

This commit is contained in:
Yuyang Huang
2023-09-13 05:55:51 +00:00
committed by Gerrit Code Review
22 changed files with 89 additions and 34 deletions

View File

@@ -19,7 +19,9 @@ package android.net.nsd;
import android.annotation.IntRange; import android.annotation.IntRange;
import android.annotation.NonNull; import android.annotation.NonNull;
import android.annotation.Nullable; import android.annotation.Nullable;
import android.annotation.RequiresApi;
import android.annotation.SystemApi; import android.annotation.SystemApi;
import android.os.Build;
import android.os.Parcel; import android.os.Parcel;
import android.os.Parcelable; import android.os.Parcelable;
@@ -38,6 +40,7 @@ import java.util.Objects;
* @hide * @hide
*/ */
@SystemApi @SystemApi
@RequiresApi(Build.VERSION_CODES.TIRAMISU)
public final class OffloadServiceInfo implements Parcelable { public final class OffloadServiceInfo implements Parcelable {
@NonNull @NonNull
private final Key mKey; private final Key mKey;

View File

@@ -91,6 +91,10 @@ java_library {
java_library { java_library {
name: "service-connectivity-mdns-standalone-build-test", name: "service-connectivity-mdns-standalone-build-test",
sdk_version: "core_platform", sdk_version: "core_platform",
min_sdk_version: "21",
lint: {
error_checks: ["NewApi"],
},
srcs: [ srcs: [
"src/com/android/server/connectivity/mdns/**/*.java", "src/com/android/server/connectivity/mdns/**/*.java",
":framework-connectivity-t-mdns-standalone-build-sources", ":framework-connectivity-t-mdns-standalone-build-sources",

View File

@@ -35,6 +35,7 @@ import static com.android.server.connectivity.mdns.util.MdnsUtils.Clock;
import android.annotation.NonNull; import android.annotation.NonNull;
import android.annotation.Nullable; import android.annotation.Nullable;
import android.annotation.RequiresApi;
import android.app.ActivityManager; import android.app.ActivityManager;
import android.content.Context; import android.content.Context;
import android.content.Intent; import android.content.Intent;
@@ -59,6 +60,7 @@ import android.net.nsd.OffloadEngine;
import android.net.nsd.OffloadServiceInfo; import android.net.nsd.OffloadServiceInfo;
import android.net.wifi.WifiManager; import android.net.wifi.WifiManager;
import android.os.Binder; import android.os.Binder;
import android.os.Build;
import android.os.Handler; import android.os.Handler;
import android.os.HandlerThread; import android.os.HandlerThread;
import android.os.IBinder; import android.os.IBinder;
@@ -120,6 +122,7 @@ import java.util.regex.Pattern;
* *
* @hide * @hide
*/ */
@RequiresApi(Build.VERSION_CODES.TIRAMISU)
public class NsdService extends INsdManager.Stub { public class NsdService extends INsdManager.Stub {
private static final String TAG = "NsdService"; private static final String TAG = "NsdService";
private static final String MDNS_TAG = "mDnsConnector"; private static final String MDNS_TAG = "mDnsConnector";

View File

@@ -19,6 +19,7 @@ package com.android.server.connectivity.mdns;
import static com.android.server.connectivity.mdns.MdnsServiceTypeClient.INVALID_TRANSACTION_ID; import static com.android.server.connectivity.mdns.MdnsServiceTypeClient.INVALID_TRANSACTION_ID;
import android.annotation.NonNull; import android.annotation.NonNull;
import android.os.Build;
import android.text.TextUtils; import android.text.TextUtils;
import android.util.Pair; import android.util.Pair;
@@ -220,7 +221,9 @@ public class EnqueueMdnsQueryCallable implements Callable<Pair<Integer, List<Str
throws IOException { throws IOException {
DatagramPacket packet = packetWriter.getPacket(address); DatagramPacket packet = packetWriter.getPacket(address);
if (expectUnicastResponse) { if (expectUnicastResponse) {
if (requestSender instanceof MdnsMultinetworkSocketClient) { // MdnsMultinetworkSocketClient is only available on T+
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU
&& requestSender instanceof MdnsMultinetworkSocketClient) {
((MdnsMultinetworkSocketClient) requestSender).sendPacketRequestingUnicastResponse( ((MdnsMultinetworkSocketClient) requestSender).sendPacketRequestingUnicastResponse(
packet, socketKey, onlyUseIpv6OnIpv6OnlyNetworks); packet, socketKey, onlyUseIpv6OnIpv6OnlyNetworks);
} else { } else {
@@ -228,7 +231,8 @@ public class EnqueueMdnsQueryCallable implements Callable<Pair<Integer, List<Str
packet, onlyUseIpv6OnIpv6OnlyNetworks); packet, onlyUseIpv6OnIpv6OnlyNetworks);
} }
} else { } else {
if (requestSender instanceof MdnsMultinetworkSocketClient) { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU
&& requestSender instanceof MdnsMultinetworkSocketClient) {
((MdnsMultinetworkSocketClient) requestSender) ((MdnsMultinetworkSocketClient) requestSender)
.sendPacketRequestingMulticastResponse( .sendPacketRequestingMulticastResponse(
packet, socketKey, onlyUseIpv6OnIpv6OnlyNetworks); packet, socketKey, onlyUseIpv6OnIpv6OnlyNetworks);

View File

@@ -17,7 +17,8 @@
package com.android.server.connectivity.mdns; package com.android.server.connectivity.mdns;
import android.annotation.NonNull; import android.annotation.NonNull;
import android.util.ArraySet;
import com.android.server.connectivity.mdns.util.MdnsUtils;
import java.util.Set; import java.util.Set;
import java.util.concurrent.ScheduledExecutorService; import java.util.concurrent.ScheduledExecutorService;
@@ -30,7 +31,7 @@ import java.util.concurrent.ScheduledThreadPoolExecutor;
public class ExecutorProvider { public class ExecutorProvider {
private final Set<ScheduledExecutorService> serviceTypeClientSchedulerExecutors = private final Set<ScheduledExecutorService> serviceTypeClientSchedulerExecutors =
new ArraySet<>(); MdnsUtils.newSet();
/** Returns a new {@link ScheduledExecutorService} instance. */ /** Returns a new {@link ScheduledExecutorService} instance. */
public ScheduledExecutorService newServiceTypeClientSchedulerExecutor() { public ScheduledExecutorService newServiceTypeClientSchedulerExecutor() {

View File

@@ -21,12 +21,14 @@ import static com.android.server.connectivity.mdns.MdnsRecord.MAX_LABEL_LENGTH;
import android.annotation.NonNull; import android.annotation.NonNull;
import android.annotation.Nullable; import android.annotation.Nullable;
import android.annotation.RequiresApi;
import android.net.LinkAddress; import android.net.LinkAddress;
import android.net.Network; import android.net.Network;
import android.net.nsd.NsdManager; import android.net.nsd.NsdManager;
import android.net.nsd.NsdServiceInfo; import android.net.nsd.NsdServiceInfo;
import android.net.nsd.OffloadEngine; import android.net.nsd.OffloadEngine;
import android.net.nsd.OffloadServiceInfo; import android.net.nsd.OffloadServiceInfo;
import android.os.Build;
import android.os.Looper; import android.os.Looper;
import android.util.ArrayMap; import android.util.ArrayMap;
import android.util.Log; import android.util.Log;
@@ -50,6 +52,7 @@ import java.util.function.Consumer;
* *
* All methods except the constructor must be called on the looper thread. * All methods except the constructor must be called on the looper thread.
*/ */
@RequiresApi(Build.VERSION_CODES.TIRAMISU)
public class MdnsAdvertiser { public class MdnsAdvertiser {
private static final String TAG = MdnsAdvertiser.class.getSimpleName(); private static final String TAG = MdnsAdvertiser.class.getSimpleName();
static final boolean DBG = Log.isLoggable(TAG, Log.DEBUG); static final boolean DBG = Log.isLoggable(TAG, Log.DEBUG);

View File

@@ -18,6 +18,8 @@ package com.android.server.connectivity.mdns;
import android.annotation.NonNull; import android.annotation.NonNull;
import android.annotation.Nullable; import android.annotation.Nullable;
import android.annotation.RequiresApi;
import android.os.Build;
import android.os.Looper; import android.os.Looper;
import com.android.internal.annotations.VisibleForTesting; import com.android.internal.annotations.VisibleForTesting;
@@ -31,6 +33,7 @@ import java.util.List;
* *
* This allows maintaining other hosts' caches up-to-date. See RFC6762 8.3. * This allows maintaining other hosts' caches up-to-date. See RFC6762 8.3.
*/ */
@RequiresApi(Build.VERSION_CODES.TIRAMISU)
public class MdnsAnnouncer extends MdnsPacketRepeater<MdnsAnnouncer.BaseAnnouncementInfo> { public class MdnsAnnouncer extends MdnsPacketRepeater<MdnsAnnouncer.BaseAnnouncementInfo> {
private static final long ANNOUNCEMENT_INITIAL_DELAY_MS = 1000L; private static final long ANNOUNCEMENT_INITIAL_DELAY_MS = 1000L;
@VisibleForTesting @VisibleForTesting

View File

@@ -35,6 +35,7 @@ import com.android.server.connectivity.mdns.util.MdnsUtils;
import java.io.IOException; import java.io.IOException;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
import java.util.Objects;
/** /**
* This class keeps tracking the set of registered {@link MdnsServiceBrowserListener} instances, and * This class keeps tracking the set of registered {@link MdnsServiceBrowserListener} instances, and
@@ -102,8 +103,12 @@ public class MdnsDiscoveryManager implements MdnsSocketClientBase.Callback {
} }
public void remove(@NonNull MdnsServiceTypeClient client) { public void remove(@NonNull MdnsServiceTypeClient client) {
final int index = clients.indexOfValue(client); for (int i = 0; i < clients.size(); ++i) {
clients.removeAt(index); if (Objects.equals(client, clients.valueAt(i))) {
clients.removeAt(i);
break;
}
}
} }
public boolean isEmpty() { public boolean isEmpty() {

View File

@@ -20,8 +20,10 @@ import static com.android.server.connectivity.mdns.MdnsConstants.NO_PACKET;
import android.annotation.NonNull; import android.annotation.NonNull;
import android.annotation.Nullable; import android.annotation.Nullable;
import android.annotation.RequiresApi;
import android.net.LinkAddress; import android.net.LinkAddress;
import android.net.nsd.NsdServiceInfo; import android.net.nsd.NsdServiceInfo;
import android.os.Build;
import android.os.Handler; import android.os.Handler;
import android.os.Looper; import android.os.Looper;
@@ -39,6 +41,7 @@ import java.util.List;
/** /**
* A class that handles advertising services on a {@link MdnsInterfaceSocket} tied to an interface. * A class that handles advertising services on a {@link MdnsInterfaceSocket} tied to an interface.
*/ */
@RequiresApi(Build.VERSION_CODES.TIRAMISU)
public class MdnsInterfaceAdvertiser implements MulticastPacketReader.PacketHandler { public class MdnsInterfaceAdvertiser implements MulticastPacketReader.PacketHandler {
private static final boolean DBG = MdnsAdvertiser.DBG; private static final boolean DBG = MdnsAdvertiser.DBG;
@VisibleForTesting @VisibleForTesting

View File

@@ -20,8 +20,10 @@ import static com.android.server.connectivity.mdns.MdnsSocket.MULTICAST_IPV4_ADD
import static com.android.server.connectivity.mdns.MdnsSocket.MULTICAST_IPV6_ADDRESS; import static com.android.server.connectivity.mdns.MdnsSocket.MULTICAST_IPV6_ADDRESS;
import android.annotation.NonNull; import android.annotation.NonNull;
import android.annotation.RequiresApi;
import android.net.LinkAddress; import android.net.LinkAddress;
import android.net.util.SocketUtils; import android.net.util.SocketUtils;
import android.os.Build;
import android.os.Handler; import android.os.Handler;
import android.os.Looper; import android.os.Looper;
import android.os.ParcelFileDescriptor; import android.os.ParcelFileDescriptor;
@@ -49,6 +51,7 @@ import java.util.List;
* @see MulticastSocket for javadoc of each public method. * @see MulticastSocket for javadoc of each public method.
* @see MulticastSocket for javadoc of each public method. * @see MulticastSocket for javadoc of each public method.
*/ */
@RequiresApi(Build.VERSION_CODES.TIRAMISU)
public class MdnsInterfaceSocket { public class MdnsInterfaceSocket {
private static final String TAG = MdnsInterfaceSocket.class.getSimpleName(); private static final String TAG = MdnsInterfaceSocket.class.getSimpleName();
@NonNull private final MulticastSocket mMulticastSocket; @NonNull private final MulticastSocket mMulticastSocket;

View File

@@ -20,8 +20,10 @@ import static com.android.server.connectivity.mdns.util.MdnsUtils.ensureRunningO
import android.annotation.NonNull; import android.annotation.NonNull;
import android.annotation.Nullable; import android.annotation.Nullable;
import android.annotation.RequiresApi;
import android.net.LinkAddress; import android.net.LinkAddress;
import android.net.Network; import android.net.Network;
import android.os.Build;
import android.os.Handler; import android.os.Handler;
import android.os.Looper; import android.os.Looper;
import android.util.ArrayMap; import android.util.ArrayMap;
@@ -40,6 +42,7 @@ import java.util.List;
* *
* * <p>This class is not thread safe. * * <p>This class is not thread safe.
*/ */
@RequiresApi(Build.VERSION_CODES.TIRAMISU)
public class MdnsMultinetworkSocketClient implements MdnsSocketClientBase { public class MdnsMultinetworkSocketClient implements MdnsSocketClientBase {
private static final String TAG = MdnsMultinetworkSocketClient.class.getSimpleName(); private static final String TAG = MdnsMultinetworkSocketClient.class.getSimpleName();
private static final boolean DBG = MdnsDiscoveryManager.DBG; private static final boolean DBG = MdnsDiscoveryManager.DBG;

View File

@@ -18,7 +18,6 @@ package com.android.server.connectivity.mdns;
import android.annotation.NonNull; import android.annotation.NonNull;
import android.annotation.Nullable; import android.annotation.Nullable;
import android.util.Log;
import java.io.EOFException; import java.io.EOFException;
import java.io.IOException; import java.io.IOException;
@@ -206,9 +205,6 @@ public class MdnsPacket {
default: { default: {
try { try {
if (MdnsAdvertiser.DBG) {
Log.i(TAG, "Skipping parsing of record of unhandled type " + type);
}
skipMdnsRecord(reader, isQuestion); skipMdnsRecord(reader, isQuestion);
return null; return null;
} catch (IOException e) { } catch (IOException e) {

View File

@@ -21,6 +21,8 @@ import static com.android.server.connectivity.mdns.MdnsRecordRepository.IPV6_ADD
import android.annotation.NonNull; import android.annotation.NonNull;
import android.annotation.Nullable; import android.annotation.Nullable;
import android.annotation.RequiresApi;
import android.os.Build;
import android.os.Handler; import android.os.Handler;
import android.os.Looper; import android.os.Looper;
import android.os.Message; import android.os.Message;
@@ -34,6 +36,7 @@ import java.net.InetSocketAddress;
* A class used to send several packets at given time intervals. * A class used to send several packets at given time intervals.
* @param <T> The type of the request providing packet repeating parameters. * @param <T> The type of the request providing packet repeating parameters.
*/ */
@RequiresApi(Build.VERSION_CODES.TIRAMISU)
public abstract class MdnsPacketRepeater<T extends MdnsPacketRepeater.Request> { public abstract class MdnsPacketRepeater<T extends MdnsPacketRepeater.Request> {
private static final boolean DBG = MdnsAdvertiser.DBG; private static final boolean DBG = MdnsAdvertiser.DBG;
private static final InetSocketAddress[] ALL_ADDRS = new InetSocketAddress[] { private static final InetSocketAddress[] ALL_ADDRS = new InetSocketAddress[] {

View File

@@ -17,6 +17,8 @@
package com.android.server.connectivity.mdns; package com.android.server.connectivity.mdns;
import android.annotation.NonNull; import android.annotation.NonNull;
import android.annotation.RequiresApi;
import android.os.Build;
import android.os.Looper; import android.os.Looper;
import com.android.internal.annotations.VisibleForTesting; import com.android.internal.annotations.VisibleForTesting;
@@ -33,6 +35,7 @@ import java.util.List;
* *
* TODO: implement receiving replies and handling conflicts. * TODO: implement receiving replies and handling conflicts.
*/ */
@RequiresApi(Build.VERSION_CODES.TIRAMISU)
public class MdnsProber extends MdnsPacketRepeater<MdnsProber.ProbingInfo> { public class MdnsProber extends MdnsPacketRepeater<MdnsProber.ProbingInfo> {
private static final long CONFLICT_RETRY_DELAY_MS = 5_000L; private static final long CONFLICT_RETRY_DELAY_MS = 5_000L;

View File

@@ -19,6 +19,8 @@ package com.android.server.connectivity.mdns;
import static com.android.server.connectivity.mdns.util.MdnsUtils.ensureRunningOnHandlerThread; import static com.android.server.connectivity.mdns.util.MdnsUtils.ensureRunningOnHandlerThread;
import android.annotation.NonNull; import android.annotation.NonNull;
import android.annotation.RequiresApi;
import android.os.Build;
import android.os.Handler; import android.os.Handler;
import android.os.Looper; import android.os.Looper;
import android.os.Message; import android.os.Message;
@@ -41,6 +43,7 @@ import java.util.Collections;
* *
* TODO: implement sending after a delay, combining queued replies and duplicate answer suppression * TODO: implement sending after a delay, combining queued replies and duplicate answer suppression
*/ */
@RequiresApi(Build.VERSION_CODES.TIRAMISU)
public class MdnsReplySender { public class MdnsReplySender {
private static final boolean DBG = MdnsAdvertiser.DBG; private static final boolean DBG = MdnsAdvertiser.DBG;
private static final int MSG_SEND = 1; private static final int MSG_SEND = 1;

View File

@@ -20,7 +20,6 @@ import android.annotation.NonNull;
import android.annotation.Nullable; import android.annotation.Nullable;
import android.net.Network; import android.net.Network;
import android.util.ArrayMap; import android.util.ArrayMap;
import android.util.ArraySet;
import android.util.Pair; import android.util.Pair;
import com.android.server.connectivity.mdns.util.MdnsUtils; import com.android.server.connectivity.mdns.util.MdnsUtils;
@@ -29,6 +28,7 @@ import java.io.EOFException;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Collection; import java.util.Collection;
import java.util.List; import java.util.List;
import java.util.Set;
/** A class that decodes mDNS responses from UDP packets. */ /** A class that decodes mDNS responses from UDP packets. */
public class MdnsResponseDecoder { public class MdnsResponseDecoder {
@@ -125,7 +125,7 @@ public class MdnsResponseDecoder {
* 2) A copy of the original responses with some of them have records * 2) A copy of the original responses with some of them have records
* update or only contains receive time updated. * update or only contains receive time updated.
*/ */
public Pair<ArraySet<MdnsResponse>, ArrayList<MdnsResponse>> augmentResponses( public Pair<Set<MdnsResponse>, ArrayList<MdnsResponse>> augmentResponses(
@NonNull MdnsPacket mdnsPacket, @NonNull MdnsPacket mdnsPacket,
@NonNull Collection<MdnsResponse> existingResponses, int interfaceIndex, @NonNull Collection<MdnsResponse> existingResponses, int interfaceIndex,
@Nullable Network network) { @Nullable Network network) {
@@ -136,7 +136,7 @@ public class MdnsResponseDecoder {
records.addAll(mdnsPacket.authorityRecords); records.addAll(mdnsPacket.authorityRecords);
records.addAll(mdnsPacket.additionalRecords); records.addAll(mdnsPacket.additionalRecords);
final ArraySet<MdnsResponse> modified = new ArraySet<>(); final Set<MdnsResponse> modified = MdnsUtils.newSet();
final ArrayList<MdnsResponse> responses = new ArrayList<>(existingResponses.size()); final ArrayList<MdnsResponse> responses = new ArrayList<>(existingResponses.size());
final ArrayMap<MdnsResponse, MdnsResponse> augmentedToOriginal = new ArrayMap<>(); final ArrayMap<MdnsResponse, MdnsResponse> augmentedToOriginal = new ArrayMap<>();
for (MdnsResponse existing : existingResponses) { for (MdnsResponse existing : existingResponses) {

View File

@@ -22,7 +22,8 @@ import android.net.Network;
import android.os.Parcel; import android.os.Parcel;
import android.os.Parcelable; import android.os.Parcelable;
import android.text.TextUtils; import android.text.TextUtils;
import android.util.ArraySet;
import com.android.server.connectivity.mdns.util.MdnsUtils;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Collection; import java.util.Collection;
@@ -46,11 +47,11 @@ public class MdnsSearchOptions implements Parcelable {
public MdnsSearchOptions createFromParcel(Parcel source) { public MdnsSearchOptions createFromParcel(Parcel source) {
return new MdnsSearchOptions( return new MdnsSearchOptions(
source.createStringArrayList(), source.createStringArrayList(),
source.readBoolean(), source.readInt() == 1,
source.readBoolean(), source.readInt() == 1,
source.readParcelable(null), source.readParcelable(null),
source.readString(), source.readString(),
source.readBoolean(), source.readInt() == 1,
source.readInt()); source.readInt());
} }
@@ -165,11 +166,11 @@ public class MdnsSearchOptions implements Parcelable {
@Override @Override
public void writeToParcel(Parcel out, int flags) { public void writeToParcel(Parcel out, int flags) {
out.writeStringList(subtypes); out.writeStringList(subtypes);
out.writeBoolean(isPassiveMode); out.writeInt(isPassiveMode ? 1 : 0);
out.writeBoolean(removeExpiredService); out.writeInt(removeExpiredService ? 1 : 0);
out.writeParcelable(mNetwork, 0); out.writeParcelable(mNetwork, 0);
out.writeString(resolveInstanceName); out.writeString(resolveInstanceName);
out.writeBoolean(onlyUseIpv6OnIpv6OnlyNetworks); out.writeInt(onlyUseIpv6OnIpv6OnlyNetworks ? 1 : 0);
out.writeInt(numOfQueriesBeforeBackoff); out.writeInt(numOfQueriesBeforeBackoff);
} }
@@ -184,7 +185,7 @@ public class MdnsSearchOptions implements Parcelable {
private String resolveInstanceName; private String resolveInstanceName;
private Builder() { private Builder() {
subtypes = new ArraySet<>(); subtypes = MdnsUtils.newSet();
} }
/** /**

View File

@@ -27,7 +27,6 @@ import android.os.Looper;
import android.os.Message; import android.os.Message;
import android.text.TextUtils; import android.text.TextUtils;
import android.util.ArrayMap; import android.util.ArrayMap;
import android.util.ArraySet;
import android.util.Pair; import android.util.Pair;
import com.android.internal.annotations.VisibleForTesting; import com.android.internal.annotations.VisibleForTesting;
@@ -42,6 +41,7 @@ import java.util.Arrays;
import java.util.Collections; import java.util.Collections;
import java.util.Iterator; import java.util.Iterator;
import java.util.List; import java.util.List;
import java.util.Set;
import java.util.concurrent.ScheduledExecutorService; import java.util.concurrent.ScheduledExecutorService;
/** /**
@@ -414,11 +414,11 @@ public class MdnsServiceTypeClient {
currentList.add(additionalResponse); currentList.add(additionalResponse);
} }
} }
final Pair<ArraySet<MdnsResponse>, ArrayList<MdnsResponse>> augmentedResult = final Pair<Set<MdnsResponse>, ArrayList<MdnsResponse>> augmentedResult =
responseDecoder.augmentResponses(packet, currentList, responseDecoder.augmentResponses(packet, currentList,
socketKey.getInterfaceIndex(), socketKey.getNetwork()); socketKey.getInterfaceIndex(), socketKey.getNetwork());
final ArraySet<MdnsResponse> modifiedResponse = augmentedResult.first; final Set<MdnsResponse> modifiedResponse = augmentedResult.first;
final ArrayList<MdnsResponse> allResponses = augmentedResult.second; final ArrayList<MdnsResponse> allResponses = augmentedResult.second;
for (MdnsResponse response : allResponses) { for (MdnsResponse response : allResponses) {

View File

@@ -19,12 +19,12 @@ package com.android.server.connectivity.mdns;
import static android.net.NetworkCapabilities.TRANSPORT_CELLULAR; import static android.net.NetworkCapabilities.TRANSPORT_CELLULAR;
import static android.net.NetworkCapabilities.TRANSPORT_VPN; import static android.net.NetworkCapabilities.TRANSPORT_VPN;
import static android.net.NetworkCapabilities.TRANSPORT_WIFI; import static android.net.NetworkCapabilities.TRANSPORT_WIFI;
import static com.android.server.connectivity.mdns.util.MdnsUtils.ensureRunningOnHandlerThread; import static com.android.server.connectivity.mdns.util.MdnsUtils.ensureRunningOnHandlerThread;
import static com.android.server.connectivity.mdns.util.MdnsUtils.isNetworkMatched; import static com.android.server.connectivity.mdns.util.MdnsUtils.isNetworkMatched;
import android.annotation.NonNull; import android.annotation.NonNull;
import android.annotation.Nullable; import android.annotation.Nullable;
import android.annotation.RequiresApi;
import android.content.BroadcastReceiver; import android.content.BroadcastReceiver;
import android.content.Context; import android.content.Context;
import android.content.Intent; import android.content.Intent;
@@ -41,6 +41,7 @@ import android.net.TetheringManager.TetheringEventCallback;
import android.net.wifi.p2p.WifiP2pGroup; import android.net.wifi.p2p.WifiP2pGroup;
import android.net.wifi.p2p.WifiP2pInfo; import android.net.wifi.p2p.WifiP2pInfo;
import android.net.wifi.p2p.WifiP2pManager; import android.net.wifi.p2p.WifiP2pManager;
import android.os.Build;
import android.os.Handler; import android.os.Handler;
import android.os.Looper; import android.os.Looper;
import android.util.ArrayMap; import android.util.ArrayMap;
@@ -67,6 +68,7 @@ import java.util.Objects;
* to their default value (0, false or null). * to their default value (0, false or null).
* *
*/ */
@RequiresApi(Build.VERSION_CODES.TIRAMISU)
public class MdnsSocketProvider { public class MdnsSocketProvider {
private static final String TAG = MdnsSocketProvider.class.getSimpleName(); private static final String TAG = MdnsSocketProvider.class.getSimpleName();
private static final boolean DBG = MdnsDiscoveryManager.DBG; private static final boolean DBG = MdnsDiscoveryManager.DBG;

View File

@@ -22,9 +22,9 @@ import android.annotation.NonNull;
import android.os.Handler; import android.os.Handler;
import android.os.ParcelFileDescriptor; import android.os.ParcelFileDescriptor;
import android.system.Os; import android.system.Os;
import android.util.ArraySet;
import com.android.net.module.util.FdEventsReader; import com.android.net.module.util.FdEventsReader;
import com.android.server.connectivity.mdns.util.MdnsUtils;
import java.io.FileDescriptor; import java.io.FileDescriptor;
import java.net.InetSocketAddress; import java.net.InetSocketAddress;
@@ -39,7 +39,7 @@ public class MulticastPacketReader extends FdEventsReader<MulticastPacketReader.
@NonNull @NonNull
private final Handler mHandler; private final Handler mHandler;
@NonNull @NonNull
private final Set<PacketHandler> mPacketHandlers = new ArraySet<>(); private final Set<PacketHandler> mPacketHandlers = MdnsUtils.newSet();
interface PacketHandler { interface PacketHandler {
void handlePacket(byte[] recvbuf, int length, InetSocketAddress src); void handlePacket(byte[] recvbuf, int length, InetSocketAddress src);

View File

@@ -19,6 +19,7 @@ package com.android.server.connectivity.mdns.util;
import android.annotation.NonNull; import android.annotation.NonNull;
import android.annotation.Nullable; import android.annotation.Nullable;
import android.net.Network; import android.net.Network;
import android.os.Build;
import android.os.Handler; import android.os.Handler;
import android.os.SystemClock; import android.os.SystemClock;
import android.util.ArraySet; import android.util.ArraySet;
@@ -34,6 +35,8 @@ import java.nio.CharBuffer;
import java.nio.charset.Charset; import java.nio.charset.Charset;
import java.nio.charset.CharsetEncoder; import java.nio.charset.CharsetEncoder;
import java.nio.charset.StandardCharsets; import java.nio.charset.StandardCharsets;
import java.util.HashSet;
import java.util.Set;
/** /**
* Mdns utility functions. * Mdns utility functions.
@@ -57,6 +60,17 @@ public class MdnsUtils {
return new String(outChars); return new String(outChars);
} }
/**
* Create a ArraySet or HashSet based on the sdk version.
*/
public static <Type> Set<Type> newSet() {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
return new ArraySet<>();
} else {
return new HashSet<>();
}
}
/** /**
* Convert the array of labels to DNS case-insensitive lowercase. * Convert the array of labels to DNS case-insensitive lowercase.
*/ */
@@ -142,7 +156,7 @@ public class MdnsUtils {
/*** Check whether the target network matches any of the current networks */ /*** Check whether the target network matches any of the current networks */
public static boolean isAnyNetworkMatched(@Nullable Network targetNetwork, public static boolean isAnyNetworkMatched(@Nullable Network targetNetwork,
ArraySet<Network> currentNetworks) { Set<Network> currentNetworks) {
if (targetNetwork == null) { if (targetNetwork == null) {
return !currentNetworks.isEmpty(); return !currentNetworks.isEmpty();
} }

View File

@@ -17,10 +17,8 @@
package com.android.server.connectivity.mdns; package com.android.server.connectivity.mdns;
import static android.net.InetAddresses.parseNumericAddress; import static android.net.InetAddresses.parseNumericAddress;
import static com.android.server.connectivity.mdns.util.MdnsUtils.Clock; import static com.android.server.connectivity.mdns.util.MdnsUtils.Clock;
import static com.android.testutils.DevSdkIgnoreRuleKt.SC_V2; import static com.android.testutils.DevSdkIgnoreRuleKt.SC_V2;
import static org.junit.Assert.assertArrayEquals; import static org.junit.Assert.assertArrayEquals;
import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertFalse;
@@ -343,9 +341,9 @@ public class MdnsResponseDecoderTests {
assertNotNull(parsedPacket); assertNotNull(parsedPacket);
final Network network = mock(Network.class); final Network network = mock(Network.class);
responses = decoder.augmentResponses(parsedPacket, responses = new ArraySet<>(decoder.augmentResponses(parsedPacket,
/* existingResponses= */ Collections.emptyList(), /* existingResponses= */ Collections.emptyList(),
/* interfaceIndex= */ 10, network /* expireOnExit= */).first; /* interfaceIndex= */ 10, network /* expireOnExit= */).first);
assertEquals(responses.size(), 1); assertEquals(responses.size(), 1);
assertEquals(responses.valueAt(0).getInterfaceIndex(), 10); assertEquals(responses.valueAt(0).getInterfaceIndex(), 10);
@@ -641,8 +639,8 @@ public class MdnsResponseDecoderTests {
final MdnsPacket parsedPacket = MdnsResponseDecoder.parseResponse(data, data.length); final MdnsPacket parsedPacket = MdnsResponseDecoder.parseResponse(data, data.length);
assertNotNull(parsedPacket); assertNotNull(parsedPacket);
return decoder.augmentResponses(parsedPacket, return new ArraySet<>(decoder.augmentResponses(parsedPacket,
existingResponses, existingResponses,
MdnsSocket.INTERFACE_INDEX_UNSPECIFIED, mock(Network.class)).first; MdnsSocket.INTERFACE_INDEX_UNSPECIFIED, mock(Network.class)).first);
} }
} }