Compare commits

...

71 Commits

Author SHA1 Message Date
32201af76c remove barcode from conversation 2022-04-08 20:32:29 +03:00
b6fc8851a7 the blue bar with an arrow from the left has no functionality. it should hide the grid 2022-04-08 20:23:36 +03:00
f4db909dcb when selecting a unit from the grid it should be centered with the info bubble opened 2022-04-08 18:40:20 +03:00
dcceb360e9 the unit should be centered when moving with the info bubble opened 2022-04-08 17:53:22 +03:00
1d2182799f the info bubble shows wrong date and time 2022-04-08 16:53:59 +03:00
c210ccf117 disable map controls 2022-04-08 16:39:53 +03:00
f6cb72368d Merge pull request 'fix unit selection' (#25) from SD-221 into develop
Reviewed-on: #25
2022-04-08 11:50:39 +00:00
97b7e2d9a7 fix unit selection 2022-04-08 14:48:07 +03:00
33d00c27d7 Merge pull request 'display satelite map' (#24) from SD-220 into develop
Reviewed-on: #24
2022-04-08 10:54:18 +00:00
cc78f29f26 display satelite map 2022-04-08 13:52:16 +03:00
e7c3672b93 Merge pull request 'update info bubble box info' (#23) from SD-219 into develop
Reviewed-on: #23
2022-04-07 10:32:52 +00:00
feb7bd654c update info bubble box info 2022-04-07 13:31:23 +03:00
539170109d Merge pull request 'when receiving a new alarm && current tab is alarms, refresh alarm list' (#22) from SD-224 into develop
Reviewed-on: #22
2022-04-07 10:16:35 +00:00
0bdd161d69 when receiving a new alarm && current tab is alarms, refresh alarm list 2022-04-07 13:14:58 +03:00
680dd0f803 Merge pull request 'fix login button display when internet connection is available' (#21) from SD-217 into develop
Reviewed-on: #21
2022-04-06 07:05:25 +00:00
0b890b74e0 fix login button display when internet connection is available 2022-04-06 10:03:37 +03:00
73d2cedfba Merge pull request 'display alarm notification' (#20) from SD-224 into develop
Reviewed-on: #20
2022-04-04 07:07:40 +00:00
5c075ee168 display alarm notification 2022-04-04 09:59:49 +03:00
1299ff2d2e Merge pull request 'make messages view match parent' (#19) from SD-225 into develop
Reviewed-on: #19
2022-04-04 05:58:15 +00:00
8ab29576c5 make messages view match parent 2022-04-04 08:56:52 +03:00
d9a031a46d Merge pull request 'feature/notifications' (#18) from feature/notifications into develop
Reviewed-on: #18
2022-04-01 07:03:54 +00:00
ba0dc850f7 display notifications 2022-03-31 14:12:03 +03:00
b2fdb1c8d7 Merge pull request 'SD-203- added dialogs similar to SafeDispatch History to inform of 0 positions or >2000 positions' (#17) from features/SD-203-add-dialogs-for-history-tab into develop
Reviewed-on: #17
2022-03-31 05:13:10 +00:00
19f5fe01a3 SD-203- added dialogs similar to SafeDispatch History to inform of 0 positions or >2000 positions 2022-03-31 08:07:39 +03:00
7b45edb624 Merge pull request 'SD-216 - fix back button functionality for recordings and history tabs' (#16) from fix/SD-216-back-navigation-broken into develop
Reviewed-on: #16
2022-03-31 04:21:59 +00:00
3a0fe96708 SD-216 - fix back button functionality for recordings and history tabs 2022-03-31 07:19:40 +03:00
5cd598bec9 Merge pull request 'features/SD-211-recordings-tab' (#14) from features/SD-211-recordings-tab into develop
Reviewed-on: #14
2022-03-30 11:26:25 +00:00
79234c9830 Merge branch 'develop' into features/SD-211-recordings-tab 2022-03-30 14:22:20 +03:00
ca4255943a clean code 2022-03-30 12:52:38 +03:00
cbeb912820 Merge pull request 'allow server to reconnect on mobile data' (#15) from feature/allow_server_reconnection_on_mobile_data into develop
Reviewed-on: #15
2022-03-30 08:52:35 +00:00
f15688b9a1 allow server to reconnect on mobile data 2022-03-30 11:50:48 +03:00
3935b3ad0b SD-211 - fix file rename issue after merge 2022-03-30 11:19:33 +03:00
e59b522ccb Merge branch 'develop' into features/SD-211-recordings-tab
# Conflicts:
#	libSafeMobile/src/main/java/com/safemobile/services/TCPhandler.java
#	safeDispatch/src/main/res/layout/dialog_login.xml
2022-03-30 10:38:47 +03:00
3f96055a6e SD-211 - show all recordings and play them 2022-03-30 10:34:57 +03:00
94091a9a31 Merge pull request 'text color on radio' (#13) from feature/icon_and_background into develop
Reviewed-on: #13
2022-03-28 13:38:39 +00:00
d9d325b18b text color on radio 2022-03-28 16:34:53 +03:00
f4c6b8163d Merge pull request 'change text color + small changes' (#12) from feature/icon_and_background into develop
Reviewed-on: #12
2022-03-28 11:09:20 +00:00
17a7e1711e merge with develop 2022-03-28 14:06:36 +03:00
9b302d0461 change text color + small changes 2022-03-28 14:02:10 +03:00
8bb6f36e60 SD-211 - fix case when the app was sending request on the ui thread
-fix audio hadler
-small refactor
2022-03-25 17:28:53 +02:00
e80272e0a4 Merge pull request 'features/SD-188-Create_Permission_module_and_request_audio' (#11) from features/SD-188-Create_Permission_module_and_request_audio into develop
Reviewed-on: #11
Reviewed-by: Adriana <adriana.epure@safemobile.com>
2022-03-24 16:59:12 +00:00
3268286e76 #SD-188 - fix merge conflicts 2022-03-24 12:55:53 +02:00
c07986d604 Merge branch 'develop' into features/SD-188-Create_Permission_module_and_request_audio
# Conflicts:
#	safeDispatch/src/main/java/com/safemobile/dispatch/HistoryActivity.java
#	safeDispatch/src/main/java/com/safemobile/safedispatch/TabLayoutActivity.java
2022-03-24 12:29:12 +02:00
81937a5e0f SD-188 - navigate to phone settings if permission is denied 2022-03-24 12:16:30 +02:00
c70a1b71a1 Merge pull request 'change package name + apk && aab' (#10) from feature/change_package_name into develop
Reviewed-on: #10
2022-03-24 09:42:32 +00:00
142558d057 change package name + apk && aab 2022-03-24 11:18:49 +02:00
66625bcdd1 SD-188 - request audio permission on radio tab select 2022-03-23 19:50:15 +02:00
968d9e7296 Merge pull request 'new credential generated' (#9) from feature/new_signature into develop
Reviewed-on: #9
2022-03-23 11:35:40 +00:00
2855e9bde6 new credential generated 2022-03-23 13:33:54 +02:00
34c578fdf5 SD-188 - cleaned up TabLayoutActivity of unused code
- small refactor
- null checks
2022-03-23 13:07:40 +02:00
ee8bfe56b4 Merge pull request 'feature/icon_and_background' (#8) from feature/icon_and_background into develop
Reviewed-on: #8
2022-03-23 09:23:35 +00:00
d519a2be14 change app name 2022-03-23 11:12:20 +02:00
1b3912c682 change background image 2022-03-23 11:12:00 +02:00
ba9383248c chage icon 2022-03-23 10:56:09 +02:00
07127cea18 Merge pull request 'feature/apk_versioning_mechanism' (#7) from feature/apk_versioning_mechanism into develop
Reviewed-on: #7
2022-03-22 13:19:47 +00:00
6a235d1d3f merge with develop 2022-03-22 15:18:25 +02:00
bac12825c9 edit apk name 2022-03-22 15:10:29 +02:00
bbed107c42 get versionCode & name from tag 2022-03-22 12:11:08 +02:00
7039199208 SD-188 - Create IPermissionService and its implementation 2022-03-21 19:39:55 +02:00
bca16caf94 new marker icon 2022-03-21 13:01:04 +02:00
0b887deb99 remove marker icon 2022-03-21 12:19:23 +02:00
c85dc279dc clean history activity 2022-03-21 11:58:34 +02:00
db360c4d45 speed limit 2022-03-21 11:50:52 +02:00
89f8cbfcae WIP 2022-03-18 23:12:20 +02:00
456c27b829 Merge pull request '#SD-207 - send more data for ack to occur' (#5) from features/SD-207-get_alarms_and_send_ack into develop
Reviewed-on: #5
2022-03-18 16:44:57 +00:00
8127caa949 #SD-207 - send more data for ack to occur 2022-03-18 18:43:48 +02:00
4420af337d cleanups 2022-03-18 15:40:15 +02:00
6b6543ca3f display test positions 2022-03-18 15:22:35 +02:00
f554356af1 small cleanups 2022-03-18 15:03:34 +02:00
2540b5f511 Merge pull request '#SD-185 - Make the UI compatible with SMS parsing changes' (#4) from features/SD-185-update-app-to_support-new-message-parsing into develop
Reviewed-on: #4
2022-03-18 06:41:30 +00:00
0fabbc73be comment line in order to move vehicle 2022-03-17 15:13:25 +02:00
98 changed files with 5580 additions and 5840 deletions

0
gradlew vendored Normal file → Executable file
View File

View File

@ -19,6 +19,13 @@ android {
buildFeatures { buildFeatures {
viewBinding false viewBinding false
} }
lintOptions {
checkReleaseBuilds false
// Or, if you prefer, you can continue to check for errors in release builds,
// but continue the build even when errors are found:
//abortOnError false
}
} }
dependencies { dependencies {

View File

@ -4,9 +4,10 @@
android:versionCode="1" android:versionCode="1"
android:versionName="1.0" > android:versionName="1.0" >
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<application <application
android:allowBackup="true" android:allowBackup="true"
android:icon="@drawable/ic_launcher" android:icon="@mipmap/ic_launcher"
android:label="@string/app_name" android:label="@string/app_name"
android:theme="@style/AppTheme" > android:theme="@style/AppTheme" >
</application> </application>

View File

@ -155,12 +155,12 @@ public abstract class AbstractSDParentActivity extends TabActivity {
} }
public boolean sendAlarmAcknowledge(int alarm_id, int type) public boolean sendAlarmAcknowledge(int alarm_id, int type, String unitName)
{ {
if(tcp == null) if(tcp == null)
return false; return false;
boolean res = tcp.Write("0.0", "#28#" + alarm_id + "#" + type + "#"); boolean res = tcp.Write("0.0", "#28#" + alarm_id + "#" + type + "#" + AppParams.USERID + "#" + unitName + "#");
if(res) if(res)
SM.Debug("Message [sendAlarmAcknowledge] sent to app server alarm_id:" + alarm_id + " type:" + type); SM.Debug("Message [sendAlarmAcknowledge] sent to app server alarm_id:" + alarm_id + " type:" + type);
else else
@ -198,12 +198,11 @@ public abstract class AbstractSDParentActivity extends TabActivity {
return res; return res;
} }
public boolean getHistoryPositions(int sc_id, long timeGMTStart, long timeGMTStop) public boolean getHistoryPositions(int sc_id, long timeGMTStart, long timeGMTStop) {
{
if(tcp == null) if(tcp == null)
return false; return false;
String histSeqID = "1."+Integer.toString((int) (System.currentTimeMillis() / 1000L)); String histSeqID = "1."+ (int) (System.currentTimeMillis() / 1000L);
boolean res = tcp.Write(histSeqID,"#26#"+sc_id+"#"+timeGMTStart+"#"+timeGMTStop+"#"); boolean res = tcp.Write(histSeqID,"#26#"+sc_id+"#"+timeGMTStart+"#"+timeGMTStop+"#");
if(res) if(res)
SM.Debug("Message [getHistoryPositions] sent to app server"); SM.Debug("Message [getHistoryPositions] sent to app server");
@ -213,8 +212,7 @@ public abstract class AbstractSDParentActivity extends TabActivity {
return res; return res;
} }
public boolean getRadiosList() public boolean getRadiosList() {
{
if(tcp == null) if(tcp == null)
return false; return false;
@ -257,8 +255,7 @@ public abstract class AbstractSDParentActivity extends TabActivity {
return res; return res;
} }
public boolean getAlarms(long userID) public boolean getAlarms(long userID) {
{
if (tcp == null) if (tcp == null)
return false; return false;

View File

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

View File

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

View File

@ -0,0 +1,10 @@
package com.safemobile.enums;
public enum AuthorizationCode {
UNKNOWN,
RECORD_AUDIO,
CAMERA,
GEOLOCATION,
READ_EXTERNAL_STORAGE,
WRITE_EXTERNAL_STORAGE
}

View File

@ -0,0 +1,7 @@
package com.safemobile.enums;
public enum AuthorizationStatus {
AUTHORIZE,
DENIED,
NOT_DETERMINED
}

View File

@ -0,0 +1,6 @@
package com.safemobile.enums;
public enum ProviderSettingsStatus {
APPLICATION_DETAILS,
SETTINGS
}

View File

@ -0,0 +1,37 @@
package com.safemobile.helpers;
import android.content.Context;
import android.content.Intent;
import android.net.Uri;
import android.provider.Settings;
import com.safemobile.enums.ProviderSettingsStatus;
public class ProviderSettingsHelper {
public static final String PACKAGE = "package";
public static final String ACTION_APPLICATION_DETAILS_SETTINGS = Settings.ACTION_APPLICATION_DETAILS_SETTINGS;
public static final String ACTION_SETTINGS = Settings.ACTION_SETTINGS;
private ProviderSettingsHelper() {
}
public static String getAction(ProviderSettingsStatus providerSettingsStatus) {
switch (providerSettingsStatus) {
case APPLICATION_DETAILS:
return ACTION_APPLICATION_DETAILS_SETTINGS;
case SETTINGS:
default:
return ACTION_SETTINGS;
}
}
public static boolean canHandleAction(Context context, String action) {
Intent intent = new Intent(action);
Uri uri = Uri.fromParts(PACKAGE, context.getPackageName(), null);
intent.setData(uri);
return context.getPackageManager() != null && intent.resolveActivity(context.getPackageManager()) != null;
}
}

View File

@ -0,0 +1,12 @@
package com.safemobile.interfaces;
import android.app.Activity;
import com.google.android.gms.tasks.Task;
public interface IDialogService {
Task<Boolean> showDialog(Activity activity, String title, String message, String cancel, String ok);
Task<Boolean> showPermissionRequestDialog(Activity activity, String message, String cancel);
void showError(Activity activity, String message);
}

View File

@ -0,0 +1,11 @@
package com.safemobile.interfaces;
import android.app.Activity;
import com.safemobile.enums.AuthorizationCode;
import com.safemobile.enums.AuthorizationStatus;
public interface IPermissionModule {
AuthorizationStatus getAuthorizationStatus(Activity activity, AuthorizationCode authorizationCode);
void requestAuthorization(Activity activity, AuthorizationCode authorizationCode);
}

View File

@ -16,7 +16,7 @@ public interface ITCPListener {
public void onHistoryPositionsCountReceived( TCPEvent event ); public void onHistoryPositionsCountReceived( TCPEvent event );
public void onAlarmsReceived( TCPEvent event ); public void onAlarmsReceived( TCPEvent event );
public void onAlarmAckReceived(TCPEvent event); public void onAlarmAckReceived(TCPEvent event);
public void alarmLiveRecv(TCPEvent event); public void alarmLiveReceived(TCPEvent event);
public void onRecordingPlayReceived(TCPEvent event); public void onRecordingPlayReceived(TCPEvent event);
public void onPollReceived(TCPEvent event); public void onPollReceived(TCPEvent event);
@ -27,7 +27,7 @@ public interface ITCPListener {
public void onRecordingsListReceived(TCPEvent event); public void onRecordingsListReceived(TCPEvent event);
public void onPONGReceived(); public void onPONGReceived();
public void onTCPConnectionDown(boolean previuosWasConnectionUp); public void onTCPConnectionDown(boolean previousWasConnectionUp);
public void onTCPConnectionUp(boolean previuosWasConnectionUp); public void onTCPConnectionUp(boolean previousWasConnectionUp);
public void onTCPConnectionStatusReceived(boolean isConnectionUp, boolean previuosWasConnectionUp); public void onTCPConnectionStatusReceived(boolean isConnectionUp, boolean previousWasConnectionUp);
} }

View File

@ -27,7 +27,7 @@ public class AppParams {
/* SafeMobile Dispatch */ /* SafeMobile Dispatch */
public static ArrayList<User> allUsers = new ArrayList<User>(); public static ArrayList<User> allUsers = new ArrayList<User>();
public static Theme theme = Theme.SAFENET; // the Theme type public static Theme theme = Theme.SAFEDISPATCH; // the Theme type
/* ***************************************** */ /* ***************************************** */

View File

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

View File

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

View File

@ -28,13 +28,11 @@ public class TCPService extends Service {
int port = 13589; int port = 13589;
try { try {
port = Integer.parseInt(AppParams.PORT); port = Integer.parseInt(AppParams.PORT);
} } catch(Exception ex) { }
catch(Exception ex) { }
tcpParser = new TCPmsgParser(); tcpParser = new TCPmsgParser();
if(tcp == null && !AppParams.IP.equalsIgnoreCase("n/a")) if(tcp == null && !AppParams.IP.equalsIgnoreCase("n/a")) {
{
tcp = new TCPhandler(getApplicationContext(), AppParams.IP, port); tcp = new TCPhandler(getApplicationContext(), AppParams.IP, port);
} }

View File

@ -1,187 +1,139 @@
package com.safemobile.services; package com.safemobile.services;
import java.io.*;
import java.net.*;
import java.nio.charset.Charset;
import java.util.LinkedList;
import java.util.NoSuchElementException;
import java.util.Timer;
import java.util.TimerTask;
import android.content.BroadcastReceiver; import android.content.BroadcastReceiver;
import android.content.Context; import android.content.Context;
import android.content.Intent; import android.content.Intent;
import android.content.IntentFilter; import android.content.IntentFilter;
import android.net.ConnectivityManager; import android.net.ConnectivityManager;
import android.net.NetworkInfo;
import android.net.wifi.WifiManager; import android.net.wifi.WifiManager;
import com.safemobile.lib.AppParams; import com.safemobile.lib.AppParams;
import com.safemobile.lib.SM; import com.safemobile.lib.SM;
import com.safemobile.lib.TCPmsg; import com.safemobile.lib.TCPmsg;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.net.InetSocketAddress;
import java.net.Socket;
import java.net.UnknownHostException;
import java.util.LinkedList;
import java.util.NoSuchElementException;
import java.util.Timer;
import java.util.TimerTask;
public class TCPhandler implements Runnable
{ public class TCPhandler implements Runnable {
private boolean alive = true; private boolean alive = true;
public String serverHostname = new String ("10.120.1.114");// public String serverHostname;
private int port = 13579; private int port;
private Thread listenThread; private Thread listenThread;
private Socket soc = null; private Socket soc = null;
//private BufferedReader recv;
//private PrintWriter writer;
private DataInputStream input; private DataInputStream input;
private DataOutputStream output; private DataOutputStream output;
private Timer timer;
private String leftOver = ""; private String leftOver = "";
public static LinkedList<TCPmsg> msgList; public static LinkedList<TCPmsg> msgList;
private volatile int n=0;
public Boolean isConnectionUP = false; public Boolean isConnectionUP = false;
public Boolean previousConnectionWasUP = false; public Boolean previousConnectionWasUP = false;
private Context context; private final Context context;
private boolean isWiFiOn = true; private boolean isWiFiOn;
public TCPhandler(Context context, String hostName, int p)
{
public TCPhandler(Context context, String hostName, int p) {
this.context = context; this.context = context;
serverHostname = hostName; serverHostname = hostName;
port = p; port = p;
msgList = new LinkedList<TCPmsg>(); msgList = new LinkedList<>();
SM.Debug("---TCPhandler constructor [" + hostName + "," + p + "] ---"); SM.Debug("---TCPhandler constructor [" + hostName + "," + p + "] ---");
listenThread = new Thread(this, "TCPlisten"); listenThread = new Thread(this, "TCPlisten");
listenThread.start(); // (2) Start the thread. listenThread.start(); // (2) Start the thread.
// create timer to check socket status // create timer to check socket status
timer = new Timer(); Timer timer = new Timer();
timer.scheduleAtFixedRate(new TimerTask() { timer.scheduleAtFixedRate(new TimerTask() {
@Override @Override
public void run() { public void run() {
try { try {
//Looper.prepare();
//mBluetoothAdapter = BluetoothAdapter.getDefaultAdapter();
// get if is authenticated
//Write("0.0", "d");
previousConnectionWasUP = isConnectionUP; previousConnectionWasUP = isConnectionUP;
// try to send something // try to send something
TCPmsgParser._fireonTCPConnectionStatusEvent(isConnectionUP, previousConnectionWasUP); TCPmsgParser._fireonTCPConnectionStatusEvent(isConnectionUP, previousConnectionWasUP);
} } catch (Exception e) {
catch (Exception e) {
//e.printStackTrace();
SM.Exception("TIMERException", e.toString()); SM.Exception("TIMERException", e.toString());
} }
} }
}, 0, 3000); }, 0, 3000);
// get WiFi state // get WiFi state
ConnectivityManager connManager = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE); isWiFiOn = isNetworkConnected();
NetworkInfo mWifi = connManager.getNetworkInfo(ConnectivityManager.TYPE_WIFI);
if(mWifi.isConnectedOrConnecting())
isWiFiOn = true;
IntentFilter intentFilter = new IntentFilter(); IntentFilter intentFilter = new IntentFilter();
intentFilter.addAction(WifiManager.NETWORK_STATE_CHANGED_ACTION); intentFilter.addAction(WifiManager.NETWORK_STATE_CHANGED_ACTION);
context.registerReceiver(mReceived, intentFilter); context.registerReceiver(mReceived, intentFilter);
} }
private boolean isNetworkConnected() {
ConnectivityManager cm = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
return cm.getActiveNetworkInfo() != null && cm.getActiveNetworkInfo().isConnected();
}
@Override @Override
public void run() public void run() {
{ try {
try
{
if (soc != null) if (soc != null)
soc.close(); soc.close();
soc = new Socket(); soc = new Socket();
soc.connect(new InetSocketAddress(serverHostname, port), 5000); soc.connect(new InetSocketAddress(serverHostname, port), 5000);
//soc.setSoTimeout(3000);
//SM.Debug("Socket timeout:" + soc.getSoTimeout() );
//soc.setSoTimeout(5000);
input = new DataInputStream(soc.getInputStream()); input = new DataInputStream(soc.getInputStream());
output = new DataOutputStream(soc.getOutputStream()); output = new DataOutputStream(soc.getOutputStream());
//recv= new BufferedReader(new InputStreamReader(soc.getInputStream()));
//writer =new PrintWriter(soc.getOutputStream()) ;
if (soc != null) { if (soc != null) {
//previousConnectionWasUP = isConnectionUP;
isConnectionUP = true; isConnectionUP = true;
triggerTCPConnectionStateEvent(); triggerTCPConnectionStateEvent();
} }
} catch (UnknownHostException e) {
} SM.Debug("UnknownHostException", "TCPhandler break:"+ e);
catch (UnknownHostException e) } catch (IllegalArgumentException e) {
{ SM.Debug("IllegalArgumentException", "TCPhandler break:"+ e);
SM.Debug("UnknownHostException", "TCPhandler break:"+e.toString()); } catch (IOException e) {
} SM.Debug("IOException", "TCPhandler break:"+ e);
catch (IllegalArgumentException e)
{
SM.Debug("IllegalArgumentException", "TCPhandler break:"+e.toString());
}
catch (IOException e)
{
SM.Debug("IOException", "TCPhandler break:"+e.toString());
} }
while(alive) while (alive) {
{
//SM.Debug("Waiting for data...");
try { try {
Thread.sleep(3000); Thread.sleep(3000);
} catch (InterruptedException e) { } catch (InterruptedException e) {
SM.Debug("TCPhandler Crash1 on sleep:"+e.toString()); SM.Debug("TCPhandler Crash1 on sleep:"+ e);
} }
while(isConnectionUP) while (Boolean.TRUE.equals(isConnectionUP)) {
{ try {
try
{
Thread.sleep(100); Thread.sleep(100);
//SM.Debug("Waiting for data...");
//process leftover //process leftover
try try {
{
boolean FinishLeftOver = true; boolean FinishLeftOver = true;
while (FinishLeftOver) while (FinishLeftOver) {
{
// add this replacement if message length doesn't contain the last #
// leftOver = leftOver.replace("##", "#");
String[] tempArr2 = leftOver.split("#"); String[] tempArr2 = leftOver.split("#");
if (tempArr2.length > 1) if (tempArr2.length > 1) {
{
int messLen; int messLen;
try try {
{
messLen = Integer.parseInt(tempArr2[1]); messLen = Integer.parseInt(tempArr2[1]);
} catch (Exception e) {
//TODO talk to Gaby to fix this on Bridge
}
catch (Exception e)
{
SM.Debug("leftovers", "incorect msg len leftOver =" + tempArr2[1]); SM.Debug("leftovers", "incorect msg len leftOver =" + tempArr2[1]);
messLen = -1; messLen = -1;
} }
if(messLen>leftOver.length()) if (messLen > leftOver.length()) {
{
FinishLeftOver = false; FinishLeftOver = false;
break; break;
} } else if (messLen == leftOver.length()) {
else if(messLen==leftOver.length())
{
TCPmsg msg = new TCPmsg(leftOver.toCharArray()); TCPmsg msg = new TCPmsg(leftOver.toCharArray());
SM.Debug("leftovers", "RX from leftOver:" + msg.allData); SM.Debug("leftovers", "RX from leftOver:" + msg.allData);
@ -192,8 +144,7 @@ public class TCPhandler implements Runnable
leftOver = ""; leftOver = "";
FinishLeftOver = false; FinishLeftOver = false;
break; break;
} } else // we have more message in leftover
else // we have more message in leftover
{ {
TCPmsg msg = new TCPmsg(leftOver.substring(0, messLen).toCharArray()); TCPmsg msg = new TCPmsg(leftOver.substring(0, messLen).toCharArray());
SM.Debug("leftovers", "RX from leftOver:" + msg.allData); SM.Debug("leftovers", "RX from leftOver:" + msg.allData);
@ -204,40 +155,31 @@ public class TCPhandler implements Runnable
msgList.add(msg); msgList.add(msg);
leftOver = leftOver.substring(messLen, leftOver.length()); leftOver = leftOver.substring(messLen, leftOver.length());
} }
} else FinishLeftOver = false;
} }
else FinishLeftOver = false; } catch (Exception e) {
}
}
catch (Exception e)
{
SM.Debug("leftovers", "Error on process leftover" + e.toString()); SM.Debug("leftovers", "Error on process leftover" + e.toString());
} }
//end process leftover //end process leftover
String data = ""; String data = "";
n=0; int n = 0;
//char[] buf = new char[1024];
//n = recv.read(buf);
byte[] buf = new byte[1024]; byte[] buf = new byte[1024];
// read data into buffer // read data into buffer
n = input.read(buf); n = input.read(buf);
//connection closed by server //connection closed by server
if(n==-1) if (n == -1) {
{
SM.Debug("TCP Client", "Connection closed by server!"); SM.Debug("TCP Client", "Connection closed by server!");
soc.close(); soc.close();
//previousConnectionWasUP = isConnectionUP;
isConnectionUP = false; isConnectionUP = false;
triggerTCPConnectionStateEvent(); triggerTCPConnectionStateEvent();
soc = null; soc = null;
break; break;
} }
byte[] temp = new byte[n]; byte[] temp = new byte[n];
for(int i=0;i<n;i++) temp[i] = buf[i]; if (n >= 0) System.arraycopy(buf, 0, temp, 0, n);
//String data =new String(temp);
// decryptData // decryptData
temp = decryptTEA(temp); temp = decryptTEA(temp);
@ -245,22 +187,18 @@ public class TCPhandler implements Runnable
data = new String(temp); data = new String(temp);
//if we have any leftovers from previous message add them //if we have any leftovers from previous message add them
if(leftOver.length()>1) // avoid case with only one # if(leftOver.length() > 1) { // avoid case with only one #
{
data = leftOver+data; data = leftOver+data;
leftOver = ""; leftOver = "";
} }
//search for overflow message //search for overflow message
String[] tempArr = data.split("#"); String[] tempArr = data.split("#");
if ((tempArr.length == 0) || (tempArr.length == 1)) if ((tempArr.length == 0) || (tempArr.length == 1)) {
{
SM.Debug("TCP Client", "incorect messagebuss message=" + data); SM.Debug("TCP Client", "incorect messagebuss message=" + data);
continue; continue;
} }
//get msg len //get msg len
// for(int i=0;i<tempArr.length;i++)
// SM.Debug("I:"+i+" tempArr[i]:"+tempArr[i]);
int messLen; int messLen;
try { try {
messLen = Integer.parseInt(tempArr[1]); messLen = Integer.parseInt(tempArr[1]);
@ -269,31 +207,19 @@ public class TCPhandler implements Runnable
continue; continue;
} }
//messLen not int //messLen not int
if(messLen == -1) if (messLen == -1) {
{
//SM.Debug("messLen not int=" + messLen +" tempArr[1]:" +tempArr[1]);
continue; continue;
} }
char[] temMSG = data.toCharArray(); char[] temMSG = data.toCharArray();
//SM.Debug("MessLen:"+messLen+" Data len:"+data.length()+"IF:"+(data.length() != messLen)); if (data.length() != messLen) {
if (data.length() != messLen)
{
//if expected string message is smaller then actual string then exit processing; //if expected string message is smaller then actual string then exit processing;
if(messLen>data.length()) if (messLen > data.length()) {
//if(messLen>n)
{
//SM.Debug("duda","messLen=" + messLen +" data.length():" +data.length()+"n:"+n);
leftOver = data; // Add by bigu leftOver = data; // Add by bigu
continue; continue;
} }
//perform cut //perform cut
//SM.Debug("We got leftover ....message length("+messLen+") != actual length("+data.length()+")");
temMSG = data.substring(0,messLen).toCharArray(); temMSG = data.substring(0,messLen).toCharArray();
//SM.Debug("temMSG:"+temMSG.toString()); leftOver = data.substring(messLen);
leftOver = data.substring(messLen,data.length());
//SM.Debug("leftOver:"+leftOver);
//leftOver = data.substring(messLen,n);
//SM.Debug("left over string:"+leftOver);
} }
//decode TCP msg //decode TCP msg
TCPmsg msg = new TCPmsg(temMSG); TCPmsg msg = new TCPmsg(temMSG);
@ -304,37 +230,28 @@ public class TCPhandler implements Runnable
prioritizePongReceived(); prioritizePongReceived();
msgList.add(msg); msgList.add(msg);
} catch(Exception ex) {
} SM.Debug("TCPHandler", "TCPhandler/run/break:"+ ex);
catch(Exception ex)
{
SM.Debug("TCPHandler", "TCPhandler/run/break:"+ex.toString());
//previousConnectionWasUP = isConnectionUP;
isConnectionUP = false; isConnectionUP = false;
triggerTCPConnectionStateEvent(); triggerTCPConnectionStateEvent();
} }
}//while(connOK) }
// //
try { try {
Thread.sleep(1000); Thread.sleep(1000);
} catch (InterruptedException e) { } catch (InterruptedException e) {
SM.Debug("TCPhandler Crash2 on sleep:"+e.toString()); SM.Debug("TCPhandler Crash2 on sleep:"+ e);
//previousConnectionWasUP = isConnectionUP;
} }
//try to restart connection //try to restart connection
if (alive && isWiFiOn) if (alive && isWiFiOn)
RestartTCP(); restartTCP();
}
}//while(alive)
SM.Debug("=================================="); SM.Debug("==================================");
SM.Debug("TCP listenThread stoped!! alive = false"); SM.Debug("TCP listenThread stoped!! alive = false");
SM.Debug("=================================="); SM.Debug("==================================");
} }
/** /**
* Create a bypass in order to trigger the ping received event * Create a bypass in order to trigger the ping received event
*/ */
@ -342,7 +259,6 @@ public class TCPhandler implements Runnable
TCPmsgParser._firePONGReceivedEvent(); TCPmsgParser._firePONGReceivedEvent();
} }
/* Broadcast Received for WiFi Connect/Disconnect */ /* Broadcast Received for WiFi Connect/Disconnect */
public BroadcastReceiver mReceived = new BroadcastReceiver() { public BroadcastReceiver mReceived = new BroadcastReceiver() {
@ -352,182 +268,83 @@ public class TCPhandler implements Runnable
SM.Debug("WIFI STATE", action); SM.Debug("WIFI STATE", action);
if (action.equals(WifiManager.NETWORK_STATE_CHANGED_ACTION)){ if (action.equals(WifiManager.NETWORK_STATE_CHANGED_ACTION)){
NetworkInfo info = intent.getParcelableExtra(WifiManager.EXTRA_NETWORK_INFO);
// close socket if the wifi is disconnecting or disconnected // close socket if the wifi is disconnecting or disconnected
if(!info.isConnectedOrConnecting()) { isWiFiOn = isNetworkConnected();
if (!isWiFiOn)
closeSocket(); closeSocket();
isWiFiOn = false;
}
else
isWiFiOn = true;
} }
} }
}; };
/** 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 seqID The messages's sequence ID (a number of order)
* @param msg The messages which will be sent * @param msg The messages which will be sent
* @return True if the message was sent * @return True if the message was sent
*/ */
public boolean Write(String seqID, String msg) public boolean Write(String seqID, String msg) {
{ try {
if (output != null) {
try
{
/*
if(writer != null)
{
String cmdok = "#" + seqID + msg;
Integer tmp = cmdok.length() + 1;
//SM.Debug("tmp:"+tmp);
tmp += Integer.toString(tmp).length();// tmp.ToString().Length;
if((tmp==10)||(tmp==100)||(tmp==1000)) tmp++;
cmdok = "#" + Integer.toString(tmp) + cmdok;
writer.write(encryptTEA(cmdok));
writer.flush();
SM.Debug("TX:"+encryptTEA(cmdok));
return true;
}*/
if(output != null)
{
try { try {
Thread.sleep(10); Thread.sleep(10);
String cmdok = "#" + seqID + msg; String cmdok = "#" + seqID + msg;
Integer tmp = cmdok.length() + 1; Integer tmp = cmdok.length() + 1;
//SM.Debug("tmp:"+tmp);
tmp += Integer.toString(tmp).length();// tmp.ToString().Length; tmp += Integer.toString(tmp).length();
if ((tmp == 10) || (tmp == 100) || (tmp == 1000)) tmp++; if ((tmp == 10) || (tmp == 100) || (tmp == 1000)) tmp++;
cmdok = "#" + Integer.toString(tmp) + cmdok; cmdok = "#" + Integer.toString(tmp) + cmdok;
byte[] mess = encryptTEA(cmdok); byte[] mess = encryptTEA(cmdok);
Thread tcpThread = new Thread(() -> {
try {
output.write(mess); output.write(mess);
output.flush(); output.flush();
} catch (Exception e) {
e.printStackTrace();
}
});
tcpThread.start();
// show only notACK messages
//if(mess[3] != 0x0C)
SM.Debug(" ", new String(mess)); SM.Debug(" ", new String(mess));
return true; return true;
}
catch (IOException e) {
//e.printStackTrace();
SM.Exception("TCPClient[Send]", e.toString());
} catch (InterruptedException e) { } catch (InterruptedException e) {
SM.Exception("TCPClient[Send]", e.toString()); SM.Exception("TCPClient[Send]", e.toString());
Thread.currentThread().interrupt();
} catch (NoSuchElementException e) { } catch (NoSuchElementException e) {
SM.Exception("TCPClient[Send]", e.toString()); SM.Exception("TCPClient[Send]", e.toString());
} }
} } else {
else
{
return false; return false;
} }
} } catch (Exception e) {
catch (Exception e) SM.Debug("TCPhandler Write Procedure:" + e);
{
SM.Debug("TCPhandler Write Procedure:"+e.toString());
} }
return false; return false;
} }
public void setConnectionIsDown() {
if(input != null) {
try {
input.close();
} catch (IOException e) {
}
finally {
input = null;
}
}
isConnectionUP = false;
}
/* Encrypt a string using an encryption algorithm, /* Encrypt a string using an encryption algorithm,
* in this case TEA */ * in this case TEA */
public static byte[] encryptTEA(String toEncryptData) { public static byte[] encryptTEA(String toEncryptData) {
byte[] encryptedByteArray = new byte[]{};
/*
//encrypt message using TEA
try {
encryptedByteArray = TEA.encrypt(toEncryptData);
} catch (UnsupportedEncodingException e) {
SM.Exception("encryptTEA Exception(UEE): " + e.toString());
} catch (IndexOutOfBoundsException e) {
SM.Exception("encryptTEA Exception(IOoBE): " + e.toString());
} catch (NullPointerException e) {
SM.Exception("encryptTEA Exception(NPE): " + e.toString());
}
//*/
// no encryption // no encryption
encryptedByteArray = toEncryptData.getBytes(); return toEncryptData.getBytes();
return encryptedByteArray;
} }
/* Decrypt a string using an encryption algorithm, /* Decrypt a string using an encryption algorithm,
* in this case TEA */ * in this case TEA */
public static byte[] decryptTEA(byte[] toDecryptData) { public static byte[] decryptTEA(byte[] toDecryptData) {
byte[] decryptedByteArray = new byte[]{}; byte[] decryptedByteArray;
/*
String sm = "";
for(int i=0; i<toDecryptData.length; i++)
sm+=toDecryptData[i] + " ";
SM.Debug("DDDDDD: " + sm);
//*/
/*
//decrypt message using TEA
try {
decryptedByteArray = TEA.decrypt(toDecryptData);
} catch (UnsupportedEncodingException e) {
SM.Exception("encryptTEA Exception(UEE): " + e.toString());
} catch (IndexOutOfBoundsException e) {
SM.Exception("encryptTEA Exception(IOoBE): " + e.toString());
} catch (NullPointerException e) {
SM.Exception("encryptTEA Exception(NPE): " + e.toString());
}
String sm = "";
for(int i=0; i<decryptedByteArray.length; i++)
sm+= (int)decryptedByteArray[i] + " ";
//sm = new String(decryptedByteArray.toString());
try {
SM.Debug("##### " + new String(decryptedByteArray, "UTF-8"));
} catch (UnsupportedEncodingException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
SM.Debug("DEcrypted: " + decryptedByteArray.toString());
//*/
// no decryption // no decryption
decryptedByteArray = toDecryptData; decryptedByteArray = toDecryptData;
return decryptedByteArray; return decryptedByteArray;
} }
public int getPort() { public int getPort() {
return port; return port;
} }
public void updateTCPparameters(String ip, String _port) public void updateTCPparameters(String ip, String _port) {
{
// stop socket // stop socket
try { try {
if (soc != null) if (soc != null)
@ -537,15 +354,10 @@ public class TCPhandler implements Runnable
} }
serverHostname = ip; serverHostname = ip;
try try {
{
port = Integer.parseInt(_port); port = Integer.parseInt(_port);
} } catch (Exception ignored) { }
catch (Exception e) { finally {
}
finally
{
port = 13589; port = 13589;
} }
} }
@ -557,10 +369,8 @@ public class TCPhandler implements Runnable
TCPmsgParser._fireTCPConnectionUpEvent(previousConnectionWasUP); TCPmsgParser._fireTCPConnectionUpEvent(previousConnectionWasUP);
} }
private void RestartTCP() private void restartTCP() {
{ try {
try
{
isConnectionUP = false; isConnectionUP = false;
previousConnectionWasUP = false; previousConnectionWasUP = false;
@ -569,76 +379,30 @@ public class TCPhandler implements Runnable
soc.connect(new InetSocketAddress(serverHostname, port), 5000); soc.connect(new InetSocketAddress(serverHostname, port), 5000);
input = new DataInputStream(soc.getInputStream()); input = new DataInputStream(soc.getInputStream());
//input = new BufferedReader(new InputStreamReader(socket.getInputStream()));
//output stream //output stream
output = new DataOutputStream(soc.getOutputStream()); output = new DataOutputStream(soc.getOutputStream());
//recv= new BufferedReader(new InputStreamReader(soc.getInputStream())); if (soc != null) {
//writer =new PrintWriter(soc.getOutputStream()) ;
if(soc !=null)
{
//previousConnectionWasUP = isConnectionUP;
isConnectionUP = true; isConnectionUP = true;
//triggerTCPConnectionStateEvent();
/*
//init connection
boolean res = Write("0.0", "#19#" + AppParams.crtRadio.ip + "&"
+ AppParams.crtRadio.id + "#");
if(res){
SM.Debug("Message (AirPadInit) sent to controller");
}else{
SM.Debug("Could not send message(AirPadInit)!!");
} }
//get } catch (UnknownHostException e) {
res = Write("0.0", "#30#104#0#0#0#0#"); SM.Exception("restartTCP break:" + e.toString());
if(res){
SM.Debug("Message (GetSetZoneAndChannel) sent to app server zoneNR:"+0+ " channelNR:"+0);
}else{
SM.Debug("Could not send message(GetSetZoneAndChannel)!!!");
}
*/
//init audio
//AudioHandle.b_SendinitUDP = true;
}
}
catch (UnknownHostException e)
{
SM.Exception("RestartTCP break:"+e.toString());
isConnectionUP = false; isConnectionUP = false;
} catch (IllegalArgumentException e) {
} SM.Debug("IllegalArgumentException", "restartTCP break:" + e.toString());
catch (IllegalArgumentException e) } catch (IOException e) {
{ SM.Exception("restartTCP break:" + e.toString());
SM.Debug("IllegalArgumentException", "RestartTCP break:"+e.toString()); isConnectionUP = false;
} } catch (NullPointerException e) {
catch (IOException e) SM.Exception("restartTCP break:" + e.toString());
{
SM.Exception("RestartTCP break:"+e.toString());
isConnectionUP = false; isConnectionUP = false;
} }
catch (NullPointerException e)
{
SM.Exception("RestartTCP break:"+e.toString());
isConnectionUP = false;
}
triggerTCPConnectionStateEvent(); triggerTCPConnectionStateEvent();
} }
public boolean isAlive() {
return alive;
}
public void setAlive(boolean alive) {
this.alive = alive;
}
/** close Socket when unReachable */ /** close Socket when unReachable */
public void closeSocket() { public void closeSocket() {
try { try {
input = null; input = null;
output = null; output = null;
@ -650,27 +414,23 @@ public class TCPhandler implements Runnable
} }
} }
public void Stop() {
public void Stop()
{
SM.Debug("Stopping TCP", "TCP Connection is stopping on " + AppParams.IP + ":" + port); SM.Debug("Stopping TCP", "TCP Connection is stopping on " + AppParams.IP + ":" + port);
alive = false; alive = false;
if (mReceived!= null) if (mReceived!= null)
try{ context.unregisterReceiver(mReceived); } catch(Exception ex) {/* receiver not registered //*/}; try {
context.unregisterReceiver(mReceived);
} catch(Exception ex) {/* receiver not registered //*/}
// stop thread // stop thread
if(listenThread != null) if (listenThread != null) {
{
Thread moribund = listenThread; Thread moribund = listenThread;
listenThread = null; listenThread = null;
moribund.interrupt(); moribund.interrupt();
} }
if (input != null) {
if(input!=null)
{
try { try {
input.close(); input.close();
input = null; input = null;
@ -679,8 +439,7 @@ public class TCPhandler implements Runnable
} }
} }
if(output!=null) if (output != null) {
{
try { try {
output.close(); output.close();
output = null; output = null;
@ -689,16 +448,13 @@ public class TCPhandler implements Runnable
} }
} }
if(soc !=null) if (soc !=null) {
{
try { try {
soc.close(); soc.close();
soc = null; soc = null;
} } catch (IOException e) {
catch (IOException e) { SM.Exception("TCPClient[STOP]", "Stop break:"+ e);
SM.Exception("TCPClient[STOP]", "Stop break:"+e.toString());
} }
} }
} }
} }

View File

@ -1,7 +1,6 @@
package com.safemobile.services; package com.safemobile.services;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Iterator;
import java.util.List; import java.util.List;
import java.util.NoSuchElementException; import java.util.NoSuchElementException;
@ -10,19 +9,16 @@ import com.safemobile.interfaces.TCPEvent;
import com.safemobile.lib.OperationCodes; import com.safemobile.lib.OperationCodes;
import com.safemobile.lib.SM; import com.safemobile.lib.SM;
import com.safemobile.lib.TCPmsg; import com.safemobile.lib.TCPmsg;
import com.safemobile.services.TCPhandler;
public class TCPmsgParser implements Runnable { public class TCPmsgParser implements Runnable {
public boolean run = true; public boolean run = true;
private TCPmsg _msg; private TCPmsg _msg;
private static List<ITCPListener> _listeners = new ArrayList<ITCPListener>(); private static final List<ITCPListener> _listeners = new ArrayList<>();
private Thread TCPmsgParserThread; private Thread TCPmsgParserThread;
public TCPmsgParser() public TCPmsgParser() {
{
TCPmsgParserThread = new Thread(this, "TCPmsgParserThread"); TCPmsgParserThread = new Thread(this, "TCPmsgParserThread");
TCPmsgParserThread.start(); // (2) Start the thread. TCPmsgParserThread.start(); // (2) Start the thread.
} }
@ -39,177 +35,151 @@ public class TCPmsgParser implements Runnable{
_listeners.clear(); _listeners.clear();
} }
public int getListenersSize()
{
return _listeners.size();
}
private synchronized void _fireLoginEvent() { private synchronized void _fireLoginEvent() {
TCPEvent event = new TCPEvent( this, _msg ); TCPEvent event = new TCPEvent( this, _msg );
Iterator<ITCPListener> listeners = _listeners.iterator(); for (ITCPListener listener : _listeners) {
while( listeners.hasNext() ) { listener.onLoginReceived(event);
( (ITCPListener) listeners.next() ).onLoginReceived( event );
} }
} }
private synchronized void _fireGPSEvent() { private synchronized void _fireGPSEvent() {
TCPEvent event = new TCPEvent( this, _msg ); TCPEvent event = new TCPEvent( this, _msg );
Iterator<ITCPListener> listeners = _listeners.iterator(); for (ITCPListener listener : _listeners) {
while( listeners.hasNext() ) { listener.onGPSReceived(event);
( (ITCPListener) listeners.next() ).onGPSReceived(event);
} }
} }
private synchronized void _fireSMSEvent() { private synchronized void _fireSMSEvent() {
TCPEvent event = new TCPEvent( this, _msg ); TCPEvent event = new TCPEvent( this, _msg );
Iterator<ITCPListener> listeners = _listeners.iterator(); for (ITCPListener listener : _listeners) {
while( listeners.hasNext() ) { listener.onSMSReceived(event);
( (ITCPListener) listeners.next() ).onSMSReceived( event );
} }
} }
private synchronized void _fireLastSMSEvent() { private synchronized void _fireLastSMSEvent() {
TCPEvent event = new TCPEvent( this, _msg ); TCPEvent event = new TCPEvent( this, _msg );
Iterator<ITCPListener> listeners = _listeners.iterator(); for (ITCPListener listener : _listeners) {
while( listeners.hasNext() ) { listener.onLastSMSsReceived(event);
( (ITCPListener) listeners.next() ).onLastSMSsReceived(event);
} }
} }
private synchronized void _fireVehEvent() { private synchronized void _fireVehEvent() {
TCPEvent event = new TCPEvent( this, _msg ); TCPEvent event = new TCPEvent( this, _msg );
Iterator<ITCPListener> listeners = _listeners.iterator(); for (ITCPListener listener : _listeners) {
while( listeners.hasNext() ) { listener.onVehiclesReceived(event);
( (ITCPListener) listeners.next() ).onVehiclesReceived( event );
} }
} }
private synchronized void _fireNewSMS() { private synchronized void _fireNewSMS() {
TCPEvent event = new TCPEvent( this, _msg ); TCPEvent event = new TCPEvent( this, _msg );
Iterator<ITCPListener> listeners = _listeners.iterator(); for (ITCPListener listener : _listeners) {
while( listeners.hasNext() ) { listener.onNewSMSReceived(event);
( (ITCPListener) listeners.next() ).onNewSMSReceived(event);
} }
} }
private synchronized void _fireSMSconfirm() { private synchronized void _fireSMSconfirm() {
TCPEvent event = new TCPEvent( this, _msg ); TCPEvent event = new TCPEvent( this, _msg );
Iterator<ITCPListener> listeners = _listeners.iterator(); for (ITCPListener listener : _listeners) {
while( listeners.hasNext() ) { listener.onSMSAckReceived(event);
( (ITCPListener) listeners.next() ).onSMSAckReceived(event);
} }
} }
private synchronized void _fireLastPos() { private synchronized void _fireLastPos() {
TCPEvent event = new TCPEvent( this, _msg ); TCPEvent event = new TCPEvent( this, _msg );
Iterator<ITCPListener> listeners = _listeners.iterator(); for (ITCPListener listener : _listeners) {
while( listeners.hasNext() ) { listener.onLastPositionsReceived(event);
( (ITCPListener) listeners.next() ).onLastPositionsReceived(event);
} }
} }
private synchronized void _fireRadioEvent() { private synchronized void _fireRadioEvent() {
TCPEvent event = new TCPEvent( this, _msg ); TCPEvent event = new TCPEvent( this, _msg );
Iterator<ITCPListener> listeners = _listeners.iterator(); for (ITCPListener listener : _listeners) {
while( listeners.hasNext() ) { listener.onRadioMsgReceived(event);
( (ITCPListener) listeners.next() ).onRadioMsgReceived(event);
} }
} }
private synchronized void _fireHistPos() { private synchronized void _fireHistPos() {
TCPEvent event = new TCPEvent( this, _msg ); TCPEvent event = new TCPEvent( this, _msg );
Iterator<ITCPListener> listeners = _listeners.iterator(); for (ITCPListener listener : _listeners) {
while( listeners.hasNext() ) { listener.onHistoryPositionsReceived(event);
( (ITCPListener) listeners.next() ).onHistoryPositionsReceived(event);
} }
} }
private synchronized void _fireHistCount() { private synchronized void _fireHistCount() {
TCPEvent event = new TCPEvent( this, _msg ); TCPEvent event = new TCPEvent( this, _msg );
Iterator<ITCPListener> listeners = _listeners.iterator(); for (ITCPListener listener : _listeners) {
while( listeners.hasNext() ) { listener.onHistoryPositionsCountReceived(event);
( (ITCPListener) listeners.next() ).onHistoryPositionsCountReceived(event);
} }
} }
private synchronized void _fireAlarmList() { private synchronized void _fireAlarmList() {
TCPEvent event = new TCPEvent( this, _msg ); TCPEvent event = new TCPEvent( this, _msg );
Iterator<ITCPListener> listeners = _listeners.iterator(); for (ITCPListener listener : _listeners) {
while( listeners.hasNext() ) { listener.onAlarmsReceived(event);
( (ITCPListener) listeners.next() ).onAlarmsReceived(event);
} }
} }
private synchronized void _fireAlarmACK() { private synchronized void _fireAlarmACK() {
TCPEvent event = new TCPEvent( this, _msg ); TCPEvent event = new TCPEvent( this, _msg );
Iterator<ITCPListener> listeners = _listeners.iterator(); for (ITCPListener listener : _listeners) {
while( listeners.hasNext() ) { listener.onAlarmAckReceived(event);
( (ITCPListener) listeners.next() ).onAlarmAckReceived(event);
} }
} }
private synchronized void _fireAlarmLive() { private synchronized void _fireAlarmLive() {
TCPEvent event = new TCPEvent( this, _msg ); TCPEvent event = new TCPEvent( this, _msg );
Iterator<ITCPListener> listeners = _listeners.iterator(); for (ITCPListener listener : _listeners) {
while( listeners.hasNext() ) { listener.alarmLiveReceived(event);
( (ITCPListener) listeners.next() ).alarmLiveRecv(event);
} }
} }
private synchronized void _fireRecordList() { private synchronized void _fireRecordList() {
TCPEvent event = new TCPEvent( this, _msg ); TCPEvent event = new TCPEvent( this, _msg );
Iterator<ITCPListener> listeners = _listeners.iterator(); for (ITCPListener listener : _listeners) {
while( listeners.hasNext() ) { listener.onRecordingsListReceived(event);
( (ITCPListener) listeners.next()).onRecordingsListReceived(event);
} }
} }
private synchronized void _fireRecordPlay() { private synchronized void _fireRecordPlay() {
TCPEvent event = new TCPEvent( this, _msg ); TCPEvent event = new TCPEvent( this, _msg );
Iterator<ITCPListener> listeners = _listeners.iterator(); for (ITCPListener listener : _listeners) {
while( listeners.hasNext() ) { listener.onRecordingPlayReceived(event);
( (ITCPListener) listeners.next()).onRecordingPlayReceived(event);
} }
} }
private synchronized void _firePOLLEvent() { private synchronized void _firePOLLEvent() {
TCPEvent event = new TCPEvent( this, _msg ); TCPEvent event = new TCPEvent( this, _msg );
Iterator<ITCPListener> listeners = _listeners.iterator(); for (ITCPListener listener : _listeners) {
while( listeners.hasNext() ) { listener.onPollReceived(event);
( (ITCPListener) listeners.next()).onPollReceived(event);
} }
} }
private synchronized void _fireConnectionReplyEvent() { private synchronized void _fireConnectionReplyEvent() {
TCPEvent event = new TCPEvent( this, _msg ); TCPEvent event = new TCPEvent( this, _msg );
Iterator<ITCPListener> listeners = _listeners.iterator(); for (ITCPListener listener : _listeners) {
while( listeners.hasNext() ) { listener.onConnectionReplyReceived(event);
( (ITCPListener) listeners.next()).onConnectionReplyReceived(event);
} }
} }
private synchronized void _fireContactsReceivedEvent() { private synchronized void _fireContactsReceivedEvent() {
TCPEvent event = new TCPEvent( this, _msg ); TCPEvent event = new TCPEvent( this, _msg );
Iterator<ITCPListener> listeners = _listeners.iterator(); for (ITCPListener listener : _listeners) {
while( listeners.hasNext() ) { listener.onContactsListReceived(event);
( (ITCPListener) listeners.next()).onContactsListReceived(event);
} }
} }
private synchronized void _fireRecordingsReceivedEvent() { private synchronized void _fireRecordingsReceivedEvent() {
TCPEvent event = new TCPEvent( this, _msg ); TCPEvent event = new TCPEvent( this, _msg );
Iterator<ITCPListener> listeners = _listeners.iterator(); for (ITCPListener listener : _listeners) {
while( listeners.hasNext() ) { listener.onRecordingsListReceived(event);
( (ITCPListener) listeners.next()).onRecordingsListReceived(event);
} }
} }
private synchronized void _fireTextMessagesReceivedEvent() { private synchronized void _fireTextMessagesReceivedEvent() {
TCPEvent event = new TCPEvent( this, _msg ); TCPEvent event = new TCPEvent( this, _msg );
Iterator<ITCPListener> listeners = _listeners.iterator(); for (ITCPListener listener : _listeners) {
while( listeners.hasNext() ) { listener.onTextMessagesListReceived(event);
( (ITCPListener) listeners.next()).onTextMessagesListReceived(event);
} }
} }
@ -217,66 +187,55 @@ public class TCPmsgParser implements Runnable{
private synchronized void _fireRecordingPlayReceivedEvent() { private synchronized void _fireRecordingPlayReceivedEvent() {
TCPEvent event = new TCPEvent( this, _msg ); TCPEvent event = new TCPEvent( this, _msg );
Iterator<ITCPListener> listeners = _listeners.iterator(); for (ITCPListener listener : _listeners) {
while( listeners.hasNext() ) { listener.onRecordingPlayReceived(event);
( (ITCPListener) listeners.next()).onRecordingPlayReceived(event);
} }
} }
public static synchronized void _fireTCPConnectionDownEvent(boolean previuosWasConnectionUp) { public static synchronized void _fireTCPConnectionDownEvent(boolean previuosWasConnectionUp) {
Iterator<ITCPListener> listeners = _listeners.iterator(); for (ITCPListener listener : _listeners) {
while( listeners.hasNext() ) { listener.onTCPConnectionDown(previuosWasConnectionUp);
( (ITCPListener) listeners.next()).onTCPConnectionDown(previuosWasConnectionUp);
} }
} }
public static synchronized void _fireTCPConnectionUpEvent(boolean previuosWasConnectionUp) { public static synchronized void _fireTCPConnectionUpEvent(boolean previuosWasConnectionUp) {
Iterator<ITCPListener> listeners = _listeners.iterator(); for (ITCPListener listener : _listeners) {
while( listeners.hasNext() ) { listener.onTCPConnectionUp(previuosWasConnectionUp);
( (ITCPListener) listeners.next()).onTCPConnectionUp(previuosWasConnectionUp);
} }
} }
public static synchronized void _fireonTCPConnectionStatusEvent(boolean isConnectionUp, boolean previuosWasConnectionUp) { public static synchronized void _fireonTCPConnectionStatusEvent(boolean isConnectionUp, boolean previuosWasConnectionUp) {
Iterator<ITCPListener> listeners = _listeners.iterator(); for (ITCPListener listener : _listeners) {
while( listeners.hasNext() ) { listener.onTCPConnectionStatusReceived(isConnectionUp, previuosWasConnectionUp);
( (ITCPListener) listeners.next()).onTCPConnectionStatusReceived(isConnectionUp, previuosWasConnectionUp);
} }
} }
public static synchronized void _firePONGReceivedEvent() { public static synchronized void _firePONGReceivedEvent() {
Iterator<ITCPListener> listeners = _listeners.iterator(); for (ITCPListener listener : _listeners) {
while( listeners.hasNext() ) { listener.onPONGReceived();
( (ITCPListener) listeners.next()).onPONGReceived();
} }
} }
@Override @Override
public void run() public void run() {
{ while(run) {
while(run)
{
//SM.Debug("TCPmsgParser waiting for data...");
sleep(1); sleep(1);
if (TCPhandler.msgList == null) if (TCPhandler.msgList == null)
continue; continue;
if(!TCPhandler.msgList.isEmpty()) if(!TCPhandler.msgList.isEmpty()) {
{ try {
try
{
_msg = TCPhandler.msgList.poll(); _msg = TCPhandler.msgList.poll();
if(_msg == null) if(_msg == null)
continue; continue;
if(_msg.OK == false) if(!_msg.OK)
continue; continue;
//parse the rest of the message; //parse the rest of the message;
switch(_msg.opCode) switch(_msg.opCode) {
{
case 40:{ case 40:{
_fireLoginEvent(); _fireLoginEvent();
break; break;
@ -297,10 +256,7 @@ public class TCPmsgParser implements Runnable{
break; break;
} }
case OperationCodes.TM_ACK:{ case OperationCodes.TM_ACK:
_fireSMSconfirm();
break;
}
case OperationCodes.TM_ACK_SD: { case OperationCodes.TM_ACK_SD: {
_fireSMSconfirm(); _fireSMSconfirm();
break; break;
@ -404,38 +360,23 @@ public class TCPmsgParser implements Runnable{
default: default:
break; break;
} }
} } catch(Exception ex) {
catch(Exception ex)
{
try { try {
if(TCPhandler.msgList.size() > 0) if(TCPhandler.msgList.size() > 0)
_msg = TCPhandler.msgList.remove(0); _msg = TCPhandler.msgList.remove(0);
} } catch(NoSuchElementException exe) {
catch(NoSuchElementException exe)
{
SM.Exception("TCP msg Parser", "NoSuchElementException"); SM.Exception("TCP msg Parser", "NoSuchElementException");
} }
} }
} }
} }
/*
catch (Exception e)
{
SM.Debug("Error on fire Event:"+e.toString());
break;
}
}*/
SM.Debug("TCPmsgParser listen thread stoped."); SM.Debug("TCPmsgParser listen thread stoped.");
} }
private void sleep(int miliseconds) { private void sleep(int miliseconds) {
try { try {
Thread.sleep(miliseconds); Thread.sleep(miliseconds);
} catch (InterruptedException e) { } catch (InterruptedException ignored) { }
}
} }
public void clearMsgList() public void clearMsgList()
@ -443,17 +384,14 @@ public class TCPmsgParser implements Runnable{
TCPhandler.msgList.clear(); TCPhandler.msgList.clear();
} }
public void Stop() public void Stop() {
{
run = false; run = false;
// stop thread // stop thread
if(TCPmsgParserThread != null) if(TCPmsgParserThread != null) {
{
Thread moribund = TCPmsgParserThread; Thread moribund = TCPmsgParserThread;
TCPmsgParserThread = null; TCPmsgParserThread = null;
moribund.interrupt(); moribund.interrupt();
} }
SM.Debug("Stoping TCPmsgParser"); SM.Debug("Stoping TCPmsgParser");
} }
} }

Binary file not shown.

Before

Width:  |  Height:  |  Size: 16 KiB

View File

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

View File

@ -0,0 +1,5 @@
<?xml version="1.0" encoding="utf-8"?>
<adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android">
<background android:drawable="@color/ic_launcher_background"/>
<foreground android:drawable="@mipmap/ic_launcher_foreground"/>
</adaptive-icon>

View File

@ -0,0 +1,5 @@
<?xml version="1.0" encoding="utf-8"?>
<adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android">
<background android:drawable="@color/ic_launcher_background"/>
<foreground android:drawable="@mipmap/ic_launcher_foreground"/>
</adaptive-icon>

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1020 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 12 KiB

View File

@ -1,14 +1,36 @@
apply plugin: 'com.android.application' apply plugin: 'com.android.application'
apply plugin: 'com.google.android.libraries.mapsplatform.secrets-gradle-plugin' apply plugin: 'com.google.android.libraries.mapsplatform.secrets-gradle-plugin'
apply plugin: "com.gladed.androidgitversion"
buildscript {
repositories {
maven {
url "https://plugins.gradle.org/m2/"
}
mavenCentral()
}
dependencies {
classpath "gradle.plugin.com.gladed.gradle.androidgitversion:gradle-android-git-version:0.4.3"
}
}
androidGitVersion {
codeFormat 'MNNBBBB'
format '%tag%%.count%'
hideBranches = ['develop']
}
android { android {
compileSdkVersion 31 compileSdkVersion 31
buildToolsVersion "31.0.0" buildToolsVersion "31.0.0"
defaultConfig { defaultConfig {
applicationId "com.safemobile.dispatch" applicationId "com.safemobile.safedispatch"
minSdkVersion 21 minSdkVersion 21
targetSdkVersion 31 targetSdkVersion 31
versionName androidGitVersion.name()
versionCode androidGitVersion.code()
archivesBaseName = "SafeDispatchMobile_v.$versionName"
} }
buildTypes { buildTypes {
@ -20,6 +42,13 @@ android {
buildFeatures { buildFeatures {
viewBinding false viewBinding false
} }
lintOptions {
checkReleaseBuilds false
// Or, if you prefer, you can continue to check for errors in release builds,
// but continue the build even when errors are found:
//abortOnError false
}
} }
dependencies { dependencies {
implementation project(':libSafeMobile') implementation project(':libSafeMobile')
@ -49,6 +78,4 @@ dependencies {
// add Gson // add Gson
implementation 'com.google.code.gson:gson:2.8.6' 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

@ -1,22 +1,21 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android" <manifest xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools" package="com.safemobile.safedispatch">
package="com.safemobile.dispatch"
android:versionCode="9"
android:versionName="1.0.9">
<!-- require OpenGL ES version 2 for Google Maps --> <!-- require OpenGL ES version 2 for Google Maps -->
<uses-feature <uses-feature
android:glEsVersion="0x00020000" android:glEsVersion="0x00020000"
android:required="true" /> android:required="true" />
<uses-permission android:name="android.permission.CAMERA" /> <uses-permission android:name="android.permission.CAMERA" android:required="false"/>
<uses-permission android:name="android.permission.INTERNET" /> <uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="com.google.android.providers.gsf.permission.READ_GSERVICES" /> <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<uses-permission android:name="android.permission.READ_GSERVICES" />
<uses-permission android:name="android.permission.RECORD_AUDIO" /> <uses-permission android:name="android.permission.RECORD_AUDIO" />
<uses-permission android:name="android.permission.MODIFY_AUDIO_SETTINGS" /> <uses-permission android:name="android.permission.MODIFY_AUDIO_SETTINGS" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-feature android:name="android.hardware.camera" /> <uses-feature android:name="android.hardware.camera" />
<uses-feature <uses-feature
@ -28,7 +27,7 @@
<application <application
android:configChanges="orientation" android:configChanges="orientation"
android:icon="@drawable/ic_launcher" android:icon="@mipmap/ic_launcher"
android:label="@string/app_name" android:label="@string/app_name"
android:screenOrientation="landscape" android:screenOrientation="landscape"
android:theme="@style/AppTheme"> android:theme="@style/AppTheme">
@ -43,10 +42,9 @@
<service android:name="com.safemobile.services.TCPService" /> <service android:name="com.safemobile.services.TCPService" />
<activity <activity
android:name=".SDMobileActivity" android:name="com.safemobile.safedispatch.SDMobileActivity"
android:configChanges="orientation" android:configChanges="orientation"
android:exported="true" android:exported="true"
android:label="@string/app_name_demo"
android:screenOrientation="landscape"> android:screenOrientation="landscape">
<intent-filter> <intent-filter>
<action android:name="android.intent.action.MAIN" /> <action android:name="android.intent.action.MAIN" />
@ -55,41 +53,41 @@
</intent-filter> </intent-filter>
</activity> </activity>
<activity <activity
android:name=".SetupActivity" android:name="com.safemobile.safedispatch.SetupActivity"
android:configChanges="orientation" android:configChanges="orientation"
android:screenOrientation="landscape" /> android:screenOrientation="landscape" />
<activity <activity
android:name=".TabLayoutActivity" android:name="com.safemobile.safedispatch.TabLayoutActivity"
android:configChanges="orientation" android:configChanges="orientation"
android:screenOrientation="landscape" /> android:screenOrientation="landscape" />
<activity <activity
android:name=".LiveActivity" android:name="com.safemobile.safedispatch.LiveActivity"
android:exported="false" android:exported="false"
android:configChanges="orientation" android:configChanges="orientation"
android:screenOrientation="landscape" android:screenOrientation="landscape"
android:label="@string/title_activity_google_maps" /> android:label="@string/title_activity_google_maps" />
<activity <activity
android:name=".HistoryActivity" android:name="com.safemobile.safedispatch.HistoryActivity"
android:configChanges="orientation" android:configChanges="orientation"
android:screenOrientation="landscape" /> android:screenOrientation="landscape" />
<activity <activity
android:name=".MessagesActivity" android:name="com.safemobile.safedispatch.MessagesActivity"
android:configChanges="orientation" android:configChanges="orientation"
android:screenOrientation="landscape" /> android:screenOrientation="landscape" />
<activity <activity
android:name=".AlarmActivity" android:name="com.safemobile.safedispatch.AlarmActivity"
android:configChanges="orientation" android:configChanges="orientation"
android:screenOrientation="landscape" /> android:screenOrientation="landscape" />
<activity <activity
android:name=".RadioActivity" android:name="com.safemobile.safedispatch.RadioActivity"
android:configChanges="orientation" android:configChanges="orientation"
android:screenOrientation="landscape" /> android:screenOrientation="landscape" />
<activity <activity
android:name=".RecordingsActivity" android:name="com.safemobile.safedispatch.RecordingsActivity"
android:configChanges="orientation" android:configChanges="orientation"
android:screenOrientation="landscape" /> android:screenOrientation="landscape" />
<activity <activity
android:name=".NotificationActivity" android:name="com.safemobile.safedispatch.NotificationActivity"
android:configChanges="orientation" android:configChanges="orientation"
android:screenOrientation="landscape" /> android:screenOrientation="landscape" />
</application> </application>

Binary file not shown.

After

Width:  |  Height:  |  Size: 18 KiB

View File

@ -1,259 +0,0 @@
package com.safemobile.dispatch;
import java.util.ArrayList;
import java.util.Locale;
/** fix import*/
import com.safemobile.adapters.AlertGridViewAdapter;
import com.safemobile.adapters.AlertGridViewAdapter.ViewHolder;
import com.safemobile.lib.Alarm;
import com.safemobile.lib.AppParams;
import com.safemobile.lib.OperationCodes;
import com.safemobile.lib.SM;
import android.app.Activity;
import android.app.AlertDialog;
import android.content.Context;
import android.content.DialogInterface;
import android.content.res.Configuration;
import android.graphics.Typeface;
import android.os.Bundle;
import android.os.Handler;
import android.view.View;
import android.widget.AdapterView;
import android.widget.TextView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.GridView;
public class AlarmActivity extends Activity {
private Context context;
public TabLayoutActivity parentTab;
public ArrayList<Alarm> allAlarms = new ArrayList<Alarm>();
private ArrayList<Boolean> acknowledged = new ArrayList<Boolean>();
private AlertGridViewAdapter adapter;
/* Visual resources */
private GridView gridView;
public View convertViewAlarm;
private int ack_position;
public Bundle savedInstanceState;
// Need handler for callbacks to the UI thread
private final Handler myHandler = new Handler();
/** Called when the activity is first created. */
@Override
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());
context = this;
setContentView(R.layout.tabalarm);
gridView = (GridView) findViewById(R.id.gridViewAlarms);
adapter = new AlertGridViewAdapter(this, allAlarms, context, acknowledged);
gridView.setAdapter(adapter);
gridView.setOnItemClickListener(onItemClickListener);
// change tab header fontface
TextView textView1 = (TextView) findViewById(R.id.textView1);
textView1.setTypeface(Typeface.createFromAsset(getAssets(), "Sketch_Block.ttf"));
textView1.setTextSize(24);
parentTab.alarmActivity = this;
}
@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();
}
@Override
public void onPause()
{
super.onPause();
SM.Debug("onPause");
}
@Override
public void onResume()
{
super.onResume();
if(!AppParams.DEMO)
GetAlarms();
else if (AppParams.DEMO)
{
for(int i=allAlarms.size()-1; i>=0; i--)
{
Alarm alarm = allAlarms.get(i);
if(alarm.ack==1)
allAlarms.remove(i);
}
acknowledged = new ArrayList<Boolean>();
for(int i=0;i<allAlarms.size();i++)
acknowledged.add(false);
updateResultsInUi("alarm");
}
SM.Debug("onResume");
}
private OnItemClickListener onItemClickListener = new OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> arg0, View arg1, int position,
long arg3) {
SM.Debug(" ### CLICK Alarm : " + position);
convertViewAlarm = arg1;
// save position
ack_position = position;
//Toast.makeText(context, "SETACK " + idx, 1000).show();
if(!AppParams.DEMO)
setACK(allAlarms.get(position).idx,allAlarms.get(position).type);
else
{
allAlarms.get(position).ack = 1;
updateResultsInUi("else");
}
}
};
// Update Alarms received from AppServer
public void UpdateAlarms(ArrayList<Alarm> list)
{
SM.Debug("## UpdateAlarms: " + list.size());
allAlarms = list;
acknowledged = new ArrayList<Boolean>();
// set acknowledged based on alarm.ack value
for(Alarm alarm: allAlarms)
{
acknowledged.add((alarm.ack == 1)? true: false);
SM.Debug("ALARM", "SC_ID> " + alarm.sc_id + " | "
+ (parentTab.getVehHashByScId().get(alarm.sc_id) == null ? "null" : parentTab.getVehHashByScId().get(alarm.sc_id).name ));
if (parentTab.getVehHashByScId().get(alarm.sc_id)!=null)
alarm.unitName = parentTab.getVehHashByScId().get(alarm.sc_id).name;
/*Enumeration<Long> keylist = parentTab.SuperVehHash.keys();
while(keylist.hasMoreElements())
{
SuperVehicle tmp = (SuperVehicle)((parentTab.SuperVehHash.get((long)keylist.nextElement())));
if (tmp.sc_id==alarm.sc_id)
{
alarm.unitName = tmp.name;
break;
}
}*/
}
myHandler.post(UpdateResultsRUN);
}
// Create runnable for posting
final Runnable UpdateResultsRUN = new Runnable() {
public void run() {
updateResultsInUi("alarm");
}
};
private void updateResultsInUi(String param)
{
if(param.equals("alarm"))
{
// set adapter
adapter = new AlertGridViewAdapter(this, allAlarms, context, acknowledged);
gridView.setAdapter(adapter);
}
else
{
adapter.changeACK(ack_position);
SM.Debug("Set ACK: " + ack_position + " | " + (acknowledged.get(ack_position) ? "true": "false"));
ViewHolder viewAlarm = new ViewHolder();
viewAlarm = (ViewHolder) convertViewAlarm.getTag();
switch(acknowledged.get(ack_position) ? 1 : 0)
{
case 1:
viewAlarm.imageViewAlert.setImageResource(R.drawable.alert_off);
//view.imgViewIcon.setImageDrawable(adapter.convertToGrayscale(activity.getResources().getDrawable(liveVehicle.get(position).getSmallIcon())));
break;
case 0:
//view.imgViewAlarm.setImageResource(R.drawable.siren);
//view.imgViewIcon.setImageResource(liveVehicle.get(position).getSmallIcon());
break;
}
}
}
// update ACK received from AppServer
public void UpdateACK()
{
myHandler.post(UpdateAckRUN);
}
// Create runnable for posting
final Runnable UpdateAckRUN = new Runnable() {
public void run() {
SM.Debug(" UpdateACK: ");
updateResultsInUi("adapter");
}
};
// send to AppServer
private void GetAlarms()
{
parentTab.executeNetworkStuff(new String[]{OperationCodes.GetAlarms +"", AppParams.USERID + ""});
//parentTab.getAlarms(AppParams.USERID);
}
// send ACK to AppServer
private void setACK(int idx, int type)
{
parentTab.executeNetworkStuff(new String[]{OperationCodes.SendAlarmAcknoledge +"", idx + "", type + ""});
//parentTab.sendAlarmAcknowledge(idx, type);
}
}

View File

@ -1,162 +0,0 @@
package com.safemobile.dispatch;
import androidx.appcompat.app.AppCompatActivity;
import android.os.Bundle;
import android.widget.ArrayAdapter;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.Spinner;
import android.widget.TextView;
import com.google.android.gms.maps.GoogleMap;
import com.google.android.gms.maps.SupportMapFragment;
import com.safemobile.lib.AppParams;
import com.safemobile.lib.SM;
import com.safemobile.lib.Vehicle;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.Locale;
public class HistoryActivity extends AppCompatActivity {
public Bundle savedInstanceState;
private TabLayoutActivity parentTab;
private GoogleMap googleMap;
private Spinner spinnerVehicle;
private ImageView changeMapType, checkTraffic, slideLayoutImage;
private LinearLayout layoutTraffic, slidelayout, layoutVehicles;
private ArrayList<Vehicle> allVehicle = new ArrayList<>();
private ArrayList<String> allVehicleNames = new ArrayList<>();
private ArrayAdapter<String> adapter;
private boolean showVehicle = true;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
this.savedInstanceState = savedInstanceState;
setContentView(R.layout.tabhistory);
parentTab = (TabLayoutActivity) getParent();
parentTab.historyActivity = this;
Locale locale = new Locale(AppParams.LANGUAGETMP);
Locale.setDefault(locale);
googleMap = parentTab.liveActivity.getMap();
SupportMapFragment mapFragment = (SupportMapFragment) getSupportFragmentManager()
.findFragmentById(R.id.map);
spinnerVehicle = findViewById(R.id.spinnerVehicle);
getVehicles();
adapter = new ArrayAdapter<>(this, android.R.layout.simple_spinner_item, allVehicleNames);
adapter.setDropDownViewResource(android.R.layout.simple_dropdown_item_1line);
spinnerVehicle.setAdapter(adapter);
spinnerVehicle.setSelection(0);
changeMapType();
changeTraffic();
slidelayout = findViewById(R.id.slidelayout);
slideLayoutImage = findViewById(R.id.slideLayoutImage);
layoutVehicles = findViewById(R.id.layoutBig);
// slidelayout.setOnTouchListener((v, event) -> {
// if (showVehicle) {
// layoutVehicles.setVisibility(View.GONE);
// slideLayoutImage.setImageResource(R.drawable.arrow_right);
// showVehicle = false;
// } else {
// layoutVehicles.setVisibility(View.VISIBLE);
// slideLayoutImage.setImageResource(R.drawable.arrow_left);
// showVehicle = true;
// }
// return false;
// });
setDate();
}
private void setDate() {
Calendar calendar = Calendar.getInstance();
Date endDate = calendar.getTime();
calendar.add(Calendar.DATE, -1);
Date startDate = calendar.getTime();
LinearLayout layoutStartPicker = findViewById(R.id.layoutStartPicker);
TextView textViewDate = findViewById(R.id.textViewStartDate);
textViewDate.setText(new SimpleDateFormat("HH:mm, dd.MM.yyyy").format(startDate));
// layoutStartPicker.setOnTouchListener((v, event) -> {
// showDialog(layoutStartPicker);
// return false;
// });
// layoutEndPicker.setOnTouchListener(new OnTouchListener() {
// @Override
// public boolean onTouch(View v, MotionEvent event) {
// showDialog(layoutEndPicker);
// return false;
// }
// });
}
private void changeTraffic() {
ImageView changeTrafficImageView = findViewById(R.id.changeTraffic);
changeTrafficImageView.setOnClickListener(v -> {
if (googleMap.isTrafficEnabled()) {
changeTrafficImageView.setImageResource(R.drawable.traffic_off);
googleMap.setTrafficEnabled(false);
} else {
changeTrafficImageView.setImageResource(R.drawable.traffic);
googleMap.setTrafficEnabled(true);
}
});
}
private void changeMapType() {
changeMapType = findViewById(R.id.changeMapType);
ImageView changeMapTypeImageView = findViewById(R.id.changeMapType);
changeMapType.setOnClickListener(view -> {
if (googleMap.getMapType() == GoogleMap.MAP_TYPE_SATELLITE) {
changeMapTypeImageView.setImageResource(R.drawable.satellite);
googleMap.setMapType(GoogleMap.MAP_TYPE_SATELLITE);
} else {
changeMapTypeImageView.setImageResource(R.drawable.map);
googleMap.setMapType(GoogleMap.MAP_TYPE_NORMAL);
}
});
}
public void getVehicles() {
try {
for (Vehicle vehicle : parentTab.getAllVehicle()) {
allVehicleNames.add(vehicle.name);
allVehicle.add(vehicle);
}
} catch (Exception ex) { }
}
public void UpdateMap() {
SM.Debug("Do the updateMAP post");
}
public void UpdateUnableDisp() {
SM.Debug("Do Cancelwindow");
}
public void UpdateCancel() {
SM.Debug("Do Cancelwindow");
}
public void UpdateNrPos(int size) {
SM.Debug("Do Cancelwindow");
}
}

View File

@ -1,411 +0,0 @@
package com.safemobile.dispatch;
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;
import android.content.res.Configuration;
import android.graphics.Typeface;
import android.media.MediaPlayer;
import android.os.Bundle;
import android.os.Handler;
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;
import com.safemobile.adapters.RecordingsGridViewAdapter;
import com.safemobile.lib.AppParams;
import com.safemobile.lib.OperationCodes;
import com.safemobile.lib.Recording;
import com.safemobile.lib.SM;
import com.safemobile.lib.radio.RadioGW;
import com.safemobile.lib.sound.RecordingHandle;
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;
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;
public View convertViewRecording;
public int playingPosition = -1;
// Need handler for callbacks to the UI thread
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);
// 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);
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.allRadios.get(which).GW_ID, parentTab.allRadios.get(which).ID);
}
});
AlertDialog alert = builder.create();
alert.show();
}
});
textViewGateway.setVisibility(View.INVISIBLE);
parentTab.recordingsActivity = 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);
TextView text = (TextView) dialog.findViewById(R.id.text);
ImageView image = (ImageView) dialog.findViewById(R.id.image);
image.setImageResource(R.drawable.ic_launcher);
text.setText(errorMsg);
dialog.show();
}
@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.crtRadio != null)
textViewGateway.setText(parentTab.crtRadio.IP);
/*
if(parentTab.allRadios == null)
GetGWRadios();
*/
if(playingPosition < 0 && parentTab.crtRadio != null)
{
SM.Debug("GetRecordings resume + crtRadio:"+parentTab.crtRadio.toString());
GetRecordings(parentTab.crtRadio.GW_ID, parentTab.crtRadio.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
gridView.setEnabled(false);
convertViewRecording = view;
// change background to playing
adapter.changePlaying(position, true);
// if no recording is playing and not DEMO
if(playingPosition<0 && !AppParams.DEMO)
{
// send recording request to App Server
SendPlayRequest(allRecordings.get(position).ID);
// flag that sound is needed
recHandle.StartSound();
recHandle.soundNeeded = true;
}
// no recording is playing and DEMO
else if(playingPosition<0 && AppParams.DEMO)
{
// create player which will play demo recordings
MediaPlayer player = new MediaPlayer();
AssetFileDescriptor afd;
try {
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();
} catch (IOException e) { }
}
// save playing position
playingPosition = position;
// start the timer which will reset the UI to 'no recording playing'
startRecordingStoperTimer(allRecordings.get(playingPosition).endGMT - allRecordings.get(playingPosition).startGMT);
}
};
/** 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);
// sleep for amount of time
try {
Thread.sleep(ms);
} catch (InterruptedException e) {
e.printStackTrace();
}
// modify the UI after the recording is done playing
myHandler.post(stopRecordingRUN);
}
}).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();
}
};
private void updateResultsInUi()
{
// clear played items
playingPositions = new ArrayList<Boolean>();
for(int i=0; i<allRecordings.size(); i++)
playingPositions.add(true);
// 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<allRecordings.size(); i++)
playingPositions.add(false);
updateNumberOfRecordings();
gridView.setAdapter(adapter);
}
// 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+"");
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.crtRadio.IP);
GetRecordings(parentTab.crtRadio.GW_ID, parentTab.crtRadio.ID);
}
}
};
}

View File

@ -0,0 +1,50 @@
package com.safemobile.lib;
import android.app.Activity;
import android.app.AlertDialog;
import com.google.android.gms.tasks.Task;
import com.google.android.gms.tasks.TaskCompletionSource;
import com.safemobile.safedispatch.R;
import com.safemobile.interfaces.IDialogService;
public class DialogService implements IDialogService {
@Override
public Task<Boolean> showDialog(Activity activity, String title, String message, String cancel, String ok) {
TaskCompletionSource<Boolean> taskCompletionSource = new TaskCompletionSource<>();
AlertDialog.Builder builder = new AlertDialog.Builder(activity)
.setTitle(title)
.setMessage(message)
.setCancelable(false)
.setNegativeButton(cancel, (dialog, which) -> {
taskCompletionSource.trySetResult(false);
dialog.dismiss();
})
.setPositiveButton(ok, (dialog, which) -> taskCompletionSource.trySetResult(true));
AlertDialog dialog = builder.create();
dialog.show();
return taskCompletionSource.getTask();
}
@Override
public Task<Boolean> showPermissionRequestDialog(Activity activity, String message, String cancel) {
return showDialog(
activity,
activity.getString(R.string.permission_denied),
message,
cancel,
activity.getString(R.string.go_to_settings));
}
@Override
public void showError(Activity activity, String message) {
showDialog(
activity,
activity.getString(R.string.DialogService_Info_ErrorMessage),
message,
null,
activity.getString(R.string.ok));
}
}

View File

@ -0,0 +1,97 @@
package com.safemobile.lib;
import android.Manifest;
import android.app.Activity;
import android.content.pm.PackageManager;
import androidx.core.app.ActivityCompat;
import androidx.core.content.ContextCompat;
import com.safemobile.enums.AuthorizationCode;
import com.safemobile.enums.AuthorizationStatus;
import com.safemobile.interfaces.IPermissionModule;
import java.security.InvalidParameterException;
public class PermissionModule implements IPermissionModule {
private static final String[] AUDIO_PERMISSIONS = {Manifest.permission.RECORD_AUDIO};
private static final String[] LOCATION_PERMISSIONS = {
Manifest.permission.ACCESS_COARSE_LOCATION,
Manifest.permission.ACCESS_FINE_LOCATION
};
private static final String[] CAMERA_PERMISSIONS = {Manifest.permission.CAMERA};
private static final String[] READ_EXTERNAL_STORAGE_PERMISSIONS = {Manifest.permission.READ_EXTERNAL_STORAGE};
private static final String[] WRITE_EXTERNAL_STORAGE_PERMISSIONS = {Manifest.permission.WRITE_EXTERNAL_STORAGE};
public static final int RECORD_AUDIO_PERMISSION_REQUEST_CODE = 13042022;
public static final int LOCATION_PERMISSION_REQUEST_CODE = 12021990;
public static final int CAMERA_PERMISSION_REQUEST_CODE = 16031989;
public static final int READ_STORAGE_PERMISSION_REQUEST_CODE = 30062018;
public static final int WRITE_STORAGE_PERMISSION_REQUEST_CODE = 13122012;
private boolean permissionPrompShowed;
@Override
public AuthorizationStatus getAuthorizationStatus(Activity activity, AuthorizationCode authorizationCode) {
switch (authorizationCode) {
case RECORD_AUDIO:
return getPermissionAuthorizationStatus(activity, Manifest.permission.RECORD_AUDIO);
case CAMERA:
return getPermissionAuthorizationStatus(activity, Manifest.permission.CAMERA);
case GEOLOCATION:
return getPermissionAuthorizationStatus(activity, Manifest.permission.ACCESS_COARSE_LOCATION);
case READ_EXTERNAL_STORAGE:
return getPermissionAuthorizationStatus(activity, Manifest.permission.READ_EXTERNAL_STORAGE);
case WRITE_EXTERNAL_STORAGE:
return getPermissionAuthorizationStatus(activity, Manifest.permission.WRITE_EXTERNAL_STORAGE);
case UNKNOWN:
throw new InvalidParameterException(authorizationCode.name());
default:
throw new IllegalArgumentException(authorizationCode.name());
}
}
@Override
public void requestAuthorization(Activity activity, AuthorizationCode authorizationCode) {
switch (authorizationCode) {
case RECORD_AUDIO:
ActivityCompat.requestPermissions(activity, AUDIO_PERMISSIONS, RECORD_AUDIO_PERMISSION_REQUEST_CODE);
break;
case CAMERA:
ActivityCompat.requestPermissions(activity, CAMERA_PERMISSIONS, CAMERA_PERMISSION_REQUEST_CODE);
break;
case GEOLOCATION:
ActivityCompat.requestPermissions(activity, LOCATION_PERMISSIONS, LOCATION_PERMISSION_REQUEST_CODE);
break;
case READ_EXTERNAL_STORAGE:
ActivityCompat.requestPermissions(activity, READ_EXTERNAL_STORAGE_PERMISSIONS, READ_STORAGE_PERMISSION_REQUEST_CODE);
break;
case WRITE_EXTERNAL_STORAGE:
ActivityCompat.requestPermissions(activity, WRITE_EXTERNAL_STORAGE_PERMISSIONS, WRITE_STORAGE_PERMISSION_REQUEST_CODE);
break;
case UNKNOWN:
throw new InvalidParameterException(authorizationCode.name());
default:
throw new IllegalArgumentException(authorizationCode.name());
}
permissionPrompShowed = true;
}
private AuthorizationStatus getPermissionAuthorizationStatus(Activity activity, String permission) {
int permissionState = ContextCompat.checkSelfPermission(activity.getApplicationContext(), permission);
return authorizationStatus(activity, permissionState);
}
private AuthorizationStatus authorizationStatus(Activity activity, int permissionState) {
if (permissionState == PackageManager.PERMISSION_GRANTED)
return AuthorizationStatus.AUTHORIZE;
if (!permissionPrompShowed)
return AuthorizationStatus.NOT_DETERMINED;
boolean shouldShowPermissionPrompt = ActivityCompat.shouldShowRequestPermissionRationale(activity, Manifest.permission.ACCESS_COARSE_LOCATION);
return shouldShowPermissionPrompt ? AuthorizationStatus.NOT_DETERMINED : AuthorizationStatus.DENIED;
}
}

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@ -0,0 +1,239 @@
package com.safemobile.safedispatch;
import java.util.ArrayList;
import java.util.Locale;
import com.safemobile.adapters.AlertGridViewAdapter;
import com.safemobile.adapters.AlertGridViewAdapter.ViewHolder;
import com.safemobile.lib.Alarm;
import com.safemobile.lib.AppParams;
import com.safemobile.lib.OperationCodes;
import com.safemobile.lib.SM;
import android.app.Activity;
import android.app.AlertDialog;
import android.content.Context;
import android.content.res.Configuration;
import android.graphics.Typeface;
import android.os.Bundle;
import android.os.Handler;
import android.os.Looper;
import android.view.View;
import android.widget.AdapterView;
import android.widget.TextView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.GridView;
public class AlarmActivity extends Activity {
private Context context;
private TabLayoutActivity parentTab;
private ArrayList<Alarm> allAlarms = new ArrayList<>();
private ArrayList<Boolean> acknowledged = new ArrayList<>();
private AlertGridViewAdapter adapter;
/* Visual resources */
private GridView gridView;
private View convertViewAlarm;
private int ackPosition;
private Bundle savedInstanceState;
// Need handler for callbacks to the UI thread
private final Handler myHandler = new Handler(Looper.getMainLooper());
private static final String ALARM = "alarm";
/**
* Called when the activity is first created.
*/
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
this.setSavedInstanceState(savedInstanceState);
// get parentTab
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());
context = this;
setContentView(R.layout.tabalarm);
gridView = findViewById(R.id.gridViewAlarms);
adapter = new AlertGridViewAdapter(this, getAllAlarms(), context, acknowledged);
gridView.setAdapter(adapter);
gridView.setOnItemClickListener(onItemClickListener);
// change tab header fontFace
TextView textView1 = findViewById(R.id.textView1);
textView1.setTypeface(Typeface.createFromAsset(getAssets(), "Sketch_Block.ttf"));
textView1.setTextSize(24);
getParentTab().setAlarmActivity(this);
}
@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();
}
@Override
public void onPause() {
super.onPause();
SM.Debug("onPause");
}
@Override
public void onResume() {
super.onResume();
if (!AppParams.DEMO)
getAlarms();
else {
for (int i = getAllAlarms().size() - 1; i >= 0; i--) {
Alarm alarm = getAllAlarms().get(i);
if (alarm.ack == 1)
getAllAlarms().remove(i);
}
acknowledged = new ArrayList<>();
for (int i = 0; i < getAllAlarms().size(); i++)
acknowledged.add(false);
updateResultsInUi(ALARM);
}
SM.Debug("onResume");
}
private final OnItemClickListener onItemClickListener = new OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> arg0, View arg1, int position,
long arg3) {
SM.Debug(" ### CLICK Alarm : " + position);
setConvertViewAlarm(arg1);
// save position
ackPosition = position;
if (!AppParams.DEMO)
setACK(getAllAlarms().get(position).idx, getAllAlarms().get(position).type, getAllAlarms().get(position).unitName);
else {
getAllAlarms().get(position).ack = 1;
updateResultsInUi("else");
}
}
// send ACK to AppServer
private void setACK(int idx, int type, String unitName) {
getParentTab().executeNetworkStuff(new String[]{OperationCodes.SendAlarmAcknoledge + "", idx + "", type + "", unitName});
}
};
// Update Alarms received from AppServer
public void updateAlarms(ArrayList<Alarm> list) {
SM.Debug("## updateAlarms: " + list.size());
setAllAlarms(list);
acknowledged = new ArrayList<>();
// set acknowledged based on alarm.ack value
for (Alarm alarm : getAllAlarms()) {
acknowledged.add(alarm.ack == 1);
SM.Debug("ALARM", "SC_ID> " + alarm.sc_id + " | "
+ (getParentTab().getVehHashByScId().get(alarm.sc_id) == null ? "null" : getParentTab().getVehHashByScId().get(alarm.sc_id).name));
if (getParentTab().getVehHashByScId().get(alarm.sc_id) != null)
alarm.unitName = getParentTab().getVehHashByScId().get(alarm.sc_id).name;
}
myHandler.post(updateResultsRUN);
}
// Create runnable for posting
final Runnable updateResultsRUN = () -> updateResultsInUi(ALARM);
private void updateResultsInUi(String param) {
if (param.equals(ALARM)) {
// set adapter
adapter = new AlertGridViewAdapter(this, getAllAlarms(), context, acknowledged);
gridView.setAdapter(adapter);
} else {
adapter.changeACK(ackPosition);
SM.Debug("Set ACK: " + ackPosition + " | " + (Boolean.TRUE.equals(acknowledged.get(ackPosition)) ? "true" : "false"));
ViewHolder viewAlarm;
viewAlarm = (ViewHolder) getConvertViewAlarm().getTag();
switch (Boolean.TRUE.equals(acknowledged.get(ackPosition)) ? 1 : 0) {
case 1:
viewAlarm.imageViewAlert.setImageResource(R.drawable.alert_off);
break;
case 0:
viewAlarm.imageViewAlert.setImageResource(R.drawable.siren);
break;
default:
throw new IllegalStateException("Unexpected value: " + (Boolean.TRUE.equals(acknowledged.get(ackPosition)) ? 1 : 0));
}
}
}
// update ACK received from AppServer
public void updateACK() {
myHandler.post(updateAckRUN);
}
// Create runnable for posting
final Runnable updateAckRUN = () -> {
SM.Debug(" updateACK: ");
updateResultsInUi("adapter");
};
// send to AppServer
private void getAlarms() {
getParentTab().executeNetworkStuff(new String[]{OperationCodes.GetAlarms + "", AppParams.USERID + ""});
}
public TabLayoutActivity getParentTab() {
return parentTab;
}
public void setParentTab(TabLayoutActivity parentTab) {
this.parentTab = parentTab;
}
public ArrayList<Alarm> getAllAlarms() {
return allAlarms;
}
public void setAllAlarms(ArrayList<Alarm> allAlarms) {
this.allAlarms = allAlarms;
}
public View getConvertViewAlarm() {
return convertViewAlarm;
}
public void setConvertViewAlarm(View convertViewAlarm) {
this.convertViewAlarm = convertViewAlarm;
}
public Bundle getSavedInstanceState() {
return savedInstanceState;
}
public void setSavedInstanceState(Bundle savedInstanceState) {
this.savedInstanceState = savedInstanceState;
}
}

View File

@ -1,4 +1,4 @@
package com.safemobile.dispatch; package com.safemobile.safedispatch;
import android.content.Context; import android.content.Context;
import android.util.Log; import android.util.Log;
@ -12,10 +12,12 @@ import androidx.annotation.NonNull;
import com.google.android.gms.maps.GoogleMap; import com.google.android.gms.maps.GoogleMap;
import com.google.android.gms.maps.model.Marker; import com.google.android.gms.maps.model.Marker;
import com.safemobile.lib.HistPos;
import com.safemobile.lib.SuperVehicle; import com.safemobile.lib.SuperVehicle;
import java.text.DateFormat; import java.text.DateFormat;
import java.text.SimpleDateFormat; import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date; import java.util.Date;
import java.util.Hashtable; import java.util.Hashtable;
import java.util.Locale; import java.util.Locale;
@ -25,8 +27,10 @@ public class GoogleMapsInfoBubble implements GoogleMap.InfoWindowAdapter {
private final String TAG = GoogleMapsInfoBubble.class.getName(); private final String TAG = GoogleMapsInfoBubble.class.getName();
private final View mWindow; private final View mWindow;
private final Hashtable<Long, SuperVehicle> superVehHash; private Hashtable<Long, SuperVehicle> superVehHash;
private final Context context; private final Context context;
private ArrayList<HistPos> histPosList;
private boolean isLiveTab = true;
public GoogleMapsInfoBubble(LayoutInflater layoutInflater, Context context, Hashtable<Long, SuperVehicle> vehicles) { public GoogleMapsInfoBubble(LayoutInflater layoutInflater, Context context, Hashtable<Long, SuperVehicle> vehicles) {
@ -35,6 +39,16 @@ public class GoogleMapsInfoBubble implements GoogleMap.InfoWindowAdapter {
mWindow = layoutInflater.inflate(R.layout.map_marker_info_bubble, null); mWindow = layoutInflater.inflate(R.layout.map_marker_info_bubble, null);
} }
public GoogleMapsInfoBubble(LayoutInflater layoutInflater, Context context) {
isLiveTab = false;
this.context = context;
mWindow = layoutInflater.inflate(R.layout.map_marker_info_bubble, null);
}
public void setHistoryPositions(ArrayList<HistPos> positions) {
this.histPosList = positions;
}
@Override @Override
public View getInfoWindow(@NonNull Marker marker) { public View getInfoWindow(@NonNull Marker marker) {
render(marker, mWindow); render(marker, mWindow);
@ -49,13 +63,21 @@ public class GoogleMapsInfoBubble implements GoogleMap.InfoWindowAdapter {
private void render(Marker marker, View view) { private void render(Marker marker, View view) {
long key = 0; long key = 0;
int position = 0;
if (isLiveTab) {
try { try {
key = Long.parseLong(marker.getTitle()); key = Long.parseLong(marker.getTitle());
} catch (Exception ex) { } catch (Exception ex) {
Log.v(TAG, "Unable to parse Google Maps Info Bubble title"); Log.v(TAG, "Unable to parse Google Maps Info Bubble title");
} }
SuperVehicle vehicle = superVehHash.get(key); } else {
try {
position = Integer.parseInt(marker.getTitle());
} catch (Exception e) {
Log.v(TAG, "Unable to parse Google Maps Info Bubble title on History");
}
}
RelativeLayout rlMapInfoBubbleInfo = view.findViewById(R.id.rlMapInfoBubbleInfo); RelativeLayout rlMapInfoBubbleInfo = view.findViewById(R.id.rlMapInfoBubbleInfo);
TextView tvUnitName = view.findViewById(R.id.tvUnitName); TextView tvUnitName = view.findViewById(R.id.tvUnitName);
@ -67,27 +89,39 @@ public class GoogleMapsInfoBubble implements GoogleMap.InfoWindowAdapter {
rlMapInfoBubbleInfo.setVisibility(View.VISIBLE); rlMapInfoBubbleInfo.setVisibility(View.VISIBLE);
boolean isMilitaryTime = false; boolean isMilitaryTime = false;
Date positionTime = new Date(vehicle.timeGMT); Date positionTime;
String speed, address, gpsLocation, name = "";
if (isLiveTab) {
SuperVehicle vehicle = superVehHash.get(key);
positionTime = new Date((new Date()).getTime() - vehicle.timeGMT);
address = vehicle.Address != null ? vehicle.Address : "";
name = vehicle.name;
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);
address = histPos.Address != null ? histPos.Address : "";
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 String timeFormat = isMilitaryTime
? "HH:mm:ss dd.MMM.yyyy" ? "HH:mm:ss dd.MMM.yyyy"
: "hh:mm:ss a dd.MMM.yyy"; : "hh:mm:ss a dd.MMM.yyy";
DateFormat format = new SimpleDateFormat(timeFormat, Locale.ENGLISH); DateFormat format = new SimpleDateFormat(timeFormat, Locale.ENGLISH);
tvTimeAgo.setText(format.format(positionTime)); tvTimeAgo.setText(format.format(positionTime));
tvSpeed.setText(String.format(context.getResources().getString(R.string.speedMph), vehicle.speed));
String address = vehicle.Address != null ? vehicle.Address : "";
tvStreetView.setText(address); tvStreetView.setText(address);
streetView.setVisibility(address.length() > 0 ? View.VISIBLE : View.GONE); streetView.setVisibility(address.length() > 0 ? View.VISIBLE : View.GONE);
tvStreetView.setVisibility(address.length() > 0 ? View.VISIBLE : View.GONE); tvStreetView.setVisibility(address.length() > 0 ? View.VISIBLE : View.GONE);
tvUnitName.setText(vehicle.name); if (!isLiveTab)
tvGPSLocation.setText("[" + String.format("%.4f", vehicle.lat) tvUnitName.setVisibility(View.GONE);
+ "," + String.format("%.4f",vehicle.lng) + "]"); else
tvUnitName.setText(name);
tvSpeed.setText(speed);
tvGPSLocation.setText(gpsLocation);
} }
} }

View File

@ -0,0 +1,284 @@
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;
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;
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;
import com.google.android.gms.maps.model.BitmapDescriptor;
import com.google.android.gms.maps.model.BitmapDescriptorFactory;
import com.google.android.gms.maps.model.LatLng;
import com.google.android.gms.maps.model.MarkerOptions;
import com.google.android.gms.maps.model.PolylineOptions;
import com.safemobile.lib.AppParams;
import com.safemobile.lib.HistPos;
import com.safemobile.lib.OperationCodes;
import com.safemobile.lib.SM;
import com.safemobile.lib.Vehicle;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.Locale;
public class HistoryActivity extends AppCompatActivity implements OnMapReadyCallback {
public Bundle savedInstanceState;
private TabLayoutActivity parentTab;
private GoogleMap googleMap;
private Spinner spinnerVehicle;
private Button displayButton;
private Date startDate, endDate;
private final Handler myHandler = new Handler();
private GoogleMapsInfoBubble infoBubble;
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
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
this.savedInstanceState = savedInstanceState;
setContentView(R.layout.tabhistory);
parentTab = (TabLayoutActivity) getParent();
parentTab.setHistoryActivity(this);
Locale locale = new Locale(AppParams.LANGUAGETMP);
Locale.setDefault(locale);
SupportMapFragment mapFragment = (SupportMapFragment) getSupportFragmentManager()
.findFragmentById(R.id.map);
if (mapFragment != null)
mapFragment.getMapAsync(this);
spinnerVehicle = findViewById(R.id.spinnerVehicle);
getVehicles();
ArrayAdapter<String> adapter = new ArrayAdapter<>(this, android.R.layout.simple_spinner_item, allVehicleNames);
adapter.setDropDownViewResource(android.R.layout.simple_dropdown_item_1line);
spinnerVehicle.setAdapter(adapter);
spinnerVehicle.setSelection(0);
changeMapType();
changeTraffic();
displayButton = findViewById(R.id.buttonDisplay);
displayButton.setOnClickListener(view -> {
googleMap.clear();
if (!AppParams.DEMO) {
parentTab.setDropAllData(false);
parentTab.setFirstHistoryData(true);
parentTab.clearHistoryMessageList();
parentTab.clearHistoryPositionList();
// request history
parentTab.executeNetworkStuff(new String[] {OperationCodes.GetHistoryPositions + "", allVehicle.get(spinnerVehicle.getSelectedItemPosition()).sc_id + "",
(startDate.getTime()/ 1000L) + "", (endDate.getTime()/ 1000L) + ""});
} else {
parentTab.demoPositionsList();
displayHistory(parentTab.getDemoPositions());
}
});
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();
}
private void displayHistory(ArrayList<HistPos> positions) {
LatLng latLng = null;
PolylineOptions polylineOptions = new PolylineOptions();
BitmapDescriptor markerIcon = BitmapDescriptorFactory.fromResource(R.drawable.history_pin);
for (int i = 0; i < positions.size(); i++) {
HistPos pos = positions.get(i);
if (pos.speed > 0) {
latLng = new LatLng(pos.lat, pos.lng);
polylineOptions.add(latLng);
googleMap.addMarker(new MarkerOptions()
.position(latLng)
.icon(markerIcon)
.title(String.valueOf(i)));
}
}
googleMap.addPolyline(polylineOptions);
if (latLng != null)
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();
endDate = calendar.getTime();
calendar.add(Calendar.DATE, -1);
startDate = calendar.getTime();
TextView textViewStartDate = findViewById(R.id.textViewStartDate);
TextView textViewEndDate = findViewById(R.id.textViewEndDate);
textViewStartDate.setText(sdf.format(startDate));
textViewEndDate.setText(sdf.format(endDate));
textViewStartDate.setOnClickListener(view -> openDialog(textViewStartDate, true));
textViewEndDate.setOnClickListener(view -> openDialog(textViewEndDate, false));
}
private void openDialog(TextView textView, Boolean isStartDate) {
Date date = startDate;
if (!isStartDate)
date = endDate;
Calendar calendar = Calendar.getInstance();
calendar.setTime(date);
DatePickerDialog.OnDateSetListener setListener = (datePicker, y, m, d) -> {
calendar.set(y, m, d);
String dateString = sdf.format(calendar.getTime());
textView.setText(dateString);
if (isStartDate)
startDate = calendar.getTime();
else
endDate = calendar.getTime();
};
Dialog dialog = new DatePickerDialog(this, android.R.style.Theme_Holo_Light_Dialog_MinWidth, setListener,
calendar.get(Calendar.YEAR), calendar.get(Calendar.MONTH), calendar.get(Calendar.DAY_OF_MONTH));
dialog.getWindow().setBackgroundDrawable(new ColorDrawable(Color.TRANSPARENT));
dialog.show();
}
private void changeTraffic() {
ImageView changeTrafficImageView = findViewById(R.id.changeTraffic);
changeTrafficImageView.setOnClickListener(v -> {
if (googleMap.isTrafficEnabled()) {
changeTrafficImageView.setImageResource(R.drawable.traffic_off);
googleMap.setTrafficEnabled(false);
} else {
changeTrafficImageView.setImageResource(R.drawable.traffic);
googleMap.setTrafficEnabled(true);
}
});
}
private void changeMapType() {
ImageView changeMapType = findViewById(R.id.changeMapType);
changeMapType.setOnClickListener(view -> {
if (googleMap.getMapType() == GoogleMap.MAP_TYPE_SATELLITE) {
changeMapType.setImageResource(R.drawable.satellite);
googleMap.setMapType(GoogleMap.MAP_TYPE_SATELLITE);
} else {
changeMapType.setImageResource(R.drawable.map);
googleMap.setMapType(GoogleMap.MAP_TYPE_NORMAL);
}
});
}
public void getVehicles() {
try {
allVehicle.clear();
allVehicleNames.clear();
for (Vehicle vehicle : parentTab.getAllVehicle()) {
allVehicleNames.add(vehicle.name);
allVehicle.add(vehicle);
}
} catch (Exception ignored) { }
}
final Runnable UpdateMapResults = new Runnable() {
public void run() {
Log.v("updateMap", parentTab.getHistoryPositionList().toString());
SM.Debug("Do the Display");
infoBubble.setHistoryPositions(parentTab.getHistoryPositionList());
displayHistory(parentTab.getHistoryPositionList());
}
};
public void UpdateMap() {
myHandler.post(UpdateMapResults);
SM.Debug("Do the updateMAP post");
}
public void UpdateUnableDisp() {
SM.Debug("Do Cancelwindow");
}
public void UpdateCancel() {
SM.Debug("Do Cancelwindow");
}
public void UpdateNrPos(int size) {
SM.Debug("Do Cancelwindow");
}
@Override
public void onMapReady(@NonNull GoogleMap googleMap) {
this.googleMap = googleMap;
infoBubble = new GoogleMapsInfoBubble(getLayoutInflater(), this);
this.googleMap.setInfoWindowAdapter(infoBubble);
this.googleMap.getUiSettings().setMapToolbarEnabled(false);
parentTab.demoPositionsList();
displayButton.performClick();
}
}

View File

@ -14,7 +14,7 @@
* See the License for the specific language governing permissions and * See the License for the specific language governing permissions and
* limitations under the License. * limitations under the License.
*/ */
package com.safemobile.dispatch; package com.safemobile.safedispatch;
import java.util.ArrayList; import java.util.ArrayList;

View File

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

View File

@ -1,4 +1,4 @@
package com.safemobile.dispatch; package com.safemobile.safedispatch;
import android.os.Bundle; import android.os.Bundle;
import androidx.fragment.app.FragmentActivity; import androidx.fragment.app.FragmentActivity;

View File

@ -1,4 +1,4 @@
package com.safemobile.dispatch; package com.safemobile.safedispatch;
import android.app.Activity; import android.app.Activity;
import android.app.AlertDialog; import android.app.AlertDialog;
@ -124,16 +124,6 @@ public class MessagesActivity extends Activity {
textViewSelectedContact = findViewById(R.id.textViewSelectedContact); textViewSelectedContact = findViewById(R.id.textViewSelectedContact);
imageViewSelectedContact = findViewById(R.id.imageViewSelectedContact); imageViewSelectedContact = findViewById(R.id.imageViewSelectedContact);
ImageView imageBarcode = findViewById(R.id.imageBarcode);
imageBarcode.setOnClickListener(v -> {
try {
Intent intent = new Intent("com.google.zxing.client.android.SCAN");
startActivityForResult(intent, 0);
} catch (Exception e) {
showErrorDialog(getResources().getString(R.string.barcodeError));
}
});
// change tab header fontFace // change tab header fontFace
TextView textView1 = findViewById(R.id.textView1); TextView textView1 = findViewById(R.id.textView1);
textView1.setTypeface(Typeface.createFromAsset(getAssets(), "Sketch_Block.ttf")); textView1.setTypeface(Typeface.createFromAsset(getAssets(), "Sketch_Block.ttf"));
@ -215,7 +205,7 @@ public class MessagesActivity extends Activity {
gridView.setId(1); // id needed for IconContextMenu gridView.setId(1); // id needed for IconContextMenu
registerForContextMenu(gridView); registerForContextMenu(gridView);
parentTab.messageActivity = this; parentTab.setMessageActivity(this);
} }
// Create runnable for posting // Create runnable for posting

View File

@ -1,4 +1,4 @@
package com.safemobile.dispatch; package com.safemobile.safedispatch;
import android.app.Activity; import android.app.Activity;
import android.content.Intent; import android.content.Intent;
@ -21,11 +21,16 @@ public class NotificationActivity extends Activity{
// broadcast intent // broadcast intent
Intent i = new Intent(); Intent i = new Intent();
switch(key) switch(key) {
{ case AppParams.messageNotif:
case AppParams.messageNotif: i.setAction(NOTIFICATION_MESSAGE_INTENT); break; i.setAction(NOTIFICATION_MESSAGE_INTENT);
case AppParams.alertNotif: i.setAction(NOTIFICATION_ALERT_INTENT); break; break;
case AppParams.pollNotif: i.setAction(NOTIFICATION_POLL_INTENT); break; case AppParams.alertNotif:
i.setAction(NOTIFICATION_ALERT_INTENT);
break;
case AppParams.pollNotif:
i.setAction(NOTIFICATION_POLL_INTENT);
break;
} }
getBaseContext().sendBroadcast(i); getBaseContext().sendBroadcast(i);
@ -35,6 +40,4 @@ public class NotificationActivity extends Activity{
/* Finish activity and return to parent activity */ /* Finish activity and return to parent activity */
finish(); finish();
} }
} }

View File

@ -1,4 +1,4 @@
package com.safemobile.dispatch; package com.safemobile.safedispatch;
import android.app.Activity; import android.app.Activity;
import android.app.AlertDialog; import android.app.AlertDialog;
@ -236,7 +236,7 @@ public class RadioActivity extends Activity {
} }
// send current activity to parrent // send current activity to parrent
parentTab.radioActivity = this; parentTab.setRadioActivity(this);
// register to be notified when an event is triggered // register to be notified when an event is triggered
registerBroadcastIntents(); registerBroadcastIntents();
@ -315,10 +315,10 @@ public class RadioActivity extends Activity {
if(!pttONoff) if(!pttONoff)
{ {
String chanMsg = "", statMsg = ""; String chanMsg = "", statMsg = "";
if(parentTab.crtRadio!= null) if(parentTab.getCrtRadio() != null)
SendPTT(selectedCallType, selectedID,parentTab.crtRadio.GW_ID, parentTab.crtRadio.ID,AppParams.USERID); SendPTT(selectedCallType, selectedID, parentTab.getCrtRadio().GW_ID, parentTab.getCrtRadio().ID,AppParams.USERID);
// flag in Call // flag in Call
parentTab.inCall = true; parentTab.setInCall(true);
pttONoff= true; pttONoff= true;
if(audioH!=null) if(audioH!=null)
audioH.soundNeeded = true; audioH.soundNeeded = true;
@ -381,7 +381,7 @@ public class RadioActivity extends Activity {
{ {
String chanMsg = "", statMsg = ""; String chanMsg = "", statMsg = "";
if(!AppParams.DEMO) if(!AppParams.DEMO)
SendPTT(selectedCallType+10, 1,parentTab.crtRadio.GW_ID, parentTab.crtRadio.ID,AppParams.USERID); SendPTT(selectedCallType+10, 1, parentTab.getCrtRadio().GW_ID, parentTab.getCrtRadio().ID,AppParams.USERID);
pttONoff= false; pttONoff= false;
if(audioH!=null) if(audioH!=null)
audioH.soundNeeded = false; audioH.soundNeeded = false;
@ -417,7 +417,7 @@ public class RadioActivity extends Activity {
@Override @Override
public void onClick(View v) { public void onClick(View v) {
if(parentTab.crtRadio!=null) if(parentTab.getCrtRadio() !=null)
{ {
// display dialog with adapter // display dialog with adapter
ArrayList<String> tmp = new ArrayList<String>(); ArrayList<String> tmp = new ArrayList<String>();
@ -438,7 +438,7 @@ public class RadioActivity extends Activity {
//textViewChannel.setText(crtChannels.get(which).chName); //textViewChannel.setText(crtChannels.get(which).chName);
// send change to App // send change to App
onZoneCHChange(parentTab.crtRadio.ID, parentTab.crtRadio.GW_ID, getNR4Zone(textViewZone.getText().toString()), getNR4CH(crtChannels.get(which).chName)); onZoneCHChange(parentTab.getCrtRadio().ID, parentTab.getCrtRadio().GW_ID, getNR4Zone(textViewZone.getText().toString()), getNR4CH(crtChannels.get(which).chName));
} }
}); });
@ -492,7 +492,7 @@ public class RadioActivity extends Activity {
@Override @Override
public void onClick(View v) { public void onClick(View v) {
if(parentTab.crtRadio!=null) if(parentTab.getCrtRadio() !=null)
{ {
// display dialog with adapter // display dialog with adapter
ArrayList<String> tmp = new ArrayList<String>(); ArrayList<String> tmp = new ArrayList<String>();
@ -511,7 +511,7 @@ public class RadioActivity extends Activity {
// send change to App // send change to App
//onZoneCHChange(parentTab.crtRadio.ID, parentTab.crtRadio.GW_ID, getNR4Zone(crtZones.get(which).ZoneName), getNR4CH(textViewChannel.getText().toString())); //onZoneCHChange(parentTab.crtRadio.ID, parentTab.crtRadio.GW_ID, getNR4Zone(crtZones.get(which).ZoneName), getNR4CH(textViewChannel.getText().toString()));
onZoneCHChange(parentTab.crtRadio.ID, parentTab.crtRadio.GW_ID, getNR4Zone(crtZones.get(which).ZoneName), 1); onZoneCHChange(parentTab.getCrtRadio().ID, parentTab.getCrtRadio().GW_ID, getNR4Zone(crtZones.get(which).ZoneName), 1);
} }
}); });
@ -560,7 +560,7 @@ public class RadioActivity extends Activity {
@Override @Override
public void onClick(View v) { public void onClick(View v) {
if(parentTab.crtRadio!=null) if(parentTab.getCrtRadio() !=null)
{ {
// create spinner selected // create spinner selected
AlertDialog.Builder builder = new AlertDialog.Builder(context); AlertDialog.Builder builder = new AlertDialog.Builder(context);
@ -673,10 +673,10 @@ public class RadioActivity extends Activity {
dialog.setCancelable(true); dialog.setCancelable(true);
dialog.setCanceledOnTouchOutside(true); dialog.setCanceledOnTouchOutside(true);
TextView text = (TextView) dialog.findViewById(R.id.text); TextView text = dialog.findViewById(R.id.text);
ImageView image = (ImageView) dialog.findViewById(R.id.image); ImageView image = dialog.findViewById(R.id.image);
image.setImageResource(R.drawable.ic_launcher); image.setImageResource(R.mipmap.ic_launcher);
text.setText(errorMsg); text.setText(errorMsg);
dialog.show(); dialog.show();
} }
@ -686,17 +686,17 @@ public class RadioActivity extends Activity {
{ {
// save radios // save radios
AppParams.listRadios = radios; AppParams.listRadios = radios;
if(parentTab.crtRadio == null) if(parentTab.getCrtRadio() == null)
parentTab.crtRadio = AppParams.listRadios.get(0); parentTab.setCrtRadio(AppParams.listRadios.get(0));
// if crtRadio not exists anymore // if crtRadio not exists anymore
if(!AppParams.listRadios.contains(parentTab.crtRadio)) if(!AppParams.listRadios.contains(parentTab.getCrtRadio()))
parentTab.crtRadio = AppParams.listRadios.get(0); parentTab.setCrtRadio(AppParams.listRadios.get(0));
SM.Debug(parentTab.crtRadio.toString()); SM.Debug(parentTab.getCrtRadio().toString());
// get status for selected Radio // get status for selected Radio
ReqRadioStatus(parentTab.crtRadio.ID, parentTab.crtRadio.GW_ID); ReqRadioStatus(parentTab.getCrtRadio().ID, parentTab.getCrtRadio().GW_ID);
// get selected Zone and CH // get selected Zone and CH
onZoneCHChange(parentTab.crtRadio.ID, parentTab.crtRadio.GW_ID, 0,0); onZoneCHChange(parentTab.getCrtRadio().ID, parentTab.getCrtRadio().GW_ID, 0,0);
myHandler.post(updateGatewaysRUN); myHandler.post(updateGatewaysRUN);
} }
@ -716,7 +716,7 @@ public class RadioActivity extends Activity {
allGWsIP.clear(); allGWsIP.clear();
for(RadioGW radio: AppParams.listRadios) for(RadioGW radio: AppParams.listRadios)
allGWsIP.add(radio.IP); allGWsIP.add(radio.IP);
textViewGateway.setText(parentTab.crtRadio.IP); textViewGateway.setText(parentTab.getCrtRadio().IP);
} }
@ -743,20 +743,20 @@ public class RadioActivity extends Activity {
SM.Debug("am primit: " + _radioID + "," + _GWID + "," + _zoneNR + "," + _chNR); SM.Debug("am primit: " + _radioID + "," + _GWID + "," + _zoneNR + "," + _chNR);
if ((parentTab.crtRadio == null)||((parentTab.crtRadio.GW_ID == _GWID)&&(parentTab.crtRadio.ID == _radioID))) if ((parentTab.getCrtRadio() == null)||((parentTab.getCrtRadio().GW_ID == _GWID)&&(parentTab.getCrtRadio().ID == _radioID)))
{ {
// update crtRadios, crtZones, and crtChannel // update crtRadios, crtZones, and crtChannel
for(RadioGW radio: AppParams.listRadios) for(RadioGW radio: AppParams.listRadios)
if(radio.GW_ID == _GWID && radio.ID == _radioID) if(radio.GW_ID == _GWID && radio.ID == _radioID)
{ {
parentTab.crtRadio = radio; parentTab.setCrtRadio(radio);
crtZones = radio.zoneList; crtZones = radio.zoneList;
cmdForMe = true; cmdForMe = true;
} }
} }
if (cmdForMe) if (cmdForMe)
{ {
for(Zone zone: parentTab.crtRadio.zoneList) for(Zone zone: parentTab.getCrtRadio().zoneList)
if(zone.id == _zoneNR) if(zone.id == _zoneNR)
crtChannels = zone.channelList; crtChannels = zone.channelList;
// update UI // update UI
@ -776,7 +776,7 @@ public class RadioActivity extends Activity {
if(AppParams.listRadios.size()>0) if(AppParams.listRadios.size()>0)
{ {
textViewGateway.setText(parentTab.crtRadio.IP); textViewGateway.setText(parentTab.getCrtRadio().IP);
// get all radio IP // get all radio IP
allGWsIP.clear(); allGWsIP.clear();
@ -784,13 +784,13 @@ public class RadioActivity extends Activity {
allGWsIP.add(radio.IP); allGWsIP.add(radio.IP);
// set spinners and text // set spinners and text
if(parentTab.crtRadio == null) if(parentTab.getCrtRadio() == null)
{ {
parentTab.crtRadio = AppParams.listRadios.get(0); parentTab.setCrtRadio(AppParams.listRadios.get(0));
textViewGateway.setText(allGWsIP.get(0)); textViewGateway.setText(allGWsIP.get(0));
// set zone // set zone
ArrayList<String> zones = new ArrayList<String>(); ArrayList<String> zones = new ArrayList<String>();
crtZones = parentTab.crtRadio.zoneList; crtZones = parentTab.getCrtRadio().zoneList;
for(Zone zone: crtZones) for(Zone zone: crtZones)
zones.add(zone.ZoneName); zones.add(zone.ZoneName);
@ -799,7 +799,7 @@ public class RadioActivity extends Activity {
//spinnerZone.setSelection(0); //spinnerZone.setSelection(0);
// set channel // set channel
ArrayList<String> channel = new ArrayList<String>(); ArrayList<String> channel = new ArrayList<String>();
crtChannels = parentTab.crtRadio.zoneList.get(0).channelList; crtChannels = parentTab.getCrtRadio().zoneList.get(0).channelList;
for(Channel ch: crtChannels) for(Channel ch: crtChannels)
channel.add(ch.chName); channel.add(ch.chName);
textViewChannel.setText(channel.get(0).toString()); textViewChannel.setText(channel.get(0).toString());
@ -811,10 +811,10 @@ public class RadioActivity extends Activity {
{ {
for(RadioGW radio: AppParams.listRadios) for(RadioGW radio: AppParams.listRadios)
if(radio.ID == radioID && radio.GW_ID == GWID) if(radio.ID == radioID && radio.GW_ID == GWID)
parentTab.crtRadio = radio; parentTab.setCrtRadio(radio);
// get zones for adapter // get zones for adapter
ArrayList<String> zones = new ArrayList<String>(); ArrayList<String> zones = new ArrayList<String>();
crtZones = parentTab.crtRadio.zoneList; crtZones = parentTab.getCrtRadio().zoneList;
int position = 0; int position = 0;
// get selected Zone // get selected Zone
for(int i=0; i< crtZones.size(); i++) for(int i=0; i< crtZones.size(); i++)
@ -828,7 +828,7 @@ public class RadioActivity extends Activity {
// set channel // set channel
ArrayList<String> channel = new ArrayList<String>(); ArrayList<String> channel = new ArrayList<String>();
crtChannels = parentTab.crtRadio.zoneList.get(position).channelList; crtChannels = parentTab.getCrtRadio().zoneList.get(position).channelList;
position = 0; position = 0;
// get current channel // get current channel
for(int i=0; i< crtChannels.size(); i++) for(int i=0; i< crtChannels.size(); i++)
@ -856,7 +856,7 @@ public class RadioActivity extends Activity {
{ {
UpdateEnableDisableButtons("offline"); UpdateEnableDisableButtons("offline");
onZoneCHChange(radio.ID, radio.GW_ID,0,0); // get zone and channel for crt radio onZoneCHChange(radio.ID, radio.GW_ID,0,0); // get zone and channel for crt radio
parentTab.crtRadio = radio; parentTab.setCrtRadio(radio);
} }
textViewGateway.setText(newIP); textViewGateway.setText(newIP);
@ -957,10 +957,10 @@ public class RadioActivity extends Activity {
buttonPTT.setEnabled(true); buttonPTT.setEnabled(true);
buttonDKey.setEnabled(false); buttonDKey.setEnabled(false);
} }
if(parentTab.crtActivity == parentTab.RADIO && selectedCallType == calltype) if(parentTab.getCrtActivity() == parentTab.RADIO_TAB_ID && selectedCallType == calltype)
parentTab.enableMenuButtons(false); parentTab.enableMenuButtons(false);
if(selectedCallType == calltype) if(selectedCallType == calltype)
parentTab.inCall = true; parentTab.setInCall(true);
} }
else if (callstatus==3) else if (callstatus==3)
@ -986,7 +986,7 @@ public class RadioActivity extends Activity {
} }
parentTab.enableMenuButtons(true); parentTab.enableMenuButtons(true);
parentTab.inCall = false; parentTab.setInCall(false);
} }
} }
} }
@ -1182,8 +1182,8 @@ public class RadioActivity extends Activity {
// send Dekey to AppServer // send Dekey to AppServer
private void SendDekey() private void SendDekey()
{ {
if(parentTab.crtRadio != null) if(parentTab.getCrtRadio() != null)
parentTab.sendDekey(parentTab.crtRadio.GW_ID, parentTab.crtRadio.ID); parentTab.sendDekey(parentTab.getCrtRadio().GW_ID, parentTab.getCrtRadio().ID);
} }
// send change Channel and Zone message to AppServer // send change Channel and Zone message to AppServer
@ -1215,8 +1215,8 @@ public class RadioActivity extends Activity {
//113 -grpcall stop //113 -grpcall stop
public void SendPTT(int callType, int id,int gwid, int rgwid,long userID) public void SendPTT(int callType, int id,int gwid, int rgwid,long userID)
{ {
SM.Debug("SendPTT callType:"+callType); SM.Debug("sendPTT callType:"+callType);
parentTab.SendPTT(callType, id,gwid,rgwid,userID); parentTab.sendPTT(callType, id,gwid,rgwid,userID);
} }
@ -1241,13 +1241,13 @@ public class RadioActivity extends Activity {
UpdateZoneCH(zc.rgwID, zc.gwID, zc.zoneNr, zc.channelNr); UpdateZoneCH(zc.rgwID, zc.gwID, zc.zoneNr, zc.channelNr);
} }
else if (action.equals(OperationCodes.RADIOID_CHANGED+"")) { else if (action.equals(OperationCodes.RADIOID_CHANGED+"")) {
textViewGateway.setText(parentTab.crtRadio.IP); textViewGateway.setText(parentTab.getCrtRadio().IP);
textViewChannel.setText(parentTab.crtRadio.getChannelName()); textViewChannel.setText(parentTab.getCrtRadio().getChannelName());
textViewZone.setText(parentTab.crtRadio.getZoneName()); textViewZone.setText(parentTab.getCrtRadio().getZoneName());
// update UI // update UI
myHandler.post(UpdateResultsZoneChannelRUN); myHandler.post(UpdateResultsZoneChannelRUN);
radioGWChanged(parentTab.crtRadio.IP); radioGWChanged(parentTab.getCrtRadio().IP);
} }
} }
}; };

View File

@ -0,0 +1,388 @@
package com.safemobile.safedispatch;
import android.app.Activity;
import android.app.AlertDialog;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.content.res.AssetFileDescriptor;
import android.content.res.Configuration;
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.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.ArrayAdapter;
import android.widget.GridView;
import android.widget.TextView;
import android.widget.Toast;
import com.safemobile.adapters.RecordingsGridViewAdapter;
import com.safemobile.lib.AppParams;
import com.safemobile.lib.OperationCodes;
import com.safemobile.lib.Recording;
import com.safemobile.lib.SM;
import com.safemobile.lib.radio.RadioGW;
import com.safemobile.lib.sound.RecordingHandle;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Locale;
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;
private RecordingsGridViewAdapter adapter;
private View convertViewRecording;
private boolean isRecordingPlaying = false;
private 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<>();
//recoding TCP and audio
private RecordingHandle recHandle = null;
/* 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();
});
textViewGateway.setVisibility(View.INVISIBLE);
getParentTab().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), (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 onItemClick(AdapterView<?> arg0, View view, int position, long arg3) {
// disable grid scrolling and item click
if (isRecordingPlaying)
return;
isRecordingPlaying = true;
setConvertViewRecording(view);
// change background to playing
adapter.changePlaying(position, true);
// if no recording is playing and not DEMO
if (getPlayingPosition() < 0 && !AppParams.DEMO) {
// send recording request to App Server
sendPlayRequest(getAllRecordings().get(position).id);
// flag that sound is needed
recHandle.startSound();
recHandle.setSoundNeeded(true);
}
// no recording is playing and DEMO
else if (getPlayingPosition() < 0 && AppParams.DEMO) {
// create player which will play demo recordings
MediaPlayer player = new MediaPlayer();
AssetFileDescriptor assetFileDescriptor = null;
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());
player.prepare();
player.start();
} catch (IOException e) {
e.printStackTrace();
} finally {
if(assetFileDescriptor != null) {
try {
assetFileDescriptor.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
// save playing position
setPlayingPosition(position);
// start the timer which will reset the UI to 'no recording playing'
startRecordingStopperTimer(getAllRecordings().get(getPlayingPosition()).endGMT - getAllRecordings().get(getPlayingPosition()).startGMT);
}
/**
* create Timer which will stop the recording after a specific time
*/
private void startRecordingStopperTimer(final int seconds) {
new Thread(() -> {
// sleep for at least 1 second
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<>();
for (int i = 0; i < getAllRecordings().size(); i++)
playingPositions.add(true);
// set adapter - where playingPositions stores exists values
adapter = new RecordingsGridViewAdapter(activity, getAllRecordings(), playingPositions);
// playing positions need to be false because no recording is played
playingPositions.clear();
for (int i = 0; i < getAllRecordings().size(); i++)
playingPositions.add(false);
updateNumberOfRecordings();
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 + "");
this.registerReceiver(mReceiver, intentFilter);
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) {
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

@ -1,4 +1,4 @@
package com.safemobile.dispatch; package com.safemobile.safedispatch;
import android.app.Activity; import android.app.Activity;
import android.app.AlertDialog; import android.app.AlertDialog;
@ -10,13 +10,19 @@ import android.content.ServiceConnection;
import android.content.SharedPreferences; import android.content.SharedPreferences;
import android.content.res.Configuration; import android.content.res.Configuration;
import android.graphics.Color; import android.graphics.Color;
import android.net.ConnectivityManager;
import android.net.Network;
import android.net.NetworkCapabilities;
import android.net.NetworkRequest;
import android.os.AsyncTask; import android.os.AsyncTask;
import android.os.Build;
import android.os.Bundle; import android.os.Bundle;
import android.os.Handler; import android.os.Handler;
import android.os.IBinder; import android.os.IBinder;
import android.os.Looper; import android.os.Looper;
import android.text.Editable; import android.text.Editable;
import android.text.InputType; import android.text.InputType;
import android.util.Log;
import android.view.Gravity; import android.view.Gravity;
import android.view.View; import android.view.View;
import android.view.View.OnClickListener; import android.view.View.OnClickListener;
@ -114,6 +120,17 @@ public class SDMobileActivity extends Activity {
super.onCreate(savedInstanceState); super.onCreate(savedInstanceState);
SM.Debug("##### onCREATE ##### with LANGUAGE " + AppParams.LANGUAGETMP); SM.Debug("##### onCREATE ##### with LANGUAGE " + AppParams.LANGUAGETMP);
ConnectivityManager connectivityManager =
(ConnectivityManager) this.getSystemService(Context.CONNECTIVITY_SERVICE);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
connectivityManager.registerDefaultNetworkCallback(networkCallback);
} else {
NetworkRequest request = new NetworkRequest.Builder()
.addCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET).build();
connectivityManager.registerNetworkCallback(request, networkCallback);
}
AppParams.theme = AppParams.Theme.SAFEDISPATCH; AppParams.theme = AppParams.Theme.SAFEDISPATCH;
if (AppParams.theme == AppParams.Theme.SAFENET) if (AppParams.theme == AppParams.Theme.SAFENET)
this.setTheme(R.style.Theme_Safenet); this.setTheme(R.style.Theme_Safenet);
@ -233,10 +250,10 @@ public class SDMobileActivity extends Activity {
etPassword.setText(AppParams.PASSWORD.equalsIgnoreCase("n/a") ? "" : AppParams.PASSWORD); etPassword.setText(AppParams.PASSWORD.equalsIgnoreCase("n/a") ? "" : AppParams.PASSWORD);
} }
layoutTCP = (RelativeLayout) findViewById(R.id.layoutTCP); layoutTCP = findViewById(R.id.layoutTCP);
llUsername = (LinearLayout) findViewById(R.id.llUsername); llUsername = findViewById(R.id.llUsername);
llPassword = (LinearLayout) findViewById(R.id.llPassword); llPassword = findViewById(R.id.llPassword);
// enable ui after the language is changed and tcp connection is on // enable ui after the language is changed and tcp connection is on
if (tcp != null && tcp.isConnectionUP) { if (tcp != null && tcp.isConnectionUP) {
@ -524,6 +541,22 @@ public class SDMobileActivity extends Activity {
SM.Debug("##### onRESUME #####"); SM.Debug("##### onRESUME #####");
} }
private final ConnectivityManager.NetworkCallback networkCallback = new ConnectivityManager.NetworkCallback() {
@Override
public void onAvailable(Network network) {
// network available
Log.v("NetworkAvailability", "available");
if (tcp != null && !tcp.isConnectionUP)
saveIPandRestartTCP(AppParams.IP, AppParams.PORT);
}
@Override
public void onLost(Network network) {
// network unavailable
Log.v("NetworkAvailability", "unavailable");
}
};
private void startTabActivity(long userID) { private void startTabActivity(long userID) {
// good login - load activity // good login - load activity
@ -663,7 +696,7 @@ public class SDMobileActivity extends Activity {
// get default password // get default password
AppParams.PASSWORD = AppParams.prefs.getString(PASSWORD, "n/a"); AppParams.PASSWORD = AppParams.prefs.getString(PASSWORD, "n/a");
// get default IP // get default IP
AppParams.IP = AppParams.prefs.getString("ip", "192.168.2.100"); AppParams.IP = AppParams.prefs.getString("ip", "185.8.154.190");
// get Radio ID & IP // get Radio ID & IP
AppParams.RADIOID = AppParams.prefs.getInt("radioId", 100); AppParams.RADIOID = AppParams.prefs.getInt("radioId", 100);
@ -737,10 +770,10 @@ public class SDMobileActivity extends Activity {
Dialog dialogInfo = new Dialog(context); Dialog dialogInfo = new Dialog(context);
dialogInfo.requestWindowFeature(Window.FEATURE_NO_TITLE); dialogInfo.requestWindowFeature(Window.FEATURE_NO_TITLE);
dialogInfo.setContentView(R.layout.dialog_login); dialogInfo.setContentView(R.layout.dialog_login);
TextView textTitle = (TextView) dialogInfo.findViewById(R.id.textTitle); TextView textTitle = dialogInfo.findViewById(R.id.textTitle);
TextView text = (TextView) dialogInfo.findViewById(R.id.text); TextView text = dialogInfo.findViewById(R.id.text);
TextView text2 = (TextView) dialogInfo.findViewById(R.id.text2); TextView text2 = dialogInfo.findViewById(R.id.text2);
ImageView image = (ImageView) dialogInfo.findViewById(R.id.image); ImageView image = dialogInfo.findViewById(R.id.image);
textTitle.setText(getString(R.string.connectionError)); textTitle.setText(getString(R.string.connectionError));
image.setImageResource(R.drawable.error); image.setImageResource(R.drawable.error);
@ -965,7 +998,7 @@ public class SDMobileActivity extends Activity {
} }
@Override @Override
public void alarmLiveRecv(TCPEvent event) { public void alarmLiveReceived(TCPEvent event) {
} }
@Override @Override
@ -994,7 +1027,7 @@ public class SDMobileActivity extends Activity {
} }
@Override @Override
public void onTCPConnectionDown(boolean previuosWasConnectionUp) { public void onTCPConnectionDown(boolean previousWasConnectionUp) {
SM.Debug("TCP connection with:" + (tcp != null ? tcp.serverHostname : AppParams.RADIOIP) + ":" SM.Debug("TCP connection with:" + (tcp != null ? tcp.serverHostname : AppParams.RADIOIP) + ":"
+ (tcp != null ? tcp.getPort() : 0) + " is DOWN!!!"); + (tcp != null ? tcp.getPort() : 0) + " is DOWN!!!");
// update ui only when a change happens with tcp connection // update ui only when a change happens with tcp connection
@ -1034,7 +1067,7 @@ public class SDMobileActivity extends Activity {
} }
@Override @Override
public void onTCPConnectionStatusReceived(boolean isConnectionUp, boolean previuosWasConnectionUp) { public void onTCPConnectionStatusReceived(boolean isConnectionUp, boolean previousWasConnectionUp) {
} }

View File

@ -1,4 +1,4 @@
package com.safemobile.dispatch; package com.safemobile.safedispatch;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
@ -1403,7 +1403,7 @@ public class SDMobileActivity_beforeMod extends Activity {
public void onAlarmAckReceived(TCPEvent event) { } public void onAlarmAckReceived(TCPEvent event) { }
@Override @Override
public void alarmLiveRecv(TCPEvent event) { } public void alarmLiveReceived(TCPEvent event) { }
@Override @Override
@ -1425,7 +1425,7 @@ public class SDMobileActivity_beforeMod extends Activity {
public void onRecordingsListReceived(TCPEvent event) { } public void onRecordingsListReceived(TCPEvent event) { }
@Override @Override
public void onTCPConnectionDown(boolean previousConnectionWasUP) { public void onTCPConnectionDown(boolean previousWasConnectionUp) {
SM.Debug("TCP Connection Down"); SM.Debug("TCP Connection Down");
// set connection is down // set connection is down
@ -1450,7 +1450,7 @@ public class SDMobileActivity_beforeMod extends Activity {
} }
@Override @Override
public void onTCPConnectionUp(boolean previousConnectionWasUP) { public void onTCPConnectionUp(boolean previousWasConnectionUp) {
SM.Debug("TCP Connection UP"); SM.Debug("TCP Connection UP");
// set connection is up // set connection is up
@ -1505,7 +1505,7 @@ public class SDMobileActivity_beforeMod extends Activity {
} }
@Override @Override
public void onTCPConnectionStatusReceived(final boolean isConnectionUp, boolean previuosWasConnectionUp) { public void onTCPConnectionStatusReceived(final boolean isConnectionUp, boolean previousWasConnectionUp) {
//SM.Debug("TCP STATUS", "ConnectionUP: " + isConnectionUp + " | previous: " + previuosWasConnectionUp ); //SM.Debug("TCP STATUS", "ConnectionUP: " + isConnectionUp + " | previous: " + previuosWasConnectionUp );
/* /*
if(!lastTCPstatus && isConnectionUp) { if(!lastTCPstatus && isConnectionUp) {

View File

@ -1,4 +1,4 @@
package com.safemobile.dispatch; package com.safemobile.safedispatch;
import java.util.Locale; import java.util.Locale;
@ -199,7 +199,7 @@ public class SetupActivity extends Activity {
// get default com port // get default com port
//COMPORT = prefs.getString("comport", "n/a"); //COMPORT = prefs.getString("comport", "n/a");
// get Language // get Language
AppParams.LANGUAGE = AppParams.prefs.getString("language", parentTab.databaseLanguage); AppParams.LANGUAGE = AppParams.prefs.getString("language", parentTab.DATABASE_LANGUAGE);
} }
catch(Exception ex) catch(Exception ex)
{ {
@ -245,7 +245,7 @@ public class SetupActivity extends Activity {
parentTab.stopTCPParser(); parentTab.stopTCPParser();
// recreate TCP with new settings // recreate TCP with new settings
parentTab.loadSettings(); parentTab.loadSettings();
parentTab.TCPinit(); parentTab.tcpInit();
*/ */
// start thread to add listener // start thread to add listener
/* /*

File diff suppressed because it is too large Load Diff

Binary file not shown.

Before

Width:  |  Height:  |  Size: 16 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 74 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 207 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 66 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 145 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.5 KiB

View File

@ -35,6 +35,6 @@
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_weight="0" android:layout_weight="0"
android:background="@drawable/checked"> android:background="@drawable/checked"
</LinearLayout> android:orientation="horizontal" />
</LinearLayout> </LinearLayout>

View File

@ -89,6 +89,8 @@
</LinearLayout> </LinearLayout>
</LinearLayout> </LinearLayout>
<RelativeLayout <RelativeLayout
android:id="@+id/layoutNewMessage" android:id="@+id/layoutNewMessage"
android:layout_width="350dp" android:layout_width="350dp"

View File

@ -32,7 +32,6 @@
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:text="@string/serverIP" android:text="@string/serverIP"
android:textAppearance="?android:attr/textAppearanceMedium" android:textAppearance="?android:attr/textAppearanceMedium"
android:textColor="#FFFFFF"
android:textStyle="bold" android:textStyle="bold"
android:layout_gravity="center_vertical" android:layout_gravity="center_vertical"
android:gravity="center_vertical|right" android:gravity="center_vertical|right"
@ -67,7 +66,6 @@
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:text="@string/serverPort" android:text="@string/serverPort"
android:textAppearance="?android:attr/textAppearanceMedium" android:textAppearance="?android:attr/textAppearanceMedium"
android:textColor="#FFFFFF"
android:textStyle="bold" android:textStyle="bold"
android:gravity="center_vertical|right" android:gravity="center_vertical|right"
android:layout_gravity="center_vertical|right" android:layout_gravity="center_vertical|right"
@ -112,7 +110,6 @@
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:text="@string/configName" android:text="@string/configName"
android:textAppearance="?android:attr/textAppearanceMedium" android:textAppearance="?android:attr/textAppearanceMedium"
android:textColor="#FFFFFF"
android:textStyle="bold" android:textStyle="bold"
android:gravity="center_vertical|right" android:gravity="center_vertical|right"
android:layout_gravity="center_vertical"/> android:layout_gravity="center_vertical"/>
@ -181,7 +178,6 @@
android:text="@string/language" android:text="@string/language"
android:textAppearance="?android:attr/textAppearanceMedium" android:textAppearance="?android:attr/textAppearanceMedium"
android:textStyle="bold" android:textStyle="bold"
android:textColor="#FFFFFF"
android:gravity="right" android:gravity="right"
android:layout_gravity="center_vertical"/> android:layout_gravity="center_vertical"/>
<LinearLayout <LinearLayout

View File

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

View File

@ -11,5 +11,5 @@
android:layout_width="fill_parent" android:layout_width="fill_parent"
android:id="@+id/balloon_vehicle_name" android:id="@+id/balloon_vehicle_name"
android:textSize="12dip" android:textSize="12dip"
android:textColor="#FF000000"></TextView> android:textColor="#FF000000" />
</LinearLayout> </LinearLayout>

View File

@ -1,17 +1,18 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" <LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/layout_root" android:id="@+id/layout_root"
android:orientation="horizontal" android:orientation="horizontal"
android:layout_width="fill_parent" android:layout_width="fill_parent"
android:layout_height="fill_parent" android:layout_height="fill_parent"
android:padding="10dp" android:padding="10dp" >
> <ImageView
<ImageView android:id="@+id/image" android:id="@+id/image"
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_marginRight="10dp" android:layout_marginRight="10dp"
android:layout_gravity="center_vertical" android:layout_gravity="center_vertical"
android:src="@drawable/ic_launcher" android:src="@mipmap/ic_launcher"
/> />
<LinearLayout <LinearLayout
android:layout_width="wrap_content" android:layout_width="wrap_content"
@ -19,19 +20,19 @@
android:orientation="vertical" android:orientation="vertical"
android:layout_gravity="center_vertical" android:layout_gravity="center_vertical"
android:gravity="center_vertical"> android:gravity="center_vertical">
<TextView android:id="@+id/text" <TextView
android:id="@+id/text"
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:paddingTop="8dp" android:paddingTop="8dp"
android:textSize="18dp" android:textSize="18dp"
android:textColor="#FFFFFF"
/> />
<TextView android:id="@+id/text2" <TextView
android:id="@+id/text2"
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:paddingTop="8dp" android:paddingTop="8dp"
android:textSize="18dp" android:textSize="18dp"
android:textColor="#FFFFFF"
/> />
</LinearLayout> </LinearLayout>
</LinearLayout> </LinearLayout>

View File

@ -11,7 +11,7 @@
android:paddingTop="2dp" android:paddingTop="2dp"
android:text="TITLE" android:text="TITLE"
android:textAppearance="?android:attr/textAppearanceLarge" android:textAppearance="?android:attr/textAppearanceLarge"
android:textColor="#FFFFFF" android:textColor="@color/black"
/> />
<LinearLayout <LinearLayout
android:id="@+id/layout_horizontal" android:id="@+id/layout_horizontal"
@ -24,7 +24,7 @@
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_marginRight="10dp" android:layout_marginRight="10dp"
android:layout_gravity="center_vertical" android:layout_gravity="center_vertical"
android:src="@drawable/ic_launcher" android:src="@mipmap/ic_launcher"
android:contentDescription="image for dialog" android:contentDescription="image for dialog"
/> />
<LinearLayout <LinearLayout
@ -40,7 +40,6 @@
android:paddingTop="8dp" android:paddingTop="8dp"
android:text="Row1" android:text="Row1"
android:textAppearance="?android:attr/textAppearanceLarge" android:textAppearance="?android:attr/textAppearanceLarge"
android:textColor="#FFFFFF"
/> />
<TextView android:id="@+id/text2" <TextView android:id="@+id/text2"
android:layout_width="wrap_content" android:layout_width="wrap_content"
@ -48,7 +47,6 @@
android:paddingTop="8dp" android:paddingTop="8dp"
android:textAppearance="?android:attr/textAppearanceMedium" android:textAppearance="?android:attr/textAppearanceMedium"
android:text="Row2" android:text="Row2"
android:textColor="#FFFFFF"
/> />
</LinearLayout> </LinearLayout>
</LinearLayout> </LinearLayout>

View File

@ -210,8 +210,6 @@
</LinearLayout> </LinearLayout>
</LinearLayout> </LinearLayout>
<RelativeLayout <RelativeLayout
android:id="@+id/frameLayoutLanguage" android:id="@+id/frameLayoutLanguage"
android:layout_width="wrap_content" android:layout_width="wrap_content"
@ -221,11 +219,7 @@
android:layout_alignParentBottom="true" android:layout_alignParentBottom="true"
android:layout_gravity="right" android:layout_gravity="right"
android:paddingBottom="6dp" android:paddingBottom="6dp"
android:layout_toLeftOf="@+id/frameLayout13"> android:layout_toLeftOf="@+id/frameLayout13" />
</RelativeLayout>
<ImageView <ImageView
android:id="@+id/imageLoading" android:id="@+id/imageLoading"

View File

@ -35,6 +35,6 @@
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_weight="0" android:layout_weight="0"
android:background="@drawable/checked"> android:background="@drawable/checked"
</LinearLayout> android:orientation="horizontal" />
</LinearLayout> </LinearLayout>

View File

@ -7,7 +7,7 @@
android:id="@+id/icon" android:id="@+id/icon"
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:src="@drawable/ic_launcher" android:src="@mipmap/ic_launcher"
android:paddingLeft="5dp" android:paddingLeft="5dp"
android:paddingRight="5dp" android:paddingRight="5dp"
android:paddingTop="5dp" android:paddingTop="5dp"

View File

@ -9,7 +9,6 @@
style="?header" style="?header"
android:gravity="center_vertical" > android:gravity="center_vertical" >
<TextView <TextView
android:layout_width="fill_parent" android:layout_width="fill_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"

View File

@ -67,7 +67,6 @@
android:visibility="invisible" android:visibility="invisible"
android:background="@drawable/addmessage_selector"/> android:background="@drawable/addmessage_selector"/>
<!-- android:background="@drawable/addmessage_selector" -->
</LinearLayout> </LinearLayout>
<LinearLayout <LinearLayout
android:layout_width="fill_parent" android:layout_width="fill_parent"

View File

@ -1,8 +1,10 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent" android:layout_height="fill_parent" android:layout_width="fill_parent"
android:id="@+id/tab1Layout" android:orientation="horizontal" android:layout_height="fill_parent"
android:id="@+id/tab1Layout"
android:orientation="horizontal"
style="?bg"> style="?bg">
<RelativeLayout <RelativeLayout
@ -162,10 +164,11 @@
android:text="@string/startDate" android:text="@string/startDate"
android:textSize="22dp" android:textSize="22dp"
android:paddingLeft="5dp" android:paddingLeft="5dp"
android:layout_marginTop="15sp"
android:textColor="#000000" android:textColor="#000000"
android:gravity="left" android:gravity="left"
android:id="@+id/labelStartDate" android:id="@+id/labelStartDate"
android:visibility="gone"/> />
<LinearLayout <LinearLayout
android:id="@+id/layoutStartPicker" android:id="@+id/layoutStartPicker"
android:layout_height="wrap_content" android:layout_height="wrap_content"
@ -202,7 +205,7 @@
android:textColor="#000000" android:textColor="#000000"
android:gravity="left" android:gravity="left"
android:id="@+id/labelEndDate" android:id="@+id/labelEndDate"
android:visibility="gone"/> />
<LinearLayout <LinearLayout
android:id="@+id/layoutEndPicker" android:id="@+id/layoutEndPicker"
android:layout_height="wrap_content" android:layout_height="wrap_content"
@ -284,14 +287,15 @@
</LinearLayout> </LinearLayout>
<fragment <fragment
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="fill_parent" android:layout_width="fill_parent"
android:layout_height="fill_parent" android:layout_height="fill_parent"
android:id="@+id/map" android:id="@+id/map"
android:layout_toRightOf="@id/slidelayout" android:layout_toRightOf="@id/slidelayout"
android:layout_weight="1" android:layout_weight="1"
tools:context=".HistoryActivity"
android:name="com.google.android.gms.maps.SupportMapFragment" /> android:name="com.google.android.gms.maps.SupportMapFragment" />
</LinearLayout> </LinearLayout>
<ImageView <ImageView
android:id="@+id/changeMapType" android:id="@+id/changeMapType"

View File

@ -123,7 +123,6 @@
android:textSize="16dp" android:textSize="16dp"
android:paddingTop="7dp" /> android:paddingTop="7dp" />
</LinearLayout> </LinearLayout>
<!-- android:background="@drawable/addmessage_selector" -->
</LinearLayout> </LinearLayout>
<LinearLayout <LinearLayout
@ -204,8 +203,7 @@
android:id="@+id/imageViewStatus2" android:id="@+id/imageViewStatus2"
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="fill_parent" android:layout_height="fill_parent"
android:src="@drawable/status_offline" android:src="@drawable/status_offline" />
/>
</LinearLayout> </LinearLayout>
</LinearLayout> </LinearLayout>
@ -239,7 +237,6 @@
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:text="@string/Zone" android:text="@string/Zone"
android:textStyle="bold" android:textStyle="bold"
android:textColor="#ffffffff"
android:textAppearance="?android:attr/textAppearanceMedium"/> android:textAppearance="?android:attr/textAppearanceMedium"/>
<LinearLayout <LinearLayout
android:id="@+id/layoutSpinnerZone" android:id="@+id/layoutSpinnerZone"
@ -279,7 +276,6 @@
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:text="@string/Channel" android:text="@string/Channel"
android:textColor="#ffffffff"
android:textStyle="bold" android:textStyle="bold"
android:textAppearance="?android:attr/textAppearanceMedium"/> android:textAppearance="?android:attr/textAppearanceMedium"/>
@ -376,7 +372,8 @@
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:orientation="vertical"> android:orientation="vertical">
<RadioGroup android:id="@+id/radioGroupCallType" <RadioGroup
android:id="@+id/radioGroupCallType"
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_marginBottom="3sp"> android:layout_marginBottom="3sp">
@ -388,7 +385,7 @@
android:checked="true" android:checked="true"
android:text="@string/AllCall" android:text="@string/AllCall"
android:textAppearance="?android:attr/textAppearanceMedium" android:textAppearance="?android:attr/textAppearanceMedium"
android:textColor="#ffffffff" /> />
<RadioButton <RadioButton
android:id="@+id/radioGroup" android:id="@+id/radioGroup"
@ -396,7 +393,7 @@
android:layout_height="30dp" android:layout_height="30dp"
android:text="@string/GroupCall" android:text="@string/GroupCall"
android:textAppearance="?android:attr/textAppearanceMedium" android:textAppearance="?android:attr/textAppearanceMedium"
android:textColor="#ffffffff" /> />
<RadioButton <RadioButton
android:id="@+id/radioPrivate" android:id="@+id/radioPrivate"
@ -404,7 +401,7 @@
android:layout_height="30dp" android:layout_height="30dp"
android:text="@string/PrivateCall" android:text="@string/PrivateCall"
android:textAppearance="?android:attr/textAppearanceMedium" android:textAppearance="?android:attr/textAppearanceMedium"
android:textColor="#ffffffff" /> />
</RadioGroup> </RadioGroup>
<LinearLayout <LinearLayout
@ -463,7 +460,6 @@
android:text="@string/DeKey" android:text="@string/DeKey"
android:textSize="18dp" /> android:textSize="18dp" />
</LinearLayout> </LinearLayout>
</LinearLayout> </LinearLayout>
</LinearLayout> </LinearLayout>
</LinearLayout> </LinearLayout>

View File

@ -123,7 +123,6 @@
android:visibility="gone" android:visibility="gone"
android:background="@drawable/recycle"/> android:background="@drawable/recycle"/>
<!-- android:background="@drawable/addmessage_selector" -->
</LinearLayout> </LinearLayout>
<GridView <GridView

View File

@ -1,5 +1,6 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" <LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/layoutMain" android:id="@+id/layoutMain"
android:layout_width="fill_parent" android:layout_width="fill_parent"
android:layout_height="fill_parent" android:layout_height="fill_parent"
@ -34,7 +35,6 @@
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:text="@string/serverIP" android:text="@string/serverIP"
android:textSize="14dp" android:textSize="14dp"
android:textColor="#FFFFFF"
android:textStyle="bold" android:textStyle="bold"
android:layout_gravity="center_vertical" android:layout_gravity="center_vertical"
android:gravity="center_vertical|right" android:gravity="center_vertical|right"
@ -69,7 +69,6 @@
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:text="@string/serverPort" android:text="@string/serverPort"
android:textSize="14dp" android:textSize="14dp"
android:textColor="#FFFFFF"
android:textStyle="bold" android:textStyle="bold"
android:gravity="center_vertical|right" android:gravity="center_vertical|right"
android:layout_gravity="center_vertical|right" android:layout_gravity="center_vertical|right"
@ -88,13 +87,11 @@
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_gravity="center_vertical|right" android:layout_gravity="center_vertical|right"
android:inputType="number" android:inputType="number"
android:imeOptions="actionDone"> android:imeOptions="actionDone" />
</EditText>
</LinearLayout> </LinearLayout>
</LinearLayout> </LinearLayout>
</LinearLayout> </LinearLayout>
<LinearLayout <LinearLayout
android:layout_width="fill_parent" android:layout_width="fill_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
@ -115,7 +112,6 @@
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:text="@string/configName" android:text="@string/configName"
android:textSize="14dp" android:textSize="14dp"
android:textColor="#FFFFFF"
android:textStyle="bold" android:textStyle="bold"
android:gravity="center_vertical|right" android:gravity="center_vertical|right"
android:layout_gravity="center_vertical"/> android:layout_gravity="center_vertical"/>
@ -138,7 +134,6 @@
android:singleLine="true" > android:singleLine="true" >
<requestFocus /> <requestFocus />
</EditText> </EditText>
</LinearLayout> </LinearLayout>
<LinearLayout <LinearLayout
android:layout_height="wrap_content" android:layout_height="wrap_content"
@ -168,7 +163,6 @@
android:src="@drawable/questionmark_small" /> android:src="@drawable/questionmark_small" />
</LinearLayout> </LinearLayout>
</LinearLayout> </LinearLayout>
</LinearLayout> </LinearLayout>
<LinearLayout <LinearLayout
@ -184,7 +178,6 @@
android:text="@string/language" android:text="@string/language"
android:textSize="14dp" android:textSize="14dp"
android:layout_marginRight="2dp" android:layout_marginRight="2dp"
android:textColor="#FFFFFF"
android:textStyle="bold" android:textStyle="bold"
android:gravity="right" android:gravity="right"
android:layout_gravity="center_vertical"/> android:layout_gravity="center_vertical"/>
@ -249,7 +242,6 @@
</LinearLayout> </LinearLayout>
<RelativeLayout <RelativeLayout
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content"> android:layout_height="wrap_content"/>
</RelativeLayout>
</LinearLayout> </LinearLayout>

View File

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

View File

@ -0,0 +1,4 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<color name="ic_launcher_background">#FFFFFF</color>
</resources>

View File

@ -1,8 +1,8 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<resources> <resources>
<string name="app_name">SafeMobile Dispatch</string> <string name="app_name">SafeDispatch Mobile</string>
<string name="app_name_demo">SafeMobile Dispatch Demo</string> <string name="app_name_demo">SafeDispatch Mobile Demo</string>
<string name="app_name_radiopod">RadioPod</string> <string name="app_name_radiopod">RadioPod</string>
<string name="app_name_radiopad">RadioPad</string> <string name="app_name_radiopad">RadioPad</string>
<string name="app_name_radiopodd">RadioPod</string> <string name="app_name_radiopodd">RadioPod</string>
@ -257,5 +257,13 @@
<string name="speedMph">%1$d mph</string> <string name="speedMph">%1$d mph</string>
<string name="DialogService_Info_ErrorMessage">Oops, something happened</string>
<string name="go_to_settings">Go to settings</string>
<string name="permission_denied">Permission Denied</string>
<string name="permissionBlocked">%1$s permission was not accepted. To be able to use the %2$s, please open application settings and grant the %3$s permission</string>
<string name="microphone">Microphone</string>
<string name="radio_tab">Radio Tab</string>
<string name="too_many_positions">You have selected %1$s positions.\nPlease select a smalled interval.</string>
<string name="no_data_for_interval">No data for this interval</string>
</resources> </resources>

View File

@ -82,7 +82,7 @@
<style name="mainBackground_sd"> <style name="mainBackground_sd">
<item name="android:orientation">vertical</item> <item name="android:orientation">vertical</item>
<item name="android:background">@drawable/safedispatch</item> <item name="android:background">@drawable/safedispatch_logo</item>
<item name="android:scaleType">centerInside</item> <item name="android:scaleType">centerInside</item>
</style> </style>
@ -138,7 +138,7 @@
</style> </style>
<style name="bg_sd"> <style name="bg_sd">
<item name="android:background">@drawable/safedispatch</item> <item name="android:background">@drawable/safedispatch_logo</item>
</style> </style>
<style name="header_sd"> <style name="header_sd">
@ -155,7 +155,7 @@
<style name="mainBackground_hy"> <style name="mainBackground_hy">
<item name="android:orientation">vertical</item> <item name="android:orientation">vertical</item>
<item name="android:background">@drawable/safedispatch</item> <item name="android:background">@drawable/safedispatch_logo</item>
<item name="android:scaleType">centerInside</item> <item name="android:scaleType">centerInside</item>
</style> </style>
@ -211,7 +211,7 @@
</style> </style>
<style name="bg_hy"> <style name="bg_hy">
<item name="android:background">@drawable/safedispatch</item> <item name="android:background">@drawable/safedispatch_logo</item>
</style> </style>
<style name="header_hy"> <style name="header_hy">
@ -228,7 +228,7 @@
<style name="mainBackground_vi"> <style name="mainBackground_vi">
<item name="android:orientation">vertical</item> <item name="android:orientation">vertical</item>
<item name="android:background">@drawable/safedispatch</item> <item name="android:background">@drawable/safedispatch_logo</item>
<item name="android:scaleType">centerInside</item> <item name="android:scaleType">centerInside</item>
</style> </style>
@ -285,7 +285,7 @@
</style> </style>
<style name="bg_vi"> <style name="bg_vi">
<item name="android:background">@drawable/safedispatch</item> <item name="android:background">@drawable/safedispatch_logo</item>
</style> </style>
<style name="header_vi"> <style name="header_vi">