From 2adfeb74bfc2322a2251d8eca8c451121c2065ad Mon Sep 17 00:00:00 2001 From: cyberarm Date: Thu, 12 Nov 2020 09:16:15 -0600 Subject: [PATCH] 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. --- .../MainActivity.java | 32 +++++++++++++++ .../backend/Backend.java | 8 +--- .../backend/TACNET.java | 6 ++- .../dialogs/TACNETDialog.java | 39 ++++++++++++++++++ .../tacnet/Client.java | 2 +- .../tacnet/PacketHandler.java | 23 +++++++++-- .../tacnet/Server.java | 2 +- app/src/main/res/layout/dialog_tacnet.xml | 41 +++++++++++++++++++ app/src/main/res/values/colors.xml | 4 ++ 9 files changed, 144 insertions(+), 13 deletions(-) create mode 100644 app/src/main/java/org/timecrafters/TimeCraftersConfigurationTool/dialogs/TACNETDialog.java create mode 100644 app/src/main/res/layout/dialog_tacnet.xml diff --git a/app/src/main/java/org/timecrafters/TimeCraftersConfigurationTool/MainActivity.java b/app/src/main/java/org/timecrafters/TimeCraftersConfigurationTool/MainActivity.java index bd9e1b5..7327f5a 100644 --- a/app/src/main/java/org/timecrafters/TimeCraftersConfigurationTool/MainActivity.java +++ b/app/src/main/java/org/timecrafters/TimeCraftersConfigurationTool/MainActivity.java @@ -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 diff --git a/app/src/main/java/org/timecrafters/TimeCraftersConfigurationTool/backend/Backend.java b/app/src/main/java/org/timecrafters/TimeCraftersConfigurationTool/backend/Backend.java index cc5a578..db3c175 100644 --- a/app/src/main/java/org/timecrafters/TimeCraftersConfigurationTool/backend/Backend.java +++ b/app/src/main/java/org/timecrafters/TimeCraftersConfigurationTool/backend/Backend.java @@ -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 storage = new HashMap<>(); static private Backend instance; public Context applicationContext; + public MainActivity mainActivity; private TACNET tacnet; private Server server; private Exception lastServerError; diff --git a/app/src/main/java/org/timecrafters/TimeCraftersConfigurationTool/backend/TACNET.java b/app/src/main/java/org/timecrafters/TimeCraftersConfigurationTool/backend/TACNET.java index f1356ee..c18d6d3 100644 --- a/app/src/main/java/org/timecrafters/TimeCraftersConfigurationTool/backend/TACNET.java +++ b/app/src/main/java/org/timecrafters/TimeCraftersConfigurationTool/backend/TACNET.java @@ -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); + } } }); } diff --git a/app/src/main/java/org/timecrafters/TimeCraftersConfigurationTool/dialogs/TACNETDialog.java b/app/src/main/java/org/timecrafters/TimeCraftersConfigurationTool/dialogs/TACNETDialog.java new file mode 100644 index 0000000..c83e2a7 --- /dev/null +++ b/app/src/main/java/org/timecrafters/TimeCraftersConfigurationTool/dialogs/TACNETDialog.java @@ -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; + } +} diff --git a/app/src/main/java/org/timecrafters/TimeCraftersConfigurationTool/tacnet/Client.java b/app/src/main/java/org/timecrafters/TimeCraftersConfigurationTool/tacnet/Client.java index 7dea793..d13ff77 100755 --- a/app/src/main/java/org/timecrafters/TimeCraftersConfigurationTool/tacnet/Client.java +++ b/app/src/main/java/org/timecrafters/TimeCraftersConfigurationTool/tacnet/Client.java @@ -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() { diff --git a/app/src/main/java/org/timecrafters/TimeCraftersConfigurationTool/tacnet/PacketHandler.java b/app/src/main/java/org/timecrafters/TimeCraftersConfigurationTool/tacnet/PacketHandler.java index 6caf1b2..31c4edd 100755 --- a/app/src/main/java/org/timecrafters/TimeCraftersConfigurationTool/tacnet/PacketHandler.java +++ b/app/src/main/java/org/timecrafters/TimeCraftersConfigurationTool/tacnet/PacketHandler.java @@ -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); } diff --git a/app/src/main/java/org/timecrafters/TimeCraftersConfigurationTool/tacnet/Server.java b/app/src/main/java/org/timecrafters/TimeCraftersConfigurationTool/tacnet/Server.java index 0ea1590..fa7e062 100755 --- a/app/src/main/java/org/timecrafters/TimeCraftersConfigurationTool/tacnet/Server.java +++ b/app/src/main/java/org/timecrafters/TimeCraftersConfigurationTool/tacnet/Server.java @@ -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; diff --git a/app/src/main/res/layout/dialog_tacnet.xml b/app/src/main/res/layout/dialog_tacnet.xml new file mode 100644 index 0000000..6f3a5b2 --- /dev/null +++ b/app/src/main/res/layout/dialog_tacnet.xml @@ -0,0 +1,41 @@ + + + + + + + + + +