mirror of
https://github.com/badaix/snapcast.git
synced 2025-08-02 16:19:09 +02:00
explicit server configuration
This commit is contained in:
parent
ad46a6d19d
commit
a844c09bde
13 changed files with 325 additions and 47 deletions
|
@ -22,11 +22,13 @@ import android.support.v7.app.ActionBar;
|
|||
import android.support.v7.app.AlertDialog;
|
||||
import android.support.v7.app.AppCompatActivity;
|
||||
import android.support.v7.widget.Toolbar;
|
||||
import android.text.TextUtils;
|
||||
import android.util.Log;
|
||||
import android.view.Menu;
|
||||
import android.view.MenuItem;
|
||||
import android.view.View;
|
||||
import android.view.WindowManager;
|
||||
import android.widget.Toast;
|
||||
|
||||
import com.google.android.gms.appindexing.Action;
|
||||
import com.google.android.gms.appindexing.AppIndex;
|
||||
|
@ -49,8 +51,10 @@ public class MainActivity extends AppCompatActivity implements ClientListFragmen
|
|||
|
||||
boolean bound = false;
|
||||
private MenuItem miStartStop = null;
|
||||
private MenuItem miSettings = null;
|
||||
private String host = "";
|
||||
private int port = 1704;
|
||||
private int controlPort = 1705;
|
||||
private RemoteControl remoteControl = null;
|
||||
private ServerInfo serverInfo = null;
|
||||
private SnapclientService snapclientService;
|
||||
|
@ -168,11 +172,13 @@ public class MainActivity extends AppCompatActivity implements ClientListFragmen
|
|||
// Inflate the menu; this adds items to the action bar if it is present.
|
||||
getMenuInflater().inflate(R.menu.menu_snapcast, menu);
|
||||
miStartStop = menu.findItem(R.id.action_play_stop);
|
||||
miSettings = menu.findItem(R.id.action_settings);
|
||||
updateStartStopMenuItem();
|
||||
boolean isChecked = Settings.getInstance(this).getBoolean("hide_offline", false);
|
||||
MenuItem menuItem = menu.findItem(R.id.action_hide_offline);
|
||||
menuItem.setChecked(isChecked);
|
||||
sectionsPagerAdapter.setHideOffline(isChecked);
|
||||
setHost(host, port, controlPort);
|
||||
return true;
|
||||
}
|
||||
|
||||
|
@ -184,9 +190,18 @@ public class MainActivity extends AppCompatActivity implements ClientListFragmen
|
|||
int id = item.getItemId();
|
||||
|
||||
//noinspection SimplifiableIfStatement
|
||||
if (id == R.id.action_scan) {
|
||||
if (id == R.id.action_settings) {
|
||||
// NsdHelper.getInstance(this).startListening("*._tcp.", "SnapCast", this);
|
||||
NsdHelper.getInstance(this).startListening("_snapcast._tcp.", SERVICE_NAME, this);
|
||||
ServerDialogFragment serverDialogFragment = new ServerDialogFragment();
|
||||
serverDialogFragment.setHost(Settings.getInstance(this).getHost(), Settings.getInstance(this).getStreamPort(), Settings.getInstance(this).getControlPort());
|
||||
serverDialogFragment.setListener(new ServerDialogFragment.ServerDialogListener() {
|
||||
@Override
|
||||
public void onHostChanged(String host, int streamPort, int controlPort) {
|
||||
setHost(host, streamPort, controlPort);
|
||||
}
|
||||
});
|
||||
serverDialogFragment.show(getSupportFragmentManager(), "serverDialogFragment");
|
||||
// NsdHelper.getInstance(this).startListening("_snapcast._tcp.", SERVICE_NAME, this);
|
||||
return true;
|
||||
} else if (id == R.id.action_play_stop) {
|
||||
if (bound && snapclientService.isRunning()) {
|
||||
|
@ -253,7 +268,7 @@ public class MainActivity extends AppCompatActivity implements ClientListFragmen
|
|||
if (remoteControl == null)
|
||||
remoteControl = new RemoteControl(this);
|
||||
if (!host.isEmpty())
|
||||
remoteControl.connect(host, port + 1);
|
||||
remoteControl.connect(host, controlPort);
|
||||
}
|
||||
|
||||
private void stopRemoteControl() {
|
||||
|
@ -274,7 +289,10 @@ public class MainActivity extends AppCompatActivity implements ClientListFragmen
|
|||
public void onStart() {
|
||||
super.onStart();
|
||||
|
||||
NsdHelper.getInstance(this).startListening("_snapcast._tcp.", SERVICE_NAME, this);
|
||||
if (TextUtils.isEmpty(Settings.getInstance(this).getHost()))
|
||||
NsdHelper.getInstance(this).startListening("_snapcast._tcp.", SERVICE_NAME, this);
|
||||
else
|
||||
setHost(Settings.getInstance(this).getHost(), Settings.getInstance(this).getStreamPort(), Settings.getInstance(this).getControlPort());
|
||||
|
||||
Intent intent = new Intent(this, SnapclientService.class);
|
||||
bindService(intent, mConnection, Context.BIND_AUTO_CREATE);
|
||||
|
@ -457,13 +475,34 @@ public class MainActivity extends AppCompatActivity implements ClientListFragmen
|
|||
});
|
||||
}
|
||||
|
||||
private void setHost(final String host, final int streamPort, final int controlPort) {
|
||||
if (TextUtils.isEmpty(host))
|
||||
return;
|
||||
|
||||
this.host = host;
|
||||
this.port = streamPort;
|
||||
this.controlPort = controlPort;
|
||||
Settings.getInstance(this).setHost(host, streamPort, controlPort);
|
||||
this.runOnUiThread(new Runnable() {
|
||||
@Override
|
||||
public void run() {
|
||||
if (miSettings != null)
|
||||
miSettings.setShowAsAction(MenuItem.SHOW_AS_ACTION_NEVER);
|
||||
if (miStartStop != null)
|
||||
miStartStop.setVisible(true);
|
||||
setActionbarSubtitle(host + ":" + streamPort);
|
||||
}
|
||||
});
|
||||
startRemoteControl();
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public void onResolved(NsdHelper nsdHelper, NsdServiceInfo serviceInfo) {
|
||||
Log.d(TAG, "resolved: " + serviceInfo);
|
||||
host = serviceInfo.getHost().getCanonicalHostName();
|
||||
port = serviceInfo.getPort();
|
||||
setActionbarSubtitle(host + ":" + port);
|
||||
startRemoteControl();
|
||||
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) {
|
||||
setHost(serviceInfo.getHost().getCanonicalHostName(), serviceInfo.getPort(), serviceInfo.getPort() + 1);
|
||||
}
|
||||
NsdHelper.getInstance(this).stopListening();
|
||||
}
|
||||
|
||||
|
|
|
@ -0,0 +1,129 @@
|
|||
package de.badaix.snapcast;
|
||||
|
||||
import android.app.Dialog;
|
||||
import android.content.DialogInterface;
|
||||
import android.net.nsd.NsdServiceInfo;
|
||||
import android.os.Build;
|
||||
import android.os.Bundle;
|
||||
import android.support.v4.app.DialogFragment;
|
||||
import android.support.v7.app.AlertDialog;
|
||||
import android.view.LayoutInflater;
|
||||
import android.view.View;
|
||||
import android.widget.Button;
|
||||
import android.widget.EditText;
|
||||
|
||||
import de.badaix.snapcast.utils.NsdHelper;
|
||||
|
||||
/**
|
||||
* Created by johannes on 21.02.16.
|
||||
*/
|
||||
public class ServerDialogFragment extends DialogFragment implements View.OnClickListener {
|
||||
|
||||
private Button btnScan;
|
||||
private EditText editHost;
|
||||
private EditText editStreamPort;
|
||||
private EditText editControlPort;
|
||||
private String host = "";
|
||||
private int streamPort = 1704;
|
||||
private int controlPort = 1705;
|
||||
private ServerDialogListener listener = null;
|
||||
|
||||
public void setListener(ServerDialogListener listener) {
|
||||
this.listener = listener;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Dialog onCreateDialog(Bundle savedInstanceState) {
|
||||
AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
|
||||
// Get the layout inflater
|
||||
LayoutInflater inflater = getActivity().getLayoutInflater();
|
||||
// Inflate and set the layout for the dialog
|
||||
// Pass null as the parent view because its going in the dialog layout
|
||||
View view = inflater.inflate(R.layout.dialog_server, null);
|
||||
btnScan = (Button) view.findViewById(R.id.btn_scan);
|
||||
btnScan.setOnClickListener(this);
|
||||
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.JELLY_BEAN)
|
||||
btnScan.setVisibility(View.GONE);
|
||||
|
||||
editHost = (EditText) view.findViewById(R.id.host);
|
||||
editStreamPort = (EditText) view.findViewById(R.id.stream_port);
|
||||
editControlPort = (EditText) view.findViewById(R.id.control_port);
|
||||
update();
|
||||
|
||||
builder.setView(view)
|
||||
// Add action buttons
|
||||
.setPositiveButton(android.R.string.ok, new DialogInterface.OnClickListener() {
|
||||
@Override
|
||||
public void onClick(DialogInterface dialog, int id) {
|
||||
// sign in the user ...
|
||||
host = editHost.getText().toString();
|
||||
streamPort = Integer.parseInt(editStreamPort.getText().toString());
|
||||
controlPort = Integer.parseInt(editControlPort.getText().toString());
|
||||
if (listener != null)
|
||||
listener.onHostChanged(host, streamPort, controlPort);
|
||||
}
|
||||
})
|
||||
.setNegativeButton(android.R.string.cancel, new DialogInterface.OnClickListener() {
|
||||
public void onClick(DialogInterface dialog, int id) {
|
||||
ServerDialogFragment.this.getDialog().cancel();
|
||||
}
|
||||
})
|
||||
.setTitle(R.string.server_host)
|
||||
.setCancelable(false);
|
||||
return builder.create();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onClick(View v) {
|
||||
NsdHelper.getInstance(getContext()).startListening("_snapcast._tcp.", "Snapcast", new NsdHelper.NsdHelperListener() {
|
||||
@Override
|
||||
public void onResolved(NsdHelper nsdHelper, NsdServiceInfo serviceInfo) {
|
||||
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) {
|
||||
setHost(serviceInfo.getHost().getCanonicalHostName(), serviceInfo.getPort(), serviceInfo.getPort() + 1);
|
||||
}
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
private void update() {
|
||||
try {
|
||||
this.getActivity().runOnUiThread(new Runnable() {
|
||||
@Override
|
||||
public void run() {
|
||||
try {
|
||||
editHost.setText(host);
|
||||
editStreamPort.setText(Integer.toString(streamPort));
|
||||
editControlPort.setText(Integer.toString(controlPort));
|
||||
} catch (Exception e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
});
|
||||
} catch (Exception e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
|
||||
public void setHost(String host, int streamPort, int controlPort) {
|
||||
this.host = host;
|
||||
this.streamPort = streamPort;
|
||||
this.controlPort = controlPort;
|
||||
update();
|
||||
}
|
||||
|
||||
public String getHostName() {
|
||||
return host;
|
||||
}
|
||||
|
||||
public int getStreamPort() {
|
||||
return streamPort;
|
||||
}
|
||||
|
||||
public int getControlPort() {
|
||||
return controlPort;
|
||||
}
|
||||
|
||||
public interface ServerDialogListener {
|
||||
void onHostChanged(String host, int streamPort, int controlPort);
|
||||
}
|
||||
}
|
|
@ -88,4 +88,22 @@ public class Settings {
|
|||
public long getLong(String key, long defaultValue) {
|
||||
return getPrefs().getLong(key, defaultValue);
|
||||
}
|
||||
|
||||
public String getHost() {
|
||||
return getString("host", "");
|
||||
}
|
||||
|
||||
public int getStreamPort() {
|
||||
return getInt("streamPort", 1704);
|
||||
}
|
||||
|
||||
public int getControlPort() {
|
||||
return getInt("controlPort", getStreamPort() + 1);
|
||||
}
|
||||
|
||||
public void setHost(String host, int streamPort, int controlPort) {
|
||||
put("host", host);
|
||||
put("streamPort", streamPort);
|
||||
put("controlPort", controlPort);
|
||||
}
|
||||
}
|
||||
|
|
Binary file not shown.
After Width: | Height: | Size: 460 B |
Binary file not shown.
After Width: | Height: | Size: 326 B |
Binary file not shown.
After Width: | Height: | Size: 562 B |
Binary file not shown.
After Width: | Height: | Size: 843 B |
Binary file not shown.
After Width: | Height: | Size: 1 KiB |
|
@ -1,37 +1,37 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
xmlns:card_view="http://schemas.android.com/apk/res-auto"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content">
|
||||
xmlns:card_view="http://schemas.android.com/apk/res-auto"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content">
|
||||
<!-- android:descendantFocusability="afterDescendants"-->
|
||||
<!-- android:paddingRight="?android:attr/scrollbarSize"-->
|
||||
<!-- android:background="@drawable/big_card"-->
|
||||
<android.support.v7.widget.CardView xmlns:card_view="http://schemas.android.com/apk/res-auto"
|
||||
android:id="@+id/card_view"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
card_view:contentPadding="5dp"
|
||||
card_view:cardUseCompatPadding="true"
|
||||
card_view:cardCornerRadius="4dp">
|
||||
<android.support.v7.widget.CardView android:id="@+id/card_view"
|
||||
xmlns:card_view="http://schemas.android.com/apk/res-auto"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
card_view:cardCornerRadius="4dp"
|
||||
card_view:cardUseCompatPadding="true"
|
||||
card_view:contentPadding="5dp">
|
||||
|
||||
<RelativeLayout
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content" >
|
||||
android:layout_height="wrap_content">
|
||||
|
||||
<ImageButton
|
||||
android:id="@+id/ibOverflow"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_alignParentEnd="true"
|
||||
android:layout_centerVertical="true"
|
||||
android:background="@null"
|
||||
android:src="@drawable/abc_ic_menu_moreoverflow_mtrl_alpha"
|
||||
android:layout_centerVertical="true" />
|
||||
android:src="@drawable/abc_ic_menu_moreoverflow_mtrl_alpha"/>
|
||||
|
||||
<LinearLayout
|
||||
android:layout_alignParentLeft="true"
|
||||
android:layout_toLeftOf="@id/ibOverflow"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_alignParentLeft="true"
|
||||
android:layout_toLeftOf="@id/ibOverflow"
|
||||
android:orientation="vertical">
|
||||
|
||||
|
||||
|
@ -41,12 +41,12 @@
|
|||
android:layout_height="wrap_content"
|
||||
android:ellipsize="marquee"
|
||||
android:fadingEdge="horizontal"
|
||||
android:singleLine="true"
|
||||
android:text="Title"
|
||||
android:textAppearance="?android:attr/textAppearanceMedium"
|
||||
android:paddingBottom="5dp"
|
||||
android:paddingLeft="5dp"
|
||||
android:paddingTop="5dp"
|
||||
android:paddingBottom="5dp"/>
|
||||
android:singleLine="true"
|
||||
android:text="Title"
|
||||
android:textAppearance="?android:attr/textAppearanceMedium"/>
|
||||
|
||||
|
||||
<LinearLayout
|
||||
|
@ -61,13 +61,13 @@
|
|||
android:layout_width="60dp"
|
||||
android:layout_height="match_parent"
|
||||
android:background="@null"
|
||||
android:src="@drawable/ic_speaker_icon" />
|
||||
android:src="@drawable/ic_speaker_icon"/>
|
||||
|
||||
<SeekBar
|
||||
android:id="@+id/volumeSeekBar"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_gravity="center_vertical" />
|
||||
android:layout_gravity="center_vertical"/>
|
||||
</LinearLayout>
|
||||
</LinearLayout>
|
||||
</RelativeLayout>
|
||||
|
|
|
@ -7,7 +7,7 @@
|
|||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent"
|
||||
android:fitsSystemWindows="true"
|
||||
tools:context="de.badaix.swipe.MainActivity">
|
||||
tools:context="de.badaix.snapcast.MainActivity">
|
||||
|
||||
<android.support.design.widget.AppBarLayout
|
||||
android:id="@+id/appbar"
|
||||
|
|
86
android/Snapcast/src/main/res/layout/dialog_server.xml
Normal file
86
android/Snapcast/src/main/res/layout/dialog_server.xml
Normal file
|
@ -0,0 +1,86 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:orientation="vertical"
|
||||
android:padding="13dp">
|
||||
|
||||
<TableLayout
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent">
|
||||
|
||||
<TableRow
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent">
|
||||
|
||||
<TextView
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:padding="3dip"
|
||||
android:text="@string/host"
|
||||
android:textAppearance="?android:attr/textAppearanceMedium"/>
|
||||
|
||||
<EditText
|
||||
android:id="@+id/host"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_marginLeft="7dp"
|
||||
android:inputType="textNoSuggestions"
|
||||
android:text="localhost"/>
|
||||
</TableRow>
|
||||
|
||||
<TableRow
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent">
|
||||
|
||||
<TextView
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:padding="3dip"
|
||||
android:text="@string/streaming_port"
|
||||
android:textAppearance="?android:attr/textAppearanceMedium"/>
|
||||
|
||||
<EditText
|
||||
android:id="@+id/stream_port"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_marginLeft="7dp"
|
||||
android:ems="10"
|
||||
android:inputType="number"
|
||||
android:text="1704"/>
|
||||
|
||||
</TableRow>
|
||||
|
||||
<TableRow
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent">
|
||||
|
||||
<TextView
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:padding="3dip"
|
||||
android:text="@string/control_port"
|
||||
android:textAppearance="?android:attr/textAppearanceMedium"/>
|
||||
|
||||
<EditText
|
||||
android:id="@+id/control_port"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_marginLeft="7dp"
|
||||
android:ems="10"
|
||||
android:inputType="number"
|
||||
android:text="1705"/>
|
||||
|
||||
</TableRow>
|
||||
|
||||
</TableLayout>
|
||||
|
||||
<Button
|
||||
android:id="@+id/btn_scan"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_gravity="center"
|
||||
android:layout_marginTop="5dip"
|
||||
android:text="@string/action_scan"/>
|
||||
|
||||
</LinearLayout>
|
|
@ -1,38 +1,40 @@
|
|||
<menu xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
xmlns:app="http://schemas.android.com/apk/res-auto"
|
||||
xmlns:tools="http://schemas.android.com/tools"
|
||||
tools:context="de.badaix.snapcast.SnapcastActivity">
|
||||
xmlns:app="http://schemas.android.com/apk/res-auto"
|
||||
xmlns:tools="http://schemas.android.com/tools"
|
||||
tools:context="de.badaix.snapcast.SnapcastActivity">
|
||||
<item
|
||||
android:id="@+id/action_play_stop"
|
||||
android:icon="@android:drawable/ic_media_play"
|
||||
android:orderInCategory="100"
|
||||
android:title="@string/action_play_stop"
|
||||
android:icon="@android:drawable/ic_media_play"
|
||||
app:showAsAction="always" />
|
||||
<!-- <item
|
||||
android:id="@+id/action_settings"
|
||||
android:orderInCategory="100"
|
||||
android:title="@string/action_settings"
|
||||
app:showAsAction="never" /> -->
|
||||
android:visible="false"
|
||||
app:showAsAction="always"/>
|
||||
<!-- <item
|
||||
android:id="@+id/action_settings"
|
||||
android:orderInCategory="100"
|
||||
android:title="@string/action_settings"
|
||||
app:showAsAction="never" /> -->
|
||||
|
||||
<item
|
||||
android:id="@+id/action_about"
|
||||
android:orderInCategory="100"
|
||||
android:title="@string/action_about"
|
||||
app:showAsAction="never" />
|
||||
app:showAsAction="never"/>
|
||||
<item
|
||||
android:id="@+id/action_scan"
|
||||
android:id="@+id/action_settings"
|
||||
android:icon="@drawable/ic_settings_white_24dp"
|
||||
android:orderInCategory="100"
|
||||
android:title="@string/action_scan"
|
||||
app:showAsAction="never" />
|
||||
android:title="@string/action_settings"
|
||||
app:showAsAction="always"/>
|
||||
<item
|
||||
android:id="@+id/action_refresh"
|
||||
android:orderInCategory="100"
|
||||
android:title="@string/action_refresh"
|
||||
app:showAsAction="never" />
|
||||
app:showAsAction="never"/>
|
||||
<item
|
||||
android:id="@+id/action_hide_offline"
|
||||
android:checkable="true"
|
||||
android:orderInCategory="100"
|
||||
android:title="@string/action_hide_offline"
|
||||
android:checkable="true"
|
||||
app:showAsAction="never" />
|
||||
app:showAsAction="never"/>
|
||||
</menu>
|
||||
|
|
|
@ -40,5 +40,9 @@
|
|||
<string name="client_stream">Stream</string>
|
||||
<string name="first_run_title">Warning</string>
|
||||
<string name="first_run_text">This is just a test client.\nNot meant for production use.</string>
|
||||
<string name="host">Host</string>
|
||||
<string name="streaming_port">stream port</string>
|
||||
<string name="control_port">control port</string>
|
||||
<string name="server_host">Snapserver host</string>
|
||||
</resources>
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue