Compare commits

...

35 Commits

Author SHA1 Message Date
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
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
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
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
b072355b4f #SD-185 - Make the UI compatible with SMS parsing changes 2022-03-18 08:40:05 +02:00
0fabbc73be comment line in order to move vehicle 2022-03-17 15:13:25 +02:00
85cf7ae6a4 Merge pull request 'Live Page' (#3) from feature/live into develop
Reviewed-on: #3
2022-03-17 08:20:52 +00:00
91a05ae4d1 start working on history 2022-03-17 10:18:23 +02:00
4f7def273f merge with develop 2022-03-16 16:49:04 +02:00
4439687405 display history 2022-03-16 16:40:34 +02:00
5349558ace display info when on move 2022-03-16 14:41:05 +02:00
b91931e833 small changes 2022-03-16 14:32:28 +02:00
201845da3a display info bubble 2022-03-16 10:54:41 +02:00
2334dc2e3c make marker move 2022-03-15 17:42:58 +02:00
4141b2ab8c Merge pull request '#SD-199 - rework SDMobileActivity and check live messages' (#2) from features/SD-199-livetab-check into develop
Reviewed-on: #2
2022-03-15 13:56:44 +00:00
3da44593dd display Markers 2022-03-15 14:45:18 +02:00
77 changed files with 3417 additions and 3564 deletions

0
gradlew vendored Normal file → Executable file
View File

View File

@ -19,6 +19,13 @@ android {
buildFeatures {
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 {

View File

@ -6,7 +6,7 @@
<application
android:allowBackup="true"
android:icon="@drawable/ic_launcher"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:theme="@style/AppTheme" >
</application>

View File

@ -2,6 +2,7 @@ package com.safemobile.activities;
import java.util.ArrayList;
import com.google.android.gms.maps.GoogleMap;
import com.safemobile.lib.Vehicle;
import android.app.Activity;
@ -23,7 +24,7 @@ public abstract class AbstractLiveActivity extends AppCompatActivity {
public abstract void pollReceived(int position, double lat, double lng); // --> UpdatePoll
public abstract void vehicleStatusReceived(long imei, int opCode, int status); // --> UpdateOptions
public abstract void emergencyAlarmReceived(int position, double lat, double lng); // --> UpdateEmergencyAlarm
public abstract GoogleMap getMap(); // --> UpdateEmergencyAlarm
/** Misc */
public AbstractSDParentActivity getParentTab() {

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)
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)
SM.Debug("Message [sendAlarmAcknowledge] sent to app server alarm_id:" + alarm_id + " type:" + type);
else
@ -198,12 +198,11 @@ public abstract class AbstractSDParentActivity extends TabActivity {
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)
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+"#");
if(res)
SM.Debug("Message [getHistoryPositions] sent to app server");
@ -213,8 +212,7 @@ public abstract class AbstractSDParentActivity extends TabActivity {
return res;
}
public boolean getRadiosList()
{
public boolean getRadiosList() {
if(tcp == null)
return false;

View File

@ -6,7 +6,6 @@ import java.util.Calendar;
import java.util.Hashtable;
import android.app.Activity;
import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
@ -19,20 +18,18 @@ import com.safemobile.lib.Msg;
import com.safemobile.lib.R;
import com.safemobile.lib.SM;
public class ConversationGridViewAdapter extends BaseAdapter
{
private ArrayList<Msg> listMessages;
private Activity activity;
//public String time;
private ArrayList<Boolean> dispatcher_positions = new ArrayList<Boolean>();
private ArrayList<Boolean> ackPositions = new ArrayList<Boolean>();
private Hashtable<Integer, View> hash = new Hashtable<Integer, View>();
public class ConversationGridViewAdapter extends BaseAdapter {
private final ArrayList<Msg> listMessages;
private final Activity activity;
private final ArrayList<Boolean> dispatcherPositions;
private final ArrayList<Boolean> ackPositions;
private final Hashtable<Integer, View> hash = new Hashtable<>();
public ConversationGridViewAdapter(Activity activity, ArrayList<Msg> listMessages, Context context, long sc_id, int unit_type, ArrayList<Boolean> dispatcher_positions, ArrayList<Boolean> ackPositions) {
public ConversationGridViewAdapter(Activity activity, ArrayList<Msg> listMessages, ArrayList<Boolean> dispatcherPositions, ArrayList<Boolean> ackPositions) {
this.activity = activity;
this.listMessages = listMessages;
this.dispatcher_positions = dispatcher_positions;
this.dispatcherPositions = dispatcherPositions;
this.ackPositions = ackPositions;
}
@ -51,149 +48,230 @@ public class ConversationGridViewAdapter extends BaseAdapter
return 0;
}
public static class ViewHolder
{
public ImageView imgViewContact;
public TextView txtViewMsg;
public TextView txtViewDateTime;
public ImageView imgViewReceivedContact;
public TextView txtViewReceivedMsg;
public TextView txtViewReceivedDateTime;
public ImageView imageAck;
public TextView textViewNotACK;
public LinearLayout layoutSend;
public LinearLayout layoutReceived;
public static class ViewHolder {
private ImageView imgViewContact;
private TextView txtViewMsg;
private TextView txtViewDateTime;
private ImageView imgViewReceivedContact;
private TextView txtViewReceivedMsg;
private TextView txtViewReceivedDateTime;
private ImageView imageAck;
private TextView textViewNotACK;
private LinearLayout layoutSend;
private LinearLayout layoutReceived;
public ImageView getImgViewContact() {
return imgViewContact;
}
public void setImgViewContact(ImageView imgViewContact) {
this.imgViewContact = imgViewContact;
}
public TextView getTxtViewMsg() {
return txtViewMsg;
}
public void setTxtViewMsg(TextView txtViewMsg) {
this.txtViewMsg = txtViewMsg;
}
public TextView getTxtViewDateTime() {
return txtViewDateTime;
}
public void setTxtViewDateTime(TextView txtViewDateTime) {
this.txtViewDateTime = txtViewDateTime;
}
public ImageView getImgViewReceivedContact() {
return imgViewReceivedContact;
}
public void setImgViewReceivedContact(ImageView imgViewReceivedContact) {
this.imgViewReceivedContact = imgViewReceivedContact;
}
public TextView getTxtViewReceivedMsg() {
return txtViewReceivedMsg;
}
public void setTxtViewReceivedMsg(TextView txtViewReceivedMsg) {
this.txtViewReceivedMsg = txtViewReceivedMsg;
}
public TextView getTxtViewReceivedDateTime() {
return txtViewReceivedDateTime;
}
public void setTxtViewReceivedDateTime(TextView txtViewReceivedDateTime) {
this.txtViewReceivedDateTime = txtViewReceivedDateTime;
}
public ImageView getImageAck() {
return imageAck;
}
public void setImageAck(ImageView imageAck) {
this.imageAck = imageAck;
}
public TextView getTextViewNotACK() {
return textViewNotACK;
}
public void setTextViewNotACK(TextView textViewNotACK) {
this.textViewNotACK = textViewNotACK;
}
public LinearLayout getLayoutSend() {
return layoutSend;
}
public void setLayoutSend(LinearLayout layoutSend) {
this.layoutSend = layoutSend;
}
public LinearLayout getLayoutReceived() {
return layoutReceived;
}
public void setLayoutReceived(LinearLayout layoutReceived) {
this.layoutReceived = layoutReceived;
}
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
ViewHolder view;
LayoutInflater inflator = activity.getLayoutInflater();
LayoutInflater inflater = activity.getLayoutInflater();
if(convertView==null)
{
if (convertView == null) {
view = new ViewHolder();
convertView = inflator.inflate(R.layout.row_conversation, null);
convertView = inflater.inflate(R.layout.row_conversation, null);
view.imgViewContact = (ImageView) convertView.findViewById(R.id.imageViewSenderIco);
view.txtViewMsg = (TextView) convertView.findViewById(R.id.textViewSendMsg);
view.txtViewDateTime = (TextView) convertView.findViewById(R.id.textViewSendDate);
view.imgViewReceivedContact = (ImageView) convertView.findViewById(R.id.imageViewReceivedIco);
view.txtViewReceivedMsg = (TextView) convertView.findViewById(R.id.textViewReceivedMsg);
view.txtViewReceivedDateTime = (TextView) convertView.findViewById(R.id.textViewReceivedDate);
view.layoutSend = (LinearLayout) convertView.findViewById(R.id.layoutSend);
view.layoutReceived = (LinearLayout) convertView.findViewById(R.id.layoutReceived);
view.textViewNotACK = (TextView) convertView.findViewById(R.id.textViewNotACKSendMsg);
view.imageAck = (ImageView) convertView.findViewById(R.id.imageAck);
view.setImgViewContact(convertView.findViewById(R.id.imageViewSenderIco));
view.setTxtViewMsg(convertView.findViewById(R.id.textViewSendMsg));
view.setTxtViewDateTime(convertView.findViewById(R.id.textViewSendDate));
view.setImgViewReceivedContact(convertView.findViewById(R.id.imageViewReceivedIco));
view.setTxtViewReceivedMsg(convertView.findViewById(R.id.textViewReceivedMsg));
view.setTxtViewReceivedDateTime(convertView.findViewById(R.id.textViewReceivedDate));
view.setLayoutSend(convertView.findViewById(R.id.layoutSend));
view.setLayoutReceived(convertView.findViewById(R.id.layoutReceived));
view.setTextViewNotACK(convertView.findViewById(R.id.textViewNotACK));
view.setImageAck(convertView.findViewById(R.id.imageAck));
convertView.setTag(view);
}
else
{
} else {
view = (ViewHolder) convertView.getTag();
}
try
{
try {
hash.put(position, convertView);
SimpleDateFormat sdf = new SimpleDateFormat("HH:mm MMM-dd");
Calendar calendar = Calendar.getInstance();
calendar.set(Calendar.HOUR_OF_DAY,0);
calendar.set(Calendar.HOUR_OF_DAY, 0);
calendar.set(Calendar.MINUTE, 0);
calendar.set(Calendar.SECOND, 0);
calendar.set(Calendar.MILLISECOND, 0);
if(listMessages.get(position).received.after(calendar.getTime()))
if (listMessages.get(position).received.after(calendar.getTime()))
sdf = new SimpleDateFormat("HH:mm:ss");
else
sdf = new SimpleDateFormat("HH:mm MMM-dd");
//view.imgViewContact.setImageResource(getIcon(listMessages.get(position).from.user_type));
view.imgViewContact.setImageResource(R.drawable.peoplegreen_large);
view.txtViewMsg.setText(listMessages.get(position).message);
view.txtViewDateTime.setText(sdf.format(listMessages.get(position).received));
//view.imgViewReceivedContact.setImageResource(getIcon(listMessages.get(position).from.user_type));
view.imgViewReceivedContact.setImageResource(listMessages.get(position).from.getLargeIcon());
view.txtViewReceivedMsg.setText(listMessages.get(position).message);
view.txtViewReceivedDateTime.setText(sdf.format(listMessages.get(position).received));
view.getImgViewContact().setImageResource(R.drawable.peoplegreen_large);
view.getTxtViewMsg().setText(listMessages.get(position).message);
view.getTxtViewDateTime().setText(sdf.format(listMessages.get(position).received));
view.getImgViewReceivedContact().setImageResource(listMessages.get(position).from.getLargeIcon());
view.getTxtViewReceivedMsg().setText(listMessages.get(position).message);
view.getTxtViewReceivedDateTime().setText(sdf.format(listMessages.get(position).received));
if(ackPositions.size() > 0)
switch(ackPositions.get(position) ? 1: 0) {
if (!ackPositions.isEmpty())
switch (Boolean.TRUE.equals(ackPositions.get(position)) ? 1 : 0) {
case 0:
// show not ack
view.textViewNotACK.setVisibility(View.VISIBLE);
view.imageAck.setVisibility(View.VISIBLE);
view.getTextViewNotACK().setVisibility(View.VISIBLE);
view.getImageAck().setVisibility(View.VISIBLE);
break;
case 1:
// show not ack
view.textViewNotACK.setVisibility(View.INVISIBLE);
view.imageAck.setVisibility(View.INVISIBLE);
view.getTextViewNotACK().setVisibility(View.INVISIBLE);
view.getImageAck().setVisibility(View.INVISIBLE);
break;
default:
throw new IllegalStateException("Unexpected value: " + (Boolean.TRUE.equals(ackPositions.get(position)) ? 1 : 0));
}
switch(dispatcher_positions.get(position) ? 1 : 0) {
switch (Boolean.TRUE.equals(dispatcherPositions.get(position)) ? 1 : 0) {
case 1:
view.layoutReceived.setVisibility(View.GONE);
view.layoutSend.setVisibility(View.VISIBLE);
view.getLayoutReceived().setVisibility(View.GONE);
view.getLayoutSend().setVisibility(View.VISIBLE);
break;
case 0:
view.layoutReceived.setVisibility(View.VISIBLE);
view.layoutSend.setVisibility(View.GONE);
view.getLayoutReceived().setVisibility(View.VISIBLE);
view.getLayoutSend().setVisibility(View.GONE);
break;
default:
throw new IllegalStateException("Unexpected value: " + (Boolean.TRUE.equals(dispatcherPositions.get(position)) ? 1 : 0));
}
}
catch(Exception ex)
{
} catch (Exception ex) {
SM.Exception(ex.toString());
}
return convertView;
}
public void setACK(String seqID)
{
int position = -1, i=0;
public void setACK(String seqID) {
int position = -1;
int i = 0;
for(Msg msg: listMessages)
{
if(msg.seqID.equals(seqID))
for (Msg msg : listMessages) {
if (msg.seqID.equals(seqID))
position = i;
i++;
}
if(position > -1 && position < ackPositions.size()) {
if (position > -1 && position < ackPositions.size()) {
ackPositions.remove(position);
ackPositions.add(position, true);
}
}
public void changeView(String seqID)
{
int position = -1, i=0;
public void changeView(String seqID) {
int position = -1;
int i = 0;
for(Msg msg: listMessages)
{
if(msg.seqID.equals(seqID))
for (Msg msg : listMessages) {
if (msg.seqID.equals(seqID))
position = i;
i++;
}
if(position != -1 && hash.size() > position)
{
if (position != -1 && hash.size() > position) {
SM.Debug("POSITON : " + position);
View con = hash.get(position);
ViewHolder view = (ViewHolder) con.getTag();
ViewHolder view = null;
if (con != null) {
view = (ViewHolder) con.getTag();
}
switch(ackPositions.get(position) ? 1 : 0)
{
switch (Boolean.TRUE.equals(ackPositions.get(position)) ? 1 : 0) {
case 1:
view.imageAck.setVisibility(View.INVISIBLE);
view.textViewNotACK.setVisibility(View.INVISIBLE);
if (view != null) {
view.getImageAck().setVisibility(View.INVISIBLE);
view.getTextViewNotACK().setVisibility(View.INVISIBLE);
}
break;
case 0:
view.imageAck.setVisibility(View.VISIBLE);
view.textViewNotACK.setVisibility(View.VISIBLE);
if (view != null) {
view.getImageAck().setVisibility(View.VISIBLE);
view.getTextViewNotACK().setVisibility(View.VISIBLE);
}
break;
default:
throw new IllegalStateException("Unexpected value: " + (Boolean.TRUE.equals(ackPositions.get(position)) ? 1 : 0));
}
}
}

View File

@ -5,7 +5,6 @@ import java.util.ArrayList;
import java.util.Calendar;
import android.app.Activity;
import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
@ -18,15 +17,11 @@ import com.safemobile.lib.Msg;
import com.safemobile.lib.R;
import com.safemobile.lib.SM;
public class MessagesGridViewAdapter extends BaseAdapter
{
private ArrayList<Msg> listMessages;
private Activity activity;
//public String time;
//private int[] colors = new int[] { Color.parseColor("#FFFFFF"), Color.parseColor("#D2E4FC") };
public class MessagesGridViewAdapter extends BaseAdapter {
private final ArrayList<Msg> listMessages;
private final Activity activity;
public MessagesGridViewAdapter(Activity activity, ArrayList<Msg> listMessages, Context context) {
public MessagesGridViewAdapter(Activity activity, ArrayList<Msg> listMessages) {
super();
this.activity = activity;
this.listMessages = listMessages;
@ -47,8 +42,7 @@ public class MessagesGridViewAdapter extends BaseAdapter
return 0;
}
public static class ViewHolder
{
public static class ViewHolder {
public ImageView imgViewContact;
public TextView txtViewContact;
public TextView txtViewDateTime;
@ -62,71 +56,44 @@ public class MessagesGridViewAdapter extends BaseAdapter
ViewHolder view;
LayoutInflater inflator = activity.getLayoutInflater();
if(convertView==null)
{
if (convertView == null) {
view = new ViewHolder();
convertView = inflator.inflate(R.layout.row_message, null);
view.imgViewContact = (ImageView) convertView.findViewById(R.id.imageViewContact);
view.txtViewContact = (TextView) convertView.findViewById(R.id.textViewContact);
view.txtViewDateTime = (TextView) convertView.findViewById(R.id.textViewLastDate);
view.txtViewLastMsg = (TextView) convertView.findViewById(R.id.textViewLastMsg);
view.layoutMessage = (LinearLayout) convertView.findViewById(R.id.layoutMessage);
view.imgViewContact = convertView.findViewById(R.id.imageViewContact);
view.txtViewContact = convertView.findViewById(R.id.textViewContact);
view.txtViewDateTime = convertView.findViewById(R.id.textViewLastDate);
view.txtViewLastMsg = convertView.findViewById(R.id.textViewLastMsg);
view.layoutMessage = convertView.findViewById(R.id.layoutMessage);
convertView.setTag(view);
}
else
{
} else {
view = (ViewHolder) convertView.getTag();
}
try
{
try {
view.imgViewContact.setImageResource(listMessages.get(position).from.getLargeIcon());
//view.imgViewContact.setImageResource(R.drawable.peopleblue);
view.txtViewContact.setText(listMessages.get(position).from.name+ " :");
if(listMessages.get(position).message.length() > 25)
view.txtViewLastMsg.setText(listMessages.get(position).message.substring(0, 25) + "...");
view.txtViewContact.setText(String.format("%s :", listMessages.get(position).from.name));
if (listMessages.get(position).message.length() > 25)
view.txtViewLastMsg.setText(String.format("%s...", listMessages.get(position).message.substring(0, 25)));
else
view.txtViewLastMsg.setText(listMessages.get(position).message);
SimpleDateFormat sdf = new SimpleDateFormat("HH:mm:ss");
Calendar calendar = Calendar.getInstance();
calendar.set(Calendar.HOUR_OF_DAY,0);
calendar.set(Calendar.HOUR_OF_DAY, 0);
calendar.set(Calendar.MINUTE, 0);
calendar.set(Calendar.SECOND, 0);
calendar.set(Calendar.MILLISECOND, 0);
if(listMessages.get(position).received.after(calendar.getTime()))
if (listMessages.get(position).received.after(calendar.getTime()))
sdf = new SimpleDateFormat("HH:mm:ss");
else
sdf = new SimpleDateFormat("MMM-dd HH:mm");
view.txtViewDateTime.setText(sdf.format(listMessages.get(position).received));
}
catch(Exception ex)
{
} catch (Exception ex) {
SM.Exception(ex.toString());
}
return convertView;
}
public int getIcon(int user_type, String username)
{
// if request was send by MessagesActivity -> Spinner
if(user_type == -1)
{
// get unit_type for selected username
for (Msg mes: listMessages)
{
// if user is selected
if(mes.from.name.equals(username))
{
user_type = (int) mes.from.driver_id; // save user_type
return mes.from.getLargeIcon();
}
}
}
return 0;
}
}

View File

@ -1,215 +0,0 @@
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 android.app.Activity;
import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.TextView;
import com.safemobile.lib.R;
import com.safemobile.lib.SM;
import com.safemobile.libpad.PadTextMessage;
public class PadConversationGridViewAdapter extends BaseAdapter
{
private ArrayList<PadTextMessage> listMessages;
private Activity activity;
//public String time;
private ArrayList<Boolean> outgoingPositions = new ArrayList<Boolean>();
private ArrayList<Boolean> ackPositions = new ArrayList<Boolean>();
private Hashtable<Integer, View> hash = new Hashtable<Integer, View>();
public PadConversationGridViewAdapter(Activity activity, ArrayList<PadTextMessage> listMessages, Context context, ArrayList<Boolean> outgoingPositions, ArrayList<Boolean> ackPositions) {
this.activity = activity;
this.listMessages = listMessages;
this.outgoingPositions = outgoingPositions;
this.ackPositions = ackPositions;
}
@Override
public int getCount() {
return listMessages.size();
}
@Override
public PadTextMessage getItem(int position) {
return listMessages.get(position);
}
@Override
public long getItemId(int position) {
return 0;
}
/** return the list of messages in the adapter
* @return an ArrayList of PadTextMessages
*/
public ArrayList<PadTextMessage> getMessages() {
return listMessages;
}
public static class ViewHolder
{
public ImageView imgViewContact;
public TextView txtViewMsg;
public TextView txtViewDateTime;
public ImageView imgViewReceivedContact;
public TextView txtViewReceivedMsg;
public TextView txtViewReceivedDateTime;
public ImageView imageAck;
public TextView textViewNotACK;
public LinearLayout layoutSend;
public LinearLayout layoutReceived;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
ViewHolder view;
LayoutInflater inflator = activity.getLayoutInflater();
if(convertView==null)
{
view = new ViewHolder();
convertView = inflator.inflate(R.layout.row_conversation, null);
view.imgViewContact = (ImageView) convertView.findViewById(R.id.imageViewSenderIco);
view.txtViewMsg = (TextView) convertView.findViewById(R.id.textViewSendMsg);
view.txtViewDateTime = (TextView) convertView.findViewById(R.id.textViewSendDate);
view.imgViewReceivedContact = (ImageView) convertView.findViewById(R.id.imageViewReceivedIco);
view.txtViewReceivedMsg = (TextView) convertView.findViewById(R.id.textViewReceivedMsg);
view.txtViewReceivedDateTime = (TextView) convertView.findViewById(R.id.textViewReceivedDate);
view.layoutSend = (LinearLayout) convertView.findViewById(R.id.layoutSend);
view.layoutReceived = (LinearLayout) convertView.findViewById(R.id.layoutReceived);
view.textViewNotACK = (TextView) convertView.findViewById(R.id.textViewNotACKSendMsg);
view.imageAck = (ImageView) convertView.findViewById(R.id.imageAck);
convertView.setTag(view);
}
else
{
view = (ViewHolder) convertView.getTag();
}
try
{
hash.put(position, convertView);
SimpleDateFormat sdf = new SimpleDateFormat("HH:mm MMM-dd", Locale.getDefault());
Calendar calendar = Calendar.getInstance();
calendar.set(Calendar.HOUR_OF_DAY,0);
calendar.set(Calendar.MINUTE, 0);
calendar.set(Calendar.SECOND, 0);
calendar.set(Calendar.MILLISECOND, 0);
Date date = new Date(listMessages.get(position).timeGMT * 1000);
if(date.after(calendar.getTime()))
sdf = new SimpleDateFormat("HH:mm:ss", Locale.getDefault());
else
sdf = new SimpleDateFormat("HH:mm MMM-dd", Locale.getDefault());
// set gmt time
//sdf.setTimeZone(TimeZone.getTimeZone("GMT"));
//view.imgViewContact.setImageResource(getIcon(listMessages.get(position).from.user_type));
view.imgViewContact.setImageResource(R.drawable.peoplegreen_large);
view.txtViewMsg.setText(listMessages.get(position).message);
view.txtViewDateTime.setText(sdf.format(date));
//view.imgViewReceivedContact.setImageResource(getIcon(listMessages.get(position).from.user_type));
view.imgViewReceivedContact.setImageResource(R.drawable.peopleblue_large);
view.txtViewReceivedMsg.setText(listMessages.get(position).message);
view.txtViewReceivedDateTime.setText(sdf.format(date));
if(ackPositions.size() > 0)
switch(ackPositions.get(position) ? 1: 0) {
case 0:
// show not ack
view.textViewNotACK.setVisibility(View.VISIBLE);
view.imageAck.setVisibility(View.VISIBLE);
break;
case 1:
// show not ack
view.textViewNotACK.setVisibility(View.INVISIBLE);
view.imageAck.setVisibility(View.INVISIBLE);
}
switch(outgoingPositions.get(position) ? 1 : 0) {
case 1:
view.layoutReceived.setVisibility(View.GONE);
view.layoutSend.setVisibility(View.VISIBLE);
break;
case 0:
view.layoutReceived.setVisibility(View.VISIBLE);
view.layoutSend.setVisibility(View.GONE);
break;
}
}
catch(Exception ex)
{
SM.Exception(ex.toString());
}
return convertView;
}
/*
public void setACK(String seqID)
{
int position = -1, i=0;
for(Msg msg: listMessages)
{
if(msg.seqID.equals(seqID))
position = i;
i++;
}
ackPositions.remove(position);
ackPositions.add(position, true);
}
public void changeView(String seqID)
{
int position = -1, i=0;
for(Msg msg: listMessages)
{
if(msg.seqID.equals(seqID))
position = i;
i++;
}
if(position != -1 && hash.size() > position)
{
SM.Debug("POSITON : " + position);
View con = hash.get(position);
ViewHolder view = (ViewHolder) con.getTag();
switch(ackPositions.get(position) ? 1 : 0)
{
case 1:
view.imageAck.setVisibility(View.INVISIBLE);
view.textViewNotACK.setVisibility(View.INVISIBLE);
break;
case 0:
view.imageAck.setVisibility(View.VISIBLE);
view.textViewNotACK.setVisibility(View.VISIBLE);
break;
}
}
}
*/
}

View File

@ -21,36 +21,28 @@ public class SuperVehicle extends Vehicle{
// TODO Auto-generated constructor stub
}
public void SetDataFromLastPos(Double _lat,Double _lng,long _time,int _speed,String _Address,Boolean _isON)
{
try
{
public void SetDataFromLastPos(Double _lat,Double _lng,long _time,int _speed,String _Address,Boolean _isON) {
try {
lat = _lat;
lng = _lng;
timeGMT = _time;
speed = _speed;
Address = _Address;
isON = _isON;
}
catch (Exception ex)
{
Log.d("Erorr", "Contert Error:"+ex.toString());
} catch (Exception ex) {
Log.d("Erorr", "Contert Error: "+ ex);
}
}
public void SetNewPosition(Double _lat,Double _lng,long _time,int _speed)
{
try
{
public void SetNewPosition(Double _lat,Double _lng,long _time,int _speed) {
try {
lat = _lat;
lng = _lng;
timeGMT = _time;
speed = _speed;
isON = true;
}
catch (Exception ex)
{
Log.d("Erorr", "Contert Error:"+ex.toString());
} catch (Exception ex) {
Log.d("Erorr", "Contert Error: " + ex);
}
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 16 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 22 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 19 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 16 KiB

View File

@ -0,0 +1,140 @@
<?xml version="1.0" encoding="utf-8"?><!--
Copyright (C) 2012 The Android Open Source Project
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
-->
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
xmlns:tools="http://schemas.android.com/tools"
android:background="@drawable/custom_info_bubble"
android:paddingLeft="7dp"
android:paddingRight="7dp"
android:paddingTop="9dp"
android:orientation="vertical">
<LinearLayout
android:id="@+id/containerTop"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="@drawable/l_bg_gps"
android:orientation="vertical">
<TextView
android:id="@+id/tvUnitName"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
android:ellipsize="end"
android:fontFamily="sans-serif-smallcaps"
android:maxLines="1"
android:paddingTop="5dp"
tools:text="Linux 9910"
android:textColor="#FFFFFF"
android:textSize="18sp"
android:textStyle="bold" />
<TextView
android:id="@+id/tvGPSLocation"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
android:ellipsize="end"
android:fontFamily="sans-serif-smallcaps"
android:maxLines="1"
tools:text="[44.41857,26.09585]"
android:textColor="#FFFFFF"
android:textSize="10sp"
tools:ignore="SmallSp" />
</LinearLayout>
<RelativeLayout
android:layout_width="225dp"
android:layout_height="wrap_content"
android:padding="10dp"
android:id="@+id/rlMapInfoBubbleInfo">
<ImageView
android:id="@+id/time"
android:layout_width="24dp"
android:layout_height="24dp"
android:layout_marginRight="5dp"
android:adjustViewBounds="true"
android:src="@drawable/l_time"
android:layout_marginEnd="5dp" />
<TextView
android:id="@+id/tvTimeAgo"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignBottom="@+id/time"
android:layout_alignTop="@+id/time"
android:layout_gravity="center_horizontal"
android:layout_toEndOf="@+id/time"
android:layout_toRightOf="@+id/time"
android:ellipsize="end"
android:gravity="center_vertical"
android:maxLines="1"
tools:text="a year ago [01:05:01]"
android:textColor="#ff000000"
android:textSize="10sp" />
<ImageView
android:id="@+id/speed"
android:layout_width="24dp"
android:layout_height="24dp"
android:layout_below="@+id/time"
android:layout_marginRight="5dp"
android:layout_marginTop="5dp"
android:adjustViewBounds="true"
android:src="@drawable/l_speed" />
<TextView
android:id="@+id/tvSpeed"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignBottom="@+id/speed"
android:layout_alignTop="@+id/speed"
android:layout_gravity="center_horizontal"
android:layout_toRightOf="@+id/speed"
android:ellipsize="end"
android:gravity="center_vertical"
android:maxLines="1"
tools:text="24 kph"
android:textColor="#ff000000"
android:textSize="10sp" />
<ImageView
android:id="@+id/streetView"
android:layout_width="24dp"
android:layout_height="24dp"
android:layout_below="@+id/speed"
android:layout_marginTop="5dp"
android:layout_marginRight="5dp"
android:adjustViewBounds="true"
android:src="@drawable/l_street"
android:visibility="visible" />
<TextView
android:id="@+id/tvStreetView"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignTop="@+id/streetView"
android:layout_gravity="center_horizontal"
android:layout_toRightOf="@+id/streetView"
android:ellipsize="end"
android:gravity="center_vertical"
android:maxLines="5"
tools:text="3601 E Algonquin Rd., Suite 800 Rolling Meadows, IL 60008"
android:textColor="#ff000000"
android:textSize="10sp"
android:visibility="visible" />
</RelativeLayout>
</LinearLayout>

View File

@ -1,5 +1,6 @@
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical"
@ -53,7 +54,7 @@
android:layout_width="fill_parent"
android:layout_height="wrap_content">
<ImageView
android:id="@+id/imageAckSendMsg"
android:id="@+id/imageAck"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:adjustViewBounds="true"
@ -61,16 +62,18 @@
android:paddingTop="2dp"
android:src="@drawable/exclamation_small"
android:layout_weight="0"
android:visibility="invisible"/>
android:visibility="invisible"
tools:ignore="DuplicateIds" />
<TextView
android:id="@+id/textViewNotACKSendMsg"
android:id="@+id/textViewNotACK"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="@string/notAck"
android:textColor="#000000"
android:textSize="13dp"
android:layout_toRightOf="@+id/imageAck"
android:visibility="invisible" />
android:visibility="invisible"
tools:ignore="DuplicateIds" />
<TextView
android:id="@+id/textViewSendDate"
android:layout_width="wrap_content"
@ -113,7 +116,7 @@
android:layout_width="fill_parent"
android:layout_height="wrap_content">
<ImageView
android:id="@+id/imageAckReceiveMsg"
android:id="@+id/imageAck"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:adjustViewBounds="true"
@ -121,16 +124,18 @@
android:paddingTop="2dp"
android:src="@drawable/exclamation_small"
android:layout_weight="0"
android:visibility="invisible"/>
android:visibility="invisible"
tools:ignore="DuplicateIds" />
<TextView
android:id="@+id/textViewNotACKReceiveMsg"
android:id="@+id/textViewNotACK"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="@string/notAck"
android:textColor="#000000"
android:textSize="13dp"
android:layout_toRightOf="@+id/imageAck"
android:visibility="invisible"/>
android:visibility="invisible"
tools:ignore="DuplicateIds" />
<TextView
android:id="@+id/textViewReceivedDate"
android:layout_width="wrap_content"

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

@ -0,0 +1,5 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<color name="white">#FFFFFF</color>
<color name="black">#000000</color>
</resources>

View File

@ -1,14 +1,36 @@
apply plugin: 'com.android.application'
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 {
compileSdkVersion 31
buildToolsVersion "31.0.0"
defaultConfig {
applicationId "com.safemobile.dispatch"
applicationId "com.safemobile.safedispatch"
minSdkVersion 21
targetSdkVersion 31
versionName androidGitVersion.name()
versionCode androidGitVersion.code()
archivesBaseName = "SafeDispatchMobile_v.$versionName"
}
buildTypes {
@ -20,6 +42,13 @@ android {
buildFeatures {
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 {
implementation project(':libSafeMobile')

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,9 +1,6 @@
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
package="com.safemobile.dispatch"
android:versionCode="9"
android:versionName="1.0.9">
package="com.safemobile.safedispatch">
<!-- require OpenGL ES version 2 for Google Maps -->
<uses-feature
@ -28,7 +25,7 @@
<application
android:configChanges="orientation"
android:icon="@drawable/ic_launcher"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:screenOrientation="landscape"
android:theme="@style/AppTheme">
@ -43,7 +40,7 @@
<service android:name="com.safemobile.services.TCPService" />
<activity
android:name=".SDMobileActivity"
android:name="com.safemobile.safedispatch.SDMobileActivity"
android:configChanges="orientation"
android:exported="true"
android:label="@string/app_name_demo"
@ -55,41 +52,41 @@
</intent-filter>
</activity>
<activity
android:name=".SetupActivity"
android:name="com.safemobile.safedispatch.SetupActivity"
android:configChanges="orientation"
android:screenOrientation="landscape" />
<activity
android:name=".TabLayoutActivity"
android:name="com.safemobile.safedispatch.TabLayoutActivity"
android:configChanges="orientation"
android:screenOrientation="landscape" />
<activity
android:name=".LiveActivity"
android:name="com.safemobile.safedispatch.LiveActivity"
android:exported="false"
android:configChanges="orientation"
android:screenOrientation="landscape"
android:label="@string/title_activity_google_maps" />
<activity
android:name=".HistoryActivity"
android:name="com.safemobile.safedispatch.HistoryActivity"
android:configChanges="orientation"
android:screenOrientation="landscape" />
<activity
android:name=".MessagesActivity"
android:name="com.safemobile.safedispatch.MessagesActivity"
android:configChanges="orientation"
android:screenOrientation="landscape" />
<activity
android:name=".AlarmActivity"
android:name="com.safemobile.safedispatch.AlarmActivity"
android:configChanges="orientation"
android:screenOrientation="landscape" />
<activity
android:name=".RadioActivity"
android:name="com.safemobile.safedispatch.RadioActivity"
android:configChanges="orientation"
android:screenOrientation="landscape" />
<activity
android:name=".RecordingsActivity"
android:name="com.safemobile.safedispatch.RecordingsActivity"
android:configChanges="orientation"
android:screenOrientation="landscape" />
<activity
android:name=".NotificationActivity"
android:name="com.safemobile.safedispatch.NotificationActivity"
android:configChanges="orientation"
android:screenOrientation="landscape" />
</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,35 +0,0 @@
package com.safemobile.dispatch;
import androidx.appcompat.app.AppCompatActivity;
import android.os.Bundle;
import com.safemobile.lib.SM;
public class HistoryActivity extends AppCompatActivity {
public Bundle savedInstanceState;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
this.savedInstanceState = savedInstanceState;
setContentView(R.layout.tabhistory);
}
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,871 +0,0 @@
/*
* Author : ErVaLt / techwavedev.com
* Description : TabLayout Andorid App
*/
package com.safemobile.dispatch;
import android.app.Activity;
import android.app.AlertDialog;
import android.app.Dialog;
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.content.res.Configuration;
import android.graphics.Typeface;
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.Button;
import android.widget.EditText;
import android.widget.GridView;
import android.widget.ImageButton;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.TextView;
import android.widget.Toast;
import com.safemobile.adapters.ConversationGridViewAdapter;
import com.safemobile.adapters.MessagesGridViewAdapter;
import com.safemobile.lib.AppParams;
import com.safemobile.lib.Msg;
import com.safemobile.lib.OperationCodes;
import com.safemobile.lib.SM;
import com.safemobile.lib.SMS;
import com.safemobile.lib.Vehicle;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.Hashtable;
import java.util.Locale;
/**
* fix import
*/
public class MessagesActivity extends Activity {
/** Called when the activity is first created. */
private MessagesGridViewAdapter mAdapter;
private ConversationGridViewAdapter convAdapter;
private ArrayList<Msg> listLastMessages = new ArrayList<Msg>();
private ArrayList<Msg> listSpecificConversation = new ArrayList<Msg>();
private ArrayList<Boolean> dispatcher_positions = new ArrayList<Boolean>();
private GridView gridView;
private Context context;
private Activity activity;
//private IconContextMenu iconContextMenu = null;
private Hashtable<Long, ArrayList<SMS>> tableSMS = new Hashtable<Long, ArrayList<SMS>>();
private Hashtable<String, Long> seqIDSMSHash = new Hashtable<String, Long>();
// Need handler for callbacks to the UI thread
private final Handler myHandler = new Handler();
/* Visual resources */
private LinearLayout layoutSend, layoutHeader, layoutHeaderConversation;
private TextView textViewSelectedContact;
private ImageView imageViewSelectedContact, imageBarcode;
/* Buttons and EditBoxes */
private ImageButton imageButtonAdd, imageButtonBack;
private Button imageButtonSend;
private EditText editTextMsg;
private TabLayoutActivity parentTab;
/* Message args */
private int ACTION, MSGUpdate = 0;
private ArrayList<String> allVehicleNames = new ArrayList<String>();
public ArrayList<Vehicle> allVehicle = new ArrayList<Vehicle>();
private Msg selectedVehicle;
// tip of Messages and flag first load
public boolean LASTMESSAGES = true;
private boolean FIRST = true;
// store selected sc_id and selected unit_type
public long sc_id=0;
public int unit_type=0;
private String seqID; // store sms seqId to set to ACK in adapter
public Bundle savedInstanceState;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
this.savedInstanceState = savedInstanceState;
// get parentTab
parentTab = (TabLayoutActivity)getParent();
context = this;
activity = this;
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.tabtext);
// get LayoutSend and hide
layoutSend = (LinearLayout) findViewById(R.id.layoutSendMsg);
layoutSend.setVisibility(View.GONE);
// get header layout
layoutHeader = (LinearLayout) findViewById(R.id.layoutHeader);
layoutHeaderConversation = (LinearLayout) findViewById(R.id.layoutHeaderConversation);
// show only header layout
layoutHeaderConversation.setVisibility(View.GONE);
// get SelectedContact TextView and ImageView
textViewSelectedContact = (TextView) findViewById(R.id.textViewSelectedContact);
imageViewSelectedContact = (ImageView) findViewById(R.id.imageViewSelectedContact);
imageBarcode = (ImageView) findViewById(R.id.imageBarcode);
imageBarcode.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
try
{
Intent intent = new Intent("com.google.zxing.client.android.SCAN");
// intent.putExtra("SCAN_MODE", "ONE_D_MODE");
startActivityForResult(intent, 0);
}
catch (Exception e)
{
showErrorDialog(getResources().getString(R.string.barcodeError));
//Log.d("Error",e.toString());
}
}
});
// change tab header fontface
TextView textView1 = (TextView) findViewById(R.id.textView1);
textView1.setTypeface(Typeface.createFromAsset(getAssets(), "Sketch_Block.ttf"));
textView1.setTextSize(24);
// prepared arraylist and passed it to the Adapter class
//mAdapter = new GridviewAdapter(this,listFrom, listMessages, listReceived);
mAdapter = new MessagesGridViewAdapter(this, listLastMessages, context);
convAdapter = new ConversationGridViewAdapter(this, listSpecificConversation, context, sc_id, unit_type, dispatcher_positions, new ArrayList<Boolean>());
// Set custom adapter to gridview
gridView = (GridView) findViewById(R.id.gridView1);
gridView.setAdapter(mAdapter);
// Implement On Item click listener
gridView.setOnItemClickListener(new OnItemClickListener()
{
@Override
public void onItemClick(AdapterView<?> arg0, View arg1, int position,
long arg3) {
//if (layoutHeader.getVisibility() == View.VISIBLE)
if(LASTMESSAGES)
{
// get position
Msg item = mAdapter.getItem(position);
// get Specific Conversation
sc_id = item.from.sc_id;
SM.Debug("Selected sc_id: " + sc_id);
// set Conversation type
LASTMESSAGES = false;
// call get SMS
GetSMS4unit(sc_id);
// create crt_Vehicle
unit_type = (int)item.from.driver_id;
// save selected vehicle
selectedVehicle = item;
}
if(AppParams.DEMO)
{
// modify UI
ACTION = MSGUpdate;
updateResultsInUi();
}
}
});
// button create message
imageButtonAdd = (ImageButton) findViewById(R.id.imageButtonAdd);
imageButtonAdd.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
showDialog();
}
});
// button send message
imageButtonSend = (Button) findViewById(R.id.imageButtonSend);
imageButtonSend.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
//SM.Debug("SC ID:" + sc_id);
SendSMS(sc_id, editTextMsg.getText().toString());
Toast.makeText(context, "Sending message...", 500).show();
/*
// show busy indicator
dialogHandler.handleMessage(new Message());
ACTION = SHOWLoading;
myHandler.post(UpdateResults);
*/
// disable send button and editBox
editTextMsg.setEnabled(false);
imageButtonSend.setEnabled(false);
new Thread(new Runnable() {
public void run() {
try {
Thread.sleep(500);
myHandler.post(enableButtonRUN);
//LASTMESSAGES = false;
if(AppParams.DEMO)
{
Thread.sleep(5500);
myHandler.post(demoReceveidSMSRUN);
}
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}).start();
}
});
// button back to conversations
imageButtonBack = (ImageButton) findViewById(R.id.imageButtonBack);
imageButtonBack.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
// set LastMessage conversation type
LASTMESSAGES = true;
// refresh Grid
GetLastSMS();
if(AppParams.DEMO)
updateResultsInUi();
}
});
// get Message editText
editTextMsg = (EditText) findViewById(R.id.editTextMsg);
gridView.setId(1); // id needed for IconContextMenu
registerForContextMenu(gridView);
parentTab.messageActivity = this;
}
// Create runnable for posting
final Runnable demoReceveidSMSRUN = new Runnable() {
public void run() {
parentTab.setImei(sc_id + "");
parentTab.updateResultsInUi("realpha");
int timeGMT = (int) (System.currentTimeMillis() / 1000L);
String SendSMSSeqID = "1."+timeGMT;
// add mess to not ack list
seqIDSMSHash.put(SendSMSSeqID, sc_id);
// get sc_id conversation and add message
ArrayList<SMS> crtSMSlist = tableSMS.get(sc_id);
SMS sms = new SMS(0, 0, timeGMT, "i got your sms", 0, sc_id);
sms.seq_idx = SendSMSSeqID;
crtSMSlist.add(sms);
// add message to listLast
boolean exists = false;
for (Msg msg : listLastMessages)
// if conversation exists in lastMessages
if(msg.from.sc_id == sc_id)
{
exists = true;
msg.message = "i got your sms";
msg.received = Calendar.getInstance().getTime();
}
// if last messages doesn't contain this conversation
if(!exists)
{
Vehicle sentVehicle = null;
for(Vehicle veh : allVehicle)
if(veh.sc_id == sc_id)
sentVehicle = veh;
listLastMessages.add(new Msg(sentVehicle, "i got your sms", Calendar.getInstance().getTime(), SendSMSSeqID));
}
SM.Debug("time: " + timeGMT + " | " + Calendar.getInstance().getTime().toString() );
updateResultsInUi();
}
};
@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(parentTab.getTCPState() != null){
if(FIRST)
{
UpdateVehs(parentTab.getAllVehicle());
FIRST = false;
if(LASTMESSAGES)
parentTab.executeNetworkStuff(new String[] {OperationCodes.GetLastSMS + "", AppParams.USERID + ""});
}
//GetLastSMS();
}
SM.Debug("onResume");
}
public void onActivityResult(int requestCode, int resultCode, Intent intent) {
if (requestCode == 0) {
if (resultCode == RESULT_OK) {
String contents = intent.getStringExtra("SCAN_RESULT");
String format = intent.getStringExtra("SCAN_RESULT_FORMAT");
editTextMsg.setText(editTextMsg.getText().toString() + contents);
// Handle successful scan
Toast.makeText(this, getResources().getString(R.string.barcodeContent) + ":"+contents+" with format:"+format, 6000).show();
} else if (resultCode == RESULT_CANCELED) {
// Handle cancel
//Toast.makeText(this, "TRY AGAIN", 6000).show();
}
}
}
// Request SMS 4 Unit from AppServer
private void GetSMS4UnitWithTime(long sc_id, long time) {
if(!AppParams.DEMO) {
parentTab.executeNetworkStuff(new String[] {OperationCodes.GetRecentSMSs + "", sc_id + "", time + ""});
SM.Debug(" #### GetSMS4uni:" + sc_id);
}
}
private void GetSMS4unit(long sc_id)
{
if(!AppParams.DEMO)
{
SM.Debug("GetSMS4unit : " + sc_id);
ArrayList<SMS> listSMS = tableSMS.get(sc_id);
long timeGMT = 0;
if(!listSMS.isEmpty())
timeGMT = listSMS.get(listSMS.size()-1).timeGMT;
// error in DB
if(String.valueOf(timeGMT).contains("."))
{
try {
// remove the dot and the parse it to String
timeGMT = Long.parseLong(String.valueOf(timeGMT).split(".")[1]);
}
catch (Exception e) {
timeGMT = Long.parseLong(String.valueOf(timeGMT).replace(".",""));
}
}
parentTab.executeNetworkStuff(new String[] {OperationCodes.GetRecentSMSs + "", sc_id + "", timeGMT + ""});
//parent.getRecentSMSs(sc_id, timeGMT);
SM.Debug(" #### GetSMS4uni:" + sc_id);
}
}
// Request Last SMS from AppServer
public void GetLastSMS()
{
if(!AppParams.DEMO)
{
if(LASTMESSAGES)
parentTab.executeNetworkStuff(new String[] {OperationCodes.GetLastSMS + "", AppParams.USERID + ""});
//parent.getLastSMSs(AppParams.USERID);
else
{
ArrayList<SMS> listSMS = tableSMS.get(sc_id);
long timeGMT = 0;
if(listSMS!= null && !listSMS.isEmpty())
timeGMT = listSMS.get(listSMS.size()-1).timeGMT;
//parent.getRecentSMSs(sc_id, timeGMT);
parentTab.executeNetworkStuff(new String[] {OperationCodes.GetRecentSMSs + "", sc_id + "", timeGMT + ""});
}
}
else
updateResultsInUi();
}
private void SendSMS(long sc_id, String txt)
{
if(!AppParams.DEMO)
{
int timeGMT = (int) (System.currentTimeMillis() / 1000L);
String SendSMSSeqID = "1."+timeGMT;
// add mess to not ack list
seqIDSMSHash.put(SendSMSSeqID, sc_id);
// get sc_id conversation and add message
SMS sms = new SMS(0, 0, timeGMT, txt, sc_id, 0);
sms.seq_idx = SendSMSSeqID;
tableSMS.get(sc_id).add(sms);
//parent.sendSMS(SendSMSSeqID,sc_id, txt);
parentTab.executeNetworkStuff(new String[] {OperationCodes.SEND_TM + "", SendSMSSeqID, sc_id + "", txt});
updateResultsInUi();
}
else
{
int timeGMT = (int) (System.currentTimeMillis() / 1000L);
String SendSMSSeqID = "1."+timeGMT;
// add mess to not ack list
seqIDSMSHash.put(SendSMSSeqID, sc_id);
// get sc_id conversation and add message
ArrayList<SMS> crtSMSlist = tableSMS.get(sc_id);
SMS sms = new SMS(0, 0, timeGMT, txt, sc_id, 0);
sms.seq_idx = SendSMSSeqID;
crtSMSlist.add(sms);
// add message to listLast
boolean exists = false;
for (Msg msg : listLastMessages)
// if conversation exists in lastMessages
if(msg.from.sc_id == sc_id)
{
exists = true;
msg.message = txt;
msg.received = Calendar.getInstance().getTime();
}
// if last messages doesn't contain this conversation
if(!exists)
{
Vehicle sentVehicle = null;
for(Vehicle veh : allVehicle)
if(veh.sc_id == sc_id)
sentVehicle = veh;
listLastMessages.add(new Msg(sentVehicle, txt, Calendar.getInstance().getTime(), SendSMSSeqID));
}
SM.Debug("time: " + timeGMT + " | " + Calendar.getInstance().getTime().toString() );
LASTMESSAGES = false;
updateResultsInUi();
}
}
// Update Vehicles received from AppServer
public void UpdateVehs(ArrayList<Vehicle> list)
{
SM.Debug("## UpdateVehs: " + list.size());
allVehicle = list;
allVehicleNames = new ArrayList<String>();
for(Vehicle v: allVehicle)
allVehicleNames.add(v.name);
if(tableSMS.size() == 0)
{
for(Vehicle veh: allVehicle)
{
ArrayList<SMS> lista = new ArrayList<SMS>();
// populate conversation list if demo
if(AppParams.DEMO)
lista = getDemoConversation(veh.sc_id);
tableSMS.put(veh.sc_id, lista);
}
}
}
// gets DEMO conversations
private ArrayList<SMS> getDemoConversation(long sc_id)
{
ArrayList<SMS> lista = new ArrayList<SMS>();
if(sc_id == 101)
lista.add(new SMS(1, 2, 1324016412, "Only one left", 101, 0));
else if (sc_id == 102)
lista.add(new SMS(1, 2, 1328060100, "i'm at the train station", 0, 102));
else if (sc_id == 103) {
lista.add(new SMS(1, 2, 1121016637, "Where are you now?", 103, 0));
lista.add(new SMS(2, 2, 1121016693, "Near Elementary School 81", 0, 103));
lista.add(new SMS(3, 2, 1121016693, "We have a client on Belmont Ave", 103, 0));
lista.add(new SMS(4, 2, 1121016724, "It's only 4 blocks away", 103, 0));
lista.add(new SMS(5, 2, 1121016693, "Can you take him?", 103, 0));
lista.add(new SMS(6, 2, 1121016818, "I'll be right there", 0, 103));
}
else if (sc_id == 105)
lista.add(new SMS(1, 2, 1328061660, "Thanks", 0, 105));
return lista;
}
public void UpdateSMS(ArrayList<SMS> list)
{
SM.Debug("## UpdateSMS: " + list.size() + " [LASTMESSAGES:" + LASTMESSAGES + "]");
// populate listLastMessages
if(LASTMESSAGES)
{
listLastMessages = new ArrayList<Msg>();
for(SMS sms: list)
{
// get for sender
long id_sender = sms.sc_id_dest;
if (id_sender == 0)
id_sender = sms.sc_id_sour;
//SM.Debug(sms.toString());
// get vehicle with sender id
Vehicle messageVeh= null;
messageVeh = getVehicleById(id_sender);
listLastMessages.add(0,new Msg(messageVeh, sms.mess, new Date((long)sms.timeGMT * 1000), sms.seq_idx));
}
// update GridView
//SM.Debug(" ########### " + parentTab.allVehicle.size() + " ||| " + listLastMessages.size());
mAdapter = new MessagesGridViewAdapter(activity, listLastMessages, context);
//SM.Debug("list count : " + listLastMessages.size());
//gridView.setAdapter(mAdapter);
//mAdapter.notifyDataSetChanged();
}
else
{
// add new values to hashTable for key = sc_id
ArrayList<SMS> listScId = tableSMS.get(sc_id);
if(list.size() != 0)
for(SMS sms:list)
{
// compare last item in hashList with first elem in arrived list
// protect is listSc_Id size = 0
if ((listScId.size()>0)&&(sms.sc_id_dest == listScId.get(listScId.size()-1).sc_id_dest && sms.sc_id_sour == listScId.get(listScId.size()-1).sc_id_sour && sms.mess == listScId.get(listScId.size()-1).mess))
// drop element
;
else
listScId.add(sms);
}
}
// modify UI
ACTION = MSGUpdate;
myHandler.post(new Runnable() {
@Override
public void run() {
updateResultsInUi();
}
});
}
// Confirmation for sending message
public void ConfirmSMS(String data, final String seqID)
{
SM.Debug("ConfirmSMS");
if(data.equals("0"))
{
SM.Debug("Error on sending SMS");
showErrorDialog("Error on sending message.");
}
else
{
SM.Debug("ACK received for text message");
//get sc_id for crt message
long sc_id = seqIDSMSHash.get(seqID);
// get SMS list for crt sc_id
ArrayList<SMS> crtSMSList = tableSMS.get(sc_id);
for(SMS sms: crtSMSList)
{
if(sms.seq_idx.equals(seqID))
{
SM.Debug("######### AM SCHIMBAT STATUSUL pt: " + sms.mess + " | " + sc_id + " | " + seqID + " || " + sms.seq_idx);
// set ACK
sms.status = 2;
}
}
// remove message from seqIDSMS Hash = don't wait confirmation for it
seqIDSMSHash.remove(seqID);
// refresh MSG List
//GetSMS4unit(sc_id);
/*
// TODO -> this is a small bug fix, should talk with Bigu to change it
// remove message from list because it will be brought back by GetSMS4Unit, and it will have different time
ArrayList<SMS> listWithTextMessage = tableSMS.get(sc_id);
if(listWithTextMessage.size() > 0)
listWithTextMessage.remove(listWithTextMessage.size() - 1); // remove last message
*/
// store sms seqId to set to ACK in adapter
this.seqID = seqID;
myHandler.post(new Runnable() {
@Override
public void run() {
convAdapter.setACK(seqID);
convAdapter.changeView(seqID);
convAdapter.notifyDataSetChanged();
}
});
myHandler.post(new Runnable() {
@Override
public void run() {
// clear text
editTextMsg.setText("");
}
});
}
}
public void NewSMS(String imei, String message, final long time)
{
SM.Debug(" ## NewSMS: " + imei + " | " + message);
if(!LASTMESSAGES)
{
// if received message from current conversation
if(getVehicleByImei(imei).sc_id == sc_id)
GetSMS4UnitWithTime(sc_id, time); // refresh MSG List
//else
// parentTab.myHandler.post(parentTab.showPopUpRUN); // show PopUp
}
else
GetLastSMS(); // get last SMS
}
// Create runnable for posting
final Runnable enableButtonRUN = new Runnable() {
public void run() {
updateEnableButtonsUI();
}
};
// enable buttons in UI after 200ms from send
private void updateEnableButtonsUI()
{
// enable buttons
imageButtonSend.setEnabled(true);
editTextMsg.setEnabled(true);
editTextMsg.setText("");
}
private void updateResultsInUi()
{
if(allVehicle == null)
UpdateVehs(parentTab.getAllVehicle());
//SM.Debug("updateResultsInUi: " + ACTION);
if(ACTION == MSGUpdate)
{
if(LASTMESSAGES)
{
// show Header Layout
layoutHeader.setVisibility(View.VISIBLE);
// hide Conversation Header Layout
layoutHeaderConversation.setVisibility(View.GONE);
// hide Send Layout
layoutSend.setVisibility(View.GONE);
// change GridView adapter
gridView.setAdapter(mAdapter);
gridView.invalidate();
}
else
{
SM.Debug(" #### Modify adapter for SMS4unit");
// populate specific conversation
listSpecificConversation = new ArrayList<Msg>();
dispatcher_positions = new ArrayList<Boolean>();
ArrayList<Boolean> ackPosition = new ArrayList<Boolean>();
ArrayList<SMS> list;
list = tableSMS.get(sc_id);
for(SMS sms: list)
{
// get for sender
long id_sender = sms.sc_id_dest;
if (id_sender == 0)
id_sender = sms.sc_id_sour;
// get vehicle with sender id
Vehicle messageVeh= null;
messageVeh = getVehicleById(id_sender);
// flag dispatcher message when source is 0
dispatcher_positions.add(sms.sc_id_sour==0 ? true : false);
if(sms.status == 2)
ackPosition.add(true);
else
ackPosition.add(false);
listSpecificConversation.add(new Msg(messageVeh, sms.mess, new Date((long)sms.timeGMT * 1000), sms.seq_idx));
}
convAdapter = new ConversationGridViewAdapter(activity, listSpecificConversation, context, sc_id, unit_type, dispatcher_positions, ackPosition);
gridView.setAdapter(convAdapter);
if(listSpecificConversation.size() > 0)
gridView.setSelection(listSpecificConversation.size()-1);
// set unit name and image in Header Conversation
textViewSelectedContact.setText(getVehicleBySc_Id(sc_id).name);
imageViewSelectedContact.setImageResource(getVehicleBySc_Id(sc_id).getLargeIcon());
// clear editText
editTextMsg.setText("");
// change layouts visibility
layoutSend.setVisibility(View.VISIBLE);
layoutHeader.setVisibility(View.GONE);
layoutHeaderConversation.setVisibility(View.VISIBLE);
}
gridView.invalidate();
// hide dialog
try
{
//dialogLoading.cancel();
}
catch(Exception ex)
{
;
}
}
}
// show new message after layoutNewMessage Click
public void showSMS4unit(int sc_id)
{
// show dialog
//dialogLoading = ProgressDialog.show(activity, "", "Loading messages. Please wait...", true);
ACTION = MSGUpdate;
LASTMESSAGES = false;
GetSMS4unit(sc_id);
}
// gets Vehicle from id
public Vehicle getVehicleById(long id_vehicle)
{
for(Vehicle vehicle: allVehicle)
if(vehicle.sc_id == id_vehicle)
return vehicle;
return null;
}
// get Vehicle from imei
public Vehicle getVehicleByImei(String imei)
{
for(Vehicle vehicle: allVehicle)
if(vehicle.imei.equalsIgnoreCase(imei))
return vehicle;
return null;
}
public Vehicle getVehicleBySc_Id(long sc_id)
{
for(Vehicle vehicle: allVehicle)
if(vehicle.sc_id == sc_id)
return vehicle;
return null;
}
// show a dialog
public void showDialog()
{
ArrayAdapter<String> adapter = new ArrayAdapter<String>(this, R.layout.template_simple_list_item, allVehicleNames);
AlertDialog.Builder builder = new AlertDialog.Builder(context);
builder.setTitle(getString(R.string.selectVehicle));
builder.setAdapter(adapter , new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
// get position
Vehicle item = allVehicle.get(which);
// get Specific Conversation
sc_id = item.sc_id;
SM.Debug("Selected sc_id: " + sc_id);
// set Conversation type
LASTMESSAGES = false;
// call get SMS
GetSMS4unit(sc_id);
// create crt_Vehicle
unit_type = (int) item.driver_id;
SM.Debug("AM SELECTAT: " + sc_id + " | " + item.name + " | " + unit_type + "\n\t " + item.toString());
selectedVehicle = new Msg(item, "", Calendar.getInstance().getTime(), "");
if(AppParams.DEMO)
updateResultsInUi();
}
});
AlertDialog alert = builder.create();
alert.show();
}
public void showErrorDialog(String errorMsg)
{
Dialog dialog = new Dialog(context);
dialog.setTitle(getString(R.string.sendingError));
dialog.setContentView(R.layout.dialog);
dialog.setCancelable(true);
dialog.setCanceledOnTouchOutside(true);
TextView text = (TextView) dialog.findViewById(R.id.text);
ImageView image = (ImageView) dialog.findViewById(R.id.image);
image.setImageResource(R.drawable.error);
text.setText(errorMsg);
dialog.show();
}
}

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().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), (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

@ -0,0 +1,128 @@
package com.safemobile.safedispatch;
import android.content.Context;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.widget.ImageView;
import android.widget.RelativeLayout;
import android.widget.TextView;
import androidx.annotation.NonNull;
import com.google.android.gms.maps.GoogleMap;
import com.google.android.gms.maps.model.Marker;
import com.safemobile.lib.HistPos;
import com.safemobile.lib.SuperVehicle;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.Hashtable;
import java.util.Locale;
public class GoogleMapsInfoBubble implements GoogleMap.InfoWindowAdapter {
private final String TAG = GoogleMapsInfoBubble.class.getName();
private final View mWindow;
private Hashtable<Long, SuperVehicle> superVehHash;
private final Context context;
private ArrayList<HistPos> histPosList;
private boolean isLiveTab = true;
public GoogleMapsInfoBubble(LayoutInflater layoutInflater, Context context, Hashtable<Long, SuperVehicle> vehicles) {
this.context = context;
this.superVehHash = vehicles;
mWindow = layoutInflater.inflate(R.layout.map_marker_info_bubble, null);
}
public GoogleMapsInfoBubble(LayoutInflater layoutInflater, Context context) {
isLiveTab = false;
this.context = context;
// this.superVehHash = vehicles;
mWindow = layoutInflater.inflate(R.layout.map_marker_info_bubble, null);
}
public void setHistoryPositions(ArrayList<HistPos> positions) {
this.histPosList = positions;
}
@Override
public View getInfoWindow(@NonNull Marker marker) {
render(marker, mWindow);
return mWindow;
}
@Override
public View getInfoContents(@NonNull Marker marker) {
render(marker, mWindow);
return mWindow;
}
private void render(Marker marker, View view) {
long key = 0;
int position = 0;
if (isLiveTab) {
try {
key = Long.parseLong(marker.getTitle());
} catch (Exception ex) {
Log.v(TAG, "Unable to parse Google Maps Info Bubble title");
}
} else {
try {
position = Integer.getInteger(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);
TextView tvUnitName = view.findViewById(R.id.tvUnitName);
TextView tvGPSLocation = view.findViewById(R.id.tvGPSLocation);
TextView tvTimeAgo = view.findViewById(R.id.tvTimeAgo);
TextView tvSpeed = view.findViewById(R.id.tvSpeed);
TextView tvStreetView = view.findViewById(R.id.tvStreetView);
ImageView streetView = view.findViewById(R.id.streetView);
rlMapInfoBubbleInfo.setVisibility(View.VISIBLE);
boolean isMilitaryTime = false;
Date positionTime;
String speed, address, gpsLocation, name = "";
if (isLiveTab) {
SuperVehicle vehicle = superVehHash.get(key);
positionTime = new Date(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(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
? "HH:mm:ss dd.MMM.yyyy"
: "hh:mm:ss a dd.MMM.yyy";
DateFormat format = new SimpleDateFormat(timeFormat, Locale.ENGLISH);
tvTimeAgo.setText(format.format(positionTime));
tvStreetView.setText(address);
streetView.setVisibility(address.length() > 0 ? View.VISIBLE : View.GONE);
tvStreetView.setVisibility(address.length() > 0 ? View.VISIBLE : View.GONE);
if (!isLiveTab)
tvUnitName.setVisibility(View.GONE);
else
tvUnitName.setText(name);
tvSpeed.setText(speed);
tvGPSLocation.setText(gpsLocation);
}
}

View File

@ -0,0 +1,241 @@
package com.safemobile.safedispatch;
import androidx.annotation.NonNull;
import androidx.appcompat.app.AppCompatActivity;
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.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.ImageView;
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");
@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);
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.dropAllData =false;
parentTab.firstHistData = true;
parentTab.HistMsgList.clear();
parentTab.HistPosList.clear();
// 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.demoPositions);
}
});
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));
}
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.HistPosList.toString());
SM.Debug("Do the Display");
infoBubble.setHistoryPositions(parentTab.HistPosList);
displayHistory(parentTab.HistPosList);
}
};
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);
parentTab.demoPositionsList();
displayButton.performClick();
}
}

View File

@ -14,7 +14,7 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.safemobile.dispatch;
package com.safemobile.safedispatch;
import java.util.ArrayList;
@ -42,9 +42,8 @@ public class IconContextMenu implements DialogInterface.OnCancelListener,
private static final int LIST_PREFERED_HEIGHT = 65;
private IconMenuAdapter menuAdapter = null;
private Activity parentActivity = null;
private int dialogId = 0;
private IconMenuAdapter menuAdapter;
private Activity parentActivity;
private IconContextMenuOnClickListener clickHandler = null;
@ -55,7 +54,6 @@ public class IconContextMenu implements DialogInterface.OnCancelListener,
*/
public IconContextMenu(Activity parent, int id) {
this.parentActivity = parent;
this.dialogId = id;
menuAdapter = new IconMenuAdapter(parentActivity);
}
@ -89,19 +87,13 @@ public class IconContextMenu implements DialogInterface.OnCancelListener,
public Dialog createMenu(String menuItitle) {
final AlertDialog.Builder builder = new AlertDialog.Builder(parentActivity);
builder.setTitle(menuItitle);
builder.setAdapter(menuAdapter, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialoginterface, int i) {
builder.setAdapter(menuAdapter, (dialoginterface, i) -> {
IconContextMenuItem item = (IconContextMenuItem) menuAdapter.getItem(i);
if (clickHandler != null) {
if (clickHandler != null)
clickHandler.onClick(item.actionTag);
}
}
});
builder.setInverseBackgroundForced(true);
AlertDialog dialog = builder.create();
dialog.setOnCancelListener(this);
dialog.setOnDismissListener(this);
@ -117,7 +109,7 @@ public class IconContextMenu implements DialogInterface.OnCancelListener,
}
private void cleanup() {
parentActivity.dismissDialog(dialogId);
// parentActivity.dismissDialog(dialogId);
}
/**
@ -131,7 +123,7 @@ public class IconContextMenu implements DialogInterface.OnCancelListener,
* Menu-like list adapter with icon
*/
protected class IconMenuAdapter extends BaseAdapter {
private Context context = null;
private Context context;
private ArrayList<IconContextMenuItem> mItems = new ArrayList<IconContextMenuItem>();
@ -193,6 +185,7 @@ public class IconContextMenu implements DialogInterface.OnCancelListener,
textView.setTag(item);
textView.setText(item.text);
textView.setCompoundDrawablesWithIntrinsicBounds(item.image, null, null, null);
textView.setTextColor(R.color.black);
return textView;
}

View File

@ -1,4 +1,4 @@
package com.safemobile.dispatch;
package com.safemobile.safedispatch;
import android.app.Activity;
import android.app.AlertDialog;
@ -9,13 +9,19 @@ import android.content.Intent;
import android.content.IntentFilter;
import android.content.res.Configuration;
import android.content.res.Resources;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Matrix;
import android.graphics.Paint;
import android.graphics.Rect;
import android.graphics.Typeface;
import android.os.Bundle;
import android.os.Handler;
import android.os.Looper;
import android.view.View;
import android.view.Window;
import android.widget.AdapterView;
import android.widget.Button;
import android.widget.GridView;
import android.widget.ImageButton;
@ -26,11 +32,13 @@ import android.widget.Toast;
import androidx.annotation.NonNull;
import com.google.android.gms.maps.CameraUpdateFactory;
import com.google.android.gms.maps.GoogleMap;
import com.google.android.gms.maps.OnMapReadyCallback;
import com.google.android.gms.maps.SupportMapFragment;
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.Marker;
import com.google.android.gms.maps.model.MarkerOptions;
import com.safemobile.activities.AbstractLiveActivity;
import com.safemobile.activities.AbstractSDParentActivity;
@ -94,6 +102,7 @@ public class LiveActivity extends AbstractLiveActivity implements OnMapReadyCall
//value poll
private double latPoll = 0;
private double lngPoll = 0;
private ArrayList<Marker> markers = new ArrayList<>();
@Override
@ -130,12 +139,11 @@ public class LiveActivity extends AbstractLiveActivity implements OnMapReadyCall
mapFragment.getMapAsync(this);
}
// create on vehicle long click menu
createIconContextMenu();
// image View for changing map type satellite or map
ImageView changeMapTypeImageView = (ImageView) findViewById(R.id.changeMapType);
ImageView changeMapTypeImageView = findViewById(R.id.changeMapType);
changeMapTypeImageView.setOnClickListener(v -> {
if (googleMap.getMapType() == GoogleMap.MAP_TYPE_SATELLITE) {
changeMapTypeImageView.setImageResource(R.drawable.satellite);
@ -146,7 +154,7 @@ public class LiveActivity extends AbstractLiveActivity implements OnMapReadyCall
}
});
ImageView changeTrafficImageView = (ImageView) findViewById(R.id.changeTraffic);
ImageView changeTrafficImageView = findViewById(R.id.changeTraffic);
changeTrafficImageView.setOnClickListener(v -> {
if (googleMap.isTrafficEnabled()) {
changeTrafficImageView.setImageResource(R.drawable.traffic_off);
@ -158,12 +166,12 @@ public class LiveActivity extends AbstractLiveActivity implements OnMapReadyCall
});
// change tab header font
TextView textView1 = (TextView) findViewById(R.id.textView1);
TextView textView1 = findViewById(R.id.textView1);
textView1.setTypeface(Typeface.createFromAsset(getAssets(), "Sketch_Block.ttf"));
textView1.setTextSize(24);
// get grid view and set empty data adapter
gridVehicle = (GridView) findViewById(R.id.gridVehicle);
gridVehicle = findViewById(R.id.gridVehicle);
if (AppParams.DEMO) {
disabledVehicles = new ArrayList<>();
@ -185,14 +193,16 @@ public class LiveActivity extends AbstractLiveActivity implements OnMapReadyCall
threadUI.start();
});
// get vehicle menu creation
gridVehicle.setOnItemLongClickListener(itemLongClickHandler);
gridVehicle.setOnItemLongClickListener((adapterView, view, i, l) -> {
contextMenuPosition = position;
iconContextMenu.createMenu(getString(R.string.options)).show();
return true;
});
LinearLayout slideLayout = (LinearLayout) findViewById(R.id.slidelayout);
ImageView slideLayoutImageView = (ImageView) findViewById(R.id.slideLayoutImage);
LinearLayout linearLayoutVehicles = (LinearLayout) findViewById(R.id.layoutBig);
LinearLayout slideLayout = findViewById(R.id.slidelayout);
ImageView slideLayoutImageView = findViewById(R.id.slideLayoutImage);
LinearLayout linearLayoutVehicles = findViewById(R.id.layoutBig);
slideLayout.setOnClickListener(v -> {
if (showVehicle) {
linearLayoutVehicles.setVisibility(View.GONE);
@ -205,7 +215,7 @@ public class LiveActivity extends AbstractLiveActivity implements OnMapReadyCall
}
});
imageViewCheckAll = (ImageButton) findViewById(R.id.imageCheckAll);
imageViewCheckAll = findViewById(R.id.imageCheckAll);
imageViewCheckAll.setSelected(false);
imageViewCheckAll.setOnClickListener(arg0 -> {
for (int i = 0; i < displayedVehicles.size(); i++)
@ -223,7 +233,7 @@ public class LiveActivity extends AbstractLiveActivity implements OnMapReadyCall
Enumeration<Long> keyList = getParentTab().getSuperVehHash().keys();
while (keyList.hasMoreElements()) {
(Objects.requireNonNull(getParentTab().getSuperVehHash().get((long) keyList.nextElement()))).needUpdate = true;
(Objects.requireNonNull(getParentTab().getSuperVehHash().get(keyList.nextElement()))).needUpdate = true;
}
// change button title
@ -247,7 +257,7 @@ public class LiveActivity extends AbstractLiveActivity implements OnMapReadyCall
displayVehicle(true, LAT_OUTLIMIT, LNG_OUTLIMIT);
});
displayButton = (Button) findViewById(R.id.buttonDisplay);
displayButton = findViewById(R.id.buttonDisplay);
displayButton.setText(getString(R.string.displayAll));
@ -259,7 +269,7 @@ public class LiveActivity extends AbstractLiveActivity implements OnMapReadyCall
Enumeration<Long> keyList = getParentTab().getSuperVehHash().keys();
while (keyList.hasMoreElements())
(Objects.requireNonNull(getParentTab().getSuperVehHash().get((long) keyList.nextElement()))).needUpdate = true;
(Objects.requireNonNull(getParentTab().getSuperVehHash().get(keyList.nextElement()))).needUpdate = true;
// change button title
if (displayButton.getText().toString().equals(getString(R.string.displayAll))) {
@ -297,11 +307,8 @@ public class LiveActivity extends AbstractLiveActivity implements OnMapReadyCall
@Override
public void onMapReady(@NonNull GoogleMap googleMap) {
this.googleMap = googleMap;
// Add a marker in Sydney and move the camera
LatLng sydney = new LatLng(-34, 151);
this.googleMap.addMarker(new MarkerOptions().position(sydney).title("Marker in Sydney"));
this.googleMap.moveCamera(CameraUpdateFactory.newLatLng(sydney));
GoogleMapsInfoBubble infoBubble = new GoogleMapsInfoBubble(getLayoutInflater(), this, getParentTab().getSuperVehHash());
this.googleMap.setInfoWindowAdapter(infoBubble);
}
@ -433,36 +440,101 @@ public class LiveActivity extends AbstractLiveActivity implements OnMapReadyCall
});
}
/**
* create context menu
*/
@Override
public Dialog onCreateDialog(int id) {
if (id == 1) {
return iconContextMenu.createMenu(getString(R.string.options));
}
return super.onCreateDialog(id);
}
/* list item long click handler
* used to show the context menu
*/
private final AdapterView.OnItemLongClickListener itemLongClickHandler = ((parent, view, position, id) -> {
// save position
contextMenuPosition = position;
showDialog(1);
return true;
});
public void displayVehicle(boolean withZoom, double latZoom, double lngZoom) {
//TODO: add makers for vehicles
if (googleMap != null) {
String openWindow = "";
for (Marker marker : markers) {
if (marker.isInfoWindowShown()) {
openWindow = marker.getTitle();
}
}
googleMap.clear();
for (int i = 0; i < displayedVehicles.size(); i++) {
if (displayedVehicles.get(i)) {
SuperVehicle tmpSuper = getParentTab().getSuperVehHash().get(Long.valueOf(liveVehicle.get(i).imei));
if (tmpSuper != null) {
LatLng newLocation = new LatLng(tmpSuper.lat, tmpSuper.lng);
MarkerOptions markerOptions = new MarkerOptions().position(newLocation).title(liveVehicle.get(i).imei);
BitmapDescriptor markerIcon = getProperBitmap(tmpSuper.getLargeIcon(), tmpSuper.name);
markerOptions.icon(markerIcon);
Marker marker = this.googleMap.addMarker(markerOptions);
if (openWindow.equals(marker.getTitle()))
marker.showInfoWindow();
markers.add(marker);
}
}
}
}
}
public void showOpenedBalloon(boolean demo) {
//TODO: add show balloon
}
private BitmapDescriptor getProperBitmap(int largeIcon, String text) {
Bitmap bitmap = BitmapFactory.decodeResource(getResources(), largeIcon);
Bitmap textBitmap = getTextAsDrawable(this, text);
Bitmap b3 = overlay(bitmap, textBitmap);
return BitmapDescriptorFactory.fromBitmap(b3);
}
public static Bitmap overlay(Bitmap bmp1, Bitmap bmp2) {
int maxWidth = Math.max(bmp1.getWidth(), bmp2.getWidth());
Bitmap bmOverlay = Bitmap.createBitmap(maxWidth, bmp1.getHeight() + bmp2.getHeight(), bmp1.getConfig());
Canvas canvas = new Canvas(bmOverlay);
canvas.drawBitmap(bmp1, new Matrix(), null);
canvas.drawBitmap(bmp2, 0, bmp1.getHeight(), null);
bmp1.recycle();
bmp2.recycle();
return bmOverlay;
}
public Bitmap getTextAsDrawable(Context context, String text) {
Typeface tf = Typeface.create("Helvetica", Typeface.BOLD);
Paint paint = new Paint(Paint.ANTI_ALIAS_FLAG);
paint.setColor(Color.WHITE);
paint.setTypeface(tf);
paint.setTextSize(convertToPixels(context, 16));
Rect textRect = new Rect();
paint.getTextBounds(text, 0, text.length(), textRect);
Bitmap bitmap = Bitmap.createBitmap(textRect.width(), textRect.height() + 5,
Bitmap.Config.ARGB_8888);
Canvas canvas = new Canvas(bitmap);
paint.setColor(getResources().getColor(R.color.cardview_dark_background));
canvas.drawRect(0, 0, bitmap.getWidth(), bitmap.getHeight(), paint);
float scale = context.getResources().getDisplayMetrics().density;
// text color - #3D3D3D
paint.setColor(Color.rgb(255, 255, 255));
// text size in pixels
// draw text to the Canvas center
Rect bounds = new Rect();
paint.getTextBounds(text, 0, text.length(), bounds);
int x = (bitmap.getWidth() - bounds.width()) / 2;
int y = (bitmap.getHeight() + bounds.height()) / 2;
canvas.drawText(text, x, y, paint);
return bitmap;
}
public int convertToPixels(Context context, int nDP) {
final float conversionScale = context.getResources().getDisplayMetrics().density;
return (int) ((nDP * conversionScale) + 0.5f);
}
public void showLoadingDialog(String message) {
loadingDialog = new Dialog(context);
loadingDialog.requestWindowFeature(Window.FEATURE_NO_TITLE);
@ -470,9 +542,9 @@ public class LiveActivity extends AbstractLiveActivity implements OnMapReadyCall
loadingDialog.setCancelable(true);
loadingDialog.setCanceledOnTouchOutside(false);
Button cancel = (Button) loadingDialog.findViewById(R.id.buttonCancel);
Button cancel = loadingDialog.findViewById(R.id.buttonCancel);
cancel.setVisibility(View.GONE);
TextView textView1 = (TextView) loadingDialog.findViewById(R.id.textView1);
TextView textView1 = loadingDialog.findViewById(R.id.textView1);
textView1.setText(message);
loadingDialog.show();
@ -501,8 +573,7 @@ public class LiveActivity extends AbstractLiveActivity implements OnMapReadyCall
disabledVehicles.add(!veh.status);
// add vehicle to hash Table according to driver_id
if (tableHashOverlay.get((int) veh.driver_id) == null) // if doesn't exist
{
if (tableHashOverlay.get((int) veh.driver_id) == null) {
ArrayList<SuperVehicle> array = new ArrayList<>();
SuperVehicle superVehicle = new SuperVehicle(veh.sc_id, veh.imei, veh.lp, veh.name, veh.driver_id, veh.time_route, veh.GPS_reporting_interval, veh.is_stolen);
array.add(superVehicle);
@ -519,7 +590,6 @@ public class LiveActivity extends AbstractLiveActivity implements OnMapReadyCall
}
// set adapter
adapter = new VehiclesGridViewAdapter(activity, context, list, disabledVehicles);
adapter.notifyDataSetChanged();
@ -538,7 +608,6 @@ public class LiveActivity extends AbstractLiveActivity implements OnMapReadyCall
// show vehicles in gridView
private void updateResultsUI() {
gridVehicle.setAdapter(adapter);
try {
// hide loading dialog
loadingDialog.cancel();
@ -576,7 +645,6 @@ public class LiveActivity extends AbstractLiveActivity implements OnMapReadyCall
pollReceived(position,lat,lng);
}
public void updatePosition(int pos) {
contextMenuPosition = pos;
}
@ -598,11 +666,9 @@ public class LiveActivity extends AbstractLiveActivity implements OnMapReadyCall
final Runnable updateOptionsRUN = this::updateOptionsUI;
private void updateOptionsUI() {
SM.Debug("REFRESHDisableEnable" + (Boolean.TRUE.equals(disabledVehicles.get(contextMenuPosition)) ? "true" : "false"));
// change Enable/Disable in adapter
adapter.changeDisabled(contextMenuPosition, disabledVehicles.get(contextMenuPosition));
}
/**
@ -692,7 +758,6 @@ public class LiveActivity extends AbstractLiveActivity implements OnMapReadyCall
// zone and channel change intent
IntentFilter intentFilter = new IntentFilter(OperationCodes.UNIT_STATUS_UPDATE + "");
this.registerReceiver(mReceiver, intentFilter);
}
//The BroadcastReceiver that listens for Notification broadcasts
@ -723,4 +788,9 @@ public class LiveActivity extends AbstractLiveActivity implements OnMapReadyCall
}
}
};
@Override
public GoogleMap getMap() {
return googleMap;
}
}

View File

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

View File

@ -0,0 +1,699 @@
package com.safemobile.safedispatch;
import android.app.Activity;
import android.app.AlertDialog;
import android.app.Dialog;
import android.content.Context;
import android.content.Intent;
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.ArrayAdapter;
import android.widget.Button;
import android.widget.EditText;
import android.widget.GridView;
import android.widget.ImageButton;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.TextView;
import android.widget.Toast;
import com.safemobile.adapters.ConversationGridViewAdapter;
import com.safemobile.adapters.MessagesGridViewAdapter;
import com.safemobile.lib.AppParams;
import com.safemobile.lib.Msg;
import com.safemobile.lib.OperationCodes;
import com.safemobile.lib.SM;
import com.safemobile.lib.SMS;
import com.safemobile.lib.Vehicle;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.Hashtable;
import java.util.Locale;
import java.util.Objects;
/**
* fix import
*/
public class MessagesActivity extends Activity {
/**
* Called when the activity is first created.
*/
private MessagesGridViewAdapter mAdapter;
private ConversationGridViewAdapter convAdapter;
private ArrayList<Msg> listLastMessages = new ArrayList<>();
private ArrayList<Msg> listSpecificConversation = new ArrayList<>();
private ArrayList<Boolean> dispatcherPositions = new ArrayList<>();
private GridView gridView;
private Context context;
private Activity activity;
private final Hashtable<Long, ArrayList<SMS>> tableSMS = new Hashtable<>();
private final Hashtable<String, Long> seqIDSMSHash = new Hashtable<>();
// Need handler for callbacks to the UI thread
private final Handler myHandler = new Handler(Looper.getMainLooper());
/* Visual resources */
private LinearLayout layoutSend;
private LinearLayout layoutHeader;
private LinearLayout layoutHeaderConversation;
private TextView textViewSelectedContact;
private ImageView imageViewSelectedContact;
private Button imageButtonSend;
private EditText editTextMsg;
private TabLayoutActivity parentTab;
/* Message args */
private int ACTION;
private static final int MSG_UPDATE = 0;
private ArrayList<String> allVehicleNames = new ArrayList<>();
private ArrayList<Vehicle> allVehicle = new ArrayList<>();
// tip of Messages and flag first load
public boolean LASTMESSAGES = true;
private boolean FIRST = true;
// store selected scId and selected unitType
private long scId = 0;
private int unitType = 0;
private Bundle savedInstanceState;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
this.setSavedInstanceState(savedInstanceState);
// get parentTab
parentTab = (TabLayoutActivity) getParent();
context = this;
activity = this;
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.tabtext);
// get LayoutSend and hide
layoutSend = findViewById(R.id.layoutSendMsg);
layoutSend.setVisibility(View.GONE);
// get header layout
layoutHeader = findViewById(R.id.layoutHeader);
layoutHeaderConversation = findViewById(R.id.layoutHeaderConversation);
// show only header layout
layoutHeaderConversation.setVisibility(View.GONE);
// get SelectedContact TextView and ImageView
textViewSelectedContact = findViewById(R.id.textViewSelectedContact);
imageViewSelectedContact = findViewById(R.id.imageViewSelectedContact);
ImageView imageBarcode = findViewById(R.id.imageBarcode);
imageBarcode.setOnClickListener(v -> {
try {
Intent intent = new Intent("com.google.zxing.client.android.SCAN");
startActivityForResult(intent, 0);
} catch (Exception e) {
showErrorDialog(getResources().getString(R.string.barcodeError));
}
});
// change tab header fontFace
TextView textView1 = findViewById(R.id.textView1);
textView1.setTypeface(Typeface.createFromAsset(getAssets(), "Sketch_Block.ttf"));
textView1.setTextSize(24);
// prepared arraylist and passed it to the Adapter class
mAdapter = new MessagesGridViewAdapter(this, listLastMessages);
convAdapter = new ConversationGridViewAdapter(this, listSpecificConversation, dispatcherPositions, new ArrayList<>());
// Set custom adapter to gridview
gridView = findViewById(R.id.gridView1);
gridView.setAdapter(mAdapter);
// Implement On Item click listener
gridView.setOnItemClickListener((arg0, arg1, position, arg3) -> {
if (LASTMESSAGES) {
// get position
Msg item = mAdapter.getItem(position);
// get Specific Conversation
setScId(item.from.sc_id);
SM.Debug("Selected scId: " + getScId());
// set Conversation type
LASTMESSAGES = false;
// call get SMS
getSMS4unit(getScId());
// create crt_Vehicle
setUnitType((int) item.from.driver_id);
// save selected vehicle
}
if (AppParams.DEMO) {
// modify UI
ACTION = MSG_UPDATE;
updateResultsInUi();
}
});
/* Buttons and EditBoxes */
ImageButton imageButtonAdd = findViewById(R.id.imageButtonAdd);
imageButtonAdd.setOnClickListener(v -> showDialog());
// button send message
imageButtonSend = findViewById(R.id.imageButtonSend);
imageButtonSend.setOnClickListener(v -> {
sendSMS(getScId(), editTextMsg.getText().toString());
Toast.makeText(context, "Sending message...", Toast.LENGTH_SHORT).show();
// disable send button and editBox
editTextMsg.setEnabled(false);
imageButtonSend.setEnabled(false);
new Thread(() -> {
try {
Thread.sleep(500);
myHandler.post(enableButtonRUN);
if (AppParams.DEMO) {
Thread.sleep(5500);
myHandler.post(demoReceivedSMSRUN);
}
} catch (InterruptedException e) {
e.printStackTrace();
Thread.currentThread().interrupt();
}
}).start();
});
// button back to conversations
ImageButton imageButtonBack = findViewById(R.id.imageButtonBack);
imageButtonBack.setOnClickListener(v -> {
// set LastMessage conversation type
LASTMESSAGES = true;
// refresh Grid
getLastSMS();
if (AppParams.DEMO)
updateResultsInUi();
});
// get Message editText
editTextMsg = findViewById(R.id.editTextMsg);
gridView.setId(1); // id needed for IconContextMenu
registerForContextMenu(gridView);
parentTab.messageActivity = this;
}
// Create runnable for posting
final Runnable demoReceivedSMSRUN = new Runnable() {
public void run() {
parentTab.setImei(getScId() + "");
parentTab.updateResultsInUi("realpha");
int timeGMT = (int) (System.currentTimeMillis() / 1000L);
String sendSMSSeqID = "1." + timeGMT;
// add mess to not ack list
seqIDSMSHash.put(sendSMSSeqID, getScId());
// get scId conversation and add message
ArrayList<SMS> crtSmsList = tableSMS.get(getScId());
SMS sms = new SMS(0, 0, timeGMT, "i got your sms", 0, getScId());
sms.seq_idx = sendSMSSeqID;
if (crtSmsList != null)
crtSmsList.add(sms);
// add message to listLast
boolean exists = false;
for (Msg msg : listLastMessages)
// if conversation exists in lastMessages
if (msg.from.sc_id == getScId()) {
exists = true;
msg.message = "i got your sms";
msg.received = Calendar.getInstance().getTime();
}
// if last messages doesn't contain this conversation
if (!exists) {
Vehicle sentVehicle = null;
for (Vehicle veh : getAllVehicle())
if (veh.sc_id == getScId())
sentVehicle = veh;
listLastMessages.add(new Msg(sentVehicle, "i got your sms", Calendar.getInstance().getTime(), sendSMSSeqID));
}
SM.Debug("time: " + timeGMT + " | " + Calendar.getInstance().getTime());
updateResultsInUi();
}
};
@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();
}
@Override
public void onPause() {
super.onPause();
SM.Debug("onPause");
}
@Override
public void onResume() {
super.onResume();
if (parentTab.getTCPState() != null && FIRST) {
updateVehicles(parentTab.getAllVehicle());
FIRST = false;
if (LASTMESSAGES)
parentTab.executeNetworkStuff(new String[]{OperationCodes.GetLastSMS + "", AppParams.USERID + ""});
}
SM.Debug("onResume");
}
@Override
public void onActivityResult(int requestCode, int resultCode, Intent intent) {
if (requestCode == 0 && resultCode == RESULT_OK) {
String contents = intent.getStringExtra("SCAN_RESULT");
String format = intent.getStringExtra("SCAN_RESULT_FORMAT");
editTextMsg.setText(String.format("%s%s", editTextMsg.getText().toString(), contents));
// Handle successful scan
Toast.makeText(this, getResources().getString(R.string.barcodeContent) + ":" + contents + " with format:" + format, Toast.LENGTH_LONG).show();
}
}
// Request SMS 4 Unit from AppServer
private void getSMS4UnitWithTime(long scId, long time) {
if (!AppParams.DEMO) {
parentTab.executeNetworkStuff(new String[]{OperationCodes.GetRecentSMSs + "", scId + "", time + ""});
SM.Debug(" #### GetSMS4uni:" + scId);
}
}
private void getSMS4unit(long scId) {
if (!AppParams.DEMO) {
SM.Debug("getSMS4unit : " + scId);
ArrayList<SMS> listSMS = tableSMS.get(scId);
long timeGMT = 0;
if (listSMS != null && !listSMS.isEmpty())
timeGMT = listSMS.get(listSMS.size() - 1).timeGMT;
// error in DB
if (String.valueOf(timeGMT).contains(".")) {
try {
// remove the dot and the parse it to String
timeGMT = Long.parseLong(String.valueOf(timeGMT).split("\\.")[1]);
} catch (Exception e) {
timeGMT = Long.parseLong(String.valueOf(timeGMT).replace(".", ""));
}
}
parentTab.executeNetworkStuff(new String[]{OperationCodes.GetRecentSMSs + "", scId + "", timeGMT + ""});
SM.Debug(" #### GetSMS4uni:" + scId);
}
}
// Request Last SMS from AppServer
public void getLastSMS() {
if (!AppParams.DEMO) {
if (LASTMESSAGES)
parentTab.executeNetworkStuff(new String[]{OperationCodes.GetLastSMS + "", AppParams.USERID + ""});
else {
ArrayList<SMS> listSMS = tableSMS.get(getScId());
long timeGMT = 0;
if (listSMS != null && !listSMS.isEmpty())
timeGMT = listSMS.get(listSMS.size() - 1).timeGMT;
parentTab.executeNetworkStuff(new String[]{OperationCodes.GetRecentSMSs + "", getScId() + "", timeGMT + ""});
}
} else
updateResultsInUi();
}
private void sendSMS(long scIdd, String txt) {
if (!AppParams.DEMO) {
int timeGMT = (int) (System.currentTimeMillis() / 1000L);
String sendSMSSeqID = "1." + timeGMT;
// add mess to not ack list
seqIDSMSHash.put(sendSMSSeqID, scIdd);
// get scId conversation and add message
SMS sms = new SMS(0, 0, timeGMT, txt, scIdd, 0);
sms.seq_idx = sendSMSSeqID;
tableSMS.get(scIdd).add(sms);
parentTab.executeNetworkStuff(new String[]{OperationCodes.SEND_TM + "", sendSMSSeqID, scIdd + "", txt});
updateResultsInUi();
} else {
int timeGMT = (int) (System.currentTimeMillis() / 1000L);
String sendSMSSeqID = "1." + timeGMT;
// add mess to not ack list
seqIDSMSHash.put(sendSMSSeqID, scIdd);
// get scId conversation and add message
ArrayList<SMS> crtSmsList = tableSMS.get(scIdd);
SMS sms = new SMS(0, 0, timeGMT, txt, scIdd, 0);
sms.seq_idx = sendSMSSeqID;
crtSmsList.add(sms);
// add message to listLast
boolean exists = false;
for (Msg msg : listLastMessages)
// if conversation exists in lastMessages
if (msg.from.sc_id == scIdd) {
exists = true;
msg.message = txt;
msg.received = Calendar.getInstance().getTime();
}
// if last messages doesn't contain this conversation
if (!exists) {
Vehicle sentVehicle = null;
for (Vehicle veh : getAllVehicle())
if (veh.sc_id == scIdd)
sentVehicle = veh;
listLastMessages.add(new Msg(sentVehicle, txt, Calendar.getInstance().getTime(), sendSMSSeqID));
}
SM.Debug("time: " + timeGMT + " | " + Calendar.getInstance().getTime());
LASTMESSAGES = false;
updateResultsInUi();
}
}
// Update Vehicles received from AppServer
public void updateVehicles(ArrayList<Vehicle> list) {
SM.Debug("## updateVehicles: " + list.size());
setAllVehicle(list);
allVehicleNames = new ArrayList<>();
for (Vehicle v : getAllVehicle())
allVehicleNames.add(v.name);
if (tableSMS.size() == 0) {
for (Vehicle veh : getAllVehicle()) {
ArrayList<SMS> smsList = new ArrayList<>();
// populate conversation list if demo
if (AppParams.DEMO)
smsList = getDemoConversation(veh.sc_id);
tableSMS.put(veh.sc_id, smsList);
}
}
}
// gets DEMO conversations
private ArrayList<SMS> getDemoConversation(long scId) {
ArrayList<SMS> smsList = new ArrayList<>();
if (scId == 101)
smsList.add(new SMS(1, 2, 1324016412, "Only one left", 101, 0));
else if (scId == 102)
smsList.add(new SMS(1, 2, 1328060100, "i'm at the train station", 0, 102));
else if (scId == 103) {
smsList.add(new SMS(1, 2, 1121016637, "Where are you now?", 103, 0));
smsList.add(new SMS(2, 2, 1121016693, "Near Elementary School 81", 0, 103));
smsList.add(new SMS(3, 2, 1121016693, "We have a client on Belmont Ave", 103, 0));
smsList.add(new SMS(4, 2, 1121016724, "It's only 4 blocks away", 103, 0));
smsList.add(new SMS(5, 2, 1121016693, "Can you take him?", 103, 0));
smsList.add(new SMS(6, 2, 1121016818, "I'll be right there", 0, 103));
} else if (scId == 105)
smsList.add(new SMS(1, 2, 1328061660, "Thanks", 0, 105));
return smsList;
}
public void updateSMS(ArrayList<SMS> list) {
SM.Debug("## updateSMS: " + list.size() + " [LASTMESSAGES:" + LASTMESSAGES + "]");
// populate listLastMessages
if (LASTMESSAGES) {
listLastMessages = new ArrayList<>();
for (SMS sms : list) {
// get for sender
long senderId = sms.sc_id_dest;
if (senderId == 0)
senderId = sms.sc_id_sour;
// get vehicle with sender id
Vehicle messageVeh;
messageVeh = getVehicleById(senderId);
listLastMessages.add(0, new Msg(messageVeh, sms.mess, new Date((long) sms.timeGMT * 1000), sms.seq_idx));
}
// update GridView
mAdapter = new MessagesGridViewAdapter(activity, listLastMessages);
} else {
// add new values to hashTable for key = scId
ArrayList<SMS> listScId = tableSMS.get(getScId());
if (!list.isEmpty())
for (SMS sms : list) {
// compare last item in hashList with first elem in arrived list
// protect is listSc_Id size = 0
if (listScId != null && (listScId.isEmpty()
|| (sms.sc_id_dest != listScId.get(listScId.size() - 1).sc_id_dest
|| sms.sc_id_sour != listScId.get(listScId.size() - 1).sc_id_sour
|| !Objects.equals(sms.mess, listScId.get(listScId.size() - 1).mess))))
listScId.add(sms);
}
}
// modify UI
ACTION = MSG_UPDATE;
myHandler.post(this::updateResultsInUi);
}
// Confirmation for sending message
public void confirmSMS(String data, final String seqID) {
SM.Debug("confirmSMS");
if (data.equals("0")) {
SM.Debug("Error on sending SMS");
showErrorDialog("Error on sending message.");
} else {
SM.Debug("ACK received for text message");
//get scId for crt message
long scId = seqIDSMSHash.get(seqID);
// get SMS list for crt scId
ArrayList<SMS> crtSMSList = tableSMS.get(scId);
if (crtSMSList != null) {
for (SMS sms : crtSMSList) {
if (sms.seq_idx.equals(seqID)) {
SM.Debug("######### AM SCHIMBAT STATUSUL pt: " + sms.mess + " | " + scId + " | " + seqID + " || " + sms.seq_idx);
// set ACK
sms.status = 2;
}
}
}
// remove message from seqIDSMS Hash = don't wait confirmation for it
seqIDSMSHash.remove(seqID);
// store sms seqId to set to ACK in adapter
myHandler.post(() -> {
convAdapter.setACK(seqID);
convAdapter.changeView(seqID);
convAdapter.notifyDataSetChanged();
});
myHandler.post(() -> editTextMsg.setText(""));
}
}
public void newSMS(String imei, String message, final long time) {
SM.Debug(" ## newSMS: " + imei + " | " + message);
if (!LASTMESSAGES) {
// if received message from current conversation
if (getVehicleByImei(imei).sc_id == getScId())
getSMS4UnitWithTime(getScId(), time); // refresh MSG List
} else
getLastSMS(); // get last SMS
}
// Create runnable for posting
final Runnable enableButtonRUN = this::updateEnableButtonsUI;
// enable buttons in UI after 200ms from send
private void updateEnableButtonsUI() {
// enable buttons
imageButtonSend.setEnabled(true);
editTextMsg.setEnabled(true);
editTextMsg.setText("");
}
private void updateResultsInUi() {
if (getAllVehicle() == null)
updateVehicles(parentTab.getAllVehicle());
if (ACTION == MSG_UPDATE) {
if (LASTMESSAGES) {
// show Header Layout
layoutHeader.setVisibility(View.VISIBLE);
// hide Conversation Header Layout
layoutHeaderConversation.setVisibility(View.GONE);
// hide Send Layout
layoutSend.setVisibility(View.GONE);
// change GridView adapter
gridView.setAdapter(mAdapter);
gridView.invalidate();
} else {
SM.Debug(" #### Modify adapter for SMS4unit");
// populate specific conversation
listSpecificConversation = new ArrayList<>();
dispatcherPositions = new ArrayList<>();
ArrayList<Boolean> ackPosition = new ArrayList<>();
ArrayList<SMS> list;
list = tableSMS.get(getScId());
if (list != null) {
for (SMS sms : list) {
// get for sender
long senderId = sms.sc_id_dest;
if (senderId == 0)
senderId = sms.sc_id_sour;
// get vehicle with sender id
Vehicle messageVeh;
messageVeh = getVehicleById(senderId);
// flag dispatcher message when source is 0
dispatcherPositions.add(sms.sc_id_sour == 0);
ackPosition.add(sms.status == 2);
listSpecificConversation.add(new Msg(messageVeh, sms.mess, new Date((long) sms.timeGMT * 1000), sms.seq_idx));
}
}
convAdapter = new ConversationGridViewAdapter(activity, listSpecificConversation, dispatcherPositions, ackPosition);
gridView.setAdapter(convAdapter);
if (!listSpecificConversation.isEmpty())
gridView.setSelection(listSpecificConversation.size() - 1);
// set unit name and image in Header Conversation
textViewSelectedContact.setText(getVehicleByScId(getScId()).name);
imageViewSelectedContact.setImageResource(getVehicleByScId(getScId()).getLargeIcon());
// clear editText
editTextMsg.setText("");
// change layouts visibility
layoutSend.setVisibility(View.VISIBLE);
layoutHeader.setVisibility(View.GONE);
layoutHeaderConversation.setVisibility(View.VISIBLE);
}
gridView.invalidate();
}
}
// gets Vehicle from id
public Vehicle getVehicleById(long vehicleId) {
for (Vehicle vehicle : getAllVehicle())
if (vehicle.sc_id == vehicleId)
return vehicle;
return null;
}
// get Vehicle from imei
public Vehicle getVehicleByImei(String imei) {
for (Vehicle vehicle : getAllVehicle())
if (vehicle.imei.equalsIgnoreCase(imei))
return vehicle;
return null;
}
public Vehicle getVehicleByScId(long scId) {
for (Vehicle vehicle : getAllVehicle())
if (vehicle.sc_id == scId)
return vehicle;
return null;
}
// show a dialog
public void showDialog() {
ArrayAdapter<String> adapter = new ArrayAdapter<>(this, R.layout.template_simple_list_item, allVehicleNames);
AlertDialog.Builder builder = new AlertDialog.Builder(context);
builder.setTitle(getString(R.string.selectVehicle));
builder.setAdapter(adapter, (dialog, which) -> {
// get position
Vehicle item = getAllVehicle().get(which);
// get Specific Conversation
setScId(item.sc_id);
SM.Debug("Selected scId: " + getScId());
// set Conversation type
LASTMESSAGES = false;
// call get SMS
getSMS4unit(getScId());
// create crt_Vehicle
setUnitType((int) item.driver_id);
SM.Debug("AM SELECTAT: " + getScId() + " | " + item.name + " | " + getUnitType() + "\n\t " + item);
if (AppParams.DEMO)
updateResultsInUi();
});
AlertDialog alert = builder.create();
alert.show();
}
public void showErrorDialog(String errorMsg) {
Dialog dialog = new Dialog(context);
dialog.setTitle(getString(R.string.sendingError));
dialog.setContentView(R.layout.dialog);
dialog.setCancelable(true);
dialog.setCanceledOnTouchOutside(true);
TextView text = dialog.findViewById(R.id.text);
ImageView image = dialog.findViewById(R.id.image);
image.setImageResource(R.drawable.error);
text.setText(errorMsg);
dialog.show();
}
public ArrayList<Vehicle> getAllVehicle() {
return allVehicle;
}
public void setAllVehicle(ArrayList<Vehicle> allVehicle) {
this.allVehicle = allVehicle;
}
public long getScId() {
return scId;
}
public void setScId(long scId) {
this.scId = scId;
}
public int getUnitType() {
return unitType;
}
public void setUnitType(int unitType) {
this.unitType = unitType;
}
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.content.Intent;

View File

@ -1,4 +1,4 @@
package com.safemobile.dispatch;
package com.safemobile.safedispatch;
import android.app.Activity;
import android.app.AlertDialog;
@ -673,10 +673,10 @@ public class RadioActivity extends Activity {
dialog.setCancelable(true);
dialog.setCanceledOnTouchOutside(true);
TextView text = (TextView) dialog.findViewById(R.id.text);
ImageView image = (ImageView) dialog.findViewById(R.id.image);
TextView text = dialog.findViewById(R.id.text);
ImageView image = dialog.findViewById(R.id.image);
image.setImageResource(R.drawable.ic_launcher);
image.setImageResource(R.mipmap.ic_launcher);
text.setText(errorMsg);
dialog.show();
}

View File

@ -1,4 +1,4 @@
package com.safemobile.dispatch;
package com.safemobile.safedispatch;
import android.app.Activity;
import android.app.AlertDialog;
@ -184,10 +184,10 @@ public class RecordingsActivity extends Activity {
dialog.setCancelable(true);
dialog.setCanceledOnTouchOutside(true);
TextView text = (TextView) dialog.findViewById(R.id.text);
ImageView image = (ImageView) dialog.findViewById(R.id.image);
TextView text = dialog.findViewById(R.id.text);
ImageView image = dialog.findViewById(R.id.image);
image.setImageResource(R.drawable.ic_launcher);
image.setImageResource(R.mipmap.ic_launcher);
text.setText(errorMsg);
dialog.show();
}

View File

@ -1,4 +1,4 @@
package com.safemobile.dispatch;
package com.safemobile.safedispatch;
import android.app.Activity;
import android.app.AlertDialog;

View File

@ -1,4 +1,4 @@
package com.safemobile.dispatch;
package com.safemobile.safedispatch;
import java.util.ArrayList;
import java.util.List;

View File

@ -1,4 +1,4 @@
package com.safemobile.dispatch;
package com.safemobile.safedispatch;
import java.util.Locale;

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

@ -188,7 +188,7 @@
android:layout_width="wrap_content"
android:layout_height="fill_parent">
<TextView
android:id="@+id/textViewSendMsg"
android:id="@+id/textView1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_vertical"
@ -210,7 +210,8 @@
android:layout_height="wrap_content"
android:layout_gravity="center_vertical"
android:gravity="center_vertical"
android:inputType="text" >
android:inputType="text"
android:autofillHints="">
</EditText>
</LinearLayout>
<LinearLayout

View File

@ -11,7 +11,7 @@
android:layout_height="wrap_content"
android:layout_marginRight="10dp"
android:layout_gravity="center_vertical"
android:src="@drawable/ic_launcher"
android:src="@mipmap/ic_launcher"
/>
<LinearLayout
android:layout_width="wrap_content"

View File

@ -24,7 +24,7 @@
android:layout_height="wrap_content"
android:layout_marginRight="10dp"
android:layout_gravity="center_vertical"
android:src="@drawable/ic_launcher"
android:src="@mipmap/ic_launcher"
android:contentDescription="image for dialog"
/>
<LinearLayout

View File

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

View File

@ -1,8 +1,10 @@
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent" android:layout_height="fill_parent"
android:id="@+id/tab1Layout" android:orientation="horizontal"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:id="@+id/tab1Layout"
android:orientation="horizontal"
style="?bg">
<RelativeLayout
@ -105,9 +107,7 @@
android:layout_weight="0"
android:paddingRight="5dp"
android:visibility="gone"/>
<!-- android:background="@drawable/addmessage_selector" -->
</LinearLayout>
</RelativeLayout>
<RelativeLayout
@ -120,8 +120,6 @@
android:layout_height="fill_parent"
android:weightSum="1">
<LinearLayout
android:layout_width="200dp"
android:layout_height="fill_parent"
@ -166,10 +164,11 @@
android:text="@string/startDate"
android:textSize="22dp"
android:paddingLeft="5dp"
android:layout_marginTop="15sp"
android:textColor="#000000"
android:gravity="left"
android:id="@+id/labelStartDate"
android:visibility="gone"/>
/>
<LinearLayout
android:id="@+id/layoutStartPicker"
android:layout_height="wrap_content"
@ -206,7 +205,7 @@
android:textColor="#000000"
android:gravity="left"
android:id="@+id/labelEndDate"
android:visibility="gone"/>
/>
<LinearLayout
android:id="@+id/layoutEndPicker"
android:layout_height="wrap_content"
@ -267,7 +266,6 @@
android:text="@string/display" />
</LinearLayout>
</LinearLayout>
</LinearLayout>
<LinearLayout
@ -288,14 +286,15 @@
style="?sliders" />
</LinearLayout>
<LinearLayout
android:id="@+id/layoutGoogleMaps"
<fragment
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:id="@+id/map"
android:layout_toRightOf="@id/slidelayout"
android:layout_weight="1"
android:orientation="horizontal" >
</LinearLayout>
tools:context=".HistoryActivity"
android:name="com.google.android.gms.maps.SupportMapFragment" />
</LinearLayout>
<ImageView
@ -333,9 +332,5 @@
android:gravity="center_vertical"/>
</LinearLayout>
</RelativeLayout>
</RelativeLayout>

View File

@ -10,27 +10,7 @@
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:background="#000000">
<LinearLayout android:layout_width="fill_parent" android:layout_height="wrap_content" android:id="@+id/linearLayout2" android:orientation="vertical">
<!--
<LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:id="@+id/linearLayout3">
<LinearLayout android:layout_width="80dp" android:id="@+id/linearLayout4" android:layout_height="wrap_content">
<Button android:layout_width="wrap_content" android:text="Create tabs" android:layout_height="wrap_content" android:id="@+id/button1"></Button>
</LinearLayout>
<LinearLayout android:layout_height="match_parent" android:id="@+id/linearLayout5" android:layout_width="match_parent">
<LinearLayout android:layout_width="100dp" android:layout_height="match_parent" android:id="@+id/linearLayout7" android:layout_weight="0.29" android:weightSum="1">
<Button android:text="Remove selected tab" android:layout_height="wrap_content" android:id="@+id/button3" android:layout_width="wrap_content"></Button>
</LinearLayout>
<EditText android:layout_width="wrap_content" android:id="@+id/editText1" android:layout_height="wrap_content" android:inputType="number" android:layout_weight="13.86">
<requestFocus></requestFocus>
</EditText>
<LinearLayout android:layout_width="80dp" android:layout_height="match_parent" android:id="@+id/linearLayout7" android:layout_weight="0.29" android:weightSum="1">
<Button android:layout_width="wrap_content" android:text="Add tab" android:layout_height="wrap_content" android:id="@+id/button2" android:layout_weight="0.25"></Button>
</LinearLayout>
</LinearLayout>
</LinearLayout>
-->
</LinearLayout>
<LinearLayout
android:layout_width="fill_parent"
android:id="@+id/linearLayout6"
@ -162,7 +142,6 @@
android:layout_gravity="center_vertical"/>
</LinearLayout>
</LinearLayout>
</LinearLayout>
</LinearLayout>
</RelativeLayout>
</RelativeLayout>

View File

@ -186,7 +186,7 @@
android:layout_width="wrap_content"
android:layout_height="fill_parent">
<TextView
android:id="@+id/textViewSendMsg"
android:id="@+id/textView1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_vertical"
@ -209,7 +209,8 @@
android:layout_gravity="center_vertical"
android:gravity="center_vertical"
android:inputType="text"
android:maxLength="255" >
android:maxLength="255"
android:autofillHints="">
</EditText>
</LinearLayout>
<LinearLayout

View File

@ -232,4 +232,7 @@
<item >German</item>
<item >Romanian</item>
</string-array>
<string name="speedMph">%1$d mph</string>
</resources>

View File

@ -236,4 +236,7 @@
<item >Spanish</item>
<item >Russian</item>
</string-array>
<string name="speedMph">%1$d mph</string>
</resources>

View File

@ -233,4 +233,7 @@
<item >Turca</item>
<item >Romana</item>
</string-array>
<string name="speedMph">%1$d mph</string>
</resources>

View File

@ -232,4 +232,7 @@
<item >German</item>
<item >Romanian</item>
</string-array>
<string name="speedMph">%1$d mph</string>
</resources>

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"?>
<resources>
<string name="app_name">SafeMobile Dispatch</string>
<string name="app_name_demo">SafeMobile Dispatch Demo</string>
<string name="app_name">SafeDispatch Mobile</string>
<string name="app_name_demo">SafeDispatch Mobile Demo</string>
<string name="app_name_radiopod">RadioPod</string>
<string name="app_name_radiopad">RadioPad</string>
<string name="app_name_radiopodd">RadioPod</string>
@ -254,4 +254,8 @@
</string-array>
<string name="title_activity_new_live">NewLiveActivity</string>
<string name="title_activity_google_maps">GoogleMapsActivity</string>
<string name="speedMph">%1$d mph</string>
</resources>

View File

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