Implement service found callback
Service found should be notified when receives the onServiceNameDiscovered callbacks from MdnsServiceBrowserListener. Bug: 254166302 Test: atest FrameworksNetTests CtsNetTestCases Change-Id: I3f41b4fe85cd85ad356fa764663187a88914412c
This commit is contained in:
@@ -244,6 +244,8 @@ public final class NsdManager {
|
|||||||
|
|
||||||
/** @hide */
|
/** @hide */
|
||||||
public static final int MDNS_MONITORING_SOCKETS_CLEANUP = 23;
|
public static final int MDNS_MONITORING_SOCKETS_CLEANUP = 23;
|
||||||
|
/** @hide */
|
||||||
|
public static final int MDNS_DISCOVERY_MANAGER_EVENT = 24;
|
||||||
|
|
||||||
/** Dns based service discovery protocol */
|
/** Dns based service discovery protocol */
|
||||||
public static final int PROTOCOL_DNS_SD = 0x0001;
|
public static final int PROTOCOL_DNS_SD = 0x0001;
|
||||||
|
|||||||
@@ -17,6 +17,7 @@
|
|||||||
package com.android.server;
|
package com.android.server;
|
||||||
|
|
||||||
import static android.net.ConnectivityManager.NETID_UNSET;
|
import static android.net.ConnectivityManager.NETID_UNSET;
|
||||||
|
import static android.net.nsd.NsdManager.MDNS_DISCOVERY_MANAGER_EVENT;
|
||||||
import static android.net.nsd.NsdManager.MDNS_SERVICE_EVENT;
|
import static android.net.nsd.NsdManager.MDNS_SERVICE_EVENT;
|
||||||
import static android.provider.DeviceConfig.NAMESPACE_CONNECTIVITY;
|
import static android.provider.DeviceConfig.NAMESPACE_CONNECTIVITY;
|
||||||
|
|
||||||
@@ -182,7 +183,9 @@ public class NsdService extends INsdManager.Stub {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void onServiceNameDiscovered(@NonNull MdnsServiceInfo serviceInfo) {
|
public void onServiceNameDiscovered(@NonNull MdnsServiceInfo serviceInfo) {
|
||||||
// TODO: implement service name discovered callback.
|
mNsdStateMachine.sendMessage(MDNS_DISCOVERY_MANAGER_EVENT, mTransactionId,
|
||||||
|
NsdManager.SERVICE_FOUND,
|
||||||
|
new MdnsEvent(mClientId, mReqServiceInfo.getServiceType(), serviceInfo));
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@@ -191,6 +194,24 @@ public class NsdService extends INsdManager.Stub {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Data class of mdns service callback information.
|
||||||
|
*/
|
||||||
|
private static class MdnsEvent {
|
||||||
|
final int mClientId;
|
||||||
|
@NonNull
|
||||||
|
final String mRequestedServiceType;
|
||||||
|
@NonNull
|
||||||
|
final MdnsServiceInfo mMdnsServiceInfo;
|
||||||
|
|
||||||
|
MdnsEvent(int clientId, @NonNull String requestedServiceType,
|
||||||
|
@NonNull MdnsServiceInfo mdnsServiceInfo) {
|
||||||
|
mClientId = clientId;
|
||||||
|
mRequestedServiceType = requestedServiceType;
|
||||||
|
mMdnsServiceInfo = mdnsServiceInfo;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
private class NsdStateMachine extends StateMachine {
|
private class NsdStateMachine extends StateMachine {
|
||||||
|
|
||||||
private final DefaultState mDefaultState = new DefaultState();
|
private final DefaultState mDefaultState = new DefaultState();
|
||||||
@@ -636,6 +657,11 @@ public class NsdService extends INsdManager.Stub {
|
|||||||
return NOT_HANDLED;
|
return NOT_HANDLED;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
case MDNS_DISCOVERY_MANAGER_EVENT:
|
||||||
|
if (!handleMdnsDiscoveryManagerEvent(msg.arg1, msg.arg2, msg.obj)) {
|
||||||
|
return NOT_HANDLED;
|
||||||
|
}
|
||||||
|
break;
|
||||||
default:
|
default:
|
||||||
return NOT_HANDLED;
|
return NOT_HANDLED;
|
||||||
}
|
}
|
||||||
@@ -798,6 +824,45 @@ public class NsdService extends INsdManager.Stub {
|
|||||||
}
|
}
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private NsdServiceInfo buildNsdServiceInfoFromMdnsEvent(final MdnsEvent event) {
|
||||||
|
final MdnsServiceInfo serviceInfo = event.mMdnsServiceInfo;
|
||||||
|
final String serviceType = event.mRequestedServiceType;
|
||||||
|
final String serviceName = serviceInfo.getServiceInstanceName();
|
||||||
|
final NsdServiceInfo servInfo = new NsdServiceInfo(serviceName, serviceType);
|
||||||
|
final Network network = serviceInfo.getNetwork();
|
||||||
|
setServiceNetworkForCallback(
|
||||||
|
servInfo,
|
||||||
|
network == null ? NETID_UNSET : network.netId,
|
||||||
|
serviceInfo.getInterfaceIndex());
|
||||||
|
return servInfo;
|
||||||
|
}
|
||||||
|
|
||||||
|
private boolean handleMdnsDiscoveryManagerEvent(
|
||||||
|
int transactionId, int code, Object obj) {
|
||||||
|
final ClientInfo clientInfo = mIdToClientInfoMap.get(transactionId);
|
||||||
|
if (clientInfo == null) {
|
||||||
|
Log.e(TAG, String.format(
|
||||||
|
"id %d for %d has no client mapping", transactionId, code));
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
final MdnsEvent event = (MdnsEvent) obj;
|
||||||
|
final int clientId = event.mClientId;
|
||||||
|
if (DBG) {
|
||||||
|
Log.d(TAG, String.format("MdnsDiscoveryManager event code=%s transactionId=%d",
|
||||||
|
NsdManager.nameOf(code), transactionId));
|
||||||
|
}
|
||||||
|
switch (code) {
|
||||||
|
case NsdManager.SERVICE_FOUND:
|
||||||
|
clientInfo.onServiceFound(
|
||||||
|
clientId, buildNsdServiceInfoFromMdnsEvent(event));
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -73,6 +73,8 @@ import androidx.test.filters.SmallTest;
|
|||||||
|
|
||||||
import com.android.server.NsdService.Dependencies;
|
import com.android.server.NsdService.Dependencies;
|
||||||
import com.android.server.connectivity.mdns.MdnsDiscoveryManager;
|
import com.android.server.connectivity.mdns.MdnsDiscoveryManager;
|
||||||
|
import com.android.server.connectivity.mdns.MdnsServiceBrowserListener;
|
||||||
|
import com.android.server.connectivity.mdns.MdnsServiceInfo;
|
||||||
import com.android.server.connectivity.mdns.MdnsSocketProvider;
|
import com.android.server.connectivity.mdns.MdnsSocketProvider;
|
||||||
import com.android.testutils.DevSdkIgnoreRule;
|
import com.android.testutils.DevSdkIgnoreRule;
|
||||||
import com.android.testutils.DevSdkIgnoreRunner;
|
import com.android.testutils.DevSdkIgnoreRunner;
|
||||||
@@ -90,6 +92,7 @@ import org.mockito.Mock;
|
|||||||
import org.mockito.MockitoAnnotations;
|
import org.mockito.MockitoAnnotations;
|
||||||
|
|
||||||
import java.util.LinkedList;
|
import java.util.LinkedList;
|
||||||
|
import java.util.List;
|
||||||
import java.util.Queue;
|
import java.util.Queue;
|
||||||
|
|
||||||
// TODOs:
|
// TODOs:
|
||||||
@@ -594,13 +597,35 @@ public class NsdServiceTest {
|
|||||||
final Network network = new Network(999);
|
final Network network = new Network(999);
|
||||||
final String serviceTypeWithLocalDomain = SERVICE_TYPE + ".local";
|
final String serviceTypeWithLocalDomain = SERVICE_TYPE + ".local";
|
||||||
// Verify the discovery start / stop.
|
// Verify the discovery start / stop.
|
||||||
|
final ArgumentCaptor<MdnsServiceBrowserListener> listenerCaptor =
|
||||||
|
ArgumentCaptor.forClass(MdnsServiceBrowserListener.class);
|
||||||
client.discoverServices(SERVICE_TYPE, PROTOCOL, network, r -> r.run(), discListener);
|
client.discoverServices(SERVICE_TYPE, PROTOCOL, network, r -> r.run(), discListener);
|
||||||
waitForIdle();
|
waitForIdle();
|
||||||
verify(mSocketProvider).startMonitoringSockets();
|
verify(mSocketProvider).startMonitoringSockets();
|
||||||
verify(mDiscoveryManager).registerListener(eq(serviceTypeWithLocalDomain), any(),
|
verify(mDiscoveryManager).registerListener(eq(serviceTypeWithLocalDomain),
|
||||||
argThat(options -> network.equals(options.getNetwork())));
|
listenerCaptor.capture(), argThat(options -> network.equals(options.getNetwork())));
|
||||||
verify(discListener, timeout(TIMEOUT_MS)).onDiscoveryStarted(SERVICE_TYPE);
|
verify(discListener, timeout(TIMEOUT_MS)).onDiscoveryStarted(SERVICE_TYPE);
|
||||||
|
|
||||||
|
final MdnsServiceBrowserListener listener = listenerCaptor.getValue();
|
||||||
|
final MdnsServiceInfo mdnsServiceInfo = new MdnsServiceInfo(
|
||||||
|
SERVICE_NAME, /* serviceInstanceName */
|
||||||
|
serviceTypeWithLocalDomain.split("\\."), /* serviceType */
|
||||||
|
List.of(), /* subtypes */
|
||||||
|
new String[] {"android", "local"}, /* hostName */
|
||||||
|
12345, /* port */
|
||||||
|
"192.0.2.0", /* ipv4Address */
|
||||||
|
"2001:db8::", /* ipv6Address */
|
||||||
|
List.of(), /* textStrings */
|
||||||
|
List.of(), /* textEntries */
|
||||||
|
1234, /* interfaceIndex */
|
||||||
|
network);
|
||||||
|
// Verify onServiceNameFound callback
|
||||||
|
listener.onServiceNameDiscovered(mdnsServiceInfo);
|
||||||
|
verify(discListener, timeout(TIMEOUT_MS)).onServiceFound(argThat(info ->
|
||||||
|
info.getServiceName().equals(SERVICE_NAME)
|
||||||
|
&& info.getServiceType().equals(SERVICE_TYPE)
|
||||||
|
&& info.getNetwork().equals(network)));
|
||||||
|
|
||||||
client.stopServiceDiscovery(discListener);
|
client.stopServiceDiscovery(discListener);
|
||||||
waitForIdle();
|
waitForIdle();
|
||||||
verify(mDiscoveryManager).unregisterListener(eq(serviceTypeWithLocalDomain), any());
|
verify(mDiscoveryManager).unregisterListener(eq(serviceTypeWithLocalDomain), any());
|
||||||
|
|||||||
Reference in New Issue
Block a user