Compare commits

..

8 Commits

6 changed files with 340 additions and 495 deletions

3
.gitignore vendored
View File

@ -184,3 +184,6 @@ $RECYCLE.BIN/
/.idea/misc.xml /.idea/misc.xml
/.idea /.idea
/.idea/modules.xml /.idea/modules.xml
/safeDispatch/debug
/safeDispatch/release

View File

@ -16,9 +16,9 @@ import android.widget.Toast;
public class TCPService extends Service { public class TCPService extends Service {
private int[] startModes = {START_STICKY, START_NOT_STICKY, START_REDELIVER_INTENT}; private int[] startModes = {START_STICKY, START_NOT_STICKY, START_REDELIVER_INTENT};
private int mStartMode = startModes[0]; // indicates how to behave if the service is killed private int mStartMode = startModes[0]; // indicates how to behave if the service is killed
private IBinder mBinder = new TCPBinder(); // interface for clients that bind private IBinder mBinder = new TCPBinder(); // interface for clients that bind
private boolean mAllowRebind = true; // indicates whether onRebind should be used private boolean mAllowRebind = true; // indicates whether onRebind should be used
private TCPhandler tcp = null; private TCPhandler tcp = null;
private TCPmsgParser tcpParser = null; private TCPmsgParser tcpParser = null;
@ -102,10 +102,8 @@ public class TCPService extends Service {
/** Stop TCP Connection */ /** Stop TCP Connection */
public void stopTCPConnection() public void stopTCPConnection() {
{ if(tcp != null) {
if(tcp != null)
{
tcp.Stop(); tcp.Stop();
tcp = null; tcp = null;
} }
@ -114,27 +112,7 @@ public class TCPService extends Service {
/** restart the TCP Connection after the connection parameters had been changed */ /** restart the TCP Connection after the connection parameters had been changed */
public void recreateTCPConnection() public void recreateTCPConnection()
{ {
/* recreateTCPConnection(AppParams.IP, AppParams.PORT);
Thread t = new Thread(new Runnable() {
@Override
public void run() {
try {
Thread.sleep(1000*2);
} catch (InterruptedException e) {
e.printStackTrace();
}
*/
// create a tcp connection
int port = 13589;
try {
port = Integer.parseInt(AppParams.PORT);
}
catch(Exception ex) { }
tcp = new TCPhandler(getApplicationContext(), AppParams.IP, port);
/* }
});
t.start();
*/
} }
public void recreateTCPConnection(String _ip, String _port) public void recreateTCPConnection(String _ip, String _port)

View File

@ -1,20 +0,0 @@
{
"version": 3,
"artifactType": {
"type": "APK",
"kind": "Directory"
},
"applicationId": "com.safemobile.safedispatch",
"variantName": "release",
"elements": [
{
"type": "SINGLE",
"filters": [],
"attributes": [],
"versionCode": 8000091,
"versionName": "8.0.91",
"outputFile": "SafeDispatchMobile_v.8.0.91-release.apk"
}
],
"elementType": "File"
}

View File

@ -21,6 +21,7 @@ import java.util.ArrayList;
import java.util.Date; import java.util.Date;
import java.util.Hashtable; import java.util.Hashtable;
import java.util.Locale; import java.util.Locale;
import java.util.concurrent.TimeUnit;
public class GoogleMapsInfoBubble implements GoogleMap.InfoWindowAdapter { public class GoogleMapsInfoBubble implements GoogleMap.InfoWindowAdapter {
@ -90,28 +91,38 @@ public class GoogleMapsInfoBubble implements GoogleMap.InfoWindowAdapter {
boolean isMilitaryTime = false; boolean isMilitaryTime = false;
Date positionTime; Date positionTime;
long timeGMT = 0;
String speed, address, gpsLocation, name = ""; String speed, address, gpsLocation, name = "";
if (isLiveTab) { if (isLiveTab) {
SuperVehicle vehicle = superVehHash.get(key); SuperVehicle vehicle = superVehHash.get(key);
positionTime = new Date((new Date()).getTime() - vehicle.timeGMT);
//positionTime = new Date((new Date()).getTime() - vehicle.timeGMT);
timeGMT = vehicle.timeGMT;
address = vehicle.Address != null ? vehicle.Address : ""; address = vehicle.Address != null ? vehicle.Address : "";
name = vehicle.name; name = vehicle.name;
speed = String.format(context.getResources().getString(R.string.speedMph), vehicle.speed); speed = String.format(context.getResources().getString(R.string.speedMph), (int)(0.621371192 * vehicle.speed));
gpsLocation = "[" + String.format("%.4f", vehicle.lat) + "," + String.format("%.4f",vehicle.lng) + "]"; gpsLocation = "[" + String.format("%.4f", vehicle.lat) + "," + String.format("%.4f",vehicle.lng) + "]";
} else { } else {
HistPos histPos = histPosList.get(position); HistPos histPos = histPosList.get(position);
positionTime = new Date((new Date()).getTime() - histPos.timeGMT);
//positionTime = new Date((new Date()).getTime() - histPos.timeGMT);
timeGMT = histPos.timeGMT;
address = histPos.Address != null ? histPos.Address : ""; address = histPos.Address != null ? histPos.Address : "";
speed = String.format(context.getResources().getString(R.string.speedMph), histPos.speed); speed = String.format(context.getResources().getString(R.string.speedMph), (int)(0.621371192 * histPos.speed));
gpsLocation = "[" + String.format("%.4f", histPos.lat) + "," + String.format("%.4f",histPos.lng) + "]"; gpsLocation = "[" + String.format("%.4f", histPos.lat) + "," + String.format("%.4f",histPos.lng) + "]";
} }
String timeFormat = isMilitaryTime //String timeFormat = isMilitaryTime
? "HH:mm:ss dd.MMM.yyyy" // ? "HH:mm:ss dd.MMM.yyyy"
: "hh:mm:ss a dd.MMM.yyy"; // : "hh:mm:ss a dd.MMM.yyy";
//DateFormat format = new SimpleDateFormat(timeFormat, Locale.ENGLISH);
//tvTimeAgo.setText(format.format(positionTime));
DateFormat format = new SimpleDateFormat("hh:mm:ss", Locale.ENGLISH);
tvTimeAgo.setText( getDateTimeAgo(timeGMT * 1000) + " [" + format.format(new Date(timeGMT*1000) ) + "]");
DateFormat format = new SimpleDateFormat(timeFormat, Locale.ENGLISH);
tvTimeAgo.setText(format.format(positionTime));
tvStreetView.setText(address); tvStreetView.setText(address);
streetView.setVisibility(address.length() > 0 ? View.VISIBLE : View.GONE); streetView.setVisibility(address.length() > 0 ? View.VISIBLE : View.GONE);
tvStreetView.setVisibility(address.length() > 0 ? View.VISIBLE : View.GONE); tvStreetView.setVisibility(address.length() > 0 ? View.VISIBLE : View.GONE);
@ -123,5 +134,38 @@ public class GoogleMapsInfoBubble implements GoogleMap.InfoWindowAdapter {
tvSpeed.setText(speed); tvSpeed.setText(speed);
tvGPSLocation.setText(gpsLocation); tvGPSLocation.setText(gpsLocation);
} }
/// <summary>
/// Get a text representation for the date time representing
/// the difference in minutes/hours/days from now
/// </summary>
/// <param name="utcTime">DateTime value which needs to be converted</param>
/// <returns>String 'Ago' representation fot he date</returns>
public static String getDateTimeAgo(long time)
{
String timeValue = "";
long diffInMs = (new Date().getTime() - time);
long secondsDifference = TimeUnit.MILLISECONDS.toSeconds(diffInMs);;
if (secondsDifference < 60)
timeValue = "less than 1 minute";
else if (secondsDifference < 3600)
timeValue = (secondsDifference / 60) + " minute" + ((secondsDifference / 60) > 1 ? "s" : "") + " ago";
else if (secondsDifference < 7200)
timeValue = "1 hour ago";
else if (secondsDifference < 86400)
{
timeValue = (secondsDifference / 3600) + " hours ago";
}
else
{
timeValue = (secondsDifference / 86400) + " days ago";
}
return timeValue;
}
} }

View File

@ -74,6 +74,9 @@ import android.content.res.AssetManager;
import android.content.res.Configuration; import android.content.res.Configuration;
import android.content.res.Resources; import android.content.res.Resources;
import android.net.ConnectivityManager; import android.net.ConnectivityManager;
import android.net.Network;
import android.net.NetworkCapabilities;
import android.net.NetworkRequest;
import android.net.Uri; import android.net.Uri;
import android.os.AsyncTask; import android.os.AsyncTask;
import android.os.Build; import android.os.Build;
@ -571,8 +574,59 @@ public class TabLayoutActivity extends AbstractSDParentActivity {
/* Create Service and bind to it */ /* Create Service and bind to it */
getApplicationContext().bindService(new Intent(this, TCPService.class), serviceConnection, Context.BIND_AUTO_CREATE); getApplicationContext().bindService(new Intent(this, TCPService.class), serviceConnection, Context.BIND_AUTO_CREATE);
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);
}
} }
private final ConnectivityManager.NetworkCallback networkCallback = new ConnectivityManager.NetworkCallback() {
@Override
public void onAvailable(Network network) {
// network available
Log.v(TAG, "network available");
Log.v(TAG, "tcp: " + (tcp != null));
if (tcp != null) {
if (tcp.isConnectionUP)
tcp.isConnectionUP = false;
uiHandler.post(() -> {
Log.v(TAG, "myService: " + (myService != null));
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().getSavedInstanceState());
if (getMessageActivity() != null)
getMessageActivity().onCreate(getMessageActivity().getSavedInstanceState());
if (getRecordingsActivity() != null)
getRecordingsActivity().onCreate(getRecordingsActivity().getSavedInstanceState());
if (getAlarmActivity() != null)
getAlarmActivity().onCreate(getAlarmActivity().getSavedInstanceState());
uiHandler.post(initTCPRUN);
}
});
}
}
@Override
public void onLost(Network network) {
// network unavailable
Log.v(TAG, "network unavailable");
}
};
/** /**
* Broadcast Received for notifications * Broadcast Received for notifications
*/ */
@ -755,7 +809,7 @@ public class TabLayoutActivity extends AbstractSDParentActivity {
if (getHistoryActivity() != null) if (getHistoryActivity() != null)
getHistoryActivity().setLanguage(); getHistoryActivity().setLanguage();
if (getRadioActivity() != null) if (getRadioActivity() != null)
getRadioActivity().onCreate(getRadioActivity().savedInstanceState); getRadioActivity().onCreate(getRadioActivity().getSavedInstanceState());
if (getMessageActivity() != null) if (getMessageActivity() != null)
getMessageActivity().onCreate(getMessageActivity().getSavedInstanceState()); getMessageActivity().onCreate(getMessageActivity().getSavedInstanceState());
if (getRecordingsActivity() != null) if (getRecordingsActivity() != null)
@ -2074,7 +2128,7 @@ public class TabLayoutActivity extends AbstractSDParentActivity {
getApplicationContext().bindService(new Intent(context, TCPService.class), serviceConnection, Context.BIND_AUTO_CREATE); getApplicationContext().bindService(new Intent(context, TCPService.class), serviceConnection, Context.BIND_AUTO_CREATE);
if (getRadioActivity() != null) if (getRadioActivity() != null)
getRadioActivity().onCreate(getRadioActivity().savedInstanceState); getRadioActivity().onCreate(getRadioActivity().getSavedInstanceState());
if (getMessageActivity() != null) if (getMessageActivity() != null)
getMessageActivity().onCreate(getMessageActivity().getSavedInstanceState()); getMessageActivity().onCreate(getMessageActivity().getSavedInstanceState());
if (getRecordingsActivity() != null) if (getRecordingsActivity() != null)
@ -2098,7 +2152,7 @@ public class TabLayoutActivity extends AbstractSDParentActivity {
// whenBackPressed(AppParams.ActivityResult.tcpDown); // whenBackPressed(AppParams.ActivityResult.tcpDown);
// send a broadcast // send a broadcast
notifyBroadcast(OperationCodes.TCP_CONNECTION_DOWN + ""); // notifyBroadcast(OperationCodes.TCP_CONNECTION_DOWN + "");
} }
@Override @Override
@ -2300,7 +2354,16 @@ public class TabLayoutActivity extends AbstractSDParentActivity {
// cancel old notification // cancel old notification
mNotificationManager.cancel(icon); mNotificationManager.cancel(icon);
PendingIntent pendingIntent = PendingIntent.getActivity(context, NOTIFICATION_ACTIVITY_RESULT, intent, PendingIntent.FLAG_CANCEL_CURRENT); PendingIntent pendingIntent;
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) {
pendingIntent = PendingIntent.getActivity(context, NOTIFICATION_ACTIVITY_RESULT, intent, PendingIntent.FLAG_CANCEL_CURRENT | PendingIntent.FLAG_MUTABLE);
}else {
pendingIntent = PendingIntent.getActivity(context, NOTIFICATION_ACTIVITY_RESULT, intent, PendingIntent.FLAG_CANCEL_CURRENT);
}
createNotificationChannel(icon, contentTitle, contentText, pendingIntent); createNotificationChannel(icon, contentTitle, contentText, pendingIntent);
} }