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