mirror of
https://github.com/TimeCrafters/TimeCraftersConfigurationTool.git
synced 2025-12-15 21:12:34 +00:00
Added TACNET Connection Status 'fragment', misc.
This commit is contained in:
@@ -111,6 +111,7 @@ public class Backend {
|
|||||||
if (server != null) {
|
if (server != null) {
|
||||||
try {
|
try {
|
||||||
server.stop();
|
server.stop();
|
||||||
|
server = null;
|
||||||
} catch (IOException error) {
|
} catch (IOException error) {
|
||||||
lastServerError = error;
|
lastServerError = error;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -31,29 +31,23 @@ public class TACNET {
|
|||||||
}
|
}
|
||||||
|
|
||||||
connection = new Connection(hostname, port);
|
connection = new Connection(hostname, port);
|
||||||
Backend.instance().stopErrorSound();
|
|
||||||
|
|
||||||
connection.connect(new Runnable() {
|
connection.connect(new Runnable() {
|
||||||
@Override
|
@Override
|
||||||
public void run() {
|
public void run() {
|
||||||
Log.d(TAG, "run: " + connection.lastError());
|
Log.d(TAG, "run: " + connection.lastSocketError());
|
||||||
Backend.instance().startErrorSound(Backend.instance().applicationContext);
|
Backend.instance().startErrorSound(Backend.instance().applicationContext);
|
||||||
try {
|
|
||||||
connection.close();
|
|
||||||
} catch (IOException e) {
|
|
||||||
e.printStackTrace();
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
public Status status() {
|
public Status status() {
|
||||||
if (isConnected()) {
|
if (isConnecting()) {
|
||||||
return Status.CONNECTED;
|
|
||||||
} else if (connection != null && !connection.socketError()) {
|
|
||||||
return Status.CONNECTING;
|
return Status.CONNECTING;
|
||||||
} else if (connection != null && connection.socketError()) {
|
} else if (isConnectionError()) {
|
||||||
return Status.CONNECTION_ERROR;
|
return Status.CONNECTION_ERROR;
|
||||||
|
} else if (isConnected()) {
|
||||||
|
return Status.CONNECTED;
|
||||||
} else {
|
} else {
|
||||||
return Status.NOT_CONNECTED;
|
return Status.NOT_CONNECTED;
|
||||||
}
|
}
|
||||||
@@ -63,6 +57,14 @@ public class TACNET {
|
|||||||
return connection != null && connection.isConnected();
|
return connection != null && connection.isConnected();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public boolean isConnecting() {
|
||||||
|
return connection != null && !connection.isConnected() && !connection.socketError();
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean isConnectionError() {
|
||||||
|
return connection != null && connection.socketError();
|
||||||
|
}
|
||||||
|
|
||||||
public void close() {
|
public void close() {
|
||||||
if (connection != null) {
|
if (connection != null) {
|
||||||
try {
|
try {
|
||||||
@@ -81,6 +83,10 @@ public class TACNET {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public Connection getConnection() {
|
||||||
|
return connection;
|
||||||
|
}
|
||||||
|
|
||||||
public void puts(String message) {
|
public void puts(String message) {
|
||||||
if (isConnected()) {
|
if (isConnected()) {
|
||||||
connection.puts(message);
|
connection.puts(message);
|
||||||
|
|||||||
@@ -38,7 +38,6 @@ public class ServerDialog extends TimeCraftersDialog {
|
|||||||
stopServer.setOnClickListener(new View.OnClickListener() {
|
stopServer.setOnClickListener(new View.OnClickListener() {
|
||||||
@Override
|
@Override
|
||||||
public void onClick(View v) {
|
public void onClick(View v) {
|
||||||
// TODO: Halt server
|
|
||||||
Backend.instance().stopServer();
|
Backend.instance().stopServer();
|
||||||
dismiss();
|
dismiss();
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -36,6 +36,9 @@ public class Client {
|
|||||||
|
|
||||||
private String TAG = "TACNET|Client";
|
private String TAG = "TACNET|Client";
|
||||||
|
|
||||||
|
private boolean socketError = false;
|
||||||
|
private String lastSocketError;
|
||||||
|
|
||||||
public Client() {
|
public Client() {
|
||||||
this.uuid = (UUID.randomUUID()).toString();
|
this.uuid = (UUID.randomUUID()).toString();
|
||||||
|
|
||||||
@@ -90,7 +93,7 @@ public class Client {
|
|||||||
}
|
}
|
||||||
|
|
||||||
} catch (IOException e) {
|
} catch (IOException e) {
|
||||||
Log.e(TAG, "Read error: " + e.getMessage());
|
Log.e(TAG, "Read error: " + e.getLocalizedMessage());
|
||||||
}
|
}
|
||||||
|
|
||||||
try {
|
try {
|
||||||
@@ -123,11 +126,13 @@ public class Client {
|
|||||||
itr.remove();
|
itr.remove();
|
||||||
|
|
||||||
} catch (IOException e) {
|
} catch (IOException e) {
|
||||||
Log.e(TAG, "Write error: " + e.getMessage());
|
Log.e(TAG, "Write error: " + e.getLocalizedMessage());
|
||||||
|
socketError = true;
|
||||||
|
lastSocketError = e.getLocalizedMessage();
|
||||||
try {
|
try {
|
||||||
socket.close();
|
socket.close();
|
||||||
} catch (IOException k) {
|
} catch (IOException k) {
|
||||||
Log.e(TAG, "Failed to close socket: " + e.getMessage());
|
Log.e(TAG, "Failed to close socket: " + e.getLocalizedMessage());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -223,6 +228,13 @@ public class Client {
|
|||||||
public long getDataSent() { return dataSent; }
|
public long getDataSent() { return dataSent; }
|
||||||
public long getDataReceived() { return dataReceived; }
|
public long getDataReceived() { return dataReceived; }
|
||||||
|
|
||||||
|
public boolean socketError() {
|
||||||
|
return socketError;
|
||||||
|
}
|
||||||
|
public String lastSocketError() {
|
||||||
|
return lastSocketError;
|
||||||
|
}
|
||||||
|
|
||||||
public void flush() throws IOException {
|
public void flush() throws IOException {
|
||||||
this.bufferedWriter.flush();
|
this.bufferedWriter.flush();
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -60,7 +60,7 @@ public class Connection {
|
|||||||
}
|
}
|
||||||
} catch (IOException e) {
|
} catch (IOException e) {
|
||||||
socketError = true;
|
socketError = true;
|
||||||
lastSocketError = e.getMessage();
|
lastSocketError = e.getLocalizedMessage();
|
||||||
|
|
||||||
errorCallback.run();
|
errorCallback.run();
|
||||||
|
|
||||||
@@ -114,10 +114,10 @@ public class Connection {
|
|||||||
return this.client != null && this.client.isConnected();
|
return this.client != null && this.client.isConnected();
|
||||||
}
|
}
|
||||||
public boolean socketError() {
|
public boolean socketError() {
|
||||||
return socketError;
|
return socketError ? socketError : client.socketError();
|
||||||
}
|
}
|
||||||
public String lastError() {
|
public String lastSocketError() {
|
||||||
return lastSocketError;
|
return lastSocketError != null ? lastSocketError : client.lastSocketError();
|
||||||
}
|
}
|
||||||
|
|
||||||
public void close() throws IOException {
|
public void close() throws IOException {
|
||||||
|
|||||||
@@ -20,6 +20,10 @@ public class Packet {
|
|||||||
|
|
||||||
DOWNLOAD_CONFIG(10),
|
DOWNLOAD_CONFIG(10),
|
||||||
UPLOAD_CONFIG(11),
|
UPLOAD_CONFIG(11),
|
||||||
|
LIST_CONFIGS(12),
|
||||||
|
ADD_CONFIG(13),
|
||||||
|
UPDATE_CONFIG(14),
|
||||||
|
DELETE_CONFIG(15),
|
||||||
|
|
||||||
ADD_GROUP(20),
|
ADD_GROUP(20),
|
||||||
UPDATE_GROUP(21),
|
UPDATE_GROUP(21),
|
||||||
|
|||||||
@@ -0,0 +1,94 @@
|
|||||||
|
package org.timecrafters.TimeCraftersConfigurationTool.tacnet.support;
|
||||||
|
|
||||||
|
import android.os.Handler;
|
||||||
|
import android.os.Looper;
|
||||||
|
import android.view.View;
|
||||||
|
import android.widget.TextView;
|
||||||
|
|
||||||
|
import org.timecrafters.TimeCraftersConfigurationTool.R;
|
||||||
|
import org.timecrafters.TimeCraftersConfigurationTool.backend.Backend;
|
||||||
|
import org.timecrafters.TimeCraftersConfigurationTool.backend.TACNET;
|
||||||
|
import org.timecrafters.TimeCraftersConfigurationTool.tacnet.Client;
|
||||||
|
|
||||||
|
public class ConnectionStatsSyncHandler {
|
||||||
|
private View view;
|
||||||
|
private Handler handler;
|
||||||
|
private Runnable runner;
|
||||||
|
private long delay;
|
||||||
|
private boolean stopped = false;
|
||||||
|
private TextView connectionStatus, totalPacketsIn, totalPacketsOut, totalDataIn, totalDataOut;
|
||||||
|
|
||||||
|
public ConnectionStatsSyncHandler(View view, long delay) {
|
||||||
|
this.view = view;
|
||||||
|
this.delay = delay;
|
||||||
|
connectionStatus= view.findViewById(R.id.connection_status);
|
||||||
|
totalPacketsIn = view.findViewById(R.id.total_packets_in);
|
||||||
|
totalPacketsOut = view.findViewById(R.id.total_packets_out);
|
||||||
|
totalDataIn = view.findViewById(R.id.total_data_in);
|
||||||
|
totalDataOut = view.findViewById(R.id.total_data_out);
|
||||||
|
|
||||||
|
handler = new Handler(Looper.getMainLooper());
|
||||||
|
runner = new Runnable() {
|
||||||
|
@Override
|
||||||
|
public void run() {
|
||||||
|
ConnectionStatsSyncHandler.this.run();
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
handler.postDelayed(runner, 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void run() {
|
||||||
|
Client client = Backend.instance().tacnet().getClient();
|
||||||
|
|
||||||
|
if (!stopped && client != null) {
|
||||||
|
TACNET.Status status = Backend.instance().tacnet().status();
|
||||||
|
switch(status) {
|
||||||
|
case CONNECTED: {
|
||||||
|
connectionStatus.setText(R.string.tacnet_connected);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case CONNECTING: {
|
||||||
|
connectionStatus.setText(R.string.tacnet_connecting);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case NOT_CONNECTED: {
|
||||||
|
connectionStatus.setText(R.string.tacnet_not_connected);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case CONNECTION_ERROR: {
|
||||||
|
connectionStatus.setText(Backend.instance().tacnet().getConnection().lastSocketError());
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (Backend.instance().tacnet().isConnectionError()) {
|
||||||
|
connectionStatus.setTextColor(view.getResources().getColor(R.color.buttonDangerActive));
|
||||||
|
} else {
|
||||||
|
connectionStatus.setTextColor(view.getResources().getColor(R.color.text_color));
|
||||||
|
}
|
||||||
|
|
||||||
|
totalPacketsIn.setText("" + client.getPacketsSent());
|
||||||
|
totalPacketsOut.setText("" + client.getPacketsReceived());
|
||||||
|
totalDataIn.setText("" + client.getDataSent() + " bytes");
|
||||||
|
totalDataOut.setText("" + client.getDataReceived() + " bytes");
|
||||||
|
|
||||||
|
handler.postDelayed(runner, delay);
|
||||||
|
|
||||||
|
} else if (!stopped && client == null) {
|
||||||
|
if (Backend.instance().tacnet().isConnectionError()) {
|
||||||
|
connectionStatus.setTextColor(view.getResources().getColor(R.color.buttonDangerActive));
|
||||||
|
} else {
|
||||||
|
connectionStatus.setTextColor(view.getResources().getColor(R.color.text_color));
|
||||||
|
}
|
||||||
|
|
||||||
|
connectionStatus.setText(Backend.instance().tacnet().getConnection().lastSocketError());
|
||||||
|
|
||||||
|
handler.postDelayed(runner, delay);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public void stop() {
|
||||||
|
stopped = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -3,32 +3,57 @@ package org.timecrafters.TimeCraftersConfigurationTool.ui.tacnet;
|
|||||||
import android.os.Bundle;
|
import android.os.Bundle;
|
||||||
import android.text.Editable;
|
import android.text.Editable;
|
||||||
import android.text.TextWatcher;
|
import android.text.TextWatcher;
|
||||||
|
import android.util.Log;
|
||||||
import android.view.LayoutInflater;
|
import android.view.LayoutInflater;
|
||||||
import android.view.View;
|
import android.view.View;
|
||||||
import android.view.ViewGroup;
|
import android.view.ViewGroup;
|
||||||
import android.widget.Button;
|
import android.widget.Button;
|
||||||
import android.widget.EditText;
|
import android.widget.EditText;
|
||||||
|
import android.widget.LinearLayout;
|
||||||
|
|
||||||
import androidx.annotation.NonNull;
|
import androidx.annotation.NonNull;
|
||||||
import androidx.annotation.Nullable;
|
import androidx.annotation.Nullable;
|
||||||
|
import androidx.appcompat.app.AppCompatActivity;
|
||||||
|
import androidx.constraintlayout.widget.ConstraintLayout;
|
||||||
import androidx.lifecycle.Observer;
|
import androidx.lifecycle.Observer;
|
||||||
import androidx.lifecycle.ViewModelProviders;
|
import androidx.lifecycle.ViewModelProviders;
|
||||||
|
import androidx.navigation.NavController;
|
||||||
|
import androidx.navigation.Navigation;
|
||||||
|
|
||||||
import org.timecrafters.TimeCraftersConfigurationTool.R;
|
import org.timecrafters.TimeCraftersConfigurationTool.R;
|
||||||
import org.timecrafters.TimeCraftersConfigurationTool.backend.Backend;
|
import org.timecrafters.TimeCraftersConfigurationTool.backend.Backend;
|
||||||
|
import org.timecrafters.TimeCraftersConfigurationTool.backend.TACNET;
|
||||||
import org.timecrafters.TimeCraftersConfigurationTool.dialogs.ServerDialog;
|
import org.timecrafters.TimeCraftersConfigurationTool.dialogs.ServerDialog;
|
||||||
import org.timecrafters.TimeCraftersConfigurationTool.library.TimeCraftersFragment;
|
import org.timecrafters.TimeCraftersConfigurationTool.library.TimeCraftersFragment;
|
||||||
|
import org.timecrafters.TimeCraftersConfigurationTool.tacnet.support.ConnectionStatsSyncHandler;
|
||||||
|
import org.timecrafters.TimeCraftersConfigurationTool.tacnet.support.ServerStatsSyncHandler;
|
||||||
|
|
||||||
public class TACNETFragment extends TimeCraftersFragment {
|
public class TACNETHostFragment extends TimeCraftersFragment {
|
||||||
|
|
||||||
private static final String TAG = "TACNETFragment";
|
private static final String TAG = "TACNETFragment";
|
||||||
private TACNETViewModel TACNETViewModel;
|
private ConnectionStatsSyncHandler connectionStatsSyncHandler;
|
||||||
|
|
||||||
public View onCreateView(@NonNull LayoutInflater inflater,
|
public View onCreateView(@NonNull LayoutInflater inflater,
|
||||||
ViewGroup container, Bundle savedInstanceState) {
|
ViewGroup viewGroup, Bundle savedInstanceState) {
|
||||||
TACNETViewModel =
|
final View root = inflater.inflate(R.layout.fragment_tacnet_host, viewGroup, false);
|
||||||
ViewModelProviders.of(this).get(TACNETViewModel.class);
|
final LinearLayout container = (LinearLayout) root;
|
||||||
View root = inflater.inflate(R.layout.fragment_tacnet, container, false);
|
|
||||||
|
|
||||||
|
if (Backend.instance().tacnet().status() != TACNET.Status.NOT_CONNECTED) {
|
||||||
|
inflateTACNETConnectionStatus(container);
|
||||||
|
} else {
|
||||||
|
inflateTACNET(container);
|
||||||
|
}
|
||||||
|
|
||||||
|
return root;
|
||||||
|
}
|
||||||
|
|
||||||
|
private void inflateTACNET(final LinearLayout container) {
|
||||||
|
((AppCompatActivity) getActivity()).getSupportActionBar().setTitle(R.string.title_tacnet);
|
||||||
|
final ConstraintLayout root = (ConstraintLayout) getLayoutInflater().inflate(R.layout.fragment_tacnet, null);
|
||||||
|
container.removeAllViews();
|
||||||
|
container.addView(root);
|
||||||
|
|
||||||
final EditText hostname = root.findViewById(R.id.hostname);
|
final EditText hostname = root.findViewById(R.id.hostname);
|
||||||
final EditText port = root.findViewById(R.id.port);
|
final EditText port = root.findViewById(R.id.port);
|
||||||
|
|
||||||
@@ -69,11 +94,12 @@ public class TACNETFragment extends TimeCraftersFragment {
|
|||||||
connectButton.setOnClickListener(new View.OnClickListener() {
|
connectButton.setOnClickListener(new View.OnClickListener() {
|
||||||
@Override
|
@Override
|
||||||
public void onClick(View v) {
|
public void onClick(View v) {
|
||||||
// ConnectDialog dialog = new ConnectDialog();
|
|
||||||
// dialog.show(getFragmentManager(), null);
|
|
||||||
Backend.instance().saveSettings();
|
Backend.instance().saveSettings();
|
||||||
|
|
||||||
Backend.instance().tacnet().connect(hostname.getText().toString(), Integer.parseInt(port.getText().toString()));
|
Backend.instance().tacnet().connect(hostname.getText().toString(), Integer.parseInt(port.getText().toString()));
|
||||||
|
|
||||||
|
root.removeAllViews();
|
||||||
|
inflateTACNETConnectionStatus(container);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
@@ -84,13 +110,37 @@ public class TACNETFragment extends TimeCraftersFragment {
|
|||||||
dialog.show(getFragmentManager(), null);
|
dialog.show(getFragmentManager(), null);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
}
|
||||||
|
|
||||||
TACNETViewModel.getText().observe(getViewLifecycleOwner(), new Observer<String>() {
|
private void inflateTACNETConnectionStatus(final LinearLayout container) {
|
||||||
|
((AppCompatActivity) getActivity()).getSupportActionBar().setTitle(R.string.title_tacnet_connection_status);
|
||||||
|
final ConstraintLayout root = (ConstraintLayout) getLayoutInflater().inflate(R.layout.fragment_tacnet_connection_status, null);
|
||||||
|
container.removeAllViews();
|
||||||
|
container.addView(root);
|
||||||
|
|
||||||
|
connectionStatsSyncHandler = new ConnectionStatsSyncHandler(root, 1_000);
|
||||||
|
|
||||||
|
Button disconnect = root.findViewById(R.id.tacnet_disconnect);
|
||||||
|
disconnect.setOnClickListener(new View.OnClickListener() {
|
||||||
@Override
|
@Override
|
||||||
public void onChanged(@Nullable String s) {
|
public void onClick(View v) {
|
||||||
|
Backend.instance().tacnet().close();
|
||||||
|
Backend.instance().stopErrorSound();
|
||||||
|
connectionStatsSyncHandler.stop();
|
||||||
|
|
||||||
|
inflateTACNET(container);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
}
|
||||||
|
|
||||||
return root;
|
@Override
|
||||||
|
public void onDetach() {
|
||||||
|
super.onDetach();
|
||||||
|
|
||||||
|
if (connectionStatsSyncHandler != null) {
|
||||||
|
Log.d(TAG, "onDetach: stopping sync handler");
|
||||||
|
connectionStatsSyncHandler.stop();
|
||||||
|
connectionStatsSyncHandler = null;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -1,19 +0,0 @@
|
|||||||
package org.timecrafters.TimeCraftersConfigurationTool.ui.tacnet;
|
|
||||||
|
|
||||||
import androidx.lifecycle.LiveData;
|
|
||||||
import androidx.lifecycle.MutableLiveData;
|
|
||||||
import androidx.lifecycle.ViewModel;
|
|
||||||
|
|
||||||
public class TACNETViewModel extends ViewModel {
|
|
||||||
|
|
||||||
private MutableLiveData<String> mText;
|
|
||||||
|
|
||||||
public TACNETViewModel() {
|
|
||||||
mText = new MutableLiveData<>();
|
|
||||||
mText.setValue("This is TACNET fragment");
|
|
||||||
}
|
|
||||||
|
|
||||||
public LiveData<String> getText() {
|
|
||||||
return mText;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -4,8 +4,7 @@
|
|||||||
xmlns:tools="http://schemas.android.com/tools"
|
xmlns:tools="http://schemas.android.com/tools"
|
||||||
android:layout_width="match_parent"
|
android:layout_width="match_parent"
|
||||||
android:layout_height="match_parent"
|
android:layout_height="match_parent"
|
||||||
android:background="#FFFFFF"
|
tools:context=".ui.tacnet.TACNETHostFragment">
|
||||||
tools:context=".ui.tacnet.TACNETFragment">
|
|
||||||
|
|
||||||
<ScrollView
|
<ScrollView
|
||||||
android:layout_width="match_parent"
|
android:layout_width="match_parent"
|
||||||
@@ -74,6 +73,7 @@
|
|||||||
android:id="@+id/tacnet_connect"
|
android:id="@+id/tacnet_connect"
|
||||||
android:layout_width="match_parent"
|
android:layout_width="match_parent"
|
||||||
android:layout_height="wrap_content"
|
android:layout_height="wrap_content"
|
||||||
|
android:layout_marginTop="@dimen/dialog_button_margin"
|
||||||
android:text="@string/tacnet_connect" />
|
android:text="@string/tacnet_connect" />
|
||||||
</LinearLayout>
|
</LinearLayout>
|
||||||
|
|
||||||
|
|||||||
139
app/src/main/res/layout/fragment_tacnet_connection_status.xml
Normal file
139
app/src/main/res/layout/fragment_tacnet_connection_status.xml
Normal file
@@ -0,0 +1,139 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<androidx.constraintlayout.widget.ConstraintLayout 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"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="match_parent">
|
||||||
|
|
||||||
|
<ScrollView
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="match_parent"
|
||||||
|
app:layout_constraintBottom_toBottomOf="parent"
|
||||||
|
app:layout_constraintEnd_toEndOf="parent"
|
||||||
|
app:layout_constraintStart_toStartOf="parent"
|
||||||
|
app:layout_constraintTop_toTopOf="parent">
|
||||||
|
|
||||||
|
<LinearLayout
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:orientation="vertical">
|
||||||
|
|
||||||
|
<LinearLayout
|
||||||
|
android:id="@+id/tacnet_connect_layout"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:layout_marginLeft="48dp"
|
||||||
|
android:layout_marginTop="24dp"
|
||||||
|
android:layout_marginRight="48dp"
|
||||||
|
android:layout_marginBottom="24dp"
|
||||||
|
android:background="@color/list_even"
|
||||||
|
android:orientation="vertical"
|
||||||
|
android:padding="16dp">
|
||||||
|
|
||||||
|
<LinearLayout
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="match_parent"
|
||||||
|
android:layout_marginLeft="@dimen/button_margin_left"
|
||||||
|
android:layout_marginRight="@dimen/button_margin_right"
|
||||||
|
android:orientation="horizontal">
|
||||||
|
|
||||||
|
<!-- labels -->
|
||||||
|
<LinearLayout
|
||||||
|
android:layout_width="wrap_content"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:orientation="vertical">
|
||||||
|
|
||||||
|
<TextView
|
||||||
|
android:layout_width="wrap_content"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:layout_weight="1"
|
||||||
|
android:text="Connection Status"
|
||||||
|
android:textStyle="bold" />
|
||||||
|
|
||||||
|
<TextView
|
||||||
|
android:layout_width="wrap_content"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:layout_weight="1"
|
||||||
|
android:text="Total Packets In"
|
||||||
|
android:textStyle="bold" />
|
||||||
|
|
||||||
|
<TextView
|
||||||
|
android:layout_width="wrap_content"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:layout_weight="1"
|
||||||
|
android:text="Total Packets Out"
|
||||||
|
android:textStyle="bold" />
|
||||||
|
|
||||||
|
<TextView
|
||||||
|
android:layout_width="wrap_content"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:layout_weight="1"
|
||||||
|
android:text="Total Data In"
|
||||||
|
android:textStyle="bold" />
|
||||||
|
|
||||||
|
<TextView
|
||||||
|
android:layout_width="wrap_content"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:layout_weight="1"
|
||||||
|
android:text="Total Data Out"
|
||||||
|
android:textStyle="bold" />
|
||||||
|
</LinearLayout>
|
||||||
|
|
||||||
|
<!-- values -->
|
||||||
|
<LinearLayout
|
||||||
|
android:layout_width="wrap_content"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:layout_marginLeft="@dimen/button_margin_left"
|
||||||
|
android:orientation="vertical">
|
||||||
|
|
||||||
|
<TextView
|
||||||
|
android:id="@+id/connection_status"
|
||||||
|
android:layout_width="wrap_content"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:layout_weight="1"
|
||||||
|
android:text="0" />
|
||||||
|
|
||||||
|
<TextView
|
||||||
|
android:id="@+id/total_packets_in"
|
||||||
|
android:layout_width="wrap_content"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:layout_weight="1"
|
||||||
|
android:text="0" />
|
||||||
|
|
||||||
|
<TextView
|
||||||
|
android:id="@+id/total_packets_out"
|
||||||
|
android:layout_width="wrap_content"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:layout_weight="1"
|
||||||
|
android:text="0" />
|
||||||
|
|
||||||
|
<TextView
|
||||||
|
android:id="@+id/total_data_in"
|
||||||
|
android:layout_width="wrap_content"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:layout_weight="1"
|
||||||
|
android:text="0" />
|
||||||
|
|
||||||
|
<TextView
|
||||||
|
android:id="@+id/total_data_out"
|
||||||
|
android:layout_width="wrap_content"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:layout_weight="1"
|
||||||
|
android:text="0" />
|
||||||
|
|
||||||
|
</LinearLayout>
|
||||||
|
|
||||||
|
</LinearLayout>
|
||||||
|
|
||||||
|
<Button
|
||||||
|
android:id="@+id/tacnet_disconnect"
|
||||||
|
style="@style/DangerousButton"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:layout_marginTop="@dimen/dialog_button_margin"
|
||||||
|
android:text="@string/tacnet_disconnect" />
|
||||||
|
</LinearLayout>
|
||||||
|
|
||||||
|
</LinearLayout>
|
||||||
|
</ScrollView>
|
||||||
|
</androidx.constraintlayout.widget.ConstraintLayout>
|
||||||
8
app/src/main/res/layout/fragment_tacnet_host.xml
Normal file
8
app/src/main/res/layout/fragment_tacnet_host.xml
Normal file
@@ -0,0 +1,8 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
|
android:id="@+id/container"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="match_parent"
|
||||||
|
android:orientation="vertical">
|
||||||
|
|
||||||
|
</LinearLayout>
|
||||||
@@ -3,11 +3,11 @@
|
|||||||
xmlns:app="http://schemas.android.com/apk/res-auto"
|
xmlns:app="http://schemas.android.com/apk/res-auto"
|
||||||
xmlns:tools="http://schemas.android.com/tools"
|
xmlns:tools="http://schemas.android.com/tools"
|
||||||
android:id="@+id/mobile_navigation"
|
android:id="@+id/mobile_navigation"
|
||||||
app:startDestination="@+id/navigation_editor">
|
app:startDestination="@id/navigation_editor">
|
||||||
|
|
||||||
<fragment
|
<fragment
|
||||||
android:id="@+id/navigation_tacnet"
|
android:id="@+id/navigation_tacnet"
|
||||||
android:name="org.timecrafters.TimeCraftersConfigurationTool.ui.tacnet.TACNETFragment"
|
android:name="org.timecrafters.TimeCraftersConfigurationTool.ui.tacnet.TACNETHostFragment"
|
||||||
android:label="@string/title_tacnet"
|
android:label="@string/title_tacnet"
|
||||||
tools:layout="@layout/fragment_tacnet" />
|
tools:layout="@layout/fragment_tacnet" />
|
||||||
|
|
||||||
@@ -28,10 +28,10 @@
|
|||||||
tools:layout="@layout/fragment_settings" >
|
tools:layout="@layout/fragment_settings" >
|
||||||
<action
|
<action
|
||||||
android:id="@+id/action_navigation_settings_to_configurationsFragment"
|
android:id="@+id/action_navigation_settings_to_configurationsFragment"
|
||||||
app:destination="@id/configurationsFragment" />
|
app:destination="@id/configurations_fragment" />
|
||||||
<action
|
<action
|
||||||
android:id="@+id/action_navigation_settings_to_presetsFragment"
|
android:id="@+id/action_navigation_settings_to_presetsFragment"
|
||||||
app:destination="@id/presetsFragment" />
|
app:destination="@id/presets_fragment" />
|
||||||
</fragment>
|
</fragment>
|
||||||
<fragment
|
<fragment
|
||||||
android:id="@+id/navigation_search"
|
android:id="@+id/navigation_search"
|
||||||
@@ -51,11 +51,11 @@
|
|||||||
android:name="org.timecrafters.TimeCraftersConfigurationTool.ui.editor.VariablesFragment"
|
android:name="org.timecrafters.TimeCraftersConfigurationTool.ui.editor.VariablesFragment"
|
||||||
android:label="Variables" />
|
android:label="Variables" />
|
||||||
<fragment
|
<fragment
|
||||||
android:id="@+id/configurationsFragment"
|
android:id="@+id/configurations_fragment"
|
||||||
android:name="org.timecrafters.TimeCraftersConfigurationTool.ui.settings.configurations.ConfigurationsFragment"
|
android:name="org.timecrafters.TimeCraftersConfigurationTool.ui.settings.configurations.ConfigurationsFragment"
|
||||||
android:label="Manage Configurations" />
|
android:label="@string/settings_manage_configurations" />
|
||||||
<fragment
|
<fragment
|
||||||
android:id="@+id/presetsFragment"
|
android:id="@+id/presets_fragment"
|
||||||
android:name="org.timecrafters.TimeCraftersConfigurationTool.ui.settings.presets.PresetsFragment"
|
android:name="org.timecrafters.TimeCraftersConfigurationTool.ui.settings.presets.PresetsFragment"
|
||||||
android:label="Manage Presets" />
|
android:label="@string/settings_manage_presets" />
|
||||||
</navigation>
|
</navigation>
|
||||||
@@ -6,6 +6,8 @@
|
|||||||
<color name="colorSecondary">#006000</color>
|
<color name="colorSecondary">#006000</color>
|
||||||
<color name="colorTertiary">#00d000</color>
|
<color name="colorTertiary">#00d000</color>
|
||||||
|
|
||||||
|
<color name="text_color">#fff</color>
|
||||||
|
|
||||||
<color name="colorDanger">#800</color>
|
<color name="colorDanger">#800</color>
|
||||||
<color name="buttonDangerHover">#600</color>
|
<color name="buttonDangerHover">#600</color>
|
||||||
<color name="buttonDangerActive">#c00</color>
|
<color name="buttonDangerActive">#c00</color>
|
||||||
|
|||||||
@@ -1,10 +1,10 @@
|
|||||||
<resources>
|
<resources>
|
||||||
<string name="app_name">TimeCraftersConfigurationTool</string>
|
<string name="app_name">TimeCrafters Configuration Tool</string>
|
||||||
<string name="hello_blank_fragment">Hello blank fragment</string>
|
|
||||||
<string name="title_editor">Editor</string>
|
<string name="title_editor">Editor</string>
|
||||||
<string name="title_search">Search</string>
|
<string name="title_search">Search</string>
|
||||||
<string name="title_settings">Settings</string>
|
<string name="title_settings">Settings</string>
|
||||||
<string name="title_tacnet">TACNET</string>
|
<string name="title_tacnet">TACNET</string>
|
||||||
|
<string name="title_tacnet_connection_status">TACNET Connection Status</string>
|
||||||
|
|
||||||
<string name="tacnet_hostname">Hostname</string>
|
<string name="tacnet_hostname">Hostname</string>
|
||||||
<string name="tacnet_port">Port</string>
|
<string name="tacnet_port">Port</string>
|
||||||
@@ -36,4 +36,8 @@
|
|||||||
<string name="warning_no_config_active">No active configuration set</string>
|
<string name="warning_no_config_active">No active configuration set</string>
|
||||||
<string name="tacnet_stop_server">Stop Server</string>
|
<string name="tacnet_stop_server">Stop Server</string>
|
||||||
<string name="tacnet_server_status">Server Status</string>
|
<string name="tacnet_server_status">Server Status</string>
|
||||||
|
<string name="tacnet_disconnect">Disconnect</string>
|
||||||
|
<string name="tacnet_connected">Connected</string>
|
||||||
|
<string name="tacnet_connecting">Connecting...</string>
|
||||||
|
<string name="tacnet_not_connected">Not Connected</string>
|
||||||
</resources>
|
</resources>
|
||||||
@@ -6,7 +6,7 @@
|
|||||||
<item name="colorPrimaryDark">@color/colorPrimaryDark</item>
|
<item name="colorPrimaryDark">@color/colorPrimaryDark</item>
|
||||||
<item name="colorAccent">@color/colorAccent</item>
|
<item name="colorAccent">@color/colorAccent</item>
|
||||||
|
|
||||||
<item name="android:textColor">#fff</item>
|
<item name="android:textColor">@color/text_color</item>
|
||||||
<item name="android:fontFamily">@font/dejavusans_condensed_fontfamily</item>
|
<item name="android:fontFamily">@font/dejavusans_condensed_fontfamily</item>
|
||||||
|
|
||||||
<item name="buttonStyle">@style/Button</item>
|
<item name="buttonStyle">@style/Button</item>
|
||||||
|
|||||||
Reference in New Issue
Block a user