explicit server configuration

This commit is contained in:
badaix 2016-02-22 22:53:26 +01:00
parent ad46a6d19d
commit a844c09bde
13 changed files with 325 additions and 47 deletions

View file

@ -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();
}

View file

@ -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);
}
}

View file

@ -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

View file

@ -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>

View file

@ -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"

View 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>

View file

@ -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>

View file

@ -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>