Compare commits

..

31 Commits

Author SHA1 Message Date
32201af76c remove barcode from conversation 2022-04-08 20:32:29 +03:00
b6fc8851a7 the blue bar with an arrow from the left has no functionality. it should hide the grid 2022-04-08 20:23:36 +03:00
f4db909dcb when selecting a unit from the grid it should be centered with the info bubble opened 2022-04-08 18:40:20 +03:00
dcceb360e9 the unit should be centered when moving with the info bubble opened 2022-04-08 17:53:22 +03:00
1d2182799f the info bubble shows wrong date and time 2022-04-08 16:53:59 +03:00
c210ccf117 disable map controls 2022-04-08 16:39:53 +03:00
f6cb72368d Merge pull request 'fix unit selection' (#25) from SD-221 into develop
Reviewed-on: #25
2022-04-08 11:50:39 +00:00
97b7e2d9a7 fix unit selection 2022-04-08 14:48:07 +03:00
33d00c27d7 Merge pull request 'display satelite map' (#24) from SD-220 into develop
Reviewed-on: #24
2022-04-08 10:54:18 +00:00
cc78f29f26 display satelite map 2022-04-08 13:52:16 +03:00
e7c3672b93 Merge pull request 'update info bubble box info' (#23) from SD-219 into develop
Reviewed-on: #23
2022-04-07 10:32:52 +00:00
feb7bd654c update info bubble box info 2022-04-07 13:31:23 +03:00
539170109d Merge pull request 'when receiving a new alarm && current tab is alarms, refresh alarm list' (#22) from SD-224 into develop
Reviewed-on: #22
2022-04-07 10:16:35 +00:00
0bdd161d69 when receiving a new alarm && current tab is alarms, refresh alarm list 2022-04-07 13:14:58 +03:00
680dd0f803 Merge pull request 'fix login button display when internet connection is available' (#21) from SD-217 into develop
Reviewed-on: #21
2022-04-06 07:05:25 +00:00
0b890b74e0 fix login button display when internet connection is available 2022-04-06 10:03:37 +03:00
73d2cedfba Merge pull request 'display alarm notification' (#20) from SD-224 into develop
Reviewed-on: #20
2022-04-04 07:07:40 +00:00
5c075ee168 display alarm notification 2022-04-04 09:59:49 +03:00
1299ff2d2e Merge pull request 'make messages view match parent' (#19) from SD-225 into develop
Reviewed-on: #19
2022-04-04 05:58:15 +00:00
8ab29576c5 make messages view match parent 2022-04-04 08:56:52 +03:00
d9a031a46d Merge pull request 'feature/notifications' (#18) from feature/notifications into develop
Reviewed-on: #18
2022-04-01 07:03:54 +00:00
b2fdb1c8d7 Merge pull request 'SD-203- added dialogs similar to SafeDispatch History to inform of 0 positions or >2000 positions' (#17) from features/SD-203-add-dialogs-for-history-tab into develop
Reviewed-on: #17
2022-03-31 05:13:10 +00:00
19f5fe01a3 SD-203- added dialogs similar to SafeDispatch History to inform of 0 positions or >2000 positions 2022-03-31 08:07:39 +03:00
7b45edb624 Merge pull request 'SD-216 - fix back button functionality for recordings and history tabs' (#16) from fix/SD-216-back-navigation-broken into develop
Reviewed-on: #16
2022-03-31 04:21:59 +00:00
3a0fe96708 SD-216 - fix back button functionality for recordings and history tabs 2022-03-31 07:19:40 +03:00
5cd598bec9 Merge pull request 'features/SD-211-recordings-tab' (#14) from features/SD-211-recordings-tab into develop
Reviewed-on: #14
2022-03-30 11:26:25 +00:00
79234c9830 Merge branch 'develop' into features/SD-211-recordings-tab 2022-03-30 14:22:20 +03:00
3935b3ad0b SD-211 - fix file rename issue after merge 2022-03-30 11:19:33 +03:00
e59b522ccb Merge branch 'develop' into features/SD-211-recordings-tab
# Conflicts:
#	libSafeMobile/src/main/java/com/safemobile/services/TCPhandler.java
#	safeDispatch/src/main/res/layout/dialog_login.xml
2022-03-30 10:38:47 +03:00
3f96055a6e SD-211 - show all recordings and play them 2022-03-30 10:34:57 +03:00
8bb6f36e60 SD-211 - fix case when the app was sending request on the ui thread
-fix audio hadler
-small refactor
2022-03-25 17:28:53 +02:00
23 changed files with 1158 additions and 1074 deletions

View File

@ -255,13 +255,12 @@ public abstract class AbstractSDParentActivity extends TabActivity {
return res; return res;
} }
public boolean getAlarms(long userID) public boolean getAlarms(long userID) {
{ if (tcp == null)
if(tcp == null)
return false; return false;
boolean res = tcp.Write("0.0", "#27#" + userID + "#"); boolean res = tcp.Write("0.0", "#27#" + userID + "#");
if(res) if (res)
SM.Debug("Message [GetAlarms] sent to app server"); SM.Debug("Message [GetAlarms] sent to app server");
else else
SM.Debug("Could not send message [GetAlarms]!!"); SM.Debug("Could not send message [GetAlarms]!!");

View File

@ -1,18 +1,8 @@
package com.safemobile.adapters; package com.safemobile.adapters;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.Hashtable;
import java.util.Locale;
import java.util.TimeZone;
import android.app.Activity; import android.app.Activity;
import android.content.Context;
import android.view.LayoutInflater; import android.view.LayoutInflater;
import android.view.View; import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup; import android.view.ViewGroup;
import android.widget.BaseAdapter; import android.widget.BaseAdapter;
import android.widget.ImageView; import android.widget.ImageView;
@ -20,34 +10,32 @@ import android.widget.LinearLayout;
import android.widget.TextView; import android.widget.TextView;
import com.safemobile.activities.AbstractRecordingsActivity; import com.safemobile.activities.AbstractRecordingsActivity;
import com.safemobile.lib.AppParams;
import com.safemobile.lib.R; import com.safemobile.lib.R;
import com.safemobile.lib.Recording; import com.safemobile.lib.Recording;
import com.safemobile.lib.Contact;
import com.safemobile.lib.SM; import com.safemobile.lib.SM;
public class RecordingsGridViewAdapter extends BaseAdapter import java.text.SimpleDateFormat;
{ import java.util.ArrayList;
private ArrayList<Recording> listRecordings; import java.util.Calendar;
private ArrayList<Boolean> recordingExists; import java.util.Date;
private ArrayList<Boolean> playingPositions; import java.util.Hashtable;
private Activity activity;
private Context context;
private int removePosition = -1;
//public String time;
//private int[] colors = new int[] { Color.parseColor("#FFFFFF"), Color.parseColor("#D2E4FC") };
private Hashtable<Integer, View> hash = new Hashtable<Integer, View>();
public RecordingsGridViewAdapter(Activity activity, Context context, ArrayList<Recording> listRecordings, ArrayList<Boolean> recordingExists) public class RecordingsGridViewAdapter extends BaseAdapter {
{ private final ArrayList<Recording> listRecordings;
private final ArrayList<Boolean> recordingExists;
private final ArrayList<Boolean> playingPositions;
private final Activity activity;
private final Hashtable<Integer, View> hash = new Hashtable<>();
public RecordingsGridViewAdapter(Activity activity, ArrayList<Recording> listRecordings, ArrayList<Boolean> recordingExists) {
super(); super();
this.activity = activity; this.activity = activity;
this.context = context;
this.listRecordings = listRecordings; this.listRecordings = listRecordings;
this.recordingExists = recordingExists; this.recordingExists = recordingExists;
playingPositions = new ArrayList<Boolean>(); playingPositions = new ArrayList<>();
for(int i=0; i<recordingExists.size(); i++) { for (int i = 0; i < recordingExists.size(); i++) {
playingPositions.add(false); playingPositions.add(false);
listRecordings.get(i).date = listRecordings.get(i).startGMT; listRecordings.get(i).date = listRecordings.get(i).startGMT;
@ -70,185 +58,184 @@ public class RecordingsGridViewAdapter extends BaseAdapter
return 0; return 0;
} }
/** Define Row Template */ /**
public static class ViewHolder * Define Row Template
{ */
public LinearLayout layoutRecording; public static class ViewHolder {
public ImageView imageViewPlay, imageViewRecycle; private LinearLayout layoutRecording;
public TextView textViewSender, textViewDuration, textViewDate; private ImageView imageViewPlay;
private ImageView imageViewRecycle;
private TextView textViewSender;
private TextView textViewDuration;
private TextView textViewDate;
public LinearLayout getLayoutRecording() {
return layoutRecording;
}
public void setLayoutRecording(LinearLayout layoutRecording) {
this.layoutRecording = layoutRecording;
}
public ImageView getImageViewPlay() {
return imageViewPlay;
}
public void setImageViewPlay(ImageView imageViewPlay) {
this.imageViewPlay = imageViewPlay;
}
public ImageView getImageViewRecycle() {
return imageViewRecycle;
}
public void setImageViewRecycle(ImageView imageViewRecycle) {
this.imageViewRecycle = imageViewRecycle;
}
public TextView getTextViewSender() {
return textViewSender;
}
public void setTextViewSender(TextView textViewSender) {
this.textViewSender = textViewSender;
}
public TextView getTextViewDuration() {
return textViewDuration;
}
public void setTextViewDuration(TextView textViewDuration) {
this.textViewDuration = textViewDuration;
}
public TextView getTextViewDate() {
return textViewDate;
}
public void setTextViewDate(TextView textViewDate) {
this.textViewDate = textViewDate;
}
} }
@Override @Override
public View getView(final int position, View convertView, ViewGroup parent) { public View getView(final int position, View convertView, ViewGroup parent) {
final ViewHolder view; final ViewHolder view;
LayoutInflater inflator = activity.getLayoutInflater(); LayoutInflater layoutInflater = activity.getLayoutInflater();
if(convertView==null) if (convertView == null) {
{
view = new ViewHolder(); view = new ViewHolder();
convertView = inflator.inflate(R.layout.row_recordings, null); convertView = layoutInflater.inflate(R.layout.row_recordings, null);
view.layoutRecording = (LinearLayout) convertView.findViewById(R.id.layoutRecording); view.setLayoutRecording(convertView.findViewById(R.id.layoutRecording));
view.imageViewPlay = (ImageView) convertView.findViewById(R.id.imageViewPlay); view.setImageViewPlay(convertView.findViewById(R.id.imageViewPlay));
view.textViewSender = (TextView) convertView.findViewById(R.id.textViewSender); view.setTextViewSender(convertView.findViewById(R.id.textViewSender));
view.textViewDuration = (TextView) convertView.findViewById(R.id.textViewDuration); view.setTextViewDuration(convertView.findViewById(R.id.textViewDuration));
view.textViewDate = (TextView) convertView.findViewById(R.id.textViewDate); view.setTextViewDate(convertView.findViewById(R.id.textViewDate));
view.imageViewRecycle = (ImageView) convertView.findViewById(R.id.imageViewRecycle); view.setImageViewRecycle(convertView.findViewById(R.id.imageViewRecycle));
view.imageViewRecycle.setVisibility(View.GONE); view.getImageViewRecycle().setVisibility(View.GONE);
convertView.setTag(view); convertView.setTag(view);
} } else {
else
{
view = (ViewHolder) convertView.getTag(); view = (ViewHolder) convertView.getTag();
} }
hash.put(position, convertView); hash.put(position, convertView);
/* if recording doesn't exists change background */ /* if recording doesn't exists change background */
if(!recordingExists.get(position)) if (Boolean.FALSE.equals(recordingExists.get(position)))
view.layoutRecording.setBackgroundColor(0xFFFFFFFF); view.getLayoutRecording().setBackgroundColor(0xFFFFFFFF);
else else {
{
/* if recording is not playing let background to white */ /* if recording is not playing let background to white */
if(!playingPositions.get(position)) if (Boolean.FALSE.equals(playingPositions.get(position)))
view.layoutRecording.setBackgroundColor(0xFFFFFFFF); view.getLayoutRecording().setBackgroundColor(0xFFFFFFFF);
else else
view.layoutRecording.setBackgroundColor(0xFF457c98); view.getLayoutRecording().setBackgroundColor(0xFF457c98);
} }
/* change icon according to call type [outgoing or incoming] */ /* change icon according to call type [outgoing or incoming] */
SM.Exception("REC TYPE : " + listRecordings.get(position).type); SM.Exception("REC TYPE : " + listRecordings.get(position).callType);
switch(listRecordings.get(position).type) switch (listRecordings.get(position).callType) {
{ case 6:
case AppParams.AllCall: view.getImageViewPlay().setImageResource(R.drawable.call_received_all);
if(listRecordings.get(position).destinationRadioID == 0) break;
view.imageViewPlay.setImageResource(R.drawable.call_received_all); case 2:
else view.getImageViewPlay().setImageResource(R.drawable.call_made_all);
view.imageViewPlay.setImageResource(R.drawable.call_made_all); break;
break; case 4:
case AppParams.PrivateCall: view.getImageViewPlay().setImageResource(R.drawable.call_received);
if(listRecordings.get(position).destinationRadioID == 0) break;
view.imageViewPlay.setImageResource(R.drawable.call_received); case 0:
else view.getImageViewPlay().setImageResource(R.drawable.call_made);
view.imageViewPlay.setImageResource(R.drawable.call_made); break;
break; case 5:
case AppParams.GroupCall: view.getImageViewPlay().setImageResource(R.drawable.call_received_group);
if(listRecordings.get(position).destinationRadioID == 0) break;
view.imageViewPlay.setImageResource(R.drawable.call_received_group); case 1:
else view.getImageViewPlay().setImageResource(R.drawable.call_made_group);
view.imageViewPlay.setImageResource(R.drawable.call_made_group); break;
break; default:
view.getImageViewPlay().setImageResource(R.drawable.alert);
} }
/*
try
{
if(receivedPositions.get(position))
{
if(playingPositions.get(position))
view.imageViewPlay.setImageResource(R.drawable.play_received);
else
view.imageViewPlay.setImageResource(R.drawable.call_received);
}
else
{
if(playingPositions.get(position))
view.imageViewPlay.setImageResource(R.drawable.play_made);
else
view.imageViewPlay.setImageResource(R.drawable.call_made);
}
}
catch(Exception ex)
{
SM.Exception("EXCeptioN", ex.toString());
view.imageViewPlay.setImageResource(R.drawable.play);
}*/
/* intercept Recycle click */ /* intercept Recycle click */
view.imageViewRecycle.setOnClickListener(new OnClickListener() { view.getImageViewRecycle().setOnClickListener(v -> {
@Override // change the background for marked record
public void onClick(View v) { View view1 = hash.get(position);
// save the position of the marked record ViewHolder viewHolder = null;
removePosition = position; if (view1 != null) {
viewHolder = (ViewHolder) view1.getTag();
// change the background for marked record
View view = (View) hash.get(position);
ViewHolder viewHolder = (ViewHolder) view.getTag();
viewHolder.layoutRecording.setBackgroundColor(0xFF457c98);
((AbstractRecordingsActivity) activity).deleteSelected(position);
} }
if (viewHolder != null) {
viewHolder.getLayoutRecording().setBackgroundColor(0xFF457c98);
}
((AbstractRecordingsActivity) activity).deleteSelected(position);
}); });
// set recording image view.getTextViewSender().setText(String.format("%s -> %s", getItem(position).userWhoCalled, getItem(position).userWhoWasCalled));
if(getItem(position).NameForDisplay.equals(AppParams.USERNAME)) view.textViewDuration.setText(String.format("[%d sec]", getItem(position).duration));
view.imageViewPlay.setImageDrawable(context.getResources().getDrawable(R.drawable.call_made_group));
else
view.imageViewPlay.setImageDrawable(context.getResources().getDrawable(R.drawable.call_received_group));
view.textViewSender.setText(getItem(position).NameForDisplay);
view.textViewDuration.setText("[" + getItem(position).duration + " sec]");
/* Add call Date */ /* Add call Date */
Date date = new Date(); Date date = new Date();
date.setTime(listRecordings.get(position).date * 1000); date.setTime(listRecordings.get(position).date * 1000);
SimpleDateFormat sdf = new SimpleDateFormat("HH:mm:ss"); SimpleDateFormat simpleDateFormat = new SimpleDateFormat("HH:mm:ss");
Calendar calendar = Calendar.getInstance(); Calendar calendar = Calendar.getInstance();
calendar.set(Calendar.HOUR_OF_DAY,0); calendar.set(Calendar.HOUR_OF_DAY, 0);
calendar.set(Calendar.MINUTE, 0); calendar.set(Calendar.MINUTE, 0);
calendar.set(Calendar.SECOND, 0); calendar.set(Calendar.SECOND, 0);
calendar.set(Calendar.MILLISECOND, 0); calendar.set(Calendar.MILLISECOND, 0);
if (date.after(calendar.getTime()))
simpleDateFormat = new SimpleDateFormat("HH:mm:ss");
if(date.after(calendar.getTime()))
sdf = new SimpleDateFormat("HH:mm:ss");
else else
sdf = new SimpleDateFormat("MMM-dd HH:mm"); simpleDateFormat = new SimpleDateFormat("MMM-dd HH:mm");
// set gmt time view.getTextViewDate().setText(simpleDateFormat.format(date));
//sdf.setTimeZone(TimeZone.getTimeZone("GMT"));
view.textViewDate.setText(sdf.format(date));
return convertView; return convertView;
} }
/**
/** Reset row background when recycle was canceled */ * Get the View for one row in the GridView
public void cancelDelete() */
{ public View getView(int position) {
View view = (View) hash.get(removePosition); return hash.get(position);
if(recordingExists.get(removePosition))
view.setBackgroundColor(0xFFFFFFFF);
else
view.setBackgroundColor(0xFFDDDDDD);
removePosition = -1;
} }
/**
/** Get the View for one row in the GridView */ * Change playing recording background
public View getView(int position) */
{ public void changePlaying(int position, boolean playing) {
return (View) hash.get(position);
}
/** Change playing recording background */
public void changePlaying(int position, boolean playing)
{
// change value in the vector // change value in the vector
playingPositions.set(position, playing); playingPositions.set(position, playing);
RecordingsGridViewAdapter.ViewHolder viewHolder = (RecordingsGridViewAdapter.ViewHolder) getView(position).getTag(); RecordingsGridViewAdapter.ViewHolder viewHolder = (RecordingsGridViewAdapter.ViewHolder) getView(position).getTag();
if(!playing) if (!playing)
viewHolder.layoutRecording.setBackgroundColor(0xFFFFFFFF); viewHolder.getLayoutRecording().setBackgroundColor(0xFFFFFFFF);
else else
viewHolder.layoutRecording.setBackgroundColor(0xFF457c98); viewHolder.getLayoutRecording().setBackgroundColor(0xFF457c98);
View view = hash.get(position);
// update hash // update hash
hash.get(position).setTag(viewHolder); if (view != null)
view.setTag(viewHolder);
} }
} }

View File

@ -285,7 +285,7 @@ public class DatabaseCommunication {
while (cursor.isAfterLast() == false) while (cursor.isAfterLast() == false)
{ {
Recording rec = new Recording(); Recording rec = new Recording();
rec.ID =cursor.getInt(0); rec.id =cursor.getInt(0);
rec.sourceRadioID = cursor.getInt(1); rec.sourceRadioID = cursor.getInt(1);
rec.destinationRadioID = cursor.getInt(2); rec.destinationRadioID = cursor.getInt(2);
rec.date = cursor.getInt(3); rec.date = cursor.getInt(3);
@ -315,7 +315,7 @@ public class DatabaseCommunication {
if(cursor.getCount() > 0) if(cursor.getCount() > 0)
{ {
Recording rec = new Recording(); Recording rec = new Recording();
rec.ID =cursor.getInt(0); rec.id =cursor.getInt(0);
rec.sourceRadioID = cursor.getInt(1); rec.sourceRadioID = cursor.getInt(1);
rec.destinationRadioID = cursor.getInt(2); rec.destinationRadioID = cursor.getInt(2);
rec.date = cursor.getInt(3); rec.date = cursor.getInt(3);
@ -364,7 +364,7 @@ public class DatabaseCommunication {
values.put("duration", rec.duration); values.put("duration", rec.duration);
values.put("filename", rec.filename); values.put("filename", rec.filename);
values.put("type", rec.type); values.put("type", rec.type);
id = database.delete("Recordings", "_id=" + rec.ID, null); id = database.delete("Recordings", "_id=" + rec.id, null);
SM.Debug("DBQuery","Database Remove result: " + id); SM.Debug("DBQuery","Database Remove result: " + id);
} }
//INSERT into SMS (timeGMT, imei_sour, imei_dest, mess, status) VALUES( 1324016412, 0, 101, 'two', 1) //INSERT into SMS (timeGMT, imei_sour, imei_dest, mess, status) VALUES( 1324016412, 0, 101, 'two', 1)

View File

@ -4,36 +4,43 @@ import java.util.ArrayList;
public class RecordMSG extends TCPmsg { public class RecordMSG extends TCPmsg {
public ArrayList<Recording> recordList; private ArrayList<Recording> recordList;
public static int count=0;
public RecordMSG(TCPmsg tcp) public RecordMSG(TCPmsg tcp) {
{
super(tcp); super(tcp);
recordList = new ArrayList<Recording>(); setRecordList(new ArrayList<>());
String date4parsing = super.data; String date4parsing = super.data;
//SM.Debug("SMS date4parsing:"+date4parsing);
String[] tempArr = date4parsing.split(";"); String[] tempArr = date4parsing.split(";");
//SM.Debug("SMS tempArr.length:" +tempArr.length); for (String s : tempArr) {
for(int i =0; i<tempArr.length;i++) String[] tempRec = s.split("&", -1);
{ if (tempRec.length < 11)
String[] tempRec = tempArr[i].split("&");
if(tempRec.length<7)
continue; continue;
Recording RecValue = new Recording(); Recording recValue = new Recording();
RecValue.ID = Long.parseLong(tempRec[0]); recValue.id = Long.parseLong(tempRec[0]);
RecValue.startGMT = Integer.parseInt(tempRec[1]); recValue.startGMT = Integer.parseInt(tempRec[1]);
RecValue.endGMT = Integer.parseInt(tempRec[2]); recValue.endGMT = Integer.parseInt(tempRec[2]);
RecValue.gwID = Integer.parseInt(tempRec[3]); recValue.gwID = Integer.parseInt(tempRec[3]);
RecValue.radioGWID = Integer.parseInt(tempRec[4]); recValue.radioGWID = Integer.parseInt(tempRec[4]);
RecValue.subID = Integer.parseInt(tempRec[5]); recValue.subID = (tempRec[5] == null || tempRec[5].isEmpty()) ? 0 : Integer.parseInt(tempRec[5]);
RecValue.typeID = Integer.parseInt(tempRec[6]); recValue.typeID = Integer.parseInt(tempRec[6]);
recValue.callType = Integer.parseInt(tempRec[7]);
recValue.groupCpsId = (tempRec[8] == null || tempRec[8].isEmpty()) ? 0 : Integer.parseInt(tempRec[8]);
recValue.dispatcherId = (tempRec[9] == null || tempRec[9].isEmpty()) ? 0 : Integer.parseInt(tempRec[9]);
recValue.groupName = tempRec[10];
recordList.add(RecValue); getRecordList().add(recValue);
} }
count +=this.recordList.size(); SM.Debug("alarmList size:" + this.getRecordList().size() + " total:" + this.getRecordList().size());
SM.Debug("alarmList size:" +this.recordList.size() + " total:" +count); }
public ArrayList<Recording> getRecordList() {
return recordList;
}
public void setRecordList(ArrayList<Recording> recordList) {
this.recordList = recordList;
} }
} }

View File

@ -1,14 +1,19 @@
package com.safemobile.lib; package com.safemobile.lib;
public class Recording { public class Recording {
public long ID; public long id;
public int startGMT; public int startGMT;
public int endGMT; public int endGMT;
public int gwID; public int gwID;
public int radioGWID; public int radioGWID;
public int callType;
public int groupCpsId;
public int dispatcherId;
public int subID; public int subID;
public int typeID; public int typeID;
public String NameForDisplay=""; public String userWhoCalled="";
public String userWhoWasCalled = "";
public String groupName = "";
/** RadioPad */ /** RadioPad */
public long date; public long date;
@ -18,13 +23,8 @@ public class Recording {
public long sourceRadioID; public long sourceRadioID;
public int type; public int type;
public Recording()
{
}
public String toString() public String toString()
{ {
return "ID: " + ID + " | start: " + startGMT + " | end: " + endGMT + " | gwID: " + gwID + " | radioGWID: " + radioGWID + " | subID: " + subID + " | typeID: " + typeID; return "id: " + id + " | start: " + startGMT + " | end: " + endGMT + " | gwID: " + gwID + " | radioGWID: " + radioGWID + " | subID: " + subID + " | typeID: " + typeID;
} }
} }

View File

@ -1,10 +1,4 @@
package com.safemobile.services; package com.safemobile.services;
import java.io.*;
import java.net.*;
import java.util.LinkedList;
import java.util.NoSuchElementException;
import java.util.Timer;
import java.util.TimerTask;
import android.content.BroadcastReceiver; import android.content.BroadcastReceiver;
import android.content.Context; import android.content.Context;
@ -17,6 +11,17 @@ import com.safemobile.lib.AppParams;
import com.safemobile.lib.SM; import com.safemobile.lib.SM;
import com.safemobile.lib.TCPmsg; import com.safemobile.lib.TCPmsg;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.net.InetSocketAddress;
import java.net.Socket;
import java.net.UnknownHostException;
import java.util.LinkedList;
import java.util.NoSuchElementException;
import java.util.Timer;
import java.util.TimerTask;
public class TCPhandler implements Runnable { public class TCPhandler implements Runnable {
private boolean alive = true; private boolean alive = true;
@ -24,7 +29,7 @@ public class TCPhandler implements Runnable {
public String serverHostname; public String serverHostname;
private int port; private int port;
private Thread listenThread; private Thread listenThread;
private Socket soc =null; private Socket soc = null;
private DataInputStream input; private DataInputStream input;
private DataOutputStream output; private DataOutputStream output;
@ -41,7 +46,7 @@ public class TCPhandler implements Runnable {
public TCPhandler(Context context, String hostName, int p) { public TCPhandler(Context context, String hostName, int p) {
this.context = context; this.context = context;
serverHostname=hostName; serverHostname = hostName;
port = p; port = p;
msgList = new LinkedList<>(); msgList = new LinkedList<>();
@ -108,54 +113,57 @@ public class TCPhandler implements Runnable {
SM.Debug("TCPhandler Crash1 on sleep:"+ e); SM.Debug("TCPhandler Crash1 on sleep:"+ e);
} }
while(isConnectionUP) { while (Boolean.TRUE.equals(isConnectionUP)) {
try { try {
Thread.sleep(100); Thread.sleep(100);
//process leftover
try { try {
boolean FinishLeftOver = true; boolean FinishLeftOver = true;
while (FinishLeftOver) { while (FinishLeftOver) {
// add this replacement if message length doesn't contain the last #
String[] tempArr2 = leftOver.split("#"); String[] tempArr2 = leftOver.split("#");
if (tempArr2.length > 1) { if (tempArr2.length > 1) {
int messLen; int messLen;
try { try {
messLen = Integer.parseInt(tempArr2[1]); messLen = Integer.parseInt(tempArr2[1]);
} catch (Exception e) {
//TODO talk to Gaby to fix this on Bridge
} catch (Exception e) {
SM.Debug("leftovers", "incorect msg len leftOver =" + tempArr2[1]); SM.Debug("leftovers", "incorect msg len leftOver =" + tempArr2[1]);
messLen =-1; messLen = -1;
} }
if (messLen > leftOver.length()) { if (messLen > leftOver.length()) {
FinishLeftOver = false;
break; break;
} else if (messLen == leftOver.length()) { } else if (messLen == leftOver.length()) {
TCPmsg msg = new TCPmsg(leftOver.toCharArray()); TCPmsg msg = new TCPmsg(leftOver.toCharArray());
SM.Debug("leftovers", "RX from leftOver:"+msg.allData); SM.Debug("leftovers", "RX from leftOver:" + msg.allData);
if(msg.allData.contains("#92#")) if (msg.allData.contains("#92#"))
prioritizePongReceived(); prioritizePongReceived();
msgList.add(msg); msgList.add(msg);
leftOver =""; leftOver = "";
FinishLeftOver = false;
break; break;
} else { // we have more message in leftover } else // we have more message in leftover
TCPmsg msg = new TCPmsg(leftOver.substring(0,messLen).toCharArray()); {
SM.Debug("leftovers", "RX from leftOver:"+msg.allData); TCPmsg msg = new TCPmsg(leftOver.substring(0, messLen).toCharArray());
SM.Debug("leftovers", "RX from leftOver:" + msg.allData);
if(msg.allData.contains("#92#")) if (msg.allData.contains("#92#"))
prioritizePongReceived(); prioritizePongReceived();
msgList.add(msg); msgList.add(msg);
leftOver = leftOver.substring(messLen); leftOver = leftOver.substring(messLen, leftOver.length());
} }
} else FinishLeftOver = false; } else FinishLeftOver = false;
} }
} catch (Exception e) { } catch (Exception e) {
SM.Debug("leftovers", "Error on process leftover"+ e); SM.Debug("leftovers", "Error on process leftover" + e.toString());
} }
String data; //end process leftover
int n;
String data = "";
int n = 0;
byte[] buf = new byte[1024]; byte[] buf = new byte[1024];
// read data into buffer // read data into buffer
@ -171,11 +179,12 @@ public class TCPhandler implements Runnable {
} }
byte[] temp = new byte[n]; byte[] temp = new byte[n];
System.arraycopy(buf, 0, temp, 0, n); if (n >= 0) System.arraycopy(buf, 0, temp, 0, n);
// decryptData // decryptData
temp = decryptTEA(temp); temp = decryptTEA(temp);
data = new String(temp);
data = new String(temp);
//if we have any leftovers from previous message add them //if we have any leftovers from previous message add them
if(leftOver.length() > 1) { // avoid case with only one # if(leftOver.length() > 1) { // avoid case with only one #
@ -236,7 +245,7 @@ public class TCPhandler implements Runnable {
} }
//try to restart connection //try to restart connection
if (alive && isWiFiOn) if (alive && isWiFiOn)
RestartTCP(); restartTCP();
} }
SM.Debug("=================================="); SM.Debug("==================================");
SM.Debug("TCP listenThread stoped!! alive = false"); SM.Debug("TCP listenThread stoped!! alive = false");
@ -278,28 +287,38 @@ public class TCPhandler implements Runnable {
try { try {
Thread.sleep(10); Thread.sleep(10);
String cmdok = "#" + seqID + msg; String cmdok = "#" + seqID + msg;
int tmp = cmdok.length() + 1; Integer tmp = cmdok.length() + 1;
//SM.Debug("tmp:"+tmp);
tmp += Integer.toString(tmp).length(); tmp += Integer.toString(tmp).length();
if ((tmp == 10)||(tmp == 100)||(tmp == 1000)) tmp++; if ((tmp == 10) || (tmp == 100) || (tmp == 1000)) tmp++;
cmdok = "#" + tmp + cmdok; cmdok = "#" + Integer.toString(tmp) + cmdok;
byte[] mess = encryptTEA(cmdok); byte[] mess = encryptTEA(cmdok);
Thread tcpThread = new Thread(() -> {
try {
output.write(mess);
output.flush();
} catch (Exception e) {
e.printStackTrace();
}
});
tcpThread.start();
output.write(mess);
output.flush();
// show only notACK messages
SM.Debug(" ", new String(mess)); SM.Debug(" ", new String(mess));
return true; return true;
} catch (IOException | NoSuchElementException | InterruptedException e) { } catch (InterruptedException e) {
SM.Exception("TCPClient[Send]", e.toString());
Thread.currentThread().interrupt();
} catch (NoSuchElementException e) {
SM.Exception("TCPClient[Send]", e.toString()); SM.Exception("TCPClient[Send]", e.toString());
} }
} else } else {
return false; return false;
}
} catch (Exception e) { } catch (Exception e) {
SM.Debug("TCPhandler Write Procedure:"+ e); SM.Debug("TCPhandler Write Procedure:" + e);
} }
return false; return false;
} }
@ -328,7 +347,7 @@ public class TCPhandler implements Runnable {
public void updateTCPparameters(String ip, String _port) { public void updateTCPparameters(String ip, String _port) {
// stop socket // stop socket
try { try {
if(soc != null) if (soc != null)
soc.close(); soc.close();
} catch (IOException e1) { } catch (IOException e1) {
e1.printStackTrace(); e1.printStackTrace();
@ -350,12 +369,12 @@ public class TCPhandler implements Runnable {
TCPmsgParser._fireTCPConnectionUpEvent(previousConnectionWasUP); TCPmsgParser._fireTCPConnectionUpEvent(previousConnectionWasUP);
} }
private void RestartTCP() { private void restartTCP() {
try { try {
isConnectionUP = false; isConnectionUP = false;
previousConnectionWasUP = false; previousConnectionWasUP = false;
SM.Debug("Restarting TCP...ip:"+serverHostname + ":" + port); SM.Debug("Restarting TCP...ip:" + serverHostname + ":" + port);
soc = new Socket(); soc = new Socket();
soc.connect(new InetSocketAddress(serverHostname, port), 5000); soc.connect(new InetSocketAddress(serverHostname, port), 5000);
@ -363,13 +382,21 @@ public class TCPhandler implements Runnable {
//output stream //output stream
output = new DataOutputStream(soc.getOutputStream()); output = new DataOutputStream(soc.getOutputStream());
if (soc != null) if (soc != null) {
isConnectionUP = true; isConnectionUP = true;
} catch (NullPointerException | IOException e) { }
SM.Exception("RestartTCP break:"+ e);
} catch (UnknownHostException e) {
SM.Exception("restartTCP break:" + e.toString());
isConnectionUP = false; isConnectionUP = false;
} catch (IllegalArgumentException e) { } catch (IllegalArgumentException e) {
SM.Debug("IllegalArgumentException", "RestartTCP break:"+ 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;
} }
triggerTCPConnectionStateEvent(); triggerTCPConnectionStateEvent();
} }
@ -379,7 +406,7 @@ public class TCPhandler implements Runnable {
try { try {
input = null; input = null;
output = null; output = null;
if(soc!=null) if (soc != null)
soc.close(); soc.close();
soc = null; soc = null;
} catch (IOException e) { } catch (IOException e) {

View File

@ -1,15 +1,4 @@
<?xml version="1.0" encoding="utf-8"?><!-- <?xml version="1.0" encoding="utf-8"?>
Copyright (C) 2012 The Android Open Source Project
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
-->
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
@ -74,17 +63,17 @@
android:id="@+id/tvTimeAgo" android:id="@+id/tvTimeAgo"
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_alignBottom="@+id/time"
android:layout_alignTop="@+id/time" android:layout_alignTop="@+id/time"
android:layout_alignBottom="@+id/time"
android:layout_gravity="center_horizontal" android:layout_gravity="center_horizontal"
android:layout_toEndOf="@+id/time" android:layout_toEndOf="@+id/time"
android:layout_toRightOf="@+id/time" android:layout_toRightOf="@+id/time"
android:ellipsize="end" android:ellipsize="end"
android:gravity="center_vertical" android:gravity="center_vertical"
android:maxLines="1" android:maxLines="1"
tools:text="a year ago [01:05:01]"
android:textColor="#ff000000" android:textColor="#ff000000"
android:textSize="10sp" /> android:textSize="10sp"
tools:text="a year ago [01:05:01]" />
<ImageView <ImageView
android:id="@+id/speed" android:id="@+id/speed"

View File

@ -45,7 +45,6 @@
android:name="com.safemobile.safedispatch.SDMobileActivity" android:name="com.safemobile.safedispatch.SDMobileActivity"
android:configChanges="orientation" android:configChanges="orientation"
android:exported="true" android:exported="true"
android:label="@string/app_name_demo"
android:screenOrientation="landscape"> android:screenOrientation="landscape">
<intent-filter> <intent-filter>
<action android:name="android.intent.action.MAIN" /> <action android:name="android.intent.action.MAIN" />

View File

@ -22,7 +22,7 @@ public class AudioHandle implements Runnable{
private DataOutputStream outData =null; private DataOutputStream outData =null;
private Thread t_micListner; private Thread t_micListner;
private UDPclient udp; private UDPclient udp;
private TCPaudioClient tcp; private TcpAudioClient tcp;
private int audioport = 50001; private int audioport = 50001;
public int typeUDP; public int typeUDP;
@ -56,7 +56,7 @@ public class AudioHandle implements Runnable{
else else
{ {
try { try {
tcp = new TCPaudioClient(IP,audioport); tcp = new TcpAudioClient(IP,audioport);
bufferSize = AudioTrack.getMinBufferSize(SAMPLE_RATE, AudioFormat.CHANNEL_OUT_MONO, AudioFormat.ENCODING_PCM_16BIT); bufferSize = AudioTrack.getMinBufferSize(SAMPLE_RATE, AudioFormat.CHANNEL_OUT_MONO, AudioFormat.ENCODING_PCM_16BIT);
@ -155,7 +155,7 @@ public class AudioHandle implements Runnable{
/* /*
tempBuffer = new byte[16384];//128];//invers3.bufferSize]; tempBuffer = new byte[16384];//128];//invers3.bufferSize];
bRead = recDev.read(tempBuffer, 0,16384);// 128);//invers3.bufferSize);*/ bRead = recDev.read(tempBuffer, 0,16384);// 128);//invers3.bufferSize);*/
tcp.Send(tempBuffer,bRead); tcp.send(tempBuffer,bRead);
SM.Debug("TCP sending b:"+bRead); SM.Debug("TCP sending b:"+bRead);
} }
} }

View File

@ -1,84 +1,65 @@
package com.safemobile.lib.sound; package com.safemobile.lib.sound;
import com.safemobile.lib.SM;
import android.media.AudioFormat; import android.media.AudioFormat;
import android.media.AudioManager; import android.media.AudioManager;
import android.media.AudioRecord;
import android.media.AudioTrack; import android.media.AudioTrack;
import android.media.MediaRecorder;
import com.safemobile.lib.SM;
public class RecordingHandle { public class RecordingHandle {
public Boolean isAlive = false; private Boolean soundNeeded = false;
public Boolean soundNeeded = false; private AudioTrack playDev = null;
private AudioTrack playDev =null;
private int bufferSize;
private TCPaudioClient tcp;
private int recport = 50002;
public RecordingHandle(String IP) public RecordingHandle(String ip) {
{
try { try {
tcp = new TCPaudioClient(IP,recport); final int RECORDING_PORT = 50003;
int sampleRate = 8000; TcpAudioClient tcp = new TcpAudioClient(ip, RECORDING_PORT);
int bufsize = AudioTrack.getMinBufferSize(sampleRate, AudioFormat.CHANNEL_OUT_MONO, AudioFormat.ENCODING_PCM_16BIT); final int sampleRate = 8000;
int bufferSize = AudioTrack.getMinBufferSize(sampleRate, AudioFormat.CHANNEL_OUT_MONO, AudioFormat.ENCODING_PCM_16BIT);
//init play device //init play device
playDev = new AudioTrack(AudioManager.STREAM_MUSIC,sampleRate,AudioFormat.CHANNEL_OUT_MONO, AudioFormat.ENCODING_PCM_16BIT,bufsize, AudioTrack.MODE_STREAM); playDev = new AudioTrack(AudioManager.STREAM_MUSIC, sampleRate, AudioFormat.CHANNEL_OUT_MONO, AudioFormat.ENCODING_PCM_16BIT, bufferSize, AudioTrack.MODE_STREAM);
tcp.addTCPListener(new ITCPaudioLis() tcp.addTCPListener(event -> {
{ byte[] data = event.data();
int len = event.len();
@Override SM.Debug("received b:" + len + " data.length:" + data.length);
public void dataRecv(TCPaudioEvent event) { playSound(data);
byte[] data = event.data();
int len = event.len();
SM.Debug("recv b:"+len+" data.length:"+data.length);
if(data!=null)
PlaySound(data, len);
}
}); });
} } catch (Exception ex) {
catch(Exception ex) {
SM.Exception("recordings", ex.toString()); SM.Exception("recordings", ex.toString());
} }
} }
private void PlaySound(byte[] data, int len) private void playSound(byte[] data) {
{ if (Boolean.TRUE.equals(getSoundNeeded())) {
if(soundNeeded) if (playDev.getState() == AudioTrack.STATE_INITIALIZED) {
{ playDev.write(data, 0, data.length);
if(playDev.getState() == playDev.STATE_INITIALIZED)
{
playDev.write(data, 0 , data.length);
playDev.play(); playDev.play();
} else {
} SM.Debug("Cannot play sound playDev NOT init correctly");
else
{
SM.Debug("Cannot play sound playDev NOT init corectly");
} }
} }
} }
public void StartSound() public void startSound() {
{ setSoundNeeded(true);
soundNeeded = true;
} }
public void StopSound() public void stopSound() {
{ if (playDev != null && playDev.getState() == AudioTrack.STATE_INITIALIZED) {
if(playDev.getState() == playDev.STATE_INITIALIZED) if (playDev.getPlayState() == AudioTrack.PLAYSTATE_PLAYING)
{
if(playDev.getPlayState() == playDev.PLAYSTATE_PLAYING)
playDev.stop(); playDev.stop();
} else {
}
else
{
SM.Debug("Cannot STOP playDev"); SM.Debug("Cannot STOP playDev");
} }
soundNeeded= false; setSoundNeeded(false);
}
public Boolean getSoundNeeded() {
return soundNeeded;
}
public void setSoundNeeded(Boolean soundNeeded) {
this.soundNeeded = soundNeeded;
} }
} }

View File

@ -1,195 +0,0 @@
package com.safemobile.lib.sound;
import com.safemobile.lib.SM;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.Socket;
import java.net.UnknownHostException;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
public class TCPaudioClient implements Runnable{
private boolean alive = true;
public String serverHostname = new String ("10.120.1.114");//
private int port = 50001;
private Thread listenThread;
private Socket soc =null;
private InputStream recv;
private OutputStream writer;
private volatile int n=0;
public Boolean connOK=false;
byte[] buffer = new byte[16384];
private List<ITCPaudioLis> _listeners = new ArrayList<ITCPaudioLis>();
public TCPaudioClient(String hostName, int _port)
{
serverHostname=hostName;
this.port = _port;
SM.Debug("---TCPhandler construcort--- port:"+_port);
listenThread = new Thread(this, "TCPlisten");
listenThread.start(); // (2) Start the thread.
}
@Override
public void run()
{
try
{
soc = new Socket(serverHostname, port);
SM.Debug("Socket timeout:" + soc.getSoTimeout() );
//soc.setSoTimeout(5000);
recv= soc.getInputStream();
writer =soc.getOutputStream() ;
if(soc !=null)
connOK = true;
}
catch (UnknownHostException e)
{
SM.Debug("UnknownHostException", "break:"+e.toString());
}
catch (IOException e)
{
SM.Debug("IOException", "break:"+e.toString());
}
while(alive)
{
try {
Thread.sleep(3000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
SM.Debug(e.toString());
}
while(connOK)
{
try
{
buffer = new byte[16384];
n = recv.read(buffer);
if(n==-1)
break;
_fireDataArrived(buffer,n);
}
catch(Exception ex)
{
SM.Debug("break:"+ex.toString());
connOK = false;
}
}//while(connOK)
try {
Thread.sleep(3000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
SM.Debug(e.toString());
}
if(alive)RestartTCP();
}//while(alive)
SM.Debug("==================================");
SM.Debug("TCP listenThread stoped!! alive = false");
SM.Debug("==================================");
}
public boolean Send(byte[] data,int len)
{
try
{
if(writer != null)
{
writer.write(data,0,len);
return true;
}
else
{
return false;
}
}
catch (Exception e)
{
// TODO Auto-generated catch block
SM.Debug(e.toString());
}
return false;
}
private void RestartTCP()
{
try
{
SM.Debug("Restarting TCP...ip:"+serverHostname);
soc = new Socket(serverHostname, port);
recv= soc.getInputStream();
writer =soc.getOutputStream();
if(soc !=null)
connOK = true;
}
catch (UnknownHostException e)
{
SM.Debug("break:"+e.toString());
}
catch (IOException e)
{
SM.Debug("break:"+e.toString());
}
}
public boolean isAlive() {
return alive;
}
public void setAlive(boolean alive) {
this.alive = alive;
}
public void Stop()
{
this.alive = false;
if(soc !=null)
{
try {
soc.close();
soc = null;
} catch (IOException e) {
// TODO Auto-generated catch block
SM.Debug("break:"+e.toString());
}
connOK = false;
}
// stop thread
if(listenThread != null)
{
Thread moribund = listenThread;
listenThread = null;
moribund.interrupt();
}
}
public synchronized void addTCPListener( ITCPaudioLis l ) {
_listeners.add( (ITCPaudioLis) l );
}
public synchronized void removeTCPListener( ITCPaudioLis l ) {
_listeners.remove( l );
}
private synchronized void _fireDataArrived(byte[] data, int len) {
TCPaudioEvent event = new TCPaudioEvent( this, data, len );
Iterator<ITCPaudioLis> listeners = _listeners.iterator();
while( listeners.hasNext() ) {
( (ITCPaudioLis) listeners.next() ).dataRecv(event);
}
}
}

View File

@ -0,0 +1,174 @@
package com.safemobile.lib.sound;
import com.safemobile.lib.SM;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.Socket;
import java.net.UnknownHostException;
import java.util.ArrayList;
import java.util.List;
public class TcpAudioClient implements Runnable {
private boolean alive = true;
private String serverHostname;
private final int port;
private Thread listenThread;
private Socket soc = null;
private InputStream recv;
private OutputStream writer;
private Boolean connOK = false;
byte[] buffer = new byte[16384];
private final List<ITCPaudioLis> listeners = new ArrayList<>();
public TcpAudioClient(String hostName, int port) {
setServerHostname(hostName);
this.port = port;
SM.Debug("---TcpHandler constructor--- port:" + port);
listenThread = new Thread(this, "TcpListen");
listenThread.start(); // (2) Start the thread.
}
@Override
public void run() {
try {
soc = new Socket(getServerHostname(), port);
SM.Debug("Socket timeout:" + soc.getSoTimeout());
recv = soc.getInputStream();
writer = soc.getOutputStream();
if (soc != null)
setConnOK(true);
} catch (UnknownHostException e) {
SM.Debug("UnknownHostException", "break:" + e);
} catch (IOException e) {
SM.Debug("IOException", "break:" + e);
}
while (alive) {
try {
Thread.sleep(3000);
} catch (InterruptedException e) {
SM.Debug(e.toString());
Thread.currentThread().interrupt();
}
while (Boolean.TRUE.equals(getConnOK())) {
try {
buffer = new byte[16384];
int n = recv.read(buffer);
if (n == -1)
break;
fireDataArrived(buffer, n);
} catch (Exception ex) {
SM.Debug("break:" + ex);
setConnOK(false);
}
}
try {
Thread.sleep(3000);
} catch (InterruptedException e) {
SM.Debug(e.toString());
Thread.currentThread().interrupt();
}
if (alive) restartTCP();
}
SM.Debug("==================================");
SM.Debug("TCP listenThread stopped!! alive = false");
SM.Debug("==================================");
}
public boolean send(byte[] data, int len) {
try {
if (writer != null) {
writer.write(data, 0, len);
return true;
} else {
return false;
}
} catch (Exception e) {
SM.Debug(e.toString());
}
return false;
}
private void restartTCP() {
try {
SM.Debug("Restarting TCP...ip:" + getServerHostname());
soc = new Socket(getServerHostname(), port);
recv = soc.getInputStream();
writer = soc.getOutputStream();
setConnOK(true);
} catch (IOException e) {
SM.Debug("break:" + e);
}
}
public boolean isAlive() {
return alive;
}
public void setAlive(boolean alive) {
this.alive = alive;
}
public void stop() {
this.alive = false;
if (soc != null) {
try {
soc.close();
soc = null;
} catch (IOException e) {
SM.Debug("break:" + e);
}
setConnOK(false);
}
// stop thread
if (listenThread != null) {
Thread moribund = listenThread;
listenThread = null;
moribund.interrupt();
}
}
public synchronized void addTCPListener(ITCPaudioLis l) {
listeners.add(l);
}
public synchronized void removeTCPListener(ITCPaudioLis l) {
listeners.remove(l);
}
private synchronized void fireDataArrived(byte[] data, int len) {
TCPaudioEvent event = new TCPaudioEvent(this, data, len);
for (ITCPaudioLis listener : listeners) {
listener.dataRecv(event);
}
}
public String getServerHostname() {
return serverHostname;
}
public void setServerHostname(String serverHostname) {
this.serverHostname = serverHostname;
}
public Boolean getConnOK() {
return connOK;
}
public void setConnOK(Boolean connOK) {
this.connOK = connOK;
}
}

View File

@ -15,7 +15,7 @@ import com.safemobile.lib.SM;
public class UDPclient implements Runnable{ public class UDPclient implements Runnable{
public String serverHostname = new String ("10.120.1.114");// public String serverHostname = new String ("10.120.1.114");//
private int UDP_SERVER_PORT_IN = 50002; private int UDP_SERVER_PORT_IN = 50003;
private int UDP_SERVER_PORT_OUT = 50001; private int UDP_SERVER_PORT_OUT = 50001;
private DatagramSocket ds = null; private DatagramSocket ds = null;
private Thread listenThread; private Thread listenThread;

View File

@ -42,7 +42,6 @@ public class GoogleMapsInfoBubble implements GoogleMap.InfoWindowAdapter {
public GoogleMapsInfoBubble(LayoutInflater layoutInflater, Context context) { public GoogleMapsInfoBubble(LayoutInflater layoutInflater, Context context) {
isLiveTab = false; isLiveTab = false;
this.context = context; this.context = context;
// this.superVehHash = vehicles;
mWindow = layoutInflater.inflate(R.layout.map_marker_info_bubble, null); mWindow = layoutInflater.inflate(R.layout.map_marker_info_bubble, null);
} }
@ -73,7 +72,7 @@ public class GoogleMapsInfoBubble implements GoogleMap.InfoWindowAdapter {
} }
} else { } else {
try { try {
position = Integer.getInteger(marker.getTitle()); position = Integer.parseInt(marker.getTitle());
} catch (Exception e) { } catch (Exception e) {
Log.v(TAG, "Unable to parse Google Maps Info Bubble title on History"); Log.v(TAG, "Unable to parse Google Maps Info Bubble title on History");
} }
@ -94,14 +93,14 @@ public class GoogleMapsInfoBubble implements GoogleMap.InfoWindowAdapter {
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(vehicle.timeGMT); positionTime = new Date((new Date()).getTime() - 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), 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(histPos.timeGMT); positionTime = new Date((new Date()).getTime() - 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), histPos.speed);
gpsLocation = "[" + String.format("%.4f", histPos.lat) + "," + String.format("%.4f",histPos.lng) + "]"; gpsLocation = "[" + String.format("%.4f", histPos.lat) + "," + String.format("%.4f",histPos.lng) + "]";

View File

@ -3,6 +3,7 @@ package com.safemobile.safedispatch;
import androidx.annotation.NonNull; import androidx.annotation.NonNull;
import androidx.appcompat.app.AppCompatActivity; import androidx.appcompat.app.AppCompatActivity;
import android.app.AlertDialog;
import android.app.DatePickerDialog; import android.app.DatePickerDialog;
import android.app.Dialog; import android.app.Dialog;
import android.graphics.Color; import android.graphics.Color;
@ -10,9 +11,11 @@ import android.graphics.drawable.ColorDrawable;
import android.os.Bundle; import android.os.Bundle;
import android.os.Handler; import android.os.Handler;
import android.util.Log; import android.util.Log;
import android.view.View;
import android.widget.ArrayAdapter; import android.widget.ArrayAdapter;
import android.widget.Button; import android.widget.Button;
import android.widget.ImageView; import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.Spinner; import android.widget.Spinner;
import android.widget.TextView; import android.widget.TextView;
@ -51,6 +54,7 @@ public class HistoryActivity extends AppCompatActivity implements OnMapReadyCall
private final ArrayList<Vehicle> allVehicle = new ArrayList<>(); private final ArrayList<Vehicle> allVehicle = new ArrayList<>();
private final ArrayList<String> allVehicleNames = new ArrayList<>(); private final ArrayList<String> allVehicleNames = new ArrayList<>();
private final SimpleDateFormat sdf = new SimpleDateFormat("MMMM dd yyyy"); private final SimpleDateFormat sdf = new SimpleDateFormat("MMMM dd yyyy");
private boolean showVehicles = true;
@Override @Override
@ -99,6 +103,32 @@ public class HistoryActivity extends AppCompatActivity implements OnMapReadyCall
} }
}); });
ImageView mapType = findViewById(R.id.changeMapTypeHeader);
mapType.setOnClickListener(view -> {
if (googleMap.getMapType() != GoogleMap.MAP_TYPE_SATELLITE) {
mapType.setImageResource(R.drawable.map);
googleMap.setMapType(GoogleMap.MAP_TYPE_SATELLITE);
} else {
mapType.setImageResource(R.drawable.satellite);
googleMap.setMapType(GoogleMap.MAP_TYPE_NORMAL);
}
});
LinearLayout slideLayout = findViewById(R.id.slidelayout);
LinearLayout linearLayoutVehicles = findViewById(R.id.layoutBig);
ImageView slideLayoutImageView = findViewById(R.id.slideLayoutImage);
slideLayout.setOnClickListener(v -> {
if (showVehicles) {
linearLayoutVehicles.setVisibility(View.GONE);
slideLayoutImageView.setImageResource(R.drawable.arrow_right);
showVehicles = false;
} else {
linearLayoutVehicles.setVisibility(View.VISIBLE);
slideLayoutImageView.setImageResource(R.drawable.arrow_left);
showVehicles = true;
}
});
setDate(); setDate();
} }
@ -124,6 +154,18 @@ public class HistoryActivity extends AppCompatActivity implements OnMapReadyCall
googleMap.moveCamera(CameraUpdateFactory.newLatLngZoom(latLng, 14)); googleMap.moveCamera(CameraUpdateFactory.newLatLngZoom(latLng, 14));
} }
@Override
public void onBackPressed() {
AlertDialog.Builder builder = new AlertDialog.Builder(this);
builder.setMessage(getString(R.string.exit))
.setCancelable(false)
.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();
}
private void setDate() { private void setDate() {
Calendar calendar = Calendar.getInstance(); Calendar calendar = Calendar.getInstance();
endDate = calendar.getTime(); endDate = calendar.getTime();
@ -234,6 +276,7 @@ public class HistoryActivity extends AppCompatActivity implements OnMapReadyCall
infoBubble = new GoogleMapsInfoBubble(getLayoutInflater(), this); infoBubble = new GoogleMapsInfoBubble(getLayoutInflater(), this);
this.googleMap.setInfoWindowAdapter(infoBubble); this.googleMap.setInfoWindowAdapter(infoBubble);
this.googleMap.getUiSettings().setMapToolbarEnabled(false);
parentTab.demoPositionsList(); parentTab.demoPositionsList();
displayButton.performClick(); displayButton.performClick();

View File

@ -32,6 +32,7 @@ import android.widget.Toast;
import androidx.annotation.NonNull; import androidx.annotation.NonNull;
import com.google.android.gms.maps.CameraUpdateFactory;
import com.google.android.gms.maps.GoogleMap; import com.google.android.gms.maps.GoogleMap;
import com.google.android.gms.maps.OnMapReadyCallback; import com.google.android.gms.maps.OnMapReadyCallback;
import com.google.android.gms.maps.SupportMapFragment; import com.google.android.gms.maps.SupportMapFragment;
@ -88,7 +89,7 @@ public class LiveActivity extends AbstractLiveActivity implements OnMapReadyCall
private boolean isAck = false; private boolean isAck = false;
private boolean showVehicle = true; private boolean showVehicle = true;
private int contextMenuPosition; private int contextMenuPosition;
private int vehStatus; private int vehStatus, lastItemClicked;
private int position; // vehStatus = vehicle status received from apps private int position; // vehStatus = vehicle status received from apps
/* Live Vehicle GridView */ /* Live Vehicle GridView */
@ -145,11 +146,11 @@ public class LiveActivity extends AbstractLiveActivity implements OnMapReadyCall
// image View for changing map type satellite or map // image View for changing map type satellite or map
ImageView changeMapTypeImageView = findViewById(R.id.changeMapType); ImageView changeMapTypeImageView = findViewById(R.id.changeMapType);
changeMapTypeImageView.setOnClickListener(v -> { changeMapTypeImageView.setOnClickListener(v -> {
if (googleMap.getMapType() == GoogleMap.MAP_TYPE_SATELLITE) { if (googleMap.getMapType() != GoogleMap.MAP_TYPE_SATELLITE) {
changeMapTypeImageView.setImageResource(R.drawable.satellite); changeMapTypeImageView.setImageResource(R.drawable.map);
googleMap.setMapType(GoogleMap.MAP_TYPE_SATELLITE); googleMap.setMapType(GoogleMap.MAP_TYPE_SATELLITE);
} else { } else {
changeMapTypeImageView.setImageResource(R.drawable.map); changeMapTypeImageView.setImageResource(R.drawable.satellite);
googleMap.setMapType(GoogleMap.MAP_TYPE_NORMAL); googleMap.setMapType(GoogleMap.MAP_TYPE_NORMAL);
} }
}); });
@ -254,7 +255,7 @@ public class LiveActivity extends AbstractLiveActivity implements OnMapReadyCall
} }
// refresh UI // refresh UI
displayVehicle(true, LAT_OUTLIMIT, LNG_OUTLIMIT); displayVehicle(LAT_OUTLIMIT, LNG_OUTLIMIT);
}); });
displayButton = findViewById(R.id.buttonDisplay); displayButton = findViewById(R.id.buttonDisplay);
@ -285,11 +286,11 @@ public class LiveActivity extends AbstractLiveActivity implements OnMapReadyCall
} }
// refresh UI // refresh UI
displayVehicle(true, LAT_OUTLIMIT, LNG_OUTLIMIT); displayVehicle(LAT_OUTLIMIT, LNG_OUTLIMIT);
}); });
// display Vehicles // display Vehicles
displayVehicle(true, LAT_OUTLIMIT, LNG_OUTLIMIT); displayVehicle(LAT_OUTLIMIT, LNG_OUTLIMIT);
// register to receive broadcasts // register to receive broadcasts
registerBroadcastIntents(); registerBroadcastIntents();
@ -309,6 +310,7 @@ public class LiveActivity extends AbstractLiveActivity implements OnMapReadyCall
this.googleMap = googleMap; this.googleMap = googleMap;
GoogleMapsInfoBubble infoBubble = new GoogleMapsInfoBubble(getLayoutInflater(), this, getParentTab().getSuperVehHash()); GoogleMapsInfoBubble infoBubble = new GoogleMapsInfoBubble(getLayoutInflater(), this, getParentTab().getSuperVehHash());
this.googleMap.setInfoWindowAdapter(infoBubble); this.googleMap.setInfoWindowAdapter(infoBubble);
this.googleMap.getUiSettings().setMapToolbarEnabled(false);
} }
@ -371,7 +373,7 @@ public class LiveActivity extends AbstractLiveActivity implements OnMapReadyCall
// clear previous vehicles // clear previous vehicles
SM.Debug("onResume"); SM.Debug("onResume");
displayVehicle(true, LAT_OUTLIMIT, LNG_OUTLIMIT); displayVehicle(LAT_OUTLIMIT, LNG_OUTLIMIT);
} }
final Runnable cancelLoadingDialogRUN = LiveActivity.this::cancelLoadingDialog; final Runnable cancelLoadingDialogRUN = LiveActivity.this::cancelLoadingDialog;
@ -440,7 +442,7 @@ public class LiveActivity extends AbstractLiveActivity implements OnMapReadyCall
}); });
} }
public void displayVehicle(boolean withZoom, double latZoom, double lngZoom) { public void displayVehicle(double latZoom, double lngZoom) {
if (googleMap != null) { if (googleMap != null) {
String openWindow = ""; String openWindow = "";
for (Marker marker : markers) { for (Marker marker : markers) {
@ -462,18 +464,17 @@ public class LiveActivity extends AbstractLiveActivity implements OnMapReadyCall
markerOptions.icon(markerIcon); markerOptions.icon(markerIcon);
Marker marker = this.googleMap.addMarker(markerOptions); Marker marker = this.googleMap.addMarker(markerOptions);
if (openWindow.equals(marker.getTitle())) if (openWindow.equals(marker.getTitle()) || i == lastItemClicked) {
marker.showInfoWindow(); marker.showInfoWindow();
googleMap.moveCamera(CameraUpdateFactory.newLatLngZoom(newLocation, 14));
}
markers.add(marker); markers.add(marker);
} }
} }
} }
} }
} lastItemClicked = 0;
public void showOpenedBalloon(boolean demo) {
//TODO: add show balloon
} }
private BitmapDescriptor getProperBitmap(int largeIcon, String text) { private BitmapDescriptor getProperBitmap(int largeIcon, String text) {
@ -650,7 +651,7 @@ public class LiveActivity extends AbstractLiveActivity implements OnMapReadyCall
} }
// Create runnable for posting // Create runnable for posting
final Runnable updateMapResults = () -> displayVehicle(false, LAT_OUTLIMIT, LNG_OUTLIMIT); final Runnable updateMapResults = () -> displayVehicle(LAT_OUTLIMIT, LNG_OUTLIMIT);
// Create runnable for posting // Create runnable for posting
final Runnable updatePollResults = () -> { final Runnable updatePollResults = () -> {
@ -660,7 +661,7 @@ public class LiveActivity extends AbstractLiveActivity implements OnMapReadyCall
adapter.changeDisplayed(position, true); adapter.changeDisplayed(position, true);
} }
displayVehicle(true, latPoll, lngPoll); }; displayVehicle(latPoll, lngPoll); };
// Create runnable for posting // Create runnable for posting
final Runnable updateOptionsRUN = this::updateOptionsUI; final Runnable updateOptionsRUN = this::updateOptionsUI;
@ -678,8 +679,9 @@ public class LiveActivity extends AbstractLiveActivity implements OnMapReadyCall
* @param view View in which will do the modifications * @param view View in which will do the modifications
*/ */
private void itemClick(int position, View view) { private void itemClick(int position, View view) {
lastItemClicked = position;
// change displayed state // change displayed state
displayedVehicles.set(position, !Boolean.TRUE.equals(displayedVehicles.get(position))); displayedVehicles.set(position, !displayedVehicles.get(position));
// change in the adapter // change in the adapter
adapter.changeDisplayed(position, displayedVehicles.get(position)); adapter.changeDisplayed(position, displayedVehicles.get(position));
@ -687,30 +689,30 @@ public class LiveActivity extends AbstractLiveActivity implements OnMapReadyCall
// change check image for selected value // change check image for selected value
VehiclesGridViewAdapter.ViewHolder viewLive = (VehiclesGridViewAdapter.ViewHolder) view.getTag(); VehiclesGridViewAdapter.ViewHolder viewLive = (VehiclesGridViewAdapter.ViewHolder) view.getTag();
if (Boolean.TRUE.equals(displayedVehicles.get(position))) if (displayedVehicles.get(position))
viewLive.imgViewChecked.setImageResource(R.drawable.checked); viewLive.imgViewChecked.setImageResource(R.drawable.checked);
else else
viewLive.imgViewChecked.setImageResource(R.drawable.unchecked); viewLive.imgViewChecked.setImageResource(R.drawable.unchecked);
// check if all values are identical // check if all values are identical
boolean identical = true; boolean allDisplayed = true;
for (Boolean displ : displayedVehicles) for (Boolean displayed : displayedVehicles)
if (!Objects.equals(displ, displayedVehicles.get(0))) { if (!displayed) {
identical = false; allDisplayed = false;
break; break;
} }
// change image when all values are identical // change image when all values are identical
if (identical && Boolean.TRUE.equals(displayedVehicles.get(0))) { if (allDisplayed) {
imageViewCheckAll.setSelected(true); imageViewCheckAll.setSelected(true);
imageViewCheckAll.setBackgroundResource(R.drawable.check_all); imageViewCheckAll.setBackgroundResource(R.drawable.check_all);
} else if (identical && Boolean.TRUE.equals(!displayedVehicles.get(0))) { } else {
imageViewCheckAll.setSelected(false); imageViewCheckAll.setSelected(false);
imageViewCheckAll.setBackgroundResource(R.drawable.uncheck_all); imageViewCheckAll.setBackgroundResource(R.drawable.uncheck_all);
} }
// display vehicle // display vehicle
displayVehicle(true, LAT_OUTLIMIT, LNG_OUTLIMIT); displayVehicle(LAT_OUTLIMIT, LNG_OUTLIMIT);
} }
/** /**

View File

@ -124,16 +124,6 @@ public class MessagesActivity extends Activity {
textViewSelectedContact = findViewById(R.id.textViewSelectedContact); textViewSelectedContact = findViewById(R.id.textViewSelectedContact);
imageViewSelectedContact = findViewById(R.id.imageViewSelectedContact); imageViewSelectedContact = findViewById(R.id.imageViewSelectedContact);
ImageView imageBarcode = findViewById(R.id.imageBarcode);
imageBarcode.setOnClickListener(v -> {
try {
Intent intent = new Intent("com.google.zxing.client.android.SCAN");
startActivityForResult(intent, 0);
} catch (Exception e) {
showErrorDialog(getResources().getString(R.string.barcodeError));
}
});
// change tab header fontFace // change tab header fontFace
TextView textView1 = findViewById(R.id.textView1); TextView textView1 = findViewById(R.id.textView1);
textView1.setTypeface(Typeface.createFromAsset(getAssets(), "Sketch_Block.ttf")); textView1.setTypeface(Typeface.createFromAsset(getAssets(), "Sketch_Block.ttf"));

View File

@ -2,10 +2,8 @@ package com.safemobile.safedispatch;
import android.app.Activity; import android.app.Activity;
import android.app.AlertDialog; import android.app.AlertDialog;
import android.app.Dialog;
import android.content.BroadcastReceiver; import android.content.BroadcastReceiver;
import android.content.Context; import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent; import android.content.Intent;
import android.content.IntentFilter; import android.content.IntentFilter;
import android.content.res.AssetFileDescriptor; import android.content.res.AssetFileDescriptor;
@ -14,13 +12,12 @@ import android.graphics.Typeface;
import android.media.MediaPlayer; import android.media.MediaPlayer;
import android.os.Bundle; import android.os.Bundle;
import android.os.Handler; import android.os.Handler;
import android.os.Looper;
import android.view.View; import android.view.View;
import android.view.View.OnClickListener;
import android.widget.AdapterView; import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener; import android.widget.AdapterView.OnItemClickListener;
import android.widget.ArrayAdapter; import android.widget.ArrayAdapter;
import android.widget.GridView; import android.widget.GridView;
import android.widget.ImageView;
import android.widget.TextView; import android.widget.TextView;
import android.widget.Toast; import android.widget.Toast;
@ -36,251 +33,217 @@ import java.io.IOException;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Locale; import java.util.Locale;
/**
* fix import
*/
public class RecordingsActivity extends Activity { public class RecordingsActivity extends Activity {
private Context context; private Context context;
private Activity activity; private Activity activity;
public TabLayoutActivity parentTab; private TabLayoutActivity parentTab;
public ArrayList<Recording> allRecordings = new ArrayList<Recording>(); private ArrayList<Recording> allRecordings = new ArrayList<>();
private ArrayList<Boolean> playingPositions = new ArrayList<Boolean>(); private ArrayList<Boolean> playingPositions = new ArrayList<>();
private ArrayList<String> allGWsIP = new ArrayList<String>();
private GridView gridView; private GridView gridView;
private RecordingsGridViewAdapter adapter; private RecordingsGridViewAdapter adapter;
public View convertViewRecording; private View convertViewRecording;
private boolean isRecordingPlaying = false;
public int playingPosition = -1; private int playingPosition = -1;
// Need handler for callbacks to the UI thread // Need handler for callbacks to the UI thread
private final Handler myHandler = new Handler(); private final Handler myHandler = new Handler(Looper.getMainLooper());
private final ArrayList<String> allGWsIP = new ArrayList<>();
//recoding TCP and audio //recoding TCP and audio
private RecordingHandle recHandle = null; private RecordingHandle recHandle = null;
/* Dialog */ /* Dialog */
private TextView textViewCount, textViewGateway; private TextView textViewCount;
private TextView textViewGateway;
public Bundle savedInstanceState; private Bundle savedInstanceState;
/** Called when the activity is first created. */ /**
public void onCreate(Bundle savedInstanceState) { * Called when the activity is first created.
super.onCreate(savedInstanceState); */
this.savedInstanceState = savedInstanceState; @Override
// get parentTab public void onCreate(Bundle savedInstanceState) {
parentTab = (TabLayoutActivity)getParent(); super.onCreate(savedInstanceState);
this.setSavedInstanceState(savedInstanceState);
setParentTab((TabLayoutActivity) getParent());
Locale locale = new Locale(AppParams.LANGUAGETMP); Locale locale = new Locale(AppParams.LANGUAGETMP);
Locale.setDefault(locale); Locale.setDefault(locale);
Configuration config = new Configuration(); Configuration config = new Configuration();
config.locale = locale; config.locale = locale;
getBaseContext().getResources().updateConfiguration(config, getBaseContext().getResources().updateConfiguration(config, getBaseContext().getResources().getDisplayMetrics());
getBaseContext().getResources().getDisplayMetrics());
setContentView(R.layout.tabrecordings); setContentView(R.layout.tabrecordings);
// get context
context = this;
activity = this;
// get context // change tab header fontFace
context = this; TextView textView1 = findViewById(R.id.textViewTitle);
activity = this; textView1.setTypeface(Typeface.createFromAsset(getAssets(), "Sketch_Block.ttf"));
textView1.setTextSize(24);
gridView = findViewById(R.id.gridViewRecordings);
adapter = new RecordingsGridViewAdapter(activity, getAllRecordings(), playingPositions);
gridView.setAdapter(adapter);
// change tab header fontface gridView.setOnItemClickListener(onItemClickListener);
TextView textView1 = (TextView) findViewById(R.id.textViewTitle); gridView.setOnTouchListener((v, event) -> isRecordingPlaying);
textView1.setTypeface(Typeface.createFromAsset(getAssets(), "Sketch_Block.ttf"));
textView1.setTextSize(24);
gridView = (GridView) findViewById(R.id.gridViewRecordings); if (recHandle == null && !AppParams.DEMO)
adapter = new RecordingsGridViewAdapter(activity, context, allRecordings, playingPositions); recHandle = new RecordingHandle(AppParams.IP);
gridView.setAdapter(adapter);
gridView.setOnItemClickListener(onItemClickListener); textViewCount = findViewById(R.id.textViewCount);
updateNumberOfRecordings();
if(recHandle == null && !AppParams.DEMO) textViewGateway = findViewById(R.id.textViewGateway);
recHandle = new RecordingHandle(AppParams.IP); textViewGateway.setTypeface(Typeface.createFromAsset(getAssets(), "Sketch_Block.ttf"));
textViewCount = (TextView) findViewById(R.id.textViewCount);
updateNumberOfRecordings();
textViewGateway = (TextView) findViewById(R.id.textViewGateway);
textViewGateway.setTypeface(Typeface.createFromAsset(getAssets(), "Sketch_Block.ttf"));
textViewGateway.setTextSize(24); textViewGateway.setTextSize(24);
textViewGateway.setOnClickListener(new OnClickListener() { textViewGateway.setOnClickListener(v -> {
@Override allGWsIP.clear();
public void onClick(View v) { for (RadioGW radio : AppParams.listRadios)
allGWsIP.clear(); allGWsIP.add(radio.IP);
for(RadioGW radio: AppParams.listRadios)
allGWsIP.add(radio.IP);
ArrayAdapter<String> adapter = new ArrayAdapter<String>(context, R.layout.template_simple_list_item, ArrayAdapter<String> adapter = new ArrayAdapter<>(context, R.layout.template_simple_list_item,
allGWsIP); allGWsIP);
AlertDialog.Builder builder = new AlertDialog.Builder( AlertDialog.Builder builder = new AlertDialog.Builder(
context); context);
builder.setTitle("Select RadioGW"); builder.setTitle("Select RadioGW");
builder.setAdapter(adapter, builder.setAdapter(adapter,
new DialogInterface.OnClickListener() { (dialog, which) -> {
@Override // change gateway
public void onClick(DialogInterface dialog, int which) { textViewGateway.setText(allGWsIP.get(which));
// change gateway Toast.makeText(context, getString(R.string.loadingRecordings), Toast.LENGTH_SHORT).show();
textViewGateway.setText(allGWsIP.get(which)); getRecordings(getParentTab().getAllRadios().get(which).GW_ID, getParentTab().getAllRadios().get(which).ID);
Toast.makeText(context, getString(R.string.loadingRecordings), Toast.LENGTH_SHORT).show(); });
GetRecordings(parentTab.getAllRadios().get(which).GW_ID, parentTab.getAllRadios().get(which).ID); AlertDialog alert = builder.create();
} alert.show();
});
AlertDialog alert = builder.create();
alert.show();
}
}); });
textViewGateway.setVisibility(View.INVISIBLE); textViewGateway.setVisibility(View.INVISIBLE);
getParentTab().setRecordingsActivity(this);
parentTab.setRecordingsActivity(this); // register to receive broadcasts
registerBroadcastIntents();
}
// register to receive broadcasts @Override
registerBroadcastIntents(); public void onBackPressed() {
} AlertDialog.Builder builder = new AlertDialog.Builder(this);
builder.setMessage(getString(R.string.exit))
.setCancelable(false)
.setNeutralButton(getString(R.string.logout), (dialog, id) -> getParentTab().whenBackPressed(AppParams.ActivityResult.logout))
.setPositiveButton(getString(R.string.ext), (dialog, id) -> getParentTab().whenBackPressed(AppParams.ActivityResult.exit))
.setNegativeButton(getString(R.string.cancel), (dialog, id) -> dialog.cancel());
AlertDialog alert = builder.create();
alert.show();
}
@Override /**
public void onBackPressed() * Update the number of recordings displayed on the top layout
{ */
AlertDialog.Builder builder = new AlertDialog.Builder(this); private void updateNumberOfRecordings() {
builder.setMessage(getString(R.string.exit)) textViewCount.setText("[" + AppParams.recordings.size() + "]");
.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();
}
});
AlertDialog alert = builder.create();
alert.show();
}
@Override
public void onPause() {
super.onPause();
SM.Debug("onPause");
}
/** Update the number of recordings displayed on the top layout */ @Override
private void updateNumberOfRecordings() { public void onResume() {
textViewCount.setText("[" + AppParams.recordings.size() + "]"); super.onResume();
} if (getParentTab().getTCPState() != null && !AppParams.DEMO) {
Toast.makeText(context, getString(R.string.moreRecordings), Toast.LENGTH_SHORT).show();
if (getParentTab().getCrtRadio() != null)
textViewGateway.setText(getParentTab().getCrtRadio().IP);
public void showDialog(String errorMsg) if (getPlayingPosition() < 0 && getParentTab().getCrtRadio() != null) {
{ SM.Debug("getRecordings resume + crtRadio:" + getParentTab().getCrtRadio().toString());
Dialog dialog = new Dialog(context); getRecordings(getParentTab().getCrtRadio().GW_ID, getParentTab().getCrtRadio().ID);
dialog.setContentView(R.layout.dialog); }
dialog.setTitle("Message"); }
dialog.setCancelable(true); SM.Debug("onResume");
dialog.setCanceledOnTouchOutside(true);
TextView text = dialog.findViewById(R.id.text);
ImageView image = dialog.findViewById(R.id.image);
image.setImageResource(R.mipmap.ic_launcher);
text.setText(errorMsg);
dialog.show();
} }
@Override
public void onPause()
{
super.onPause();
SM.Debug("onPause");
}
@Override private final OnItemClickListener onItemClickListener = new OnItemClickListener() {
public void onResume()
{
super.onResume();
if(parentTab.getTCPState() != null && !AppParams.DEMO){
Toast.makeText(context, getString(R.string.moreRecordings), Toast.LENGTH_SHORT).show();
if(parentTab.getCrtRadio() != null)
textViewGateway.setText(parentTab.getCrtRadio().IP);
/*
if(parentTab.allRadios == null)
GetGWRadios();
*/
if(playingPosition < 0 && parentTab.getCrtRadio() != null)
{
SM.Debug("GetRecordings resume + crtRadio:"+ parentTab.getCrtRadio().toString());
GetRecordings(parentTab.getCrtRadio().GW_ID, parentTab.getCrtRadio().ID);
}
}
SM.Debug("onResume");
}
private OnItemClickListener onItemClickListener = new OnItemClickListener() {
@Override @Override
public void onItemClick(AdapterView<?> arg0, View view, int position, long arg3) { public void onItemClick(AdapterView<?> arg0, View view, int position, long arg3) {
// disable grid scrolling and item click // disable grid scrolling and item click
gridView.setEnabled(false); if (isRecordingPlaying)
convertViewRecording = view; return;
isRecordingPlaying = true;
setConvertViewRecording(view);
// change background to playing // change background to playing
adapter.changePlaying(position, true); adapter.changePlaying(position, true);
// if no recording is playing and not DEMO // if no recording is playing and not DEMO
if(playingPosition<0 && !AppParams.DEMO) if (getPlayingPosition() < 0 && !AppParams.DEMO) {
{
// send recording request to App Server // send recording request to App Server
SendPlayRequest(allRecordings.get(position).ID); sendPlayRequest(getAllRecordings().get(position).id);
// flag that sound is needed // flag that sound is needed
recHandle.StartSound(); recHandle.startSound();
recHandle.soundNeeded = true; recHandle.setSoundNeeded(true);
} }
// no recording is playing and DEMO // no recording is playing and DEMO
else if(playingPosition<0 && AppParams.DEMO) else if (getPlayingPosition() < 0 && AppParams.DEMO) {
{
// create player which will play demo recordings // create player which will play demo recordings
MediaPlayer player = new MediaPlayer(); MediaPlayer player = new MediaPlayer();
AssetFileDescriptor afd; AssetFileDescriptor assetFileDescriptor = null;
try { try {
switch(position) switch (position) {
{ case 1:
case 1: afd = getAssets().openFd("startwindows.mp3"); break; assetFileDescriptor = getAssets().openFd("startwindows.mp3");
case 2: afd = getAssets().openFd("exitwindows.mp3"); break; break;
default : afd = getAssets().openFd("mike.mp3"); break; case 2:
}; assetFileDescriptor = getAssets().openFd("exitwindows.mp3");
player.setDataSource(afd.getFileDescriptor(),afd.getStartOffset(),afd.getLength()); break;
default:
assetFileDescriptor = getAssets().openFd("mike.mp3");
break;
}
player.setDataSource(assetFileDescriptor.getFileDescriptor(), assetFileDescriptor.getStartOffset(), assetFileDescriptor.getLength());
player.prepare(); player.prepare();
player.start(); player.start();
} catch (IOException e) { } } catch (IOException e) {
e.printStackTrace();
} finally {
if(assetFileDescriptor != null) {
try {
assetFileDescriptor.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
} }
// save playing position // save playing position
playingPosition = position; setPlayingPosition(position);
// start the timer which will reset the UI to 'no recording playing' // start the timer which will reset the UI to 'no recording playing'
startRecordingStoperTimer(allRecordings.get(playingPosition).endGMT - allRecordings.get(playingPosition).startGMT); startRecordingStopperTimer(getAllRecordings().get(getPlayingPosition()).endGMT - getAllRecordings().get(getPlayingPosition()).startGMT);
} }
};
/**
/** create Timer which will stop the recording after a specific time */ * create Timer which will stop the recording after a specific time
private void startRecordingStoperTimer(final int seconds) { */
new Thread(new Runnable() { private void startRecordingStopperTimer(final int seconds) {
new Thread(() -> {
@Override
public void run() {
// sleep for at least 1 second // sleep for at least 1 second
final int ms = (seconds > 1 ? seconds * 1000 : 1000); final int ms = (seconds > 1 ? seconds * 1000 : 1000);
@ -289,123 +252,137 @@ public class RecordingsActivity extends Activity {
Thread.sleep(ms); Thread.sleep(ms);
} catch (InterruptedException e) { } catch (InterruptedException e) {
e.printStackTrace(); e.printStackTrace();
Thread.currentThread().interrupt();
} }
// modify the UI after the recording is done playing // modify the UI after the recording is done playing
myHandler.post(stopRecordingRUN); myHandler.post(stopRecordingRUN);
} }).start();
}).start(); }
} };
// Create runnable for posting // Create runnable for posting
final Runnable stopRecordingRUN = new Runnable() { final Runnable stopRecordingRUN = this::updateStopRecording;
@Override
public void run() {
updateStopRecording();
}
};
private void updateStopRecording() private void updateStopRecording() {
{ // change playing icon
// change playing icon adapter.changePlaying(getPlayingPosition(), false);
adapter.changePlaying(playingPosition, false);
// enable grid // enable grid
gridView.setEnabled(true); isRecordingPlaying = false;
// set playing Recording position to -1 // set playing Recording position to -1
playingPosition = -1; setPlayingPosition(-1);
}
} // Update Recordings received from AppServer
public void updateRecordings(ArrayList<Recording> list) {
setAllRecordings(new ArrayList<>());
for (Recording rec : list) {
getAllRecordings().add(rec);
}
myHandler.post(updateResultsRUN);
}
// Update Recordings received from AppServer // playRecording received from AppServer
public void UpdateRecordings(ArrayList<Recording> list) public void playRecording(long id) {
{ // change adapter image
//SM.Debug("## UpdateRecordings: " + list.size()); }
allRecordings = new ArrayList<Recording>();
for(Recording rec : list)
{
if(rec.typeID == 1 && rec.subID == AppParams.USERID)
allRecordings.add(rec);
else if (rec.typeID != 1)
allRecordings.add(rec);
}
myHandler.post(UpdateResultsRUN);
} // Create runnable for posting
final Runnable updateResultsRUN = this::updateResultsInUi;
// PlayRecording received from AppServer private void updateResultsInUi() {
public void PlayRecording(long id)
{
// change adapter image
}
// Create runnable for posting
final Runnable UpdateResultsRUN = new Runnable() {
public void run() {
updateResultsInUi();
}
};
private void updateResultsInUi()
{
// clear played items // clear played items
playingPositions = new ArrayList<Boolean>(); playingPositions = new ArrayList<>();
for(int i=0; i<allRecordings.size(); i++) for (int i = 0; i < getAllRecordings().size(); i++)
playingPositions.add(true); playingPositions.add(true);
// set adapter - where playingPositions stores exists values // set adapter - where playingPositions stores exists values
adapter = new RecordingsGridViewAdapter(activity, context, allRecordings, playingPositions); adapter = new RecordingsGridViewAdapter(activity, getAllRecordings(), playingPositions);
// playing positions need to be false because no recording is played // playing positions need to be false because no recording is played
playingPositions.clear(); playingPositions.clear();
for(int i=0; i<allRecordings.size(); i++) for (int i = 0; i < getAllRecordings().size(); i++)
playingPositions.add(false); playingPositions.add(false);
updateNumberOfRecordings(); updateNumberOfRecordings();
gridView.setAdapter(adapter); gridView.setAdapter(adapter);
} }
// send // send
private void GetRecordings(int radioGWID, int radioID) private void getRecordings(int radioGWID, int radioID) {
{ getParentTab().getRecordings(radioGWID, radioID);
parentTab.getRecordings(radioGWID, radioID);
} }
public void SendPlayRequest(long record_id) public void sendPlayRequest(long recordId) {
{ getParentTab().sendPlayRecordingRequest(recordId);
parentTab.sendPlayRecordingRequest(record_id); }
}
/**
/** Register for broadcasts */ * Register for broadcasts
private void registerBroadcastIntents() { */
IntentFilter intentFilter = new IntentFilter(OperationCodes.RECORDINGS_LIST_REP+""); private void registerBroadcastIntents() {
IntentFilter intentFilter = new IntentFilter(OperationCodes.RECORDINGS_LIST_REP + "");
this.registerReceiver(mReceiver, intentFilter); this.registerReceiver(mReceiver, intentFilter);
intentFilter = new IntentFilter(OperationCodes.RADIOID_CHANGED+""); intentFilter = new IntentFilter(OperationCodes.RADIOID_CHANGED + "");
this.registerReceiver(mReceiver, intentFilter); this.registerReceiver(mReceiver, intentFilter);
}
} //The BroadcastReceiver that listens for Notification broadcasts
public final BroadcastReceiver mReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
final String action = intent.getAction();
// zone and/or channel changed
if (action.equals(OperationCodes.RECORDINGS_LIST_REP + "")) {
updateRecordings(AppParams.recordings);
updateNumberOfRecordings();
} else if (action.equals(OperationCodes.RADIOID_CHANGED + "")) {
textViewGateway.setText(getParentTab().getCrtRadio().IP);
getRecordings(getParentTab().getCrtRadio().GW_ID, getParentTab().getCrtRadio().ID);
}
}
};
//The BroadcastReceiver that listens for Notification broadcasts public TabLayoutActivity getParentTab() {
public final BroadcastReceiver mReceiver = new BroadcastReceiver() { return parentTab;
@Override }
public void onReceive(Context context, Intent intent) {
//SM.Debug("### NOTIFICATION ###", "Radio: " + intent.getAction());
final String action = intent.getAction(); public void setParentTab(TabLayoutActivity parentTab) {
// zone and/or channel changed this.parentTab = parentTab;
if (action.equals(OperationCodes.RECORDINGS_LIST_REP+"")) { }
UpdateRecordings(AppParams.recordings);
updateNumberOfRecordings(); public ArrayList<Recording> getAllRecordings() {
} return allRecordings;
else if (action.equals(OperationCodes.RADIOID_CHANGED+"")) { }
textViewGateway.setText(parentTab.getCrtRadio().IP);
GetRecordings(parentTab.getCrtRadio().GW_ID, parentTab.getCrtRadio().ID); public void setAllRecordings(ArrayList<Recording> allRecordings) {
} this.allRecordings = allRecordings;
} }
};
public View getConvertViewRecording() {
return convertViewRecording;
}
public void setConvertViewRecording(View convertViewRecording) {
this.convertViewRecording = convertViewRecording;
}
public int getPlayingPosition() {
return playingPosition;
}
public void setPlayingPosition(int playingPosition) {
this.playingPosition = playingPosition;
}
public Bundle getSavedInstanceState() {
return savedInstanceState;
}
public void setSavedInstanceState(Bundle savedInstanceState) {
this.savedInstanceState = savedInstanceState;
}
} }

