diff --git a/libSafeMobile/src/main/java/com/safemobile/activities/AbstractLiveActivity.java b/libSafeMobile/src/main/java/com/safemobile/activities/AbstractLiveActivity.java index 236b078..6ce3a62 100644 --- a/libSafeMobile/src/main/java/com/safemobile/activities/AbstractLiveActivity.java +++ b/libSafeMobile/src/main/java/com/safemobile/activities/AbstractLiveActivity.java @@ -25,6 +25,7 @@ public abstract class AbstractLiveActivity extends AppCompatActivity { public abstract void vehicleStatusReceived(long imei, int opCode, int status); // --> UpdateOptions public abstract void emergencyAlarmReceived(int position, double lat, double lng); // --> UpdateEmergencyAlarm public abstract GoogleMap getMap(); // --> UpdateEmergencyAlarm + public abstract void setLanguage(); /** Misc */ public AbstractSDParentActivity getParentTab() { diff --git a/libSafeMobile/src/main/java/com/safemobile/services/TCPhandler.java b/libSafeMobile/src/main/java/com/safemobile/services/TCPhandler.java index 072dd7a..2d1e678 100644 --- a/libSafeMobile/src/main/java/com/safemobile/services/TCPhandler.java +++ b/libSafeMobile/src/main/java/com/safemobile/services/TCPhandler.java @@ -6,6 +6,7 @@ import android.content.Intent; import android.content.IntentFilter; import android.net.ConnectivityManager; import android.net.wifi.WifiManager; +import android.util.Log; import com.safemobile.lib.AppParams; import com.safemobile.lib.SM; @@ -24,6 +25,7 @@ import java.util.TimerTask; public class TCPhandler implements Runnable { + private final String TAG = "TCPhandler"; private boolean alive = true; public String serverHostname; @@ -56,18 +58,22 @@ public class TCPhandler implements Runnable { // create timer to check socket status Timer timer = new Timer(); - timer.scheduleAtFixedRate(new TimerTask() { - @Override - public void run() { - try { - previousConnectionWasUP = isConnectionUP; - // try to send something - TCPmsgParser._fireonTCPConnectionStatusEvent(isConnectionUP, previousConnectionWasUP); - } catch (Exception e) { - SM.Exception("TIMERException", e.toString()); + try { + timer.scheduleAtFixedRate(new TimerTask() { + @Override + public void run() { + try { + previousConnectionWasUP = isConnectionUP; + // try to send something + TCPmsgParser._fireonTCPConnectionStatusEvent(isConnectionUP, previousConnectionWasUP); + } catch (Exception e) { + SM.Exception("TIMERException", e.toString()); + } } - } - }, 0, 3000); + }, 0, 3000); + } catch(Exception e) { + Log.v("Exception", e.getMessage()); + } // get WiFi state isWiFiOn = isNetworkConnected(); @@ -104,6 +110,8 @@ public class TCPhandler implements Runnable { SM.Debug("IllegalArgumentException", "TCPhandler break:"+ e); } catch (IOException e) { SM.Debug("IOException", "TCPhandler break:"+ e); + } catch (Exception e) { + Log.v("Exception", e.getMessage()); } while (alive) { @@ -111,6 +119,8 @@ public class TCPhandler implements Runnable { Thread.sleep(3000); } catch (InterruptedException e) { SM.Debug("TCPhandler Crash1 on sleep:"+ e); + } catch (Exception e) { + Log.v("Exception", e.getMessage()); } while (Boolean.TRUE.equals(isConnectionUP)) { @@ -242,6 +252,8 @@ public class TCPhandler implements Runnable { Thread.sleep(1000); } catch (InterruptedException e) { SM.Debug("TCPhandler Crash2 on sleep:"+ e); + } catch (Exception e) { + Log.v("Exception", e.getMessage()); } //try to restart connection if (alive && isWiFiOn) @@ -350,6 +362,7 @@ public class TCPhandler implements Runnable { if (soc != null) soc.close(); } catch (IOException e1) { + Log.v("IOException", e1.getMessage()); e1.printStackTrace(); } @@ -371,14 +384,15 @@ public class TCPhandler implements Runnable { private void restartTCP() { try { + Log.v(TAG, "restartTCP"); isConnectionUP = false; previousConnectionWasUP = false; SM.Debug("Restarting TCP...ip:" + serverHostname + ":" + port); soc = new Socket(); - soc.connect(new InetSocketAddress(serverHostname, port), 5000); - + soc.connect(new InetSocketAddress(serverHostname, port), 50000); input = new DataInputStream(soc.getInputStream()); + //output stream output = new DataOutputStream(soc.getOutputStream()); @@ -386,17 +400,11 @@ public class TCPhandler implements Runnable { isConnectionUP = true; } - } catch (UnknownHostException e) { - SM.Exception("restartTCP break:" + e.toString()); + } catch (NullPointerException | IOException e) { + SM.Exception("restartTCP break:" + e); isConnectionUP = false; } catch (IllegalArgumentException e) { - SM.Debug("IllegalArgumentException", "restartTCP break:" + e.toString()); - } catch (IOException e) { - SM.Exception("restartTCP break:" + e.toString()); - isConnectionUP = false; - } catch (NullPointerException e) { - SM.Exception("restartTCP break:" + e.toString()); - isConnectionUP = false; + SM.Debug("IllegalArgumentException", "restartTCP break:" + e); } triggerTCPConnectionStateEvent(); } @@ -410,6 +418,7 @@ public class TCPhandler implements Runnable { soc.close(); soc = null; } catch (IOException e) { + Log.v("IOException", e.getMessage()); e.printStackTrace(); } } diff --git a/safeDispatch/src/main/AndroidManifest.xml b/safeDispatch/src/main/AndroidManifest.xml index 23f0048..d91b7ed 100644 --- a/safeDispatch/src/main/AndroidManifest.xml +++ b/safeDispatch/src/main/AndroidManifest.xml @@ -7,6 +7,7 @@ android:glEsVersion="0x00020000" android:required="true" /> + diff --git a/safeDispatch/src/main/java/com/safemobile/lib/sound/TcpAudioClient.java b/safeDispatch/src/main/java/com/safemobile/lib/sound/TcpAudioClient.java index 81d09f0..8344c36 100644 --- a/safeDispatch/src/main/java/com/safemobile/lib/sound/TcpAudioClient.java +++ b/safeDispatch/src/main/java/com/safemobile/lib/sound/TcpAudioClient.java @@ -107,7 +107,6 @@ public class TcpAudioClient implements Runnable { recv = soc.getInputStream(); writer = soc.getOutputStream(); setConnOK(true); - } catch (IOException e) { SM.Debug("break:" + e); } diff --git a/safeDispatch/src/main/java/com/safemobile/safedispatch/AlarmActivity.java b/safeDispatch/src/main/java/com/safemobile/safedispatch/AlarmActivity.java index 4585b00..b40f29f 100644 --- a/safeDispatch/src/main/java/com/safemobile/safedispatch/AlarmActivity.java +++ b/safeDispatch/src/main/java/com/safemobile/safedispatch/AlarmActivity.java @@ -66,6 +66,7 @@ public class AlarmActivity extends Activity { setContentView(R.layout.tabalarm); gridView = findViewById(R.id.gridViewAlarms); + gridView.setNestedScrollingEnabled(true); adapter = new AlertGridViewAdapter(this, getAllAlarms(), context, acknowledged); gridView.setAdapter(adapter); @@ -171,7 +172,10 @@ public class AlarmActivity extends Activity { if (param.equals(ALARM)) { // set adapter adapter = new AlertGridViewAdapter(this, getAllAlarms(), context, acknowledged); + int position = gridView.getFirstVisiblePosition(); + gridView.setAdapter(adapter); + gridView.setSelection(position); } else { adapter.changeACK(ackPosition); SM.Debug("Set ACK: " + ackPosition + " | " + (Boolean.TRUE.equals(acknowledged.get(ackPosition)) ? "true" : "false")); diff --git a/safeDispatch/src/main/java/com/safemobile/safedispatch/HistoryActivity.java b/safeDispatch/src/main/java/com/safemobile/safedispatch/HistoryActivity.java index e3b786a..c78c949 100644 --- a/safeDispatch/src/main/java/com/safemobile/safedispatch/HistoryActivity.java +++ b/safeDispatch/src/main/java/com/safemobile/safedispatch/HistoryActivity.java @@ -132,6 +132,17 @@ public class HistoryActivity extends AppCompatActivity implements OnMapReadyCall setDate(); } + public void setLanguage() { + TextView labelVehicle = findViewById(R.id.labelVehicle); + TextView labelStartDate = findViewById(R.id.labelStartDate); + TextView labelEndDate = findViewById(R.id.labelEndDate); + + labelVehicle.setText(R.string.vehicle); + labelStartDate.setText(R.string.startDate); + labelEndDate.setText(R.string.endDate); + displayButton.setText(R.string.display); + } + private void displayHistory(ArrayList positions) { LatLng latLng = null; PolylineOptions polylineOptions = new PolylineOptions(); @@ -168,8 +179,9 @@ public class HistoryActivity extends AppCompatActivity implements OnMapReadyCall private void setDate() { Calendar calendar = Calendar.getInstance(); + calendar.add(Calendar.DATE, 1); endDate = calendar.getTime(); - calendar.add(Calendar.DATE, -1); + calendar.add(Calendar.DATE, -2); startDate = calendar.getTime(); TextView textViewStartDate = findViewById(R.id.textViewStartDate); @@ -279,6 +291,5 @@ public class HistoryActivity extends AppCompatActivity implements OnMapReadyCall this.googleMap.getUiSettings().setMapToolbarEnabled(false); parentTab.demoPositionsList(); - displayButton.performClick(); } } \ No newline at end of file diff --git a/safeDispatch/src/main/java/com/safemobile/safedispatch/LiveActivity.java b/safeDispatch/src/main/java/com/safemobile/safedispatch/LiveActivity.java index 0daa7c7..111066a 100644 --- a/safeDispatch/src/main/java/com/safemobile/safedispatch/LiveActivity.java +++ b/safeDispatch/src/main/java/com/safemobile/safedispatch/LiveActivity.java @@ -296,6 +296,11 @@ public class LiveActivity extends AbstractLiveActivity implements OnMapReadyCall registerBroadcastIntents(); } + public void setLanguage() { + TextView textView = findViewById(R.id.unit_name); + textView.setText(R.string.unitName); + } + /** * Manipulates the map once available. * This callback is triggered when the map is ready to be used. @@ -444,12 +449,6 @@ public class LiveActivity extends AbstractLiveActivity implements OnMapReadyCall public void displayVehicle(double latZoom, double lngZoom) { if (googleMap != null) { - String openWindow = ""; - for (Marker marker : markers) { - if (marker.isInfoWindowShown()) { - openWindow = marker.getTitle(); - } - } googleMap.clear(); for (int i = 0; i < displayedVehicles.size(); i++) { @@ -464,7 +463,8 @@ public class LiveActivity extends AbstractLiveActivity implements OnMapReadyCall markerOptions.icon(markerIcon); Marker marker = this.googleMap.addMarker(markerOptions); - if (openWindow.equals(marker.getTitle()) || i == lastItemClicked) { + + if (i == lastItemClicked) { marker.showInfoWindow(); googleMap.moveCamera(CameraUpdateFactory.newLatLngZoom(newLocation, 14)); } @@ -474,7 +474,6 @@ public class LiveActivity extends AbstractLiveActivity implements OnMapReadyCall } } } - lastItemClicked = 0; } private BitmapDescriptor getProperBitmap(int largeIcon, String text) { diff --git a/safeDispatch/src/main/java/com/safemobile/safedispatch/MessagesActivity.java b/safeDispatch/src/main/java/com/safemobile/safedispatch/MessagesActivity.java index 952c7e6..b4331b3 100644 --- a/safeDispatch/src/main/java/com/safemobile/safedispatch/MessagesActivity.java +++ b/safeDispatch/src/main/java/com/safemobile/safedispatch/MessagesActivity.java @@ -10,6 +10,7 @@ import android.graphics.Typeface; import android.os.Bundle; import android.os.Handler; import android.os.Looper; +import android.util.Log; import android.view.View; import android.widget.ArrayAdapter; import android.widget.Button; @@ -45,6 +46,7 @@ public class MessagesActivity extends Activity { /** * Called when the activity is first created. */ + private final String TAG = "MessagesActivity"; private MessagesGridViewAdapter mAdapter; private ConversationGridViewAdapter convAdapter; @@ -138,6 +140,7 @@ public class MessagesActivity extends Activity { // Implement On Item click listener gridView.setOnItemClickListener((arg0, arg1, position, arg3) -> { + Log.v(TAG, "onItemClick " + LASTMESSAGES); if (LASTMESSAGES) { // get position Msg item = mAdapter.getItem(position); @@ -196,6 +199,7 @@ public class MessagesActivity extends Activity { imageButtonBack.setOnClickListener(v -> { // set LastMessage conversation type LASTMESSAGES = true; + Log.v(TAG, "lastmessages: true"); // refresh Grid getLastSMS(); if (AppParams.DEMO) @@ -388,6 +392,7 @@ public class MessagesActivity extends Activity { listLastMessages.add(new Msg(sentVehicle, txt, Calendar.getInstance().getTime(), sendSMSSeqID)); } SM.Debug("time: " + timeGMT + " | " + Calendar.getInstance().getTime()); + Log.v(TAG, "lastmessages: false"); LASTMESSAGES = false; updateResultsInUi(); @@ -627,6 +632,7 @@ public class MessagesActivity extends Activity { setScId(item.sc_id); SM.Debug("Selected scId: " + getScId()); // set Conversation type + Log.v(TAG, "lastmessages: false"); LASTMESSAGES = false; // call get SMS getSMS4unit(getScId()); diff --git a/safeDispatch/src/main/java/com/safemobile/safedispatch/RecordingsActivity.java b/safeDispatch/src/main/java/com/safemobile/safedispatch/RecordingsActivity.java index acdc9ca..65b86ca 100644 --- a/safeDispatch/src/main/java/com/safemobile/safedispatch/RecordingsActivity.java +++ b/safeDispatch/src/main/java/com/safemobile/safedispatch/RecordingsActivity.java @@ -26,6 +26,7 @@ import com.safemobile.lib.AppParams; import com.safemobile.lib.OperationCodes; import com.safemobile.lib.Recording; import com.safemobile.lib.SM; +import com.safemobile.lib.Vehicle; import com.safemobile.lib.radio.RadioGW; import com.safemobile.lib.sound.RecordingHandle; @@ -295,9 +296,27 @@ public class RecordingsActivity extends Activity { private void updateResultsInUi() { // clear played items playingPositions = new ArrayList<>(); + + ArrayList recordings = getAllRecordings(); + ArrayList filteredList = new ArrayList<>(); + ArrayList vehicles = getParentTab().getAllVehicle(); + for (Recording recording : recordings) { + if (recording.callType == 0 || recording.callType == 4) { + for (Vehicle vehicle : vehicles) + if (vehicle.imei.equals(String.valueOf(recording.subID))) { + filteredList.add(recording); + break; + } + } else { + filteredList.add(recording); + } + } + + setAllRecordings(filteredList); + for (int i = 0; i < getAllRecordings().size(); i++) playingPositions.add(true); - // set adapter - where playingPositions stores exists values + adapter = new RecordingsGridViewAdapter(activity, getAllRecordings(), playingPositions); // playing positions need to be false because no recording is played diff --git a/safeDispatch/src/main/java/com/safemobile/safedispatch/SDMobileActivity.java b/safeDispatch/src/main/java/com/safemobile/safedispatch/SDMobileActivity.java index 478f8da..d941432 100644 --- a/safeDispatch/src/main/java/com/safemobile/safedispatch/SDMobileActivity.java +++ b/safeDispatch/src/main/java/com/safemobile/safedispatch/SDMobileActivity.java @@ -10,13 +10,19 @@ import android.content.ServiceConnection; import android.content.SharedPreferences; import android.content.res.Configuration; import android.graphics.Color; +import android.net.ConnectivityManager; +import android.net.Network; +import android.net.NetworkCapabilities; +import android.net.NetworkRequest; import android.os.AsyncTask; +import android.os.Build; import android.os.Bundle; import android.os.Handler; import android.os.IBinder; import android.os.Looper; import android.text.Editable; import android.text.InputType; +import android.util.Log; import android.view.Gravity; import android.view.View; import android.view.View.OnClickListener; @@ -114,6 +120,17 @@ public class SDMobileActivity extends Activity { super.onCreate(savedInstanceState); SM.Debug("##### onCREATE ##### with LANGUAGE " + AppParams.LANGUAGETMP); + ConnectivityManager connectivityManager = + (ConnectivityManager) this.getSystemService(Context.CONNECTIVITY_SERVICE); + + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) + connectivityManager.registerDefaultNetworkCallback(networkCallback); + else { + NetworkRequest request = new NetworkRequest.Builder() + .addCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET).build(); + connectivityManager.registerNetworkCallback(request, networkCallback); + } + AppParams.theme = AppParams.Theme.SAFEDISPATCH; if (AppParams.theme == AppParams.Theme.SAFENET) this.setTheme(R.style.Theme_Safenet); @@ -532,6 +549,21 @@ public class SDMobileActivity extends Activity { SM.Debug("##### onRESUME #####"); } + private final ConnectivityManager.NetworkCallback networkCallback = new ConnectivityManager.NetworkCallback() { + @Override + public void onAvailable(Network network) { + // network available + Log.v("NetworkAvailability", "available"); + if (tcp != null && !tcp.isConnectionUP) + saveIPandRestartTCP(AppParams.IP, AppParams.PORT); + } + + @Override + public void onLost(Network network) { + // network unavailable + Log.v("NetworkAvailability", "unavailable"); + } + }; private void startTabActivity(long userID) { // good login - load activity diff --git a/safeDispatch/src/main/java/com/safemobile/safedispatch/SetupActivity.java b/safeDispatch/src/main/java/com/safemobile/safedispatch/SetupActivity.java index 6be79a5..1a9c92b 100644 --- a/safeDispatch/src/main/java/com/safemobile/safedispatch/SetupActivity.java +++ b/safeDispatch/src/main/java/com/safemobile/safedispatch/SetupActivity.java @@ -2,16 +2,13 @@ package com.safemobile.safedispatch; import java.util.Locale; -/** fix import */ import com.safemobile.adapters.LanguageSpinnerAdapter; import com.safemobile.lib.AppParams; import com.safemobile.lib.SM; import android.app.Activity; import android.app.AlertDialog; -import android.app.Dialog; import android.content.Context; -import android.content.DialogInterface; import android.content.SharedPreferences; import android.content.res.Configuration; import android.os.Bundle; @@ -73,52 +70,49 @@ public class SetupActivity extends Activity { setContentView(R.layout.tabsetup); - layoutSpinnerLanguage = (LinearLayout) findViewById(R.id.layoutSpinnerLanguage); + layoutSpinnerLanguage = findViewById(R.id.layoutSpinnerLanguage); layoutSpinnerLanguage.setOnClickListener(LanguageListener); - imageLanguage = (ImageView) findViewById(R.id.imageLanguage); - textViewSpinnerLanguage = (TextView) findViewById(R.id.textViewSpinnerLanguage); + imageLanguage = findViewById(R.id.imageLanguage); + textViewSpinnerLanguage = findViewById(R.id.textViewSpinnerLanguage); // change spinner icon and selected language according to tmpLanguage - if (AppParams.LANGUAGETMP.equals("en")){ - imageLanguage.setImageResource(R.drawable.en); - textViewSpinnerLanguage.setText(getString(R.string.en)); - } - else if (AppParams.LANGUAGETMP.equals("de")){ - imageLanguage.setImageResource(R.drawable.de); - textViewSpinnerLanguage.setText(getString(R.string.de)); - } - else if (AppParams.LANGUAGETMP.equals("tr")){ - imageLanguage.setImageResource(R.drawable.tr); - textViewSpinnerLanguage.setText(getString(R.string.tr)); - } - else if (AppParams.LANGUAGETMP.equals("ro")){ - imageLanguage.setImageResource(R.drawable.ro); - textViewSpinnerLanguage.setText(getString(R.string.ro)); - } - else if(AppParams.LANGUAGETMP.equals("es")){ - imageLanguage.setImageResource(R.drawable.es); - textViewSpinnerLanguage.setText(getString(R.string.es)); - } - else if(AppParams.LANGUAGETMP.equals("ru")){ - imageLanguage.setImageResource(R.drawable.ru); - textViewSpinnerLanguage.setText(getString(R.string.ru)); + switch (AppParams.LANGUAGETMP) { + case "en": + imageLanguage.setImageResource(R.drawable.en); + textViewSpinnerLanguage.setText(getString(R.string.en)); + break; + case "de": + imageLanguage.setImageResource(R.drawable.de); + textViewSpinnerLanguage.setText(getString(R.string.de)); + break; + case "tr": + imageLanguage.setImageResource(R.drawable.tr); + textViewSpinnerLanguage.setText(getString(R.string.tr)); + break; + case "ro": + imageLanguage.setImageResource(R.drawable.ro); + textViewSpinnerLanguage.setText(getString(R.string.ro)); + break; + case "es": + imageLanguage.setImageResource(R.drawable.es); + textViewSpinnerLanguage.setText(getString(R.string.es)); + break; + case "ru": + imageLanguage.setImageResource(R.drawable.ru); + textViewSpinnerLanguage.setText(getString(R.string.ru)); + break; } // get visual elements - appServerIP = (EditText) findViewById(R.id.appServerIP); - appServerPort = (EditText) findViewById(R.id.appServerPort); + appServerIP = findViewById(R.id.appServerIP); + appServerPort = findViewById(R.id.appServerPort); // hide path layout used only on Pad/Pod - layoutPath = (LinearLayout) findViewById(R.id.layoutPath); + layoutPath = findViewById(R.id.layoutPath); layoutPath.setVisibility(View.GONE); - btn_save = (Button) findViewById(R.id.btn_save); + btn_save = findViewById(R.id.btn_save); - btn_save.setOnClickListener(new OnClickListener() { - @Override - public void onClick(View v) { - saveSettings(); - } - }); + btn_save.setOnClickListener(v -> saveSettings()); // set values if(!AppParams.IP.equals("n/a")) @@ -134,46 +128,31 @@ public class SetupActivity extends Activity { AlertDialog.Builder builder = new AlertDialog.Builder(this); builder.setMessage(getString(R.string.exit)) .setCancelable(false) - .setNeutralButton(getString(R.string.logout), new DialogInterface.OnClickListener() { - public void onClick(DialogInterface dialog, int id) { - parentTab.whenBackPressed(AppParams.ActivityResult.logout); - } - }) - .setPositiveButton(getString(R.string.ext), new DialogInterface.OnClickListener() { - public void onClick(DialogInterface dialog, int id) { - parentTab.whenBackPressed(AppParams.ActivityResult.exit); - } - }) - .setNegativeButton(getString(R.string.cancel), new DialogInterface.OnClickListener() { - public void onClick(DialogInterface dialog, int id) { - dialog.cancel(); - } - }); + .setNeutralButton(getString(R.string.logout), (dialog, id) -> parentTab.whenBackPressed(AppParams.ActivityResult.logout)) + .setPositiveButton(getString(R.string.ext), (dialog, id) -> parentTab.whenBackPressed(AppParams.ActivityResult.exit)) + .setNegativeButton(getString(R.string.cancel), (dialog, id) -> dialog.cancel()); AlertDialog alert = builder.create(); alert.show(); } // listener when select language pressed - private OnClickListener LanguageListener = new OnClickListener() { + private final OnClickListener LanguageListener = new OnClickListener() { @Override public void onClick(View v) { final LanguageSpinnerAdapter adapter = new LanguageSpinnerAdapter(context, android.R.layout.simple_spinner_item, Languages, getLayoutInflater()); AlertDialog.Builder builder = new AlertDialog.Builder(context); builder.setTitle(getString(R.string.selLanguage)); - builder.setAdapter(adapter , new DialogInterface.OnClickListener() { - @Override - public void onClick(DialogInterface dialog, int which) { - textViewSpinnerLanguage.setText(adapter.getItem(which)); - switch(which) - { - case 0: imageLanguage.setImageResource(R.drawable.en); AppParams.LANGUAGETMP = "en"; onCreate(savedInstanceState); parentTab.changeLanguage(); break; - case 1: imageLanguage.setImageResource(R.drawable.de); AppParams.LANGUAGETMP = "de"; onCreate(savedInstanceState); parentTab.changeLanguage(); break; - case 2: imageLanguage.setImageResource(R.drawable.tr); AppParams.LANGUAGETMP = "tr"; onCreate(savedInstanceState); parentTab.changeLanguage(); break; - case 3: imageLanguage.setImageResource(R.drawable.ro); AppParams.LANGUAGETMP = "ro"; onCreate(savedInstanceState); parentTab.changeLanguage(); break; - case 4: imageLanguage.setImageResource(R.drawable.ru); AppParams.LANGUAGETMP = "ru"; onCreate(savedInstanceState); parentTab.changeLanguage(); break; - case 5: imageLanguage.setImageResource(R.drawable.es); AppParams.LANGUAGETMP = "es"; onCreate(savedInstanceState); parentTab.changeLanguage(); break; - } + builder.setAdapter(adapter , (dialog, which) -> { + textViewSpinnerLanguage.setText(adapter.getItem(which)); + switch(which) + { + case 0: imageLanguage.setImageResource(R.drawable.en); AppParams.LANGUAGETMP = "en"; onCreate(savedInstanceState); parentTab.changeLanguage(); break; + case 1: imageLanguage.setImageResource(R.drawable.de); AppParams.LANGUAGETMP = "de"; onCreate(savedInstanceState); parentTab.changeLanguage(); break; + case 2: imageLanguage.setImageResource(R.drawable.tr); AppParams.LANGUAGETMP = "tr"; onCreate(savedInstanceState); parentTab.changeLanguage(); break; + case 3: imageLanguage.setImageResource(R.drawable.ro); AppParams.LANGUAGETMP = "ro"; onCreate(savedInstanceState); parentTab.changeLanguage(); break; + case 4: imageLanguage.setImageResource(R.drawable.ru); AppParams.LANGUAGETMP = "ru"; onCreate(savedInstanceState); parentTab.changeLanguage(); break; + case 5: imageLanguage.setImageResource(R.drawable.es); AppParams.LANGUAGETMP = "es"; onCreate(savedInstanceState); parentTab.changeLanguage(); break; } }); @@ -215,12 +194,12 @@ public class SetupActivity extends Activity { String oldIP = AppParams.IP; String oldPort = AppParams.PORT; - editor.putString("ip", appServerIP.getText().toString()); - editor.putString("port", appServerPort.getText().toString()); - editor.putString("language", AppParams.LANGUAGETMP); - Boolean result = editor.commit(); + editor.putString("ip", appServerIP.getText().toString()); + editor.putString("port", appServerPort.getText().toString()); + editor.putString("language", AppParams.LANGUAGETMP); + boolean result = editor.commit(); // saved completed - if(result) + if (result) Toast.makeText(context, "Settings saved successfully.", Toast.LENGTH_LONG).show(); else Toast.makeText(context, "Settings failed to complete!", Toast.LENGTH_LONG).show(); @@ -265,31 +244,4 @@ public class SetupActivity extends Activity { //showDialog(result); } - public void showDialog(Boolean result) - { - Dialog dialog = new Dialog(context); - if(result) - dialog.setTitle("Save Completed"); - else - dialog.setTitle("Save Failed"); - dialog.setContentView(R.layout.dialog); - dialog.setCancelable(true); - dialog.setCanceledOnTouchOutside(true); - - TextView text = (TextView) dialog.findViewById(R.id.text); - ImageView image = (ImageView) dialog.findViewById(R.id.image); - if(result) - { - image.setImageResource(R.drawable.error); - text.setText("Settings saved successfully."); - } - else - { - image.setImageResource(R.drawable.error); - text.setText("Settings failed to complete!"); - } - - dialog.show(); - } - } diff --git a/safeDispatch/src/main/java/com/safemobile/safedispatch/TabLayoutActivity.java b/safeDispatch/src/main/java/com/safemobile/safedispatch/TabLayoutActivity.java index 6686bee..0737249 100644 --- a/safeDispatch/src/main/java/com/safemobile/safedispatch/TabLayoutActivity.java +++ b/safeDispatch/src/main/java/com/safemobile/safedispatch/TabLayoutActivity.java @@ -73,6 +73,7 @@ import android.content.pm.PackageManager; import android.content.res.AssetManager; import android.content.res.Configuration; import android.content.res.Resources; +import android.net.ConnectivityManager; import android.net.Uri; import android.os.AsyncTask; import android.os.Build; @@ -101,6 +102,7 @@ import androidx.core.app.NotificationManagerCompat; public class TabLayoutActivity extends AbstractSDParentActivity { + private final String TAG = "TabLayoutActivity"; /* Misc */ private Resources res; private Context context; @@ -179,6 +181,9 @@ public class TabLayoutActivity extends AbstractSDParentActivity { private static final String SETTINGS = "Setup"; private static final String ABOUT = "SafeMobile"; + private final Handler uiHandler = new Handler(Looper.getMainLooper()); + + // default app language public static final String DATABASE_LANGUAGE = "en"; // database language : en, de, tr, ro or empty @@ -602,6 +607,7 @@ public class TabLayoutActivity extends AbstractSDParentActivity { Vehicle vehicle = getVehicle4Imei(getImei()); if (vehicle != null) getMessageActivity().setScId(vehicle.sc_id); + Log.v(TAG, "lastmessages: false"); getMessageActivity().LASTMESSAGES = false; getMessageActivity().getLastSMS(); @@ -694,13 +700,26 @@ public class TabLayoutActivity extends AbstractSDParentActivity { @Override public void whenBackPressed(AppParams.ActivityResult result) { + try { + prepareForLogOut(result); + + finish(); + android.os.Process.killProcess(android.os.Process.myPid()); + System.exit(0); + } catch (Exception e) { + Log.v(TAG, e.getMessage()); + } + } + + private void prepareForLogOut(AppParams.ActivityResult result) { + Log.v(TAG, "prepareForLogOut"); if (tcpTimer != null) { tcpTimer.cancel(); tcpTimer.purge(); tcpTimer = null; } - if (getRadioActivity().audioThread != null) { + if (getRadioActivity() != null && getRadioActivity().audioThread != null) { Thread moribund = getRadioActivity().audioThread; getRadioActivity().audioThread = null; moribund.interrupt(); @@ -721,10 +740,6 @@ public class TabLayoutActivity extends AbstractSDParentActivity { getIntent().putExtra("result", result); setResult(RESULT_OK, getIntent()); //-> used for exit - - finish(); - android.os.Process.killProcess(android.os.Process.myPid()); - System.exit(0); } @Override @@ -732,14 +747,13 @@ public class TabLayoutActivity extends AbstractSDParentActivity { // recreate UI Locale locale = new Locale(AppParams.LANGUAGETMP); Locale.setDefault(locale); - android.content.res.Configuration configuration = new android.content.res.Configuration(); - configuration.locale = locale; - getBaseContext().getResources().updateConfiguration(configuration, - getBaseContext().getResources().getDisplayMetrics()); + setLocale(getLiveActivity(), locale); - if (getHistoryActivity() != null) - getHistoryActivity().onCreate(getHistoryActivity().savedInstanceState); // change UI for RadioActivity and MessageActivity + if (getLiveActivity() != null) + getLiveActivity().setLanguage(); + if (getHistoryActivity() != null) + getHistoryActivity().setLanguage(); if (getRadioActivity() != null) getRadioActivity().onCreate(getRadioActivity().savedInstanceState); if (getMessageActivity() != null) @@ -750,6 +764,13 @@ public class TabLayoutActivity extends AbstractSDParentActivity { getAlarmActivity().onCreate(getAlarmActivity().getSavedInstanceState()); } + public static void setLocale(Activity activity, Locale locale) { + Resources resources = activity.getResources(); + Configuration config = resources.getConfiguration(); + config.setLocale(locale); + resources.updateConfiguration(config, resources.getDisplayMetrics()); + } + //timer stuff private void timerMethod() { if (!AppParams.DEMO) @@ -2031,8 +2052,50 @@ public class TabLayoutActivity extends AbstractSDParentActivity { @Override public void onTCPConnectionDown(boolean previousWasConnectionUp) { + Timer timer = new Timer(); + timer.schedule(new TimerTask() { + @Override + public void run() { + boolean isNetworkConnected = isNetworkConnected(); + Log.v(TAG, "isNetworkConnected: " + isNetworkConnected); + if (isNetworkConnected) { + if (tcp != null && !tcp.isConnectionUP) { + tcp.Stop(); +// if (tcpParser != null) +// tcpParser.clearMsgList(); + tcp = null; + + uiHandler.post(() -> { + if (myService != null) { + myService.stopTCPConnection(); + + + myService.recreateTCPConnection(); + + getApplicationContext().bindService(new Intent(context, TCPService.class), serviceConnection, Context.BIND_AUTO_CREATE); + if (getRadioActivity() != null) + getRadioActivity().onCreate(getRadioActivity().savedInstanceState); + if (getMessageActivity() != null) + getMessageActivity().onCreate(getMessageActivity().getSavedInstanceState()); + if (getRecordingsActivity() != null) + getRecordingsActivity().onCreate(getRecordingsActivity().getSavedInstanceState()); + if (getAlarmActivity() != null) + getAlarmActivity().onCreate(getAlarmActivity().getSavedInstanceState()); + + uiHandler.post(initTCPRUN); + } + SM.Debug("RECREATE TCP", "IP: " + AppParams.IP + " | Port: " + AppParams.PORT); + }); + } + + this.cancel(); + } + } + }, 0, 100); + + prepareForLogOut(AppParams.ActivityResult.tcpDown); // execute logout - whenBackPressed(AppParams.ActivityResult.tcpDown); +// whenBackPressed(AppParams.ActivityResult.tcpDown); // send a broadcast notifyBroadcast(OperationCodes.TCP_CONNECTION_DOWN + ""); @@ -2056,6 +2119,19 @@ public class TabLayoutActivity extends AbstractSDParentActivity { }); } + // Create runnable for posting + final Runnable initTCPRUN = () -> { + // start thread to add listener + SM.Debug("##### initTCPRUN"); + if (!AppParams.DEMO) + tcpInit(); + }; + + private boolean isNetworkConnected() { + ConnectivityManager cm = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE); + return cm.getActiveNetworkInfo() != null && cm.getActiveNetworkInfo().isConnected(); + } + // Create runnable for posting final Runnable updateResultsAlarm = () -> updateResultsAlarmInUi("realpha"); diff --git a/safeDispatch/src/main/res/layout/style_header_units.xml b/safeDispatch/src/main/res/layout/style_header_units.xml index 9620ef3..7636db1 100644 --- a/safeDispatch/src/main/res/layout/style_header_units.xml +++ b/safeDispatch/src/main/res/layout/style_header_units.xml @@ -10,6 +10,7 @@ android:gravity="center_vertical" >