Added TACNETDialog for showing tacnet error messages, when connecting to server actionbar will show connection status colors, packetError is now processed, server now sends correctly formatted error message when there is already a client connected.

This commit is contained in:
2020-11-12 09:16:15 -06:00
parent 2bf8e3b87e
commit 2adfeb74bf
9 changed files with 144 additions and 13 deletions

View File

@@ -2,11 +2,15 @@ package org.timecrafters.TimeCraftersConfigurationTool;
import android.content.Intent;
import android.content.IntentFilter;
import android.graphics.Color;
import android.graphics.drawable.ColorDrawable;
import android.os.Build;
import android.os.Bundle;
import android.os.Handler;
import android.util.Log;
import android.view.View;
import androidx.appcompat.app.ActionBar;
import androidx.appcompat.app.AppCompatActivity;
import androidx.navigation.NavController;
import androidx.navigation.Navigation;
@@ -18,6 +22,7 @@ import com.google.android.material.bottomnavigation.LabelVisibilityMode;
import org.timecrafters.TimeCraftersConfigurationTool.backend.Backend;
import org.timecrafters.TimeCraftersConfigurationTool.backend.TAC;
import org.timecrafters.TimeCraftersConfigurationTool.backend.TACNET;
import org.timecrafters.TimeCraftersConfigurationTool.tacnet.TACNETOnBootReceiver;
import org.timecrafters.TimeCraftersConfigurationTool.tacnet.TACNETServerService;
@@ -46,6 +51,7 @@ public class MainActivity extends AppCompatActivity {
}
Backend.instance().applicationContext = getApplicationContext();
Backend.instance().mainActivity = this;
if (Backend.instance().getSettings().mobileShowNavigationLabels) {
navView.setLabelVisibilityMode(LabelVisibilityMode.LABEL_VISIBILITY_LABELED);
@@ -67,6 +73,32 @@ public class MainActivity extends AppCompatActivity {
if (getIntent().getBooleanExtra("navigate_to_tacnet", false)) {
Navigation.findNavController(this, R.id.nav_host_fragment).navigate(R.id.navigation_tacnet);
}
startTACNETStatusIndictator();
}
private void startTACNETStatusIndictator() {
final Handler handler = new Handler(getMainLooper());
handler.postDelayed(new Runnable() {
@Override
public void run() {
final TACNET tacnet = Backend.instance().tacnet();
final ActionBar actionBar = getSupportActionBar();
if (tacnet.isConnected()) {
actionBar.setBackgroundDrawable(new ColorDrawable(getResources().getColor(R.color.tacnetConnectionConnected)));
} else if (tacnet.isConnecting()) {
actionBar.setBackgroundDrawable(new ColorDrawable(getResources().getColor(R.color.tacnetConnectionConnecting)));
} else if (tacnet.isConnectionError()) {
actionBar.setBackgroundDrawable(new ColorDrawable(getResources().getColor(R.color.tacnetConnectionConnectionError)));
} else {
actionBar.setBackgroundDrawable(new ColorDrawable(getResources().getColor(R.color.colorPrimary)));
}
handler.postDelayed(this, 500);
}
}, 0);
}
@Override

View File

@@ -4,7 +4,6 @@ import android.content.Context;
import android.media.AudioAttributes;
import android.media.AudioManager;
import android.media.MediaPlayer;
import android.media.SoundPool;
import android.net.Uri;
import android.os.Build;
import android.util.Log;
@@ -13,8 +12,8 @@ import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
import com.google.gson.JsonSyntaxException;
import org.json.JSONException;
import org.timecrafters.TimeCraftersConfigurationTool.R;
import org.timecrafters.TimeCraftersConfigurationTool.MainActivity;
import org.timecrafters.TimeCraftersConfigurationTool.backend.config.Action;
import org.timecrafters.TimeCraftersConfigurationTool.backend.config.Configuration;
import org.timecrafters.TimeCraftersConfigurationTool.backend.config.Group;
@@ -44,10 +43,6 @@ import java.io.FileReader;
import java.io.FileWriter;
import java.io.FilenameFilter;
import java.io.IOException;
import java.net.URI;
import java.nio.file.Files;
import java.nio.file.Paths;
import java.nio.file.StandardCopyOption;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
@@ -59,6 +54,7 @@ public class Backend {
static private HashMap<String, Object> storage = new HashMap<>();
static private Backend instance;
public Context applicationContext;
public MainActivity mainActivity;
private TACNET tacnet;
private Server server;
private Exception lastServerError;

View File

@@ -35,8 +35,10 @@ public class TACNET {
connection.connect(new Runnable() {
@Override
public void run() {
Log.d(TAG, "run: " + connection.lastSocketError());
Backend.instance().startErrorSound(Backend.instance().applicationContext);
if (connection != null) {
Log.d(TAG, "run: " + connection.lastSocketError());
Backend.instance().startErrorSound(Backend.instance().applicationContext);
}
}
});
}

View File

@@ -0,0 +1,39 @@
package org.timecrafters.TimeCraftersConfigurationTool.dialogs;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Button;
import android.widget.LinearLayout;
import android.widget.TextView;
import org.timecrafters.TimeCraftersConfigurationTool.R;
import org.timecrafters.TimeCraftersConfigurationTool.library.TimeCraftersDialog;
public class TACNETDialog extends TimeCraftersDialog {
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
setCancelable(false);
View root = super.onCreateView(inflater, container, savedInstanceState);
root.findViewById(R.id.titlebar).setBackgroundColor(getResources().getColor(R.color.tacnetPrimary));
((TextView)root.findViewById(R.id.dialog_title)).setText(getArguments().getString("title", ""));
LinearLayout view = root.findViewById(R.id.dialog_content);
view.addView(getLayoutInflater().inflate(R.layout.dialog_tacnet, null));
((TextView)view.findViewById(R.id.message)).setText(getArguments().getString("message", ""));
final Button closeButton = view.findViewById(R.id.close_button);
closeButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
dismiss();
}
});
return root;
}
}