View File

@ -10,13 +10,19 @@ import android.content.ServiceConnection;
import android.content.SharedPreferences; import android.content.SharedPreferences;
import android.content.res.Configuration; import android.content.res.Configuration;
import android.graphics.Color; 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.AsyncTask;
import android.os.Build;
import android.os.Bundle; import android.os.Bundle;
import android.os.Handler; import android.os.Handler;
import android.os.IBinder; import android.os.IBinder;
import android.os.Looper; import android.os.Looper;
import android.text.Editable; import android.text.Editable;
import android.text.InputType; import android.text.InputType;
import android.util.Log;
import android.view.Gravity; import android.view.Gravity;
import android.view.View; import android.view.View;
import android.view.View.OnClickListener; import android.view.View.OnClickListener;
@ -114,6 +120,17 @@ public class SDMobileActivity extends Activity {
super.onCreate(savedInstanceState); super.onCreate(savedInstanceState);
SM.Debug("##### onCREATE ##### with LANGUAGE " + AppParams.LANGUAGETMP); 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; AppParams.theme = AppParams.Theme.SAFEDISPATCH;
if (AppParams.theme == AppParams.Theme.SAFENET) if (AppParams.theme == AppParams.Theme.SAFENET)
this.setTheme(R.style.Theme_Safenet); this.setTheme(R.style.Theme_Safenet);
@ -524,6 +541,22 @@ public class SDMobileActivity extends Activity {
SM.Debug("##### onRESUME #####"); 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) { private void startTabActivity(long userID) {
// good login - load activity // good login - load activity

View File

@ -47,6 +47,7 @@ import com.safemobile.lib.SMSmsg;
import com.safemobile.lib.SerializedObject; import com.safemobile.lib.SerializedObject;
import com.safemobile.lib.SuperVehicle; import com.safemobile.lib.SuperVehicle;
import com.safemobile.lib.TCPmsg; import com.safemobile.lib.TCPmsg;
import com.safemobile.lib.User;
import com.safemobile.lib.VehMSG; import com.safemobile.lib.VehMSG;
import com.safemobile.lib.Vehicle; import com.safemobile.lib.Vehicle;
import com.safemobile.lib.radio.RadioGW; import com.safemobile.lib.radio.RadioGW;
@ -56,6 +57,7 @@ import com.safemobile.services.TCPService.TCPBinder;
import android.Manifest; import android.Manifest;
import android.annotation.SuppressLint; import android.annotation.SuppressLint;
import android.app.Activity;
import android.app.Dialog; import android.app.Dialog;
import android.app.NotificationChannel; import android.app.NotificationChannel;
import android.app.NotificationManager; import android.app.NotificationManager;
@ -405,7 +407,7 @@ public class TabLayoutActivity extends AbstractSDParentActivity {
} }
} }
SM.Debug("Logged user:" + AppParams.USERNAME + " | ID: " + AppParams.USERID); SM.Debug("Logged user:" + AppParams.USERNAME + " | id: " + AppParams.USERID);
// do not dim the display // do not dim the display
getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON); getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
@ -633,10 +635,10 @@ public class TabLayoutActivity extends AbstractSDParentActivity {
tabHost.setCurrentTabByTag(RECORDINGS); tabHost.setCurrentTabByTag(RECORDINGS);
AppParams.crtTab = AppParams.Tabs.recordings; AppParams.crtTab = AppParams.Tabs.recordings;
if (AppParams.DEMO && getRecordingsActivity() != null && getRecordingsActivity().allRecordings != null && getRecordingsActivity().allRecordings.isEmpty()) { if (AppParams.DEMO && getRecordingsActivity() != null && getRecordingsActivity().getAllRecordings() != null && getRecordingsActivity().getAllRecordings().isEmpty()) {
ArrayList<Recording> listRecordings = new ArrayList<>(); ArrayList<Recording> listRecordings = new ArrayList<>();
Recording rec = new Recording(); Recording rec = new Recording();
rec.NameForDisplay = "Rob"; rec.userWhoWasCalled = "Rob";
rec.subID = 101; rec.subID = 101;
rec.endGMT = (int) Calendar.getInstance().getTime().getTime(); rec.endGMT = (int) Calendar.getInstance().getTime().getTime();
rec.startGMT = rec.endGMT - 2; rec.startGMT = rec.endGMT - 2;
@ -644,7 +646,7 @@ public class TabLayoutActivity extends AbstractSDParentActivity {
listRecordings.add(rec); listRecordings.add(rec);
rec = new Recording(); rec = new Recording();
rec.NameForDisplay = "Call1 [Rob]"; rec.userWhoWasCalled = "Call1 [Rob]";
rec.subID = 102; rec.subID = 102;
rec.endGMT = (int) Calendar.getInstance().getTime().getTime(); rec.endGMT = (int) Calendar.getInstance().getTime().getTime();
rec.startGMT = rec.endGMT - 2; rec.startGMT = rec.endGMT - 2;
@ -652,13 +654,13 @@ public class TabLayoutActivity extends AbstractSDParentActivity {
listRecordings.add(rec); listRecordings.add(rec);
rec = new Recording(); rec = new Recording();
rec.NameForDisplay = "Call2 [Rob]"; rec.userWhoWasCalled = "Call2 [Rob]";
rec.subID = 101; rec.subID = 101;
rec.endGMT = (int) Calendar.getInstance().getTime().getTime(); rec.endGMT = (int) Calendar.getInstance().getTime().getTime();
rec.startGMT = rec.endGMT - 3; rec.startGMT = rec.endGMT - 3;
listRecordings.add(rec); listRecordings.add(rec);
rec.type = 103; rec.type = 103;
getRecordingsActivity().UpdateRecordings(listRecordings); getRecordingsActivity().updateRecordings(listRecordings);
} }
} }
}); });
@ -1007,8 +1009,6 @@ public class TabLayoutActivity extends AbstractSDParentActivity {
moribund.interrupt(); moribund.interrupt();
} }
this.unregisterReceiver(mReceiver);
// unbound from tcp service // unbound from tcp service
if (isBound) { if (isBound) {
getApplicationContext().unbindService(serviceConnection); getApplicationContext().unbindService(serviceConnection);
@ -1048,7 +1048,7 @@ public class TabLayoutActivity extends AbstractSDParentActivity {
if (getMessageActivity() != null) if (getMessageActivity() != null)
getMessageActivity().onCreate(getMessageActivity().getSavedInstanceState()); getMessageActivity().onCreate(getMessageActivity().getSavedInstanceState());
if (getRecordingsActivity() != null) if (getRecordingsActivity() != null)
getRecordingsActivity().onCreate(getRecordingsActivity().savedInstanceState); getRecordingsActivity().onCreate(getRecordingsActivity().getSavedInstanceState());
if (getAlarmActivity() != null) if (getAlarmActivity() != null)
getAlarmActivity().onCreate(getAlarmActivity().getSavedInstanceState()); getAlarmActivity().onCreate(getAlarmActivity().getSavedInstanceState());
} }
@ -1362,7 +1362,7 @@ public class TabLayoutActivity extends AbstractSDParentActivity {
SM.Debug("Got PlayRec :" + msg.allData); SM.Debug("Got PlayRec :" + msg.allData);
if (NO_SOUND) { if (NO_SOUND) {
SM.Debug("Recording Play file ID:" + msg.data); SM.Debug("Recording Play file id:" + msg.data);
//list for SMS //list for SMS
if (AppParams.crtTab == AppParams.Tabs.recordings) { if (AppParams.crtTab == AppParams.Tabs.recordings) {
@ -1371,7 +1371,7 @@ public class TabLayoutActivity extends AbstractSDParentActivity {
try { try {
long id = Long.parseLong(tmp); long id = Long.parseLong(tmp);
if (getRecordingsActivity() != null) if (getRecordingsActivity() != null)
getRecordingsActivity().PlayRecording(id); getRecordingsActivity().playRecording(id);
} catch (Exception ex) { } catch (Exception ex) {
SM.Exception(ex.toString()); SM.Exception(ex.toString());
} }
@ -1399,7 +1399,7 @@ public class TabLayoutActivity extends AbstractSDParentActivity {
HistCountmsg histCountMsg = new HistCountmsg(msg); HistCountmsg histCountMsg = new HistCountmsg(msg);
SM.Debug("Message Count:" + histCountMsg.histcountValue.count); SM.Debug("Message Count:" + histCountMsg.histcountValue.count);
if (histCountMsg.histcountValue.count >= 2000 && AppParams.crtTab == AppParams.Tabs.history) { if (AppParams.crtTab != AppParams.Tabs.history) {
//list for live //list for live
SM.Debug("currentActivity instanceof HistoryActivity"); SM.Debug("currentActivity instanceof HistoryActivity");
try { try {
@ -1410,6 +1410,44 @@ public class TabLayoutActivity extends AbstractSDParentActivity {
} catch (Exception ex) { } catch (Exception ex) {
SM.Debug(HASH_ERROR_MESSAGE + ex); SM.Debug(HASH_ERROR_MESSAGE + ex);
} }
return;
}
if (histCountMsg.histcountValue.count >= 2000) {
try {
if (getHistoryActivity() != null) {
getHistoryActivity().UpdateCancel();
getHistoryActivity().UpdateUnableDisp();
}
} catch (Exception ex) {
SM.Debug(HASH_ERROR_MESSAGE + ex);
}
runOnUiThread(new Runnable() {
public void run() {
DialogService dialogService = new DialogService();
dialogService.showError(getHistoryActivity(), getString(R.string.too_many_positions, String.valueOf(histCountMsg.histcountValue.count)));
}
});
return;
}
if (histCountMsg.histcountValue.count == 0) {
try {
if (getHistoryActivity() != null) {
getHistoryActivity().UpdateCancel();
getHistoryActivity().UpdateUnableDisp();
}
} catch (Exception ex) {
SM.Debug(HASH_ERROR_MESSAGE + ex);
}
runOnUiThread(new Runnable() {
public void run() {
DialogService dialogService = new DialogService();
dialogService.showError(getHistoryActivity(), getString(R.string.no_data_for_interval));
}
});
return;
} }
} }
@ -1579,7 +1617,7 @@ public class TabLayoutActivity extends AbstractSDParentActivity {
if (radioMSG.incCall.callStatus == 3) { if (radioMSG.incCall.callStatus == 3) {
setInCall(false); setInCall(false);
// update recordings list // update recordings list
if (AppParams.crtTab == AppParams.Tabs.recordings && getRecordingsActivity() != null && getRecordingsActivity().playingPosition < 0) { if (AppParams.crtTab == AppParams.Tabs.recordings && getRecordingsActivity() != null && getRecordingsActivity().getPlayingPosition() < 0) {
// no recording is playing // no recording is playing
getRecordings(getCrtRadio().GW_ID, getCrtRadio().ID); getRecordings(getCrtRadio().GW_ID, getCrtRadio().ID);
} }
@ -1613,13 +1651,13 @@ public class TabLayoutActivity extends AbstractSDParentActivity {
setAllRadios(radioMSG.RadioGWList); setAllRadios(radioMSG.RadioGWList);
if (getCrtRadio() == null) { if (getCrtRadio() == null) {
setCrtRadio(getAllRadios().get(0)); setCrtRadio(getAllRadios().get(0));
SM.Debug("radioMSG set 0 crtRadio GW_ID:" + getCrtRadio().GW_ID + " ID:" + getCrtRadio().ID + ")"); SM.Debug("radioMSG set 0 crtRadio GW_ID:" + getCrtRadio().GW_ID + " id:" + getCrtRadio().ID + ")");
notifyBroadcast(OperationCodes.RADIOID_CHANGED + ""); notifyBroadcast(OperationCodes.RADIOID_CHANGED + "");
} }
} }
// save crt Radio ID and GW // save crt Radio id and GW
if (radioMSG.zac != null) { if (radioMSG.zac != null) {
for (RadioGW radio : getAllRadios()) { for (RadioGW radio : getAllRadios()) {
if (radio.GW_ID == radioMSG.zac.gwID && radio.ID == radioMSG.zac.rgwID) if (radio.GW_ID == radioMSG.zac.gwID && radio.ID == radioMSG.zac.rgwID)
@ -1650,64 +1688,61 @@ public class TabLayoutActivity extends AbstractSDParentActivity {
SM.Debug("Unit imei:" + tempArr[0]); SM.Debug("Unit imei:" + tempArr[0]);
String unitIMEI = tempArr[0]; String unitIMEI = tempArr[0];
//list for SMS
if (AppParams.crtTab == AppParams.Tabs.alarms) { // change Visual Elements
SM.Debug("currentActivity instanceof AlarmActivity - newSMS | " + tempArr[0] + " | " + tempArr[1]); setImei(unitIMEI);
getAlarms(AppParams.USERID); switch (msg.opCode) {
} case 135:
// if tab is not TextTab setMess("speed " + tempArr[1]);
if (tabHost.getCurrentTab() != 5) { break;
// change Visual Elements case 136:
setImei(unitIMEI); setMess("landmark " + tempArr[1]);
switch (msg.opCode) { break;
case 135: case 137:
setMess("speed " + tempArr[1]); setMess("zone " + tempArr[1]);
break; break;
case 136: case 140:
setMess("landmark " + tempArr[1]); setMess("telemetry " + tempArr[1]);
break; break;
case 137: default:
setMess("zone " + tempArr[1]);
break;
case 140:
setMess("telemetry " + tempArr[1]);
break;
default:
// 138 // 138
setMess("emergency"); setMess("emergency");
} }
myHandler.post(updateResultsAlarm); myHandler.post(updateResultsAlarm);
if ((msg.opCode == 138) && (AppParams.crtTab == AppParams.Tabs.live)) { if ((msg.opCode == 138) && (AppParams.crtTab == AppParams.Tabs.live)) {
SuperVehicle superVehicle = getSuperVehHash().get(Long.parseLong(unitIMEI)); SuperVehicle superVehicle = getSuperVehHash().get(Long.parseLong(unitIMEI));
if (superVehicle != null) { if (superVehicle != null) {
//if is not check i need to force check to put on the map //if is not check i need to force check to put on the map
boolean forceChecked = false; boolean forceChecked = false;
if (!superVehicle.needUpdate) { if (!superVehicle.needUpdate) {
superVehicle.needUpdate = true; superVehicle.needUpdate = true;
forceChecked = true; forceChecked = true;
} }
try { try {
int x = 0; int x = 0;
if (forceChecked) { if (forceChecked) {
for (Vehicle veh : getAllVehicle()) { for (Vehicle veh : getAllVehicle()) {
if (veh.imei.compareTo(unitIMEI) == 0) break; if (veh.imei.compareTo(unitIMEI) == 0) break;
x++; x++;
}
} else x = -1;
if (getLiveActivity() != null) {
if (x != getAllVehicle().size())
getLiveActivity().emergencyAlarmReceived(x, superVehicle.lat, superVehicle.lng);
else
getLiveActivity().emergencyAlarmReceived(-1, superVehicle.lat, superVehicle.lng);
} }
} catch (Exception ex) { } else x = -1;
SM.Debug(HASH_ERROR_MESSAGE + ex); if (getLiveActivity() != null) {
if (x != getAllVehicle().size())
getLiveActivity().emergencyAlarmReceived(x, superVehicle.lat, superVehicle.lng);
else
getLiveActivity().emergencyAlarmReceived(-1, superVehicle.lat, superVehicle.lng);
} }
} catch (Exception ex) {
SM.Debug(HASH_ERROR_MESSAGE + ex);
} }
} }
} }
//list for SMS
if (AppParams.crtTab == AppParams.Tabs.alarms)
getAlarms(AppParams.USERID);
} }
@Override @Override
@ -1718,19 +1753,76 @@ public class TabLayoutActivity extends AbstractSDParentActivity {
//list for SMS //list for SMS
if (AppParams.crtTab == AppParams.Tabs.recordings) { if (AppParams.crtTab == AppParams.Tabs.recordings) {
for (Recording rec : recordMSG.recordList) { for (Recording rec : recordMSG.getRecordList()) {
SuperVehicle superVehicle = getSuperVehHash().get((long) rec.subID);
// set the name to be displayed // set the name to be displayed
if (rec.typeID == 1) switch (rec.callType) {
rec.NameForDisplay = AppParams.USERNAME; case 0:
else { for (User u : AppParams.allUsers) {
SuperVehicle superVehicle = getSuperVehHash().get((long) rec.subID); if (u.id == rec.dispatcherId)
if (superVehicle != null) rec.userWhoCalled = u.login;
rec.NameForDisplay = superVehicle.name; }
if (rec.userWhoCalled == null || rec.userWhoCalled.isEmpty())
rec.userWhoCalled = String.valueOf(rec.dispatcherId);
if (superVehicle != null)
rec.userWhoWasCalled = superVehicle.name;
else
rec.userWhoWasCalled = String.valueOf(rec.subID);
break;
case 4:
rec.userWhoWasCalled = AppParams.USERNAME;
if (superVehicle != null)
rec.userWhoCalled = superVehicle.name;
else
rec.userWhoCalled = String.valueOf(rec.subID);
break;
case 1:
for (User u : AppParams.allUsers) {
if (u.id == rec.dispatcherId)
rec.userWhoCalled = u.login;
}
if (rec.userWhoCalled == null || rec.userWhoCalled.isEmpty())
rec.userWhoCalled = String.valueOf(rec.dispatcherId);
if (rec.groupName == null || rec.groupName.isEmpty())
rec.userWhoWasCalled = String.valueOf(rec.groupCpsId);
else
rec.userWhoWasCalled = rec.groupName;
break;
case 5:
if (superVehicle != null)
rec.userWhoCalled = superVehicle.name;
else
rec.userWhoCalled = String.valueOf(rec.subID);
if (rec.groupName == null || rec.groupName.isEmpty())
rec.userWhoWasCalled = String.valueOf(rec.groupCpsId);
else
rec.userWhoWasCalled = rec.groupName;
break;
case 2:
for (User u : AppParams.allUsers) {
if (u.id == rec.dispatcherId)
rec.userWhoCalled = u.login;
}
if (rec.userWhoCalled == null || rec.userWhoCalled.isEmpty())
rec.userWhoCalled = String.valueOf(rec.dispatcherId);
rec.userWhoWasCalled = "All Call";
break;
case 6:
rec.userWhoWasCalled = "All Call";
if (superVehicle != null)
rec.userWhoCalled = superVehicle.name;
else
rec.userWhoCalled = String.valueOf(rec.subID);
break;
} }
} }
// save recordings to AppParams // save recordings to AppParams
AppParams.recordings = recordMSG.recordList; AppParams.recordings = recordMSG.getRecordList();
// notify recordings were received // notify recordings were received
notifyBroadcast(OperationCodes.RECORDINGS_LIST_REP + ""); notifyBroadcast(OperationCodes.RECORDINGS_LIST_REP + "");
@ -1957,7 +2049,6 @@ public class TabLayoutActivity extends AbstractSDParentActivity {
.setAutoCancel(true) .setAutoCancel(true)
.setContentIntent(pendingIntent); .setContentIntent(pendingIntent);
Log.v("test111", "test");
NotificationManagerCompat managerCompat = NotificationManagerCompat.from(context); NotificationManagerCompat managerCompat = NotificationManagerCompat.from(context);
managerCompat.notify(icon, builder.build()); managerCompat.notify(icon, builder.build());
} }
@ -2320,4 +2411,10 @@ public class TabLayoutActivity extends AbstractSDParentActivity {
this.startActivity(intent); this.startActivity(intent);
} }
} }
@Override
protected void onDestroy() {
super.onDestroy();
this.unregisterReceiver(mReceiver);
}
} }

View File

@ -166,7 +166,7 @@
<GridView <GridView
android:id="@+id/gridView1" android:id="@+id/gridView1"
android:layout_width="fill_parent" android:layout_width="fill_parent"
android:layout_height="wrap_content" android:layout_height="match_parent"
android:background="#999999" android:background="#999999"
android:drawSelectorOnTop="false" android:drawSelectorOnTop="false"
android:horizontalSpacing="0dp" android:horizontalSpacing="0dp"
@ -214,20 +214,6 @@
android:autofillHints=""> android:autofillHints="">
</EditText> </EditText>
</LinearLayout> </LinearLayout>
<LinearLayout
android:layout_weight="0"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:gravity="center_vertical"
android:paddingTop="4dp">
<ImageView
android:id="@+id/imageBarcode"
android:layout_width="wrap_content"
android:layout_height="35dp"
android:src="@drawable/barcode"
android:paddingTop="2dp"
android:layout_margin="3dp" />
</LinearLayout>
<Button <Button
android:id="@+id/imageButtonSend" android:id="@+id/imageButtonSend"
android:layout_width="wrap_content" android:layout_width="wrap_content"

View File

@ -164,7 +164,7 @@
<GridView <GridView
android:id="@+id/gridView1" android:id="@+id/gridView1"
android:layout_width="fill_parent" android:layout_width="fill_parent"
android:layout_height="wrap_content" android:layout_height="match_parent"
android:background="#999999" android:background="#999999"
android:drawSelectorOnTop="false" android:drawSelectorOnTop="false"
android:horizontalSpacing="0dp" android:horizontalSpacing="0dp"
@ -213,19 +213,6 @@
android:autofillHints=""> android:autofillHints="">
</EditText> </EditText>
</LinearLayout> </LinearLayout>
<LinearLayout
android:layout_weight="0"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:gravity="center_vertical"
android:paddingTop="4dp">
<ImageView
android:id="@+id/imageBarcode"
android:layout_width="wrap_content"
android:layout_height="35dp"
android:src="@drawable/barcode"
android:layout_margin="3dp" />
</LinearLayout>
<Button <Button
android:id="@+id/imageButtonSend" android:id="@+id/imageButtonSend"
android:layout_width="wrap_content" android:layout_width="wrap_content"

View File

@ -263,5 +263,7 @@
<string name="permissionBlocked">%1$s permission was not accepted. To be able to use the %2$s, please open application settings and grant the %3$s permission</string> <string name="permissionBlocked">%1$s permission was not accepted. To be able to use the %2$s, please open application settings and grant the %3$s permission</string>
<string name="microphone">Microphone</string> <string name="microphone">Microphone</string>
<string name="radio_tab">Radio Tab</string> <string name="radio_tab">Radio Tab</string>
<string name="too_many_positions">You have selected %1$s positions.\nPlease select a smalled interval.</string>
<string name="no_data_for_interval">No data for this interval</string>
</resources> </resources>