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:
@@ -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);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
@@ -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.
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|||||||
@@ -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 */
|
||||||
|
|||||||
@@ -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();
|
||||||
|
|||||||
@@ -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) {
|
||||||
|
|||||||
Reference in New Issue
Block a user