mirror of
https://github.com/badaix/snapcast.git
synced 2025-08-04 00:59:32 +02:00
Added NsdHelper class
This commit is contained in:
parent
a2b28d3675
commit
ce27c14383
3 changed files with 162 additions and 85 deletions
|
@ -1,7 +1,7 @@
|
|||
package de.badaix.snapcast;
|
||||
|
||||
import android.support.v7.app.AppCompatActivity;
|
||||
import android.os.Bundle;
|
||||
import android.support.v7.app.AppCompatActivity;
|
||||
|
||||
public class AboutActivity extends AppCompatActivity {
|
||||
|
||||
|
|
|
@ -7,7 +7,6 @@ import android.content.ServiceConnection;
|
|||
import android.content.SharedPreferences;
|
||||
import android.media.AudioManager;
|
||||
import android.net.Uri;
|
||||
import android.net.nsd.NsdManager;
|
||||
import android.net.nsd.NsdServiceInfo;
|
||||
import android.os.Build;
|
||||
import android.os.Bundle;
|
||||
|
@ -36,18 +35,17 @@ import de.badaix.snapcast.control.ClientInfo;
|
|||
import de.badaix.snapcast.control.RemoteControl;
|
||||
import de.badaix.snapcast.control.ServerInfo;
|
||||
|
||||
public class MainActivity extends AppCompatActivity implements ClientInfoItem.ClientInfoItemListener, RemoteControl.RemoteControlListener, SnapclientService.SnapclientListener {
|
||||
public class MainActivity extends AppCompatActivity implements ClientInfoItem.ClientInfoItemListener, RemoteControl.RemoteControlListener, SnapclientService.SnapclientListener, NsdHelper.NsdHelperListener {
|
||||
|
||||
private static final String TAG = "Main";
|
||||
boolean bound = false;
|
||||
private MenuItem miStartStop = null;
|
||||
private NsdManager.DiscoveryListener mDiscoveryListener;
|
||||
private NsdManager mNsdManager = null;
|
||||
private String host = "";
|
||||
private int port = 1704;
|
||||
private RemoteControl remoteControl = null;
|
||||
private ClientInfoAdapter clientInfoAdapter;
|
||||
private SnapclientService snapclientService;
|
||||
|
||||
/**
|
||||
* ATTENTION: This was auto-generated to implement the App Indexing API.
|
||||
* See https://g.co/AppIndexing/AndroidStudio for more information.
|
||||
|
@ -111,7 +109,7 @@ public class MainActivity extends AppCompatActivity implements ClientInfoItem.Cl
|
|||
Log.d(TAG, "done copying snapclient");
|
||||
}
|
||||
}).start();
|
||||
initializeDiscoveryListener();
|
||||
// initializeDiscoveryListener();
|
||||
// ATTENTION: This was auto-generated to implement the App Indexing API.
|
||||
// See https://g.co/AppIndexing/AndroidStudio for more information.
|
||||
client = new GoogleApiClient.Builder(this).addApi(AppIndex.API).build();
|
||||
|
@ -140,10 +138,11 @@ public class MainActivity extends AppCompatActivity implements ClientInfoItem.Cl
|
|||
|
||||
//noinspection SimplifiableIfStatement
|
||||
if (id == R.id.action_scan) {
|
||||
initializeDiscoveryListener();
|
||||
// NsdHelper.getInstance(this).startListening("*._tcp.", "SnapCast", this);
|
||||
NsdHelper.getInstance(this).startListening("_snapcast._tcp.", "SnapCast", this);
|
||||
return true;
|
||||
} else if (id == R.id.action_play_stop) {
|
||||
if (snapclientService.isRunning()) {
|
||||
if (bound && snapclientService.isRunning()) {
|
||||
stopSnapclient();
|
||||
} else {
|
||||
startSnapclient();
|
||||
|
@ -169,7 +168,7 @@ public class MainActivity extends AppCompatActivity implements ClientInfoItem.Cl
|
|||
}
|
||||
|
||||
private void updateStartStopMenuItem() {
|
||||
if (snapclientService.isRunning()) {
|
||||
if (bound && snapclientService.isRunning()) {
|
||||
miStartStop.setIcon(R.drawable.ic_media_stop);
|
||||
} else {
|
||||
miStartStop.setIcon(R.drawable.ic_media_play);
|
||||
|
@ -187,7 +186,8 @@ public class MainActivity extends AppCompatActivity implements ClientInfoItem.Cl
|
|||
}
|
||||
|
||||
private void stopSnapclient() {
|
||||
snapclientService.stopPlayer();
|
||||
if (bound)
|
||||
snapclientService.stopPlayer();
|
||||
// stopService(new Intent(this, SnapclientService.class));
|
||||
getWindow().clearFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
|
||||
}
|
||||
|
@ -206,88 +206,20 @@ public class MainActivity extends AppCompatActivity implements ClientInfoItem.Cl
|
|||
remoteControl = null;
|
||||
}
|
||||
|
||||
public void initializeDiscoveryListener() {
|
||||
|
||||
// Instantiate a new DiscoveryListener
|
||||
mDiscoveryListener = new NsdManager.DiscoveryListener() {
|
||||
|
||||
private void setStatus(final String text) {
|
||||
Log.e(TAG, text);
|
||||
MainActivity.this.runOnUiThread(new Runnable() {
|
||||
@Override
|
||||
public void run() {
|
||||
ActionBar actionBar = getSupportActionBar();
|
||||
if (actionBar != null)
|
||||
actionBar.setSubtitle(text);
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
// Called as soon as service discovery begins.
|
||||
@Override
|
||||
public void onDiscoveryStarted(String regType) {
|
||||
Log.d(TAG, "Service discovery started");
|
||||
setStatus("Searching for a Snapserver");
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onServiceFound(NsdServiceInfo service) {
|
||||
// A service was found! Do something with it.
|
||||
Log.d(TAG, "Service discovery success" + service);
|
||||
mNsdManager.resolveService(service, new NsdManager.ResolveListener() {
|
||||
@Override
|
||||
public void onResolveFailed(NsdServiceInfo nsdServiceInfo, int i) {
|
||||
setStatus("Failed: " + i);
|
||||
mNsdManager.stopServiceDiscovery(mDiscoveryListener);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onServiceResolved(NsdServiceInfo nsdServiceInfo) {
|
||||
Log.d(TAG, "resolved: " + nsdServiceInfo);
|
||||
host = nsdServiceInfo.getHost().getCanonicalHostName();
|
||||
port = nsdServiceInfo.getPort();
|
||||
setStatus(host + ":" + port);
|
||||
startRemoteControl();
|
||||
mNsdManager.stopServiceDiscovery(mDiscoveryListener);
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
@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) {
|
||||
setStatus("StartDiscovery failed: " + errorCode);
|
||||
mNsdManager.stopServiceDiscovery(this);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onStopDiscoveryFailed(String serviceType, int errorCode) {
|
||||
setStatus("StopDiscovery failed: " + errorCode);
|
||||
mNsdManager.stopServiceDiscovery(this);
|
||||
}
|
||||
};
|
||||
|
||||
mNsdManager = (NsdManager) getSystemService(Context.NSD_SERVICE);
|
||||
mNsdManager.discoverServices("_snapcast._tcp.", NsdManager.PROTOCOL_DNS_SD, mDiscoveryListener);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onResume() {
|
||||
super.onResume();
|
||||
NsdHelper.getInstance(this).startListening("_snapcast._tcp.", "SnapCast", this);
|
||||
startRemoteControl();
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void onPause() {
|
||||
NsdHelper.getInstance(this).stopListening();
|
||||
super.onPause();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onStart() {
|
||||
super.onStart();
|
||||
|
@ -443,6 +375,27 @@ public class MainActivity extends AppCompatActivity implements ClientInfoItem.Cl
|
|||
clientInfoAdapter.updateServer(serverInfo);
|
||||
}
|
||||
|
||||
private void setActionbarSubtitle(final String subtitle) {
|
||||
MainActivity.this.runOnUiThread(new Runnable() {
|
||||
@Override
|
||||
public void run() {
|
||||
ActionBar actionBar = getSupportActionBar();
|
||||
if (actionBar != null)
|
||||
actionBar.setSubtitle(subtitle);
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onResolved(NsdHelper nsdHelper, NsdServiceInfo serviceInfo) {
|
||||
Log.d(TAG, "resolved: " + serviceInfo);
|
||||
host = serviceInfo.getHost().getCanonicalHostName();
|
||||
port = serviceInfo.getPort();
|
||||
setActionbarSubtitle(host + ":" + port);
|
||||
startRemoteControl();
|
||||
NsdHelper.getInstance(this).stopListening();
|
||||
}
|
||||
|
||||
private class ClientInfoAdapter extends ArrayAdapter<ClientInfo> {
|
||||
private Context context;
|
||||
private ClientInfoItem.ClientInfoItemListener listener;
|
||||
|
|
124
android/Snapcast/src/main/java/de/badaix/snapcast/NsdHelper.java
Normal file
124
android/Snapcast/src/main/java/de/badaix/snapcast/NsdHelper.java
Normal file
|
@ -0,0 +1,124 @@
|
|||
package de.badaix.snapcast;
|
||||
|
||||
/**
|
||||
* Created by johannes on 19.01.16.
|
||||
*/
|
||||
|
||||
import android.content.Context;
|
||||
import android.net.nsd.NsdManager;
|
||||
import android.net.nsd.NsdServiceInfo;
|
||||
import android.util.Log;
|
||||
|
||||
import java.net.InetAddress;
|
||||
|
||||
public class NsdHelper {
|
||||
|
||||
public interface NsdHelperListener {
|
||||
void onResolved(NsdHelper nsdHelper, NsdServiceInfo serviceInfo);
|
||||
}
|
||||
|
||||
private static final String TAG = "NsdHelper";
|
||||
private String serviceName;
|
||||
private String serviceType;
|
||||
// private static final String NSD_SERVICE_TYPE = "_http._tcp.";
|
||||
private int mPort;
|
||||
private InetAddress mHost;
|
||||
private NsdManager mNsdManager;
|
||||
private android.net.nsd.NsdManager.DiscoveryListener mDiscoveryListener = null;
|
||||
private android.net.nsd.NsdManager.ResolveListener mResolveListener = null;
|
||||
private Context mContext;
|
||||
private NsdHelperListener listener = null;
|
||||
private static NsdHelper mInstance;
|
||||
|
||||
private NsdHelper(Context context) {
|
||||
mContext = context;
|
||||
}
|
||||
|
||||
public static NsdHelper getInstance(Context context) {
|
||||
if (mInstance == null) {
|
||||
mInstance = new NsdHelper(context);
|
||||
} else {
|
||||
mInstance.mContext = context;
|
||||
}
|
||||
return mInstance;
|
||||
}
|
||||
|
||||
public void startListening(String serviceType, String serviceName, NsdHelperListener listener) {
|
||||
stopListening();
|
||||
this.listener = listener;
|
||||
this.serviceName = serviceName;
|
||||
this.serviceType = serviceType;
|
||||
initializeResolveListener();
|
||||
initializeDiscoveryListener();
|
||||
mNsdManager = (NsdManager) mContext.getSystemService(Context.NSD_SERVICE);
|
||||
mNsdManager.discoverServices(serviceType, NsdManager.PROTOCOL_DNS_SD, mDiscoveryListener);
|
||||
// mNsdManager.discoverServices("_snapcast-jsonrpc._tcp.", NsdManager.PROTOCOL_DNS_SD, mDiscoveryListener);
|
||||
}
|
||||
|
||||
public void stopListening() {
|
||||
if (mDiscoveryListener != null) {
|
||||
try {
|
||||
mNsdManager.stopServiceDiscovery(mDiscoveryListener);
|
||||
} finally {
|
||||
}
|
||||
mDiscoveryListener = null;
|
||||
}
|
||||
}
|
||||
|
||||
private void initializeResolveListener() {
|
||||
mResolveListener = new NsdManager.ResolveListener() {
|
||||
@Override
|
||||
public void onResolveFailed(NsdServiceInfo serviceInfo, int errorCode) {
|
||||
Log.d(TAG, "Resolve failed");
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onServiceResolved(NsdServiceInfo serviceInfo) {
|
||||
NsdServiceInfo info = serviceInfo;
|
||||
mHost = info.getHost();
|
||||
mPort = info.getPort();
|
||||
Log.d(TAG, "Service resolved :" + mHost + ":" + mPort);
|
||||
listener.onResolved(NsdHelper.this, serviceInfo);
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
private void initializeDiscoveryListener() {
|
||||
mDiscoveryListener = new NsdManager.DiscoveryListener() {
|
||||
@Override
|
||||
public void onStartDiscoveryFailed(String serviceType, int errorCode) {
|
||||
Log.d(TAG, "Discovery failed");
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onStopDiscoveryFailed(String serviceType, int errorCode) {
|
||||
Log.d(TAG, "Stopping discovery failed");
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onDiscoveryStarted(String serviceType) {
|
||||
Log.d(TAG, "Discovery started");
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onDiscoveryStopped(String serviceType) {
|
||||
Log.d(TAG, "Discovery stopped");
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onServiceFound(NsdServiceInfo serviceInfo) {
|
||||
NsdServiceInfo info = serviceInfo;
|
||||
Log.d(TAG, "Service found: " + info.getServiceName());
|
||||
if (info.getServiceName().equals(serviceName))
|
||||
mNsdManager.resolveService(info, mResolveListener);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onServiceLost(NsdServiceInfo serviceInfo) {
|
||||
NsdServiceInfo info = serviceInfo;
|
||||
Log.d(TAG, "Service lost: " + info.getServiceName());
|
||||
}
|
||||
};
|
||||
}
|
||||
}
|
||||
|
Loading…
Add table
Add a link
Reference in a new issue