Compare commits

..

No commits in common. "develop" and "feature/allow_server_reconnection_on_mobile_data" have entirely different histories.

40 changed files with 3190 additions and 3399 deletions

3
.gitignore vendored
View File

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

View File

@ -25,7 +25,6 @@ public abstract class AbstractLiveActivity extends AppCompatActivity {
public abstract void vehicleStatusReceived(long imei, int opCode, int status); // --> UpdateOptions
public abstract void emergencyAlarmReceived(int position, double lat, double lng); // --> UpdateEmergencyAlarm
public abstract GoogleMap getMap(); // --> UpdateEmergencyAlarm
public abstract void setLanguage();
/** Misc */
public AbstractSDParentActivity getParentTab() {

View File

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

View File

@ -97,10 +97,6 @@ public class AlertGridViewAdapter extends BaseAdapter
switch(acknowledged.get(position) ? 1 : 0)
{
case 1:
ViewGroup.LayoutParams params = convertView.getLayoutParams();
if (params != null) {
params.height = 0;
}
view.imageViewAlert.setImageResource(R.drawable.alert_off);
//view.layoutAlarm.setBackgroundColor(0xffffffff);
break;

View File

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

View File

@ -285,7 +285,7 @@ public class DatabaseCommunication {
while (cursor.isAfterLast() == false)
{
Recording rec = new Recording();
rec.id =cursor.getInt(0);
rec.ID =cursor.getInt(0);
rec.sourceRadioID = cursor.getInt(1);
rec.destinationRadioID = cursor.getInt(2);
rec.date = cursor.getInt(3);
@ -315,7 +315,7 @@ public class DatabaseCommunication {
if(cursor.getCount() > 0)
{
Recording rec = new Recording();
rec.id =cursor.getInt(0);
rec.ID =cursor.getInt(0);
rec.sourceRadioID = cursor.getInt(1);
rec.destinationRadioID = cursor.getInt(2);
rec.date = cursor.getInt(3);
@ -364,7 +364,7 @@ public class DatabaseCommunication {
values.put("duration", rec.duration);
values.put("filename", rec.filename);
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);
}
//INSERT into SMS (timeGMT, imei_sour, imei_dest, mess, status) VALUES( 1324016412, 0, 101, 'two', 1)

View File

@ -15,7 +15,7 @@ public class RadioMSG extends TCPmsg {
public int rOpcode;
public String payload="";
public ArrayList<RadioGW> RadioGWList = null;
public ArrayList<RadioGW> RadioGWList=null;
//zone and channel;
public Zone_and_channel zac= null;
@ -35,9 +35,7 @@ public class RadioMSG extends TCPmsg {
// Contacts list
public ArrayList<Contact> contacts;
public RadioMSG(TCPmsg tcp) {
super(tcp);
String date4parsing = super.data;
@ -49,34 +47,148 @@ public class RadioMSG extends TCPmsg {
switch(rOpcode)
{
case 200 /* gw list */:
RadioGWList = getRadioGWList();
case 200:
{
RadioGWList = new ArrayList<RadioGW>();
String[] tempArr = payload.split(";");
int count = 0;
for(int i =0; i<tempArr.length;i++)
{
String[] oneRadio = tempArr[i].split("&");
if(oneRadio.length<5)
continue;
RadioGW rgw = new RadioGW();
rgw.ID = Integer.parseInt(oneRadio[0]);
rgw.GW_ID = Integer.parseInt(oneRadio[1]);
rgw.IMEI = oneRadio[2];
rgw.IP = oneRadio[3];
String zonelistStr =oneRadio[4];
String[] zoneArr = zonelistStr.split("@");
for(int j =0; j<zoneArr.length;j++)
{
Zone zon = new Zone();
String[] oneZoneArr = zoneArr[j].split(":");
//TODO check what this values are from SD
zon.dbID = Integer.parseInt(oneZoneArr[0]);
zon.id = Integer.parseInt(oneZoneArr[1]);
zon.ZoneName = oneZoneArr[2];
String channelListStr = oneZoneArr[3];
String[] channelArr = channelListStr.split(",");
for(int k =0; k < channelArr.length; k++)
{
Channel chn = new Channel();
String[] oneChnArr = channelArr[k].split("/");
chn.dbID = Integer.parseInt(oneChnArr[0]);
chn.id = Integer.parseInt(oneChnArr[1]);
chn.chName = oneChnArr[2];
//add channel to zone
zon.channelList.add(chn);
}
//add zone to radio GW
rgw.zoneList.add(zon);
}
RadioGWList.add(rgw);
count++;
}
count +=this.RadioGWList.size();
SM.Debug("radio","RadioGWList size:" +this.RadioGWList.size() + " total:" +count);
break;
}
case OperationCodes.CHANNEL_BRDCST:
zac = parse_CHANNEL_BRDCST(payload);
{
try {
zac = new Zone_and_channel();
String[] tempArr = payload.split("&");
String[] gwID_and_rgwID = tempArr[0].split("/");
zac.gwID = Integer.parseInt(gwID_and_rgwID[0]);
zac.rgwID = Integer.parseInt(gwID_and_rgwID[1]);
String[] zoneNr_and_channelNr = tempArr[1].split("/");
zac.zoneNr = Integer.parseInt(zoneNr_and_channelNr[0]);
zac.channelNr = Integer.parseInt(zoneNr_and_channelNr[1]);
} catch (Exception e) {
SM.Debug("Cmd 204 error:"+e.toString());
}
break;
}
case OperationCodes.RADIO_STATUS_REP:
{
try {
rStatus = new RadioStatus();
String[] tempArr = payload.split("&");
if(tempArr.length == 4 || tempArr.length == 5) {
rStatus.status = 1;
rStatus.incCall.callStatus = Integer.parseInt(tempArr[0]);
rStatus.incCall.callType = Integer.parseInt(tempArr[1]);
rStatus.incCall.Imei = Integer.parseInt(tempArr[2]);
rStatus.incCall.callerID = Integer.parseInt(tempArr[2]);
rStatus.incCall.groupId = Integer.parseInt(tempArr[3]);
rStatus.incCall.callDestID = Integer.parseInt(tempArr[3]);
rStatus = parse_RADIO_STATUS_REP(payload);
if(tempArr.length == 5)
rStatus.incCall.userID = Integer.parseInt(tempArr[4]);
}
else {
String[] gwID_and_rgwID = tempArr[0].split("/");
rStatus.gwID = Integer.parseInt(gwID_and_rgwID[0]);
rStatus.rgwID = Integer.parseInt(gwID_and_rgwID[1]);
rStatus.status = Integer.parseInt(tempArr[1]);
}
} catch (Exception e) {
SM.Debug("Cmd 199 error:"+e.toString());
}
break;
}
case OperationCodes.UNIT_STATUS_UPDATE :
suStatus = parse_UNIT_STATUS_UPDATE(payload);
case 250:
{
try {
suStatus = new SUstatus();
String[] tempArr = payload.split("&");
suStatus.imei = Integer.parseInt(tempArr[0]);
suStatus.status = Integer.parseInt(tempArr[1]);
} catch (Exception e) {
SM.Debug("Cmd 250 error:"+e.toString());
}
break;
}
case 125:
case OperationCodes.CALL_STATUS_BRDCST:
incCall = parse_CALL_STATUS_BRDCST(payload);
{
try {
incCall = new IncCall();
incCall.opCode = rOpcode;
String[] tempArr = payload.split("&");
String[] gwID_and_rgwID_imei = tempArr[0].split("/");
incCall.gwID = Integer.parseInt(gwID_and_rgwID_imei[0]);
incCall.rgwID = Integer.parseInt(gwID_and_rgwID_imei[1]);
incCall.Imei = Long.parseLong(gwID_and_rgwID_imei[2]);
incCall.callStatus = Integer.parseInt(tempArr[1]);
incCall.callType = Integer.parseInt(tempArr[2]);
incCall.groupId = Integer.parseInt(tempArr[3]);
incCall.userID = Integer.parseInt(tempArr[4]);
} catch (Exception e) {
SM.Debug("Cmd 125, 126 error:"+e.toString());
}
break;
}
case 121:
case 122:
@ -153,9 +265,21 @@ public class RadioMSG extends TCPmsg {
}
case OperationCodes.CALL_TYPE_REP:
incCall = parse_CALL_TYPE_REP(payload);
{
try {
incCall = new IncCall();
incCall.opCode = rOpcode;
String[] tempArr = payload.split("/");
incCall.callType = Integer.parseInt(tempArr[0]);
incCall.callStatus = Integer.parseInt(tempArr[1]);
SM.Debug("GOT CHANGE CALL TYPE MSG", incCall.opCode + " # " + incCall.callType + " # " + incCall.callStatus);
} catch (Exception e) {
SM.Debug("Cmd 115,116,117 error:"+e.toString());
}
break;
}
case 172:
{
@ -178,10 +302,20 @@ public class RadioMSG extends TCPmsg {
}
case OperationCodes.EMERGENCY_REP:
{
try {
emerg = new Emerg();
String[] tempArr = payload.split("/");
emerg.function = Integer.parseInt(tempArr[0]);
emerg.status = Integer.parseInt(tempArr[1]);
emerg = parse_EMERGENCY_REP(payload);
// emerg.userID = Integer.parseInt(tempArr[2]);
} catch (Exception e) {
SM.Debug("Cmd 230 error:"+e.toString());
}
break;
}
/*
case OperationCodes.CONTACTS_REP:
@ -207,254 +341,4 @@ public class RadioMSG extends TCPmsg {
}
private RadioGW parseRadioGW(String buffer)
{
RadioGW rgw = new RadioGW();
String[] radioFields = buffer.split("&");
if( radioFields.length > 3 ) {
rgw.ID = Integer.parseInt(radioFields[0].trim());
rgw.GW_ID = Integer.parseInt(radioFields[1].trim());
rgw.IMEI = radioFields[2];
rgw.IP = radioFields[3];
}
return rgw;
}
private Zone parseZone(String buffer)
{
Zone zone = new Zone();
String[] zoneFields = buffer.split(":");
if( zoneFields.length > 2 ) {
zone.dbID = Integer.parseInt(zoneFields[0].trim());
zone.id = Integer.parseInt(zoneFields[1].trim());
zone.ZoneName = zoneFields[2];
}
return zone;
}
private Channel parseChannel(String buffer)
{
Channel channel = new Channel();
String[] channelFields = buffer.split("/");
if( channelFields.length > 2 ) {
channel.dbID = Integer.parseInt(channelFields[0].trim());
channel.id = Integer.parseInt(channelFields[1].trim());
channel.chName = channelFields[2].trim();
}
return channel;
}
private String[] getChannelList(String zone)
{
String[] zoneArr = zone.split(":");
if ( zoneArr.length > 3)
return zoneArr[3].split(",");
return null;
}
private String[] getZoneList(String gw)
{
String[] zoneArr = gw.split("&");
if ( zoneArr.length > 4)
return zoneArr[4].split("@");
return null;
}
private ArrayList<RadioGW> getRadioGWList()
{
ArrayList<RadioGW> radioGWList = new ArrayList<RadioGW>();
String[] radioGWArr = payload.split(";");
for(int i=0; i < radioGWArr.length; i++)
{
RadioGW rgw = parseRadioGW(radioGWArr[i]);
String[] zoneArr = getZoneList(radioGWArr[i]);
if( zoneArr == null)
continue;
for(int j=0; j < zoneArr.length; j++)
{
Zone zone = parseZone(zoneArr[j]);
String[] channelArr = getChannelList(zoneArr[j]);
if( channelArr == null)
continue;
for(int k =0; k < channelArr.length; k++)
{
Channel channel = parseChannel(channelArr[k]);
//add channel to zone
zone.channelList.add(channel);
}
//add zone to radio GW
rgw.zoneList.add(zone);
}
radioGWList.add(rgw);
}
return radioGWList;
}
private Zone_and_channel parse_CHANNEL_BRDCST(String payload) {
Zone_and_channel zacObj = new Zone_and_channel();
try {
String[] tempArr = payload.split("&");
String[] gwID_and_rgwID = tempArr[0].split("/");
zacObj.gwID = Integer.parseInt(gwID_and_rgwID[0].trim());
zacObj.rgwID = Integer.parseInt(gwID_and_rgwID[1].trim());
String[] zoneNr_and_channelNr = tempArr[1].split("/");
zacObj.zoneNr = Integer.parseInt(zoneNr_and_channelNr[0].trim());
zacObj.channelNr = Integer.parseInt(zoneNr_and_channelNr[1].trim());
} catch (Exception e) {
SM.Debug("Cmd 204 error:"+e.toString());
}
return zacObj;
}
private IncCall parse_CALL_STATUS_BRDCST(String payload)
{
IncCall incCallObj = new IncCall();
try {
incCallObj.opCode = rOpcode;
String[] tempArr = payload.split("&");
String[] gwID_and_rgwID_imei = tempArr[0].split("/");
incCallObj.gwID = Integer.parseInt(gwID_and_rgwID_imei[0]);
incCallObj.rgwID = Integer.parseInt(gwID_and_rgwID_imei[1]);
incCallObj.Imei = Long.parseLong(gwID_and_rgwID_imei[2]);
incCallObj.callStatus = Integer.parseInt(tempArr[1]);
incCallObj.callType = Integer.parseInt(tempArr[2]);
incCallObj.groupId = Integer.parseInt(tempArr[3]);
if (tempArr.length > 4 )
incCallObj.userID = Integer.parseInt(tempArr[4]);
} catch (Exception e) {
SM.Debug("Cmd 125, 126 error:"+e.toString());
}
return incCallObj;
}
private RadioStatus parse_RADIO_STATUS_REP(String payload)
{
RadioStatus radioStatus = new RadioStatus();
try
{
String[] tempArr = payload.split("&");
if(tempArr.length == 4 || tempArr.length == 5) {
radioStatus.status = 1;
radioStatus.incCall.callStatus = Integer.parseInt(tempArr[0]);
radioStatus.incCall.callType = Integer.parseInt(tempArr[1]);
radioStatus.incCall.Imei = Integer.parseInt(tempArr[2]);
radioStatus.incCall.callerID = Integer.parseInt(tempArr[2]);
radioStatus.incCall.groupId = Integer.parseInt(tempArr[3]);
radioStatus.incCall.callDestID = Integer.parseInt(tempArr[3]);
if(tempArr.length == 5)
radioStatus.incCall.userID = Integer.parseInt(tempArr[4]);
}
else {
String[] gwID_and_rgwID = tempArr[0].split("/");
radioStatus.gwID = Integer.parseInt(gwID_and_rgwID[0]);
radioStatus.rgwID = Integer.parseInt(gwID_and_rgwID[1]);
radioStatus.status = Integer.parseInt(tempArr[1]);
}
}
catch (Exception e) {
SM.Debug("Cmd 199 error:"+e.toString());
}
return radioStatus;
}
private Emerg parse_EMERGENCY_REP(String payload)
{
Emerg emergObj = new Emerg();
try {
String[] tempArr = payload.split("/");
emergObj.function = Integer.parseInt(tempArr[0]);
emergObj.status = Integer.parseInt(tempArr[1]);
// emerg.userID = Integer.parseInt(tempArr[2]);
} catch (Exception e) {
SM.Debug("Cmd 230 error:"+e.toString());
}
return emergObj;
}
private SUstatus parse_UNIT_STATUS_UPDATE(String payload)
{
SUstatus suStatusObj = new SUstatus();
try {
String[] tempArr = payload.split("&");
suStatusObj.imei = Integer.parseInt(tempArr[0]);
suStatusObj.status = Integer.parseInt(tempArr[1]);
} catch (Exception e) {
SM.Debug("Cmd 250 error:"+e.toString());
}
return suStatusObj;
}
private IncCall parse_CALL_TYPE_REP(String payload)
{
IncCall incCallObj = new IncCall();
try {
incCallObj.opCode = rOpcode;
String[] tempArr = payload.split("/");
incCallObj.callType = Integer.parseInt(tempArr[0]);
incCallObj.callStatus = Integer.parseInt(tempArr[1]);
SM.Debug("GOT CHANGE CALL TYPE MSG", incCallObj.opCode + " # " + incCallObj.callType + " # " + incCallObj.callStatus);
} catch (Exception e) {
SM.Debug("Cmd 115,116,117 error:"+e.toString());
}
return incCallObj;
}
}

View File

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

View File

@ -1,20 +1,15 @@
package com.safemobile.lib;
public class Recording {
public long id;
public long ID;
public int startGMT;
public int endGMT;
public int gwID;
public int radioGWID;
public int callType;
public int groupCpsId;
public int dispatcherId;
public int subID;
public int typeID;
public String userWhoCalled="";
public String userWhoWasCalled = "";
public String groupName = "";
public String NameForDisplay="";
/** RadioPad */
public long date;
public int duration;
@ -23,8 +18,13 @@ public class Recording {
public long sourceRadioID;
public int type;
public Recording()
{
}
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

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

View File

@ -1,4 +1,10 @@
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.Context;
@ -6,38 +12,25 @@ import android.content.Intent;
import android.content.IntentFilter;
import android.net.ConnectivityManager;
import android.net.wifi.WifiManager;
import android.util.Log;
import com.safemobile.lib.AppParams;
import com.safemobile.lib.SM;
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 {
private final String TAG = "TCPhandler";
private boolean alive = true;
public String serverHostname;
private int port;
private Thread listenThread;
private Socket soc = null;
private Socket soc =null;
private DataInputStream input;
private DataOutputStream output;
private String leftOver = "";
public static LinkedList<TCPmsg> msgList;
public Boolean isConnectionUP = false;
@ -45,35 +38,31 @@ public class TCPhandler implements Runnable {
private final Context context;
private boolean isWiFiOn;
public TCPhandler(Context context, String hostName, int p) {
this.context = context;
serverHostname = hostName;
serverHostname=hostName;
port = p;
msgList = new LinkedList<>();
SM.Debug("---TCPhandler constructor [" + hostName + "," + p + "] ---");
listenThread = new Thread(this, "TCPlisten");
listenThread = new Thread(this, "TCPlisten");
listenThread.start(); // (2) Start the thread.
// create timer to check socket status
Timer timer = new Timer();
try {
timer.scheduleAtFixedRate(new TimerTask() {
@Override
public void run() {
try {
previousConnectionWasUP = isConnectionUP;
// try to send something
TCPmsgParser._fireonTCPConnectionStatusEvent(isConnectionUP, previousConnectionWasUP);
} catch (Exception e) {
SM.Exception("TIMERException", e.toString());
}
timer.scheduleAtFixedRate(new TimerTask() {
@Override
public void run() {
try {
previousConnectionWasUP = isConnectionUP;
// try to send something
TCPmsgParser._fireonTCPConnectionStatusEvent(isConnectionUP, previousConnectionWasUP);
} catch (Exception e) {
SM.Exception("TIMERException", e.toString());
}
}, 0, 3000);
} catch(Exception e) {
Log.v("Exception", e.getMessage());
}
}
}, 0, 3000);
// get WiFi state
isWiFiOn = isNetworkConnected();
@ -87,13 +76,13 @@ public class TCPhandler implements Runnable {
ConnectivityManager cm = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
return cm.getActiveNetworkInfo() != null && cm.getActiveNetworkInfo().isConnected();
}
@Override
public void run() {
try {
if (soc != null)
soc.close();
soc = new Socket();
soc.connect(new InetSocketAddress(serverHostname, port), 5000);
@ -110,70 +99,63 @@ public class TCPhandler implements Runnable {
SM.Debug("IllegalArgumentException", "TCPhandler break:"+ e);
} catch (IOException e) {
SM.Debug("IOException", "TCPhandler break:"+ e);
} catch (Exception e) {
Log.v("Exception", e.getMessage());
}
while (alive) {
try {
Thread.sleep(3000);
} catch (InterruptedException e) {
SM.Debug("TCPhandler Crash1 on sleep:"+ e);
} catch (Exception e) {
Log.v("Exception", e.getMessage());
}
while (Boolean.TRUE.equals(isConnectionUP)) {
while(isConnectionUP) {
try {
Thread.sleep(100);
//process leftover
Thread.sleep(100);
try {
boolean FinishLeftOver = true;
while (FinishLeftOver) {
// add this replacement if message length doesn't contain the last #
String[] tempArr2 = leftOver.split("#");
if (tempArr2.length > 1) {
int messLen;
try {
messLen = Integer.parseInt(tempArr2[1]);
} catch (Exception e) {
messLen = Integer.parseInt(tempArr2[1]);
//TODO talk to Gaby to fix this on Bridge
} catch (Exception e) {
SM.Debug("leftovers", "incorect msg len leftOver =" + tempArr2[1]);
messLen = -1;
}
messLen =-1;
}
if (messLen > leftOver.length()) {
FinishLeftOver = false;
break;
} else if (messLen == leftOver.length()) {
TCPmsg msg = new TCPmsg(leftOver.toCharArray());
SM.Debug("leftovers", "RX from leftOver:" + msg.allData);
if (msg.allData.contains("#92#"))
SM.Debug("leftovers", "RX from leftOver:"+msg.allData);
if(msg.allData.contains("#92#"))
prioritizePongReceived();
msgList.add(msg);
leftOver = "";
FinishLeftOver = false;
leftOver ="";
break;
} else // we have more message in leftover
{
TCPmsg msg = new TCPmsg(leftOver.substring(0, messLen).toCharArray());
SM.Debug("leftovers", "RX from leftOver:" + msg.allData);
if (msg.allData.contains("#92#"))
} else { // we have more message in leftover
TCPmsg msg = new TCPmsg(leftOver.substring(0,messLen).toCharArray());
SM.Debug("leftovers", "RX from leftOver:"+msg.allData);
if(msg.allData.contains("#92#"))
prioritizePongReceived();
msgList.add(msg);
leftOver = leftOver.substring(messLen, leftOver.length());
}
} else FinishLeftOver = false;
leftOver = leftOver.substring(messLen);
}
} else FinishLeftOver = false;
}
} catch (Exception e) {
SM.Debug("leftovers", "Error on process leftover" + e.toString());
SM.Debug("leftovers", "Error on process leftover"+ e);
}
//end process leftover
String data = "";
int n = 0;
String data;
int n;
byte[] buf = new byte[1024];
// read data into buffer
@ -187,21 +169,20 @@ public class TCPhandler implements Runnable {
soc = null;
break;
}
byte[] temp = new byte[n];
if (n >= 0) System.arraycopy(buf, 0, temp, 0, n);
System.arraycopy(buf, 0, temp, 0, n);
// decryptData
temp = decryptTEA(temp);
data = new String(temp);
// decryptData
temp = decryptTEA(temp);
data = new String(temp);
//if we have any leftovers from previous message add them
if(leftOver.length() > 1) { // avoid case with only one #
data = leftOver+data;
leftOver = "";
}
//search for overflow message
String[] tempArr = data.split("#");
if ((tempArr.length == 0) || (tempArr.length == 1)) {
@ -211,7 +192,7 @@ public class TCPhandler implements Runnable {
//get msg len
int messLen;
try {
messLen = Integer.parseInt(tempArr[1]);
messLen = Integer.parseInt(tempArr[1]);
} catch (Exception e) {
SM.Debug("TCP Client", "incorect msg len =" + tempArr[1]);
continue;
@ -225,20 +206,20 @@ public class TCPhandler implements Runnable {
//if expected string message is smaller then actual string then exit processing;
if (messLen > data.length()) {
leftOver = data; // Add by bigu
continue;
continue;
}
//perform cut
//perform cut
temMSG = data.substring(0,messLen).toCharArray();
leftOver = data.substring(messLen);
}
//decode TCP msg
TCPmsg msg = new TCPmsg(temMSG);
SM.Debug("<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> RX <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>", msg.allData);
if (msg.allData.contains("#92#"))
prioritizePongReceived();
msgList.add(msg);
} catch(Exception ex) {
SM.Debug("TCPHandler", "TCPhandler/run/break:"+ ex);
@ -252,20 +233,18 @@ public class TCPhandler implements Runnable {
Thread.sleep(1000);
} catch (InterruptedException e) {
SM.Debug("TCPhandler Crash2 on sleep:"+ e);
} catch (Exception e) {
Log.v("Exception", e.getMessage());
}
//try to restart connection
if (alive && isWiFiOn)
restartTCP();
RestartTCP();
}
SM.Debug("==================================");
SM.Debug("TCP listenThread stoped!! alive = false");
SM.Debug("==================================");
}
/**
* Create a bypass in order to trigger the ping received event
* Create a bypass in order to trigger the ping received event
*/
private void prioritizePongReceived() {
TCPmsgParser._firePONGReceivedEvent();
@ -273,7 +252,7 @@ public class TCPhandler implements Runnable {
/* Broadcast Received for WiFi Connect/Disconnect */
public BroadcastReceiver mReceived = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
final String action = intent.getAction();
@ -288,7 +267,7 @@ public class TCPhandler implements Runnable {
}
};
/** Send a message through the TCP Socket
/** Send a message through the TCP Socket
* @param seqID The messages's sequence ID (a number of order)
* @param msg The messages which will be sent
* @return True if the message was sent
@ -298,51 +277,41 @@ public class TCPhandler implements Runnable {
if (output != null) {
try {
Thread.sleep(10);
String cmdok = "#" + seqID + msg;
Integer tmp = cmdok.length() + 1;
String cmdok = "#" + seqID + msg;
int tmp = cmdok.length() + 1;
//SM.Debug("tmp:"+tmp);
tmp += Integer.toString(tmp).length();
if ((tmp == 10) || (tmp == 100) || (tmp == 1000)) tmp++;
cmdok = "#" + Integer.toString(tmp) + cmdok;
if ((tmp == 10)||(tmp == 100)||(tmp == 1000)) tmp++;
cmdok = "#" + tmp + 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));
return true;
} catch (InterruptedException e) {
SM.Exception("TCPClient[Send]", e.toString());
Thread.currentThread().interrupt();
} catch (NoSuchElementException e) {
} catch (IOException | NoSuchElementException | InterruptedException e) {
SM.Exception("TCPClient[Send]", e.toString());
}
} else {
} else
return false;
}
} catch (Exception e) {
SM.Debug("TCPhandler Write Procedure:" + e);
SM.Debug("TCPhandler Write Procedure:"+ e);
}
return false;
}
/* Encrypt a string using an encryption algorithm,
/* Encrypt a string using an encryption algorithm,
* in this case TEA */
public static byte[] encryptTEA(String toEncryptData) {
// no encryption
return toEncryptData.getBytes();
}
/* Decrypt a string using an encryption algorithm,
/* Decrypt a string using an encryption algorithm,
* in this case TEA */
public static byte[] decryptTEA(byte[] toDecryptData) {
byte[] decryptedByteArray;
@ -351,7 +320,7 @@ public class TCPhandler implements Runnable {
decryptedByteArray = toDecryptData;
return decryptedByteArray;
}
public int getPort() {
return port;
}
@ -359,13 +328,12 @@ public class TCPhandler implements Runnable {
public void updateTCPparameters(String ip, String _port) {
// stop socket
try {
if (soc != null)
if(soc != null)
soc.close();
} catch (IOException e1) {
Log.v("IOException", e1.getMessage());
e1.printStackTrace();
}
serverHostname = ip;
try {
port = Integer.parseInt(_port);
@ -374,51 +342,47 @@ public class TCPhandler implements Runnable {
port = 13589;
}
}
public void triggerTCPConnectionStateEvent() {
if (!isConnectionUP)
TCPmsgParser._fireTCPConnectionDownEvent(previousConnectionWasUP);
else
else
TCPmsgParser._fireTCPConnectionUpEvent(previousConnectionWasUP);
}
private void restartTCP() {
private void RestartTCP() {
try {
Log.v(TAG, "restartTCP");
isConnectionUP = false;
previousConnectionWasUP = false;
SM.Debug("Restarting TCP...ip:" + serverHostname + ":" + port);
SM.Debug("Restarting TCP...ip:"+serverHostname + ":" + port);
soc = new Socket();
soc.connect(new InetSocketAddress(serverHostname, port), 50000);
soc.connect(new InetSocketAddress(serverHostname, port), 5000);
input = new DataInputStream(soc.getInputStream());
//output stream
output = new DataOutputStream(soc.getOutputStream());
if (soc != null) {
if (soc != null)
isConnectionUP = true;
}
} catch (NullPointerException | IOException e) {
SM.Exception("restartTCP break:" + e);
SM.Exception("RestartTCP break:"+ e);
isConnectionUP = false;
} catch (IllegalArgumentException e) {
SM.Debug("IllegalArgumentException", "restartTCP break:" + e);
SM.Debug("IllegalArgumentException", "RestartTCP break:"+ e);
}
triggerTCPConnectionStateEvent();
}
/** close Socket when unReachable */
public void closeSocket() {
try {
input = null;
output = null;
if (soc != null)
if(soc!=null)
soc.close();
soc = null;
} catch (IOException e) {
Log.v("IOException", e.getMessage());
e.printStackTrace();
}
}

View File

@ -1,6 +1,7 @@
package com.safemobile.services;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.NoSuchElementException;
@ -11,14 +12,16 @@ import com.safemobile.lib.SM;
import com.safemobile.lib.TCPmsg;
public class TCPmsgParser implements Runnable {
public class TCPmsgParser implements Runnable{
public boolean run = true;
private TCPmsg _msg;
private static final List<ITCPListener> _listeners = new ArrayList<>();
private static List<ITCPListener> _listeners = new ArrayList<ITCPListener>();
private Thread TCPmsgParserThread;
public TCPmsgParser() {
public TCPmsgParser()
{
TCPmsgParserThread = new Thread(this, "TCPmsgParserThread");
TCPmsgParserThread.start(); // (2) Start the thread.
}
@ -34,361 +37,404 @@ public class TCPmsgParser implements Runnable {
public synchronized void clearITCPListeners() {
_listeners.clear();
}
public int getListenersSize()
{
return _listeners.size();
}
private synchronized void _fireLoginEvent() {
TCPEvent event = new TCPEvent( this, _msg );
for (ITCPListener listener : _listeners) {
listener.onLoginReceived(event);
Iterator<ITCPListener> listeners = _listeners.iterator();
while( listeners.hasNext() ) {
( (ITCPListener) listeners.next() ).onLoginReceived( event );
}
}
private synchronized void _fireGPSEvent() {
TCPEvent event = new TCPEvent( this, _msg );
for (ITCPListener listener : _listeners) {
listener.onGPSReceived(event);
Iterator<ITCPListener> listeners = _listeners.iterator();
while( listeners.hasNext() ) {
( (ITCPListener) listeners.next() ).onGPSReceived(event);
}
}
private synchronized void _fireSMSEvent() {
TCPEvent event = new TCPEvent( this, _msg );
for (ITCPListener listener : _listeners) {
listener.onSMSReceived(event);
Iterator<ITCPListener> listeners = _listeners.iterator();
while( listeners.hasNext() ) {
( (ITCPListener) listeners.next() ).onSMSReceived( event );
}
}
private synchronized void _fireLastSMSEvent() {
TCPEvent event = new TCPEvent( this, _msg );
for (ITCPListener listener : _listeners) {
listener.onLastSMSsReceived(event);
Iterator<ITCPListener> listeners = _listeners.iterator();
while( listeners.hasNext() ) {
( (ITCPListener) listeners.next() ).onLastSMSsReceived(event);
}
}
private synchronized void _fireVehEvent() {
TCPEvent event = new TCPEvent( this, _msg );
for (ITCPListener listener : _listeners) {
listener.onVehiclesReceived(event);
Iterator<ITCPListener> listeners = _listeners.iterator();
while( listeners.hasNext() ) {
( (ITCPListener) listeners.next() ).onVehiclesReceived( event );
}
}
private synchronized void _fireNewSMS() {
TCPEvent event = new TCPEvent( this, _msg );
for (ITCPListener listener : _listeners) {
listener.onNewSMSReceived(event);
Iterator<ITCPListener> listeners = _listeners.iterator();
while( listeners.hasNext() ) {
( (ITCPListener) listeners.next() ).onNewSMSReceived(event);
}
}
private synchronized void _fireSMSconfirm() {
TCPEvent event = new TCPEvent( this, _msg );
for (ITCPListener listener : _listeners) {
listener.onSMSAckReceived(event);
Iterator<ITCPListener> listeners = _listeners.iterator();
while( listeners.hasNext() ) {
( (ITCPListener) listeners.next() ).onSMSAckReceived(event);
}
}
private synchronized void _fireLastPos() {
TCPEvent event = new TCPEvent( this, _msg );
for (ITCPListener listener : _listeners) {
listener.onLastPositionsReceived(event);
Iterator<ITCPListener> listeners = _listeners.iterator();
while( listeners.hasNext() ) {
( (ITCPListener) listeners.next() ).onLastPositionsReceived(event);
}
}
private synchronized void _fireRadioEvent() {
TCPEvent event = new TCPEvent( this, _msg );
for (ITCPListener listener : _listeners) {
listener.onRadioMsgReceived(event);
Iterator<ITCPListener> listeners = _listeners.iterator();
while( listeners.hasNext() ) {
( (ITCPListener) listeners.next() ).onRadioMsgReceived(event);
}
}
private synchronized void _fireHistPos() {
TCPEvent event = new TCPEvent( this, _msg );
for (ITCPListener listener : _listeners) {
listener.onHistoryPositionsReceived(event);
Iterator<ITCPListener> listeners = _listeners.iterator();
while( listeners.hasNext() ) {
( (ITCPListener) listeners.next() ).onHistoryPositionsReceived(event);
}
}
private synchronized void _fireHistCount() {
TCPEvent event = new TCPEvent( this, _msg );
for (ITCPListener listener : _listeners) {
listener.onHistoryPositionsCountReceived(event);
Iterator<ITCPListener> listeners = _listeners.iterator();
while( listeners.hasNext() ) {
( (ITCPListener) listeners.next() ).onHistoryPositionsCountReceived(event);
}
}
private synchronized void _fireAlarmList() {
TCPEvent event = new TCPEvent( this, _msg );
for (ITCPListener listener : _listeners) {
listener.onAlarmsReceived(event);
Iterator<ITCPListener> listeners = _listeners.iterator();
while( listeners.hasNext() ) {
( (ITCPListener) listeners.next() ).onAlarmsReceived(event);
}
}
private synchronized void _fireAlarmACK() {
TCPEvent event = new TCPEvent( this, _msg );
for (ITCPListener listener : _listeners) {
listener.onAlarmAckReceived(event);
Iterator<ITCPListener> listeners = _listeners.iterator();
while( listeners.hasNext() ) {
( (ITCPListener) listeners.next() ).onAlarmAckReceived(event);
}
}
private synchronized void _fireAlarmLive() {
TCPEvent event = new TCPEvent( this, _msg );
for (ITCPListener listener : _listeners) {
listener.alarmLiveReceived(event);
Iterator<ITCPListener> listeners = _listeners.iterator();
while( listeners.hasNext() ) {
( (ITCPListener) listeners.next() ).alarmLiveReceived(event);
}
}
private synchronized void _fireRecordList() {
TCPEvent event = new TCPEvent( this, _msg );
for (ITCPListener listener : _listeners) {
listener.onRecordingsListReceived(event);
Iterator<ITCPListener> listeners = _listeners.iterator();
while( listeners.hasNext() ) {
( (ITCPListener) listeners.next()).onRecordingsListReceived(event);
}
}
private synchronized void _fireRecordPlay() {
TCPEvent event = new TCPEvent( this, _msg );
for (ITCPListener listener : _listeners) {
listener.onRecordingPlayReceived(event);
Iterator<ITCPListener> listeners = _listeners.iterator();
while( listeners.hasNext() ) {
( (ITCPListener) listeners.next()).onRecordingPlayReceived(event);
}
}
private synchronized void _firePOLLEvent() {
TCPEvent event = new TCPEvent( this, _msg );
for (ITCPListener listener : _listeners) {
listener.onPollReceived(event);
Iterator<ITCPListener> listeners = _listeners.iterator();
while( listeners.hasNext() ) {
( (ITCPListener) listeners.next()).onPollReceived(event);
}
}
private synchronized void _fireConnectionReplyEvent() {
TCPEvent event = new TCPEvent( this, _msg );
for (ITCPListener listener : _listeners) {
listener.onConnectionReplyReceived(event);
Iterator<ITCPListener> listeners = _listeners.iterator();
while( listeners.hasNext() ) {
( (ITCPListener) listeners.next()).onConnectionReplyReceived(event);
}
}
private synchronized void _fireContactsReceivedEvent() {
TCPEvent event = new TCPEvent( this, _msg );
for (ITCPListener listener : _listeners) {
listener.onContactsListReceived(event);
Iterator<ITCPListener> listeners = _listeners.iterator();
while( listeners.hasNext() ) {
( (ITCPListener) listeners.next()).onContactsListReceived(event);
}
}
private synchronized void _fireRecordingsReceivedEvent() {
TCPEvent event = new TCPEvent( this, _msg );
for (ITCPListener listener : _listeners) {
listener.onRecordingsListReceived(event);
Iterator<ITCPListener> listeners = _listeners.iterator();
while( listeners.hasNext() ) {
( (ITCPListener) listeners.next()).onRecordingsListReceived(event);
}
}
private synchronized void _fireTextMessagesReceivedEvent() {
TCPEvent event = new TCPEvent( this, _msg );
for (ITCPListener listener : _listeners) {
listener.onTextMessagesListReceived(event);
Iterator<ITCPListener> listeners = _listeners.iterator();
while( listeners.hasNext() ) {
( (ITCPListener) listeners.next()).onTextMessagesListReceived(event);
}
}
private synchronized void _fireRecordingPlayReceivedEvent() {
TCPEvent event = new TCPEvent( this, _msg );
for (ITCPListener listener : _listeners) {
listener.onRecordingPlayReceived(event);
Iterator<ITCPListener> listeners = _listeners.iterator();
while( listeners.hasNext() ) {
( (ITCPListener) listeners.next()).onRecordingPlayReceived(event);
}
}
public static synchronized void _fireTCPConnectionDownEvent(boolean previuosWasConnectionUp) {
for (ITCPListener listener : _listeners) {
listener.onTCPConnectionDown(previuosWasConnectionUp);
Iterator<ITCPListener> listeners = _listeners.iterator();
while( listeners.hasNext() ) {
( (ITCPListener) listeners.next()).onTCPConnectionDown(previuosWasConnectionUp);
}
}
public static synchronized void _fireTCPConnectionUpEvent(boolean previuosWasConnectionUp) {
for (ITCPListener listener : _listeners) {
listener.onTCPConnectionUp(previuosWasConnectionUp);
Iterator<ITCPListener> listeners = _listeners.iterator();
while( listeners.hasNext() ) {
( (ITCPListener) listeners.next()).onTCPConnectionUp(previuosWasConnectionUp);
}
}
public static synchronized void _fireonTCPConnectionStatusEvent(boolean isConnectionUp, boolean previuosWasConnectionUp) {
for (ITCPListener listener : _listeners) {
listener.onTCPConnectionStatusReceived(isConnectionUp, previuosWasConnectionUp);
Iterator<ITCPListener> listeners = _listeners.iterator();
while( listeners.hasNext() ) {
( (ITCPListener) listeners.next()).onTCPConnectionStatusReceived(isConnectionUp, previuosWasConnectionUp);
}
}
public static synchronized void _firePONGReceivedEvent() {
for (ITCPListener listener : _listeners) {
listener.onPONGReceived();
Iterator<ITCPListener> listeners = _listeners.iterator();
while( listeners.hasNext() ) {
( (ITCPListener) listeners.next()).onPONGReceived();
}
}
@Override
public void run() {
while(run) {
public void run()
{
while(run)
{
//SM.Debug("TCPmsgParser waiting for data...");
sleep(1);
if (TCPhandler.msgList == null)
if(TCPhandler.msgList==null)
continue;
if(!TCPhandler.msgList.isEmpty()) {
try {
if(!TCPhandler.msgList.isEmpty())
{
try
{
_msg = TCPhandler.msgList.poll();
if(_msg == null)
continue;
if(!_msg.OK)
if(_msg.OK == false)
continue;
//parse the rest of the message;
switch(_msg.opCode)
{
case 40: /* login */{
_fireLoginEvent();
break;
}
case 40:{
_fireLoginEvent();
break;
}
case 41: /* vehicle */ {
_fireVehEvent();
break;
}
case 41:{
_fireVehEvent();
break;
}
case 42:{
_fireSMSEvent();
break;
}
case 42: /* Text Message */{
_fireSMSEvent();
break;
}
case 43:{
_fireLastSMSEvent();
break;
}
case OperationCodes.TM_ACK:{
_fireSMSconfirm();
break;
}
case OperationCodes.TM_ACK_SD:{
_fireSMSconfirm();
break;
}
case 43: /* Last text message */ {
_fireLastSMSEvent();
break;
}
case OperationCodes.RECEIVED_TM:{
_fireNewSMS();
break;
}
case 45:{
_fireLastPos();
break;
}
case OperationCodes.TM_ACK:
case OperationCodes.TM_ACK_SD: {
_fireSMSconfirm();
break;
}
case 131:{
_fireGPSEvent();
break;
}
case OperationCodes.RECEIVED_TM:{
_fireNewSMS();
break;
}
case 231:{
_firePOLLEvent();
break;
}
case 45: /* last position */ {
_fireLastPos();
break;
}
case 50:{
_fireRadioEvent();
break;
}
case 131: /* gps */ {
_fireGPSEvent();
break;
}
case 46:{
_fireHistPos();
break;
}
case 231: /* pool */ {
_firePOLLEvent();
break;
}
case 86:{
_fireHistCount();
break;
}
case 47:{
_fireAlarmList();
break;
}
case 50: /* radio */ {
_fireRadioEvent();
break;
}
case 48:{
_fireAlarmACK();
break;
}
case 46:{
_fireHistPos();
break;
}
case 49:{
_fireRecordList();
break;
}
case 86:{
_fireHistCount();
break;
}
case 38:{
_fireRecordPlay();
break;
}
case 47: /* alert list */ {
_fireAlarmList();
break;
}
case 48: /* alert ack */ {
_fireAlarmACK();
break;
}
case 49:{
_fireRecordList();
break;
}
case 38:{
_fireRecordPlay();
break;
}
case 135:
case 136:
case 137:
case 138:
case 140:{
_fireAlarmLive();
break;
}
case 135:
case 136:
case 137:
case 138:
case 140:{
_fireAlarmLive();
break;
}
case OperationCodes.PONG: {
//_firePONGReceivedEvent();
break;
}
case OperationCodes.PONG: {
//_firePONGReceivedEvent();
break;
}
case OperationCodes.CONNECTION_REP: {
_fireConnectionReplyEvent();
break;
}
case OperationCodes.CONNECTION_REP: {
_fireConnectionReplyEvent();
break;
}
case OperationCodes.CONTACTS_REP: {
sleep(15);
_fireContactsReceivedEvent();
break;
}
case OperationCodes.CONTACTS_REP: {
sleep(15);
_fireContactsReceivedEvent();
break;
}
case OperationCodes.TM_LIST_REP: {
_fireTextMessagesReceivedEvent();
break;
}
case OperationCodes.TM_LIST_REP: {
_fireTextMessagesReceivedEvent();
break;
}
case OperationCodes.RECORDINGS_LIST_REP: {
_fireRecordingsReceivedEvent();
break;
}
case OperationCodes.RECORDINGS_LIST_REP: {
_fireRecordingsReceivedEvent();
break;
}
case OperationCodes.RECORDING_REP: {
_fireRecordingPlayReceivedEvent();
break;
}
case OperationCodes.RECORDING_REP: {
_fireRecordingPlayReceivedEvent();
break;
}
default:
break;
default:
break;
}
}
catch(Exception ex)
{
try {
if(TCPhandler.msgList.size() > 0)
_msg = TCPhandler.msgList.remove(0);
}
catch(NoSuchElementException exe)
{
SM.Exception("TCP msg Parser", "NoSuchElementException");
}
}
}
}
}
catch(Exception ex) {
try {
if(TCPhandler.msgList.size() > 0)
_msg = TCPhandler.msgList.remove(0);
} catch(NoSuchElementException exe) {
SM.Exception("TCP msg Parser", "NoSuchElementException");
}
}
}
}
}
/*
catch (Exception e)
{
SM.Debug("Error on fire Event:"+e.toString());
break;
}
}*/
SM.Debug("TCPmsgParser listen thread stoped.");
}
private void sleep(int miliseconds) {
try {
Thread.sleep(miliseconds);
} catch (InterruptedException ignored) { }
} catch (InterruptedException e) {
}
}
public void clearMsgList()
@ -396,14 +442,17 @@ public class TCPmsgParser implements Runnable {
TCPhandler.msgList.clear();
}
public void Stop() {
public void Stop()
{
run = false;
// stop thread
if(TCPmsgParserThread != null) {
if(TCPmsgParserThread != null)
{
Thread moribund = TCPmsgParserThread;
TCPmsgParserThread = null;
moribund.interrupt();
}
SM.Debug("Stoping TCPmsgParser");
}
}
}

View File

@ -1,4 +1,15 @@
<?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"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
@ -63,17 +74,17 @@
android:id="@+id/tvTimeAgo"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignTop="@+id/time"
android:layout_alignBottom="@+id/time"
android:layout_alignTop="@+id/time"
android:layout_gravity="center_horizontal"
android:layout_toEndOf="@+id/time"
android:layout_toRightOf="@+id/time"
android:ellipsize="end"
android:gravity="center_vertical"
android:maxLines="1"
tools:text="a year ago [01:05:01]"
android:textColor="#ff000000"
android:textSize="10sp"
tools:text="a year ago [01:05:01]" />
android:textSize="10sp" />
<ImageView
android:id="@+id/speed"

View File

@ -78,4 +78,6 @@ dependencies {
// add Gson
implementation 'com.google.code.gson:gson:2.8.6'
//retrofit
}

View File

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

View File

@ -7,7 +7,6 @@
android:glEsVersion="0x00020000"
android:required="true" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.CAMERA" android:required="false"/>
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
@ -46,6 +45,7 @@
android:name="com.safemobile.safedispatch.SDMobileActivity"
android:configChanges="orientation"
android:exported="true"
android:label="@string/app_name_demo"
android:screenOrientation="landscape">
<intent-filter>
<action android:name="android.intent.action.MAIN" />

View File

@ -22,9 +22,8 @@ public class AudioHandle implements Runnable{
private DataOutputStream outData =null;
private Thread t_micListner;
private UDPclient udp;
private TcpAudioClient tcp;
private TCPaudioClient tcp;
private int audioport = 50001;
public int typeUDP;
public AudioHandle(String IP, int _typeUDP)
@ -57,7 +56,7 @@ public class AudioHandle implements Runnable{
else
{
try {
tcp = new TcpAudioClient(IP,audioport);
tcp = new TCPaudioClient(IP,audioport);
bufferSize = AudioTrack.getMinBufferSize(SAMPLE_RATE, AudioFormat.CHANNEL_OUT_MONO, AudioFormat.ENCODING_PCM_16BIT);
@ -90,7 +89,7 @@ public class AudioHandle implements Runnable{
t_micListner.start();
if(typeUDP == 1)
if(typeUDP==1)
{
udp.addUDPListener(new IUDPListener()
{
@ -100,7 +99,7 @@ public class AudioHandle implements Runnable{
byte[] data = event.data();
int len = event.len();
SM.Debug("recv b:"+len+" data.length:"+data.length);
if(data != null)
if(data!=null)
PlaySound(data, len);
}
@ -142,23 +141,21 @@ public class AudioHandle implements Runnable{
if (soundNeeded)
{
//SM.Debug("sending b:"+bRead);
if(typeUDP == 1)
{
int size = 512; // 2048
tempBuffer = new byte[size];
bRead = recDev.read(tempBuffer, 0, size);
if(typeUDP==1)
{
tempBuffer = new byte[512];//128];//invers3.bufferSize];
bRead = recDev.read(tempBuffer, 0, 512);// 128);//invers3.bufferSize);
udp.Send(tempBuffer,bRead);
SM.Debug("UDP sending b:"+bRead);
}
else
{
int size = 1024; //
tempBuffer = new byte[size];
bRead = recDev.read(tempBuffer, 0, size);
tcp.send(tempBuffer,bRead);
tempBuffer = new byte[2048];//128];//invers3.bufferSize];
bRead = recDev.read(tempBuffer, 0, 2048);// 128);//invers3.bufferSize);
/*
tempBuffer = new byte[16384];//128];//invers3.bufferSize];
bRead = recDev.read(tempBuffer, 0,16384);// 128);//invers3.bufferSize);*/
tcp.Send(tempBuffer,bRead);
SM.Debug("TCP sending b:"+bRead);
}
}

View File

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

View File

@ -0,0 +1,195 @@
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

@ -1,173 +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.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 String serverHostname = new String ("10.120.1.114");//
private int UDP_SERVER_PORT_IN = 50003;
private int UDP_SERVER_PORT_IN = 50002;
private int UDP_SERVER_PORT_OUT = 50001;
private DatagramSocket ds = null;
private Thread listenThread;

View File

@ -66,7 +66,6 @@ public class AlarmActivity extends Activity {
setContentView(R.layout.tabalarm);
gridView = findViewById(R.id.gridViewAlarms);
gridView.setNestedScrollingEnabled(true);
adapter = new AlertGridViewAdapter(this, getAllAlarms(), context, acknowledged);
gridView.setAdapter(adapter);
@ -129,12 +128,9 @@ public class AlarmActivity extends Activity {
setConvertViewAlarm(arg1);
// save position
ackPosition = position;
if (!AppParams.DEMO) {
getParentTab().getAlarms(AppParams.USERID);
if (!AppParams.DEMO)
setACK(getAllAlarms().get(position).idx, getAllAlarms().get(position).type, getAllAlarms().get(position).unitName);
acknowledged.set(position, true);
updateResultsInUi(ALARM);
} else {
else {
getAllAlarms().get(position).ack = 1;
updateResultsInUi("else");
}
@ -172,10 +168,7 @@ public class AlarmActivity extends Activity {
if (param.equals(ALARM)) {
// set adapter
adapter = new AlertGridViewAdapter(this, getAllAlarms(), context, acknowledged);
int position = gridView.getFirstVisiblePosition();
gridView.setAdapter(adapter);
gridView.setSelection(position);
} else {
adapter.changeACK(ackPosition);
SM.Debug("Set ACK: " + ackPosition + " | " + (Boolean.TRUE.equals(acknowledged.get(ackPosition)) ? "true" : "false"));

View File

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

View File

@ -3,7 +3,6 @@ package com.safemobile.safedispatch;
import androidx.annotation.NonNull;
import androidx.appcompat.app.AppCompatActivity;
import android.app.AlertDialog;
import android.app.DatePickerDialog;
import android.app.Dialog;
import android.graphics.Color;
@ -11,11 +10,9 @@ import android.graphics.drawable.ColorDrawable;
import android.os.Bundle;
import android.os.Handler;
import android.util.Log;
import android.view.View;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.Spinner;
import android.widget.TextView;
@ -54,7 +51,6 @@ public class HistoryActivity extends AppCompatActivity implements OnMapReadyCall
private final ArrayList<Vehicle> allVehicle = new ArrayList<>();
private final ArrayList<String> allVehicleNames = new ArrayList<>();
private final SimpleDateFormat sdf = new SimpleDateFormat("MMMM dd yyyy");
private boolean showVehicles = true;
@Override
@ -103,46 +99,9 @@ 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();
}
public void setLanguage() {
TextView labelVehicle = findViewById(R.id.labelVehicle);
TextView labelStartDate = findViewById(R.id.labelStartDate);
TextView labelEndDate = findViewById(R.id.labelEndDate);
labelVehicle.setText(R.string.vehicle);
labelStartDate.setText(R.string.startDate);
labelEndDate.setText(R.string.endDate);
displayButton.setText(R.string.display);
}
private void displayHistory(ArrayList<HistPos> positions) {
LatLng latLng = null;
PolylineOptions polylineOptions = new PolylineOptions();
@ -165,23 +124,10 @@ public class HistoryActivity extends AppCompatActivity implements OnMapReadyCall
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() {
Calendar calendar = Calendar.getInstance();
calendar.add(Calendar.DATE, 1);
endDate = calendar.getTime();
calendar.add(Calendar.DATE, -2);
calendar.add(Calendar.DATE, -1);
startDate = calendar.getTime();
TextView textViewStartDate = findViewById(R.id.textViewStartDate);
@ -288,8 +234,8 @@ public class HistoryActivity extends AppCompatActivity implements OnMapReadyCall
infoBubble = new GoogleMapsInfoBubble(getLayoutInflater(), this);
this.googleMap.setInfoWindowAdapter(infoBubble);
this.googleMap.getUiSettings().setMapToolbarEnabled(false);
parentTab.demoPositionsList();
displayButton.performClick();
}
}

View File

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

View File

@ -10,7 +10,6 @@ import android.graphics.Typeface;
import android.os.Bundle;
import android.os.Handler;
import android.os.Looper;
import android.util.Log;
import android.view.View;
import android.widget.ArrayAdapter;
import android.widget.Button;
@ -46,7 +45,6 @@ public class MessagesActivity extends Activity {
/**
* Called when the activity is first created.
*/
private final String TAG = "MessagesActivity";
private MessagesGridViewAdapter mAdapter;
private ConversationGridViewAdapter convAdapter;
@ -126,6 +124,16 @@ public class MessagesActivity extends Activity {
textViewSelectedContact = findViewById(R.id.textViewSelectedContact);
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
TextView textView1 = findViewById(R.id.textView1);
textView1.setTypeface(Typeface.createFromAsset(getAssets(), "Sketch_Block.ttf"));
@ -140,7 +148,6 @@ public class MessagesActivity extends Activity {
// Implement On Item click listener
gridView.setOnItemClickListener((arg0, arg1, position, arg3) -> {
Log.v(TAG, "onItemClick " + LASTMESSAGES);
if (LASTMESSAGES) {
// get position
Msg item = mAdapter.getItem(position);
@ -170,8 +177,6 @@ public class MessagesActivity extends Activity {
// button send message
imageButtonSend = findViewById(R.id.imageButtonSend);
imageButtonSend.setOnClickListener(v -> {
if (editTextMsg.getText().toString().isEmpty())
return;
sendSMS(getScId(), editTextMsg.getText().toString());
Toast.makeText(context, "Sending message...", Toast.LENGTH_SHORT).show();
// disable send button and editBox
@ -199,7 +204,6 @@ public class MessagesActivity extends Activity {
imageButtonBack.setOnClickListener(v -> {
// set LastMessage conversation type
LASTMESSAGES = true;
Log.v(TAG, "lastmessages: true");
// refresh Grid
getLastSMS();
if (AppParams.DEMO)
@ -392,7 +396,6 @@ public class MessagesActivity extends Activity {
listLastMessages.add(new Msg(sentVehicle, txt, Calendar.getInstance().getTime(), sendSMSSeqID));
}
SM.Debug("time: " + timeGMT + " | " + Calendar.getInstance().getTime());
Log.v(TAG, "lastmessages: false");
LASTMESSAGES = false;
updateResultsInUi();
@ -632,7 +635,6 @@ public class MessagesActivity extends Activity {
setScId(item.sc_id);
SM.Debug("Selected scId: " + getScId());
// set Conversation type
Log.v(TAG, "lastmessages: false");
LASTMESSAGES = false;
// call get SMS
getSMS4unit(getScId());

View File

@ -16,22 +16,17 @@ public class NotificationActivity extends Activity{
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// get notification type
int key = getIntent().getExtras().getInt("key");
// get notification type
int key = getIntent().getExtras().getInt("key");
// broadcast intent
Intent i = new Intent();
switch(key) {
case AppParams.messageNotif:
i.setAction(NOTIFICATION_MESSAGE_INTENT);
break;
case AppParams.alertNotif:
i.setAction(NOTIFICATION_ALERT_INTENT);
break;
case AppParams.pollNotif:
i.setAction(NOTIFICATION_POLL_INTENT);
break;
}
Intent i = new Intent();
switch(key)
{
case AppParams.messageNotif: i.setAction(NOTIFICATION_MESSAGE_INTENT); break;
case AppParams.alertNotif: i.setAction(NOTIFICATION_ALERT_INTENT); break;
case AppParams.pollNotif: i.setAction(NOTIFICATION_POLL_INTENT); break;
}
getBaseContext().sendBroadcast(i);
@ -40,4 +35,6 @@ public class NotificationActivity extends Activity{
/* Finish activity and return to parent activity */
finish();
}
}
}

View File

@ -2,8 +2,10 @@ package com.safemobile.safedispatch;
import android.app.Activity;
import android.app.AlertDialog;
import android.app.Dialog;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.content.IntentFilter;
import android.content.res.AssetFileDescriptor;
@ -12,12 +14,13 @@ import android.graphics.Typeface;
import android.media.MediaPlayer;
import android.os.Bundle;
import android.os.Handler;
import android.os.Looper;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.ArrayAdapter;
import android.widget.GridView;
import android.widget.ImageView;
import android.widget.TextView;
import android.widget.Toast;
@ -26,7 +29,6 @@ import com.safemobile.lib.AppParams;
import com.safemobile.lib.OperationCodes;
import com.safemobile.lib.Recording;
import com.safemobile.lib.SM;
import com.safemobile.lib.Vehicle;
import com.safemobile.lib.radio.RadioGW;
import com.safemobile.lib.sound.RecordingHandle;
@ -34,374 +36,376 @@ import java.io.IOException;
import java.util.ArrayList;
import java.util.Locale;
/**
* fix import
*/
public class RecordingsActivity extends Activity {
private Context context;
private Activity activity;
private TabLayoutActivity parentTab;
private ArrayList<Recording> allRecordings = new ArrayList<>();
private ArrayList<Boolean> playingPositions = new ArrayList<>();
private GridView gridView;
public TabLayoutActivity parentTab;
public ArrayList<Recording> allRecordings = new ArrayList<Recording>();
private ArrayList<Boolean> playingPositions = new ArrayList<Boolean>();
private ArrayList<String> allGWsIP = new ArrayList<String>();
private GridView gridView;
private RecordingsGridViewAdapter adapter;
private View convertViewRecording;
private boolean isRecordingPlaying = false;
private int playingPosition = -1;
public View convertViewRecording;
public int playingPosition = -1;
// Need handler for callbacks to the UI thread
private final Handler myHandler = new Handler(Looper.getMainLooper());
private final ArrayList<String> allGWsIP = new ArrayList<>();
private final Handler myHandler = new Handler();
//recoding TCP and audio
private RecordingHandle recHandle = null;
/* Dialog */
private TextView textViewCount, textViewGateway;
public Bundle savedInstanceState;
/** Called when the activity is first created. */
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
this.savedInstanceState = savedInstanceState;
// get parentTab
parentTab = (TabLayoutActivity)getParent();
Locale locale = new Locale(AppParams.LANGUAGETMP);
Locale.setDefault(locale);
Configuration config = new Configuration();
config.locale = locale;
getBaseContext().getResources().updateConfiguration(config,
getBaseContext().getResources().getDisplayMetrics());
setContentView(R.layout.tabrecordings);
//recoding TCP and audio
private RecordingHandle recHandle = null;
// get context
context = this;
activity = this;
// change tab header fontface
TextView textView1 = (TextView) findViewById(R.id.textViewTitle);
textView1.setTypeface(Typeface.createFromAsset(getAssets(), "Sketch_Block.ttf"));
textView1.setTextSize(24);
gridView = (GridView) findViewById(R.id.gridViewRecordings);
adapter = new RecordingsGridViewAdapter(activity, context, allRecordings, playingPositions);
gridView.setAdapter(adapter);
gridView.setOnItemClickListener(onItemClickListener);
if(recHandle == null && !AppParams.DEMO)
recHandle = new RecordingHandle(AppParams.IP);
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.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
allGWsIP.clear();
for(RadioGW radio: AppParams.listRadios)
allGWsIP.add(radio.IP);
ArrayAdapter<String> adapter = new ArrayAdapter<String>(context, R.layout.template_simple_list_item,
allGWsIP);
/* Dialog */
private TextView textViewCount;
private TextView textViewGateway;
private Bundle savedInstanceState;
/**
* Called when the activity is first created.
*/
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
this.setSavedInstanceState(savedInstanceState);
setParentTab((TabLayoutActivity) getParent());
Locale locale = new Locale(AppParams.LANGUAGETMP);
Locale.setDefault(locale);
Configuration config = new Configuration();
config.locale = locale;
getBaseContext().getResources().updateConfiguration(config, getBaseContext().getResources().getDisplayMetrics());
setContentView(R.layout.tabrecordings);
// get context
context = this;
activity = this;
// change tab header fontFace
TextView textView1 = findViewById(R.id.textViewTitle);
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);
gridView.setOnItemClickListener(onItemClickListener);
gridView.setOnTouchListener((v, event) -> isRecordingPlaying);
if (recHandle == null && !AppParams.DEMO)
recHandle = new RecordingHandle(AppParams.IP);
textViewCount = findViewById(R.id.textViewCount);
updateNumberOfRecordings();
textViewGateway = findViewById(R.id.textViewGateway);
textViewGateway.setTypeface(Typeface.createFromAsset(getAssets(), "Sketch_Block.ttf"));
textViewGateway.setTextSize(24);
textViewGateway.setOnClickListener(v -> {
allGWsIP.clear();
for (RadioGW radio : AppParams.listRadios)
allGWsIP.add(radio.IP);
ArrayAdapter<String> adapter = new ArrayAdapter<>(context, R.layout.template_simple_list_item,
allGWsIP);
AlertDialog.Builder builder = new AlertDialog.Builder(
context);
builder.setTitle("Select RadioGW");
builder.setAdapter(adapter,
(dialog, which) -> {
// change gateway
textViewGateway.setText(allGWsIP.get(which));
Toast.makeText(context, getString(R.string.loadingRecordings), Toast.LENGTH_SHORT).show();
getRecordings(getParentTab().getAllRadios().get(which).GW_ID, getParentTab().getAllRadios().get(which).ID);
});
AlertDialog alert = builder.create();
alert.show();
AlertDialog.Builder builder = new AlertDialog.Builder(
context);
builder.setTitle("Select RadioGW");
builder.setAdapter(adapter,
new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
// change gateway
textViewGateway.setText(allGWsIP.get(which));
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();
}
});
textViewGateway.setVisibility(View.INVISIBLE);
parentTab.setRecordingsActivity(this);
// register to receive broadcasts
registerBroadcastIntents();
}
@Override
public void onBackPressed()
{
AlertDialog.Builder builder = new AlertDialog.Builder(this);
builder.setMessage(getString(R.string.exit))
.setCancelable(false)
.setNeutralButton(getString(R.string.logout), new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int id) {
parentTab.whenBackPressed(AppParams.ActivityResult.logout);
}
})
.setPositiveButton(getString(R.string.ext), new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int id) {
parentTab.whenBackPressed(AppParams.ActivityResult.exit);
}
})
.setNegativeButton(getString(R.string.cancel), new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int id) {
dialog.cancel();
}
});
AlertDialog alert = builder.create();
alert.show();
}
/** Update the number of recordings displayed on the top layout */
private void updateNumberOfRecordings() {
textViewCount.setText("[" + AppParams.recordings.size() + "]");
}
public void showDialog(String errorMsg)
{
Dialog dialog = new Dialog(context);
dialog.setContentView(R.layout.dialog);
dialog.setTitle("Message");
dialog.setCancelable(true);
dialog.setCanceledOnTouchOutside(true);
getParentTab().setRecordingsActivity(this);
// register to receive broadcasts
registerBroadcastIntents();
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 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();
}
/**
* Update the number of recordings displayed on the top layout
*/
private void updateNumberOfRecordings() {
textViewCount.setText("[" + AppParams.recordings.size() + "]");
}
@Override
public void onPause() {
super.onPause();
SM.Debug("onPause");
}
@Override
public void onResume() {
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);
if (getPlayingPosition() < 0 && getParentTab().getCrtRadio() != null) {
SM.Debug("getRecordings resume + crtRadio:" + getParentTab().getCrtRadio().toString());
getRecordings(getParentTab().getCrtRadio().GW_ID, getParentTab().getCrtRadio().ID);
}
}
SM.Debug("onResume");
}
private final OnItemClickListener onItemClickListener = new OnItemClickListener() {
@Override
public void onPause()
{
super.onPause();
SM.Debug("onPause");
}
@Override
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
public void onItemClick(AdapterView<?> arg0, View view, int position, long arg3) {
// disable grid scrolling and item click
if (isRecordingPlaying)
return;
isRecordingPlaying = true;
setConvertViewRecording(view);
// disable grid scrolling and item click
gridView.setEnabled(false);
convertViewRecording = view;
// change background to playing
adapter.changePlaying(position, true);
// if no recording is playing and not DEMO
if (getPlayingPosition() < 0 && !AppParams.DEMO) {
if(playingPosition<0 && !AppParams.DEMO)
{
// send recording request to App Server
sendPlayRequest(getAllRecordings().get(position).id);
SendPlayRequest(allRecordings.get(position).ID);
// flag that sound is needed
recHandle.startSound();
recHandle.setSoundNeeded(true);
recHandle.StartSound();
recHandle.soundNeeded = true;
}
// no recording is playing and DEMO
else if (getPlayingPosition() < 0 && AppParams.DEMO) {
else if(playingPosition<0 && AppParams.DEMO)
{
// create player which will play demo recordings
MediaPlayer player = new MediaPlayer();
AssetFileDescriptor assetFileDescriptor = null;
AssetFileDescriptor afd;
try {
switch (position) {
case 1:
assetFileDescriptor = getAssets().openFd("startwindows.mp3");
break;
case 2:
assetFileDescriptor = getAssets().openFd("exitwindows.mp3");
break;
default:
assetFileDescriptor = getAssets().openFd("mike.mp3");
break;
}
player.setDataSource(assetFileDescriptor.getFileDescriptor(), assetFileDescriptor.getStartOffset(), assetFileDescriptor.getLength());
switch(position)
{
case 1: afd = getAssets().openFd("startwindows.mp3"); break;
case 2: afd = getAssets().openFd("exitwindows.mp3"); break;
default : afd = getAssets().openFd("mike.mp3"); break;
};
player.setDataSource(afd.getFileDescriptor(),afd.getStartOffset(),afd.getLength());
player.prepare();
player.start();
player.start();
} catch (IOException e) {
e.printStackTrace();
} finally {
if(assetFileDescriptor != null) {
try {
assetFileDescriptor.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
} catch (IOException e) { }
}
// save playing position
setPlayingPosition(position);
playingPosition = position;
// start the timer which will reset the UI to 'no recording playing'
startRecordingStopperTimer(getAllRecordings().get(getPlayingPosition()).endGMT - getAllRecordings().get(getPlayingPosition()).startGMT);
startRecordingStoperTimer(allRecordings.get(playingPosition).endGMT - allRecordings.get(playingPosition).startGMT);
}
/**
* create Timer which will stop the recording after a specific time
*/
private void startRecordingStopperTimer(final int seconds) {
new Thread(() -> {
};
/** create Timer which will stop the recording after a specific time */
private void startRecordingStoperTimer(final int seconds) {
new Thread(new Runnable() {
@Override
public void run() {
// sleep for at least 1 second
final int ms = (seconds > 1 ? seconds * 1000 : 1000);
final int ms = (seconds > 1 ? seconds * 1000 : 1000);
// sleep for amount of time
try {
Thread.sleep(ms);
} catch (InterruptedException e) {
e.printStackTrace();
Thread.currentThread().interrupt();
}
}
// modify the UI after the recording is done playing
myHandler.post(stopRecordingRUN);
}).start();
}
};
// Create runnable for posting
final Runnable stopRecordingRUN = this::updateStopRecording;
private void updateStopRecording() {
// change playing icon
adapter.changePlaying(getPlayingPosition(), false);
// enable grid
isRecordingPlaying = false;
// set playing Recording position to -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);
}
// playRecording received from AppServer
public void playRecording(long id) {
// change adapter image
}
// Create runnable for posting
final Runnable updateResultsRUN = this::updateResultsInUi;
private void updateResultsInUi() {
// clear played items
playingPositions = new ArrayList<>();
ArrayList<Recording> recordings = getAllRecordings();
ArrayList<Recording> filteredList = new ArrayList<>();
ArrayList<Vehicle> vehicles = getParentTab().getAllVehicle();
for (Recording recording : recordings) {
if (recording.callType == 0 || recording.callType == 4) {
for (Vehicle vehicle : vehicles)
if (vehicle.imei.equals(String.valueOf(recording.subID))) {
filteredList.add(recording);
break;
}
} else {
filteredList.add(recording);
}
}
}).start();
}
// Create runnable for posting
final Runnable stopRecordingRUN = new Runnable() {
@Override
public void run() {
updateStopRecording();
}
};
private void updateStopRecording()
{
// change playing icon
adapter.changePlaying(playingPosition, false);
// enable grid
gridView.setEnabled(true);
// set playing Recording position to -1
playingPosition = -1;
}
// Update Recordings received from AppServer
public void UpdateRecordings(ArrayList<Recording> list)
{
//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);
}
// PlayRecording received from AppServer
public void PlayRecording(long id)
{
// change adapter image
}
// Create runnable for posting
final Runnable UpdateResultsRUN = new Runnable() {
public void run() {
updateResultsInUi();
}
};
setAllRecordings(filteredList);
for (int i = 0; i < getAllRecordings().size(); i++)
private void updateResultsInUi()
{
// clear played items
playingPositions = new ArrayList<Boolean>();
for(int i=0; i<allRecordings.size(); i++)
playingPositions.add(true);
adapter = new RecordingsGridViewAdapter(activity, getAllRecordings(), playingPositions);
// set adapter - where playingPositions stores exists values
adapter = new RecordingsGridViewAdapter(activity, context, allRecordings, playingPositions);
// playing positions need to be false because no recording is played
playingPositions.clear();
for (int i = 0; i < getAllRecordings().size(); i++)
for(int i=0; i<allRecordings.size(); i++)
playingPositions.add(false);
updateNumberOfRecordings();
gridView.setAdapter(adapter);
gridView.setAdapter(adapter);
}
// send
private void getRecordings(int radioGWID, int radioID) {
getParentTab().getRecordings(radioGWID, radioID);
}
public void sendPlayRequest(long recordId) {
getParentTab().sendPlayRecordingRequest(recordId);
}
/**
* Register for broadcasts
*/
private void registerBroadcastIntents() {
IntentFilter intentFilter = new IntentFilter(OperationCodes.RECORDINGS_LIST_REP + "");
// send
private void GetRecordings(int radioGWID, int radioID)
{
parentTab.getRecordings(radioGWID, radioID);
}
public void SendPlayRequest(long record_id)
{
parentTab.sendPlayRecordingRequest(record_id);
}
/** Register for broadcasts */
private void registerBroadcastIntents() {
IntentFilter intentFilter = new IntentFilter(OperationCodes.RECORDINGS_LIST_REP+"");
this.registerReceiver(mReceiver, intentFilter);
intentFilter = new IntentFilter(OperationCodes.RADIOID_CHANGED + "");
intentFilter = new IntentFilter(OperationCodes.RADIOID_CHANGED+"");
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) {
//SM.Debug("### NOTIFICATION ###", "Radio: " + intent.getAction());
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(parentTab.getCrtRadio().IP);
GetRecordings(parentTab.getCrtRadio().GW_ID, parentTab.getCrtRadio().ID);
}
}
};
}
//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);
}
}
};
public TabLayoutActivity getParentTab() {
return parentTab;
}
public void setParentTab(TabLayoutActivity parentTab) {
this.parentTab = parentTab;
}
public ArrayList<Recording> getAllRecordings() {
return allRecordings;
}
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,19 +10,13 @@ import android.content.ServiceConnection;
import android.content.SharedPreferences;
import android.content.res.Configuration;
import android.graphics.Color;
import android.net.ConnectivityManager;
import android.net.Network;
import android.net.NetworkCapabilities;
import android.net.NetworkRequest;
import android.os.AsyncTask;
import android.os.Build;
import android.os.Bundle;
import android.os.Handler;
import android.os.IBinder;
import android.os.Looper;
import android.text.Editable;
import android.text.InputType;
import android.util.Log;
import android.view.Gravity;
import android.view.View;
import android.view.View.OnClickListener;
@ -120,17 +114,6 @@ public class SDMobileActivity extends Activity {
super.onCreate(savedInstanceState);
SM.Debug("##### onCREATE ##### with LANGUAGE " + AppParams.LANGUAGETMP);
ConnectivityManager connectivityManager =
(ConnectivityManager) this.getSystemService(Context.CONNECTIVITY_SERVICE);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N)
connectivityManager.registerDefaultNetworkCallback(networkCallback);
else {
NetworkRequest request = new NetworkRequest.Builder()
.addCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET).build();
connectivityManager.registerNetworkCallback(request, networkCallback);
}
AppParams.theme = AppParams.Theme.SAFEDISPATCH;
if (AppParams.theme == AppParams.Theme.SAFENET)
this.setTheme(R.style.Theme_Safenet);
@ -182,16 +165,37 @@ public class SDMobileActivity extends Activity {
ImageView imageLoading = (ImageView) findViewById(R.id.imageLoading);
imageLoading.setBackgroundResource(R.drawable.loading);
// language
imageLanguage = (ImageView) findViewById(R.id.imageLanguage);
imageLanguage.setOnClickListener(LanguageListener);
setLanguageIcon();
// username and password
// change spinner icon and selected language according to tmpLanguage
switch (AppParams.LANGUAGETMP) {
case "en":
imageLanguage.setImageResource(R.drawable.en);
break;
case "de":
imageLanguage.setImageResource(R.drawable.de);
break;
case "tr":
imageLanguage.setImageResource(R.drawable.tr);
break;
case "ro":
imageLanguage.setImageResource(R.drawable.ro);
break;
case "es":
imageLanguage.setImageResource(R.drawable.es);
break;
case "ru":
imageLanguage.setImageResource(R.drawable.ru);
break;
default:
throw new IllegalStateException("Unexpected value: " + AppParams.LANGUAGETMP);
}
imageLanguage.setOnClickListener(LanguageListener);
etUsername = (EditText) findViewById(R.id.etUsername);
etPassword = (EditText) findViewById(R.id.etPassword);
// login button
btLogin = (Button) findViewById(R.id.btLogin);
btLogin.setOnClickListener(arg0 -> {
@ -283,35 +287,6 @@ public class SDMobileActivity extends Activity {
}
}
private void setLanguageIcon()
{
// change spinner icon and selected language according to tmpLanguage
switch (AppParams.LANGUAGETMP) {
case "en":
imageLanguage.setImageResource(R.drawable.en);
break;
case "de":
imageLanguage.setImageResource(R.drawable.de);
break;
case "tr":
imageLanguage.setImageResource(R.drawable.tr);
break;
case "ro":
imageLanguage.setImageResource(R.drawable.ro);
break;
case "es":
imageLanguage.setImageResource(R.drawable.es);
break;
case "ru":
imageLanguage.setImageResource(R.drawable.ru);
break;
default:
throw new IllegalStateException("Unexpected value: " + AppParams.LANGUAGETMP);
}
}
@Override
public void onBackPressed() {
if (loadingDialog.isShowing())
@ -549,21 +524,6 @@ public class SDMobileActivity extends Activity {
SM.Debug("##### onRESUME #####");
}
private final ConnectivityManager.NetworkCallback networkCallback = new ConnectivityManager.NetworkCallback() {
@Override
public void onAvailable(Network network) {
// network available
Log.v("NetworkAvailability", "available");
if (tcp != null && !tcp.isConnectionUP)
saveIPandRestartTCP(AppParams.IP, AppParams.PORT);
}
@Override
public void onLost(Network network) {
// network unavailable
Log.v("NetworkAvailability", "unavailable");
}
};
private void startTabActivity(long userID) {
// good login - load activity

View File

@ -2,13 +2,16 @@ package com.safemobile.safedispatch;
import java.util.Locale;
/** fix import */
import com.safemobile.adapters.LanguageSpinnerAdapter;
import com.safemobile.lib.AppParams;
import com.safemobile.lib.SM;
import android.app.Activity;
import android.app.AlertDialog;
import android.app.Dialog;
import android.content.Context;
import android.content.DialogInterface;
import android.content.SharedPreferences;
import android.content.res.Configuration;
import android.os.Bundle;
@ -70,49 +73,52 @@ public class SetupActivity extends Activity {
setContentView(R.layout.tabsetup);
layoutSpinnerLanguage = findViewById(R.id.layoutSpinnerLanguage);
layoutSpinnerLanguage = (LinearLayout) findViewById(R.id.layoutSpinnerLanguage);
layoutSpinnerLanguage.setOnClickListener(LanguageListener);
imageLanguage = findViewById(R.id.imageLanguage);
textViewSpinnerLanguage = findViewById(R.id.textViewSpinnerLanguage);
imageLanguage = (ImageView) findViewById(R.id.imageLanguage);
textViewSpinnerLanguage = (TextView) findViewById(R.id.textViewSpinnerLanguage);
// change spinner icon and selected language according to tmpLanguage
switch (AppParams.LANGUAGETMP) {
case "en":
imageLanguage.setImageResource(R.drawable.en);
textViewSpinnerLanguage.setText(getString(R.string.en));
break;
case "de":
imageLanguage.setImageResource(R.drawable.de);
textViewSpinnerLanguage.setText(getString(R.string.de));
break;
case "tr":
imageLanguage.setImageResource(R.drawable.tr);
textViewSpinnerLanguage.setText(getString(R.string.tr));
break;
case "ro":
imageLanguage.setImageResource(R.drawable.ro);
textViewSpinnerLanguage.setText(getString(R.string.ro));
break;
case "es":
imageLanguage.setImageResource(R.drawable.es);
textViewSpinnerLanguage.setText(getString(R.string.es));
break;
case "ru":
imageLanguage.setImageResource(R.drawable.ru);
textViewSpinnerLanguage.setText(getString(R.string.ru));
break;
if (AppParams.LANGUAGETMP.equals("en")){
imageLanguage.setImageResource(R.drawable.en);
textViewSpinnerLanguage.setText(getString(R.string.en));
}
else if (AppParams.LANGUAGETMP.equals("de")){
imageLanguage.setImageResource(R.drawable.de);
textViewSpinnerLanguage.setText(getString(R.string.de));
}
else if (AppParams.LANGUAGETMP.equals("tr")){
imageLanguage.setImageResource(R.drawable.tr);
textViewSpinnerLanguage.setText(getString(R.string.tr));
}
else if (AppParams.LANGUAGETMP.equals("ro")){
imageLanguage.setImageResource(R.drawable.ro);
textViewSpinnerLanguage.setText(getString(R.string.ro));
}
else if(AppParams.LANGUAGETMP.equals("es")){
imageLanguage.setImageResource(R.drawable.es);
textViewSpinnerLanguage.setText(getString(R.string.es));
}
else if(AppParams.LANGUAGETMP.equals("ru")){
imageLanguage.setImageResource(R.drawable.ru);
textViewSpinnerLanguage.setText(getString(R.string.ru));
}
// get visual elements
appServerIP = findViewById(R.id.appServerIP);
appServerPort = findViewById(R.id.appServerPort);
appServerIP = (EditText) findViewById(R.id.appServerIP);
appServerPort = (EditText) findViewById(R.id.appServerPort);
// hide path layout used only on Pad/Pod
layoutPath = findViewById(R.id.layoutPath);
layoutPath = (LinearLayout) findViewById(R.id.layoutPath);
layoutPath.setVisibility(View.GONE);
btn_save = findViewById(R.id.btn_save);
btn_save = (Button) findViewById(R.id.btn_save);
btn_save.setOnClickListener(v -> saveSettings());
btn_save.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
saveSettings();
}
});
// set values
if(!AppParams.IP.equals("n/a"))
@ -128,31 +134,46 @@ public class SetupActivity extends Activity {
AlertDialog.Builder builder = new AlertDialog.Builder(this);
builder.setMessage(getString(R.string.exit))
.setCancelable(false)
.setNeutralButton(getString(R.string.logout), (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());
.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();
}
// listener when select language pressed
private final OnClickListener LanguageListener = new OnClickListener() {
private OnClickListener LanguageListener = new OnClickListener() {
@Override
public void onClick(View v) {
final LanguageSpinnerAdapter adapter = new LanguageSpinnerAdapter(context, android.R.layout.simple_spinner_item, Languages, getLayoutInflater());
AlertDialog.Builder builder = new AlertDialog.Builder(context);
builder.setTitle(getString(R.string.selLanguage));
builder.setAdapter(adapter , (dialog, which) -> {
textViewSpinnerLanguage.setText(adapter.getItem(which));
switch(which)
{
case 0: imageLanguage.setImageResource(R.drawable.en); AppParams.LANGUAGETMP = "en"; onCreate(savedInstanceState); parentTab.changeLanguage(); break;
case 1: imageLanguage.setImageResource(R.drawable.de); AppParams.LANGUAGETMP = "de"; onCreate(savedInstanceState); parentTab.changeLanguage(); break;
case 2: imageLanguage.setImageResource(R.drawable.tr); AppParams.LANGUAGETMP = "tr"; onCreate(savedInstanceState); parentTab.changeLanguage(); break;
case 3: imageLanguage.setImageResource(R.drawable.ro); AppParams.LANGUAGETMP = "ro"; onCreate(savedInstanceState); parentTab.changeLanguage(); break;
case 4: imageLanguage.setImageResource(R.drawable.ru); AppParams.LANGUAGETMP = "ru"; onCreate(savedInstanceState); parentTab.changeLanguage(); break;
case 5: imageLanguage.setImageResource(R.drawable.es); AppParams.LANGUAGETMP = "es"; onCreate(savedInstanceState); parentTab.changeLanguage(); break;
builder.setAdapter(adapter , new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
textViewSpinnerLanguage.setText(adapter.getItem(which));
switch(which)
{
case 0: imageLanguage.setImageResource(R.drawable.en); AppParams.LANGUAGETMP = "en"; onCreate(savedInstanceState); parentTab.changeLanguage(); break;
case 1: imageLanguage.setImageResource(R.drawable.de); AppParams.LANGUAGETMP = "de"; onCreate(savedInstanceState); parentTab.changeLanguage(); break;
case 2: imageLanguage.setImageResource(R.drawable.tr); AppParams.LANGUAGETMP = "tr"; onCreate(savedInstanceState); parentTab.changeLanguage(); break;
case 3: imageLanguage.setImageResource(R.drawable.ro); AppParams.LANGUAGETMP = "ro"; onCreate(savedInstanceState); parentTab.changeLanguage(); break;
case 4: imageLanguage.setImageResource(R.drawable.ru); AppParams.LANGUAGETMP = "ru"; onCreate(savedInstanceState); parentTab.changeLanguage(); break;
case 5: imageLanguage.setImageResource(R.drawable.es); AppParams.LANGUAGETMP = "es"; onCreate(savedInstanceState); parentTab.changeLanguage(); break;
}
}
});
@ -194,12 +215,12 @@ public class SetupActivity extends Activity {
String oldIP = AppParams.IP;
String oldPort = AppParams.PORT;
editor.putString("ip", appServerIP.getText().toString());
editor.putString("port", appServerPort.getText().toString());
editor.putString("language", AppParams.LANGUAGETMP);
boolean result = editor.commit();
editor.putString("ip", appServerIP.getText().toString());
editor.putString("port", appServerPort.getText().toString());
editor.putString("language", AppParams.LANGUAGETMP);
Boolean result = editor.commit();
// saved completed
if (result)
if(result)
Toast.makeText(context, "Settings saved successfully.", Toast.LENGTH_LONG).show();
else
Toast.makeText(context, "Settings failed to complete!", Toast.LENGTH_LONG).show();
@ -244,4 +265,31 @@ public class SetupActivity extends Activity {
//showDialog(result);
}
public void showDialog(Boolean result)
{
Dialog dialog = new Dialog(context);
if(result)
dialog.setTitle("Save Completed");
else
dialog.setTitle("Save Failed");
dialog.setContentView(R.layout.dialog);
dialog.setCancelable(true);
dialog.setCanceledOnTouchOutside(true);
TextView text = (TextView) dialog.findViewById(R.id.text);
ImageView image = (ImageView) dialog.findViewById(R.id.image);
if(result)
{
image.setImageResource(R.drawable.error);
text.setText("Settings saved successfully.");
}
else
{
image.setImageResource(R.drawable.error);
text.setText("Settings failed to complete!");
}
dialog.show();
}
}

View File

@ -88,9 +88,7 @@
</LinearLayout>
</LinearLayout>
</LinearLayout>
<RelativeLayout
android:id="@+id/layoutNewMessage"
android:layout_width="350dp"
@ -115,7 +113,7 @@
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="vertical"
android:padding="3dp">
android:padding="3dp">
<TextView
android:id="@+id/slideTabsText"

View File

@ -166,7 +166,7 @@
<GridView
android:id="@+id/gridView1"
android:layout_width="fill_parent"
android:layout_height="match_parent"
android:layout_height="wrap_content"
android:background="#999999"
android:drawSelectorOnTop="false"
android:horizontalSpacing="0dp"
@ -214,6 +214,20 @@
android:autofillHints="">
</EditText>
</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
android:id="@+id/imageButtonSend"
android:layout_width="wrap_content"

View File

@ -150,18 +150,18 @@
android:enabled="true"
android:textColor="#000000"
android:layout_marginBottom="5sp" />
<ImageView
android:id="@+id/imageSettings"
android:layout_width="wrap_content"
android:layout_height="0dp"
android:layout_alignTop="@+id/imageLanguage"
android:layout_alignBottom="@+id/imageLanguage"
android:layout_alignParentRight="true"
android:adjustViewBounds="true"
android:contentDescription="holds the icon for language"
android:scaleType="fitCenter"
android:src="@drawable/change_ip" />
<ImageView
android:id="@+id/imageSettings"
android:layout_width="wrap_content"
android:layout_height="0dp"
android:contentDescription="holds the icon for language"
android:src="@drawable/change_ip"
android:adjustViewBounds="true"
android:scaleType="fitCenter"
android:layout_alignTop="@+id/imageLanguage"
android:layout_alignBottom="@+id/imageLanguage"
android:layout_alignParentRight="true" />
<Button
android:id="@+id/buttonLogin"

View File

@ -10,7 +10,6 @@
android:gravity="center_vertical" >
<TextView
android:id="@+id/unit_name"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="@string/unitName"

View File

@ -164,7 +164,7 @@
<GridView
android:id="@+id/gridView1"
android:layout_width="fill_parent"
android:layout_height="match_parent"
android:layout_height="wrap_content"
android:background="#999999"
android:drawSelectorOnTop="false"
android:horizontalSpacing="0dp"
@ -213,6 +213,19 @@
android:autofillHints="">
</EditText>
</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
android:id="@+id/imageButtonSend"
android:layout_width="wrap_content"

View File

@ -263,7 +263,5 @@
<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="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>