View File

@@ -167,7 +167,7 @@ public class Client {
}
public boolean isConnected() {
return this.socket != null && !this.socket.isClosed();
return this.socket != null && !this.socket.isClosed() && packetsReceived > 0;
}
public boolean isBound() {

View File

@@ -1,12 +1,15 @@
package org.timecrafters.TimeCraftersConfigurationTool.tacnet;
import android.os.Bundle;
import android.util.Log;
import org.timecrafters.TimeCraftersConfigurationTool.LauncherActivity;
import org.timecrafters.TimeCraftersConfigurationTool.backend.Backend;
import org.timecrafters.TimeCraftersConfigurationTool.backend.Config;
import org.timecrafters.TimeCraftersConfigurationTool.backend.TAC;
import org.timecrafters.TimeCraftersConfigurationTool.backend.config.Action;
import org.timecrafters.TimeCraftersConfigurationTool.backend.config.Group;
import org.timecrafters.TimeCraftersConfigurationTool.dialogs.TACNETDialog;
import java.io.File;
import java.util.ArrayList;
@@ -101,8 +104,22 @@ public class PacketHandler {
private void handleHandShake(Packet packet) {}
// NO-OP
private void handleHeartBeat(Packet packet) {}
// NO-OP
private void handleError(Packet packet) {}
private void handleError(Packet packet) {
if (hostIsAConnection && Backend.instance().mainActivity != null) {
String[] split = packet.getContent().split("\\" + Packet.PROTOCOL_SEPERATOR, 2);
final String title = split[0];
final String message = split[1];
final TACNETDialog dialog = new TACNETDialog();
Bundle bundle = new Bundle();
bundle.putString("title", title);
bundle.putString("message", message);
dialog.setArguments(bundle);
dialog.show(Backend.instance().mainActivity.getSupportFragmentManager(), "TACNETMessage");
}
}
private void handleUploadConfig(Packet packet) {
String[] split = packet.getContent().split("\\" + Packet.PROTOCOL_SEPERATOR, 2);
@@ -290,7 +307,7 @@ public class PacketHandler {
return Packet.create(Packet.PacketType.HEARTBEAT, Packet.PROTOCOL_HEARTBEAT);
}
static private Packet packetError(String errorTitle, String errorMessage) {
static public Packet packetError(String errorTitle, String errorMessage) {
return Packet.create(Packet.PacketType.ERROR, errorTitle + Packet.PROTOCOL_SEPERATOR + errorMessage);
}

View File

@@ -75,7 +75,7 @@ public class Server {
if (activeClient != null && !activeClient.isClosed()) {
Log.i(TAG, "Too many clients, already have one connected!");
client.close("Too many clients!");
client.close( PacketHandler.packetError("Too many clients!", "Already have one connected!").toString() );
} else {
this.activeClient = client;

View File

@@ -0,0 +1,41 @@
<?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"
android:layout_width="match_parent"
android:layout_height="match_parent">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent">
<TextView
android:id="@+id/message"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginStart="@dimen/button_margin_left"
android:layout_marginLeft="@dimen/button_margin_left"
android:layout_marginTop="@dimen/button_margin_top"
android:layout_marginEnd="@dimen/button_margin_right"
android:layout_marginRight="@dimen/button_margin_right"
android:layout_marginBottom="@dimen/button_margin_bottom"
android:textColor="@android:color/black" />
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal">
<Button
android:id="@+id/close_button"
android:layout_width="0dip"
android:layout_height="wrap_content"
android:layout_weight="1"
android:text="Close" />
</LinearLayout>
</LinearLayout>
</androidx.constraintlayout.widget.ConstraintLayout>

View File

@@ -25,6 +25,10 @@
<color name="tacnetPrimary">#003f7f</color>
<color name="tacnetSecondary">#007f7f</color>
<color name="tacnetConnectionConnecting">#ff8800</color>
<color name="tacnetConnectionConnected">@color/tacnetPrimary</color>
<color name="tacnetConnectionConnectionError">@color/colorDanger</color>
<color name="switchOn">#ff8800</color>
<color name="dialogBackground">#ddd</color>