package org.protocoderrunner.network;
import android.app.Activity;
import android.content.Context;
import android.net.nsd.NsdManager;
import android.net.nsd.NsdServiceInfo;
import android.util.Log;
import org.protocoderrunner.apprunner.AppRunnerActivity;
import org.protocoderrunner.utils.MLog;
import java.net.InetAddress;
/**
* Created by victormanueldiazbarrales on 18/07/14.
*/
public class ServiceDiscovery {
private static final String TAG = "ServiceDiscovery";
public Create create(AppRunnerActivity a, String serviceName, String serviceType, int port, CreateCB callbackfn) {
return new Create(a, serviceName, serviceType, port, callbackfn);
}
public Discover discover(AppRunnerActivity a, String serviceType, DiscoverCB callbackfn) {
return new Discover(a, serviceType, callbackfn);
}
// --------- CreateCB ---------//
public interface CreateCB {
void event(String mServiceName, String registered);
}
public class Create {
private final NsdManager mNsdManager;
private NsdManager.RegistrationListener mRegistrationListener;
public String mServiceName;
Create(Activity a, String name, String serviceType, int port, final CreateCB callbackfn) {
mServiceName = name;
// Create the NsdServiceInfo object, and populate it.
NsdServiceInfo serviceInfo = new NsdServiceInfo();
// The name is subject to change based on conflicts
// with other services advertised on the same network.
serviceInfo.setServiceName(name);
serviceInfo.setServiceType(serviceType);
serviceInfo.setPort(port);
mNsdManager = (NsdManager) a.getSystemService(Context.NSD_SERVICE);
mRegistrationListener = new NsdManager.RegistrationListener() {
@Override
public void onServiceRegistered(NsdServiceInfo NsdServiceInfo) {
// Save the service name. Android may have changed it in order to
// resolve a conflict, so update the name you initially requested
// with the name Android actually used.
mServiceName = NsdServiceInfo.getServiceName();
callbackfn.event(mServiceName, "registered");
}
@Override
public void onRegistrationFailed(NsdServiceInfo serviceInfo, int errorCode) {
// Registration failed! Put debugging code here to determine why.
callbackfn.event(mServiceName, "registration_failed");
}
@Override
public void onServiceUnregistered(NsdServiceInfo arg0) {
// Service has been unregistered. This only happens when you call
// NsdManager.unregisterService() and pass in this listener.
callbackfn.event(mServiceName, "unregistered");
}
@Override
public void onUnregistrationFailed(NsdServiceInfo serviceInfo, int errorCode) {
// Unregistration failed. Put debugging code here to determine why.
callbackfn.event(mServiceName, "unregistration_failed");
}
};
mNsdManager.registerService(
serviceInfo, NsdManager.PROTOCOL_DNS_SD, mRegistrationListener);
}
public void stop() {
mNsdManager.unregisterService(mRegistrationListener);
}
}
// --------- DiscoverCB ---------//
public interface DiscoverCB {
void event(String mServiceName, NsdServiceInfo serviceInfo);
}
public class Discover {
final NsdManager mNsdManager;
NsdManager.DiscoveryListener mDiscoveryListener;
Discover(Activity a, final String serviceType, final DiscoverCB callbackfn) {
mNsdManager = (NsdManager) a.getSystemService(Context.NSD_SERVICE);
// Instantiate a new DiscoveryListener
mDiscoveryListener = new NsdManager.DiscoveryListener() {
// Called as soon as service discovery begins.
@Override
public void onDiscoveryStarted(String regType) {
MLog.d(TAG, "Service discovery started");
callbackfn.event("start", null);
}
@Override
public void onServiceFound(NsdServiceInfo serviceInfo) {
// A service was found! Do something with it.
//mService = serviceInfo;
int port = serviceInfo.getPort();
String serviceName = serviceInfo.getServiceName();
InetAddress host = serviceInfo.getHost();
callbackfn.event("discovered", serviceInfo);
}
@Override
public void onServiceLost(NsdServiceInfo service) {
// When the network service is no longer available.
// Internal bookkeeping code goes here.
Log.e(TAG, "service lost" + service);
}
@Override
public void onDiscoveryStopped(String serviceType) {
Log.i(TAG, "Discovery stopped: " + serviceType);
}
@Override
public void onStartDiscoveryFailed(String serviceType, int errorCode) {
Log.e(TAG, "Discovery failed: Error code:" + errorCode);
//mNsdManager.stopServiceDiscovery(this);
}
@Override
public void onStopDiscoveryFailed(String serviceType, int errorCode) {
Log.e(TAG, "Discovery failed: Error code:" + errorCode);
//mNsdManager.stopServiceDiscovery(this);
}
};
mNsdManager.discoverServices(serviceType, NsdManager.PROTOCOL_DNS_SD, mDiscoveryListener);
}
public void stop() {
mNsdManager.stopServiceDiscovery(mDiscoveryListener);
}
}
}