Add MdnsDiscoveryManager constructor without looper

In some use cases for the MdnsDiscoveryManager, providing looper as an
argument to the MdnsDiscoveryManager constructor is not feasible. Adding
a constructor without looper can help to match those use cases. If
constructor without looper is used. The shutDown() must be called as a
part of cleanup process.

Bug: 283914408
Test: atest FrameworksNetTests
Change-Id: I0ab04d67bae127628c6d67c4b8c109201612a54b
This commit is contained in:
Yuyang Huang
2023-05-23 17:26:52 +09:00
parent f4cf2707e7
commit 243d1a5de4
6 changed files with 41 additions and 16 deletions

View File

@@ -73,7 +73,6 @@ import com.android.server.connectivity.mdns.MdnsMultinetworkSocketClient;
import com.android.server.connectivity.mdns.MdnsSearchOptions; import com.android.server.connectivity.mdns.MdnsSearchOptions;
import com.android.server.connectivity.mdns.MdnsServiceBrowserListener; import com.android.server.connectivity.mdns.MdnsServiceBrowserListener;
import com.android.server.connectivity.mdns.MdnsServiceInfo; import com.android.server.connectivity.mdns.MdnsServiceInfo;
import com.android.server.connectivity.mdns.MdnsSocketClientBase;
import com.android.server.connectivity.mdns.MdnsSocketProvider; import com.android.server.connectivity.mdns.MdnsSocketProvider;
import com.android.server.connectivity.mdns.util.MdnsUtils; import com.android.server.connectivity.mdns.util.MdnsUtils;
@@ -1394,8 +1393,7 @@ public class NsdService extends INsdManager.Stub {
mMdnsSocketClient = mMdnsSocketClient =
new MdnsMultinetworkSocketClient(handler.getLooper(), mMdnsSocketProvider); new MdnsMultinetworkSocketClient(handler.getLooper(), mMdnsSocketProvider);
mMdnsDiscoveryManager = deps.makeMdnsDiscoveryManager(new ExecutorProvider(), mMdnsDiscoveryManager = deps.makeMdnsDiscoveryManager(new ExecutorProvider(),
mMdnsSocketClient, LOGGER.forSubComponent("MdnsDiscoveryManager"), mMdnsSocketClient, LOGGER.forSubComponent("MdnsDiscoveryManager"));
handler.getLooper());
handler.post(() -> mMdnsSocketClient.setCallback(mMdnsDiscoveryManager)); handler.post(() -> mMdnsSocketClient.setCallback(mMdnsDiscoveryManager));
mAdvertiser = deps.makeMdnsAdvertiser(handler.getLooper(), mMdnsSocketProvider, mAdvertiser = deps.makeMdnsAdvertiser(handler.getLooper(), mMdnsSocketProvider,
new AdvertiserCallback(), LOGGER.forSubComponent("MdnsAdvertiser")); new AdvertiserCallback(), LOGGER.forSubComponent("MdnsAdvertiser"));
@@ -1453,9 +1451,8 @@ public class NsdService extends INsdManager.Stub {
*/ */
public MdnsDiscoveryManager makeMdnsDiscoveryManager( public MdnsDiscoveryManager makeMdnsDiscoveryManager(
@NonNull ExecutorProvider executorProvider, @NonNull ExecutorProvider executorProvider,
@NonNull MdnsSocketClientBase socketClient, @NonNull SharedLog sharedLog, @NonNull MdnsMultinetworkSocketClient socketClient, @NonNull SharedLog sharedLog) {
@NonNull Looper looper) { return new MdnsDiscoveryManager(executorProvider, socketClient, sharedLog);
return new MdnsDiscoveryManager(executorProvider, socketClient, sharedLog, looper);
} }
/** /**

View File

@@ -17,7 +17,6 @@
package com.android.server.connectivity.mdns; 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 static com.android.server.connectivity.mdns.util.MdnsUtils.isRunningOnHandlerThread;
import android.Manifest.permission; import android.Manifest.permission;
import android.annotation.NonNull; import android.annotation.NonNull;
@@ -25,7 +24,7 @@ import android.annotation.Nullable;
import android.annotation.RequiresPermission; import android.annotation.RequiresPermission;
import android.net.Network; import android.net.Network;
import android.os.Handler; import android.os.Handler;
import android.os.Looper; import android.os.HandlerThread;
import android.util.ArrayMap; import android.util.ArrayMap;
import android.util.Log; import android.util.Log;
import android.util.Pair; import android.util.Pair;
@@ -53,6 +52,7 @@ public class MdnsDiscoveryManager implements MdnsSocketClientBase.Callback {
@NonNull private final PerNetworkServiceTypeClients perNetworkServiceTypeClients; @NonNull private final PerNetworkServiceTypeClients perNetworkServiceTypeClients;
@NonNull private final Handler handler; @NonNull private final Handler handler;
@Nullable private final HandlerThread handlerThread;
private static class PerNetworkServiceTypeClients { private static class PerNetworkServiceTypeClients {
private final ArrayMap<Pair<String, Network>, MdnsServiceTypeClient> clients = private final ArrayMap<Pair<String, Network>, MdnsServiceTypeClient> clients =
@@ -109,23 +109,38 @@ public class MdnsDiscoveryManager implements MdnsSocketClientBase.Callback {
} }
public MdnsDiscoveryManager(@NonNull ExecutorProvider executorProvider, public MdnsDiscoveryManager(@NonNull ExecutorProvider executorProvider,
@NonNull MdnsSocketClientBase socketClient, @NonNull SharedLog sharedLog, @NonNull MdnsSocketClientBase socketClient, @NonNull SharedLog sharedLog) {
@NonNull Looper looper) {
this.executorProvider = executorProvider; this.executorProvider = executorProvider;
this.socketClient = socketClient; this.socketClient = socketClient;
this.sharedLog = sharedLog; this.sharedLog = sharedLog;
perNetworkServiceTypeClients = new PerNetworkServiceTypeClients(); this.perNetworkServiceTypeClients = new PerNetworkServiceTypeClients();
handler = new Handler(looper); if (socketClient.getLooper() != null) {
this.handlerThread = null;
this.handler = new Handler(socketClient.getLooper());
} else {
this.handlerThread = new HandlerThread(MdnsDiscoveryManager.class.getSimpleName());
this.handlerThread.start();
this.handler = new Handler(handlerThread.getLooper());
}
} }
private void checkAndRunOnHandlerThread(@NonNull Runnable function) { private void checkAndRunOnHandlerThread(@NonNull Runnable function) {
if (isRunningOnHandlerThread(handler)) { if (this.handlerThread == null) {
function.run(); function.run();
} else { } else {
handler.post(function); handler.post(function);
} }
} }
/**
* Do the cleanup of the MdnsDiscoveryManager
*/
public void shutDown() {
if (this.handlerThread != null) {
this.handlerThread.quitSafely();
}
}
/** /**
* Starts (or continue) to discovery mDNS services with given {@code serviceType}, and registers * Starts (or continue) to discovery mDNS services with given {@code serviceType}, and registers
* {@code listener} for receiving mDNS service discovery responses. * {@code listener} for receiving mDNS service discovery responses.

View File

@@ -205,6 +205,11 @@ public class MdnsMultinetworkSocketClient implements MdnsSocketClientBase {
mSocketProvider.unrequestSocket(callback); mSocketProvider.unrequestSocket(callback);
} }
@Override
public Looper getLooper() {
return mHandler.getLooper();
}
private void sendMdnsPacket(@NonNull DatagramPacket packet, @Nullable Network targetNetwork) { private void sendMdnsPacket(@NonNull DatagramPacket packet, @Nullable Network targetNetwork) {
final boolean isIpv6 = ((InetSocketAddress) packet.getSocketAddress()).getAddress() final boolean isIpv6 = ((InetSocketAddress) packet.getSocketAddress()).getAddress()
instanceof Inet6Address; instanceof Inet6Address;

View File

@@ -19,6 +19,7 @@ package com.android.server.connectivity.mdns;
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.Looper;
import java.io.IOException; import java.io.IOException;
import java.net.DatagramPacket; import java.net.DatagramPacket;
@@ -61,6 +62,11 @@ public interface MdnsSocketClientBase {
/*** Notify that the network is unrequested */ /*** Notify that the network is unrequested */
default void notifyNetworkUnrequested(@NonNull MdnsServiceBrowserListener listener) { } default void notifyNetworkUnrequested(@NonNull MdnsServiceBrowserListener listener) { }
/*** Gets looper that used by the socket client */
default Looper getLooper() {
return null;
}
/*** Callback for mdns response */ /*** Callback for mdns response */
interface Callback { interface Callback {
/*** Receive a mdns response */ /*** Receive a mdns response */

View File

@@ -179,7 +179,7 @@ public class NsdServiceTest {
anyInt(), anyString(), anyString(), anyString(), anyInt()); anyInt(), anyString(), anyString(), anyString(), anyInt());
doReturn(false).when(mDeps).isMdnsDiscoveryManagerEnabled(any(Context.class)); doReturn(false).when(mDeps).isMdnsDiscoveryManagerEnabled(any(Context.class));
doReturn(mDiscoveryManager).when(mDeps) doReturn(mDiscoveryManager).when(mDeps)
.makeMdnsDiscoveryManager(any(), any(), any(), any()); .makeMdnsDiscoveryManager(any(), any(), any());
doReturn(mSocketProvider).when(mDeps).makeMdnsSocketProvider(any(), any(), any()); doReturn(mSocketProvider).when(mDeps).makeMdnsSocketProvider(any(), any(), any());
doReturn(mAdvertiser).when(mDeps).makeMdnsAdvertiser(any(), any(), any(), any()); doReturn(mAdvertiser).when(mDeps).makeMdnsAdvertiser(any(), any(), any(), any());
mService = makeService(); mService = makeService();

View File

@@ -20,6 +20,7 @@ import static com.android.testutils.DevSdkIgnoreRuleKt.SC_V2;
import static org.mockito.ArgumentMatchers.any; import static org.mockito.ArgumentMatchers.any;
import static org.mockito.ArgumentMatchers.anyInt; import static org.mockito.ArgumentMatchers.anyInt;
import static org.mockito.Mockito.doReturn;
import static org.mockito.Mockito.eq; import static org.mockito.Mockito.eq;
import static org.mockito.Mockito.never; import static org.mockito.Mockito.never;
import static org.mockito.Mockito.times; import static org.mockito.Mockito.times;
@@ -97,8 +98,9 @@ public class MdnsDiscoveryManagerTests {
thread = new HandlerThread("MdnsDiscoveryManagerTests"); thread = new HandlerThread("MdnsDiscoveryManagerTests");
thread.start(); thread.start();
handler = new Handler(thread.getLooper()); handler = new Handler(thread.getLooper());
discoveryManager = new MdnsDiscoveryManager(executorProvider, socketClient, sharedLog, doReturn(thread.getLooper()).when(socketClient).getLooper();
thread.getLooper()) { discoveryManager = new MdnsDiscoveryManager(executorProvider, socketClient,
sharedLog) {
@Override @Override
MdnsServiceTypeClient createServiceTypeClient(@NonNull String serviceType, MdnsServiceTypeClient createServiceTypeClient(@NonNull String serviceType,
@Nullable Network network) { @Nullable Network network) {