Compare commits

..

No commits in common. "develop" and "b91931e8330f092df1517ad583d10284039bead3" have entirely different histories.

109 changed files with 10981 additions and 10411 deletions

5
.gitignore vendored
View File

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

0
gradlew vendored Executable file → Normal file
View File

View File

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

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

View File

@ -2,7 +2,6 @@ package com.safemobile.activities;
import java.util.ArrayList;
import com.google.android.gms.maps.GoogleMap;
import com.safemobile.lib.Vehicle;
import android.app.Activity;
@ -24,8 +23,6 @@ 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
public abstract void setLanguage();
/** Misc */
public AbstractSDParentActivity getParentTab() {

View File

@ -1,8 +1,9 @@
package com.safemobile.activities;
import android.app.TabActivity;
import android.content.BroadcastReceiver;
import java.util.ArrayList;
import java.util.Hashtable;
import com.safemobile.bluetooth.BluetoothTether;
import com.safemobile.lib.AppParams;
import com.safemobile.lib.SM;
import com.safemobile.lib.SuperVehicle;
@ -10,21 +11,43 @@ import com.safemobile.lib.Vehicle;
import com.safemobile.services.TCPhandler;
import com.safemobile.services.TCPmsgParser;
import java.util.ArrayList;
import java.util.Hashtable;
import android.app.Activity;
import android.app.NotificationManager;
import android.app.TabActivity;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.os.Handler;
import android.widget.ImageView;
import android.widget.RelativeLayout;
@SuppressWarnings("deprecation")
public abstract class AbstractSDParentActivity extends TabActivity {
/** UI Elements */
public RelativeLayout layoutLoading;
public ImageView imageViewLoading;
/** Misc */
private static final boolean SHOULD_DISPLAY_LOGCAT = true; // show logCat messages when TCP send was successful
private String imei;
private String mess;
public Activity activity;
public Context context;
public NotificationManager mNotificationManager;
public boolean displayLogCat = true; // show logCat messages when TCP send was successful
public String imei, mess;
public int demoPosition = 0;
private ArrayList<Vehicle> allVehicle = new ArrayList<>();
private Hashtable<Long, SuperVehicle> superVehHash = new Hashtable<>();
private Hashtable<Long, Vehicle> vehHashByScId = new Hashtable<>();
/** Lists */
public ArrayList<Vehicle> allVehicle = new ArrayList<Vehicle>();
public Hashtable<Long, SuperVehicle> SuperVehHash = new Hashtable<Long, SuperVehicle>();
public Hashtable<Long, Vehicle> VehHashbySc_id = new Hashtable<Long, Vehicle>();
/** Handler */
public Handler myHandler = new Handler();
/** BlueTooth Tether */
public BluetoothTether bluetoothTether = null;
/** Broadcast Receiver */
public BroadcastReceiver mReceiver = null;
/** TCP */
protected TCPhandler tcp = null;
@ -43,9 +66,9 @@ public abstract class AbstractSDParentActivity extends TabActivity {
public Object getTCPState() {
// return true if tcp connection is on, false if not connected and null
if (tcp != null && tcp.isConnectionUP)
if(tcp!=null && tcp.isConnectionUP)
return "true";
else if (tcp != null)
else if(tcp!=null && !tcp.isConnectionUP)
return "false";
return null;
}
@ -61,78 +84,83 @@ public abstract class AbstractSDParentActivity extends TabActivity {
public abstract void updateDemoPosition();
public abstract void updateResultsPollInUi(String type);
public abstract double best_zoom(double latMax,double latMin,double lngMax,double lngMin);
public abstract double best_zoom(double LATMAX,double LATmin,double LNGMAX,double LNGmin);
/* SafeDispatch Mobile functions */
/** get Vehicles for an user id */
public boolean getVehicles(int userID) {
if (tcp == null)
public boolean getVehicles(int userID)
{
if(tcp == null)
return false;
boolean res = tcp.Write("0.0", "#21#" + userID + "#");
if (res && SHOULD_DISPLAY_LOGCAT)
boolean res = tcp.Write("0.0", "#21#" + AppParams.USERID + "#");
if(res && displayLogCat)
SM.Debug("Message (getVehs) sent to app server");
else
SM.Debug("Could not send message(getVehs)!!");
return res;
}
/** get vehicles Last Positions for an user id */
public boolean getLastPositions(int userID) {
if (tcp == null)
public boolean getLastPositions(int userID)
{
if(tcp == null)
return false;
boolean res = tcp.Write("0.0", "#25#" + userID + "#");
if (res && SHOULD_DISPLAY_LOGCAT)
if(res && displayLogCat)
SM.Debug("Message (getLastPOS) sent to app server");
else
SM.Debug("Could not send message(getLastSMS)!!");
return res;
}
/** set Enable/Disable a vehicle */
public boolean setVehicleStatus(int radioCode, int opCode, int sc_id, int enable) {
if (tcp == null)
public boolean setVehicleStatus(int radioCode, int opCode, int sc_id, int enable)
{
if(tcp == null)
return false;
boolean res = tcp.Write("0.0", "#" + radioCode + "#" + opCode + "#" + sc_id + "#" + enable + "#");
if (res && SHOULD_DISPLAY_LOGCAT)
SM.Debug("Message (Option4Unit) sent to app server radioCode:" + radioCode + " opCode:" + opCode + " sc_id:" + sc_id + " value:" + enable);
boolean res = tcp.Write("0.0", "#"+radioCode+"#"+opCode+"#" + sc_id+"#" + enable + "#");
if(res && displayLogCat)
SM.Debug("Message (Option4Unit) sent to app server radioCode:"+radioCode+ " opCode:"+opCode+ " sc_id:"+sc_id+ " value:" + enable);
else
SM.Debug("Could not send message(Option4Unit)!!");
return res;
}
/** get Last SMSs for an user */
public boolean getLastSMSs(int userID) {
if (tcp == null)
public boolean getLastSMSs(int userID)
{
if(tcp == null)
return false;
boolean res = tcp.Write("0.0", "#23#" + userID + "#");
if (res && SHOULD_DISPLAY_LOGCAT)
if(res && displayLogCat)
SM.Debug("#Send Request#", "Message [getLastSMSs] sent to app server");
else
SM.Debug("#Send Request#", "Could not send message [getLastSMSs]!!");
return res;
}
/** get SMSs for an user that are recent than timeGMT
* @param sc_id the vehicle imei for which we want the SMSs
* @param timeGMT the unix time for the last message in the grid or messages that are newer than this time */
public boolean getRecentSMSs(int sc_id, long timeGMT) {
if (tcp == null)
public boolean getRecentSMSs(int sc_id, long timeGMT)
{
if(tcp == null)
return false;
boolean res = tcp.Write("0.0", "#22#" + sc_id + "#" + timeGMT + "#");
if (res && SHOULD_DISPLAY_LOGCAT)
boolean res = tcp.Write("0.0", "#22#"+sc_id+"#" +timeGMT+"#");
if(res && displayLogCat)
SM.Debug("#Send Request#", "Message [getRecentSMSs] sent to app server");
else
SM.Debug("#Send Request#", "Could not send message [getRecentSMSs]!!");
return res;
}
@ -146,7 +174,7 @@ public abstract class AbstractSDParentActivity extends TabActivity {
return false;
boolean res = tcp.Write(seqID, "#24#" + AppParams.USERID + "#" + sc_id + "#" + txt + "#");
if(res && SHOULD_DISPLAY_LOGCAT)
if(res && displayLogCat)
SM.Debug("Message [sendSMS] sent to app server sc_id:"+sc_id+ " txt:"+txt);
else
SM.Debug("Could not send message [sendSMS]!!");
@ -155,16 +183,16 @@ public abstract class AbstractSDParentActivity extends TabActivity {
}
public boolean sendAlarmAcknowledge(int alarm_id, int type, String unitName)
public boolean sendAlarmAcknoledge(int alarm_id, int type)
{
if(tcp == null)
return false;
boolean res = tcp.Write("0.0", "#28#" + alarm_id + "#" + type + "#" + AppParams.USERID + "#" + unitName + "#");
boolean res = tcp.Write("0.0", "#28#" + alarm_id + "#" + type + "#");
if(res)
SM.Debug("Message [sendAlarmAcknowledge] sent to app server alarm_id:" + alarm_id + " type:" + type);
SM.Debug("Message [sendAlarmAcknoledge] sent to app server alarm_id:" + alarm_id + " type:" + type);
else
SM.Debug("Could not send message [sendAlarmAcknowledge]!!");
SM.Debug("Could not send message [sendAlarmAcknoledge]!!");
return res;
}
@ -198,11 +226,12 @@ 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."+ (int) (System.currentTimeMillis() / 1000L);
String histSeqID = "1."+Integer.toString((int) (System.currentTimeMillis() / 1000L));
boolean res = tcp.Write(histSeqID,"#26#"+sc_id+"#"+timeGMTStart+"#"+timeGMTStop+"#");
if(res)
SM.Debug("Message [getHistoryPositions] sent to app server");
@ -212,7 +241,8 @@ public abstract class AbstractSDParentActivity extends TabActivity {
return res;
}
public boolean getRadiosList() {
public boolean getRadiosList()
{
if(tcp == null)
return false;
@ -255,12 +285,13 @@ public abstract class AbstractSDParentActivity extends TabActivity {
return res;
}
public boolean getAlarms(long userID) {
if (tcp == null)
public boolean getAlarms(long userID)
{
if(tcp == null)
return false;
boolean res = tcp.Write("0.0", "#27#" + userID + "#");
if (res)
boolean res = tcp.Write("0.0", "#27#" + userID + "#"); // = tcp.Write("0.0", "#30#99#" + gwID + "#" + rgwID + "#");
if(res)
SM.Debug("Message [GetAlarms] sent to app server");
else
SM.Debug("Could not send message [GetAlarms]!!");
@ -282,45 +313,11 @@ public abstract class AbstractSDParentActivity extends TabActivity {
return res;
}
public String getImei() {
return imei;
}
public void setImei(String imei) {
this.imei = imei;
}
public String getMess() {
return mess;
}
public void setMess(String mess) {
this.mess = mess;
}
/** Lists */
public ArrayList<Vehicle> getAllVehicle() {
return allVehicle;
}
public void setAllVehicle(ArrayList<Vehicle> allVehicle) {
this.allVehicle = allVehicle;
}
public Hashtable<Long, SuperVehicle> getSuperVehHash() {
return superVehHash;
}
public void setSuperVehHash(Hashtable<Long, SuperVehicle> superVehHash) {
this.superVehHash = superVehHash;
}
public Hashtable<Long, Vehicle> getVehHashByScId() {
return vehHashByScId;
}
public void setVehHashByScId(Hashtable<Long, Vehicle> vehHashByScId) {
this.vehHashByScId = vehHashByScId;
}
//public abstract void getVehiclePosition(long imei);
/*
public abstract void onResume();
public abstract void onStart();
public abstract void onPause();
*/
}

View File

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

View File

@ -6,6 +6,7 @@ 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;
@ -18,21 +19,23 @@ import com.safemobile.lib.Msg;
import com.safemobile.lib.R;
import com.safemobile.lib.SM;
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, ArrayList<Boolean> dispatcherPositions, ArrayList<Boolean> ackPositions) {
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 ConversationGridViewAdapter(Activity activity, ArrayList<Msg> listMessages, Context context, long sc_id, int unit_type, ArrayList<Boolean> dispatcher_positions, ArrayList<Boolean> ackPositions) {
this.activity = activity;
this.listMessages = listMessages;
this.dispatcherPositions = dispatcherPositions;
this.ackPositions = ackPositions;
this.dispatcher_positions = dispatcher_positions;
this.ackPositions = ackPositions;
}
@Override
public int getCount() {
return listMessages.size();
@ -48,230 +51,149 @@ public class ConversationGridViewAdapter extends BaseAdapter {
return 0;
}
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;
}
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 inflater = activity.getLayoutInflater();
if (convertView == null) {
LayoutInflater inflator = activity.getLayoutInflater();
if(convertView==null)
{
view = new ViewHolder();
convertView = inflater.inflate(R.layout.row_conversation, null);
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 = 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 {
}
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.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.isEmpty())
switch (Boolean.TRUE.equals(ackPositions.get(position)) ? 1 : 0) {
case 0:
// show not ack
view.getTextViewNotACK().setVisibility(View.VISIBLE);
view.getImageAck().setVisibility(View.VISIBLE);
break;
case 1:
// show not ack
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 (Boolean.TRUE.equals(dispatcherPositions.get(position)) ? 1 : 0) {
case 1:
view.getLayoutReceived().setVisibility(View.GONE);
view.getLayoutSend().setVisibility(View.VISIBLE);
break;
//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));
if(ackPositions.size() > 0)
switch(ackPositions.get(position) ? 1: 0) {
case 0:
view.getLayoutReceived().setVisibility(View.VISIBLE);
view.getLayoutSend().setVisibility(View.GONE);
// show not ack
view.textViewNotACK.setVisibility(View.VISIBLE);
view.imageAck.setVisibility(View.VISIBLE);
break;
default:
throw new IllegalStateException("Unexpected value: " + (Boolean.TRUE.equals(dispatcherPositions.get(position)) ? 1 : 0));
}
} catch (Exception ex) {
case 1:
// show not ack
view.textViewNotACK.setVisibility(View.INVISIBLE);
view.imageAck.setVisibility(View.INVISIBLE);
}
switch(dispatcher_positions.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;
int i = 0;
for (Msg msg : listMessages) {
if (msg.seqID.equals(seqID))
public void setACK(String seqID)
{
int position = -1, i=0;
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;
int i = 0;
for (Msg msg : listMessages) {
if (msg.seqID.equals(seqID))
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) {
if(position != -1 && hash.size() > position)
{
SM.Debug("POSITON : " + position);
View con = hash.get(position);
ViewHolder view = null;
if (con != null) {
view = (ViewHolder) con.getTag();
}
switch (Boolean.TRUE.equals(ackPositions.get(position)) ? 1 : 0) {
ViewHolder view = (ViewHolder) con.getTag();
switch(ackPositions.get(position) ? 1 : 0)
{
case 1:
if (view != null) {
view.getImageAck().setVisibility(View.INVISIBLE);
view.getTextViewNotACK().setVisibility(View.INVISIBLE);
}
view.imageAck.setVisibility(View.INVISIBLE);
view.textViewNotACK.setVisibility(View.INVISIBLE);
break;
case 0:
if (view != null) {
view.getImageAck().setVisibility(View.VISIBLE);
view.getTextViewNotACK().setVisibility(View.VISIBLE);
}
view.imageAck.setVisibility(View.VISIBLE);
view.textViewNotACK.setVisibility(View.VISIBLE);
break;
default:
throw new IllegalStateException("Unexpected value: " + (Boolean.TRUE.equals(ackPositions.get(position)) ? 1 : 0));
}
}
}

View File

@ -5,6 +5,7 @@ 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;
@ -17,16 +18,20 @@ import com.safemobile.lib.Msg;
import com.safemobile.lib.R;
import com.safemobile.lib.SM;
public class MessagesGridViewAdapter extends BaseAdapter {
private final ArrayList<Msg> listMessages;
private final Activity activity;
public MessagesGridViewAdapter(Activity activity, ArrayList<Msg> listMessages) {
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 MessagesGridViewAdapter(Activity activity, ArrayList<Msg> listMessages, Context context) {
super();
this.activity = activity;
this.listMessages = listMessages;
}
@Override
public int getCount() {
return listMessages.size();
@ -42,58 +47,86 @@ public class MessagesGridViewAdapter extends BaseAdapter {
return 0;
}
public static class ViewHolder {
public static class ViewHolder
{
public ImageView imgViewContact;
public TextView txtViewContact;
public TextView txtViewDateTime;
public TextView txtViewLastMsg;
public LinearLayout layoutMessage;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
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 = 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);
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);
convertView.setTag(view);
} else {
}
else
{
view = (ViewHolder) convertView.getTag();
}
try {
try
{
view.imgViewContact.setImageResource(listMessages.get(position).from.getLargeIcon());
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)));
//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) + "...");
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

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

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

Binary file not shown.

After

Width:  |  Height:  |  Size: 16 KiB

View File

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

View File

@ -1,14 +1,13 @@
<?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"
android:background="#ffffff"
android:paddingTop="5dp"
android:paddingBottom="5dp">
<LinearLayout
android:id="@+id/layoutSend"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical"
android:background="#ffffff"
android:paddingTop="5dp"
android:paddingBottom="5dp">
<LinearLayout
android:id="@+id/layoutSend"
android:layout_height="wrap_content"
android:layout_width="fill_parent"
android:paddingRight="13dp"
@ -20,151 +19,147 @@
android:background="#ffffff"
android:layout_marginLeft="5dp"
android:layout_weight="0">
<ImageView
android:id="@+id/imageViewSenderIco"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:src="@drawable/ambulance_large"
android:adjustViewBounds="true"
android:scaleType="center"
android:background="#ffffff"
android:layout_margin="3dp"
android:layout_gravity="top"
android:layout_weight="0" />
<ImageView
android:id="@+id/imageViewSenderIco"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:src="@drawable/ambulance_large"
android:adjustViewBounds="true"
android:scaleType="center"
android:background="#ffffff"
android:layout_margin="3dp"
android:layout_gravity="top"
android:layout_weight="0" />
</LinearLayout>
<LinearLayout
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_marginLeft="10dp"
android:layout_marginRight="10dp"
android:padding="5dp"
android:layout_gravity="center_vertical"
android:background="@layout/row_conversation_style_send"
android:orientation="vertical"
android:layout_weight="1" >
<LinearLayout
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_marginLeft="10dp"
android:layout_marginRight="10dp"
android:padding="5dp"
android:layout_gravity="center_vertical"
android:background="@layout/row_conversation_style_send"
android:orientation="vertical"
android:layout_weight="1" >
<TextView
android:id="@+id/textViewSendMsg"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="Medium Text"
android:textColor="#000000"
android:textSize="16dp" />
<RelativeLayout
android:layout_width="fill_parent"
android:layout_height="wrap_content">
<ImageView
android:id="@+id/imageAck"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:adjustViewBounds="true"
android:scaleType="center"
android:paddingTop="2dp"
android:src="@drawable/exclamation_small"
android:layout_weight="0"
android:visibility="invisible"
tools:ignore="DuplicateIds" />
<TextView
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"
tools:ignore="DuplicateIds" />
<TextView
android:id="@+id/textViewSendDate"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="right"
android:text="Small Text"
android:textColor="#4c4c4c"
android:textSize="13dp"
android:layout_alignParentRight="true"/>
</RelativeLayout>
</LinearLayout>
<TextView
android:id="@+id/textViewSendMsg"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="Medium Text"
android:textColor="#000000"
android:textSize="16dp" />
<RelativeLayout
android:layout_width="fill_parent"
android:layout_height="wrap_content">
<ImageView
android:id="@+id/imageAckSendMsg"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:adjustViewBounds="true"
android:scaleType="center"
android:paddingTop="2dp"
android:src="@drawable/exclamation_small"
android:layout_weight="0"
android:visibility="invisible"/>
<TextView
android:id="@+id/textViewNotACKSendMsg"
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" />
<TextView
android:id="@+id/textViewSendDate"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="right"
android:text="Small Text"
android:textColor="#4c4c4c"
android:textSize="13dp"
android:layout_alignParentRight="true"/>
</RelativeLayout>
</LinearLayout>
</LinearLayout>
<LinearLayout
<LinearLayout
android:layout_height="wrap_content"
android:layout_width="fill_parent"
android:paddingLeft="13dp"
android:layout_weight="0"
android:orientation="horizontal"
android:id="@+id/layoutReceived">
<LinearLayout
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_marginLeft="10dp"
android:layout_marginRight="10dp"
android:padding="5dp"
android:layout_gravity="center_vertical"
android:background="@layout/row_conversation_style_rec"
android:orientation="vertical"
android:layout_weight="1" >
<LinearLayout
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_marginLeft="10dp"
android:layout_marginRight="10dp"
android:padding="5dp"
android:layout_gravity="center_vertical"
android:background="@layout/row_conversation_style_rec"
android:orientation="vertical"
android:layout_weight="1" >
<TextView
android:id="@+id/textViewReceivedMsg"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="Medium Text"
android:textColor="#000000"
android:textSize="16dp" />
<RelativeLayout
android:layout_width="fill_parent"
android:layout_height="wrap_content">
<ImageView
android:id="@+id/imageAck"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:adjustViewBounds="true"
android:scaleType="center"
android:paddingTop="2dp"
android:src="@drawable/exclamation_small"
android:layout_weight="0"
android:visibility="invisible"
tools:ignore="DuplicateIds" />
<TextView
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"
tools:ignore="DuplicateIds" />
<TextView
android:id="@+id/textViewReceivedDate"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="right"
android:text="Small Text"
android:textColor="#4c4c4c"
android:textSize="13dp"
android:layout_alignParentRight="true"/>
</RelativeLayout>
</LinearLayout>
<LinearLayout
<TextView
android:id="@+id/textViewReceivedMsg"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="Medium Text"
android:textColor="#000000"
android:textSize="16dp" />
<RelativeLayout
android:layout_width="fill_parent"
android:layout_height="wrap_content">
<ImageView
android:id="@+id/imageAckReceiveMsg"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:adjustViewBounds="true"
android:scaleType="center"
android:paddingTop="2dp"
android:src="@drawable/exclamation_small"
android:layout_weight="0"
android:visibility="invisible"/>
<TextView
android:id="@+id/textViewNotACKReceiveMsg"
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"/>
<TextView
android:id="@+id/textViewReceivedDate"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="right"
android:text="Small Text"
android:textColor="#4c4c4c"
android:textSize="13dp"
android:layout_alignParentRight="true"/>
</RelativeLayout>
</LinearLayout>
<LinearLayout
android:layout_height="wrap_content"
android:layout_width="wrap_content"
android:background="#ffffff"
android:layout_marginRight="5dp"
android:layout_weight="0">
<ImageView
android:id="@+id/imageViewReceivedIco"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:adjustViewBounds="true"
android:scaleType="center"
android:src="@drawable/error"
android:background="#ffffff"
android:layout_margin="3dp"
android:layout_weight="0"
android:layout_gravity="top"
/>
</LinearLayout>
<ImageView
android:id="@+id/imageViewReceivedIco"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:adjustViewBounds="true"
android:scaleType="center"
android:src="@drawable/error"
android:background="#ffffff"
android:layout_margin="3dp"
android:layout_weight="0"
android:layout_gravity="top"
/>
</LinearLayout>
</LinearLayout>
</LinearLayout>

View File

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

@ -1,5 +0,0 @@
<?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.

Before

Width:  |  Height:  |  Size: 1.6 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.8 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.4 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1020 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.0 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.0 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.3 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.7 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 5.1 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.8 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.4 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 8.3 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 5.4 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 6.3 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 12 KiB

View File

@ -1,36 +1,14 @@
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.safedispatch"
applicationId "com.safemobile.dispatch"
minSdkVersion 21
targetSdkVersion 31
versionName androidGitVersion.name()
versionCode androidGitVersion.code()
archivesBaseName = "SafeDispatchMobile_v.$versionName"
}
buildTypes {
@ -42,13 +20,6 @@ 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')
@ -78,4 +49,6 @@ dependencies {
// add Gson
implementation 'com.google.code.gson:gson:2.8.6'
//retrofit
}

View File

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

Binary file not shown.

Before

Width:  |  Height:  |  Size: 18 KiB

View File

@ -0,0 +1,259 @@
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.VehHashbySc_id.get(alarm.sc_id) == null ? "null" : parentTab.VehHashbySc_id.get(alarm.sc_id).name ));
if (parentTab.VehHashbySc_id.get(alarm.sc_id)!=null)
alarm.unitName = parentTab.VehHashbySc_id.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.sendAlarmAcknoledge(idx, type);
}
}

View File

@ -0,0 +1,93 @@
package com.safemobile.dispatch;
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.SuperVehicle;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
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 final Hashtable<Long, SuperVehicle> superVehHash;
private final Context context;
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);
}
@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;
try {
key = Long.parseLong(marker.getTitle());
} catch (Exception ex) {
Log.v(TAG, "Unable to parse Google Maps Info Bubble title");
}
SuperVehicle vehicle = superVehHash.get(key);
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 = new Date(vehicle.timeGMT);
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));
tvSpeed.setText(String.format(context.getResources().getString(R.string.speedMph), vehicle.speed));
String address = vehicle.Address != null ? vehicle.Address : "";
tvStreetView.setText(address);
streetView.setVisibility(address.length() > 0 ? View.VISIBLE : View.GONE);
tvStreetView.setVisibility(address.length() > 0 ? View.VISIBLE : View.GONE);
tvUnitName.setText(vehicle.name);
tvGPSLocation.setText("[" + String.format("%.4f", vehicle.lat)
+ "," + String.format("%.4f",vehicle.lng) + "]");
}
}

View File

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

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

View File

@ -1,4 +1,4 @@
package com.safemobile.safedispatch;
package com.safemobile.dispatch;
import android.app.Activity;
import android.app.AlertDialog;
@ -39,7 +39,6 @@ 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;
@ -89,7 +88,7 @@ public class LiveActivity extends AbstractLiveActivity implements OnMapReadyCall
private boolean isAck = false;
private boolean showVehicle = true;
private int contextMenuPosition;
private int vehStatus, lastItemClicked;
private int vehStatus;
private int position; // vehStatus = vehicle status received from apps
/* Live Vehicle GridView */
@ -103,7 +102,6 @@ public class LiveActivity extends AbstractLiveActivity implements OnMapReadyCall
//value poll
private double latPoll = 0;
private double lngPoll = 0;
private ArrayList<Marker> markers = new ArrayList<>();
@Override
@ -113,7 +111,7 @@ public class LiveActivity extends AbstractLiveActivity implements OnMapReadyCall
// get parentTab
setParentTab((AbstractSDParentActivity) getParent());
try {
((TabLayoutActivity) getParentTab()).setLiveActivity(this);
((TabLayoutActivity) getParentTab()).liveActivity = this;
} catch (Exception ignored) {
// ignored
}
@ -146,11 +144,11 @@ public class LiveActivity extends AbstractLiveActivity implements OnMapReadyCall
// image View for changing map type satellite or map
ImageView changeMapTypeImageView = findViewById(R.id.changeMapType);
changeMapTypeImageView.setOnClickListener(v -> {
if (googleMap.getMapType() != GoogleMap.MAP_TYPE_SATELLITE) {
changeMapTypeImageView.setImageResource(R.drawable.map);
if (googleMap.getMapType() == GoogleMap.MAP_TYPE_SATELLITE) {
changeMapTypeImageView.setImageResource(R.drawable.satellite);
googleMap.setMapType(GoogleMap.MAP_TYPE_SATELLITE);
} else {
changeMapTypeImageView.setImageResource(R.drawable.satellite);
changeMapTypeImageView.setImageResource(R.drawable.map);
googleMap.setMapType(GoogleMap.MAP_TYPE_NORMAL);
}
});
@ -176,12 +174,12 @@ public class LiveActivity extends AbstractLiveActivity implements OnMapReadyCall
if (AppParams.DEMO) {
disabledVehicles = new ArrayList<>();
for (Vehicle veh : getParentTab().getAllVehicle())
for (Vehicle veh : getParentTab().allVehicle)
disabledVehicles.add(!veh.status);
}
adapter = new VehiclesGridViewAdapter(activity, context, getParentTab().getAllVehicle(), disabledVehicles);
adapter = new VehiclesGridViewAdapter(activity, context, getParentTab().allVehicle, disabledVehicles);
adapter.notifyDataSetChanged();
gridVehicle.setAdapter(adapter);
@ -232,9 +230,9 @@ public class LiveActivity extends AbstractLiveActivity implements OnMapReadyCall
else
viewLive.imgViewChecked.setImageResource(R.drawable.unchecked);
Enumeration<Long> keyList = getParentTab().getSuperVehHash().keys();
Enumeration<Long> keyList = getParentTab().SuperVehHash.keys();
while (keyList.hasMoreElements()) {
(Objects.requireNonNull(getParentTab().getSuperVehHash().get(keyList.nextElement()))).needUpdate = true;
(Objects.requireNonNull(getParentTab().SuperVehHash.get(keyList.nextElement()))).needUpdate = true;
}
// change button title
@ -255,7 +253,7 @@ public class LiveActivity extends AbstractLiveActivity implements OnMapReadyCall
}
// refresh UI
displayVehicle(LAT_OUTLIMIT, LNG_OUTLIMIT);
displayVehicle(true, LAT_OUTLIMIT, LNG_OUTLIMIT);
});
displayButton = findViewById(R.id.buttonDisplay);
@ -268,9 +266,9 @@ public class LiveActivity extends AbstractLiveActivity implements OnMapReadyCall
for (int i = 0; i < displayedVehicles.size(); i++)
displayedVehicles.set(i, true);
Enumeration<Long> keyList = getParentTab().getSuperVehHash().keys();
Enumeration<Long> keyList = getParentTab().SuperVehHash.keys();
while (keyList.hasMoreElements())
(Objects.requireNonNull(getParentTab().getSuperVehHash().get(keyList.nextElement()))).needUpdate = true;
(Objects.requireNonNull(getParentTab().SuperVehHash.get(keyList.nextElement()))).needUpdate = true;
// change button title
if (displayButton.getText().toString().equals(getString(R.string.displayAll))) {
@ -286,21 +284,16 @@ public class LiveActivity extends AbstractLiveActivity implements OnMapReadyCall
}
// refresh UI
displayVehicle(LAT_OUTLIMIT, LNG_OUTLIMIT);
displayVehicle(true, LAT_OUTLIMIT, LNG_OUTLIMIT);
});
// display Vehicles
displayVehicle(LAT_OUTLIMIT, LNG_OUTLIMIT);
displayVehicle(true, LAT_OUTLIMIT, LNG_OUTLIMIT);
// register to receive broadcasts
registerBroadcastIntents();
}
public void setLanguage() {
TextView textView = findViewById(R.id.unit_name);
textView.setText(R.string.unitName);
}
/**
* Manipulates the map once available.
* This callback is triggered when the map is ready to be used.
@ -313,9 +306,12 @@ public class LiveActivity extends AbstractLiveActivity implements OnMapReadyCall
@Override
public void onMapReady(@NonNull GoogleMap googleMap) {
this.googleMap = googleMap;
GoogleMapsInfoBubble infoBubble = new GoogleMapsInfoBubble(getLayoutInflater(), this, getParentTab().getSuperVehHash());
GoogleMapsInfoBubble infoBubble = new GoogleMapsInfoBubble(getLayoutInflater(), this, getParentTab().SuperVehHash);
this.googleMap.setInfoWindowAdapter(infoBubble);
this.googleMap.getUiSettings().setMapToolbarEnabled(false);
// 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));
}
@ -378,7 +374,7 @@ public class LiveActivity extends AbstractLiveActivity implements OnMapReadyCall
// clear previous vehicles
SM.Debug("onResume");
displayVehicle(LAT_OUTLIMIT, LNG_OUTLIMIT);
displayVehicle(true, LAT_OUTLIMIT, LNG_OUTLIMIT);
}
final Runnable cancelLoadingDialogRUN = LiveActivity.this::cancelLoadingDialog;
@ -433,7 +429,7 @@ public class LiveActivity extends AbstractLiveActivity implements OnMapReadyCall
// send change to AppServer
optionForUnit(radioCode, MENU_POLL, liveVehicle.get(contextMenuPosition).id + "");
if (AppParams.DEMO) {
getParentTab().setImei(liveVehicle.get(contextMenuPosition).sc_id + "");
getParentTab().imei = liveVehicle.get(contextMenuPosition).sc_id + "";
getParentTab().updateDemoPosition();
getParentTab().updateResultsPollInUi("realpha");
}
@ -447,13 +443,13 @@ public class LiveActivity extends AbstractLiveActivity implements OnMapReadyCall
});
}
public void displayVehicle(double latZoom, double lngZoom) {
public void displayVehicle(boolean withZoom, double latZoom, double lngZoom) {
if (googleMap != null) {
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));
SuperVehicle tmpSuper = getParentTab().SuperVehHash.get(Long.valueOf(liveVehicle.get(i).imei));
if (tmpSuper != null) {
LatLng newLocation = new LatLng(tmpSuper.lat, tmpSuper.lng);
@ -462,20 +458,17 @@ public class LiveActivity extends AbstractLiveActivity implements OnMapReadyCall
BitmapDescriptor markerIcon = getProperBitmap(tmpSuper.getLargeIcon(), tmpSuper.name);
markerOptions.icon(markerIcon);
Marker marker = this.googleMap.addMarker(markerOptions);
if (i == lastItemClicked) {
marker.showInfoWindow();
googleMap.moveCamera(CameraUpdateFactory.newLatLngZoom(newLocation, 14));
}
markers.add(marker);
this.googleMap.addMarker(markerOptions);
}
}
}
}
}
public void showOpenedBalloon(boolean demo) {
//TODO: add show balloon
}
private BitmapDescriptor getProperBitmap(int largeIcon, String text) {
Bitmap bitmap = BitmapFactory.decodeResource(getResources(), largeIcon);
Bitmap textBitmap = getTextAsDrawable(this, text);
@ -650,7 +643,7 @@ public class LiveActivity extends AbstractLiveActivity implements OnMapReadyCall
}
// Create runnable for posting
final Runnable updateMapResults = () -> displayVehicle(LAT_OUTLIMIT, LNG_OUTLIMIT);
final Runnable updateMapResults = () -> displayVehicle(false, LAT_OUTLIMIT, LNG_OUTLIMIT);
// Create runnable for posting
final Runnable updatePollResults = () -> {
@ -660,7 +653,7 @@ public class LiveActivity extends AbstractLiveActivity implements OnMapReadyCall
adapter.changeDisplayed(position, true);
}
displayVehicle(latPoll, lngPoll); };
displayVehicle(true, latPoll, lngPoll); };
// Create runnable for posting
final Runnable updateOptionsRUN = this::updateOptionsUI;
@ -678,9 +671,8 @@ public class LiveActivity extends AbstractLiveActivity implements OnMapReadyCall
* @param view View in which will do the modifications
*/
private void itemClick(int position, View view) {
lastItemClicked = position;
// change displayed state
displayedVehicles.set(position, !displayedVehicles.get(position));
displayedVehicles.set(position, !Boolean.TRUE.equals(displayedVehicles.get(position)));
// change in the adapter
adapter.changeDisplayed(position, displayedVehicles.get(position));
@ -688,30 +680,30 @@ public class LiveActivity extends AbstractLiveActivity implements OnMapReadyCall
// change check image for selected value
VehiclesGridViewAdapter.ViewHolder viewLive = (VehiclesGridViewAdapter.ViewHolder) view.getTag();
if (displayedVehicles.get(position))
if (Boolean.TRUE.equals(displayedVehicles.get(position)))
viewLive.imgViewChecked.setImageResource(R.drawable.checked);
else
viewLive.imgViewChecked.setImageResource(R.drawable.unchecked);
// check if all values are identical
boolean allDisplayed = true;
for (Boolean displayed : displayedVehicles)
if (!displayed) {
allDisplayed = false;
boolean identical = true;
for (Boolean displ : displayedVehicles)
if (!Objects.equals(displ, displayedVehicles.get(0))) {
identical = false;
break;
}
// change image when all values are identical
if (allDisplayed) {
if (identical && Boolean.TRUE.equals(displayedVehicles.get(0))) {
imageViewCheckAll.setSelected(true);
imageViewCheckAll.setBackgroundResource(R.drawable.check_all);
} else {
} else if (identical && Boolean.TRUE.equals(!displayedVehicles.get(0))) {
imageViewCheckAll.setSelected(false);
imageViewCheckAll.setBackgroundResource(R.drawable.uncheck_all);
}
// display vehicle
displayVehicle(LAT_OUTLIMIT, LNG_OUTLIMIT);
displayVehicle(true, LAT_OUTLIMIT, LNG_OUTLIMIT);
}
/**
@ -789,9 +781,4 @@ public class LiveActivity extends AbstractLiveActivity implements OnMapReadyCall
}
}
};
@Override
public GoogleMap getMap() {
return googleMap;
}
}

View File

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

View File

@ -0,0 +1,871 @@
/*
* 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.imei = 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.allVehicle);
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.allVehicle);
//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

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

File diff suppressed because it is too large Load Diff

View File

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

File diff suppressed because it is too large Load Diff

View File

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

View File

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

File diff suppressed because it is too large Load Diff

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@ -1,246 +0,0 @@
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);
gridView.setNestedScrollingEnabled(true);
adapter = new AlertGridViewAdapter(this, getAllAlarms(), context, acknowledged);
gridView.setAdapter(adapter);
gridView.setOnItemClickListener(onItemClickListener);
// change tab header fontFace
TextView textView1 = findViewById(R.id.textView1);
textView1.setTypeface(Typeface.createFromAsset(getAssets(), "Sketch_Block.ttf"));
textView1.setTextSize(24);
getParentTab().setAlarmActivity(this);
}
@Override
public void onBackPressed() {
AlertDialog.Builder builder = new AlertDialog.Builder(this);
builder.setMessage(getString(R.string.exit))
.setCancelable(false)
.setNeutralButton(getString(R.string.logout), (dialog, id) -> getParentTab().whenBackPressed(AppParams.ActivityResult.logout))
.setPositiveButton(getString(R.string.ext), (dialog, id) -> getParentTab().whenBackPressed(AppParams.ActivityResult.exit))
.setNegativeButton(getString(R.string.cancel), (dialog, id) -> dialog.cancel());
AlertDialog alert = builder.create();
alert.show();
}
@Override
public void onPause() {
super.onPause();
SM.Debug("onPause");
}
@Override
public void onResume() {
super.onResume();
if (!AppParams.DEMO)
getAlarms();
else {
for (int i = getAllAlarms().size() - 1; i >= 0; i--) {
Alarm alarm = getAllAlarms().get(i);
if (alarm.ack == 1)
getAllAlarms().remove(i);
}
acknowledged = new ArrayList<>();
for (int i = 0; i < getAllAlarms().size(); i++)
acknowledged.add(false);
updateResultsInUi(ALARM);
}
SM.Debug("onResume");
}
private final OnItemClickListener onItemClickListener = new OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> arg0, View arg1, int position,
long arg3) {
SM.Debug(" ### CLICK Alarm : " + position);
setConvertViewAlarm(arg1);
// save position
ackPosition = position;
if (!AppParams.DEMO) {
getParentTab().getAlarms(AppParams.USERID);
setACK(getAllAlarms().get(position).idx, getAllAlarms().get(position).type, getAllAlarms().get(position).unitName);
acknowledged.set(position, true);
updateResultsInUi(ALARM);
} 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);
int position = gridView.getFirstVisiblePosition();
gridView.setAdapter(adapter);
gridView.setSelection(position);
} else {
adapter.changeACK(ackPosition);
SM.Debug("Set ACK: " + ackPosition + " | " + (Boolean.TRUE.equals(acknowledged.get(ackPosition)) ? "true" : "false"));
ViewHolder viewAlarm;
viewAlarm = (ViewHolder) getConvertViewAlarm().getTag();
switch (Boolean.TRUE.equals(acknowledged.get(ackPosition)) ? 1 : 0) {
case 1:
viewAlarm.imageViewAlert.setImageResource(R.drawable.alert_off);
break;
case 0:
viewAlarm.imageViewAlert.setImageResource(R.drawable.siren);
break;
default:
throw new IllegalStateException("Unexpected value: " + (Boolean.TRUE.equals(acknowledged.get(ackPosition)) ? 1 : 0));
}
}
}
// update ACK received from AppServer
public void updateACK() {
myHandler.post(updateAckRUN);
}
// Create runnable for posting
final Runnable updateAckRUN = () -> {
SM.Debug(" updateACK: ");
updateResultsInUi("adapter");
};
// send to AppServer
private void getAlarms() {
getParentTab().executeNetworkStuff(new String[]{OperationCodes.GetAlarms + "", AppParams.USERID + ""});
}
public TabLayoutActivity getParentTab() {
return parentTab;
}
public void setParentTab(TabLayoutActivity parentTab) {
this.parentTab = parentTab;
}
public ArrayList<Alarm> getAllAlarms() {
return allAlarms;
}
public void setAllAlarms(ArrayList<Alarm> allAlarms) {
this.allAlarms = allAlarms;
}
public View getConvertViewAlarm() {
return convertViewAlarm;
}
public void setConvertViewAlarm(View convertViewAlarm) {
this.convertViewAlarm = convertViewAlarm;
}
public Bundle getSavedInstanceState() {
return savedInstanceState;
}
public void setSavedInstanceState(Bundle savedInstanceState) {
this.savedInstanceState = savedInstanceState;
}
}

View File

@ -1,171 +0,0 @@
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;
import java.util.concurrent.TimeUnit;
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;
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.parseInt(marker.getTitle());
} catch (Exception e) {
Log.v(TAG, "Unable to parse Google Maps Info Bubble title on History");
}
}
RelativeLayout rlMapInfoBubbleInfo = view.findViewById(R.id.rlMapInfoBubbleInfo);
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;
long timeGMT = 0;
String speed, address, gpsLocation, name = "";
if (isLiveTab) {
SuperVehicle vehicle = superVehHash.get(key);
//positionTime = new Date((new Date()).getTime() - vehicle.timeGMT);
timeGMT = vehicle.timeGMT;
address = vehicle.Address != null ? vehicle.Address : "";
name = vehicle.name;
speed = String.format(context.getResources().getString(R.string.speedMph), (int)(0.621371192 * vehicle.speed));
gpsLocation = "[" + String.format("%.4f", vehicle.lat) + "," + String.format("%.4f",vehicle.lng) + "]";
} else {
HistPos histPos = histPosList.get(position);
//positionTime = new Date((new Date()).getTime() - histPos.timeGMT);
timeGMT = histPos.timeGMT;
address = histPos.Address != null ? histPos.Address : "";
speed = String.format(context.getResources().getString(R.string.speedMph), (int)(0.621371192 * histPos.speed));
gpsLocation = "[" + String.format("%.4f", histPos.lat) + "," + String.format("%.4f",histPos.lng) + "]";
}
//String timeFormat = isMilitaryTime
// ? "HH:mm:ss dd.MMM.yyyy"
// : "hh:mm:ss a dd.MMM.yyy";
//DateFormat format = new SimpleDateFormat(timeFormat, Locale.ENGLISH);
//tvTimeAgo.setText(format.format(positionTime));
DateFormat format = new SimpleDateFormat("hh:mm:ss", Locale.ENGLISH);
tvTimeAgo.setText( getDateTimeAgo(timeGMT * 1000) + " [" + format.format(new Date(timeGMT*1000) ) + "]");
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);
}
/// <summary>
/// Get a text representation for the date time representing
/// the difference in minutes/hours/days from now
/// </summary>
/// <param name="utcTime">DateTime value which needs to be converted</param>
/// <returns>String 'Ago' representation fot he date</returns>
public static String getDateTimeAgo(long time)
{
String timeValue = "";
long diffInMs = (new Date().getTime() - time);
long secondsDifference = TimeUnit.MILLISECONDS.toSeconds(diffInMs);;
if (secondsDifference < 60)
timeValue = "less than 1 minute";
else if (secondsDifference < 3600)
timeValue = (secondsDifference / 60) + " minute" + ((secondsDifference / 60) > 1 ? "s" : "") + " ago";
else if (secondsDifference < 7200)
timeValue = "1 hour ago";
else if (secondsDifference < 86400)
{
timeValue = (secondsDifference / 3600) + " hours ago";
}
else
{
timeValue = (secondsDifference / 86400) + " days ago";
}
return timeValue;
}
}

View File

@ -1,295 +0,0 @@
package com.safemobile.safedispatch;
import androidx.annotation.NonNull;
import androidx.appcompat.app.AppCompatActivity;
import android.app.AlertDialog;
import android.app.DatePickerDialog;
import android.app.Dialog;
import android.graphics.Color;
import android.graphics.drawable.ColorDrawable;
import android.os.Bundle;
import android.os.Handler;
import android.util.Log;
import android.view.View;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.Spinner;
import android.widget.TextView;
import com.google.android.gms.maps.CameraUpdateFactory;
import com.google.android.gms.maps.GoogleMap;
import com.google.android.gms.maps.OnMapReadyCallback;
import com.google.android.gms.maps.SupportMapFragment;
import com.google.android.gms.maps.model.BitmapDescriptor;
import com.google.android.gms.maps.model.BitmapDescriptorFactory;
import com.google.android.gms.maps.model.LatLng;
import com.google.android.gms.maps.model.MarkerOptions;
import com.google.android.gms.maps.model.PolylineOptions;
import com.safemobile.lib.AppParams;
import com.safemobile.lib.HistPos;
import com.safemobile.lib.OperationCodes;
import com.safemobile.lib.SM;
import com.safemobile.lib.Vehicle;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.Locale;
public class HistoryActivity extends AppCompatActivity implements OnMapReadyCallback {
public Bundle savedInstanceState;
private TabLayoutActivity parentTab;
private GoogleMap googleMap;
private Spinner spinnerVehicle;
private Button displayButton;
private Date startDate, endDate;
private final Handler myHandler = new Handler();
private GoogleMapsInfoBubble infoBubble;
private final ArrayList<Vehicle> allVehicle = new ArrayList<>();
private final ArrayList<String> allVehicleNames = new ArrayList<>();
private final SimpleDateFormat sdf = new SimpleDateFormat("MMMM dd yyyy");
private boolean showVehicles = true;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
this.savedInstanceState = savedInstanceState;
setContentView(R.layout.tabhistory);
parentTab = (TabLayoutActivity) getParent();
parentTab.setHistoryActivity(this);
Locale locale = new Locale(AppParams.LANGUAGETMP);
Locale.setDefault(locale);
SupportMapFragment mapFragment = (SupportMapFragment) getSupportFragmentManager()
.findFragmentById(R.id.map);
if (mapFragment != null)
mapFragment.getMapAsync(this);
spinnerVehicle = findViewById(R.id.spinnerVehicle);
getVehicles();
ArrayAdapter<String> adapter = new ArrayAdapter<>(this, android.R.layout.simple_spinner_item, allVehicleNames);
adapter.setDropDownViewResource(android.R.layout.simple_dropdown_item_1line);
spinnerVehicle.setAdapter(adapter);
spinnerVehicle.setSelection(0);
changeMapType();
changeTraffic();
displayButton = findViewById(R.id.buttonDisplay);
displayButton.setOnClickListener(view -> {
googleMap.clear();
if (!AppParams.DEMO) {
parentTab.setDropAllData(false);
parentTab.setFirstHistoryData(true);
parentTab.clearHistoryMessageList();
parentTab.clearHistoryPositionList();
// request history
parentTab.executeNetworkStuff(new String[] {OperationCodes.GetHistoryPositions + "", allVehicle.get(spinnerVehicle.getSelectedItemPosition()).sc_id + "",
(startDate.getTime()/ 1000L) + "", (endDate.getTime()/ 1000L) + ""});
} else {
parentTab.demoPositionsList();
displayHistory(parentTab.getDemoPositions());
}
});
ImageView mapType = findViewById(R.id.changeMapTypeHeader);
mapType.setOnClickListener(view -> {
if (googleMap.getMapType() != GoogleMap.MAP_TYPE_SATELLITE) {
mapType.setImageResource(R.drawable.map);
googleMap.setMapType(GoogleMap.MAP_TYPE_SATELLITE);
} else {
mapType.setImageResource(R.drawable.satellite);
googleMap.setMapType(GoogleMap.MAP_TYPE_NORMAL);
}
});
LinearLayout slideLayout = findViewById(R.id.slidelayout);
LinearLayout linearLayoutVehicles = findViewById(R.id.layoutBig);
ImageView slideLayoutImageView = findViewById(R.id.slideLayoutImage);
slideLayout.setOnClickListener(v -> {
if (showVehicles) {
linearLayoutVehicles.setVisibility(View.GONE);
slideLayoutImageView.setImageResource(R.drawable.arrow_right);
showVehicles = false;
} else {
linearLayoutVehicles.setVisibility(View.VISIBLE);
slideLayoutImageView.setImageResource(R.drawable.arrow_left);
showVehicles = true;
}
});
setDate();
}
public void setLanguage() {
TextView labelVehicle = findViewById(R.id.labelVehicle);
TextView labelStartDate = findViewById(R.id.labelStartDate);
TextView labelEndDate = findViewById(R.id.labelEndDate);
labelVehicle.setText(R.string.vehicle);
labelStartDate.setText(R.string.startDate);
labelEndDate.setText(R.string.endDate);
displayButton.setText(R.string.display);
}
private void displayHistory(ArrayList<HistPos> positions) {
LatLng latLng = null;
PolylineOptions polylineOptions = new PolylineOptions();
BitmapDescriptor markerIcon = BitmapDescriptorFactory.fromResource(R.drawable.history_pin);
for (int i = 0; i < positions.size(); i++) {
HistPos pos = positions.get(i);
if (pos.speed > 0) {
latLng = new LatLng(pos.lat, pos.lng);
polylineOptions.add(latLng);
googleMap.addMarker(new MarkerOptions()
.position(latLng)
.icon(markerIcon)
.title(String.valueOf(i)));
}
}
googleMap.addPolyline(polylineOptions);
if (latLng != null)
googleMap.moveCamera(CameraUpdateFactory.newLatLngZoom(latLng, 14));
}
@Override
public void onBackPressed() {
AlertDialog.Builder builder = new AlertDialog.Builder(this);
builder.setMessage(getString(R.string.exit))
.setCancelable(false)
.setNeutralButton(getString(R.string.logout), (dialog, id) -> parentTab.whenBackPressed(AppParams.ActivityResult.logout))
.setPositiveButton(getString(R.string.ext), (dialog, id) -> parentTab.whenBackPressed(AppParams.ActivityResult.exit))
.setNegativeButton(getString(R.string.cancel), (dialog, id) -> dialog.cancel());
AlertDialog alert = builder.create();
alert.show();
}
private void setDate() {
Calendar calendar = Calendar.getInstance();
calendar.add(Calendar.DATE, 1);
endDate = calendar.getTime();
calendar.add(Calendar.DATE, -2);
startDate = calendar.getTime();
TextView textViewStartDate = findViewById(R.id.textViewStartDate);
TextView textViewEndDate = findViewById(R.id.textViewEndDate);
textViewStartDate.setText(sdf.format(startDate));
textViewEndDate.setText(sdf.format(endDate));
textViewStartDate.setOnClickListener(view -> openDialog(textViewStartDate, true));
textViewEndDate.setOnClickListener(view -> openDialog(textViewEndDate, false));
}
private void openDialog(TextView textView, Boolean isStartDate) {
Date date = startDate;
if (!isStartDate)
date = endDate;
Calendar calendar = Calendar.getInstance();
calendar.setTime(date);
DatePickerDialog.OnDateSetListener setListener = (datePicker, y, m, d) -> {
calendar.set(y, m, d);
String dateString = sdf.format(calendar.getTime());
textView.setText(dateString);
if (isStartDate)
startDate = calendar.getTime();
else
endDate = calendar.getTime();
};
Dialog dialog = new DatePickerDialog(this, android.R.style.Theme_Holo_Light_Dialog_MinWidth, setListener,
calendar.get(Calendar.YEAR), calendar.get(Calendar.MONTH), calendar.get(Calendar.DAY_OF_MONTH));
dialog.getWindow().setBackgroundDrawable(new ColorDrawable(Color.TRANSPARENT));
dialog.show();
}
private void changeTraffic() {
ImageView changeTrafficImageView = findViewById(R.id.changeTraffic);
changeTrafficImageView.setOnClickListener(v -> {
if (googleMap.isTrafficEnabled()) {
changeTrafficImageView.setImageResource(R.drawable.traffic_off);
googleMap.setTrafficEnabled(false);
} else {
changeTrafficImageView.setImageResource(R.drawable.traffic);
googleMap.setTrafficEnabled(true);
}
});
}
private void changeMapType() {
ImageView changeMapType = findViewById(R.id.changeMapType);
changeMapType.setOnClickListener(view -> {
if (googleMap.getMapType() == GoogleMap.MAP_TYPE_SATELLITE) {
changeMapType.setImageResource(R.drawable.satellite);
googleMap.setMapType(GoogleMap.MAP_TYPE_SATELLITE);
} else {
changeMapType.setImageResource(R.drawable.map);
googleMap.setMapType(GoogleMap.MAP_TYPE_NORMAL);
}
});
}
public void getVehicles() {
try {
allVehicle.clear();
allVehicleNames.clear();
for (Vehicle vehicle : parentTab.getAllVehicle()) {
allVehicleNames.add(vehicle.name);
allVehicle.add(vehicle);
}
} catch (Exception ignored) { }
}
final Runnable UpdateMapResults = new Runnable() {
public void run() {
Log.v("updateMap", parentTab.getHistoryPositionList().toString());
SM.Debug("Do the Display");
infoBubble.setHistoryPositions(parentTab.getHistoryPositionList());
displayHistory(parentTab.getHistoryPositionList());
}
};
public void UpdateMap() {
myHandler.post(UpdateMapResults);
SM.Debug("Do the updateMAP post");
}
public void UpdateUnableDisp() {
SM.Debug("Do Cancelwindow");
}
public void UpdateCancel() {
SM.Debug("Do Cancelwindow");
}
public void UpdateNrPos(int size) {
SM.Debug("Do Cancelwindow");
}
@Override
public void onMapReady(@NonNull GoogleMap googleMap) {
this.googleMap = googleMap;
infoBubble = new GoogleMapsInfoBubble(getLayoutInflater(), this);
this.googleMap.setInfoWindowAdapter(infoBubble);
this.googleMap.getUiSettings().setMapToolbarEnabled(false);
parentTab.demoPositionsList();
}
}

View File

@ -1,697 +0,0 @@
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.util.Log;
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 final String TAG = "MessagesActivity";
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);
// 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) -> {
Log.v(TAG, "onItemClick " + LASTMESSAGES);
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 -> {
if (editTextMsg.getText().toString().isEmpty())
return;
sendSMS(getScId(), editTextMsg.getText().toString());
Toast.makeText(context, "Sending message...", Toast.LENGTH_SHORT).show();
// disable send button and editBox
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;
Log.v(TAG, "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.setMessageActivity(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());
Log.v(TAG, "lastmessages: false");
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
Log.v(TAG, "lastmessages: false");
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,940 +0,0 @@
package com.safemobile.safedispatch;
import android.app.Activity;
import android.app.AlertDialog;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.content.res.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.ArrayAdapter;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.RadioButton;
import android.widget.RadioGroup;
import android.widget.RadioGroup.OnCheckedChangeListener;
import android.widget.TextView;
import com.safemobile.lib.AppParams;
import com.safemobile.lib.OperationCodes;
import com.safemobile.lib.SM;
import com.safemobile.lib.Vehicle;
import com.safemobile.lib.radio.Channel;
import com.safemobile.lib.radio.RadioGW;
import com.safemobile.lib.radio.Zone;
import com.safemobile.lib.radio.Zone_and_channel;
import com.safemobile.lib.sound.AudioHandle;
import java.util.ArrayList;
import java.util.Locale;
/**
* fix import
*/
public class RadioActivity extends Activity {
/* Visual Elements */
private Button buttonPTT, buttonDKey;
private RadioGroup radioGroupCallType;
private RadioButton radioAll, radioGroup, radioPrivate;
private LinearLayout layoutGateway, layoutSpinnerChannel, layoutSpinnerZone, layoutSpinnerCallType;
private TextView textViewMessageChannel, textViewMessageStatus, textViewGateway, textViewChannel, textViewZone, textViewIP, textViewCallType;
private ImageView imageViewStatus;
/* Misc */
private TabLayoutActivity parentTab;
private Context context;
private Activity activity;
private int radioID, GWID, zoneNR, chNR;
private int rStatus = 0;
private long imei = 0;
private int calltype = 0;
private int groupid = 0;
private int callstatus = 0;
/* Lists */
private ArrayList<String> allVehicleNames = new ArrayList<>();
public ArrayList<Vehicle> allVehicle = new ArrayList<>();
private final ArrayList<Integer> allGroupsIDs = new ArrayList<>();
private final ArrayList<String> allGroupsNames = new ArrayList<>();
private ArrayList<Zone> crtZones = new ArrayList<>();
private ArrayList<Channel> crtChannels = new ArrayList<>();
private final ArrayList<String> allGWsIP = new ArrayList<>();
private ArrayAdapter<String> adapter;
// Need handler for callbacks to the UI thread
private final Handler myHandler = new Handler();
public Thread audioThread;
//PTT
private AudioHandle audioH = null;
private final int ALLCall = 101, PRIVATECall = 102, GROUPCall = 103;
private int selectedID=0, selectedCallType = 101;
private Boolean pttONoff = false;
private final int inCall = 1, hangTime = 2, callEnd = 3;
private Bundle savedInstanceState;
/** Called when the activity is first created. */
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
this.savedInstanceState = savedInstanceState;
// get parentTab
parentTab = (TabLayoutActivity)getParent();
Locale locale = new Locale(AppParams.LANGUAGETMP);
Locale.setDefault(locale);
Configuration config = new Configuration();
config.locale = locale;
getBaseContext().getResources().updateConfiguration(config,
getBaseContext().getResources().getDisplayMetrics());
setContentView(R.layout.tabradio);
// get context
context = this;
activity = this;
allGroupsNames.add("1");
allGroupsNames.add("2");
allGroupsIDs.add(1);
allGroupsIDs.add(2);
//====================
// get visual elements
//====================
// get buttons
buttonPTT = findViewById(R.id.buttonPTT);
buttonDKey = findViewById(R.id.buttonDKey);
// get CallType Spinner
layoutSpinnerCallType = findViewById(R.id.layoutSpinnerCallType);
layoutSpinnerCallType.setOnClickListener(CallTypeListener);
textViewCallType = findViewById(R.id.textViewCallType);
// get status dot
imageViewStatus = findViewById(R.id.imageViewStatus);
layoutSpinnerChannel = findViewById(R.id.layoutSpinnerChannel);
layoutSpinnerChannel.setOnClickListener(ChannelChangeListener);
layoutSpinnerZone = findViewById(R.id.layoutSpinnerZone);
layoutSpinnerZone.setOnClickListener(ZoneChangeListener);
// get TextView from Spinner
textViewChannel = findViewById(R.id.textViewChannel);
textViewZone = findViewById(R.id.textViewZone);
// get IP
textViewIP = findViewById(R.id.textViewIP);
textViewIP.setText(AppParams.IP);
// get CallType
radioGroupCallType = findViewById(R.id.radioGroupCallType);
radioGroupCallType.setOnCheckedChangeListener(CallTypeChanged);
// get radio buttons
radioAll = findViewById(R.id.radioAll);
radioGroup = findViewById(R.id.radioGroup);
radioPrivate = findViewById(R.id.radioPrivate);
// get channel
textViewMessageChannel = findViewById(R.id.textViewMessageChannel);
// get gateway
textViewGateway = findViewById(R.id.textViewGateway);
textViewGateway.setTypeface(Typeface.createFromAsset(getAssets(), "Sketch_Block.ttf"));
textViewGateway.setTextSize(24);
// get status
textViewMessageStatus = findViewById(R.id.textViewMessageStatus);
layoutGateway = findViewById(R.id.layoutGateway);
layoutGateway.setOnClickListener(GatwayListener);
// set button ptt listener
buttonPTT.setOnClickListener(PTTClickListener);
// set button DKey listener
buttonDKey.setOnClickListener(DKeyClickListener);
startAudioThread();
if(!AppParams.DEMO)
UpdateEnableDisableButtons("offline");
// send current activity to parent
parentTab.setRadioActivity(this);
// register to be notified when an event is triggered
registerBroadcastIntents();
}
public Bundle getSavedInstanceState() {
return savedInstanceState;
}
private void startAudioThread() {
audioThread = new Thread(() -> {
//start audio
try {
if (audioH == null && !AppParams.IP.equalsIgnoreCase("n/a"))
audioH = new AudioHandle(AppParams.IP,0);
} catch(Exception ex) {
SM.Exception("#### audioH exception! ####");
SM.Exception(ex.toString());
}
});
audioThread.start();
}
@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();
// get all vehicles from TabLayoutActivity
if (!allVehicle.equals(parentTab.getAllVehicle())) {
allVehicle = parentTab.getAllVehicle();
UpdateVehicle();
}
if (AppParams.listRadios.size() == 0)
GetGWRadios();
SM.Debug("onResume");
}
private final OnClickListener GatwayListener = new OnClickListener() {
@Override
public void onClick(View v) {
adapter = new ArrayAdapter<>(
context, R.layout.template_simple_list_item,
allGWsIP);
AlertDialog.Builder builder = new AlertDialog.Builder(context);
builder.setTitle("Select RadioGW");
builder.setAdapter(adapter,
(dialog, which) -> {
// change gateway
//textViewGateway.setText(allGWsIP.get(which));
// change visual if selected another radioGW
radioGWChanged(allGWsIP.get(which));
});
AlertDialog alert = builder.create();
alert.show();
}
};
private final OnClickListener PTTClickListener = v -> {
if (pttONoff)
pttOffClick();
else
pttOnClick();
};
private void pttOnClick() {
//================
// get selectedID
//================
if(selectedCallType == GROUPCall)
selectedID = getGroupID4Name(textViewCallType.getText().toString());
else if (selectedCallType == PRIVATECall)
selectedID = getPrivateImei4Name(textViewCallType.getText().toString());
else
selectedID = -1;
// send start the call
if(parentTab.getCrtRadio() != null)
SendPTT(selectedCallType, selectedID, parentTab.getCrtRadio().GW_ID, parentTab.getCrtRadio().ID,AppParams.USERID);
// flag in Call
parentTab.setInCall(true);
pttONoff= true;
// start sound
if(audioH!=null)
audioH.soundNeeded = true;
buttonPTT.setText(getString(R.string.PTToff));
buttonPTT.setBackgroundResource(R.drawable.style_buttonptt_green);
// change text in Screen according to callType
String chanMsg = "", statMsg = "";
switch(selectedCallType)
{
case PRIVATECall : chanMsg = getString(R.string.PrivateCall); statMsg = textViewCallType.getText().toString(); break;
case GROUPCall : chanMsg = getString(R.string.GroupCall); statMsg = textViewCallType.getText().toString(); break;
case ALLCall : chanMsg = getString(R.string.AllCall); statMsg = ""; break;
}
textViewMessageChannel.setText(chanMsg);
textViewMessageStatus.setText(statMsg);
// change status image
imageViewStatus.setImageResource(R.drawable.status_idle);
//===================
// disable buttons
//===================
UpdateEnableDisableButtons("disablePTT");
parentTab.enableMenuButtons(false);
}
private void pttOffClick() {
String chanMsg, statMsg = "";
// send stop the call
if(parentTab.getCrtRadio() != null)
SendPTT(selectedCallType + 10, selectedID, parentTab.getCrtRadio().GW_ID, parentTab.getCrtRadio().ID,AppParams.USERID);
// stop sound
pttONoff = false;
if(audioH != null)
audioH.soundNeeded = false;
buttonPTT.setText(getString(R.string.PTT));
buttonPTT.setBackgroundResource(R.drawable.style_buttonptt);
chanMsg = textViewChannel.getText().toString();
textViewMessageChannel.setText(chanMsg);
textViewMessageStatus.setText(statMsg);
// change status image
imageViewStatus.setImageResource(R.drawable.status_online);
// enable buttons
UpdateEnableDisableButtons("enable");
parentTab.enableMenuButtons(true);
}
private final OnClickListener DKeyClickListener = v -> SendDekey();
private final OnClickListener ChannelChangeListener = new OnClickListener() {
@Override
public void onClick(View v) {
if (parentTab.getCrtRadio() != null) {
// display dialog with adapter
ArrayList<String> tmp = new ArrayList<>();
for(Channel ch: crtChannels)
tmp.add(ch.chName);
ArrayAdapter<String> adapter = new ArrayAdapter<>(activity, R.layout.template_simple_list_item, tmp);
AlertDialog.Builder builder = new AlertDialog.Builder(context);
builder.setTitle(getString(R.string.selChannel));
builder.setAdapter(adapter , (dialog, which) -> {
// change Channel in Display
//textViewMessageChannel.setText(crtChannels.get(which).chName);
// set channel name
//textViewChannel.setText(crtChannels.get(which).chName);
// send change to App
onZoneCHChange(parentTab.getCrtRadio().ID, parentTab.getCrtRadio().GW_ID, getNR4Zone(textViewZone.getText().toString()), getNR4CH(crtChannels.get(which).chName));
});
AlertDialog alert = builder.create();
alert.show();
}
}
};
private final OnClickListener ZoneChangeListener = new OnClickListener() {
@Override
public void onClick(View v) {
if (parentTab.getCrtRadio() !=null) {
// display dialog with adapter
ArrayList<String> tmp = new ArrayList<>();
for(Zone zone: crtZones)
tmp.add(zone.ZoneName);
ArrayAdapter<String> adapter = new ArrayAdapter<>(activity, R.layout.template_simple_list_item, tmp);
AlertDialog.Builder builder = new AlertDialog.Builder(context);
builder.setTitle(getString(R.string.selZone));
builder.setAdapter(adapter , (dialog, which) -> {
// send change to App
onZoneCHChange(parentTab.getCrtRadio().ID, parentTab.getCrtRadio().GW_ID, getNR4Zone(crtZones.get(which).ZoneName), 1);
});
AlertDialog alert = builder.create();
alert.show();
}
}
};
private final OnClickListener CallTypeListener = new OnClickListener() {
@Override
public void onClick(View v) {
if (parentTab.getCrtRadio() != null) {
// create spinner selected
AlertDialog.Builder builder = new AlertDialog.Builder(context);
switch(radioGroupCallType.getCheckedRadioButtonId()) {
case R.id.radioGroup :
// set adapter and title
adapter = new ArrayAdapter<>(activity, R.layout.template_simple_list_item, allGroupsNames);
builder.setTitle(getString(R.string.selectGroup));
break;
case R.id.radioPrivate :
// set adapter and title
adapter = new ArrayAdapter<>(activity, R.layout.template_simple_list_item, allVehicleNames);
builder.setTitle(getString(R.string.selectVehicle));
break;
}
builder.setAdapter(adapter , (dialog, which) -> {
switch(radioGroupCallType.getCheckedRadioButtonId()) {
case R.id.radioGroup :
// set adapter and title
textViewCallType.setText(allGroupsNames.get(which));
break;
case R.id.radioPrivate :
textViewCallType.setText(allVehicleNames.get(which));
break;
}
});
AlertDialog alert = builder.create();
alert.show();
}
}
};
private final OnCheckedChangeListener CallTypeChanged = new OnCheckedChangeListener() {
@Override
public void onCheckedChanged(RadioGroup group, int checkedId) {
switch(radioGroupCallType.getCheckedRadioButtonId()) {
case R.id.radioAll :
layoutSpinnerCallType.setVisibility(View.INVISIBLE);
selectedCallType = ALLCall;
break;
case R.id.radioGroup :
layoutSpinnerCallType.setVisibility(View.VISIBLE);
textViewCallType.setText(allGroupsNames.get(0));
selectedCallType = GROUPCall;
break;
case R.id.radioPrivate :
layoutSpinnerCallType.setVisibility(View.VISIBLE);
if (allVehicleNames.size() > 0)
textViewCallType.setText(allVehicleNames.get(0));
else
textViewCallType.setText("");
selectedCallType = PRIVATECall;
break;
}
}
};
// called from ParentTabActivity
public void UpdateRadios(ArrayList<RadioGW> radios) {
// save radios
AppParams.listRadios = radios;
if(parentTab.getCrtRadio() == null)
parentTab.setCrtRadio(AppParams.listRadios.get(0));
// if crtRadio not exists anymore
if(!AppParams.listRadios.contains(parentTab.getCrtRadio()))
parentTab.setCrtRadio(AppParams.listRadios.get(0));
SM.Debug(parentTab.getCrtRadio().toString());
// get status for selected Radio
ReqRadioStatus(parentTab.getCrtRadio().ID, parentTab.getCrtRadio().GW_ID);
// get selected Zone and CH
onZoneCHChange(parentTab.getCrtRadio().ID, parentTab.getCrtRadio().GW_ID, 0,0);
myHandler.post(updateGatewaysRUN);
}
// Create runnable for posting
final Runnable updateGatewaysRUN = this::updateGateways;
public void updateGateways() {
// get all radio IP
allGWsIP.clear();
for (RadioGW radio: AppParams.listRadios)
allGWsIP.add(radio.IP);
textViewGateway.setText(parentTab.getCrtRadio().IP);
}
// modify privateCall Adapter after resume if Vehicle List Modified
public void UpdateVehicle() {
allVehicleNames = new ArrayList<>();
if (allVehicle!=null)
for(Vehicle vehicle: allVehicle)
allVehicleNames.add(vehicle.name);
}
private RadioGW getRadioGW(int _radioID, int _gwID) {
for (RadioGW radio: AppParams.listRadios) {
if (radio.GW_ID == _gwID && radio.ID == _radioID)
return radio;
}
return null;
}
private ArrayList<Channel> getChannels(int zoneNR) {
for(Zone zone : parentTab.getCrtRadio().zoneList) {
if (zone.id == zoneNR)
return zone.channelList;
}
return new ArrayList<>();
}
// called from ParentTabActivity to set radioID, GWID, zoneNR and chNR
public void UpdateZoneCH(int _radioID, int _gwID, int _zoneNR, int _chNR) {
// save received id's zoneNr and CHNR
this.radioID = _radioID;
this.GWID = _gwID;
this.zoneNR = _zoneNR;
this.chNR = _chNR;
SM.Debug("am primit: " + _radioID + "," + _gwID + "," + _zoneNR + "," + _chNR);
// get RadioGw
RadioGW radioGW = getRadioGW(_radioID, _gwID);
if (radioGW == null)
return;
// set current radio
parentTab.setCrtRadio(radioGW);
// set current zones
crtZones = radioGW.zoneList;
// set current channels
crtChannels = getChannels(_zoneNR);
myHandler.post(UpdateResultsZoneChannelRUN);
}
// Create runnable for posting
final Runnable UpdateResultsZoneChannelRUN = this::updateResultsInUi;
private void updateResultsInUi() {
if (AppParams.listRadios.size() > 0) {
textViewGateway.setText(parentTab.getCrtRadio().IP);
// get all radio IP
allGWsIP.clear();
for (RadioGW radio: AppParams.listRadios)
allGWsIP.add(radio.IP);
// set spinners and text
if (parentTab.getCrtRadio() == null) {
parentTab.setCrtRadio(AppParams.listRadios.get(0));
textViewGateway.setText(allGWsIP.get(0));
// set zone
ArrayList<String> zones = new ArrayList<>();
crtZones = parentTab.getCrtRadio().zoneList;
for(Zone zone: crtZones)
zones.add(zone.ZoneName);
textViewZone.setText(zones.get(0));
// set channel
ArrayList<String> channel = new ArrayList<>();
crtChannels = parentTab.getCrtRadio().zoneList.get(0).channelList;
for(Channel ch: crtChannels)
channel.add(ch.chName);
textViewChannel.setText(channel.get(0));
} else {
for (RadioGW radio: AppParams.listRadios)
if (radio.ID == radioID && radio.GW_ID == GWID)
parentTab.setCrtRadio(radio);
// get zones for adapter
ArrayList<String> zones = new ArrayList<>();
crtZones = parentTab.getCrtRadio().zoneList;
int position = 0;
// get selected Zone
for (int i=0; i< crtZones.size(); i++) {
Zone zone = crtZones.get(i);
zones.add(zone.ZoneName);
if (zone.id == zoneNR)
position = i; // save crt position in array
}
textViewZone.setText(zones.get(position));
// set channel
ArrayList<String> channel = new ArrayList<>();
crtChannels = parentTab.getCrtRadio().zoneList.get(position).channelList;
// get current channel
position = 0;
for (int i=0; i< crtChannels.size(); i++) {
Channel ch = crtChannels.get(i);
channel.add(ch.chName);
if(ch.id == chNR)
position = i;
}
textViewChannel.setText(channel.get(position));
textViewMessageChannel.setText(channel.get(position));
}
UpdateEnableDisableButtons("online");
imageViewStatus.setImageResource(R.drawable.status_online);
}
}
// Radio Gateway changed from UI
private void radioGWChanged(String newIP) {
// get gateway id
for (RadioGW radio:AppParams.listRadios)
if (radio.IP.equals(newIP)) {
UpdateEnableDisableButtons("offline");
onZoneCHChange(radio.ID, radio.GW_ID,0,0); // get zone and channel for crt radio
parentTab.setCrtRadio(radio);
}
textViewGateway.setText(newIP);
imageViewStatus.setImageResource(R.drawable.status_offline);
// clear Spinners
ClearSpinners();
// reset adapter for spinners
ResetAdaptersForSpinners();
}
private void ClearSpinners() {
textViewZone.setText("");
textViewChannel.setText("");
textViewMessageChannel.setText("");
}
private void ResetAdaptersForSpinners() {
crtChannels = new ArrayList<>();
crtZones = new ArrayList<>();
}
private void SetCheck(RadioButton radioButton) {
radioPrivate.setChecked(radioPrivate == radioButton );
radioGroup.setChecked(radioGroup == radioButton );
radioAll.setChecked(radioAll == radioButton );
}
// broadcastCall from ParentTabActivity to set radio status
public void UpdateBroadcastCall(long Imei,int Calltype,int GroupID,int CallStatus) {
// save received id's zoneNr and CHNR
SM.Debug("Status: Imei: " + Imei+ " Calltype: "+Calltype+ " GroupID: "+GroupID+" CallStatus:"+CallStatus);
this.imei = Imei;
this.calltype = Calltype;
this.groupid = GroupID;
this.callstatus = CallStatus;
myHandler.post(UpdateB);
}
final Runnable UpdateB = this::UpdateResultsBroadcastCall;
private void UpdateResultsBroadcastCall() {
SM.Debug("UpdateResultsBroadcastCall with Imei: " +imei+ " CallType:"+calltype+ " GroupID:"+groupid+" CallStatus:"+callstatus);
if ((callstatus == inCall) || (callstatus== hangTime)) {
// modify UI only when call is received, not in hangtime
if (callstatus == inCall) {
layoutGateway.setEnabled(false);
String CallType = getString(R.string.AllCall);
if (calltype == PRIVATECall) {
CallType = getString(R.string.PrivateCall);
SetCheck(radioPrivate);
selectedCallType = PRIVATECall;
} else if (calltype == GROUPCall) {
CallType = getString(R.string.GroupCall) + "("+groupid+")";
SetCheck(radioGroup);
selectedCallType = GROUPCall;
textViewCallType.setText(groupid + "");
} else {
SetCheck(radioAll);
selectedCallType = ALLCall;
}
layoutSpinnerCallType.setVisibility( calltype != ALLCall ? View.VISIBLE : View.INVISIBLE);
textViewMessageChannel.setText(CallType);
if (parentTab.getSuperVehHash() != null) {
if (parentTab.getSuperVehHash().containsKey(imei))
textViewMessageStatus.setText(parentTab.getSuperVehHash().get(imei).name);
else
textViewMessageStatus.setText("Imei: " + imei);
}
}
if (callstatus == hangTime) {
textViewMessageStatus.setText(getString(R.string.hangTime));
buttonPTT.setEnabled(true);
buttonDKey.setEnabled(false);
}
if (parentTab.getCrtActivity() == parentTab.RADIO_TAB_ID && selectedCallType == calltype)
parentTab.enableMenuButtons(false);
if (selectedCallType == calltype)
parentTab.setInCall(true);
} else if (callstatus == callEnd ) {
if ((calltype == 0 && pttONoff) || selectedCallType == calltype) {
layoutGateway.setEnabled(true);
textViewMessageChannel.setText(textViewChannel.getText());
textViewMessageStatus.setText(" ");
imageViewStatus.setImageResource(R.drawable.status_online);
// stop sound
if (audioH!=null)
audioH.StopSound();
// disable buttons
UpdateEnableDisableButtons("enable");
if (pttONoff) {
pttONoff= false;
if (audioH!=null)
audioH.soundNeeded = false;
buttonPTT.setText(getString(R.string.PTT));
buttonPTT.setBackgroundResource(R.drawable.style_buttonptt);
}
parentTab.enableMenuButtons(true);
parentTab.setInCall(false);
}
}
}
// called from ParentTabActivity to set radio status
public void UpdateRadioStatus (int status) {
// save received id's zoneNr and CHNR
this.rStatus = status;
SM.Debug("rStatus: " + rStatus );
myHandler.post(UpdateRadioS);
}
final Runnable UpdateRadioS = this::updateResultsStatus;
private void updateResultsStatus() {
SM.Debug("updateResultsStatusUI with Status: " + (rStatus == 1? "ONLINE" : "OFFLINE"));
imageViewStatus.setImageResource( (rStatus == 1 ) ? R.drawable.status_online : R.drawable.status_offline);
UpdateEnableDisableButtons( (rStatus == 1 ) ? "online" : "offline");
}
private void enableDisableRadioCallType(boolean enabled) {
radioGroupCallType.setEnabled(enabled);
radioAll.setEnabled(enabled);
radioGroup.setEnabled(enabled);
radioPrivate.setEnabled(enabled);
}
private void enableDisableSpinners(boolean enabled) {
layoutSpinnerZone.setEnabled(enabled);
layoutSpinnerChannel.setEnabled(enabled);
layoutSpinnerCallType.setEnabled(enabled);
}
public void UpdateEnableDisableButtons(String type) {
if (type.equals("disableIncCall")) {
enableDisableRadioCallType(false);
enableDisableSpinners(false);
// enable Dkey button
buttonDKey.setEnabled(true);
// disable PTT
buttonPTT.setEnabled(false);
} else if (type.equals("disablePTT")) {
enableDisableRadioCallType(false);
enableDisableSpinners(false);
// disable Dkey button
buttonDKey.setEnabled(false);
} else if (type.equals("enable")) {
enableDisableRadioCallType(true);
enableDisableSpinners(true);
// disable Dkey button and enable PTT
buttonDKey.setEnabled(false);
buttonPTT.setEnabled(true);
} else if(type.equals("online")) {
enableDisableRadioCallType(true);
enableDisableSpinners(true);
// disable Dkey button
buttonDKey.setEnabled(false);
buttonPTT.setEnabled(true);
textViewMessageStatus.setText("");
parentTab.enableMenuButtons(true);
} else if (type.equals("offline")) {
enableDisableRadioCallType(false);
enableDisableSpinners(false);
// disable Dkey button
buttonDKey.setEnabled(false);
// disable PTT button
buttonPTT.setEnabled(false);
// reset zone and channel text
textViewZone.setText("");
textViewChannel.setText("");
parentTab.enableMenuButtons(true); //enable menu buttons
// reset status icon
imageViewStatus.setImageResource(R.drawable.status_offline);
// reset screen messages
textViewMessageChannel.setText("");
textViewMessageStatus.setText(getString(R.string.offline));
}
}
// get Group Contact ID from Name
private int getGroupID4Name(String name) {
int i = 0;
for (String groupName: allGroupsNames) {
// if searched name - return corresponding id
if (groupName.equals(name))
return allGroupsIDs.get(i);
i++;
}
return -1;
}
// get Private Contact ID from Name
private int getPrivateImei4Name(String name) {
for (Vehicle vehicle: allVehicle) {
if (vehicle.name.equals(name))
return Integer.parseInt(vehicle.imei);
}
return -1;
}
// get zone number from spinner zoneName
private int getNR4Zone(String zoneName) {
for (Zone zone: crtZones)
if (zone.ZoneName.equals(zoneName))
return zone.id;
return -1;
}
// get channel number from spinner chName
private int getNR4CH(String chName) {
for (Channel ch: crtChannels)
if (ch.chName.equals(chName))
return ch.id;
return -1;
}
// send GetGWRadios to AppServer
private void GetGWRadios() {
parentTab.getRadiosList();
}
// send Dekey to AppServer
private void SendDekey() {
if (parentTab.getCrtRadio() != null)
parentTab.sendDekey(parentTab.getCrtRadio().GW_ID, parentTab.getCrtRadio().ID);
}
// send change Channel and Zone message to AppServer
private void onZoneCHChange(int RadioID, int GWID, int zone, int ch) {
SM.Debug("Changed Z: " + zone + " | Channel: " + ch);
parentTab.getSetZoneAndChannel(GWID,RadioID,zone,ch);
}
// request radio status
private void ReqRadioStatus(int RadioID, int GWID) {
SM.Debug("Request radio status 4 radioId: " + RadioID + " | GW_ID:" + GWID);
parentTab.getRadioStatus(GWID,RadioID);
try {
Thread.sleep(500);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
//sendPTT
//callType:
//101 -allcall init
//111 -allcall stop
//102 -prvcall init
//112 -prvcall stop
//103 -grpcall init
//113 -grpcall stop
public void SendPTT(int callType, int id,int gwid, int rgwid,long userID) {
SM.Debug("sendPTT callType:"+callType);
parentTab.sendPTT(callType, id,gwid,rgwid,userID);
}
/** Register for broadcasts */
private void registerBroadcastIntents() {
IntentFilter intentFilter = new IntentFilter(OperationCodes.CHANNEL_BRDCST + "");
this.registerReceiver(mReceiver, intentFilter);
intentFilter = new IntentFilter(OperationCodes.RADIOID_CHANGED + "");
this.registerReceiver(mReceiver, intentFilter);
}
//The BroadcastReceiver that listens for Notification broadcasts
public final BroadcastReceiver mReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
final String action = intent.getAction();
// CHANNEL_BRDCST
if (action.equals(OperationCodes.CHANNEL_BRDCST + "")) {
Zone_and_channel zc = AppParams.crtZoneAndChannel;
UpdateZoneCH(zc.rgwID, zc.gwID, zc.zoneNr, zc.channelNr);
}
// RADIOID_CHANGED
if (action.equals(OperationCodes.RADIOID_CHANGED + "")) {
textViewGateway.setText(parentTab.getCrtRadio().IP);
textViewChannel.setText(parentTab.getCrtRadio().getChannelName());
textViewZone.setText(parentTab.getCrtRadio().getZoneName());
// update UI
myHandler.post(UpdateResultsZoneChannelRUN);
radioGWChanged(parentTab.getCrtRadio().IP);
}
}
};
}

View File

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

Binary file not shown.

After

Width:  |  Height:  |  Size: 16 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 74 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 207 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 66 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 145 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.5 KiB

View File

@ -31,10 +31,10 @@
android:paddingLeft="3dp"
android:layout_weight="1"/>
<LinearLayout
android:id="@+id/linearLayoutChecked"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_weight="0"
android:background="@drawable/checked"
android:orientation="horizontal" />
android:id="@+id/linearLayoutChecked"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_weight="0"
android:background="@drawable/checked">
</LinearLayout>
</LinearLayout>

View File

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

View File

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

View File

@ -1,230 +1,243 @@
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent" android:weightSum="1"
android:id="@+id/layoutMain"
style="?bg">
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent" android:weightSum="1"
android:id="@+id/layoutMain"
style="?bg">
<LinearLayout
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:gravity="left"
android:layout_weight="0"
android:orientation="horizontal"
style="?header"
android:id="@+id/layoutHeader">
<LinearLayout
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:gravity="left"
android:layout_weight="0"
android:orientation="horizontal"
style="?header"
android:id="@+id/layoutHeader">
<ImageView
android:id="@+id/imageViewMsg"
android:layout_width="wrap_content"
android:layout_height="fill_parent"
android:src="@drawable/message"
android:paddingLeft="0dp"
android:layout_margin="3dp"
android:layout_weight="0" />
<TextView
android:id="@+id/textView1"
android:layout_width="wrap_content"
android:layout_height="fill_parent"
android:gravity="center_vertical"
android:text="@string/textMessaging"
android:layout_marginLeft="5dp"
android:textStyle="bold"
android:paddingTop="7dp"
android:textColor="#FFFFFF"
android:textAppearance="?android:attr/textAppearanceMedium"
android:layout_weight="0"/>
<ImageView
android:id="@+id/imageViewMsg"
android:layout_width="wrap_content"
android:layout_height="fill_parent"
android:src="@drawable/message"
android:paddingLeft="0dp"
android:layout_margin="3dp"
android:layout_weight="0" />
<TextView
android:id="@+id/textView1"
android:layout_width="wrap_content"
android:layout_height="fill_parent"
android:gravity="center_vertical"
android:text="@string/textMessaging"
android:layout_marginLeft="5dp"
android:textStyle="bold"
android:paddingTop="7dp"
android:textColor="#FFFFFF"
android:textAppearance="?android:attr/textAppearanceMedium"
android:layout_weight="0"/>
<ImageView
android:id="@+id/imageViewSeparator"
android:layout_width="wrap_content"
android:layout_height="fill_parent"
android:layout_gravity="center_vertical"
android:src="@drawable/separator_white"
android:layout_margin="2dp"
android:layout_weight="0"
android:visibility="invisible"
android:focusable="false" />
<ImageView
android:id="@+id/imageViewSeparator"
android:layout_width="wrap_content"
android:layout_height="fill_parent"
android:layout_gravity="center_vertical"
android:src="@drawable/separator_white"
android:layout_margin="2dp"
android:layout_weight="0"
android:visibility="invisible"
android:focusable="false" />
<ImageView
android:id="@+id/imageViewDown"
android:layout_width="20dp"
android:layout_height="fill_parent"
android:layout_gravity="center_vertical"
android:layout_marginBottom="2dp"
android:layout_marginTop="2dp"
android:focusable="false"
android:visibility="invisible"
android:src="@drawable/arrow_menu_down" />
<ImageButton
android:id="@+id/imageButtonAdd2"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_weight="1"
android:scaleType="centerInside"
android:layout_marginRight="5dp"
android:paddingLeft="2dp"
android:visibility="invisible"
android:background="@drawable/addmessage_selector"/>
<TextView
android:id="@+id/textViewNew"
android:layout_width="wrap_content"
android:layout_height="fill_parent"
android:gravity="center_vertical"
android:text="New"
android:textStyle="bold"
android:paddingTop="7dp"
android:textColor="#FFFFFF"
android:textAppearance="?android:attr/textAppearanceMedium"
android:layout_weight="0"
android:paddingRight="5dp"
android:visibility="gone"/>
<ImageButton
android:id="@+id/imageButtonAdd"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_weight="0"
android:scaleType="centerInside"
android:layout_marginRight="5dp"
android:paddingLeft="2dp"
android:background="@drawable/addmessage_selector"/>
<!-- android:background="@drawable/addmessage_selector" -->
</LinearLayout>
<LinearLayout
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:gravity="left"
android:layout_weight="0"
android:orientation="horizontal"
style="?header"
android:id="@+id/layoutHeaderConversation">
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="fill_parent"
android:layout_gravity="center_vertical">
<ImageButton
android:id="@+id/imageButtonBack"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_vertical"
android:layout_marginRight="5dp"
android:paddingLeft="2dp"
android:background="@drawable/messageback_selector"/>
</LinearLayout>
<LinearLayout
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:layout_gravity="center_horizontal"
android:layout_weight="1"
android:gravity="right|center_vertical"
android:orientation="horizontal"
android:paddingBottom="2dp"
android:paddingRight="15dp"
android:paddingTop="3dp" >
<LinearLayout
android:layout_height="wrap_content"
android:layout_width="wrap_content"
android:layout_gravity="center_vertical"
android:layout_weight="0">
<ImageView
android:id="@+id/imageViewSelectedContact"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:src="@drawable/ambulance_large"
android:layout_margin="3dp" />
</LinearLayout>
<TextView
android:id="@+id/textViewSelectedContact"
android:layout_width="wrap_content"
android:layout_height="fill_parent"
android:text="Large Text"
android:gravity="center_vertical"
android:paddingLeft="3dp"
android:textAppearance="?android:attr/textAppearanceMedium"
android:layout_weight="0"/>
android:id="@+id/imageViewDown"
android:layout_width="20dp"
android:layout_height="fill_parent"
android:layout_gravity="center_vertical"
android:layout_marginBottom="2dp"
android:layout_marginTop="2dp"
android:focusable="false"
android:visibility="invisible"
android:src="@drawable/arrow_menu_down" />
<ImageButton
android:id="@+id/imageButtonAdd2"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_weight="1"
android:scaleType="centerInside"
android:layout_marginRight="5dp"
android:paddingLeft="2dp"
android:visibility="invisible"
android:background="@drawable/addmessage_selector"/>
<TextView
android:id="@+id/textViewNew"
android:layout_width="wrap_content"
android:layout_height="fill_parent"
android:gravity="center_vertical"
android:text="New"
android:textStyle="bold"
android:paddingTop="7dp"
android:textColor="#FFFFFF"
android:textAppearance="?android:attr/textAppearanceMedium"
android:layout_weight="0"
android:paddingRight="5dp"
android:visibility="gone"/>
<ImageButton
android:id="@+id/imageButtonAdd"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_weight="0"
android:scaleType="centerInside"
android:layout_marginRight="5dp"
android:paddingLeft="2dp"
android:background="@drawable/addmessage_selector"/>
<!-- android:background="@drawable/addmessage_selector" -->
</LinearLayout>
<LinearLayout
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:gravity="left"
android:layout_weight="0"
android:orientation="horizontal"
style="?header"
android:id="@+id/layoutHeaderConversation">
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="fill_parent"
android:layout_gravity="center_vertical">
<ImageButton
android:id="@+id/imageButtonBack"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_vertical"
android:layout_marginRight="5dp"
android:paddingLeft="2dp"
android:background="@drawable/messageback_selector"/>
</LinearLayout>
<LinearLayout
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:layout_gravity="center_horizontal"
android:layout_weight="1"
android:gravity="right|center_vertical"
android:orientation="horizontal"
android:paddingBottom="2dp"
android:paddingRight="15dp"
android:paddingTop="3dp" >
<LinearLayout
android:layout_height="wrap_content"
android:layout_width="wrap_content"
android:layout_gravity="center_vertical"
android:layout_weight="0">
<ImageView
android:id="@+id/imageViewSelectedContact"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:src="@drawable/ambulance_large"
android:layout_margin="3dp" />
</LinearLayout>
<TextView
android:id="@+id/textViewSelectedContact"
android:layout_width="wrap_content"
android:layout_height="fill_parent"
android:text="Large Text"
android:gravity="center_vertical"
android:paddingLeft="3dp"
android:textAppearance="?android:attr/textAppearanceMedium"
android:layout_weight="0"/>
</LinearLayout>
<!-- android:background="@drawable/addmessage_selector" -->
</LinearLayout>
<LinearLayout
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:id="@+id/layoutConversations"
android:layout_weight="1"
android:orientation="vertical">
</LinearLayout>
<!-- android:background="@drawable/addmessage_selector" -->
</LinearLayout>
<LinearLayout
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:id="@+id/layoutConversations"
android:layout_weight="1"
android:orientation="vertical">
<GridView
android:id="@+id/gridView1"
android:layout_width="fill_parent"
android:layout_height="match_parent"
android:background="#999999"
android:drawSelectorOnTop="false"
android:horizontalSpacing="0dp"
android:numColumns="1"
android:verticalSpacing="1dp" >
</GridView>
</LinearLayout>
<LinearLayout
android:id="@+id/layoutSendMsg"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:gravity="left"
android:layout_weight="0"
android:orientation="horizontal"
style="?header">
<LinearLayout
android:layout_weight="0"
android:layout_width="wrap_content"
android:layout_height="fill_parent">
<TextView
android:id="@+id/textView1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_vertical"
android:text="@string/message"
android:layout_marginLeft="5dp"
android:layout_marginRight="5dp"
android:textAppearance="?android:attr/textAppearanceLarge"
/>
</LinearLayout>
<LinearLayout
android:layout_weight="1"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:gravity="center_vertical"
android:paddingTop="4dp">
<EditText
android:id="@+id/editTextMsg"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_gravity="center_vertical"
android:gravity="center_vertical"
android:inputType="text"
android:autofillHints="">
</EditText>
</LinearLayout>
<Button
android:id="@+id/imageButtonSend"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_weight="0"
android:text="@string/send"
android:layout_marginRight="5dp"
android:layout_gravity="center"
android:paddingLeft="6dp"
android:textColor="#000000"
style="?login"
/>
</LinearLayout>
<GridView
android:id="@+id/gridView1"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:background="#999999"
android:drawSelectorOnTop="false"
android:horizontalSpacing="0dp"
android:numColumns="1"
android:verticalSpacing="1dp" >
</GridView>
</LinearLayout>
<LinearLayout
android:id="@+id/layoutSendMsg"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:gravity="left"
android:layout_weight="0"
android:orientation="horizontal"
style="?header">
<LinearLayout
android:layout_weight="0"
android:layout_width="wrap_content"
android:layout_height="fill_parent">
<TextView
android:id="@+id/textViewSendMsg"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_vertical"
android:text="@string/message"
android:layout_marginLeft="5dp"
android:layout_marginRight="5dp"
android:textAppearance="?android:attr/textAppearanceLarge"
/>
</LinearLayout>
<LinearLayout
android:layout_weight="1"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:gravity="center_vertical"
android:paddingTop="4dp">
<EditText
android:id="@+id/editTextMsg"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_gravity="center_vertical"
android:gravity="center_vertical"
android:inputType="text" >
</EditText>
</LinearLayout>
<LinearLayout
android:layout_weight="0"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:gravity="center_vertical"
android:paddingTop="4dp">
<ImageView
android:id="@+id/imageBarcode"
android:layout_width="wrap_content"
android:layout_height="35dp"
android:src="@drawable/barcode"
android:paddingTop="2dp"
android:layout_margin="3dp" />
</LinearLayout>
<Button
android:id="@+id/imageButtonSend"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_weight="0"
android:text="@string/send"
android:layout_marginRight="5dp"
android:layout_gravity="center"
android:paddingLeft="6dp"
android:textColor="#000000"
style="?login"
/>
</LinearLayout>
</LinearLayout>

View File

@ -7,9 +7,9 @@
android:padding="2dp"
android:background="@drawable/style_nameoverlay">
<TextView android:layout_height="wrap_content"
android:layout_width="fill_parent"
android:id="@+id/balloon_vehicle_name"
android:textSize="12dip"
android:textColor="#FF000000" />
<TextView android:layout_height="wrap_content"
android:layout_width="fill_parent"
android:id="@+id/balloon_vehicle_name"
android:textSize="12dip"
android:textColor="#FF000000"></TextView>
</LinearLayout>

View File

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

View File

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

View File

@ -61,4 +61,4 @@
android:textSize="16dp" />
</LinearLayout>
</LinearLayout>
</LinearLayout>

View File

@ -217,13 +217,13 @@
<ImageView
android:id="@+id/imageLoading"
android:layout_width="64dp"
android:layout_height="64dp"
android:layout_gravity="center_vertical"
android:layout_weight="0"
android:visibility="gone"
android:layout_alignParentTop="true"
android:layout_alignParentLeft="true" />
android:id="@+id/imageLoading"
android:layout_width="64dp"
android:layout_height="64dp"
android:layout_gravity="center_vertical"
android:layout_weight="0"
android:visibility="gone"
android:layout_alignParentTop="true"
android:layout_alignParentLeft="true" />
</RelativeLayout>

View File

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

View File

@ -209,6 +209,8 @@
</LinearLayout>
</LinearLayout>
</LinearLayout>
<RelativeLayout
android:id="@+id/frameLayoutLanguage"
@ -219,16 +221,20 @@
android:layout_alignParentBottom="true"
android:layout_gravity="right"
android:paddingBottom="6dp"
android:layout_toLeftOf="@+id/frameLayout13" />
android:layout_toLeftOf="@+id/frameLayout13">
</RelativeLayout>
<ImageView
android:id="@+id/imageLoading"
android:layout_width="64dp"
android:layout_height="64dp"
android:layout_gravity="center_vertical"
android:layout_weight="0"
android:visibility="gone"
android:layout_alignParentTop="true"
android:layout_alignParentLeft="true" />
android:id="@+id/imageLoading"
android:layout_width="64dp"
android:layout_height="64dp"
android:layout_gravity="center_vertical"
android:layout_weight="0"
android:visibility="gone"
android:layout_alignParentTop="true"
android:layout_alignParentLeft="true" />
</RelativeLayout>

View File

@ -31,10 +31,10 @@
android:paddingLeft="3dp"
android:layout_weight="1"/>
<LinearLayout
android:id="@+id/linearLayoutChecked"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_weight="0"
android:background="@drawable/checked"
android:orientation="horizontal" />
android:id="@+id/linearLayoutChecked"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_weight="0"
android:background="@drawable/checked">
</LinearLayout>
</LinearLayout>

View File

@ -1,30 +1,30 @@
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:orientation="horizontal">
<ImageView
android:id="@+id/icon"
android:layout_width="wrap_content"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:src="@mipmap/ic_launcher"
android:paddingLeft="5dp"
android:paddingRight="5dp"
android:paddingTop="5dp"
android:paddingBottom="5dp"/>
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="fill_parent"
android:orientation="horizontal"
android:gravity="center_vertical">
<TextView
android:id="@+id/language"
android:textSize="20dp"
android:textColor="#000000"
android:textStyle="bold"
android:orientation="horizontal">
<ImageView
android:id="@+id/icon"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:gravity="center_vertical"/>
</LinearLayout>
android:src="@drawable/ic_launcher"
android:paddingLeft="5dp"
android:paddingRight="5dp"
android:paddingTop="5dp"
android:paddingBottom="5dp"/>
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="fill_parent"
android:orientation="horizontal"
android:gravity="center_vertical">
<TextView
android:id="@+id/language"
android:textSize="20dp"
android:textColor="#000000"
android:textStyle="bold"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:gravity="center_vertical"/>
</LinearLayout>
</LinearLayout>

View File

@ -10,14 +10,14 @@
android:gravity="center_vertical" >
<ImageButton
android:id="@+id/imageButtonAdd"
android:layout_width="1dp"
android:layout_height="wrap_content"
android:layout_weight="0"
android:layout_marginRight="5dp"
android:paddingLeft="2dp"
android:visibility="invisible"
android:background="@drawable/addmessage_selector"/>
android:id="@+id/imageButtonAdd"
android:layout_width="1dp"
android:layout_height="wrap_content"
android:layout_weight="0"
android:layout_marginRight="5dp"
android:paddingLeft="2dp"
android:visibility="invisible"
android:background="@drawable/addmessage_selector"/>
<TextView
android:layout_width="fill_parent"
android:layout_height="wrap_content"

View File

@ -8,9 +8,9 @@
android:layout_height="fill_parent"
style="?header"
android:gravity="center_vertical" >
<TextView
android:id="@+id/unit_name"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="@string/unitName"
@ -21,13 +21,13 @@
android:gravity="left|center_vertical"
android:textAppearance="?android:attr/textAppearanceMedium" />
<ImageButton
android:id="@+id/imageCheckAll"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_weight="0"
android:layout_marginRight="1dp"
android:paddingLeft="2dp"
android:background="@drawable/uncheck_all"/>
<ImageButton
android:id="@+id/imageCheckAll"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_weight="0"
android:layout_marginRight="1dp"
android:paddingLeft="2dp"
android:background="@drawable/uncheck_all"/>
</LinearLayout>
</LinearLayout>

View File

@ -4,85 +4,86 @@
android:layout_height="fill_parent"
android:orientation="vertical"
style="?bg">
<LinearLayout
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:gravity="left"
android:layout_weight="0"
android:orientation="horizontal"
style="?header"
android:id="@+id/layoutHeader">
<ImageView
android:id="@+id/imageViewMsg"
android:layout_width="wrap_content"
android:layout_height="fill_parent"
android:src="@drawable/alert"
android:paddingLeft="0dp"
android:layout_margin="3dp"
android:layout_weight="0" />
<TextView
android:id="@+id/textView1"
android:layout_width="wrap_content"
android:layout_height="fill_parent"
android:gravity="center_vertical"
android:text="@string/alarms"
android:layout_marginLeft="5dp"
android:textStyle="bold"
android:paddingTop="7dp"
android:textColor="#FFFFFF"
android:textAppearance="?android:attr/textAppearanceMedium"
android:layout_weight="0"/>
<ImageView
android:id="@+id/imageViewSeparator"
android:layout_width="wrap_content"
android:layout_height="fill_parent"
android:layout_gravity="center_vertical"
android:src="@drawable/separator_white"
android:layout_margin="2dp"
android:layout_weight="0"
android:visibility="invisible"
android:focusable="false" />
<ImageView
android:id="@+id/imageViewDown"
android:layout_width="20dp"
android:layout_height="fill_parent"
android:layout_gravity="center_vertical"
android:layout_marginBottom="2dp"
android:layout_marginTop="2dp"
android:focusable="false"
android:visibility="invisible"
android:src="@drawable/arrow_menu_down" />
<ImageButton
android:id="@+id/imageButtonAdd2"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_weight="1"
android:scaleType="centerInside"
android:layout_marginRight="5dp"
android:paddingLeft="2dp"
android:visibility="invisible"
android:background="@drawable/addmessage_selector"/>
</LinearLayout>
<LinearLayout
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_weight="1">
<GridView
android:id="@+id/gridViewAlarms"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:background="#999999"
android:drawSelectorOnTop="false"
android:horizontalSpacing="0dp"
android:listSelector="@drawable/gridalarm_selector"
android:numColumns="1"
android:verticalSpacing="1dp"
android:padding="5dp"/>
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:gravity="left"
android:layout_weight="0"
android:orientation="horizontal"
style="?header"
android:id="@+id/layoutHeader">
<ImageView
android:id="@+id/imageViewMsg"
android:layout_width="wrap_content"
android:layout_height="fill_parent"
android:src="@drawable/alert"
android:paddingLeft="0dp"
android:layout_margin="3dp"
android:layout_weight="0" />
<TextView
android:id="@+id/textView1"
android:layout_width="wrap_content"
android:layout_height="fill_parent"
android:gravity="center_vertical"
android:text="@string/alarms"
android:layout_marginLeft="5dp"
android:textStyle="bold"
android:paddingTop="7dp"
android:textColor="#FFFFFF"
android:textAppearance="?android:attr/textAppearanceMedium"
android:layout_weight="0"/>
<ImageView
android:id="@+id/imageViewSeparator"
android:layout_width="wrap_content"
android:layout_height="fill_parent"
android:layout_gravity="center_vertical"
android:src="@drawable/separator_white"
android:layout_margin="2dp"
android:layout_weight="0"
android:visibility="invisible"
android:focusable="false" />
<ImageView
android:id="@+id/imageViewDown"
android:layout_width="20dp"
android:layout_height="fill_parent"
android:layout_gravity="center_vertical"
android:layout_marginBottom="2dp"
android:layout_marginTop="2dp"
android:focusable="false"
android:visibility="invisible"
android:src="@drawable/arrow_menu_down" />
<ImageButton
android:id="@+id/imageButtonAdd2"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_weight="1"
android:scaleType="centerInside"
android:layout_marginRight="5dp"
android:paddingLeft="2dp"
android:visibility="invisible"
android:background="@drawable/addmessage_selector"/>
<!-- android:background="@drawable/addmessage_selector" -->
</LinearLayout>
<LinearLayout
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_weight="1">
<GridView
android:id="@+id/gridViewAlarms"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:background="#999999"
android:drawSelectorOnTop="false"
android:horizontalSpacing="0dp"
android:listSelector="@drawable/gridalarm_selector"
android:numColumns="1"
android:verticalSpacing="1dp"
android:padding="5dp"/>
</LinearLayout>
</LinearLayout>

Some files were not shown because too many files have changed in this diff Show More