1st version that works

This commit is contained in:
2022-03-14 11:53:00 +02:00
parent ee2884b2ff
commit 3806d2c80d
617 changed files with 17293 additions and 4470 deletions

View File

@ -0,0 +1,15 @@
package com.safemobile.activities;
import android.app.Activity;
import android.os.Bundle;
public class AbstractEmptyActivity extends Activity {
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
}
}

View File

@ -0,0 +1,60 @@
package com.safemobile.activities;
import java.util.ArrayList;
import com.safemobile.lib.Vehicle;
import android.app.Activity;
import android.content.Context;
import android.os.Bundle;
import androidx.appcompat.app.AppCompatActivity;
public abstract class AbstractLiveActivity extends AppCompatActivity {
private AbstractSDParentActivity parentTab;
private Activity activity;
private Context context;
private Bundle savedInstanceState;
public abstract void refreshMap(); // --> updateMap
public abstract void vehiclesReceived(ArrayList<Vehicle> vehiclesList); // --> SaveVehicleInfo
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
/** Misc */
public AbstractSDParentActivity getParentTab() {
return parentTab;
}
public void setParentTab(AbstractSDParentActivity parentTab) {
this.parentTab = parentTab;
}
public Activity getActivity() {
return activity;
}
public void setActivity(Activity activity) {
this.activity = activity;
}
public Context getContext() {
return context;
}
public void setContext(Context context) {
this.context = context;
}
public Bundle getSavedInstanceState() {
return savedInstanceState;
}
public void setSavedInstanceState(Bundle savedInstanceState) {
this.savedInstanceState = savedInstanceState;
}
}

View File

@ -0,0 +1,25 @@
package com.safemobile.activities;
import android.app.Activity;
import android.content.Context;
public abstract class AbstractMessagesActivity extends Activity {
/** Misc */
public AbstractParentActivity parentTab;
public Activity activity;
public Context context;
// GridView Type
public boolean LASTMESSAGES = true;
/*
public abstract void UpdateSMS(ArrayList<SMS> list);
public abstract void updateResultsInUi();
public abstract void selectVehicle4Sc_id(long sc_id);
public abstract void updateTCPConnection(boolean connected);
public abstract void ConfirmSMS(String data);
public abstract void NewSMS(String imei, String message);
public abstract void onContactsUpdate();
*/
}

View File

@ -0,0 +1,129 @@
package com.safemobile.activities;
import com.safemobile.bluetooth.BluetoothTether;
import com.safemobile.lib.AppParams;
import com.safemobile.lib.Contact;
import com.safemobile.lib.R;
import com.safemobile.services.TCPhandler;
import com.safemobile.services.TCPmsgParser;
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.view.View;
import android.view.animation.Animation;
import android.view.animation.AnimationUtils;
import android.widget.ImageView;
import android.widget.RelativeLayout;
@SuppressWarnings("deprecation")
public abstract class AbstractParentActivity extends TabActivity {
/** UI Elements */
public RelativeLayout layoutLoading, relativeLayoutMenu;
public ImageView imageViewLoading;
/** Misc */
public Activity activity;
public Context context;
public NotificationManager mNotificationManager;
public boolean displayLogCat = false; // show logCat messages when TCP send was successful
/** Handler */
public Handler myHandler = new Handler();
/** BlueTooth Tether */
public BluetoothTether bluetoothTether = null;
/** Broadcast Receiver */
public BroadcastReceiver mReceiver = null;
/** TCP */
protected TCPhandler tcp = null;
protected TCPmsgParser tcpParser = null;
/** Methods */
//public void onCreate(Bundle savedInstanceState) { };
public abstract void startAudioHandler();
public abstract void getSetZoneAndChannel(int gwID, int rgwID, int zoneNR, int channelNR);
public abstract void getRadioStatus(int gwID, int rgwID);
public abstract void sendPTT(int callType, long id);
public abstract void sendCallType(int callType, long id);
public abstract void sendDekey();
public abstract void sendReset();
public abstract void sendEmergency(int onOFF);
public abstract void sendEmergency(int onOFF, long group_id);
public abstract void sendSMS(String seqId, long sc_id, String txt);
public abstract void displayToast(final String msg);
public abstract void whenBackPressed(AppParams.ActivityResult result);
public abstract void whenMenuPressed();
public abstract void changeLanguage();
public abstract Contact getVehicleById(long imei);
/** enable the menu buttons placed on the right side of the screen
* @param enable if set to true, the buttons will be enabled, else they will be disabled */
public abstract void enableMenuButtons(boolean enable);
public abstract void setRadioActivity(AbstractRadioActivity radioActivity);
public abstract void setMessagesActivity(AbstractMessagesActivity messageActivity);
/** Send a TCP Command using Async Tasks
* @param params Here you will add parameters for commands, and params[0] will be the Operation Code
* followed by others parameters accordingly to the command*/
public abstract void executeNetworkStuff(String[] params);
/** get if TCP is connected or disconnected or null */
public Object getTCPState() {
// return true if tcp connection is on, false if not connected and null
if(tcp!=null && tcp.isConnectionUP)
return "true";
else if(tcp!=null && !tcp.isConnectionUP)
return "false";
return null;
}
public void showMenu(boolean show)
{
if(relativeLayoutMenu != null)
{
// do not performe animation if already shown or already hidden
if((relativeLayoutMenu.isShown() && show) || (!relativeLayoutMenu.isShown() && !show))
;
else {
Animation anim = AnimationUtils.loadAnimation(this, R.anim.slide_out_bottom);
if(show)
anim = AnimationUtils.loadAnimation(this, R.anim.slide_in_bottom);
relativeLayoutMenu.clearAnimation();
relativeLayoutMenu.startAnimation(anim);
relativeLayoutMenu.setVisibility(show ? View.VISIBLE : View.GONE);
}
}
}
public boolean isMenuVisibile()
{
if(relativeLayoutMenu!= null && relativeLayoutMenu.getVisibility() == View.VISIBLE)
return true;
else
return false;
}
public abstract void unregisterReceivers(BroadcastReceiver receiver);
public abstract void cancelNotification(int drawable);
public abstract void stopTethering();
public abstract void stopAudio();
public abstract void stopTCP();
public abstract void recreateTCPConnection();
public abstract void removeITCPListener();
/*
public abstract void onResume();
public abstract void onStart();
public abstract void onPause();
*/
}

View File

@ -0,0 +1,264 @@
package com.safemobile.activities;
import java.util.ArrayList;
import java.util.ConcurrentModificationException;
import java.util.ListIterator;
import java.util.Timer;
import com.safemobile.lib.AppParams;
import com.safemobile.lib.Contact;
import com.safemobile.lib.radio.Channel;
import com.safemobile.lib.radio.Emerg;
import com.safemobile.lib.radio.IncCall;
import com.safemobile.lib.radio.Zone;
import android.app.Activity;
import android.app.Dialog;
import android.content.Context;
import android.os.Handler;
import android.widget.ArrayAdapter;
public abstract class AbstractRadioActivity extends Activity {
/** Misc */
public AbstractParentActivity parentTab;
public Activity activity;
public Context context;
public boolean emergencyOn = false;
public boolean pttONoff = false;
public IncCall incCall;
public String chMsg = "";
public Emerg emerg;
public Dialog dialogExternal;
// only in PadRadio
//public int radioID, GWID, zoneNR, chNR;
/** Handler */
public Handler myHandler = new Handler();
public Timer timerInCall, timerPTTOn, timerCallType;
/** Lists */
//public ArrayList<String> allContactsNames = new ArrayList<String>();
//public ArrayList<String> allGroupsNames = new ArrayList<String>();
//public ArrayList<Integer> allContactsIDs = new ArrayList<Integer>();
//public ArrayList<Integer> allGroupsIDs = new ArrayList<Integer>();
//public ArrayList<Zone> crtZones = new ArrayList<Zone>();
//public ArrayList<Channel> crtChannels = new ArrayList<Channel>();
public ArrayAdapter<String> adapter;
/** Methods */
//public void onCreate(Bundle savedInstanceState) { };
public abstract void startAudioHandler();
public void PTTclick(int type) { };
/*
public abstract void updateRadioTCPdown();
public abstract void UpdateRadios(ArrayList<RadioGW> radios);
public abstract void UpdateCallTypeChanged(IncCall response);
public abstract void UpdateZoneCH(int _radioID, int _GWID, int _zoneNR, int _chNR);
public abstract void UpdateRadioStatus(int status);
public abstract void UpdateIncCall (IncCall iCall);
public abstract String updateUI(EnumCallState radioStatus);
public abstract void UpdateEmerg (Emerg emerg);
public abstract void onContactsUpdate();
*/
public abstract void sendPTTFromBlueTooth(boolean on);
public abstract void ShowDialog(String title, String errorMsg);
public abstract void stopAudioHandler();
public abstract Object getAudioHandlerState();
public abstract void initUDP();
/** Stop the timer that ends call after one minute */
public void stopTimerInCall()
{
timerInCall.cancel();
timerInCall.purge();
timerInCall = null;
}
/** get Group Contact ID from Name */
public long getGroupID4Name_old(String name)
{
try {
ListIterator<Contact> it = AppParams.listContacts.listIterator();
while(it.hasNext())
{
Contact ctc = it.next();
// if searched name - return corresponding id
if(ctc.name.equals(name) && ctc.contactType == Contact.GROUP)
return ctc.id;
}
long id = -1;
// try to get id from name because the id was manual dialed
try {
id = Long.parseLong(name);
}
catch(Exception ex) {
}
return id;
}
catch (ConcurrentModificationException ex) {
return -1;
}
}
/** get Private Contact ID from Name */
public long getPrivateID4Name_old(String name)
{
try {
ListIterator<Contact> it = AppParams.listContacts.listIterator();
while(it.hasNext())
{
Contact ctc = it.next();
// if searched name - return corresponding id
if(ctc.name.equals(name) && ctc.contactType == Contact.PRIVATE)
return ctc.id;
}
long id = -1;
// try to get id from name because the id was manual dialed
try {
id = Long.parseLong(name);
}
catch(Exception ex) {
}
return id;
}
catch (ConcurrentModificationException ex) {
return -1;
}
}
/** get Private Contact ID from Name */
public String getName4PrivateID(long id)
{
try {
ListIterator<Contact> it = AppParams.listContacts.listIterator();
while(it.hasNext())
{
Contact ctc = it.next();
// if searched name - return corresponding id
if(ctc.id == id && ctc.contactType == Contact.PRIVATE)
return ctc.name;
}
return id+"";
}
catch (ConcurrentModificationException ex) {
return id+"";
}
}
/** get Group Contact ID from Name */
public String getName4GroupID(long id)
{
try {
ListIterator<Contact> it = AppParams.listContacts.listIterator();
while(it.hasNext())
{
Contact ctc = it.next();
// if searched name - return corresponding id
if(ctc.id == id && ctc.contactType == Contact.GROUP)
return ctc.name;
}
return id+"";
}
catch (ConcurrentModificationException ex) {
return id+"";
}
}
/** get zone number from spinner zoneName */
public int getNR4Zone_old(String zoneName)
{
for(Zone zone: AppParams.listZones)
if(zone.ZoneName.equals(zoneName))
return zone.id;
return -1;
}
/** get channel number from spinner chName */
public int getNR4CH_old(String chName)
{
for(Channel ch: AppParams.crtZone.channelList)
if(ch.chName.equals(chName))
return ch.id;
return -1;
}
/** get All Contacts Names */
public static ArrayList<String> getAllContactsName(String type, ArrayList<Contact> listContacts)
{
ArrayList<String> list = new ArrayList<String>();
try {
ListIterator<Contact> it = listContacts.listIterator();
while(it.hasNext())
{
Contact contact = it.next();
if(type.equals("Call"))
list.add(contact.name);
else {
if((type.equalsIgnoreCase("Private Call") && contact.contactType == Contact.PRIVATE) ||
(type.equalsIgnoreCase("Group Call") && contact.contactType == Contact.GROUP))
list.add(contact.name);
}
}
}
catch (ConcurrentModificationException ex) {
}
return list;
}
/** get All Contacts Names */
public static ArrayList<Long> getAllContactsIDs(String type, ArrayList<Contact> listContacts)
{
ArrayList<Long> list = new ArrayList<Long>();
try
{
ListIterator<Contact> it = listContacts.listIterator();
while(it.hasNext())
{
Contact contact = it.next();
if(type.equals("Call"))
list.add((long)contact.id);
if((type.equalsIgnoreCase("Private Call") && contact.contactType == Contact.PRIVATE) ||
(type.equalsIgnoreCase("Group Call") && contact.contactType == Contact.GROUP))
list.add((long)contact.id);
}
}
catch (ConcurrentModificationException ex) {
}
return list;
}
/** Display a toast Message */
public void displayToast(String msg)
{
parentTab.displayToast(msg);
}
}

View File

@ -0,0 +1,15 @@
package com.safemobile.activities;
import android.app.Activity;
import android.content.Context;
public abstract class AbstractRecordingsActivity extends Activity {
/** Misc */
public AbstractParentActivity parentTab;
public Activity activity;
public Context context;
public abstract void deleteSelected(final int position);
}

View File

@ -0,0 +1,323 @@
package com.safemobile.activities;
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;
import com.safemobile.lib.Vehicle;
import com.safemobile.services.TCPhandler;
import com.safemobile.services.TCPmsgParser;
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 */
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;
/** 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;
protected TCPmsgParser tcpParser = null;
/** Methods */
public abstract void displayToast(final String msg);
public abstract void whenBackPressed(AppParams.ActivityResult result);
public abstract void changeLanguage();
public abstract void enableMenuButtons(boolean enable);
public abstract void setRadioActivity(AbstractRadioActivity radioActivity);
public abstract void setLiveActivity(AbstractLiveActivity liveActivity);
public abstract void setMessagesActivity(AbstractMessagesActivity messageActivity);
/** get if TCP is connected or disconnected or null */
public Object getTCPState() {
// return true if tcp connection is on, false if not connected and null
if(tcp!=null && tcp.isConnectionUP)
return "true";
else if(tcp!=null && !tcp.isConnectionUP)
return "false";
return null;
}
public abstract void unregisterReceivers(BroadcastReceiver receiver);
public abstract void cancelNotification(int drawable);
public abstract void stopTCP();
public abstract void stopTCPParser();
public abstract void executeNetworkStuff(String[] params);
public abstract void recreateTCPConnection();
public abstract void removeITCPListener();
public abstract void updateDemoPosition();
public abstract void updateResultsPollInUi(String type);
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)
return false;
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)
return false;
boolean res = tcp.Write("0.0", "#25#" + userID + "#");
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)
return false;
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)
return false;
boolean res = tcp.Write("0.0", "#23#" + userID + "#");
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)
return false;
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;
}
/** send a SMS to a vehicle
* @param seqID is a unique identifier for the SMS
* @param sc_id vehicle imei to which you want to send the SMS
* @param txt the message to be send */
public boolean sendSMS(String seqID, int sc_id, String txt)
{
if(tcp == null)
return false;
boolean res = tcp.Write(seqID, "#24#" + AppParams.USERID + "#" + sc_id + "#" + txt + "#");
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]!!");
return res;
}
public boolean sendAlarmAcknoledge(int alarm_id, int type)
{
if(tcp == null)
return false;
boolean res = tcp.Write("0.0", "#28#" + alarm_id + "#" + type + "#");
if(res)
SM.Debug("Message [sendAlarmAcknoledge] sent to app server alarm_id:" + alarm_id + " type:" + type);
else
SM.Debug("Could not send message [sendAlarmAcknoledge]!!");
return res;
}
public boolean sendPlayRecordingRequest(long record_id)
{
if(tcp == null)
return false;
boolean res = tcp.Write("0.0", "#18#" + record_id + "#");
if(res)
SM.Debug("Message [sendPlayRecordingRequest] sent to app server record_id:"+record_id);
else
SM.Debug("Could not send message [sendPlayRecordingRequest]!!");
return res;
}
public boolean sendDekey(int gwID, int radioID)
{
if(tcp == null)
return false;
boolean res = tcp.Write("0.0", "#30#160#" + gwID + "." + radioID + "#");
if(res)
SM.Debug("Message [sendDekey] sent to app server record_id");
else
SM.Debug("Could not send message [sendDeKey]!!");
return res;
}
public boolean getHistoryPositions(int sc_id, long timeGMTStart, long timeGMTStop)
{
if(tcp == null)
return false;
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");
else
SM.Debug("Could not send message [getHistoryPositions]!!");
return res;
}
public boolean getRadiosList()
{
if(tcp == null)
return false;
boolean res = tcp.Write("0.0", "#30#100#");
if(res)
SM.Debug("Message [getRadiosList] sent to app server");
else
SM.Debug("Could not send message [getRadiosList]!!");
return res;
}
// if zoneNr=0 and channelNR =0 then function acts as GET
public boolean getSetZoneAndChannel(int gwID, int rgwID, int zoneNR, int channelNR)
{
if(tcp == null)
return false;
boolean res = tcp.Write("0.0", "#30#104#" + gwID + "#" + rgwID + "#" + zoneNR + "#" +channelNR +"#");
if(res)
SM.Debug("Message [GetSetZoneAndChannel] sent to app server zoneNR:"+zoneNR+ " channelNR:"+channelNR);
else
SM.Debug("Could not send message [GetSetZoneAndChannel]!!");
return res;
}
public boolean getRadioStatus(int gwID, int rgwID)
{
if(tcp == null)
return false;
boolean res = tcp.Write("0.0", "#30#99#" + gwID + "#" + rgwID + "#");
if(res)
SM.Debug("Message [RadioGetRadioList] sent to app server || gwID: " + gwID + " | rgwID: " + rgwID);
else
SM.Debug("Could not send message [getLastSMS]!!");
return res;
}
public boolean getAlarms(long userID)
{
if(tcp == null)
return false;
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]!!");
return res;
}
public boolean getRecordings(int gwID, int radioID)
{
if(tcp == null)
return false;
boolean res = tcp.Write("0.0", "#29#"+AppParams.USERID+"#"+ gwID +"#"+ radioID +"#");
if(res)
SM.Debug("Message [GetRecordings] sent to app server");
else
SM.Debug("Could not send message [GetRecordings]!!");
return res;
}
//public abstract void getVehiclePosition(long imei);
/*
public abstract void onResume();
public abstract void onStart();
public abstract void onPause();
*/
}

View File

@ -0,0 +1,138 @@
package com.safemobile.adapters;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import android.annotation.SuppressLint;
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.Alarm;
import com.safemobile.lib.R;
import com.safemobile.lib.SM;
@SuppressLint("SimpleDateFormat")
public class AlertGridViewAdapter extends BaseAdapter
{
private ArrayList<Alarm> listAlarms;
private Activity activity;
private ArrayList<Boolean> acknowledged = new ArrayList<Boolean>();
public AlertGridViewAdapter(Activity activity, ArrayList<Alarm> listAlarms, Context context, ArrayList<Boolean> acknowledged) {
super();
this.activity = activity;
this.listAlarms = listAlarms;
this.acknowledged = acknowledged;
}
@Override
public int getCount() {
return listAlarms.size();
}
@Override
public Alarm getItem(int position) {
return listAlarms.get(position);
}
@Override
public long getItemId(int position) {
return 0;
}
public static class ViewHolder
{
public LinearLayout layoutAlert;
public ImageView imageViewAlert, imageViewRecycle;
public TextView textViewUnitName, textViewType, textViewDate;
}
@SuppressWarnings("deprecation")
@SuppressLint("SimpleDateFormat")
@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_alert, null);
view.textViewUnitName = (TextView) convertView.findViewById(R.id.textViewUnitName);
view.textViewType = (TextView) convertView.findViewById(R.id.textViewType);
view.textViewDate = (TextView) convertView.findViewById(R.id.textViewDate);
view.imageViewRecycle = (ImageView) convertView.findViewById(R.id.imageViewRecycle);
view.imageViewAlert = (ImageView) convertView.findViewById(R.id.imageViewAlert);
view.layoutAlert = (LinearLayout) convertView.findViewById(R.id.layoutAlert);
convertView.setTag(view);
}
else
{
view = (ViewHolder) convertView.getTag();
}
view.textViewUnitName.setText(listAlarms.get(position).unitName);
view.textViewType.setText(listAlarms.get(position).typestr);
//view.txtViewDescription.setText(listAlarms.get(position).description);
SimpleDateFormat sdf = new SimpleDateFormat("HH:mm:ss");
Date date = new Date((long)listAlarms.get(position).timeGMT * 1000);
if(date.getDate() == Calendar.getInstance().get(Calendar.DAY_OF_MONTH))
sdf = new SimpleDateFormat("HH:mm:ss");
else
sdf = new SimpleDateFormat("MMM-dd HH:mm");
view.textViewDate.setText(String.valueOf(sdf.format(date)));
// set ack/!ack image
switch(acknowledged.get(position) ? 1 : 0)
{
case 1:
view.imageViewAlert.setImageResource(R.drawable.alert_off);
//view.layoutAlarm.setBackgroundColor(0xffffffff);
break;
case 0:
view.imageViewAlert.setImageResource(R.drawable.alert);
//view.layoutAlarm.setBackgroundColor(0xffcccccc);
break;
}
return convertView;
}
public void changeACK(int position)
{
SM.Debug("ACK ON START: " + position + " | " + (acknowledged.get(position) ? "true": "false"));
// change in list
acknowledged.remove(position);
acknowledged.add(position, true);
ViewHolder view = new ViewHolder();
LayoutInflater inflator = activity.getLayoutInflater();
View convertView = null;
if(convertView==null)
{
convertView = inflator.inflate(R.layout.row_alert, null);
try
{
view.imageViewAlert = (ImageView) convertView.findViewById(R.id.imageViewAlert);
view.imageViewAlert.setImageResource(R.drawable.alert_off);
convertView.setTag(view);
view = (ViewHolder) convertView.getTag();
}
catch (Exception e) {
}
}
}
}

View File

@ -0,0 +1,107 @@
package com.safemobile.adapters;
import java.util.ArrayList;
import com.safemobile.lib.AppParams;
import com.safemobile.lib.Contact;
import com.safemobile.lib.R;
import android.app.Activity;
import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.ImageView;
import android.widget.TextView;
public class ContactsComboBoxAdapter extends ArrayAdapter<Contact>{
private Context context;
int layoutResourceId;
private ArrayList<Contact> listValues;
public ContactsComboBoxAdapter(Context context, int textViewResourceId, ArrayList<Contact> listValues) {
super(context, textViewResourceId, listValues);
this.context = context;
this.layoutResourceId = textViewResourceId;
this.listValues = listValues;
}
@Override
public View getDropDownView(int position, View convertView, ViewGroup parent) {
return getCustomView(position, convertView, parent);
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
return getCustomView(position, convertView, parent);
}
public View getCustomView(int position, View convertView, ViewGroup parent) {
View row = convertView;
ImagesSpinnerHolder holder = null;
if(row == null) {
LayoutInflater inflater = ((Activity) context).getLayoutInflater();
/*LayoutInflater inflater = (LayoutInflater) context
.getSystemService(Context.LAYOUT_INFLATER_SERVICE);*/
row = inflater.inflate(layoutResourceId, parent, false);
holder = new ImagesSpinnerHolder();
holder.textSpinner = (TextView)row.findViewById(R.id.language);
holder.imgSpinner = (ImageView)row.findViewById(R.id.icon);
row.setTag(holder);
}
else
holder = (ImagesSpinnerHolder)row.getTag();
holder.textSpinner.setText(getTextFromArrayList(position));
holder.imgSpinner.setImageResource(getImageFromArrayList(position));
return row;
}
/**
* Find which generic type which is used in the array list and then display the string field for that class type
* @param position The position in the array list which needs to be displayed
* @return The string which will be used
*/
private String getTextFromArrayList(int position) {
return listValues.get(position).name;
}
/**
* Find which generic type which is used in the array list and then get the icon which needs to be displayed
* @param position The position in the array list which needs to be displayed
* @return The Image Resource which will be displayed
*/
private int getImageFromArrayList(int position) {
int contactType = listValues.get(position).contactType;
switch(contactType)
{
case AppParams.MotoManualDial:
return R.drawable.dial;
case AppParams.MotoAllCall:
return R.drawable.call_all_green_small;
case AppParams.MotoPrivate:
return R.drawable.call_private_green_small;
case AppParams.MotoGroup:
return R.drawable.call_group_green_small;
default: return R.drawable.call_private_blue_small;
}
}
private class ImagesSpinnerHolder {
ImageView imgSpinner;
TextView textSpinner;
}
}

View File

@ -0,0 +1,200 @@
package com.safemobile.adapters;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
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;
import android.widget.BaseAdapter;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.TextView;
import com.safemobile.lib.Msg;
import com.safemobile.lib.R;
import com.safemobile.lib.SM;
public class ConversationGridViewAdapter extends BaseAdapter
{
private ArrayList<Msg> listMessages;
private Activity activity;
//public String time;
private ArrayList<Boolean> dispatcher_positions = new ArrayList<Boolean>();
private ArrayList<Boolean> ackPositions = new ArrayList<Boolean>();
private Hashtable<Integer, View> hash = new Hashtable<Integer, View>();
public 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.dispatcher_positions = dispatcher_positions;
this.ackPositions = ackPositions;
}
@Override
public int getCount() {
return listMessages.size();
}
@Override
public Msg getItem(int position) {
return listMessages.get(position);
}
@Override
public long getItemId(int position) {
return 0;
}
public static class ViewHolder
{
public ImageView imgViewContact;
public TextView txtViewMsg;
public TextView txtViewDateTime;
public ImageView imgViewReceivedContact;
public TextView txtViewReceivedMsg;
public TextView txtViewReceivedDateTime;
public ImageView imageAck;
public TextView textViewNotACK;
public LinearLayout layoutSend;
public LinearLayout layoutReceived;
}
@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");
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);
if(listMessages.get(position).received.after(calendar.getTime()))
sdf = new SimpleDateFormat("HH:mm:ss");
else
sdf = new SimpleDateFormat("HH:mm MMM-dd");
//view.imgViewContact.setImageResource(getIcon(listMessages.get(position).from.user_type));
view.imgViewContact.setImageResource(R.drawable.peoplegreen_large);
view.txtViewMsg.setText(listMessages.get(position).message);
view.txtViewDateTime.setText(sdf.format(listMessages.get(position).received));
//view.imgViewReceivedContact.setImageResource(getIcon(listMessages.get(position).from.user_type));
view.imgViewReceivedContact.setImageResource(listMessages.get(position).from.getLargeIcon());
view.txtViewReceivedMsg.setText(listMessages.get(position).message);
view.txtViewReceivedDateTime.setText(sdf.format(listMessages.get(position).received));
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(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, i=0;
for(Msg msg: listMessages)
{
if(msg.seqID.equals(seqID))
position = i;
i++;
}
if(position > -1 && position < ackPositions.size()) {
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

@ -0,0 +1,53 @@
package com.safemobile.adapters;
import com.safemobile.lib.R;
import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.ImageView;
import android.widget.TextView;
public class LanguageSpinnerAdapter extends ArrayAdapter<String>{
private String[] Languages;
private LayoutInflater inflater;
public LanguageSpinnerAdapter(Context context, int textViewResourceId,String[] Languages, LayoutInflater inflater) {
super(context, textViewResourceId, Languages);
this.Languages = Languages;
this.inflater = inflater;
}
@Override
public View getDropDownView(int position, View convertView, ViewGroup parent) {
return getCustomView(position, convertView, parent);
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
return getCustomView(position, convertView, parent);
}
public View getCustomView(int position, View convertView, ViewGroup parent) {
View row = inflater.inflate(R.layout.spinner, parent, false);
TextView label=(TextView)row.findViewById(R.id.language);
label.setText(Languages[position]);
ImageView icon =(ImageView)row.findViewById(R.id.icon);
switch (position)
{
case 0: icon.setImageResource(R.drawable.en); break;
case 1: icon.setImageResource(R.drawable.de); break;
case 2: icon.setImageResource(R.drawable.tr); break;
case 3: icon.setImageResource(R.drawable.ro); break;
case 4: icon.setImageResource(R.drawable.ru); break;
case 5: icon.setImageResource(R.drawable.es); break;
case 6: icon.setImageResource(R.drawable.ara); break;
}
return row;
}
}

View File

@ -0,0 +1,231 @@
package com.safemobile.adapters;
import java.util.ArrayList;
import java.util.Hashtable;
import android.app.Activity;
import android.content.Context;
import android.graphics.ColorMatrix;
import android.graphics.ColorMatrixColorFilter;
import android.graphics.drawable.Drawable;
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.lib.Vehicle;
public class LiveGridViewAdapter extends BaseAdapter
{
private ArrayList<Vehicle> listVehicle;
private ArrayList<Boolean> displayedVehicles;
public ArrayList<Boolean> disabledVehicles;
private Activity activity;
//public String time;
//private int[] colors = new int[] { Color.parseColor("#FFFFFF"), Color.parseColor("#D2E4FC") };
private Hashtable<Integer, View> hash = new Hashtable<Integer, View>();
public LiveGridViewAdapter(Activity activity, ArrayList<Vehicle> listVehicle, Context context, ArrayList<Boolean> displayedVehicles, ArrayList<Boolean> disabledVehicles)
{
super();
this.activity = activity;
this.listVehicle = listVehicle;
//this.time = time;
this.displayedVehicles = displayedVehicles;
this.disabledVehicles = disabledVehicles;
}
@Override
public int getCount() {
return listVehicle.size();
}
@Override
public Vehicle getItem(int position) {
return listVehicle.get(position);
}
@Override
public long getItemId(int position) {
return 0;
}
public static class ViewHolder
{
public ImageView imgViewIcon, imgViewChecked;
public TextView txtViewName;
public LinearLayout layoutVehicle;
}
@Override
public View getView(final int position, View convertView, ViewGroup parent) {
final ViewHolder view;
LayoutInflater inflator = activity.getLayoutInflater();
if(convertView==null)
{
view = new ViewHolder();
convertView = inflator.inflate(R.layout.row_vehicle, null);
view.imgViewIcon = (ImageView) convertView.findViewById(R.id.imageViewIcon);
view.txtViewName = (TextView) convertView.findViewById(R.id.textViewName);
view.imgViewChecked = (ImageView) convertView.findViewById(R.id.imageViewChecked);
//view.linearLayoutChecked = (LinearLayout) convertView.findViewById(R.id.linearLayoutChecked);
view.layoutVehicle = (LinearLayout) convertView.findViewById(R.id.layoutVehicle);
convertView.setTag(view);
}
else
{
view = (ViewHolder) convertView.getTag();
}
hash.put(position, convertView);
view.imgViewIcon.setImageResource(listVehicle.get(position).getSmallIcon());
view.txtViewName.setText(listVehicle.get(position).name);
// set color
//int colorPos = position % colors.length;
//view.layoutVehicle.setBackgroundColor(colors[colorPos]);
switch(displayedVehicles.get(position) ? 1 : 0)
{
case 1:
view.imgViewChecked.setImageResource(R.drawable.checked);
break;
case 0:
view.imgViewChecked.setImageResource(R.drawable.unchecked);
break;
}
switch(disabledVehicles.get(position) ? 1 : 0)
{
case 1:
view.layoutVehicle.setBackgroundColor(0xffcccccc);
//view.imgViewIcon.setImageDrawable(convertToGrayscale(activity.getResources().getDrawable(listVehicle.get(position).getSmallIcon())));
break;
case 0:
view.layoutVehicle.setBackgroundColor(0xffFFFFFF);
//view.imgViewIcon.setImageResource(listVehicle.get(position).getSmallIcon());
break;
}
return convertView;
}
public void changeDisplayed(int position, int status)
{
SM.Debug("DISABLE ON START: " + position + " | " + (disabledVehicles.get(position) ? "true": "false"));
SM.Debug("DISPLAY ON START: " + position + " | " + (displayedVehicles.get(position) ? "true": "false"));
// if vehicle is enable
if(status == 1)
{
// change icon
//view.imgViewChecked.setImageResource(R.drawable.unchecked);
// change in list
disabledVehicles.remove(position);
disabledVehicles.add(position, false);
}
else if(status == 0)
{
// change icon
//view.imgViewChecked.setImageResource(R.drawable.checked);
// change in list
disabledVehicles.remove(position);
disabledVehicles.add(position, true);
}
// change displayed
else if (status == -1)
{
// check selected position
displayedVehicles.remove(position);
displayedVehicles.add(position, true);
}
ViewHolder view = new ViewHolder();
LayoutInflater inflator = activity.getLayoutInflater();
View convertView = null;
if(convertView==null)
{
convertView = inflator.inflate(R.layout.row_vehicle, null);
try
{
view.layoutVehicle = (LinearLayout) convertView.findViewById(R.id.layoutVehicle);
view.imgViewIcon = (ImageView) convertView.findViewById(R.id.imageViewIcon);
view.imgViewChecked = (ImageView) convertView.findViewById(R.id.imageViewChecked);
convertView.setTag(view);
view = (ViewHolder) convertView.getTag();
}
catch (Exception e) {
}
}
SM.Debug("DISABLE AFTER: " + position + " | " + (disabledVehicles.get(position) ? "true": "false"));
SM.Debug("DISPLAY AFTER: " + position + " | " + (displayedVehicles.get(position) ? "true": "false"));
switch(disabledVehicles.get(position) ? 1 : 0)
{
case 1:
view.layoutVehicle.setBackgroundColor(0xffcccccc);
//view.imgViewIcon.setImageDrawable(convertToGrayscale(activity.getResources().getDrawable(listVehicle.get(position).getSmallIcon())));
break;
case 0:
view.layoutVehicle.setBackgroundColor(0xffFFFFFF);
//view.imgViewIcon.setImageResource(listVehicle.get(position).getSmallIcon());
break;
}
switch(displayedVehicles.get(position) ? 1 : 0)
{
case 1:
view.imgViewChecked.setImageResource(R.drawable.checked);
break;
case 0:
view.imgViewChecked.setImageResource(R.drawable.unchecked);
break;
}
}
public void changeView(int position)
{
View con = hash.get(position);
ViewHolder view = (ViewHolder) con.getTag();
switch(disabledVehicles.get(position) ? 1 : 0)
{
case 1:
view.layoutVehicle.setBackgroundColor(0xffcccccc);
//view.imgViewIcon.setImageDrawable(convertToGrayscale(activity.getResources().getDrawable(listVehicle.get(position).getSmallIcon())));
break;
case 0:
view.layoutVehicle.setBackgroundColor(0xffFFFFFF);
//view.imgViewIcon.setImageResource(listVehicle.get(position).getSmallIcon());
break;
}
switch(displayedVehicles.get(position) ? 1 : 0)
{
case 1:
view.imgViewChecked.setImageResource(R.drawable.checked);
break;
case 0:
view.imgViewChecked.setImageResource(R.drawable.unchecked);
break;
}
}
protected Drawable convertToGrayscale(Drawable drawable)
{
ColorMatrix matrix = new ColorMatrix();
matrix.setSaturation(0);
ColorMatrixColorFilter filter = new ColorMatrixColorFilter(matrix);
drawable.setColorFilter(filter);
return drawable;
}
}

View File

@ -0,0 +1,132 @@
package com.safemobile.adapters;
import java.text.SimpleDateFormat;
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;
import android.widget.BaseAdapter;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.TextView;
import com.safemobile.lib.Msg;
import com.safemobile.lib.R;
import com.safemobile.lib.SM;
public class MessagesGridViewAdapter extends BaseAdapter
{
private ArrayList<Msg> listMessages;
private Activity activity;
//public String time;
//private int[] colors = new int[] { Color.parseColor("#FFFFFF"), Color.parseColor("#D2E4FC") };
public MessagesGridViewAdapter(Activity activity, ArrayList<Msg> listMessages, Context context) {
super();
this.activity = activity;
this.listMessages = listMessages;
}
@Override
public int getCount() {
return listMessages.size();
}
@Override
public Msg getItem(int position) {
return listMessages.get(position);
}
@Override
public long getItemId(int position) {
return 0;
}
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)
{
view = new ViewHolder();
convertView = inflator.inflate(R.layout.row_message, null);
view.imgViewContact = (ImageView) convertView.findViewById(R.id.imageViewContact);
view.txtViewContact = (TextView) convertView.findViewById(R.id.textViewContact);
view.txtViewDateTime = (TextView) convertView.findViewById(R.id.textViewLastDate);
view.txtViewLastMsg = (TextView) convertView.findViewById(R.id.textViewLastMsg);
view.layoutMessage = (LinearLayout) convertView.findViewById(R.id.layoutMessage);
convertView.setTag(view);
}
else
{
view = (ViewHolder) convertView.getTag();
}
try
{
view.imgViewContact.setImageResource(listMessages.get(position).from.getLargeIcon());
//view.imgViewContact.setImageResource(R.drawable.peopleblue);
view.txtViewContact.setText(listMessages.get(position).from.name+ " :");
if(listMessages.get(position).message.length() > 25)
view.txtViewLastMsg.setText(listMessages.get(position).message.substring(0, 25) + "...");
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.MINUTE, 0);
calendar.set(Calendar.SECOND, 0);
calendar.set(Calendar.MILLISECOND, 0);
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)
{
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

@ -0,0 +1,128 @@
package com.safemobile.adapters;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
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.AppParams;
import com.safemobile.lib.Contact;
import com.safemobile.lib.R;
import com.safemobile.lib.SM;
import com.safemobile.libpad.PadTextMessage;
public class PadMessagesGridViewAdapter extends BaseAdapter
{
private ArrayList<PadTextMessage> listMessages;
private Activity activity;
//public String time;
//private int[] colors = new int[] { Color.parseColor("#FFFFFF"), Color.parseColor("#D2E4FC") };
public PadMessagesGridViewAdapter(Activity activity, ArrayList<PadTextMessage> listMessages, Context context) {
super();
this.activity = activity;
this.listMessages = listMessages;
}
@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 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)
{
view = new ViewHolder();
convertView = inflator.inflate(R.layout.row_message, null);
view.imgViewContact = (ImageView) convertView.findViewById(R.id.imageViewContact);
view.txtViewContact = (TextView) convertView.findViewById(R.id.textViewContact);
view.txtViewDateTime = (TextView) convertView.findViewById(R.id.textViewLastDate);
view.txtViewLastMsg = (TextView) convertView.findViewById(R.id.textViewLastMsg);
view.layoutMessage = (LinearLayout) convertView.findViewById(R.id.layoutMessage);
convertView.setTag(view);
}
else
{
view = (ViewHolder) convertView.getTag();
}
try
{
view.imgViewContact.setImageResource(R.drawable.peopleblue_large);
//view.imgViewContact.setImageResource(R.drawable.peopleblue);
view.txtViewContact.setText(Contact.getNameForRadioID(AppParams.listContacts, listMessages.get(position).radioID)+ " :");
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",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("MMM-dd HH:mm", Locale.getDefault());
// set gmt time
//sdf.setTimeZone(TimeZone.getTimeZone("GMT"));
view.txtViewDateTime.setText(sdf.format(date));
}
catch(Exception ex)
{
SM.Exception(ex.toString());
}
return convertView;
}
}

View File

@ -0,0 +1,328 @@
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;
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.Contact;
import com.safemobile.lib.SM;
import com.safemobile.libpad.PadRecording;
public class PadRecordingsGridViewAdapter extends BaseAdapter
{
private ArrayList<PadRecording> 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 PadRecordingsGridViewAdapter(Activity activity, Context context, ArrayList<PadRecording> listRecordings)
{
super();
this.activity = activity;
this.context = context;
this.listRecordings = listRecordings;
this.recordingExists = new ArrayList<Boolean>();
for(int i=0; i<listRecordings.size(); i++)
recordingExists.add(true);
playingPositions = new ArrayList<Boolean>();
for(int i=0; i<listRecordings.size(); i++)
playingPositions.add(false);
}
@Override
public int getCount() {
return listRecordings.size();
}
@Override
public PadRecording getItem(int position) {
return listRecordings.get(position);
}
@Override
public long getItemId(int position) {
return 0;
}
public ArrayList<PadRecording> getRecordings() {
return listRecordings;
}
/** 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 inflator = activity.getLayoutInflater();
if(convertView==null)
{
view = new ViewHolder();
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);
convertView.setTag(view);
}
else
{
view = (ViewHolder) convertView.getTag();
}
hash.put(position, convertView);
try {
//SM.Debug("SIZE EXISTS : " + recordingExists.size() + " | " + playingPositions.size());
/* if recording doesn't exists change background */
/*
if(recordingExists.size()> position && !recordingExists.get(position))
view.layoutRecording.setBackgroundColor(0xFFDDDDDD);
else
*/
if(playingPositions.size() > position)
{
/* if recording is not playing let background to white */
if(!playingPositions.get(position))
view.layoutRecording.setBackgroundColor(0xFFFFFFFF);
else
view.layoutRecording.setBackgroundColor(0xFF457c98);
}
else
view.layoutRecording.setBackgroundColor(0xFFFFFFFF);
/* change icon according to call type [outgoing or incoming] */
if(listRecordings.size() > position)
switch(listRecordings.get(position).callType)
{
case AppParams.MotoAllCall:
if(!listRecordings.get(position).isOutgoing)
view.imageViewPlay.setImageResource(R.drawable.call_received_all);
else
view.imageViewPlay.setImageResource(R.drawable.call_made_all);
break;
case AppParams.MotoPrivate:
if(!listRecordings.get(position).isOutgoing)
view.imageViewPlay.setImageResource(R.drawable.call_received);
else
view.imageViewPlay.setImageResource(R.drawable.call_made);
break;
case AppParams.MotoGroup:
if(!listRecordings.get(position).isOutgoing)
view.imageViewPlay.setImageResource(R.drawable.call_received_group);
else
view.imageViewPlay.setImageResource(R.drawable.call_made_group);
break;
}
}
catch(IndexOutOfBoundsException ex) {
SM.Exception("IndexOutOfBounds Exception [PadRecordingsGridViewAdapter]" + ex.toString());
}
/*
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.imageViewRecycle.setVisibility(View.GONE);
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);
}
});
String sender = "", name="", initName="";
for(Contact cont: AppParams.listContacts)
{
if(cont.id == getItem(position).radioID)
{
// get name only if callType equals with the one from the ConfigFile
if( (getItem(position).callType == AppParams.MotoPrivate && cont.contactType == Contact.PRIVATE)
|| (getItem(position).callType == AppParams.MotoGroup && cont.contactType == Contact.GROUP)
|| (getItem(position).callType == AppParams.MotoAllCall))
// || getItem(position).type == AppParams.AllCall && cont.callType.equals("All Call"))
name = cont.name;
}
if (cont.id == getItem(position).initRadioID) {
// get name only if callType equals with the one from the ConfigFile
if( (getItem(position).callType == AppParams.MotoPrivate && cont.contactType == Contact.PRIVATE)
|| (getItem(position).callType == AppParams.MotoGroup && cont.contactType == Contact.GROUP)
|| (getItem(position).callType == AppParams.MotoAllCall))
// || getItem(position).type == AppParams.AllCall && cont.callType.equals("All Call"))
initName = cont.name;
}
// if call type is Group I should find a private
if(getItem(position).callType == AppParams.MotoGroup && (cont.id == getItem(position).initRadioID && cont.contactType == Contact.PRIVATE))
initName = cont.name;
}
// // set name to All Call if call was made from tabled
if(getItem(position).callType == AppParams.MotoAllCall && getItem(position).isOutgoing)
sender += context.getResources().getString(R.string.AllCall);
else if(getItem(position).callType == AppParams.MotoAllCall) {
name = context.getResources().getString(R.string.AllCall);
if(initName.length() > 0)
sender = name + " [" + initName + "]";
else
sender = name + " [" + getItem(position).initRadioID + "]";
}
// add the name/id of the contact that initiated the AllCall
else if(name.length() < 1)
sender += getItem(position).radioID;
else
sender += name;
// add caller name for group call
if(listRecordings.get(position).callType == AppParams.MotoGroup)
{
if(!getItem(position).isOutgoing) {
if(initName.length() > 0)
sender = name + " [" + initName + "]";
else
sender = name + " [" + getItem(position).initRadioID + "]";
}
else
sender = name;
}
// for private call that was received I have to get the id from the initRadioID
else if(listRecordings.get(position).callType == AppParams.MotoPrivate)
{
if(!getItem(position).isOutgoing && initName.length()>0)
sender = initName;
else if (!getItem(position).isOutgoing)
sender += getItem(position).initRadioID + "";
}
view.textViewSender.setText(sender);
view.textViewDuration.setText("[" + listRecordings.get(position).duration + " sec]");
/* Add call Date */
Date date = new Date(getItem(position).timeGMT * 1000);
SimpleDateFormat sdf = new SimpleDateFormat("HH:mm:ss", Locale.getDefault());
Calendar calendar = Calendar.getInstance(TimeZone.getTimeZone("GMT"));
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()))
sdf = new SimpleDateFormat("HH:mm:ss", Locale.getDefault());
else
sdf = new SimpleDateFormat("MMM-dd HH:mm", Locale.getDefault());
// set gmt time
//sdf.setTimeZone(TimeZone.getTimeZone("GMT"));
view.textViewDate.setText(sdf.format(date));
return convertView;
}
/** 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;
}
/** 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);
// make changes in the UI //
try {
PadRecordingsGridViewAdapter.ViewHolder viewHolder = (PadRecordingsGridViewAdapter.ViewHolder) getView(position).getTag();
if(!playing)
viewHolder.layoutRecording.setBackgroundColor(0xFFFFFFFF);
else
viewHolder.layoutRecording.setBackgroundColor(0xFF457c98);
}
catch (NullPointerException ex) {
}
}
}

View File

@ -0,0 +1,254 @@
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;
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;
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<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;
}
}
@Override
public int getCount() {
return listRecordings.size();
}
@Override
public Recording getItem(int position) {
return listRecordings.get(position);
}
@Override
public long getItemId(int position) {
return 0;
}
/** 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 inflator = activity.getLayoutInflater();
if(convertView==null)
{
view = new ViewHolder();
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
{
view = (ViewHolder) convertView.getTag();
}
hash.put(position, convertView);
/* if recording doesn't exists change background */
if(!recordingExists.get(position))
view.layoutRecording.setBackgroundColor(0xFFFFFFFF);
else
{
/* if recording is not playing let background to white */
if(!playingPositions.get(position))
view.layoutRecording.setBackgroundColor(0xFFFFFFFF);
else
view.layoutRecording.setBackgroundColor(0xFF457c98);
}
/* change icon according to call type [outgoing or incoming] */
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.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);
}
});
// 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 sdf = new SimpleDateFormat("HH:mm:ss");
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);
if(date.after(calendar.getTime()))
sdf = new SimpleDateFormat("HH:mm:ss");
else
sdf = new SimpleDateFormat("MMM-dd HH:mm");
// set gmt time
//sdf.setTimeZone(TimeZone.getTimeZone("GMT"));
view.textViewDate.setText(sdf.format(date));
return convertView;
}
/** 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;
}
/** 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.layoutRecording.setBackgroundColor(0xFFFFFFFF);
else
viewHolder.layoutRecording.setBackgroundColor(0xFF457c98);
// update hash
hash.get(position).setTag(viewHolder);
}
}

View File

@ -0,0 +1,178 @@
package com.safemobile.adapters;
import java.util.ArrayList;
import java.util.Hashtable;
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.AppParams;
import com.safemobile.lib.R;
import com.safemobile.lib.Vehicle;
public class VehiclesGridViewAdapter extends BaseAdapter
{
private ArrayList<Vehicle> listVehicles;
private ArrayList<Boolean> disabledVehicles;
private ArrayList<Boolean> displayedVehicles;
private Activity activity;
private Hashtable<Integer, View> hash = new Hashtable<Integer, View>();
public VehiclesGridViewAdapter(Activity activity, Context context, ArrayList<Vehicle> listVehicles, ArrayList<Boolean> disabledVehicles)
{
super();
this.activity = activity;
this.listVehicles = listVehicles;
this.disabledVehicles = disabledVehicles;
// set displayed positions to false
displayedVehicles = new ArrayList<Boolean>();
for(Vehicle veh: listVehicles)
{
if(AppParams.DEMO && (veh.sc_id == 101 || veh.sc_id == 102))
displayedVehicles.add(true);
else
displayedVehicles.add(false);
}
}
@Override
public int getCount() {
return listVehicles.size();
}
@Override
public Vehicle getItem(int position) {
return listVehicles.get(position);
}
@Override
public long getItemId(int position) {
return 0;
}
/** Define Row Template */
public static class ViewHolder
{
public ImageView imgViewIcon, imgViewChecked;
public TextView txtViewName;
public LinearLayout layoutVehicle;
}
@Override
public View getView(final int position, View convertView, ViewGroup parent) {
final ViewHolder view;
LayoutInflater inflator = activity.getLayoutInflater();
if(convertView==null)
{
view = new ViewHolder();
convertView = inflator.inflate(R.layout.row_vehicle, null);
view.imgViewIcon = (ImageView) convertView.findViewById(R.id.imageViewIcon);
view.txtViewName = (TextView) convertView.findViewById(R.id.textViewName);
view.imgViewChecked = (ImageView) convertView.findViewById(R.id.imageViewChecked);
view.layoutVehicle = (LinearLayout) convertView.findViewById(R.id.layoutVehicle);
convertView.setTag(view);
}
else
{
view = (ViewHolder) convertView.getTag();
}
hash.put(position, convertView);
/* if recording disabled change background */
try
{
if(!disabledVehicles.get(position))
view.layoutVehicle.setBackgroundColor(0xFFDDDDDD);
else
view.layoutVehicle.setBackgroundColor(0xFFFFFFFF);
}
catch(IndexOutOfBoundsException ex) {
view.layoutVehicle.setBackgroundColor(0xFFFFFFFF);
}
/* set vehicle name and icon */
view.imgViewIcon.setImageResource(listVehicles.get(position).getSmallIcon());
view.txtViewName.setText(listVehicles.get(position).name);
/* set checked or not */
if(displayedVehicles.get(position))
view.imgViewChecked.setImageResource(R.drawable.checked);
else
view.imgViewChecked.setImageResource(R.drawable.unchecked);
return convertView;
}
/** Get the View for one row in the GridView */
public View getView(int position)
{
return (View) hash.get(position);
}
/** Change all vehicles checkBox */
public void changeDisplayAll(boolean display)
{
for(int i=0; i<listVehicles.size(); i++)
displayedVehicles.set(i, display);
for(int i=0; i<hash.size(); i++)
{
// change value in the vector
displayedVehicles.set(i, display);
// make changes in the UI //
ViewHolder viewHolder = (ViewHolder) getView(i).getTag();
if(viewHolder!=null)
{
if(display)
viewHolder.imgViewChecked.setImageResource(R.drawable.checked);
else
viewHolder.imgViewChecked.setImageResource(R.drawable.unchecked);
}
}
}
/** Change displayed vehicle checkBox */
public void changeDisplayed(int position, boolean display)
{
// change value in the vector
displayedVehicles.set(position, display);
// make changes in the UI //
ViewHolder viewHolder = (ViewHolder) getView(position).getTag();
if(display)
viewHolder.imgViewChecked.setImageResource(R.drawable.checked);
else
viewHolder.imgViewChecked.setImageResource(R.drawable.unchecked);
}
/** Change disabled vehicle background */
public void changeDisabled(int position, boolean disabled)
{
// change value in the vector
disabledVehicles.set(position, disabled);
// make changes in the UI //
ViewHolder viewHolder = (ViewHolder) getView(position).getTag();
if(disabled)
viewHolder.layoutVehicle.setBackgroundColor(0xFFDDDDDD);
else
viewHolder.layoutVehicle.setBackgroundColor(0xFFFFFFFF);
}
}

View File

@ -0,0 +1,169 @@
package com.safemobile.adapters;
import java.util.ArrayList;
import com.safemobile.lib.R;
import com.safemobile.lib.radio.ZoneChannel;
import android.app.Activity;
import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.ImageView;
import android.widget.TextView;
public class ZoneChannelComboBoxAdapter extends ArrayAdapter<ZoneChannel>{
private static final int TYPE_ZONE = 0;
private static final int TYPE_CHANNEL = 1;
private static final int TYPE_MAX_COUNT = 2;
private Context context;
int layoutResourceId;
private ArrayList<ZoneChannel> listValues;
public ZoneChannelComboBoxAdapter(Context context, int textViewResourceId, ArrayList<ZoneChannel> listValues) {
super(context, textViewResourceId, listValues);
this.context = context;
this.layoutResourceId = textViewResourceId;
this.listValues = listValues;
}
@Override
public View getDropDownView(int position, View convertView, ViewGroup parent) {
return getCustomView(position, convertView, parent);
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
return getCustomView(position, convertView, parent);
}
@Override
public int getItemViewType(int position) {
return listValues.get(position).isSection() ? TYPE_ZONE : TYPE_CHANNEL;
}
@Override
public int getViewTypeCount() {
return TYPE_MAX_COUNT;
}
@Override
public int getCount() {
return listValues.size();
}
@Override
public ZoneChannel getItem(int position) {
return listValues.get(position);
}
@Override
public long getItemId(int position) {
return position;
}
@Override
public boolean isEnabled(int position) {
if(getItemViewType(position) == TYPE_ZONE)
return false;
return true;
}
public View getCustomView(int position, View convertView, ViewGroup parent) {
ImagesSpinnerHolder holder = null;
int type = getItemViewType(position);
LayoutInflater inflater = ((Activity) context).getLayoutInflater();
if(convertView == null) {
holder = new ImagesSpinnerHolder();
switch (type) {
case TYPE_ZONE:
convertView = inflater.inflate(R.layout.combobox_section_header, parent, false);
holder.title = (TextView) convertView.findViewById(R.id.txtHeader);
break;
case TYPE_CHANNEL:
convertView = inflater.inflate(R.layout.combobox_row, parent, false);
holder.textSpinner = (TextView)convertView.findViewById(R.id.text);
holder.imgSpinner = (ImageView)convertView.findViewById(R.id.icon);
holder.imgSpinner.setVisibility(View.GONE);
break;
}
convertView.setTag(holder);
}
else
holder = (ImagesSpinnerHolder) convertView.getTag();
switch(type) {
case TYPE_ZONE:
holder.title.setText(listValues.get(position).getZone().ZoneName);
break;
case TYPE_CHANNEL:
holder.textSpinner.setText(listValues.get(position).getChannel().chName);
holder.imgSpinner.setImageResource(R.drawable.channel_small);
break;
}
/*
View row = convertView;
if(row == null) {
// check if section header -> isSection will return true
if(sectionList.get(position))
{
row = inflater.inflate(R.layout.spinner_header, parent, false);
holder.title = (TextView) row.findViewById(R.id.txtHeader);
holder.title.setText(listValues.get(position).getZone().ZoneName);
}
else
{
row = inflater.inflate(R.layout.spinner, parent, false);
holder.textSpinner = (TextView)row.findViewById(R.id.language);
holder.imgSpinner = (ImageView)row.findViewById(R.id.icon);
holder.imgSpinner.setVisibility(View.INVISIBLE);
holder.textSpinner.setText(listValues.get(position).getChannel().chName);
holder.imgSpinner.setImageResource(R.drawable.channel_small);
}
row.setTag(holder);
}
else {
holder = (ImagesSpinnerHolder)row.getTag();
if(sectionList.get(position)){
if(holder.title!= null)
holder.title.setText(listValues.get(position).getZone().ZoneName);
}
else {
if(holder.textSpinner!=null)
holder.textSpinner.setText(listValues.get(position).getChannel().chName);
if(holder.imgSpinner != null)
holder.imgSpinner.setImageResource(R.drawable.channel_small);
}
}
*/
return convertView;
}
private class ImagesSpinnerHolder {
ImageView imgSpinner;
TextView textSpinner;
TextView title;
}
}

View File

@ -0,0 +1,24 @@
package com.safemobile.bluetooth;
import java.util.EventObject;
public class BlueEvent extends EventObject {
private static final long serialVersionUID = -7646259130917916952L;
private int PTTclicked;
private int Connected;
public BlueEvent (Object source, int _PTTclicked, int _connected) {
super(source);
PTTclicked =_PTTclicked;
Connected = _connected;
}
public int PTTclicked()
{
return PTTclicked;
}
public int Connected()
{
return Connected;
}
}

View File

@ -0,0 +1,525 @@
package com.safemobile.bluetooth;
import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.Timer;
import java.util.TimerTask;
import java.util.UUID;
import com.safemobile.bluetooth.BlueEvent;
import com.safemobile.bluetooth.IBlueListener;
import com.safemobile.lib.AppParams;
import com.safemobile.lib.R;
import com.safemobile.lib.SM;
import android.annotation.TargetApi;
import android.app.Activity;
import android.bluetooth.BluetoothAdapter;
import android.bluetooth.BluetoothDevice;
import android.bluetooth.BluetoothHeadset;
import android.bluetooth.BluetoothProfile;
import android.bluetooth.BluetoothSocket;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.content.ServiceConnection;
import android.media.AudioManager;
import android.os.AsyncTask;
import android.os.Build;
import android.os.Handler;
import android.util.Log;
import android.widget.Toast;
@TargetApi(Build.VERSION_CODES.HONEYCOMB)
public class BluetoothTether {
private Context mContext;
private Activity activity;
private AudioManager audioManager;
private BluetoothAdapter bluetoothAdapter;
private BluetoothHeadset bluetoothHeadset = null;
private BluetoothDevice bluetoothDevice= null;
/* For bluComm Microphone */
private static final UUID MY_UUID = UUID.fromString("00001101-0000-1000-8000-00805F9B34FB");
private List<IBlueListener> _listeners = new ArrayList<IBlueListener>();
private Thread bluCommThread = null;
private int bluetoothProfile;
private BluetoothProfile bluetoothProxy;
private BluetoothSocket bluetoothSocket = null;
private InputStream inputStream =null;
private Boolean socketIsConnected = false;
public BluetoothTether(Context context, Activity activity) {
this.mContext = context;
this.activity = activity;
audioManager = (AudioManager) activity.getSystemService(Context.AUDIO_SERVICE);
bluetoothAdapter = BluetoothAdapter.getDefaultAdapter();
bluetoothAdapter.getProfileProxy(context, mProfileListener, BluetoothProfile.HEADSET);
IntentFilter filter1 = new IntentFilter(BluetoothDevice.ACTION_ACL_CONNECTED);
IntentFilter filter2 = new IntentFilter(BluetoothDevice.ACTION_ACL_DISCONNECT_REQUESTED);
IntentFilter filter3 = new IntentFilter(BluetoothDevice.ACTION_ACL_DISCONNECTED);
activity.registerReceiver(mReceiver, filter1);
activity.registerReceiver(mReceiver, filter2);
activity.registerReceiver(mReceiver, filter3);
filter3 = new IntentFilter(BluetoothAdapter.ACTION_STATE_CHANGED);
activity.registerReceiver(mReceiver, filter3);
}
private BluetoothProfile.ServiceListener mProfileListener = new BluetoothProfile.ServiceListener() {
@Override
public void onServiceDisconnected(int profile) {
}
@Override
public void onServiceConnected(int profile, BluetoothProfile proxy) {
SM.Debug("###BluetoothProfile###", "###Connected###");
bluetoothProfile = profile;
bluetoothProxy = proxy;
if(profile == BluetoothProfile.HEADSET)
{
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
bluetoothHeadset = (BluetoothHeadset) proxy;
List<BluetoothDevice> test;
test = bluetoothHeadset.getConnectedDevices();
SM.Debug("###BluetoothProfile###", "Headset Connected devices nr: " + test.size());
// check if one of three headsets are connected
for(BluetoothDevice dev : test)
bluetoothDevice = dev;
/*
if(dev.getAddress().contains(AppParams.MotorolaH730) ||
dev.getAddress().contains(AppParams.SamsungWep460) || dev.getAddress().contains(AppParams.BluCom))
bluetoothDevice = dev;
*/
if(bluetoothDevice!=null)
{
if(AppParams.TETHERSOUND)
{
SM.Debug("###BluetoothProfile###", "Device : " + bluetoothDevice.getName() + " [" + bluetoothDevice.getAddress() + "]");
new Handler().post(new Runnable() {
@Override
public void run() {
Toast.makeText(mContext,
String.format(mContext.getString(R.string.bthDeviceConnected), bluetoothDevice.getName()), Toast.LENGTH_SHORT).show();
TetherSound(bluetoothDevice, true);
//*
SM.Debug("### blueComm ###", "BLUEcOMMFunction");
new connectTask().execute();
//blueCommFunction(bluetoothProfile, bluetoothProxy);
_fireBluetoothTethered(true);
final Timer t = new Timer();
t.schedule(new TimerTask() {
@Override
public void run() {
// start thread that will manage bluComm button press
bluCommThread = new Thread(bluCommRunnable);
bluCommThread.start();
t.cancel();
t.purge();
}
}, 2500);
//*/
}
});
}
}
}
}
};
/** Function that will intercept bluComm button press */
private void blueCommFunction(int profile, BluetoothProfile proxy) {
//Boolean result = true;
SM.Debug("################");
if(profile == BluetoothProfile.HEADSET)
{
try {
Thread.sleep(50);
} catch (InterruptedException e) {
e.printStackTrace();
}
// if device connected -> redundant check
if(bluetoothDevice != null)
{
SM.Debug("###HEADSET###","Connected Device Address: " + bluetoothDevice.getAddress());
final Timer t = new Timer();
t.scheduleAtFixedRate(new TimerTask() {
@Override
public void run() {
try {
if(bluetoothDevice!=null)
{
// create socket and then connect to it
bluetoothSocket = bluetoothDevice.createRfcommSocketToServiceRecord(MY_UUID);
bluetoothSocket.connect();
inputStream = bluetoothSocket.getInputStream();
SM.Debug("##BTSocketConnected##", "Connection socket ok");
socketIsConnected = true;
t.cancel();
t.purge();
}
else
{
t.cancel();
t.purge();
}
}
catch (IOException e) {
//result = false;
//SM.Exception("###BTSocketError###", e.toString());
socketIsConnected = false;
if(bluetoothSocket!=null)
try {
bluetoothSocket.close();
bluetoothSocket = null;
}
catch (IOException e1) {
SM.Exception("###BTSocketError2###", e.toString());
}
}
try {
Thread.sleep(1000);
SM.Debug("BTSocketCreated", "bluetooth socket creation ended with result: " + socketIsConnected);
/*
if(result)
_fireDataArrived(blueSOCKET,-1);
else
_fireDataArrived(noBlueSOCKET,-1);
*/
}
catch (InterruptedException e) {
SM.Exception("###BTSocketInterruptedException###", e.toString());
}
}
}, 500, 3000);
}
}
};
/** Runnable to intercept bluComm button press */
private Runnable bluCommRunnable = new Runnable() {
@Override
public void run() {
SM.Debug("####HERE####", "after Profile");
int read = 0;
byte[] buffer = new byte[20];
while(true)
{
try
{
while (socketIsConnected)
{
//SM.Debug("####Socket####", "Socket is Connected");
try
{
//Log.d("DECIVE STATUS", bhead.getConnectionState(mybluedev) + "");
read = inputStream.read(buffer);
/*
String buf = "";
for(int k=0;k<read;k++)
buf += buffer[k] + " | "; */
//SM.Debug("###SocketRead###", buf);
if (read==6)
{
if (buffer[5]==80)
{
SM.Debug("##BTpttPress##", "PTTON");
AppParams.BluCommState = 2;
_fireDataArrived(AppParams.PTTON,-1);
}
if (buffer[5]==82)
{
SM.Debug("##BTpttPress##", "PTTOFF");
AppParams.BluCommState = 1;
_fireDataArrived(AppParams.PTTOFF,-1);
}
}
}
catch (IOException e)
{
//Log.d("bigutag", "Error on read");
/*
cntError++;
if (cntError>10)
{
_fireDataArrived(-1,0);
Disconect();
}
*/
}
}
Thread.sleep(1000);
} catch (InterruptedException e) {
Log.d("bigutag", "Error on");
}
}
}
};
/** BroadcastReceiver that will manage BlueTooth Connection and Disconnection */
public final BroadcastReceiver mReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
final String action = intent.getAction();
final BluetoothDevice device = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE);
if(device!=null)
Log.d("BlueTooth State Changed", "DEVICE " + device.getName() + " [" + device.getAddress() + "]" + " is now : " + action );
// Tether sound only if selected in setup
if(AppParams.TETHERSOUND)
{
if(BluetoothAdapter.ACTION_STATE_CHANGED.equals(intent.getAction())) {
if(intent.getIntExtra(BluetoothAdapter.EXTRA_STATE, -1) == BluetoothAdapter.STATE_OFF)
untetherSound(bluetoothDevice);
}
else if (BluetoothDevice.ACTION_FOUND.equals(action)) {
Toast.makeText(mContext, mContext.getString(R.string.bthDeviceFound) + ":" + bluetoothDevice.getName(), Toast.LENGTH_SHORT).show();
}
else if (BluetoothAdapter.ACTION_DISCOVERY_FINISHED.equals(action)) {
//Toast.makeText(mContext, "Done searching", Toast.LENGTH_SHORT).show();
}
else
if(device.getAddress()!= null) /* && (device.getAddress().contains(AppParams.MotorolaH730) ||
device.getAddress().contains(AppParams.SamsungWep460) || device.getAddress().contains(AppParams.BluCom)))*/
{
// save device
bluetoothDevice = device;
// if bluetooth device has disconnected
if(action.contains("_DISCONNECTED"))
{
untetherSound(device);
}
// if bluetooth device had connected
else
{
new Handler().post(new Runnable()
{
@Override
public void run() {
Toast.makeText(mContext,
String.format(mContext.getString(R.string.bthDeviceConnected), bluetoothDevice.getName()), Toast.LENGTH_SHORT).show();
// set that bluComm Microphone is connected
if(bluetoothDevice != null)
{
TetherSound(bluetoothDevice, true);
if(bluetoothDevice.getAddress().contains(AppParams.BluCom))
{
AppParams.BluCommState = 1;
//TetherSound(bluetoothDevice, true);
_fireBluetoothTethered(true);
// create bluComm socket
new connectTask().execute();
/*
* if bluComm is not connected when RadioPad starts i will need
* to create the Thread that reads on socket
*/
if(bluCommThread == null)
{
final Timer t = new Timer();
t.schedule(new TimerTask() {
@Override
public void run() {
SM.Exception("bluComm", "creating blu comm thread");
// start thread that will manage bluComm button press
bluCommThread = new Thread(bluCommRunnable);
bluCommThread.start();
t.cancel();
t.purge();
}
}, 2500);
}
}
}
}
});
}
}
}
}
};
/**
* UnTether all the sound when a device is disconnected or then the BlueTooth is turned off
* @param device The BlueTooth device which needs to be unTethered
*/
private void untetherSound(final BluetoothDevice device) {
new Handler().post(new Runnable() {
@Override
public void run() {
if(device == null)
return;
Toast.makeText(mContext,
String.format(mContext.getString(R.string.bthDeviceDisconnected),
(bluetoothDevice.getName() == null ? "?" : bluetoothDevice.getName())), Toast.LENGTH_SHORT).show();
_fireBluetoothTethered(false);
// set that bluComm Microphone is disconnected
if(bluetoothDevice!=null && bluetoothDevice.getAddress().contains(AppParams.BluCom))
AppParams.BluCommState = 0;
socketIsConnected = false;
Disconect();
TetherSound(device, false);
}
});
}
/** Unregister BroadcastReceiver **/
public void UnregisterReceiver()
{
try
{
if(mReceiver!=null && activity!=null)
{
SM.Debug("#### unregister Receiver ### ", "unregister receiver");
activity.unregisterReceiver(mReceiver);
}
if(mProfileListener!=null)
activity.unbindService((ServiceConnection) mProfileListener);
}
catch(Exception ex)
{
}
}
/** Tether sound */
private void TetherSound(final BluetoothDevice device, Boolean enable)
{
if(enable && AppParams.TETHERSOUND)
{
final Timer t = new Timer();
t.schedule(new TimerTask() {
@Override
public void run() {
SM.Debug("### Start Tethering ###", "tethering " + device.getName());
audioManager.setBluetoothScoOn(true);
audioManager.setMode(AudioManager.MODE_IN_COMMUNICATION);
audioManager.startBluetoothSco();
t.cancel();
t.purge();
}
}, 2000);
}
else
{
audioManager.stopBluetoothSco();
audioManager.setMode(AudioManager.MODE_NORMAL);
socketIsConnected = false;
}
}
/** Stop BluetoothTether and unregister BroadcastReceiver */
public void Stop()
{
TetherSound(null, false);
UnregisterReceiver();
Disconect();
}
public void Disconect()
{
try
{
if(bluetoothSocket!=null)
bluetoothSocket.close();
socketIsConnected = false;
socketIsConnected = false;
bluetoothDevice = null;
bluetoothSocket = null;
//bhead.stopVoiceRecognition(mybluedev);
//_fireDataArrived(-1,0);
}
catch (Exception e)
{
socketIsConnected = false;
bluetoothDevice = null;
bluetoothSocket = null;
SM.Exception("##BTDisconnectError",e.toString());
}
}
public synchronized void addBlueListener( IBlueListener l ) {
_listeners.add( l );
}
public synchronized void removeBlueListener( IBlueListener l ) {
_listeners.remove( l );
}
private synchronized void _fireDataArrived(int PTTClicked, int Connected)
{
BlueEvent event = new BlueEvent( this,PTTClicked,Connected);
Iterator<IBlueListener> listeners = _listeners.iterator();
while( listeners.hasNext() ) {
( (IBlueListener) listeners.next() ).dataRecv(event);
}
}
private synchronized void _fireBluetoothTethered (boolean isTethered) {
Iterator<IBlueListener> listeners = _listeners.iterator();
while( listeners.hasNext() ) {
( (IBlueListener) listeners.next() ).bluetoothTethered(isTethered);;
}
}
public class connectTask extends AsyncTask<String, Void, Void>
{
@Override
protected Void doInBackground(String... params) {
SM.Debug("### blueComm ###", "recreate bluComm socket");
blueCommFunction(bluetoothProfile, bluetoothProxy);
return null;
}
}
}

View File

@ -0,0 +1,6 @@
package com.safemobile.bluetooth;
public interface IBlueListener {
public void dataRecv( BlueEvent event );
public void bluetoothTethered (boolean isTethered);
}

View File

@ -0,0 +1,159 @@
package com.safemobile.database;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import com.safemobile.lib.AppParams;
import android.content.Context;
import android.database.SQLException;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteException;
import android.database.sqlite.SQLiteOpenHelper;
public class DataBaseHelper extends SQLiteOpenHelper{
//The Android's default system path of your application database.
private static String DB_PATH = "/data/data/com.safemobile.motopad/databases/";
private static String DB_NAME = "safedispatch" + AppParams.Database;
private SQLiteDatabase myDataBase;
private final Context myContext;
/**
* Constructor
* Takes and keeps a reference of the passed context in order to access to the application assets and resources.
* @param context
*/
public DataBaseHelper(Context context) {
super(context, DB_NAME, null, 1);
this.myContext = context;
DB_PATH = "/data/data/" + context.getPackageName().toString() + "/databases/";
}
/**
* Creates a empty database on the system and rewrites it with your own database.
* */
public void createDataBase() throws IOException{
boolean dbExist = checkDataBase();
if(dbExist){
//do nothing - database already exist
}else{
//By calling this method and empty database will be created into the default system path
//of your application so we are gonna be able to overwrite that database with our database.
this.getReadableDatabase();
try {
copyDataBase();
} catch (IOException e) {
throw new Error("Error copying database");
}
}
}
/**
* Check if the database already exist to avoid re-copying the file each time you open the application.
* @return true if it exists, false if it doesn't
*/
private boolean checkDataBase(){
SQLiteDatabase checkDB = null;
try{
String myPath = DB_PATH + DB_NAME;
checkDB = SQLiteDatabase.openDatabase(myPath, null, SQLiteDatabase.OPEN_READWRITE);
}catch(SQLiteException e){
//database does't exist yet.
}
if(checkDB != null){
checkDB.close();
}
return checkDB != null ? true : false;
}
/**
* Copies your database from your local assets-folder to the just created empty database in the
* system folder, from where it can be accessed and handled.
* This is done by transfering bytestream.
* */
private void copyDataBase() throws IOException{
//Open your local db as the input stream
InputStream myInput = myContext.getAssets().open(DB_NAME);
// Path to the just created empty db
String outFileName = DB_PATH + DB_NAME;
//Open the empty db as the output stream
OutputStream myOutput = new FileOutputStream(outFileName);
//transfer bytes from the inputfile to the outputfile
byte[] buffer = new byte[1024];
int length;
while ((length = myInput.read(buffer))>0){
myOutput.write(buffer, 0, length);
}
//Close the streams
myOutput.flush();
myOutput.close();
myInput.close();
}
public SQLiteDatabase openDataBase(Boolean readonly) throws SQLException{
//Open the database
String myPath = DB_PATH + DB_NAME;
if(readonly)
return myDataBase = SQLiteDatabase.openDatabase(myPath, null, SQLiteDatabase.OPEN_READONLY);
else
return myDataBase = SQLiteDatabase.openDatabase(myPath, null, SQLiteDatabase.OPEN_READWRITE);
}
@Override
public synchronized void close() {
if(myDataBase != null)
myDataBase.close();
super.close();
}
@Override
public void onCreate(SQLiteDatabase db) {
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
}
// Add your public helper methods to access and get content from the database.
// You could return cursors by doing "return myDataBase.query(....)" so it'd be easy
// to you to create adapters for your views.
}

View File

@ -0,0 +1,639 @@
package com.safemobile.database;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import com.safemobile.lib.Contact;
import com.safemobile.lib.Recording;
import com.safemobile.lib.SM;
import com.safemobile.lib.SMS;
import com.safemobile.lib.Vehicle;
import com.safemobile.lib.radio.Channel;
import com.safemobile.lib.radio.Zone;
import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.database.SQLException;
import android.database.sqlite.SQLiteDatabase;
import android.provider.BaseColumns;
import android.util.Log;
public class DatabaseCommunication {
/* Database */
private SQLiteDatabase database;
private DataBaseHelper myDbHelper;
private boolean first = false, READONLY = false;;
private Context context;
public DatabaseCommunication(Context context)
{
this.context = context;
}
// open database Connection
public void openConnection()
{
// start database connection
myDbHelper = new DataBaseHelper(context);
try
{
myDbHelper.createDataBase();
Log.d("CONNECT", "Succes connection");
}
catch (IOException ioe)
{
throw new Error("Unable to create database");
}
// end database connection
myDbHelper = new DataBaseHelper(context);
try {
if(database!=null)
database.close();
database = myDbHelper.openDataBase(READONLY);
Log.d("CONNECT", "Opened Connection");
}catch(SQLException sqle){
first = true;
//throw sqle;
}
if(first)
{
try {
if(database!=null)
database.close();
database = myDbHelper.openDataBase(READONLY);
Log.d("CONNECT", "Opened Connection");
}catch(SQLException sqle){
first = false;
//throw sqle;
}
}
}
// close database Connection
public void closeConnection()
{
database.close();
}
public boolean isOpen()
{
if(database!=null)
return database.isOpen();
else
return false;
}
// get all vehicles
public ArrayList<Vehicle> getAllVehicle()
{
ArrayList<Vehicle> allVehicles = new ArrayList<Vehicle>();
// build iterator
Cursor cursor = null;
if(database == null)
Log.d("NULL", "Database is null");
else
{
cursor = database.rawQuery("SELECT * from vehicle",new String [] {});
Log.d("CURSOR", "cursor created");
cursor.moveToFirst();
while (cursor.isAfterLast() == false)
{
//old = new Vehicle(int lp, String name, long driver_id, int time_route, int GPS_reporting_interval, int is_stolen)
// new = Vehicle(int sc_id, String imei, int lp, String name, long driver_id, int time_route, int GPS_reporting_interval, int is_stolen)
allVehicles.add(new Vehicle(0, "imei", cursor.getInt(1), cursor.getString(2), cursor.getInt(3), cursor.getInt(4), cursor.getInt(5), cursor.getInt(6)));
// move to next record
cursor.moveToNext();
}
cursor.close();
}
allVehicles.add(new Vehicle(0, "imei", 1, "Demo103", 89, 0, 0, 0));
allVehicles.add(new Vehicle(0, "imei", 1, "Demo104", 101, 0, 0, 0));
allVehicles.add(new Vehicle(0, "imei", 1, "Demo105", 95, 0, 0, 0));
allVehicles.add(new Vehicle(0, "imei", 1, "Demo106", 118, 0, 0, 0));
allVehicles.add(new Vehicle(0, "imei", 1, "Demo107", 111, 0, 0, 0));
return allVehicles;
}
// get all users
public ArrayList<SMS> getAllSMS()
{
ArrayList<SMS> allSMS = new ArrayList<SMS>();
Cursor cursor = null;
if(database == null)
SM.Debug("DBQuery","Database is null");
else
{
cursor = database.rawQuery("SELECT _id, timeGMT, imei_sour, imei_dest, mess, status from SMS",new String [] {});
cursor.moveToFirst();
while (cursor.isAfterLast() == false)
{
SMS sms = new SMS();//cursor.getInt(0), cursor.getString(1), cursor.getString(2), cursor.getString(3), cursor.getString(4), cursor.getInt(5), cursor.getInt(6));
sms.idx =cursor.getInt(0);
sms.timeGMT = cursor.getInt(1);
sms.sc_id_sour = cursor.getInt(2);
sms.sc_id_dest = cursor.getInt(3);
sms.mess = cursor.getString(4);
sms.status = cursor.getInt(5);
sms.seq_idx = "";
allSMS.add(sms);
// move to next record
cursor.moveToNext();
}
cursor.close();
}
return allSMS;
}
public ArrayList<SMS> getSMS_4Imei(long imei)
{
ArrayList<SMS> allSMS = new ArrayList<SMS>();
Cursor cursor = null;
if(database == null)
SM.Debug("DBQuery","Database is null");
else
{
cursor = database.rawQuery("SELECT _id, timeGMT, imei_sour, imei_dest, mess, status from SMS where imei_sour ="+imei+" OR imei_dest ="+imei+" ORDER BY timeGMT ASC",new String [] {});
cursor.moveToFirst();
while (cursor.isAfterLast() == false)
{
SMS sms = new SMS();
sms.idx =cursor.getInt(0);
sms.timeGMT = cursor.getInt(1);
sms.sc_id_sour = cursor.getInt(2);
sms.sc_id_dest = cursor.getInt(3);
sms.mess = cursor.getString(4);
sms.status = cursor.getInt(5);
sms.seq_idx = "";
allSMS.add(sms);
// move to next record
cursor.moveToNext();
}
cursor.close();
}
return allSMS;
}
@SuppressWarnings({ "unchecked", "rawtypes" })
public ArrayList<SMS> getAllLastSMS()
{
ArrayList<SMS> allLastSMS = new ArrayList<SMS>();
Cursor cursor = null;
if(database == null)
SM.Debug("DBQuery","Database is null");
else
{
ArrayList<Integer> imeis= new ArrayList<Integer>();
cursor = database.rawQuery("SELECT B.imei FROM (SELECT DISTINCT imei_sour AS imei FROM SMS WHERE imei_sour>0 UNION SELECT DISTINCT imei_dest AS imei FROM SMS WHERE imei_dest>0) AS B",new String [] {});
cursor.moveToFirst();
while (cursor.isAfterLast() == false)
{
/*
Integer imei_sour =cursor.getInt(0);
Integer imei_dest = cursor.getInt(1);
if(imei_sour != 0)
if(!imeis.contains(imei_sour))
{
imeis.add(imei_sour);
}
if(imei_dest != 0)
if(!imeis.contains(imei_dest))
{
imeis.add(imei_dest);
}
*/
imeis.add(cursor.getInt(0));
// move to next record
cursor.moveToNext();
}
cursor.close();
for(Integer imei:imeis)
{
ArrayList<SMS> smss = getSMS_4Imei(imei);
if(smss.size() > 0)
allLastSMS.add(smss.get(smss.size() - 1));
}
Collections.sort(allLastSMS, new Comparator(){
public int compare(Object o1, Object o2) {
SMS sms1 = (SMS) o1;
SMS sms2 = (SMS) o2;
if(sms1.timeGMT < sms2.timeGMT)
return -1;
else if (sms1.timeGMT > sms2.timeGMT)
return 1;
else
return 0;
// return sms1.timeGMT.compareToIgnoreCase(p2.getFirstName());
}
});
}
return allLastSMS;
}
public boolean insertSMS(SMS sms)
{
long id = -1;
if(database == null)
SM.Debug("DBQuery","Database is null");
else
{
ContentValues values = new ContentValues();
values.put("timeGMT", sms.timeGMT);
values.put("imei_sour", sms.sc_id_sour);
values.put("imei_dest", sms.sc_id_dest);
values.put("mess", sms.mess);
values.put("status", sms.status);
id = database.insert("SMS", "", values); //.rawQuery("SELECT imei_sour, imei_dest from SMS",new String [] {});
SM.Debug("DBQuery","Database Insert result: " + id);
}
//INSERT into SMS (timeGMT, imei_sour, imei_dest, mess, status) VALUES( 1324016412, 0, 101, 'two', 1)
return (id == -1)? false: true;
}
// get all users
public ArrayList<Recording> getAllRecordings()
{
ArrayList<Recording> allRecordings = new ArrayList<Recording>();
Cursor cursor = null;
if(database == null)
SM.Debug("DBQuery","Database is null");
else
{
cursor = database.rawQuery("SELECT _id, id_sour, id_dest, date, duration, filename, type from Recordings order by _id desc",new String [] {});
cursor.moveToFirst();
while (cursor.isAfterLast() == false)
{
Recording rec = new Recording();
rec.ID =cursor.getInt(0);
rec.sourceRadioID = cursor.getInt(1);
rec.destinationRadioID = cursor.getInt(2);
rec.date = cursor.getInt(3);
rec.duration = cursor.getInt(4);
rec.filename = cursor.getString(5);
rec.type = cursor.getInt(6);
allRecordings.add(rec);
// move to next record
cursor.moveToNext();
}
cursor.close();
}
return allRecordings;
}
// get all users
public Recording getLastRecording()
{
Cursor cursor = null;
if(database == null)
SM.Debug("DBQuery","Database is null");
else
{
cursor = database.rawQuery("SELECT _id, id_sour, id_dest, date, duration, filename, type from Recordings order by _id desc",new String [] {});
cursor.moveToFirst();
if(cursor.getCount() > 0)
{
Recording rec = new Recording();
rec.ID =cursor.getInt(0);
rec.sourceRadioID = cursor.getInt(1);
rec.destinationRadioID = cursor.getInt(2);
rec.date = cursor.getInt(3);
rec.duration = cursor.getInt(4);
rec.filename = cursor.getString(5);
rec.type = cursor.getInt(6);
return rec;
}
}
return null;
}
public long insertRecording(Recording rec)
{
long id = -1;
if(database == null)
SM.Debug("Database is null");
else
{
ContentValues values = new ContentValues();
values.put("id_sour", rec.sourceRadioID);
values.put("id_dest", rec.destinationRadioID);
values.put("date", rec.date);
values.put("duration", rec.duration);
values.put("filename", rec.filename);
values.put("type", rec.type);
id = database.insert("Recordings", "", values); //.rawQuery("SELECT imei_sour, imei_dest from SMS",new String [] {});
SM.Debug("DBQuery","Database Insert result: " + id);
}
//INSERT into SMS (timeGMT, imei_sour, imei_dest, mess, status) VALUES( 1324016412, 0, 101, 'two', 1)
return id;
}
public boolean removeRecording(Recording rec)
{
long id = -1;
if(database == null)
SM.Debug("Database is null");
else
{
ContentValues values = new ContentValues();
values.put("id_sour", rec.sourceRadioID);
values.put("id_dest", rec.destinationRadioID);
values.put("date", rec.date);
values.put("duration", rec.duration);
values.put("filename", rec.filename);
values.put("type", rec.type);
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)
return (id == -1)? false: true;
}
// get all Contacts
public ArrayList<Contact> getAllContacts(boolean TRBO)
{
ArrayList<Contact> allContacts = new ArrayList<Contact>();
Cursor cursor = null;
if(database == null)
SM.Debug("DBQuery","Database is null");
else
{
try
{
cursor = database.rawQuery("SELECT _id, call_id, name, call_type from contacts order by call_id asc",new String [] {});
if(cursor!=null)
{
cursor.moveToFirst();
while (cursor.isAfterLast() == false)
{
Contact contact = new Contact();
contact.id = cursor.getInt(1);
contact.name = cursor.getString(2);
String type = cursor.getString(3);
if(type.equals("Private Call"))
contact.contactType = Contact.PRIVATE;
else if (type.equals("Group Call"))
contact.contactType = Contact.GROUP;
allContacts.add(contact);
// move to next record
cursor.moveToNext();
}
cursor.close();
}
}
catch(Exception ex)
{
// table doesn't exist so I have to create and populate it
createContactsTable();
populateContactsTable(TRBO);
}
}
return allContacts;
}
// get all Contacts
public ArrayList<Zone> getAllZones(boolean TRBO)
{
ArrayList<Zone> allZones = new ArrayList<Zone>();
Cursor cursor = null;
if(database == null)
SM.Debug("DBQuery","Database is null");
else
{
try
{
cursor = database.rawQuery("SELECT _id, position, name, type, zone_id from zonechannel order by zone_id asc, type desc",new String [] {});
if(cursor!=null)
{
cursor.moveToFirst();
ArrayList<Channel> listChannels = new ArrayList<Channel>();
while (cursor.isAfterLast() == false)
{
// add zone to list
if(cursor.getString(3).equals("zone"))
{
Zone z = new Zone();
z.channelList = new ArrayList<Channel>();
z.dbID = cursor.getInt(1);
z.ZoneName = cursor.getString(2);
z.id = cursor.getInt(4);
// add channels to zone
z.channelList = listChannels;
// clear channels list
listChannels = new ArrayList<Channel>();
// add zone
allZones.add(z);
}
else
{
// add channel to corresponding list
Channel c = new Channel();
c.id = cursor.getInt(1);
c.chName = cursor.getString(2);
c.id = cursor.getInt(1);
// add channel to zone if exists or add it to the list
for(Zone zone: allZones)
{
// if channel is in this zone
if(zone.id == cursor.getInt(4))
{
// create list if not exists
if(zone.channelList == null)
zone.channelList = new ArrayList<Channel>();
// add channel to list;
zone.channelList.add(c);
}
}
}
// move to next record
cursor.moveToNext();
}
cursor.close();
}
}
catch(Exception ex)
{
// table doesn't exist so I have to create and populate it
createZoneChannelTable();
populateZoneChannelTable(TRBO);
}
}
return allZones;
}
public void writeConfigFileZonesAndChannels(ArrayList<Zone> zones) {
// delete all values from zonechannel table
database.execSQL("DELETE FROM zonechannel where 1=1");
for(Zone zone:zones) {
// insert zone into database
database.execSQL("INSERT INTO zonechannel (position, name, type, zone_id) VALUES (" + zone.id + ",'" + zone.ZoneName + "'," +
"'zone'" + "," + zone.id + ")");
// add channels for current zone
for(Channel ch: zone.channelList) {
database.execSQL("INSERT INTO zonechannel (position, name, type, zone_id) VALUES (" + ch.id + ",'" + ch.chName + "'," +
"'channel'" + "," + ch.id + ")");
}
}
}
public void writeConfigFileContacts(ArrayList<Contact> contacts) {
// delete all values from contacts table
database.execSQL("DELETE FROM contacts where 1=1");
for(Contact contact: contacts) {
// insert contact into database
database.execSQL("INSERT INTO contacts (call_id, name, call_type) VALUES (" + contact.id + ",'" + contact.name +"','" +
contact.contactType + "')");
}
}
public void createZoneChannelTable()
{
// create table
String sqlDataStore = "create table if not exists " +
"zonechannel" + " ("+ BaseColumns._ID + " integer primary key autoincrement,"
+ "position" + " INTEGER ,"
+ "name" + " text not null,"
+ "type" + " text not null,"
+ "zone_id" + " INTEGER not null)";
database.execSQL(sqlDataStore);
}
public void populateZoneChannelTable(boolean TRBO)
{
// populate table
if(TRBO)
{
database.execSQL("INSERT INTO zonechannel (position, name, type, zone_id) VALUES (1,'Zone1','zone',1)");
database.execSQL("INSERT INTO zonechannel (position, name, type, zone_id) VALUES (1,'Channel1','channel',1)");
database.execSQL("INSERT INTO zonechannel (position, name, type, zone_id) VALUES (2,'Channel2','channel',1)");
database.execSQL("INSERT INTO zonechannel (position, name, type, zone_id) VALUES (3,'Channel3','channel',1)");
database.execSQL("INSERT INTO zonechannel (position, name, type, zone_id) VALUES (4,'Channel4','channel',1)");
database.execSQL("INSERT INTO zonechannel (position, name, type, zone_id) VALUES (5,'Channel5','channel',1)");
database.execSQL("INSERT INTO zonechannel (position, name, type, zone_id) VALUES (6,'Channel6','channel',1)");
database.execSQL("INSERT INTO zonechannel (position, name, type, zone_id) VALUES (3,'Zone2','zone',3)");
database.execSQL("INSERT INTO zonechannel (position, name, type, zone_id) VALUES (1,'Ch5[Z2]','channel',3)");
database.execSQL("INSERT INTO zonechannel (position, name, type, zone_id) VALUES (2,'Ch6[Z2]','channel',3)");
}
else
{
database.execSQL("INSERT INTO zonechannel (position, name, type, zone_id) VALUES (1,'Zone1','zone',1)");
database.execSQL("INSERT INTO zonechannel (position, name, type, zone_id) VALUES (456,'DMO TG1','channel',1)");
database.execSQL("INSERT INTO zonechannel (position, name, type, zone_id) VALUES (457,'DMO TG2','channel',1)");
database.execSQL("INSERT INTO zonechannel (position, name, type, zone_id) VALUES (458,'DMO TG3','channel',1)");
database.execSQL("INSERT INTO zonechannel (position, name, type, zone_id) VALUES (459,'DMO TG4','channel',1)");
}
}
public void createContactsTable()
{
// create table
String sqlDataStore = "create table if not exists " +
"contacts" + " ("+ BaseColumns._ID + " integer primary key autoincrement,"
+ "call_id" + " INTEGER ,"
+ "name" + " text not null,"
+ "call_type" + " text not null)";
database.execSQL(sqlDataStore);
}
public void populateContactsTable(boolean TRBO)
{
if(TRBO)
{
database.execSQL("INSERT INTO contacts (call_id, name, call_type) VALUES (101,'UNIT101','Private Call')");
database.execSQL("INSERT INTO contacts (call_id, name, call_type) VALUES (102,'UNIT102','Private Call')");
database.execSQL("INSERT INTO contacts (call_id, name, call_type) VALUES (103,'UNIT103','Private Call')");
database.execSQL("INSERT INTO contacts (call_id, name, call_type) VALUES (104,'BASE104','Private Call')");
database.execSQL("INSERT INTO contacts (call_id, name, call_type) VALUES (114,'BASE114','Private Call')");
database.execSQL("INSERT INTO contacts (call_id, name, call_type) VALUES (124,'BASE124','Private Call')");
database.execSQL("INSERT INTO contacts (call_id, name, call_type) VALUES (1,'Call1','Group Call')");
database.execSQL("INSERT INTO contacts (call_id, name, call_type) VALUES (2,'Call2','Group Call')");
}
else
{
database.execSQL("INSERT INTO contacts (call_id, name, call_type) VALUES (101,'UNIT101','Private Call')");
database.execSQL("INSERT INTO contacts (call_id, name, call_type) VALUES (102,'UNIT102','Private Call')");
database.execSQL("INSERT INTO contacts (call_id, name, call_type) VALUES (103,'UNIT103','Private Call')");
database.execSQL("INSERT INTO contacts (call_id, name, call_type) VALUES (456,'DMO TG1','Group Call')");
database.execSQL("INSERT INTO contacts (call_id, name, call_type) VALUES (457,'DMO TG2','Group Call')");
database.execSQL("INSERT INTO contacts (call_id, name, call_type) VALUES (458,'DMO TG3','Group Call')");
database.execSQL("INSERT INTO contacts (call_id, name, call_type) VALUES (459,'DMO TG4','Group Call')");
}
}
public long insertContact(Contact contact)
{
long id = -1;
if(database == null)
SM.Debug("Database is null");
else
{
try
{
ContentValues values = new ContentValues();
values.put("call_id", contact.id);
values.put("name", contact.name);
values.put("call_type", contact.contactType);
id = database.insert("contacts", "", values); //.rawQuery("SELECT imei_sour, imei_dest from SMS",new String [] {});
SM.Debug("DBQuery","Database Insert result: " + id);
}
catch(Exception ex)
{
SM.Exception("DB[Insert Contact]","Could not insert into DB");
}
}
//INSERT into SMS (timeGMT, imei_sour, imei_dest, mess, status) VALUES( 1324016412, 0, 101, 'two', 1)
return id;
}
}

View File

@ -0,0 +1,99 @@
package com.safemobile.enums;
public enum MapType {
NONE(0),
STYLE_NORMAL(1),
SATELLITE(2),
TERRAIN(3),
HYBRID(4),
STYLE_RETRO(10),
STYLE_GRAYSCALE(11),
STYLE_NIGHT(12),
STYLE_DARK(13),
STYLE_AUBERGINE(14);
private int value;
MapType(int value) {
this.value = value;
}
/**
* Convert an integer value to the corresponding Map Type enum value
* @param x Desired value to be converted
* @return Map Type enum value that corresponds to the int value
*/
public static MapType fromInteger(int x) {
switch (x) {
case 0:
return NONE;
case 1:
return STYLE_NORMAL;
case 2:
return SATELLITE;
case 3:
return TERRAIN;
case 4:
return HYBRID;
case 10:
return STYLE_RETRO;
case 11:
return STYLE_GRAYSCALE;
case 12:
return STYLE_NIGHT;
case 13:
return STYLE_DARK;
case 14:
return STYLE_AUBERGINE;
default:
return STYLE_NORMAL;
}
}
/**
* Convert a string value to the corresponding GPS Provider enum value
* @param mapType Desired value to be converted
* @return Map Type enum value that corresponds to the string value
*/
public static MapType fromString(String mapType) {
switch (mapType) {
case "NONE":
return NONE;
case "STYLE_NORMAL":
return STYLE_NORMAL;
case "SATELLITE":
return SATELLITE;
case "TERRAIN":
return TERRAIN;
case "HYBRID":
return HYBRID;
case "STYLE_RETRO":
return STYLE_RETRO;
case "STYLE_GRAYSCALE":
return STYLE_GRAYSCALE;
case "STYLE_NIGHT":
return STYLE_NIGHT;
case "STYLE_DARK":
return STYLE_DARK;
case "STYLE_AUBERGINE":
return STYLE_AUBERGINE;
default:
return STYLE_NORMAL;
}
}
/**
* Get the int value of current Map Type enum instance
* @return Corresponding int value of the enum instance
*/
public int getValue() {
return this.value;
}
}

View File

@ -0,0 +1,23 @@
package com.safemobile.interfaces;
import java.util.EventObject;
public class AudioEvent extends EventObject {
private static final long serialVersionUID = 1L;
private byte[] data;
private int len;
public AudioEvent(Object source, byte[] _data, int _len) {
super(source);
data =_data;
len = _len;
}
public byte[] data() {
return data;
}
public int len()
{
return len;
}
}

View File

@ -0,0 +1,6 @@
package com.safemobile.interfaces;
public interface IAudioListener {
public void soundReceived( AudioEvent event );
public void soundSent( AudioEvent event );
}

View File

@ -0,0 +1,15 @@
package com.safemobile.interfaces;
import com.safemobile.lib.radio.IncCall;
public interface ICallStatusListener {
public void decoded ( IncCall call );
public void initiated ( IncCall call );
public void inProgress ( IncCall call );
public void hangtime ( IncCall call );
public void ended ( IncCall call );
/** Event used when any incoming Call message is received */
public void incoming (IncCall call );
}

View File

@ -0,0 +1,210 @@
package com.safemobile.interfaces;
import android.view.LayoutInflater;
import com.google.android.gms.maps.model.LatLng;
import com.safemobile.enums.MapType;
import com.safemobile.lib.Position;
import com.safenet.lib.Geofence;
import com.safenet.lib.Landmark;
import com.safenet.lib.Unit;
import java.util.ArrayList;
/**
* Created by Adi on 3/25/2016.
*/
public interface IMap {
interface MapInteraction
{
void onMapLocationChanged(double latitude, double longitude, float zoomLevel);
void onInfoBubbleClosed(long assetId, LatLng position);
void onInfoBubbleOpened(long assetId, LatLng position);
}
void setMapInteractionListener(MapInteraction delegate);
long MYSELF = 0l;
long LABEL_START = 16777215;
int MAPBOX = 1;
int GOOGLE = 2;
int OSM = 3;
/** INTENTS **/
String MAP_TERRAIN_REQ = "MAP_TERRAIN_REQ";
String MAP_SATELLITE_REQ = "MAP_SATELLITE_REQ";
String MAP_NORMAL_REQ = "MAP_NORMAL_REQ";
String MAP_HYBRID_REQ = "MAP_HYBRID_REQ";
String MAP_SHOW_ME = "MAP_SHOW_ME";
String MAP_LOCATION_REQUEST = "MAP_LOCATION_REQUEST";
/** GOOGLE MAP TYPE **/
int MAP_TYPE_NONE = 0;
int MAP_TYPE_NORMAL = 1;
int MAP_TYPE_SATELLITE = 2;
int MAP_TYPE_TERRAIN = 3;
int MAP_TYPE_HYBRID = 4;
/**
* Display the contacts that are flaged as onMap to be drawn on the
* Google map. The list is available on the AppParams .
* The same function will remove previous contacts that were on the map
* @param units The list of assets that needs to be displayed
*/
void showContactsOnMap(ArrayList<Unit> units);
/**
* Update the marker icon/location if displayed else do nothing. This method is called
* whenever the asset position is changed, or when the asset goes offline/online or in emergency
* @param unit The asset that changed the state or position
*/
void updateMarkerPosition(Unit unit);
/**
* Change the map type to one of the following options
* GoogleMap.MAP_TYPE_HYBRID
* GoogleMap.MAP_TYPE_NORMAL
* GoogleMap.MAP_TYPE_SATELLITE
* GoogleMap.MAP_TYPE_TERRAIN
* @param mapType The mapType value of the map
*/
void setMapType(MapType mapType);
/**
* Change the map type to one of the following options
* Style.MAPBOX_STREETS
* Style.EMERALD
* Style.LIGHT
* Style.DARK
* Style.SATELLITE
* Style.SATELLITE_STREETS
* @param mapType The int value of the map
*/
void setMapType(String mapType);
/**
* Center map and then zoom to the location of a specific contact
* @param unit The contact which needs to be focused. It contains the
* gps location
*/
void centerZoomContact(Unit unit);
/**
* Center the map on a particular position represented by a LatLng point
* @param mapLocation Location to which the map needs to center
*/
void centerZoomMapOnLocation(LatLng mapLocation);
/**
* Center the map on a particular position represented by a LatLng point
* @param mapLocation Location to which the map needs to center
* @param zoomLevel The zoom at which the map needs to be set
*
*/
void centerZoomMapOnLocation(LatLng mapLocation, float zoomLevel);
/**
* Show a custom marker on the map representing the current user
* @param position The location at which the user is
* @param shouldOpenInfoBubble Specify if the info bubble for the myself location should be opened
* @param shouldCenterNow Specify if the map needs to be animated to that location
*/
void showMyselfOnMap(Position position, boolean shouldOpenInfoBubble,
boolean shouldCenterNow);
/**
* Hide the marker for myself from the map
*/
void hideMyselfFromMap();
/**
* Open the info bubble for a specific marker
* @param markerKey The marker identifier from the hashtable
*/
void openInfoBubbleForMarker(Long markerKey);
/**
* Open the info bubble for the last opened marker if it wasn't closed by the user explicitly
*/
void openInfoBubble();
/**
* Show or hide the landmarks on the map
* @param isShown Boolean that will flag if the landmarks should be
* displayed. True is affirmative
* @param landmarks The landmarks that needs to be shown, Empty if none
*/
void onShowLandmarksChangedHandler(boolean isShown, ArrayList<Landmark> landmarks);
/**
* Show or hide the geofence on the map
* @param isShown Boolean that will flag if the geofence should be
* displayed. True is affirmative
* @param geofences The geofences that needs to be shown. Empty if none
*/
void onShowGeofencesChangedHandler(boolean isShown, ArrayList<Geofence> geofences);
/**
* Show or hide the traffic on the map
* @param isShown Boolean that will flag if the traffic should be
* displayed. True is affirmative
*/
void onShowTrafficChangedHandler(boolean isShown);
/**
* Handler for when the map is ready and bound to the UI
* @param map The received map
* @param layoutInflater Inflater needed to inflate the InfoBubble
*/
void onMapReceived(Object map, LayoutInflater layoutInflater);
/**
* Handler for when the map is ready and bound to the UI
* @param map The received map
* @param tileServer Map tile server used for OSM or other private environments
*/
void onMapReceived(Object map, String tileServer);
/**
* Change the map center and zoom level to allow the display of all the displayed markers
*/
void panZoomMap();
/**
* On activity paused
*/
void onPause();
/**
* On activity resumed
*/
void onResume();
/**
* Handler for when the map needs to be refreshed/invalidated
*/
void refresh();
boolean isMapAvailable();
}

View File

@ -0,0 +1,8 @@
package com.safemobile.interfaces;
public interface IPlaybackListener {
public void finishedPlaying();
public void startPlaying();
public void stopedPlaying();
public void failedPlaying();
}

View File

@ -0,0 +1,33 @@
package com.safemobile.interfaces;
public interface ITCPListener {
public void onLoginReceived( TCPEvent event );
public void onGPSReceived( TCPEvent event );
public void onVehiclesReceived( TCPEvent event );
public void onLastSMSsReceived( TCPEvent event );
public void onSMSReceived( TCPEvent event );
public void onSMSAckReceived( TCPEvent event );
public void onNewSMSReceived( TCPEvent event );
public void onLastPositionsReceived( TCPEvent event );
public void onRadioMsgReceived( TCPEvent event );
public void onHistoryPositionsReceived( TCPEvent event );
public void onHistoryPositionsCountReceived( TCPEvent event );
public void onAlarmsReceived( TCPEvent event );
public void onAlarmAckReceived(TCPEvent event);
public void alarmLiveRecv(TCPEvent event);
public void onRecordingPlayReceived(TCPEvent event);
public void onPollReceived(TCPEvent event);
public void onConnectionReplyReceived (TCPEvent event);
public void onContactsListReceived (TCPEvent event);
public void onTextMessagesListReceived (TCPEvent event);
public void onRecordingsListReceived(TCPEvent event);
public void onPONGReceived();
public void onTCPConnectionDown(boolean previuosWasConnectionUp);
public void onTCPConnectionUp(boolean previuosWasConnectionUp);
public void onTCPConnectionStatusReceived(boolean isConnectionUp, boolean previuosWasConnectionUp);
}

View File

@ -0,0 +1,5 @@
package com.safemobile.interfaces;
public interface IUDPListener {
public void dataRecv( UDPevent event );
}

View File

@ -0,0 +1,20 @@
package com.safemobile.interfaces;
import java.util.EventObject;
import com.safemobile.lib.TCPmsg;
public class TCPEvent extends EventObject {
private static final long serialVersionUID = 1L;
private TCPmsg _msg;
public TCPEvent(Object source, TCPmsg msg ) {
super( source );
_msg = msg;
}
public TCPmsg msg() {
return _msg;
}
}

View File

@ -0,0 +1,23 @@
package com.safemobile.interfaces;
import java.util.EventObject;
public class UDPevent extends EventObject {
private static final long serialVersionUID = 1L;
private byte[] data;
private int len;
public UDPevent(Object source, byte[] _data, int _len) {
super(source);
data =_data;
len = _len;
}
public byte[] data() {
return data;
}
public int len()
{
return len;
}
}

View File

@ -0,0 +1,47 @@
package com.safemobile.lib;
public class Alarm {
public int idx;
public String unitName;
public int type;
public String typestr;
public String description;
public long timeGMT;
public int ack;
public long sc_id;
public Alarm()
{
}
public Alarm(int idx, int type, String description, int timeGMT, int ack, int sc_id)
{
this.idx = idx;
this.sc_id = sc_id;
this.type = type;
this.description = description;
this.timeGMT = timeGMT;
this.ack = ack;
switch (this.type)
{
case 0: typestr = "emergency";
break;
case 1: typestr = "landmark";
break;
case 2: typestr = "zone";
break;
case 3: typestr = "speed";
break;
case 4: typestr = "telemetry";
break;
default:
typestr = "emergency";
}
this.unitName = "Empty";
}
public String toString()
{
return "idx: " + idx + " | sc_id: " + sc_id + " | type: " + type + " | description: " + description + " | timeGMT: " + timeGMT + " | ack:" + ack + " | typestr:" + typestr+" | unitName:" + unitName;
}
}

View File

@ -0,0 +1,34 @@
package com.safemobile.lib;
import java.util.ArrayList;
public class AlarmMSG extends TCPmsg {
public ArrayList<Alarm> alarmList;
public static int count=0;
public AlarmMSG(TCPmsg tcp) {
super(tcp);
alarmList = new ArrayList<Alarm>();
String date4parsing = super.data;
//SM.Debug("SMS date4parsing:"+date4parsing);
String[] tempArr = date4parsing.split(";");
//SM.Debug("SMS tempArr.length:" +tempArr.length);
for(int i =0; i<tempArr.length;i++)
{
String[] tempVeh = tempArr[i].split("&");
if(tempVeh.length<6)
continue;
//int idx, int type, String description, int timeGMT, int ack, int sc_id
Alarm alarm = new Alarm(Integer.parseInt(tempVeh[1]),Integer.parseInt(tempVeh[5]),tempVeh[3],Integer.parseInt(tempVeh[4]),
Integer.parseInt(tempVeh[0]),Integer.parseInt(tempVeh[2]));
alarmList.add(alarm);
//SM.Debug(alarm.toString());
}
count +=this.alarmList.size();
SM.Debug("alarmList size:" +this.alarmList.size() + " total:" +count);
}
}

View File

@ -0,0 +1,194 @@
package com.safemobile.lib;
import java.nio.ByteBuffer;
import java.util.ArrayList;
import java.util.Hashtable;
import com.safemobile.lib.radio.Channel;
import com.safemobile.lib.radio.Emerg;
import com.safemobile.lib.radio.IncCall;
import com.safemobile.lib.radio.RadioGW;
import com.safemobile.lib.radio.RadioStatus;
import com.safemobile.lib.radio.Zone;
import com.safemobile.lib.radio.Zone_and_channel;
import com.safemobile.libpad.PadRecording;
import com.safemobile.libpad.PadTextMessage;
import android.content.SharedPreferences;
public class AppParams {
public enum EnumCallState {hangTime, callEnd, online, offline, callReceived, callMade };
public enum Dialogs {motionless, mandown, firmware, password};
public enum Tabs {live, history, radio, message, alarms, recordings, setup};
public enum Theme {SAFENET, SAFEDISPATCH, HYTERA, VISION}
public enum ActivityResult { logout, restart, exit, tcpDown};
/* SafeMobile Dispatch */
public static ArrayList<User> allUsers = new ArrayList<User>();
public static Theme theme = Theme.SAFENET; // the Theme type
/* ***************************************** */
/* ********** Radio Status Params ********** */
/* ***************************************** */
public static RadioStatus crtRadioStatus = new RadioStatus();
public static Zone_and_channel crtZoneAndChannel = new Zone_and_channel();
public static Emerg crtEmergencyState = new Emerg();
public static IncCall crtIncCall = new IncCall();
public static PadRecording crtPlayingRecording = new PadRecording();
public static ByteBuffer recordingBuffer = null;
//public static ArrayList<PadTextMessage> listTextMessages = new ArrayList<PadTextMessage>();
public static Hashtable<String, PadTextMessage> hashNotAckMsg = new Hashtable<String, PadTextMessage>();
// the text message hash table will have the first key the radioID, and the second key the textMessage DB ID
public static Hashtable<Long, Hashtable<Long, PadTextMessage>> hashTextMessagesByRadioID = new Hashtable<Long, Hashtable<Long, PadTextMessage>>();
//public static ArrayList<PadRecording> listRecordings = new ArrayList<PadRecording>();
public static Hashtable<Integer, PadRecording> listRecordings = new Hashtable<Integer, PadRecording>();
public static ArrayList<Recording> recordings = new ArrayList<Recording>();
public static ArrayList<Contact> listContacts = new ArrayList<Contact>();
public static ArrayList<Zone> listZones = new ArrayList<Zone>();
public static ArrayList<RadioGW> listRadios = new ArrayList<RadioGW>();
public static Radio crtRadio = new Radio();
public static Zone crtZone = new Zone();
public static Channel crtChannel;
public static PadTextMessage crtSentTextMessage = new PadTextMessage();
public static PadTextMessage crtAckedTextMessage = new PadTextMessage();
public static PadTextMessage crtReceivedTextMessage = new PadTextMessage();
public static Contact crtContact = new Contact();
public static Contact crtTetraContact = new Contact();
public static Contact crtTetraGroup = new Contact();
public static PadRecording crtRecording = new PadRecording();
public static final int TRBOO = 1, TETRA = 2, SEPURAA = 3;
public static final int NOT_ACK = 1;
public static final int ACK = 2;
public static int APPLICATION_TYPE = TRBOO; // WILL BE MODIFIED AT CONNECTION
public static final String FIRMWARE_VERSION = "2.3.1";
public static boolean DEMO = false; // DEMO is set by package name (contains OR !contains "demo")
/** Safenet Login */
public static long USERID = -1;
public static String USERNAME = "";
public static String PASSWORD = "";
public static boolean REMEMBER = false;
public static String DEFAULT = "";
//private String[] Types = {"AIR", "RADIOPAD", "MOTOPAD-TRBO", "MOTOPAD-TETRA"};
public static String TYPE = "RADIOPAD"; // blue or red version (SafeMobile or AIR version)
//public static boolean AIR = false; // blue or red version (SafeMobile or AIR version)
public static boolean TABLET = false; // flag if device is a TABLET or PHONE (inconsistent - 06.Nov.2012)
public static boolean PAUSED = false; // application status: PAUSED or RUNNING
public static boolean SEPURA = false;
public static boolean PRINTER = false;
public static int UPDATE_SIZE = 20;
public static String Database = ""; //"de"; // database language
public static boolean online = false;
/** Tabs */
public static Tabs crtTab = Tabs.radio;
public static int CallState = 3; // tablet state: 7 - Hangtime, 3 - Ended, Other - inCall
public static long CallSourId = -1;
public static long CallDestId = -1;
public static int CallType = 101;
public static long selCallId = -1;
public static int selCallType = 101;
public static long CallStartTime = -1;
public static int prevCallState = 4;
public static boolean inCall = false;
public static boolean externalSource = false;
/** Configuration File */
//public static ConfigFile configFile = null; // config file
/** Database */
//public static DatabaseCommunication databaseCommunication = null;
/** SharedPreferences */
public static SharedPreferences prefs; // project preferences
public static String LANGUAGE; // displaying language
public static String LANGUAGETMP = "en"; // temporary displayed language
public static String STREAM = "MUSIC"; // AudioHandler's AudioTrack default stream
public static String SOURCE = "TCP"; // AudioHandler's AudioTrack default source
public static boolean EXTERNALMIC = false; // external mic used with what-a-pair systems
public static boolean TETHERSOUND = false; // allow BlueTooth tethering
public static boolean TRBO = true;
public static boolean NOTIFICATIONS = true;
public static boolean RECORDINGS = true;
public static String RECORDINGS_LOCATION = "Internal Storage";
public static boolean MANDOWN = false;
public static int MANDOWNTHRESHOLD = 25;
public static boolean MOTIONLESS = false;
public static int MOTIONLESSTIME = 300;
public static int RADIOID = 100;
public static String RADIOIP = "192.168.10.40";
public static String IP="n/a"; // SafeBridge's IP
public static String PORT="13570"; // SafeBridge's PORT
public static String PATH = "n/a"; // ConfigFile PATH
/** BluComm
* states : 0 - disconnected; 1 - connected but not pressed; 2 - pressed; */
public static int BluCommState = 0; // remembers BluComm Microphone state
public static final int PTTON = 1;
public static final int PTTOFF = 0;
/** Call Types */
public static final int AllCall = 101;
public static final int PrivateCall = 102;
public static final int GroupCall = 103;
public static final int EndAllCall = AllCall+10;
public static final int EndPrivateCall = PrivateCall+10;
public static final int EndGroupCall = GroupCall+10;
public static final int PTTBUTTON = 999;
public static final int VOXON = 555;
public static final int VOXOFF = 000;
/* Old Values
public static final int Decoded = 1;
public static final int InProgress = 2;
public static final int Initiated = 4;
public static final int Hangtime = 7;
public static final int Ended = 3;
public static final int InitButton = 5;
public static final int MotoPrivate = 4;
public static final int MotoGroup = 6;
public static final int MotoAllCall = 16777215;
//*/
//* New Values
public static final int Initiated = 0;
public static final int Decoded = 1;
public static final int InProgress = 2;
public static final int Hangtime = 3;
public static final int Ended = 4;
public static final int InitEnded = 5;
public static final int InitHangtime = 6;
public static final int MotoPrivate = 1;
public static final int MotoGroup = 2;
public static final int MotoAllCall = 3;
public static final int MotoManualDial = 4;
//*/
/** BlueTooth Headset MAC */
public static String BluCom = "00:15:45:";
/*
public static String MotorolaH730 = "00:24:1C:";
public static String SamsungWep460 = "18:46:17:";
*/
/** Notification values */
public static final int messageNotif = 1;
public static final int alertNotif = 2;
public static final int pollNotif = 3;
}

View File

@ -0,0 +1,34 @@
package com.safemobile.lib;
import java.util.ArrayList;
import com.safemobile.lib.radio.Zone;
public class ConfigFile {
public ArrayList<Contact> contacts;
public Radio radio;
public ArrayList<Zone> zones;
public ConfigFile()
{
contacts = new ArrayList<Contact>();
zones = new ArrayList<Zone>();
}
public String toString()
{
return "Contacts: " + contacts.size() + " | Radio: " + radio.toString() + " | Zones: " + zones.size();
}
public String toLongString()
{
String cont = "", zone="";
for(Contact contact: contacts)
cont += "Name: " + contact.name + " | Id: " + contact.id + "\n";
for(Zone zonee: zones)
zone += "Name: " + zonee.ZoneName + " | Id: " + zonee.id + "\n";
return "# Contacts #\n" + cont + "# Radio #\n" + radio.toString() + "\n# Zones #\n" + zone;
}
}

View File

@ -0,0 +1,94 @@
package com.safemobile.lib;
import java.util.ArrayList;
public class Contact {
public int dbID = 0;
public long id = 0;
public String name = "";
public int contactType = 0;
public int parentDB_ID = 0;
public static final int PRIVATE = 1;
public static final int GROUP = 2;
public static final int ALL = 3;
public static final int ZONE = 4;
public static final int CHANNEL = 5;
public Contact()
{
}
public Contact(long _id, String _name, int _contactType, int dbID, int parentDB_id)
{
id = _id;
name = _name;
contactType = _contactType;
this.dbID = dbID;
this.parentDB_ID = parentDB_id;
}
public String toString()
{
return id + ". " + name + " [" + getContactType(contactType) + "]";
}
private String getContactType(int contactType) {
switch(contactType) {
case PRIVATE: return "PRIVATE";
case GROUP: return "GROUP";
case ALL: return "ALL CALL";
case ZONE: return "ZONE";
case CHANNEL: return "CHANNEL";
default: return "UNKNOWN";
}
}
public static ArrayList<Contact> parseTCPMsg(String msg) {
ArrayList<Contact> contacts = new ArrayList<Contact>();
try
{
msg = msg.replace("#", "");
// split payload to get contacts
// split contact by /
String[] contArr = msg.split("/");
Contact ct = new Contact();
ct.dbID = Integer.parseInt(contArr[0]);
ct.id = Long.parseLong(contArr[1]);
ct.name = contArr[2];
ct.contactType = Integer.parseInt(contArr[4]);
ct.parentDB_ID = Integer.parseInt(contArr[3]);
contacts.add(ct);
}
catch(Exception ex)
{
SM.Exception("Exception parse Contacts", ex.toString());
}
return contacts;
/*
int id = 1;
// this will select the type
switch(AppParams.APPLICATION_TYPE * 10 + id) {
}
*/
}
public static String getNameForRadioID(ArrayList<Contact> listUnits, long radioID) {
for(Contact ctc: listUnits)
if(ctc.id == radioID && (ctc.contactType == Contact.PRIVATE))
return ctc.name;
// if contact wasn't found I should return it's radioID
return radioID+"";
}
}

View File

@ -0,0 +1,19 @@
package com.safemobile.lib;
public class GPS {
public long imei=0;
public double lat=0;
public double lng=0;
public int speed=0;
public long timeGMT=0;
public GPS(){
}
public String toString()
{
return "imei: " + imei + " | LAT: " + lat + " | LNG: " + lng + " | speed: " + speed + " | timeGMT: " + timeGMT;
}
}

View File

@ -0,0 +1,24 @@
package com.safemobile.lib;
public class GPSmsg extends TCPmsg {
public GPS gpsValue;
public static int count=0;
public GPSmsg(TCPmsg tcp)
{
super(tcp);
String date4parsing = super.data;
//SM.Debug("SMS date4parsing:"+date4parsing);
String[] tempVeh = date4parsing.split("#");
gpsValue = new GPS();
gpsValue.imei = Long.parseLong(tempVeh[0]);
gpsValue.lat = Double.parseDouble(tempVeh[3]);
gpsValue.lng = Double.parseDouble(tempVeh[4]);
gpsValue.speed = Integer.parseInt(tempVeh[2]);
gpsValue.timeGMT = Long.parseLong(tempVeh[1]);
}
}

View File

@ -0,0 +1,22 @@
package com.safemobile.lib;
public class HistCount {
public String seq_id;
public long count;
public HistCount()
{
}
public HistCount(String _seq_id, long _count)
{
seq_id = _seq_id;
count = _count;
}
public String toString()
{
return "seq_id: " + seq_id + " | count: " + count;
}
}

View File

@ -0,0 +1,18 @@
package com.safemobile.lib;
public class HistCountmsg extends TCPmsg {
public HistCount histcountValue;
public long count=0;
public HistCountmsg(TCPmsg tcp)
{
super(tcp);
String date4parsing = super.data;
//SM.Debug("SMS date4parsing:"+date4parsing);
//String[] tempVeh = date4parsing.split("#");
date4parsing = date4parsing.replace("#", "");
histcountValue = new HistCount();
histcountValue.count = Long.parseLong(date4parsing);
histcountValue.seq_id = super.seqID;
}
}

View File

@ -0,0 +1,75 @@
package com.safemobile.lib;
public class HistPos {
public double lat=0;
public double lng=0;
public int speed=0;
public long timeGMT=0;
public String Address="";
public int heading=0;
public HistPos(){
}
public HistPos(double _lat, double _lng, int _speed, long _timeGMT){
lat = _lat;
lng = _lng;
speed = _speed;
timeGMT = _timeGMT;
}
public String toString()
{
return " LAT: " + lat + " | LNG: " + lng + " | speed: " + speed + " | timeGMT: " + timeGMT + " | Address: " + Address;
}
public int GetIconHead()
{
try
{
if (((heading >= 0) && (heading < 11.25)) || ((heading > 348.75) && (heading <= 360)))
return R.drawable.arrow_e;
else if ((heading >= 11.25) && (heading < 33.75))
return R.drawable.arrow_ene;
else if ((heading >= 33.75) && (heading < 56.25))
return R.drawable.arrow_ne;
else if ((heading >= 56.25) && (heading < 78.75))
return R.drawable.arrow_nne;
else if ((heading >= 78.75) && (heading < 101.25))
return R.drawable.arrow_n;
else if ((heading >= 101.25) && (heading < 123.75))
return R.drawable.arrow_nnv;
else if ((heading >= 123.75) && (heading < 146.25))
return R.drawable.arrow_nv;
else if ((heading >= 146.25) && (heading < 168.75))
return R.drawable.arrow_vnv;
else if ((heading >= 168.75) && (heading < 191.25))
return R.drawable.arrow_v;
else if ((heading >= 191.25) && (heading < 213.75))
return R.drawable.arrow_vsv;
else if ((heading >= 213.75) && (heading < 236.25))
return R.drawable.arrow_sv;
else if ((heading >= 236.25) && (heading < 258.75))
return R.drawable.arrow_ssv;
else if ((heading >= 258.75) && (heading < 281.25))
return R.drawable.arrow_s;
else if ((heading >= 281.25) && (heading < 303.75))
return R.drawable.arrow_sse;
else if ((heading >= 303.75) && (heading < 326.25))
return R.drawable.arrow_se;
else if ((heading >= 326.25) && (heading < 348.75))
return R.drawable.arrow_ese;
else
return -1;
}
catch (Exception e) {
SM.Debug("Erorr on select Arrows");
return -1;
}
}
}

View File

@ -0,0 +1,126 @@
package com.safemobile.lib;
import java.util.ArrayList;
//Date data = Calendar.getInstance().getTime();
//data.getTime();
public class HistPosmsg extends TCPmsg {
public ArrayList<HistPos> PosList;
public int count=0;
public HistPosmsg(TCPmsg tcp) {
super(tcp);
PosList = new ArrayList<HistPos>();
try{
String date4parsing = super.data;
//SM.Debug("SMS date4parsing:"+date4parsing);
String[] tempArr = date4parsing.split(";");
//SM.Debug("SMS tempArr.length:" +tempArr.length);
for(int i =0; i<tempArr.length;i++)
{
String[] tempVeh = tempArr[i].split("&");
if(tempVeh.length<6)
continue;
HistPos tmpLast = new HistPos();
tmpLast.lat = Double.parseDouble(tempVeh[1]);
tmpLast.lng = Double.parseDouble(tempVeh[2]);
tmpLast.speed = Integer.parseInt(tempVeh[3]);
tmpLast.timeGMT = Long.parseLong(tempVeh[5]);
tmpLast.Address = tempVeh[6];
//tmpLast.Address = "";
PosList.add(tmpLast);
//SM.Debug("duda",tmpLast.toString());
}
}
catch (Exception e) {
SM.Debug("Error on parse hisotry:"+e.toString());
}
CalcHeadingForArray(PosList);
count +=this.PosList.size();
SM.Debug("duda","HistList size:" +this.PosList.size() + " total:" +count);
}
public ArrayList<HistPos> CalcHeadingForArray(ArrayList<HistPos> list)
{
this.PosList = list;
if (PosList.size()>1)
{
HistPos oldPos = PosList.get(0);
HistPos tmpPos = null;
int Headingtmp =0;
for (int i=1;i<PosList.size();i++)
{
tmpPos = PosList.get(i);
Headingtmp = CalcHead(tmpPos.lng, tmpPos.lat, oldPos.lng, oldPos.lat, Headingtmp);
tmpPos.heading = Headingtmp;
oldPos = tmpPos;
}
}
return this.PosList;
}
private int CalcHead(double lastLocX, double lastLocY, double prevLocX, double prevLocY, int heading)
{
double dlng = lastLocX - prevLocX;
double dlat = lastLocY - prevLocY;
double mdelta_min = -0.00001;
double delta_min = 0.00001;
int headcalc = 0;
double blat = 0;
double blng = 0;
if ((dlat > mdelta_min) && (dlat < delta_min) && ((mdelta_min < dlng) && dlng < (delta_min))) headcalc = heading;
else
{
if ((mdelta_min < dlat) && (dlat < delta_min))
{
blng = 1;
if (dlng < 0) headcalc = 180;
else headcalc = 0;
}
else
{
blat = 1;
if (dlat > 0) headcalc = 90;
else headcalc = 270;
}
}
if ((mdelta_min < dlng) && (dlng < delta_min))
{
if (blat == 0)
{
if (dlat > 0)
{
if (headcalc == 180) headcalc = 135;
if (headcalc == 0) headcalc = 45;
}
else
{
if (headcalc == 180) headcalc = 225;
if (headcalc == 0) headcalc = 315;
}
}
}
else
{
if (blng == 0)
{
if (dlng < 0)
{
if (headcalc == 90) headcalc = 135;
if (headcalc == 270) headcalc = 225;
}
else
{
if (headcalc == 90) headcalc = 45;
if (headcalc == 270) headcalc = 315;
}
}
}
return headcalc;
}
}

View File

@ -0,0 +1,22 @@
package com.safemobile.lib;
public class LastPos {
public long imei=0;
public double lat=0;
public double lng=0;
public int speed=0;
public long timeGMT=0;
public String Address="";
public boolean isON=false;
public LastPos(){
}
public String toString()
{
return "imei: " + imei + " | LAT: " + lat + " | LNG: " + lng + " | speed: " + speed + " | timeGMT: " + timeGMT + " | Address: " + Address + " | isON: " + isON;
}
}

View File

@ -0,0 +1,42 @@
package com.safemobile.lib;
import java.util.ArrayList;
public class LastPosmsg extends TCPmsg {
public ArrayList<LastPos> PosList;
public static int count=0;
public LastPosmsg(TCPmsg tcp) {
super(tcp);
PosList = new ArrayList<LastPos>();
String date4parsing = super.data;
//SM.Debug("SMS date4parsing:"+date4parsing);
String[] tempArr = date4parsing.split(";");
//SM.Debug("SMS tempArr.length:" +tempArr.length);
for(int i =0; i<tempArr.length;i++)
{
String[] tempVeh = tempArr[i].split("&");
if(tempVeh.length<6)
continue;
LastPos tmpLast = new LastPos();
tmpLast.imei = Long.parseLong(tempVeh[0]);
tmpLast.lat = Double.parseDouble(tempVeh[1]);
tmpLast.lng = Double.parseDouble(tempVeh[2]);
tmpLast.speed = Integer.parseInt(tempVeh[3]);
if (Integer.parseInt(tempVeh[4])==0) tmpLast.isON =true;
else tmpLast.isON = false;
tmpLast.timeGMT = Long.parseLong(tempVeh[5]);
//tmpLast.Address = tempVeh[6];
tmpLast.Address = "";
PosList.add(tmpLast);
//SM.Debug("duda",tmpLast.toString());
}
count +=this.PosList.size();
SM.Debug("duda","LastList size:" +this.PosList.size() + " total:" +count);
}
}

View File

@ -0,0 +1,42 @@
package com.safemobile.lib;
import java.util.ArrayList;
import com.safemobile.lib.User;
public class LoginMSG extends TCPmsg{
public ArrayList<User> userList;
public LoginMSG(TCPmsg m) {
super(m);
userList = new ArrayList<User>();
String date4parsing = super.data;
//SM.Debug("date4parsing:"+date4parsing);
String[] tempArr = date4parsing.split(";");
for(int i =0; i<tempArr.length;i++)
{
//SM.Debug("i:" + i+"Data :"+tempArr[i]);
String[] tempUser = tempArr[i].split("&");
//SM.Debug("split len:"+tempUser.length);
if(tempUser.length<3)
continue;
int ID = Integer.parseInt(tempUser[1]);
String logName = tempUser[0];
String pass = tempUser[2];
User usr= new User(ID, "", "", logName, pass, 0, 0);
userList.add(usr);
//SM.Debug("added user to list:" +logName);
//SM.Debug("LoginMSG new size:" +this.userList.size());
}
//SM.Debug("LoginMSG userList:" +this.userList.size());
}
}

View File

@ -0,0 +1,8 @@
package com.safemobile.lib;
public class Mic {
public int mic_type;
public int mic_state;
public int mic_gain;
public int signal_type;
}

View File

@ -0,0 +1,29 @@
package com.safemobile.lib;
import java.util.Date;
public class Msg {
public Vehicle from;
public Date received;
public String seqID;
/** Safenet */
public long id;
public String message;
public boolean read;
public boolean sent;
public String subscriber; //will be imei or gw_id+radio_id
public Date time, timeSent;
public int type;
public Msg() { }
public Msg(Vehicle From, String Message, Date Received, String seqID)
{
this.message = Message;
from = From;
received = Received;
this.seqID = seqID;
}
}

View File

@ -0,0 +1,157 @@
package com.safemobile.lib;
public class OperationCodes {
/* TCP MSG EVENTS CODES */
/** Login Request
* @param username
* @param password values must be MD5 */
public static final int CONNECTION_REQ = 19;
public static final int CONNECTION_REP = 219;
/** Get contacts from radio */
public static final int CONTACTS_REQ = 26;
public static final int CONTACTS_REP = 226;
public static final int UNIT_STATUS_UPDATE = 250;
/** Send a new sms to a unit
* @param seqID a unique identifier for the message
* @param sc_id units imei to which you send the sms
* @param txt the text message that you want to send*/
public static final int SEND_TM = 24;
public static final int TM_ACK = 224;
public static final int TM_ACK_SD = 242;
/** Get radio status that tells if it's online or offline
* @param gwID gateway id
* @param rgwID radio gateway id */
public static final int RADIO_STATUS_REQ = 99;
public static final int RADIO_STATUS_REP = 199;
public static final int RADIO_STATUS_BRDCST = 200;
/** change zone and channels
* @param gwID gateway id
* @param rgwID radio gateway id
* @param zoneNR desired zone number
* @param channelNR desired channel number */
public static final int CHANNEL_QUERY_REQ = 104;
public static final int CHANNEL_BRDCST = 204;
/** Reset the Bridge */
public static final int BRIDGE_RESET = 98;
/** PING-PONG */
public static final int PING = 91;
public static final int PONG = 92;
/** Emergency request
* @param value this will select to activate or deactivate alarm (TRUE = activate) */
public static final int EMERGENCY_REQ = 130;
public static final int EMERGENCY_REP = 230;
/** Initiated a call
* @param callType this will select the type of the call (All, Private or Group Call)
* @param radioID the contact to which the call is made */
public static final int SEND_PTT = 1313;
public static final int CALL_STATUS_BRDCST = 126;
/** Change the call type for external mic initiated calls
* @param callType this will select the type of the call (All, Private or Group Call)
* @param radioID the contact to which the call is made */
public static final int CALL_TYPE_REQ = 161;
public static final int CALL_TYPE_REP = 171;
/** Terminate a call */
public static final int DEKEY_REQ = 160;
/** Request the list of all messages
* @param timeGMTStart first message time (all messages will be newer than this time) */
public static final int TM_LIST_REQ = 25;
public static final int TM_LIST_REP = 225;
/** Request the list of all recordings
* @param timeGMTStart first message time (all messages will be newer than this time) */
public static final int RECORDINGS_LIST_REQ = 27;
public static final int RECORDINGS_LIST_REP = 227;
/** Request a recording to be played */
public static final int RECORDING_REQ = 28;
public static final int RECORDING_REP = 228;
/** A SMS is received */
public static final int RECEIVED_TM = 132;
/** Notification was clicked to display the received TM */
public static final int MESSAGE_NOTIFICATION_CLICKED = 690;
/** get tcp connection from service */
public static final int TCP_CONNECTION_REQ = 678;
public static final int TCP_CONNECTION_UP = 679;
public static final int TCP_CONNECTION_DOWN = 677;
/** operation code needed to change the Radio ID in radioTAB */
public static final int RADIOID_CHANGED = 888;
/** operation code needed when a bluetooth is tethered or not */
public static final int BLUETOOTH_TETHER = 901;
/** get vehicles for an user id
* @param USERID Logged in user id */
public static final int GetVehicles = 2;
/** get radios list from App Server */
public static final int GetRadiosList = 3;
/** get vehicles last positions
* @param USERID Logged in user id */
public static final int GetLastPositions = 4;
/** get the last sms for all the vehicles */
public static final int GetLastSMS = 5;
/** get sms for a specific vehicle newer than a date
* @param sc_id vehicle imei for which we wish the list of sms
* @param timeGMT the unix time from the last sms in the grid */
public static final int GetRecentSMSs = 6;
/** enable/ disable vehicle status or poll it
* @param radioCode
* @param opCode
* @param sc_id vehicle imei
* @param enable */
public static final int Option4Unit = 8;
/** get alarms for an user id
* @param USERID Logged in user id */
public static final int GetAlarms = 9;
/** acknoledge an alarm based on it's index and type
* @param idx alarm's index in the DB
* @param type alarm's type as shown in the grid*/
public static final int SendAlarmAcknoledge = 10;
/** get history position for a specific vehicle
* @param sc_id vehicle's imei
* @param timeGMTStart history start date in unixtime
* @param timeGMTStop history end date in unixtime*/
public static final int GetHistoryPositions = 11;
}

View File

@ -0,0 +1,203 @@
package com.safemobile.lib;
import android.os.Parcel;
import android.os.Parcelable;
import androidx.annotation.NonNull;
import com.google.gson.Gson;
import org.json.JSONException;
import org.json.JSONObject;
import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Locale;
/**
* Created by Adi on 8/11/2017.
*/
public class Position implements Parcelable, Comparable<Position>{
// region private fields
public double latitude;
public double longitude;
public Date positionTime;
public double speed;
public String address;
public float accuracy;
//endregion
/**
* Default constructor
*/
public Position()
{
latitude = 0;
longitude = 0;
positionTime = new Date(0);
speed = 0;
address = "";
accuracy = 0;
}
public Position(String json)
{
try {
JSONObject posObj = new JSONObject(json);
speed = posObj.isNull("speed")
? 0 : posObj.getDouble("speed");
latitude = posObj.isNull("latitude")
? 0 : posObj.getDouble("latitude");
longitude = posObj.isNull("longitude")
? 0 : posObj.getDouble("longitude");
address = posObj.isNull("address")
? "" : posObj.getString("address");
accuracy = posObj.isNull("accuracy")
? 0 : (float) posObj.getDouble("accuracy");
String posTime = posObj.isNull("positionTime")
? "" : posObj.getString("positionTime");
if(posTime.length() > 0)
{
//May 16, 2018 12:01:47
try
{
String timeFormat = "MMMMM d, yyyy HH:mm:ss";
DateFormat format = new SimpleDateFormat(timeFormat, Locale.ENGLISH);
positionTime = format.parse(posTime);
}
catch (ParseException e)
{
String timeFormat = "MMM d, yyyy HH:mm:ss";
DateFormat format = new SimpleDateFormat(timeFormat, Locale.ENGLISH);
positionTime = format.parse(posTime);
}
}
} catch (JSONException e) {
e.printStackTrace();
positionTime = new Date(0);
} catch (ParseException e) {
e.printStackTrace();
positionTime = new Date(0);
}
}
public Position(double latitude, double longitude)
{
this.latitude = latitude;
this.longitude = longitude;
positionTime = new Date(0);
speed = 0;
address = "";
accuracy = 0;
}
/**
* Constructor from Parcel, reads back fields IN THE ORDER they were
* written
*/
public Position(Parcel parcel){
latitude = parcel.readDouble();
longitude = parcel.readDouble();
positionTime = new Date(parcel.readLong());
speed = parcel.readDouble();
address = parcel.readString();
accuracy = parcel.readFloat();
}
/**
* Method from Parcelable class, left as auto-generated
* @return A default value
*/
@Override
public int describeContents() {
return 0;
}
/**
* Method to create the Parcel object from the main class that
* will be passed when a Parcelable object is used
* @param dest Parcel object in which all the object values will
* be added
* @param flags Additional flags about how the object should be
* written. May be 0 or PARCELABLE_WRITE_RETURN_VALUE.
*/
@Override
public void writeToParcel(Parcel dest, int flags) {
dest.writeDouble(latitude);
dest.writeDouble(longitude);
dest.writeLong(positionTime.getTime());
dest.writeDouble(speed);
dest.writeString(address);
dest.writeFloat(accuracy);
}
/**
* Static field used to regenerate object, individually or as arrays
*/
public static final Parcelable.Creator<Position> CREATOR = new Parcelable.Creator<Position>() {
public Position createFromParcel(Parcel in) {
return new Position(in);
}
@Override
public Position[] newArray(int size) {
return new Position[size];
}
};
/**
* Override of the method that returns a string representation of the object which
* contains all the useful information about the object
* @return String representation of the object
*/
@Override
public String toString()
{
return "Latitude: " + latitude + " | "
+ "Longitude: " + longitude + " | "
+ "Speed: " + speed + " | "
+ "PositionTime: " + (positionTime!= null ? positionTime.toString() : "null" ) + " | "
+ "Address " + (address!= null ? address.toString() : "null" )
+ "Accuracy " + accuracy;
}
@Override
public int compareTo(@NonNull Position o) {
return (latitude == o.latitude
&& longitude == o.longitude
) ? 0 : 1;
}
// Overriding equals() to compare two Complex objects
@Override
public boolean equals(Object o) {
Position pos = (Position) o;
return compareTo(pos) == 0;
}
// just omitted null checks
@Override
public int hashCode() {
double res = latitude * longitude * 100000;
int hash = (int)(latitude );
hash = (int)(longitude) * hash;
return (int)res;
}
public String toJson()
{
return new Gson().toJson(this);
}
}

View File

@ -0,0 +1,22 @@
package com.safemobile.lib;
public class Radio {
public int id = 100;
public String ip = "192.168.10.40";
public Radio()
{
}
public Radio(int _id, String _ip)
{
id = _id;
ip = _ip;
}
public String toString()
{
return "id: " + id + " | ip: " + ip;
}
}

View File

@ -0,0 +1,344 @@
package com.safemobile.lib;
import java.util.ArrayList;
import com.safemobile.lib.radio.Channel;
import com.safemobile.lib.radio.Emerg;
import com.safemobile.lib.radio.IncCall;
import com.safemobile.lib.radio.RadioGW;
import com.safemobile.lib.radio.RadioStatus;
import com.safemobile.lib.radio.SUstatus;
import com.safemobile.lib.radio.Zone;
import com.safemobile.lib.radio.Zone_and_channel;
public class RadioMSG extends TCPmsg {
public int rOpcode;
public String payload="";
public ArrayList<RadioGW> RadioGWList=null;
//zone and channel;
public Zone_and_channel zac= null;
//radio status
public RadioStatus rStatus = null;
//SU stauts
public SUstatus suStatus = null;
//Incomming call
public IncCall incCall = null;
//Emerg
public Emerg emerg = null;
// Contacts list
public ArrayList<Contact> contacts;
public RadioMSG(TCPmsg tcp) {
super(tcp);
String date4parsing = super.data;
String[] arr = date4parsing.split("#");
rOpcode = Integer.parseInt(arr[0]);
payload = arr[1];
switch(rOpcode)
{
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:
{
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]);
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 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:
{
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:
case 123:
{
try {
incCall = new IncCall();
incCall.opCode = rOpcode;
incCall.callStatus = Integer.parseInt(payload.substring(payload.length()-1, payload.length()));
} catch (Exception e) {
SM.Debug("Cmd 121, 122, 123 error:"+e.toString());
}
/*
try {
System.out.println("############ tmpARR: " + payload );
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.callStatus = Integer.parseInt(tempArr[1]);
incCall.callType = Integer.parseInt(tempArr[2]);
incCall.groupId = Integer.parseInt(tempArr[3]);
} catch (Exception e) {
SM.Debug("Cmd 121, 122, 123 error:"+e.toString());
}
*/
break;
}
case 115:
case 116:
case 117:
{
try {
incCall = new IncCall();
incCall.opCode = rOpcode;
incCall.callStatus = Integer.parseInt(payload.substring(payload.length()-1, payload.length()));
} catch (Exception e) {
SM.Debug("Cmd 115,116,117 error:"+e.toString());
}
break;
/*
try {
incCall = new IncCall();
String[] tempArr = payload.split("&");
incCall.opCode = rOpcode;
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.callStatus = 3;
incCall.callType = Integer.parseInt(tempArr[2]);
incCall.groupId = Integer.parseInt(tempArr[3]);
} catch (Exception e) {
SM.Debug("Cmd 115, 116, 117 error:"+e.toString());
}
break;
*/
}
case OperationCodes.CALL_TYPE_REP:
{
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:
{
try {
incCall = new IncCall();
incCall.opCode = rOpcode;
String[] tempArr = payload.split("/");
incCall.mic = new Mic();
incCall.mic.mic_type = Integer.parseInt(tempArr[0]);
incCall.mic.signal_type = Integer.parseInt(tempArr[1]);
incCall.mic.mic_state = Integer.parseInt(tempArr[2]);
incCall.mic.mic_gain = Integer.parseInt(tempArr[3]);
SM.Debug("GOT Mic state changed", incCall.opCode + " # " + incCall.mic.mic_state);
} catch (Exception e) {
SM.Debug("Cmd 172 error:"+e.toString());
}
break;
}
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.userID = Integer.parseInt(tempArr[2]);
} catch (Exception e) {
SM.Debug("Cmd 230 error:"+e.toString());
}
break;
}
/*
case OperationCodes.CONTACTS_REP:
{
try
{
SM.Debug("Parsing Contacts");
contacts = Contact.parseTCPMsg(payload);
}
catch(Exception ex)
{
SM.Exception("Exception parse Contacts", ex.toString());
}
break;
}
*/
default:
break;
}
//SM.Debug("RadioMSG", "Done parsing");
}
}

View File

@ -0,0 +1,39 @@
package com.safemobile.lib;
import java.util.ArrayList;
public class RecordMSG extends TCPmsg {
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(";");
//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 = Integer.parseInt(tempRec[5]);
RecValue.typeID = Integer.parseInt(tempRec[6]);
recordList.add(RecValue);
}
count +=this.recordList.size();
SM.Debug("alarmList size:" +this.recordList.size() + " total:" +count);
}
}

View File

@ -0,0 +1,30 @@
package com.safemobile.lib;
public class Recording {
public long ID;
public int startGMT;
public int endGMT;
public int gwID;
public int radioGWID;
public int subID;
public int typeID;
public String NameForDisplay="";
/** RadioPad */
public long date;
public int duration;
public String filename;
public long destinationRadioID;
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;
}
}

View File

@ -0,0 +1,36 @@
package com.safemobile.lib;
import android.util.Log;
public class SM
{
public static void Debug(String tag, String msg)
{
Log.d(tag,msg);
/*
try
{
if (!tag.toUpperCase().contains("DEFAULT"))
Log.d("Default",msg);
}
catch (Exception ex)
{
Log.d("Default","Error parse tag:"+ex.toString());
}
//*/
}
public static void Debug(String msg)
{
Log.d("Default",msg);
}
public static void Exception(String msg)
{
Log.e("Exception",msg);
}
public static void Exception(String tag, String msg)
{
Log.e(tag,msg);
}
}

View File

@ -0,0 +1,34 @@
package com.safemobile.lib;
public class SMS {
public int idx = 0;
public int status = 0;
public int timeGMT = 0;
public String mess = "";
public long sc_id_dest = 0;
public long sc_id_sour = 0;
public String seq_idx = "";
public SMS(){
}
public SMS(int _idx, int _status, int _timeGMT, String _mess, long _sc_id_dest, long _sc_id_sour)
{
idx = _idx;
status = _status;
timeGMT = _timeGMT;
mess = _mess;
sc_id_dest = _sc_id_dest;
sc_id_sour = _sc_id_sour;
seq_idx = "";
}
public String toString()
{
return "idx: " + idx + " | status: " + status + " | timeGMT: " + timeGMT
+ " | mess: " + mess + " | sc_id_dest: " + sc_id_dest + " | sc_id_sour: " + sc_id_sour
+ " | seq_idx: " + seq_idx;
}
}

View File

@ -0,0 +1,53 @@
package com.safemobile.lib;
import java.util.ArrayList;
import com.safemobile.lib.SMS;
public class SMSmsg extends TCPmsg {
public ArrayList<SMS> smsList;
public static int count=0;
public SMSmsg(TCPmsg tcp) {
super(tcp);
smsList = new ArrayList<SMS>();
String date4parsing = super.data;
//SM.Debug("SMS date4parsing:"+date4parsing);
String[] tempArr = date4parsing.split(";");
//SM.Debug("SMS tempArr.length:" +tempArr.length);
for(int i =0; i<tempArr.length;i++)
{
//SM.Debug("i:" + i+"Data :"+tempArr[i]);
String[] tempVeh = tempArr[i].split("&");
if(tempVeh.length<7)
continue;
SMS sms = new SMS();
String sm = "";
try {
sms.idx = Integer.parseInt(tempVeh[0]);
sm = sms.idx + "";
sms.status = Integer.parseInt(tempVeh[1]);
sm = sms.status + "";
sms.timeGMT = Integer.parseInt(tempVeh[2]);
sm = sms.timeGMT + "";
sms.mess = tempVeh[3];
sms.sc_id_sour = Integer.parseInt(tempVeh[4]);
sm = sms.sc_id_sour + "";
sms.sc_id_dest = Integer.parseInt(tempVeh[5]);
sm = sms.sc_id_dest + "";
sms.seq_idx = tempVeh[6];
}
catch(Exception ex) {
SM.Exception("Exception in SMSmsg: " + ex.toString() + " | " + sm);
}
smsList.add(sms);
//SM.Debug(sms.toString());
}
count +=this.smsList.size();
//SM.Debug("smsList size:" +this.smsList.size() + " total:" +count);
}
}

View File

@ -0,0 +1,35 @@
package com.safemobile.lib;
import java.io.Serializable;
public class SerializedObject implements Serializable{
/**
*
*/
private static final long serialVersionUID = 1L;
private Object object;
private String type;
public SerializedObject (Object object, String type){
this.setObject(object);
this.setType(type);
}
public Object getObject() {
return object;
}
public void setObject(Object object) {
this.object = object;
}
public String getType() {
return type;
}
public void setType(String type) {
this.type = type;
}
}

View File

@ -0,0 +1,68 @@
package com.safemobile.lib;
import java.text.SimpleDateFormat;
import android.util.Log;
public class SuperVehicle extends Vehicle{
public double lat=0;
public double lng=0;
public boolean needUpdate=false;
public int speed=0;
public long timeGMT=0;
public String Address="";
public boolean isON=false;
public SuperVehicle(long sc_id, String imei, long lp, String name, long driver_id, int time_route, int GPS_reporting_interval, int is_stolen)
{
super(sc_id, imei, lp, name, driver_id, time_route, GPS_reporting_interval,
is_stolen);
// TODO Auto-generated constructor stub
}
public void SetDataFromLastPos(Double _lat,Double _lng,long _time,int _speed,String _Address,Boolean _isON)
{
try
{
lat = _lat;
lng = _lng;
timeGMT = _time;
speed = _speed;
Address = _Address;
isON = _isON;
}
catch (Exception ex)
{
Log.d("Erorr", "Contert Error:"+ex.toString());
}
}
public void SetNewPosition(Double _lat,Double _lng,long _time,int _speed)
{
try
{
lat = _lat;
lng = _lng;
timeGMT = _time;
speed = _speed;
isON = true;
}
catch (Exception ex)
{
Log.d("Erorr", "Contert Error:"+ex.toString());
}
}
public String GetUnixTimeDisplay()
{
SimpleDateFormat sdf = new SimpleDateFormat("HH:mm:ss dd-MMM");
return sdf.format(timeGMT*1000);
}
public String toString()
{
return "name: " + name + "imei: " + imei + " | LAT: " + lat + " | LNG: " + lng + " | speed: " + speed + " | timeGMT: " + timeGMT + " | Address: " + Address + " | isON: " + isON;
}
}

View File

@ -0,0 +1,87 @@
package com.safemobile.lib;
import com.safemobile.lib.SM;
public class TCPmsg
{
public boolean OK;
public int msgLen;
public String seqID;
public int opCode;
public String data;
public String error;
public String allData;
public String leftOver="";
private char[] _rawdata;
private int _len;
public TCPmsg(char[] rawdata, int len)
{
_rawdata = rawdata;
_len = len;
OK = Parse();
}
public TCPmsg(TCPmsg tcp)
{
_rawdata =tcp._rawdata;
_len = tcp._len;
OK = Parse();
}
public TCPmsg(char[] msg)
{
_rawdata = msg;
_len = msg.length;
OK = Parse();
}
private boolean Parse()
{
char[] temp = new char[_len];
for(int i=0;i<_len;i++) temp[i] = _rawdata[i];
data =new String(temp);
//SM.Debug("multi RX: " + data);
this.allData = data;
String[] tempArr = data.split("#");
if ((tempArr.length == 0) || (tempArr.length == 1))
{
SM.Debug("incorect messagebuss message=" + data);
return false;
}
//get msg len
int messLen = -1;
try
{
messLen = Integer.parseInt(tempArr[1]);
} catch (Exception e) {
SM.Debug("incorect msg len =" + tempArr[1]);
return false;
}
//messLen not int
if(messLen ==-1) return false;
if (_len != messLen)
{
SM.Debug("message length("+messLen+") != actual length("+_len+")");
return false;
}
seqID = tempArr[2];
opCode = Integer.parseInt(tempArr[3]);
data = "";
for (int i = 4; i < tempArr.length; i++)
{
if(tempArr[i] !="")
data += tempArr[i]+"#";
}
// add sequence ID to data when ack message
if(opCode == OperationCodes.TM_ACK || opCode == OperationCodes.TM_ACK_SD)
data+= seqID + "#";
return true;
}
}

View File

@ -0,0 +1,47 @@
package com.safemobile.lib;
public class User {
public int id;
public String firstname;
public String lastname;
public String login;
public String password;
public int user_type;
public int ison = 0;
public Vehicle vehValue;
public User()
{
this.id = -1;
this.user_type = 1;
}
public User(int id, String firstname, String lastname, String login, String password, int user_type, int ison)
{
this.id = id;
this.firstname = firstname;
this.lastname = lastname;
this.login = login;
this.password = password;
this.user_type = user_type;
this.ison = ison;
this.vehValue =null;
}
public User(int id, String firstname, String lastname, String login, String password, int user_type, int ison,Vehicle _vehValue)
{
this.id = id;
this.firstname = firstname;
this.lastname = lastname;
this.login = login;
this.password = password;
this.user_type = user_type;
this.ison = ison;
vehValue =_vehValue;
}
public String toString()
{
return "id: " + id + " | login: " + login + " | password: " + password + " | user_type: " + user_type;
}
}

View File

@ -0,0 +1,46 @@
package com.safemobile.lib;
import java.util.ArrayList;
import com.safemobile.lib.Vehicle;
public class VehMSG extends TCPmsg{
public ArrayList<Vehicle> vehList;
public VehMSG(TCPmsg m) {
super(m);
vehList = new ArrayList<Vehicle>();
String date4parsing = super.data;
SM.Debug("date4parsing:"+date4parsing);
String[] tempArr = date4parsing.split(";");
SM.Debug("tempArr.length:" +tempArr.length);
for(int i =0; i<tempArr.length;i++)
{
//SM.Debug("i:" + i+"Data :"+tempArr[i]);
String[] tempVeh = tempArr[i].split("&");
//SM.Debug("split len:"+tempVeh.length);
if(tempVeh.length<7)
continue;
int sc_id = Integer.parseInt(tempVeh[0]);
String imei = tempVeh[1];
//String serialNumber = tempVeh[2];
String name = tempVeh[3];
//String groupName = tempVeh[4];
int lp = Integer.parseInt(tempVeh[5]);
//String userName = tempVeh[6];
boolean status = (Integer.parseInt(tempVeh[7])==1);
Vehicle veh = new Vehicle(sc_id, imei, lp, name, lp, 0, 0, 0);
veh.status = status;
vehList.add(veh);
//SM.Debug("added veh to list:" +name);
//SM.Debug("vehList new size:" +this.vehList.size());
}
SM.Debug("vehList vehList:" +this.vehList.size());
}
}

View File

@ -0,0 +1,162 @@
package com.safemobile.lib;
public class Vehicle {
public long id;
public long sc_id;
public long lp;
public String name;
public long driver_id;
public int time_route = 0;
public int GPS_reporting_interval = 50;
public int is_stolen = 0;
public String imei;
public boolean checked = false, status = true;
public Vehicle()
{
this.sc_id = -1;
this.lp = -1;
}
public Vehicle(long sc_id, String imei, long lp, String name, long driver_id, int time_route, int GPS_reporting_interval, int is_stolen)
{
this.sc_id = sc_id;
this.imei = imei;
this.lp = lp;
this.name = name;
this.driver_id = driver_id;
this.time_route = time_route;
this.GPS_reporting_interval = GPS_reporting_interval;
this.is_stolen = is_stolen;
}
public String toString()
{
return "sc_id: " + sc_id + "imei: " + imei + "name: " + name + " | driver_id: " + driver_id + " | GPS: " + GPS_reporting_interval + " | checked: " + checked + " | status: " + (status ? "ON" : "OFF");
}
public int getSmallIcon()
{
return getSmallIconPRV(driver_id);
}
private int getSmallIconPRV(long driver_id)
{
switch ((int)driver_id)
{
case 1: return R.drawable.peopleblue;
case 2: return R.drawable.peoplegreen;
case 3: return R.drawable.peoplegrey;
case 4: return R.drawable.peoplepink;
case 5: return R.drawable.peoplepurple;
case 78: return R.drawable.ambulance;
case 79: return R.drawable.army;
case 80: return R.drawable.bigcar0;
case 81: return R.drawable.bigcar1;
case 82: return R.drawable.bigcar2;
case 83: return R.drawable.bus;
case 84: return R.drawable.bus0;
case 85: return R.drawable.bus2;
case 86: return R.drawable.cabrioletred;
case 87: return R.drawable.car0;
case 88: return R.drawable.car1;
case 89: return R.drawable.car2;
case 90: return R.drawable.car3;
case 91: return R.drawable.cargrey;
case 92: return R.drawable.classiccar;
case 93: return R.drawable.classycar;
case 94: return R.drawable.dodge;
case 95: return R.drawable.fireescape;
case 96: return R.drawable.firefighters2;
case 97: return R.drawable.firetruck1;
case 98: return R.drawable.firetruck2;
case 99: return R.drawable.jeep;
case 100: return R.drawable.longhaul;
case 101: return R.drawable.lorrygreen;
case 102: return R.drawable.minibus;
case 103: return R.drawable.minicar;
case 104: return R.drawable.minicar2;
case 105: return R.drawable.police;
case 106: return R.drawable.police1;
case 107: return R.drawable.schoolbus;
case 108: return R.drawable.schoolbus2;
case 109: return R.drawable.taxi;
case 110: return R.drawable.towtruckyellow;
case 111: return R.drawable.tractorunitblack;
case 112: return R.drawable.truck0;
case 113: return R.drawable.truck1;
case 114: return R.drawable.truck2;
case 115: return R.drawable.truck3;
case 116: return R.drawable.truck4;
case 117: return R.drawable.truck5;
case 118: return R.drawable.truck6;
case 119: return R.drawable.truckyellow;
case 120: return R.drawable.wagon;
default: return R.drawable.peopleblue;
}
}
public int getLargeIcon()
{
return getLargeIconPRV(driver_id);
}
private int getLargeIconPRV(long driver_id)
{
switch((int)driver_id)
{
case 1: return R.drawable.peopleblue_large;
case 2: return R.drawable.peoplegreen_large;
case 3: return R.drawable.peoplegrey_large;
case 4: return R.drawable.peoplepink_large;
case 5: return R.drawable.peoplepurple_large;
case 78: return R.drawable.ambulance_large;
case 79: return R.drawable.army_large;
case 80: return R.drawable.bigcar0_large;
case 81: return R.drawable.bigcar1_large;
case 82: return R.drawable.bigcar2_large;
case 83: return R.drawable.bus_large;
case 84: return R.drawable.bus0_large;
case 85: return R.drawable.bus2_large;
case 86: return R.drawable.cabrioletred_large;
case 87: return R.drawable.car0_large;
case 88: return R.drawable.car1_large;
case 89: return R.drawable.car2_large;
case 90: return R.drawable.car3_large;
case 91: return R.drawable.cargrey_large;
case 92: return R.drawable.classiccar_large;
case 93: return R.drawable.classycar_large;
case 94: return R.drawable.dodge_large;
case 95: return R.drawable.fireescape_large;
case 96: return R.drawable.firefighters2_large;
case 97: return R.drawable.firetruck1_large;
case 98: return R.drawable.firetruck2_large;
case 99: return R.drawable.jeep_large;
case 100: return R.drawable.longhaul_large;
case 101: return R.drawable.lorrygreen_large;
case 102: return R.drawable.minibus_large;
case 103: return R.drawable.minicar_large;
case 104: return R.drawable.minicar2_large;
case 105: return R.drawable.police_large;
case 106: return R.drawable.police1_large;
case 107: return R.drawable.schoolbus_large;
case 108: return R.drawable.schoolbus2_large;
case 109: return R.drawable.taxi_large;
case 110: return R.drawable.towtruckyellow_large;
case 111: return R.drawable.tractorunitblack_large;
case 112: return R.drawable.truck0_large;
case 113: return R.drawable.truck1_large;
case 114: return R.drawable.truck2_large;
case 115: return R.drawable.truck3_large;
case 116: return R.drawable.truck4_large;
case 117: return R.drawable.truck5_large;
case 118: return R.drawable.truck6_large;
case 119: return R.drawable.truckyellow;
case 120: return R.drawable.wagon;
default: return R.drawable.peopleblue;
}
}
}

View File

@ -0,0 +1,333 @@
package com.safemobile.lib;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.ArrayList;
import org.xmlpull.v1.XmlPullParser;
import org.xmlpull.v1.XmlPullParserException;
import android.os.Environment;
import android.util.Xml;
import com.safemobile.lib.radio.Channel;
import com.safemobile.lib.radio.Zone;
public class XMLParser {
private ConfigFile config;
private ArrayList<String> xmlPath;
public XMLParser()
{
}
public ArrayList<String> getXMLPath()
{
// reset xmlPath
xmlPath = new ArrayList<String>();
File file[] = Environment.getExternalStorageDirectory().listFiles();
recursiveFileFind(file);
return xmlPath;
}
public ConfigFile parseXML(InputStream input)
{
XmlPullParser parser = Xml.newPullParser();
ArrayList<Contact> contacts = new ArrayList<Contact>();
ArrayList<Zone> zones = new ArrayList<Zone>();
Radio radio = new Radio();
try
{
parser.setInput(input, null);
Contact contact = null;
Zone zone = null;
Channel channel = null;
int eventType = parser.getEventType();
boolean done = false;
while (eventType != XmlPullParser.END_DOCUMENT && !done){
String name = null;
switch (eventType){
// build config object on xml start
case XmlPullParser.START_DOCUMENT:
config = new ConfigFile();
break;
// if start tag (ex. <configuration>, <contact>, <channel>)
case XmlPullParser.START_TAG:
name = parser.getName();
if (name.equalsIgnoreCase("contact"))
{
try {
String section = parser.getAttributeValue(3);
if(section.equalsIgnoreCase("Digital"))
{
/* <contact name='Call1' call-type='Group Call' call-id='1' section='Digital' /> */
contact = new Contact(0,"", 0,1,1);
// get id and name for Contact
contact.name = parser.getAttributeValue(0);
String type = parser.getAttributeValue(1);
if(type.equals("Private Call"))
contact.contactType = Contact.PRIVATE;
else if (type.equals("Group Call"))
contact.contactType = Contact.GROUP;
contact.id = Integer.parseInt(parser.getAttributeValue(2));
}
else
contact = null;
}
catch (Exception e) {
SM.Exception(e.toString());
contact.id = 0;
}
}
else if (name.equalsIgnoreCase("radio-id"))
{
/* <radio-id>101</radio-id> */
try {
// get radio id
radio.id = Integer.parseInt(parser.nextText());
}
catch(Exception ex) {
SM.Debug(ex.toString());
}
}
else if (name.equalsIgnoreCase("radio-ip"))
{
/* <radio-ip>192.168.10.1</radio-ip> */
// get radio ip
radio.ip = parser.nextText();
}
else if (name.equalsIgnoreCase("zone"))
{
/* <zone position='1' name='zone1'> */
zone = new Zone();
try {
// set zone Id, Number and Name
zone.dbID = Integer.valueOf(parser.getAttributeValue(0));
zone.id = Integer.valueOf(parser.getAttributeValue(0));
zone.ZoneName = parser.getAttributeValue(1);
}
catch(Exception ex) {
SM.Debug(ex.toString());
}
}
else if(name.equalsIgnoreCase("channel"))
{
/* <channel position='1' name='Channel1' /> */
channel = new Channel();
try {
// set channel Id, Number and Name
channel.chName = parser.getAttributeValue(1);
channel.dbID = Integer.valueOf(parser.getAttributeValue(0));
channel.id = Integer.valueOf(parser.getAttributeValue(0));
}
catch(Exception ex) {
SM.Debug(ex.toString());
}
}
break;
// if end tag (ex. </contacts>, </contact>, </channel>)
case XmlPullParser.END_TAG:
name = parser.getName();
if (name.equalsIgnoreCase("contact") && contact != null)
{
if(contact.contactType == Contact.PRIVATE || contact.contactType == Contact.GROUP)
contacts.add(contact); // add contact to Contacts list
}
else if (name.equalsIgnoreCase("channel"))
zone.channelList.add(channel); // add channel to Channels List
else if (name.equalsIgnoreCase("zone"))
zones.add(zone); // add zone to Zones List
else if (name.equalsIgnoreCase("configuration"))
done = true; // flag finish parsing
break;
}
eventType = parser.next();
}
// add Lists to config
config.contacts = contacts;
config.radio = radio;
// check if every zone has at least a channel and if not, create one
for(Zone zn :zones)
{
if(zn.channelList==null || (zn.channelList!=null && zn.channelList.size()== 0))
{
zn.channelList = new ArrayList<Channel>();
Channel ch = new Channel();
ch.dbID = 0;
ch.chName = "N/A";
ch.id = 0;
zn.channelList.add(ch);
}
}
config.zones = zones;
//SM.Debug("CONFIG", config.toLongString());
}
catch (XmlPullParserException e) {
//e.printStackTrace();
SM.Exception(e.toString());
config = null;
}
catch (IOException e) {
//e.printStackTrace();
SM.Exception(e.toString());
config = null;
}
return config;
}
// get files and directory for crt Directory (file1)
private void recursiveFileFind(File[] crtFile){
int i = 0;
String filePath="";
if(crtFile!=null)
{
while(i != crtFile.length)
{
// get absolute path for crtFile
filePath = crtFile[i].getPath();
if(crtFile[i].isDirectory()){
// if crt file is a Directory get files for new file
File file[] = crtFile[i].listFiles();
recursiveFileFind(file);
}
i++;
// if crtFile path extension is xml, add to ArrayList
if(filePath.substring(filePath.length()-4, filePath.length()).equalsIgnoreCase(".xml"))
{
xmlPath.add(filePath);
}
}
}
}
public boolean downloadXMLFile(String Path)
{
try {
//set the download URL, a url that points to a file on the internet
//this is the file to be downloaded
//Path = "http://www.safemobile.com/upload/codeplugs/037TMA2140.xml";
URL url = new URL(Path);
//create the new connection
HttpURLConnection urlConnection = (HttpURLConnection) url.openConnection();
//set up some things on the connection
urlConnection.setRequestMethod("GET");
urlConnection.setDoOutput(true);
//and connect!
urlConnection.connect();
//set the path where we want to save the file
//in this case, going to save it on the root directory of the
//sd card.
File SDCardRoot = Environment.getExternalStorageDirectory();
//create a new file, specifying the path, and the filename
//which we want to save the file as.
File file = new File(SDCardRoot,"radioConfigFile.xml");
//this will be used to write the downloaded data into the file we created
FileOutputStream fileOutput = new FileOutputStream(file);
//this will be used in reading the data from the internet
InputStream inputStream = urlConnection.getInputStream();
//this is the total size of the file
//int totalSize = urlConnection.getContentLength();
//variable to store total downloaded bytes
int downloadedSize = 0;
//create a buffer...
byte[] buffer = new byte[1024];
int bufferLength = 0; //used to store a temporary size of the buffer
//now, read through the input buffer and write the contents to the file
while ( (bufferLength = inputStream.read(buffer)) > 0 ) {
//add the data in the buffer to the file in the file output stream (the file on the sd card
fileOutput.write(buffer, 0, bufferLength);
//add up the size so we know how much is downloaded
downloadedSize += bufferLength;
}
//close the output stream when done
fileOutput.close();
SM.Debug(" ############## FINISH " + downloadedSize);
return true;
//catch some possible errors...
} catch (MalformedURLException e) {
e.printStackTrace();
SM.Exception(e.toString());
File SDCardRoot = Environment.getExternalStorageDirectory();
//delete file is failed to download
File file = new File(SDCardRoot,"radioConfigFile.xml");
Boolean result = file.delete();
SM.Debug("DELETE FILE: " + result);
return false;
} catch (IOException e) {
e.printStackTrace();
SM.Exception(e.toString());
File SDCardRoot = Environment.getExternalStorageDirectory();
//delete file is failed to download
File file = new File(SDCardRoot,"radioConfigFile.xml");
Boolean result = file.delete();
SM.Debug("DELETE FILE: " + result);
return false;
}
}
/*
private InputStream getTextFile(FileInputStream inputStream)
{
InputStream input = inputStream;
int read;
FileOutputStream fos = new FileOutputStream(new File(path + ".tmp"));
//DataOutputStream os = new DataOutputStream(new FileOutputStream("\\data\\data\\com.safemobile.radiopadd\\files\\"));
try {
input = new DataInputStream(new FileInputStream("c:\\binary.smc"));
while (true) { // exception deals catches EOF
read = input.r
fos.write(read);
//os.writeInt(is.readByte());
}
} catch (EOFException eof) {
System.out.println("Normal program termination.");
} catch (FileNotFoundException noFile) {
System.err.println("File not found! " + noFile);
} catch (IOException io) {
System.err.println("I/O error occurred: " + io);
} catch (Throwable anything) {
System.err.println("Abnormal exception caught !: " + anything);
} finally {
if (is != null) {
try {
is.close();
os.close();
} catch (IOException ignored) {
}
}
}
}
*/
}

View File

@ -0,0 +1,26 @@
package com.safemobile.lib.radio;
public class Channel {
public int dbID;
public int id;
public String chName;
public Channel()
{
}
public Channel(int dbId, int id, String chName) {
this.dbID = dbId;
this.id = id;
this.chName = chName;
}
public String toString()
{
return "dbID: " + dbID + " | id: " + id + " | chName: " + chName ;
}
}

View File

@ -0,0 +1,14 @@
package com.safemobile.lib.radio;
public class Emerg {
public int function = 0;
public int status = 0;
public Emerg(){
}
public String toString()
{
return "function: " + function + " | status: " + status ;
}
}

View File

@ -0,0 +1,58 @@
package com.safemobile.lib.radio;
import com.safemobile.lib.AppParams;
import com.safemobile.lib.Mic;
public class IncCall {
public int gwID;
public int rgwID;
public long Imei;
public int callStatus;
public int callType;
public int groupId;
public int userID;
public int opCode;
public Mic mic = null;
public long callerID = 0;
public long callDestID = 0;
public IncCall(){
}
public String toString()
{
return " Imei: " + Imei + " | opCode: " + opCode
+ " | callStatus: " + callStatus+ " | callType: " + callType
+ " | groupId: " + groupId + " | userID: " + userID;
}
public static String getCallTypeAsString(int type) {
switch (type) {
case AppParams.MotoAllCall: return "All Call";
case AppParams.MotoGroup: return "Group Call";
case AppParams.MotoPrivate: return "Private Call";
default: return "";
}
}
public static String getCallStatusAsString(int status) {
switch (status) {
case AppParams.InProgress: return "In Progress";
case AppParams.Initiated: return "Initiated";
case AppParams.Decoded: return "Decoded";
case AppParams.Hangtime: return "Hangtime";
case AppParams.Ended: return "Ended";
default: return "unknown";
}
}
public static String getCallInitiatorAsString(final long myID, int userID) {
if(userID == myID)
return "my Android";
else if (userID == 0)
return "Portable";
else
return "other Android";
}
}

View File

@ -0,0 +1,44 @@
package com.safemobile.lib.radio;
import java.util.ArrayList;
public class RadioGW {
public int ID;
public int GW_ID;
public String IP;
public String IMEI;
public ArrayList<Zone> zoneList;
public int lastZoneNr = 0;
public int lastChannelNr = 0;
public boolean isOnline = false;
public RadioGW(){zoneList = new ArrayList<Zone>();}
public String toString()
{
return "ID: " + ID + " | GW_ID: " + GW_ID + " | IP: " + IP
+ " | IMEI: " + IMEI ;
}
public String getChannelName() {
for(Zone zone: zoneList) {
if(zone.id == lastZoneNr) {
for(Channel ch: zone.channelList) {
if(ch.id == lastChannelNr)
return ch.chName;
}
}
}
return "";
}
public String getZoneName() {
for(Zone zone: zoneList) {
if(zone.id == lastZoneNr)
return zone.ZoneName;
}
return "";
}
}

View File

@ -0,0 +1,17 @@
package com.safemobile.lib.radio;
public class RadioStatus {
public int gwID = 0;
public int rgwID = 0;
public int status = 0;
public IncCall incCall = new IncCall();
public RadioStatus(){
}
public String toString()
{
return "gwID: " + gwID + " | rgwID: " + rgwID + " | status: " + status;
}
}

View File

@ -0,0 +1,14 @@
package com.safemobile.lib.radio;
public class SUstatus {
public int imei;
public int status;
public SUstatus(){
}
public String toString()
{
return "imei: " + imei + " | status: " + status ;
}
}

View File

@ -0,0 +1,51 @@
package com.safemobile.lib.radio;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
public class Zone {
public int dbID;
public int id;
public String ZoneName="";
public ArrayList<Channel> channelList = new ArrayList<Channel>();
public Zone()
{
channelList = new ArrayList<Channel>();
}
public String toString()
{
return "zoneDbID: " + id +" |zoneID: " + dbID + " | ZoneName: " + ZoneName ;
}
/**
* sort the list of channels based on their names
*/
public void sortChannelListByName() {
//Sorting
Collections.sort(channelList, new Comparator<Channel>() {
@Override
public int compare(Channel channel1, Channel channel2)
{
return channel1.chName.compareTo(channel2.chName);
}
});
}
/**
* sort the list of channels based on their ids
*/
public void sortChannelListByChannelID() {
//Sorting
Collections.sort(channelList, new Comparator<Channel>() {
@Override
public int compare(Channel channel1, Channel channel2)
{
return (channel1.id < channel2.id ? 1 : 0);
}
});
}
}

View File

@ -0,0 +1,46 @@
package com.safemobile.lib.radio;
public class ZoneChannel {
private Zone zone;
private Channel channel;
private boolean isSection = false;
public ZoneChannel(Zone zone) {
setZone(zone);
setSection(true);
}
public ZoneChannel(Zone zone, Channel channel) {
setZone(zone);
setChannel(channel);
if(channel != null)
setSection(false);
else
setSection(true);
}
public Zone getZone() {
return zone;
}
public void setZone(Zone zone) {
this.zone = zone;
}
public Channel getChannel() {
return channel;
}
public void setChannel(Channel channel) {
this.channel = channel;
}
public boolean isSection() {
return isSection;
}
public void setSection(boolean isSection) {
this.isSection = isSection;
}
}

View File

@ -0,0 +1,18 @@
package com.safemobile.lib.radio;
public class Zone_and_channel {
public int gwID = 0;
public int rgwID = 0;
public int zoneNr = 0;
public int channelNr = 0;
public Zone_and_channel(){
}
public String toString()
{
return "gwID: " + gwID + " | rgwID: " + rgwID + " | zoneNr: " + zoneNr
+ " | mechannelNrss: " + channelNr ;
}
}

View File

@ -0,0 +1,70 @@
package com.safemobile.libpad;
import java.io.Serializable;
import java.util.ArrayList;
import com.safemobile.lib.SM;
public class PadRecording implements Serializable {
private static final long serialVersionUID = 7819490854198306882L;
public int dbID = 0;
public int userID = 0;
public long radioID = 0;
public long initRadioID = 0;
public int callType = 0;
public boolean isOutgoing = false;
public long timeGMT = 0;
public int duration = 0;
public long bytes_length = 0;
public long bytes_received = 0;
public int result = 0;
public PadRecording() {
}
public PadRecording(int dbID, int userID, long radioID, boolean isOutgoing, long initRadioID, int callType, long timeGMT, int duration) {
this.dbID = dbID;
this.userID = userID;
this.radioID = radioID;
this.isOutgoing = isOutgoing;
this.initRadioID = initRadioID;
this.callType = callType;
this.timeGMT = timeGMT;
this.duration = duration;
}
public static ArrayList<PadRecording> parseTCPMsg(String msg) {
ArrayList<PadRecording> recordings = new ArrayList<PadRecording>();
try
{
msg = msg.replace("#", "");
// split payload to get contacts
// split contact by /
String[] contArr = msg.split("/");
PadRecording rec = new PadRecording();
rec.dbID = Integer.parseInt(contArr[0]);
rec.userID = Integer.parseInt(contArr[1]);
rec.radioID = Long.parseLong(contArr[2]);
rec.initRadioID = Long.parseLong(contArr[3]);
rec.callType = Integer.parseInt(contArr[4]);
rec.isOutgoing = (Integer.parseInt(contArr[5]) == 1 ? true: false);
rec.timeGMT = Long.parseLong(contArr[6]);
rec.duration = Integer.parseInt(contArr[7]);
recordings.add(rec);
}
catch(Exception ex)
{
SM.Exception("Exception parse Recording", ex.toString());
}
return recordings;
}
}

View File

@ -0,0 +1,70 @@
package com.safemobile.libpad;
import java.io.Serializable;
import java.util.ArrayList;
import com.safemobile.lib.SM;
public class PadTextMessage implements Serializable {
private static final long serialVersionUID = 1L;
public long dbID = 0;
public int userID = 0;
public long radioID = 0;
public String message = "";
public boolean isOutgoing = false;
public long timeGMT = 0;
public int status = 0;
public String seqID = "";
public Integer tmSeqID = 0;
public PadTextMessage() {
}
public PadTextMessage(long dbID, int usedID, long radioId, boolean isOutgoing, String msg, long timeGMT, int status, String seqID) {
this.dbID = dbID;
this.userID = usedID;
this.radioID = radioId;
this.isOutgoing = isOutgoing;
this.message = msg;
this.timeGMT = timeGMT;
this.status = status;
this.seqID = seqID;
}
public String toString() {
return dbID + "." + radioID + "[" + message + "]";
}
public static ArrayList<PadTextMessage> parseTCPMsg(String msg) {
ArrayList<PadTextMessage> messages = new ArrayList<PadTextMessage>();
try
{
msg = msg.replace("#", "");
// split payload to get contacts
// split contact by /
String[] contArr = msg.split("/");
PadTextMessage message = new PadTextMessage();
message.dbID = Integer.parseInt(contArr[0]);
message.userID = Integer.parseInt(contArr[1]);
message.radioID = Long.parseLong(contArr[2]);
message.message = contArr[3];
message.timeGMT = Long.parseLong(contArr[4]);
message.isOutgoing = (Integer.parseInt(contArr[5]) == 1 ? true: false);
message.status = Integer.parseInt(contArr[6]);
messages.add(message);
}
catch(Exception ex)
{
SM.Exception("Exception parse Message", ex.toString());
}
return messages;
}
}

View File

@ -0,0 +1,172 @@
package com.safemobile.maps;
import android.view.LayoutInflater;
import androidx.annotation.NonNull;
import com.google.android.gms.maps.GoogleMap;
import com.google.android.gms.maps.model.LatLng;
import com.google.android.gms.maps.model.Marker;
import com.safemobile.enums.MapType;
import com.safemobile.interfaces.IMap;
import com.safemobile.lib.Position;
import com.safenet.lib.Geofence;
import com.safenet.lib.Landmark;
import com.safenet.lib.Unit;
import java.util.ArrayList;
public class MapGoogle implements
IMap,
GoogleMap.OnCameraIdleListener,
GoogleMap.OnCameraMoveStartedListener,
GoogleMap.OnMarkerClickListener,
GoogleMap.OnInfoWindowClickListener,
GoogleMap.OnInfoWindowLongClickListener,
GoogleMap.OnInfoWindowCloseListener,
GoogleMap.OnCameraMoveListener {
@Override
public void onCameraIdle() {
}
@Override
public void onCameraMove() {
}
@Override
public void onCameraMoveStarted(int i) {
}
@Override
public void onInfoWindowClick(@NonNull Marker marker) {
}
@Override
public void onInfoWindowClose(@NonNull Marker marker) {
}
@Override
public void onInfoWindowLongClick(@NonNull Marker marker) {
}
@Override
public boolean onMarkerClick(@NonNull Marker marker) {
return false;
}
@Override
public void setMapInteractionListener(MapInteraction delegate) {
}
@Override
public void showContactsOnMap(ArrayList<Unit> units) {
}
@Override
public void updateMarkerPosition(Unit unit) {
}
@Override
public void setMapType(MapType mapType) {
}
@Override
public void setMapType(String mapType) {
}
@Override
public void centerZoomContact(Unit unit) {
}
@Override
public void centerZoomMapOnLocation(LatLng mapLocation) {
}
@Override
public void centerZoomMapOnLocation(LatLng mapLocation, float zoomLevel) {
}
@Override
public void showMyselfOnMap(Position position, boolean shouldOpenInfoBubble, boolean shouldCenterNow) {
}
@Override
public void hideMyselfFromMap() {
}
@Override
public void openInfoBubbleForMarker(Long markerKey) {
}
@Override
public void openInfoBubble() {
}
@Override
public void onShowLandmarksChangedHandler(boolean isShown, ArrayList<Landmark> landmarks) {
}
@Override
public void onShowGeofencesChangedHandler(boolean isShown, ArrayList<Geofence> geofences) {
}
@Override
public void onShowTrafficChangedHandler(boolean isShown) {
}
@Override
public void onMapReceived(Object map, LayoutInflater layoutInflater) {
}
@Override
public void onMapReceived(Object map, String tileServer) {
}
@Override
public void panZoomMap() {
}
@Override
public void onPause() {
}
@Override
public void onResume() {
}
@Override
public void refresh() {
}
@Override
public boolean isMapAvailable() {
return false;
}
}

View File

@ -0,0 +1,180 @@
package com.safemobile.services;
import java.text.SimpleDateFormat;
import java.util.Date;
import com.safemobile.interfaces.ITCPListener;
import com.safemobile.lib.AppParams;
import android.annotation.SuppressLint;
import android.app.Service;
import android.content.Intent;
import android.os.Binder;
import android.os.IBinder;
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 IBinder mBinder = new TCPBinder(); // interface for clients that bind
private boolean mAllowRebind = true; // indicates whether onRebind should be used
private TCPhandler tcp = null;
private TCPmsgParser tcpParser = null;
@Override
public void onCreate() {
// create a TCP connection and a TCP msg Parser
int port = 13589;
try {
port = Integer.parseInt(AppParams.PORT);
}
catch(Exception ex) { }
tcpParser = new TCPmsgParser();
if(tcp == null && !AppParams.IP.equalsIgnoreCase("n/a"))
{
tcp = new TCPhandler(getApplicationContext(), AppParams.IP, port);
}
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
// The service is starting, due to a call to startService()
return mStartMode;
}
@Override
public IBinder onBind(Intent intent) {
// A client is binding to the service with bindService()
return mBinder;
}
@Override
public boolean onUnbind(Intent intent) {
// All clients have unbound with unbindService()
return mAllowRebind;
}
@Override
public void onRebind(Intent intent) {
// A client is binding to the service with bindService(),
// after onUnbind() has already been called
}
@Override
public void onDestroy() {
// The service is no longer used and is being destroyed
Toast.makeText(this, "service done", Toast.LENGTH_SHORT).show();
}
/** get TCP Connection in order to send messages through TCP */
public TCPhandler getTCPConnection()
{
return tcp;
}
/** Add TCP Listener to TCPmsgParser */
public boolean addITCPListener(ITCPListener listener)
{
if(tcpParser != null)
tcpParser.addTCPListener(listener);
else
return false;
return true;
}
/** remove all TCP Listeners */
public boolean clearITCPListeners()
{
if(tcpParser != null)
tcpParser.clearITCPListeners();
else
return false;
return true;
}
/** get TCP msg Parser in order to add a new TCP Listener */
public TCPmsgParser getTCPmsgParser()
{
if(tcpParser == null)
tcpParser = new TCPmsgParser();
return tcpParser;
}
/** Stop TCP Connection */
public void stopTCPConnection()
{
if(tcp != null)
{
tcp.Stop();
tcp = null;
}
}
/** restart the TCP Connection after the connection parameters had been changed */
public void recreateTCPConnection()
{
/*
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)
{
// create a tcp connection
int port = 13589;
try {
port = Integer.parseInt(_port);
}
catch(Exception ex) { }
tcp = new TCPhandler(getApplicationContext(), _ip, port);
}
public void updateTCPparameters(String ip, String _port)
{
if(tcp!=null)
tcp.updateTCPparameters(ip, _port);
else
recreateTCPConnection();
}
/** recreate a TCPmsgParser */
public void recreateTCPmsgParser()
{
tcpParser = new TCPmsgParser();
}
@SuppressLint("SimpleDateFormat")
public String getCurrentTime() {
SimpleDateFormat dateformat =
new SimpleDateFormat("HH:mm:ss MM/dd/yyyy");
return (dateformat.format(new Date()));
}
/** get TCPService Binder */
public class TCPBinder extends Binder {
public TCPService getService() {
return TCPService.this;
}
}
}

View File

@ -0,0 +1,704 @@
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 com.safemobile.lib.AppParams;
import com.safemobile.lib.SM;
import com.safemobile.lib.TCPmsg;
public class TCPhandler implements Runnable
{
private boolean alive = true;
public String serverHostname = new String ("10.120.1.114");//
private int port = 13579;
private Thread listenThread;
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 Context context;
private boolean isWiFiOn = true;
public TCPhandler(Context context, String hostName, int p)
{
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);
}
@Override
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());
}
while(alive)
{
//SM.Debug("Waiting for data...");
try {
Thread.sleep(3000);
} catch (InterruptedException e) {
SM.Debug("TCPhandler Crash1 on sleep:"+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 ="";
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)
{
SM.Debug("TCP Client", "Connection closed by server!");
soc.close();
//previousConnectionWasUP = isConnectionUP;
isConnectionUP = false;
triggerTCPConnectionStateEvent();
soc = null;
break;
}
byte[] temp = new byte[n];
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 #
{
data = leftOver+data;
leftOver = "";
}
//search for overflow message
String[] tempArr = data.split("#");
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]);
} catch (Exception e) {
SM.Debug("TCP Client", "incorect msg len =" + tempArr[1]);
continue;
}
//messLen not int
if(messLen == -1)
{
//SM.Debug("messLen not int=" + messLen +" tempArr[1]:" +tempArr[1]);
continue;
}
char[] temMSG = data.toCharArray();
//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())
//if(messLen>n)
{
//SM.Debug("duda","messLen=" + messLen +" data.length():" +data.length()+"n:"+n);
leftOver = data; // Add by bigu
continue;
}
//perform cut
//SM.Debug("We got leftover ....message length("+messLen+") != actual length("+data.length()+")");
temMSG = data.substring(0,messLen).toCharArray();
//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#"))
prioritizePongReceived();
msgList.add(msg);
}
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.toString());
//previousConnectionWasUP = isConnectionUP;
}
//try to restart connection
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
*/
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)){
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
* @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(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;
//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;
byte[] mess = encryptTEA(cmdok);
output.write(mess);
output.flush();
// show only notACK messages
//if(mess[3] != 0x0C)
SM.Debug(" ", new String(mess));
return true;
}
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.toString());
}
return false;
}
public void setConnectionIsDown() {
if(input != null) {
try {
input.close();
} catch (IOException e) {
}
finally {
input = null;
}
}
isConnectionUP = false;
}
/* Encrypt a string using an encryption algorithm,
* 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
encryptedByteArray = toEncryptData.getBytes();
return encryptedByteArray;
}
/* Decrypt a string using an encryption algorithm,
* in this case TEA */
public static byte[] decryptTEA(byte[] toDecryptData) {
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)
{
// stop socket
try {
if(soc != null)
soc.close();
} catch (IOException e1) {
e1.printStackTrace();
}
serverHostname = ip;
try
{
port = Integer.parseInt(_port);
}
catch (Exception e) {
}
finally
{
port = 13589;
}
}
public void triggerTCPConnectionStateEvent() {
if(!isConnectionUP)
TCPmsgParser._fireTCPConnectionDownEvent(previousConnectionWasUP);
else
TCPmsgParser._fireTCPConnectionUpEvent(previousConnectionWasUP);
}
private void RestartTCP()
{
try
{
isConnectionUP = false;
previousConnectionWasUP = false;
SM.Debug("Restarting TCP...ip:"+serverHostname + ":" + port);
soc = new Socket();
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());
//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 (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 (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)
soc.close();
soc = null;
} catch (IOException e) {
e.printStackTrace();
}
}
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 //*/};
// stop thread
if(listenThread != null)
{
Thread moribund = listenThread;
listenThread = null;
moribund.interrupt();
}
if(input!=null)
{
try {
input.close();
input = null;
} catch (IOException e) {
e.printStackTrace();
}
}
if(output!=null)
{
try {
output.close();
output = null;
} catch (IOException e) {
e.printStackTrace();
}
}
if(soc !=null)
{
try {
soc.close();
soc = null;
}
catch (IOException e) {
SM.Exception("TCPClient[STOP]", "Stop break:"+e.toString());
}
}
}
}

View File

@ -0,0 +1,459 @@
package com.safemobile.services;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.NoSuchElementException;
import com.safemobile.interfaces.ITCPListener;
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 boolean run = true;
private TCPmsg _msg;
private static List<ITCPListener> _listeners = new ArrayList<ITCPListener>();
private Thread TCPmsgParserThread;
public TCPmsgParser()
{
TCPmsgParserThread = new Thread(this, "TCPmsgParserThread");
TCPmsgParserThread.start(); // (2) Start the thread.
}
public synchronized void addTCPListener( ITCPListener l ) {
_listeners.add( l );
}
public synchronized void removeTCPListener( ITCPListener l ) {
_listeners.remove( l );
}
public synchronized void clearITCPListeners() {
_listeners.clear();
}
public int getListenersSize()
{
return _listeners.size();
}
private synchronized void _fireLoginEvent() {
TCPEvent event = new TCPEvent( this, _msg );
Iterator<ITCPListener> listeners = _listeners.iterator();
while( listeners.hasNext() ) {
( (ITCPListener) listeners.next() ).onLoginReceived( event );
}
}
private synchronized void _fireGPSEvent() {
TCPEvent event = new TCPEvent( this, _msg );
Iterator<ITCPListener> listeners = _listeners.iterator();
while( listeners.hasNext() ) {
( (ITCPListener) listeners.next() ).onGPSReceived(event);
}
}
private synchronized void _fireSMSEvent() {
TCPEvent event = new TCPEvent( this, _msg );
Iterator<ITCPListener> listeners = _listeners.iterator();
while( listeners.hasNext() ) {
( (ITCPListener) listeners.next() ).onSMSReceived( event );
}
}
private synchronized void _fireLastSMSEvent() {
TCPEvent event = new TCPEvent( this, _msg );
Iterator<ITCPListener> listeners = _listeners.iterator();
while( listeners.hasNext() ) {
( (ITCPListener) listeners.next() ).onLastSMSsReceived(event);
}
}
private synchronized void _fireVehEvent() {
TCPEvent event = new TCPEvent( this, _msg );
Iterator<ITCPListener> listeners = _listeners.iterator();
while( listeners.hasNext() ) {
( (ITCPListener) listeners.next() ).onVehiclesReceived( event );
}
}
private synchronized void _fireNewSMS() {
TCPEvent event = new TCPEvent( this, _msg );
Iterator<ITCPListener> listeners = _listeners.iterator();
while( listeners.hasNext() ) {
( (ITCPListener) listeners.next() ).onNewSMSReceived(event);
}
}
private synchronized void _fireSMSconfirm() {
TCPEvent event = new TCPEvent( this, _msg );
Iterator<ITCPListener> listeners = _listeners.iterator();
while( listeners.hasNext() ) {
( (ITCPListener) listeners.next() ).onSMSAckReceived(event);
}
}
private synchronized void _fireLastPos() {
TCPEvent event = new TCPEvent( this, _msg );
Iterator<ITCPListener> listeners = _listeners.iterator();
while( listeners.hasNext() ) {
( (ITCPListener) listeners.next() ).onLastPositionsReceived(event);
}
}
private synchronized void _fireRadioEvent() {
TCPEvent event = new TCPEvent( this, _msg );
Iterator<ITCPListener> listeners = _listeners.iterator();
while( listeners.hasNext() ) {
( (ITCPListener) listeners.next() ).onRadioMsgReceived(event);
}
}
private synchronized void _fireHistPos() {
TCPEvent event = new TCPEvent( this, _msg );
Iterator<ITCPListener> listeners = _listeners.iterator();
while( listeners.hasNext() ) {
( (ITCPListener) listeners.next() ).onHistoryPositionsReceived(event);
}
}
private synchronized void _fireHistCount() {
TCPEvent event = new TCPEvent( this, _msg );
Iterator<ITCPListener> listeners = _listeners.iterator();
while( listeners.hasNext() ) {
( (ITCPListener) listeners.next() ).onHistoryPositionsCountReceived(event);
}
}
private synchronized void _fireAlarmList() {
TCPEvent event = new TCPEvent( this, _msg );
Iterator<ITCPListener> listeners = _listeners.iterator();
while( listeners.hasNext() ) {
( (ITCPListener) listeners.next() ).onAlarmsReceived(event);
}
}
private synchronized void _fireAlarmACK() {
TCPEvent event = new TCPEvent( this, _msg );
Iterator<ITCPListener> listeners = _listeners.iterator();
while( listeners.hasNext() ) {
( (ITCPListener) listeners.next() ).onAlarmAckReceived(event);
}
}
private synchronized void _fireAlarmLive() {
TCPEvent event = new TCPEvent( this, _msg );
Iterator<ITCPListener> listeners = _listeners.iterator();
while( listeners.hasNext() ) {
( (ITCPListener) listeners.next() ).alarmLiveRecv(event);
}
}
private synchronized void _fireRecordList() {
TCPEvent event = new TCPEvent( this, _msg );
Iterator<ITCPListener> listeners = _listeners.iterator();
while( listeners.hasNext() ) {
( (ITCPListener) listeners.next()).onRecordingsListReceived(event);
}
}
private synchronized void _fireRecordPlay() {
TCPEvent event = new TCPEvent( this, _msg );
Iterator<ITCPListener> listeners = _listeners.iterator();
while( listeners.hasNext() ) {
( (ITCPListener) listeners.next()).onRecordingPlayReceived(event);
}
}
private synchronized void _firePOLLEvent() {
TCPEvent event = new TCPEvent( this, _msg );
Iterator<ITCPListener> listeners = _listeners.iterator();
while( listeners.hasNext() ) {
( (ITCPListener) listeners.next()).onPollReceived(event);
}
}
private synchronized void _fireConnectionReplyEvent() {
TCPEvent event = new TCPEvent( this, _msg );
Iterator<ITCPListener> listeners = _listeners.iterator();
while( listeners.hasNext() ) {
( (ITCPListener) listeners.next()).onConnectionReplyReceived(event);
}
}
private synchronized void _fireContactsReceivedEvent() {
TCPEvent event = new TCPEvent( this, _msg );
Iterator<ITCPListener> listeners = _listeners.iterator();
while( listeners.hasNext() ) {
( (ITCPListener) listeners.next()).onContactsListReceived(event);
}
}
private synchronized void _fireRecordingsReceivedEvent() {
TCPEvent event = new TCPEvent( this, _msg );
Iterator<ITCPListener> listeners = _listeners.iterator();
while( listeners.hasNext() ) {
( (ITCPListener) listeners.next()).onRecordingsListReceived(event);
}
}
private synchronized void _fireTextMessagesReceivedEvent() {
TCPEvent event = new TCPEvent( this, _msg );
Iterator<ITCPListener> listeners = _listeners.iterator();
while( listeners.hasNext() ) {
( (ITCPListener) listeners.next()).onTextMessagesListReceived(event);
}
}
private synchronized void _fireRecordingPlayReceivedEvent() {
TCPEvent event = new TCPEvent( this, _msg );
Iterator<ITCPListener> listeners = _listeners.iterator();
while( listeners.hasNext() ) {
( (ITCPListener) listeners.next()).onRecordingPlayReceived(event);
}
}
public static synchronized void _fireTCPConnectionDownEvent(boolean previuosWasConnectionUp) {
Iterator<ITCPListener> listeners = _listeners.iterator();
while( listeners.hasNext() ) {
( (ITCPListener) listeners.next()).onTCPConnectionDown(previuosWasConnectionUp);
}
}
public static synchronized void _fireTCPConnectionUpEvent(boolean previuosWasConnectionUp) {
Iterator<ITCPListener> listeners = _listeners.iterator();
while( listeners.hasNext() ) {
( (ITCPListener) listeners.next()).onTCPConnectionUp(previuosWasConnectionUp);
}
}
public static synchronized void _fireonTCPConnectionStatusEvent(boolean isConnectionUp, boolean previuosWasConnectionUp) {
Iterator<ITCPListener> listeners = _listeners.iterator();
while( listeners.hasNext() ) {
( (ITCPListener) listeners.next()).onTCPConnectionStatusReceived(isConnectionUp, previuosWasConnectionUp);
}
}
public static synchronized void _firePONGReceivedEvent() {
Iterator<ITCPListener> listeners = _listeners.iterator();
while( listeners.hasNext() ) {
( (ITCPListener) listeners.next()).onPONGReceived();
}
}
@Override
public void run()
{
while(run)
{
//SM.Debug("TCPmsgParser waiting for data...");
sleep(1);
if(TCPhandler.msgList==null)
continue;
if(!TCPhandler.msgList.isEmpty())
{
try
{
_msg = TCPhandler.msgList.poll();
if(_msg == null)
continue;
if(_msg.OK == false)
continue;
//parse the rest of the message;
switch(_msg.opCode)
{
case 40:{
_fireLoginEvent();
break;
}
case 41:{
_fireVehEvent();
break;
}
case 42:{
_fireSMSEvent();
break;
}
case 43:{
_fireLastSMSEvent();
break;
}
case OperationCodes.TM_ACK:{
_fireSMSconfirm();
break;
}
case OperationCodes.TM_ACK_SD:{
_fireSMSconfirm();
break;
}
case OperationCodes.RECEIVED_TM:{
_fireNewSMS();
break;
}
case 45:{
_fireLastPos();
break;
}
case 131:{
_fireGPSEvent();
break;
}
case 231:{
_firePOLLEvent();
break;
}
case 50:{
_fireRadioEvent();
break;
}
case 46:{
_fireHistPos();
break;
}
case 86:{
_fireHistCount();
break;
}
case 47:{
_fireAlarmList();
break;
}
case 48:{
_fireAlarmACK();
break;
}
case 49:{
_fireRecordList();
break;
}
case 38:{
_fireRecordPlay();
break;
}
case 135:
case 136:
case 137:
case 138:
case 140:{
_fireAlarmLive();
break;
}
case OperationCodes.PONG: {
//_firePONGReceivedEvent();
break;
}
case OperationCodes.CONNECTION_REP: {
_fireConnectionReplyEvent();
break;
}
case OperationCodes.CONTACTS_REP: {
sleep(15);
_fireContactsReceivedEvent();
break;
}
case OperationCodes.TM_LIST_REP: {
_fireTextMessagesReceivedEvent();
break;
}
case OperationCodes.RECORDINGS_LIST_REP: {
_fireRecordingsReceivedEvent();
break;
}
case OperationCodes.RECORDING_REP: {
_fireRecordingPlayReceivedEvent();
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 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 e) {
}
}
public void clearMsgList()
{
TCPhandler.msgList.clear();
}
public void Stop()
{
run = false;
// stop thread
if(TCPmsgParserThread != null)
{
Thread moribund = TCPmsgParserThread;
TCPmsgParserThread = null;
moribund.interrupt();
}
SM.Debug("Stoping TCPmsgParser");
}
}

View File

@ -0,0 +1,280 @@
package com.safemobile.services;
import java.io.UnsupportedEncodingException;
public class TEA {
private final static long DELTA = 0x9E3779B9L;
private final static long STEPS = 32;
private final static long UNDELTA = 0xC6EF3720L;
private static final String password = "SafeMobileBridge";
private static String encoding = "UTF-8";
private static long[] encrypted;
private static long[] decrypted;
private static long[] key;
public TEA(String password, String encoding) throws UnsupportedEncodingException {
// convert key to long
key = convertByteArrayToLongArray(password.getBytes(encoding));
TEA.encoding = encoding;
}
public TEA(String password) throws UnsupportedEncodingException {
// convert key to long
key = convertByteArrayToLongArray(password.getBytes(encoding));
}
public static byte[] encrypt(String toEncrypt) throws UnsupportedEncodingException {
encrypted = new long[200];
key = convertByteArrayToLongArray(password.getBytes(encoding));
// convert String to long array
long[] values = convertByteArrayToLongArray(toEncrypt.getBytes(encoding));
encrypted = new long[values.length];
// encipher the long array
for(int i=0; i<values.length; i=i+2) {
//System.out.println("v[" + i + "]=" + values[i]);
//System.out.println("v[" + (i+1) + "]=" + values[i+1]);
// get the long values that will be enciphered
long[] v = new long[2];
long[] w = new long[2];
v[0] = values[i];
v[1] = values[i+1];
// ENCRYPT
encipher(v, w, key);
// save the encrypted values in the big string
encrypted[i] = w[0];
encrypted[i+1] = w[1];
//System.out.println("\nEncrypted: " + w[0] + " | " + w[1]);
}
return convertLongArrayToByteArray(encrypted, false);
}
/*
public static byte[] decrypt(long[] toDecrypt) {
// convert String to long array
long[] values = toDecrypt;
decrypted = new long[values.length];
for(int i=0; i<values.length; i=i+2) {
//System.out.println("v[" + i + "]=" + values[i]);
//System.out.println("v[" + (i+1) + "]=" + values[i+1]);
long[] v = new long[2];
long[] w = new long[2];
v[0] = values[i];
v[1] = values[i+1];
// ENCRYPT
decipher(v, w, key);
// save the encrypted values in the big string
decrypted[i] = w[0];
decrypted[i+1] = w[1];
//System.out.println("\nEncrypted: " + w[0] + " | " + w[1]);
}
return convertLongArrayToByteArray(decrypted);
}
*/
public static byte[] decrypt(byte[] toDecrypt) throws UnsupportedEncodingException {
// convert String containing encrypted data to long array
long[] values = convertByteArrayToLongArray(toDecrypt);
decrypted = new long[values.length];
key = convertByteArrayToLongArray(password.getBytes(encoding));
for(int i=0; i<values.length; i=i+2) {
//System.out.println("v[" + i + "]=" + values[i]);
//System.out.println("v[" + (i+1) + "]=" + values[i+1]);
long[] v = new long[2];
long[] w = new long[2];
v[0] = values[i];
v[1] = values[i+1];
// DECRYPT
decipher(v, w, key);
// save the encrypted values in the big string
decrypted[i] = w[0];
decrypted[i+1] = w[1];
//System.out.println("\nEncrypted: " + w[0] + " | " + w[1]);
}
return convertLongArrayToByteArray(decrypted, true);
}
private static void encipher(long v[], long w[], long k[])
{
long y=v[0],z=v[1],sum=0, a=k[0],b=k[1],c=k[2],d=k[3],n=STEPS;
//System.out.printf("\nv[0] = %d | v[1] = %d\n", y, z);
//System.out.printf("a=%d | b=%d | c=%d | d=%d\n", a,b,c,d);
while(n-- > 0)
{
/*
sum += DELTA;
y += ((z << 4)+a) ^ (z+sum) ^ ((z >> 5)+b);
z += ((y << 4)+c) ^ (y+sum) ^ ((y >> 5)+d);
*/
sum = (long)((int)(sum + DELTA) & 0xFFFFFFFFL);
/*
System.out.println("left: " + (ctu(z<<4) + a));
System.out.println("center: " + ctu(z + sum));
System.out.println("right: " + (ctu(z>>>5) + b));
*/
y = ctu(y + ((ctu(z<<4) + a) ^ (z + sum) ^ (ctu(z>>>5) + b)));
z = ctu(z + ((ctu(y<<4) + c) ^ (y + sum) ^ (ctu(y>>>5) + d)));
//System.out.println("Y = " + y + " | " + "Z = " + z) ;
}
w[0]=y; w[1]=z;
//System.out.println("Encrypted: " + y + " | " + z);
}
private static void decipher(long v[], long w[], long k[])
{
long y=v[0],z=v[1],sum=UNDELTA, a=k[0],b=k[1], c=k[2],d=k[3],n=STEPS;
/* sum = delta<<5, in general sum = delta * n */
while(n-->0)
{
z = ctu(z - ((ctu(y << 4)+c) ^ (y+sum) ^ (ctu(y >>> 5)+d)));
y = ctu(y - ((ctu(z << 4)+a) ^ (z+sum) ^ (ctu(z >>> 5)+b)));
//System.out.println("Y = " + y + " | " + "Z = " + z) ;
sum -= DELTA;
}
w[0]=y; w[1]=z;
//System.out.println("Y = " + y + " | " + "Z = " + z) ;
}
/*
private long convertToUnsigned(long value) {
return (((int) value) & 0xFFFFFFFFL);
}
*/
private static long ctu (long value) {
return (((int) value) & 0xFFFFFFFFL);
}
private static long[] convertByteArrayToLongArray(byte[] toConvert) {
// convert string in an array of bytes
byte[] by = toConvert;
// get the size of long array considering that a long has 4bytes
int size = (int) Math.ceil(by.length / 4);
// if the size of the array is an odd number I should increase it because
// encryption needs an array of two long values
if(size % 2 != 0)
size++;
long[] values = new long[size];
// convert every string value to a long one by shifting 4 chars
// a long is 4 bytes
for(int i=0; i<by.length; i=i+4) {
//
byte c4 = ((i+3 >= by.length ) ? 0 : (byte) by[i+3]);
byte c3 = ((i+2 >= by.length ) ? 0 : (byte) by[i+2] );
byte c2 = ((i+1 >= by.length ) ? 0 : (byte) by[i+1] );
byte c1 = ((i >= by.length ) ? 0 : (byte) by[i] );
//System.out.println("###" + c4 + " | " + c3 + " | " + c2 + " | " + c1);
values[i/4] = ctu(((c4 & 0x00FFL) << 24) + ((c3 & 0x00FFL) << 16) + ((c2 & 0x00FFL) << 8) + ((c1 & 0x00FFL)));
//System.out.println("##### " + (encrypted == null ? 0 : encrypted[i/4]) + " | " + values[i/4]);
}
return values;
}
private static byte[] convertLongArrayToByteArray(long[] array, boolean isDecrypt) {
//String myString = "";
byte[] byteArray = new byte[array.length * 4];
byte[] byteArrayReduced;
int sizeToReduce = 0;
// convert every bytes from a long into a char using masks
for(int i=0; i<array.length; i++) {
byte c1 = (byte) (array[i] & 0xFF);
byte c2 = (byte) ((array[i] & 0x0000FF00) >> 8);
byte c3 = (byte) ((array[i] & 0x00FF0000) >> 16);
byte c4 = (byte) ((array[i] & 0xFF000000) >> 24);
//System.out.println("###" + array[i] + " | c4: " + c4 + " | " + c3 + " | " + c2 + " | " + c1);
//*
// remove last bytes containing 0 because they are unwanted information
if(array.length > 1 && i==(array.length-1) && isDecrypt)
{
System.out.println("LAST Chunck of four");
if (c4 != 0)
byteArray[i*4+3] = c4;
else
sizeToReduce++;
if (c3 != 0)
byteArray[i*4+2] = c3;
else
sizeToReduce++;
if (c2 != 0)
byteArray[i*4+1] = c2;
else
sizeToReduce++;
if (c1 != 0)
byteArray[i*4] = c1;
else
sizeToReduce++;
}
// add value because it's not the last long value
else //*/
{
byteArray[i*4] = c1;
byteArray[i*4+1] = c2;
byteArray[i*4+2] = c3;
byteArray[i*4+3] = c4;
}
}
// remove the 0's from the string, they were added when converting long
//System.out.println("#### Syze to reduce : " + sizeToReduce);
byteArrayReduced = new byte[byteArray.length - sizeToReduce];
for(int i=0; i<(byteArray.length - sizeToReduce); i++)
byteArrayReduced[i] = byteArray[i];
/*
try {
myString = new String ( byteArray, encoding);
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}*/
//myString = new String(byteArray);
return byteArrayReduced;
}
}

View File

@ -0,0 +1,84 @@
package com.safemobile.uicomponents;
import java.util.Hashtable;
import com.safemobile.lib.R;
import android.content.Context;
import android.content.res.TypedArray;
import android.graphics.Typeface;
import android.util.AttributeSet;
import android.widget.TextView;
public class EnhancedTextView extends TextView {
private static final Hashtable<String, Typeface> cache = new Hashtable<String, Typeface>();
public EnhancedTextView(Context context) {
super(context);
}
public EnhancedTextView(Context context, AttributeSet attrs) {
super(context, attrs);
setCustomFont(context, attrs);
}
public EnhancedTextView(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
setCustomFont(context, attrs);
}
/**
* Set a custom TypeFace that is specified in the XML attrs of the object
* @param ctx The context of the application
* @param attrs The attributes which are passed from the XML
*/
private void setCustomFont(Context ctx, AttributeSet attrs) {
TypedArray a = ctx.obtainStyledAttributes(attrs, R.styleable.EnhancedTextView);
String customFont = a.getString(R.styleable.EnhancedTextView_setFont);
setCustomFont(ctx, customFont);
a.recycle();
}
/**
* Function to change the TypeFace/Font of a textView
* @param ctx The context of the application
* @param fontName The name of the TypeFace which needs to be set
* @return A boolean telling if the TypeFace was set, or false in case of error
*/
public boolean setCustomFont(Context ctx, String fontName) {
Typeface tf = getTypeFace(ctx, fontName);
if(tf == null)
return false;
setTypeface(tf);
return true;
}
/**
* In the Android versions previous than 4.0 there is a memory leak that won't free TypeFaces.
* In order to fix this issue, a HashMap (cache) of TypeFaces will be created that will fetch a TypeFace
* if it exists, or it will create it and then return it.
* @param c The context of the application
* @param fontName The name of the typeface which needs to be fetched
* @return The desired Typeface object, or null if the typeface wasn't in the cache and could not be created
*/
public static Typeface getTypeFace(Context c, String fontName){
synchronized(cache){
if (cache == null || fontName == null)
return null;
if(!cache.containsKey(fontName)){
try {
Typeface t = Typeface.createFromAsset(c.getAssets(), fontName);
cache.put(fontName, t);
}
catch(Exception ex) {
return null;
}
}
return cache.get(fontName);
}
}
}

View File

@ -0,0 +1,621 @@
package com.safemobile.uicomponents;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.ConcurrentModificationException;
import java.util.Iterator;
import com.safemobile.adapters.ContactsComboBoxAdapter;
import com.safemobile.adapters.ZoneChannelComboBoxAdapter;
import com.safemobile.lib.AppParams;
import com.safemobile.lib.Contact;
import com.safemobile.lib.R;
import com.safemobile.lib.SM;
import com.safemobile.lib.radio.Channel;
import com.safemobile.lib.radio.Zone;
import com.safemobile.lib.radio.ZoneChannel;
import android.app.AlertDialog;
import android.content.Context;
import android.content.DialogInterface;
import android.graphics.Typeface;
import android.text.Editable;
import android.text.InputFilter;
import android.text.InputType;
import android.util.AttributeSet;
import android.view.LayoutInflater;
import android.view.View;
import android.widget.ArrayAdapter;
import android.widget.EditText;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.RelativeLayout;
import android.widget.TextView;
import android.widget.Toast;
public class TitledComboBox<T> extends RelativeLayout {
private enum SortMode {NAME, CALL_TYPE};
public enum ComboType {CONTACT, ZONE, STRING};
private ComboType type = ComboType.CONTACT;
private Context context;
private ArrayList<T> listValues = new ArrayList<T>();
private Contact selectedContact = null;
private ZoneChannel selectedZoneChannel = null;
private ArrayList<Contact> contacts = new ArrayList<Contact>();
private ArrayList<ZoneChannel> zoneChannels = new ArrayList<ZoneChannel>();
//private DialDialog manualDialDialog;
/* UI Elements */
private AlertDialog alert;
private LinearLayout layoutCombo;
private TextView titleCombo;
private TextView textViewComboValue;
private ImageView imageViewCombo;
public TitledComboBox(Context context) {
super(context);
inflateUI(context);
}
public TitledComboBox(Context context, AttributeSet attrs) {
super(context, attrs);
inflateUI(context);
}
public TitledComboBox(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
inflateUI(context);
}
private void inflateUI(Context context) {
this.context = context;
LayoutInflater inflater = (LayoutInflater) context
.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
inflater.inflate(R.layout.titled_combobox, this);
layoutCombo = (LinearLayout) findViewById(R.id.layoutCombo);
if(layoutCombo != null)
layoutCombo.setOnClickListener(layoutComboClickListener);
titleCombo = (TextView) findViewById(R.id.titleCombo);
imageViewCombo = (ImageView) findViewById(R.id.imageViewCombo);
textViewComboValue = (TextView) findViewById(R.id.textViewComboValue);
if(textViewComboValue != null)
textViewComboValue.setTypeface(EnhancedTextView.getTypeFace(context, "tahoma.ttf"));
if(titleCombo != null) {
titleCombo.setTypeface(EnhancedTextView.getTypeFace(context, "tahoma.ttf"));
}
}
public void setComboBoxTitle(String title) {
titleCombo.setText(title);
}
public void setTitleFontFace(Typeface typeface) {
titleCombo.setTypeface(typeface);
}
public void setTitleFontSize(int size) {
titleCombo.setTextSize(size);
}
@Override
public void setEnabled(boolean enabled) {
layoutCombo.setEnabled(enabled);
}
public void setValues(ArrayList<T> values) {
if(values == null)
return;
// detect the type of contacts used in the generic
if(values.size() > 0) {
if(values.get(0) instanceof Contact)
type = ComboType.CONTACT;
else if (values.get(0) instanceof Zone)
type = ComboType.ZONE;
else if (values.get(0) instanceof String)
type = ComboType.STRING;
}
this.listValues = values;
// if size of new array is 0
if (values.size() == 0 && type == ComboType.CONTACT){
textViewComboValue.setText("N/A");
imageViewCombo.setImageResource(R.drawable.call_private_blue_small);
// add manual dial values and all call
contacts.add(new Contact(16774215, context.getString(R.string.AllCall), AppParams.MotoAllCall, 0, 0));
contacts.add(new Contact(0, context.getString(R.string.dialGroup), AppParams.MotoManualDial, 0, 0));
contacts.add(new Contact(0, context.getString(R.string.dialPrivate), AppParams.MotoManualDial, 0, 0));
}
else if (values.size() == 0 && type == ComboType.ZONE){
// do nothing
}
// check if current selected value still exists in the array list
else if (type == ComboType.CONTACT) {
try {
boolean hasManual = false, hasAllCall = false;
contacts = new ArrayList<Contact>();
Iterator<T> iterator = values.iterator();
while(iterator.hasNext()){
T c = iterator.next();
Contact contact = (Contact) c;
contacts.add(contact);
if(contact.contactType == AppParams.MotoAllCall)
hasAllCall = true;
if(contact.name.equals(context.getString(R.string.manualDial)))
hasManual = true;
}
// add manual dial if not present
if(!hasManual) {
contacts.add(new Contact(0, context.getString(R.string.dialGroup), AppParams.MotoManualDial, 0, 0));
contacts.add(new Contact(0, context.getString(R.string.dialPrivate), AppParams.MotoManualDial, 0, 0));
}
// add all call if not present
if(!hasAllCall)
contacts.add(new Contact(16774215, context.getString(R.string.AllCall), AppParams.MotoAllCall, 0, 0));
// sort contacts list based on it's type
sortContacts(SortMode.CALL_TYPE, true);
boolean found = false;
if(selectedContact!= null){
iterator = values.iterator();
while(iterator.hasNext()){
T c = iterator.next();
if(((Contact) c).equals(selectedContact)) {
found = true;
break;
}
}
}
if(found) {
textViewComboValue.setText(selectedContact.name);
imageViewCombo.setImageResource(getImageResourceFromGenericType(selectedContact));
_fireOnContactItemClick(selectedContact);
}
else {
selectedContact = contacts.get(0);
textViewComboValue.setText(contacts.get(0).name);
imageViewCombo.setImageResource(getImageResourceFromGenericType(contacts.get(0)));
_fireOnContactItemClick(contacts.get(0));
}
}
catch(ConcurrentModificationException ex) {
SM.Debug("TitledComboBox", "Concurrent Modification Exception for Contact");
}
}
else if (type == ComboType.ZONE) {
try {
zoneChannels = new ArrayList<ZoneChannel>();
Iterator<T> iterator = values.iterator();
while(iterator.hasNext()){
T c = iterator.next();
Zone z = (Zone) c;
// add section header to the list
zoneChannels.add(new ZoneChannel(z));
// add channelZone Cartesian product
for(Channel ch : z.channelList)
zoneChannels.add(new ZoneChannel(z, ch));
}
boolean found = false;
if(selectedZoneChannel!= null) {
iterator = values.iterator();
while(iterator.hasNext()){
T c = iterator.next();
Zone z = (Zone) c;
if(z.equals(selectedZoneChannel.getZone()) && z.channelList.contains(selectedZoneChannel.getChannel())) {
found = true;
break;
}
}
}
if(found) {
textViewComboValue.setText(selectedZoneChannel.getChannel().chName);
imageViewCombo.setImageResource(getImageResourceFromGenericType(selectedContact));
}
else {
for(ZoneChannel zc: zoneChannels)
{
if(!zc.isSection()) {
selectedZoneChannel = new ZoneChannel(zc.getZone(), zc.getChannel());
textViewComboValue.setText(zc.getChannel().chName);
imageViewCombo.setImageResource(R.drawable.channel_small);
break;
}
}
}
}
catch(ConcurrentModificationException ex) {
SM.Debug("TitledComboBox", "Concurrent Modification Exception for Zone");
}
}
}
private void sortContacts(SortMode sortCategory, final boolean isAsc){
final int orderCompensation = (isAsc ? 1 : -1);
if(sortCategory == SortMode.CALL_TYPE) {
Collections.sort(contacts, new Comparator<Contact>() {
@Override
public int compare(Contact contact1, Contact contact2)
{
if( contact1.contactType > contact2.contactType)
return orderCompensation * 1;
else if( contact1.contactType == contact2.contactType) {
return orderCompensation * (contact1.id < contact2.id ? -1 : 1);
//return orderCompensation * contact1.name.compareTo(contact2.name);
}
else
return orderCompensation * -1;
}
});
}
else if(sortCategory == SortMode.NAME)
Collections.sort(contacts, new Comparator<Contact>() {
@Override
public int compare(Contact contact1, Contact contact2)
{
return orderCompensation * contact1.name.compareTo(contact2.name);
}
});
}
/**
* Return a Image Resource (int value) depending on the value passed. The value can be a Contact,
* a Zone, or a String.
* Contact = the call type image: private, group, all, manual
* Zone = to be reedited
* @param value The contact for which I will get the image
* @return an integer which will correspond to a resource image
*/
private int getImageResourceFromGenericType(Object value)
{
if(value instanceof Contact) {
Contact ctc = (Contact) value;
switch(ctc.contactType) {
case AppParams.MotoManualDial: return R.drawable.dial;
case AppParams.MotoAllCall: return R.drawable.call_all_green_small;
case AppParams.MotoGroup: return R.drawable.call_group_green_small;
case AppParams.MotoPrivate: return R.drawable.call_private_green_small;
}
}
else if (value instanceof String)
return R.drawable.call_private_blue_small;
else if (value instanceof Zone)
return R.drawable.zone_small;
return R.drawable.call_private_blue_small;
}
/**
* Convert an Generic ArrayList into a String one. This is used to populate a simple ArrayAdapter
* with the names of contacts or zones
* @param list The generic list which will be converted
* @return a corresponding list of String objects (usually the names of the objects)
*/
private ArrayList<String> getStringListFromArray(ArrayList<T> list) {
ArrayList<String> result = new ArrayList<String>();
for(T ctc: list)
switch (type) {
case CONTACT: result.add(((Contact) ctc).name); break;
case ZONE: result.add(((Zone) ctc).ZoneName); break;
case STRING: result.add((String) ctc); break;
}
return result;
}
/**
* Display a manual dial which will wait for the user to insert a number
*/
private void showManualDial(final boolean isPrivate)
{
/*
// selected Manual Dial
manualDialDialog = new DialDialog(context);
manualDialDialog.dialog.setTitle(context.getString(R.string.manualDial));
manualDialDialog.dialog.setCancelable(true);
manualDialDialog.dialog.setCanceledOnTouchOutside(false);
manualDialDialog.dialog.setOnCancelListener(new OnCancelListener() {
@Override
public void onCancel(DialogInterface dialog) {
//SM.Debug("CLOSED DIALOG", "AM INCHIS " + dialDialog.getNumber());
if(manualDialDialog.getNumber()!=0)
{
int manualDialValue = manualDialDialog.getNumber();
AppParams.crtContact = new Contact(manualDialValue, textViewCallType.getText().toString(), Contact.GROUP, 0, 0);
}
}
});
manualDialDialog.dialog.show();*/
final EditText input = new EditText(context);
input.setSelectAllOnFocus(true);
input.setText("");
input.setInputType(InputType.TYPE_CLASS_NUMBER);
// set max number of values
InputFilter[] filterArray = new InputFilter[1];
filterArray[0] = new InputFilter.LengthFilter(8);
input.setFilters(filterArray);
new AlertDialog.Builder(context)
.setTitle(context.getString(isPrivate ? R.string.dialPrivate : R.string.dialGroup))
.setView(input)
.setPositiveButton(context.getString(R.string.ok), new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int whichButton) {
Editable value = input.getText();
long val = Long.parseLong(value.toString());
if(val > 16777215)
Toast.makeText(context, context.getString(R.string.radioIDValues), Toast.LENGTH_SHORT).show();
Contact manualContact = null;
// check if contact already exists
if( (manualContact = checkContactWithIDExists(val)) == null)
{
manualContact = new Contact(val, val+"", isPrivate ? AppParams.MotoPrivate : AppParams.MotoGroup, 0, 0);
contacts.add(0, manualContact);
}
textViewComboValue.setText(manualContact.name);
selectedContact = manualContact;
imageViewCombo.setImageResource(getImageResourceFromGenericType(selectedContact));
_fireOnContactItemClick(selectedContact);
}
}).setNegativeButton(context.getString(R.string.cancel), new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int whichButton) {
// close dialog
dialog.dismiss();
}
}).show();
}
private Contact checkContactWithIDExists(long val) {
for(Contact ctc: contacts)
if(ctc.id == val)
return ctc;
return null;
}
private OnClickListener layoutComboClickListener = new OnClickListener() {
@Override
public void onClick(View v) {
// close previous dialog if it was showind
if(alert != null && alert.isShowing())
alert.dismiss();
final ArrayList<String> stringList = getStringListFromArray(listValues);
//ImagedSpinnerAdapter<Contact> adapterImaged = new ImagedSpinnerAdapter<Contact>(context, android.R.layout.simple_list_item_1, AppParams.listContacts);
ArrayAdapter<String> adapter = new ArrayAdapter<String>(context, android.R.layout.simple_list_item_1, stringList);
ContactsComboBoxAdapter adapterImaged = null;
ZoneChannelComboBoxAdapter adapterZone = null;
if(type == ComboType.CONTACT) {
adapterImaged = new ContactsComboBoxAdapter(context, R.layout.spinner, contacts);
}
else if(type == ComboType.ZONE) {
adapterZone = new ZoneChannelComboBoxAdapter(context, R.layout.spinner, zoneChannels);
}
AlertDialog.Builder builder = new AlertDialog.Builder(context);
builder.setTitle(type == ComboType.CONTACT ? context.getString(R.string.selectContact) : context.getString(R.string.selChannel));
builder.setAdapter(type == ComboType.CONTACT ? adapterImaged : (type == ComboType.ZONE ? adapterZone : adapter) , new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
// update UI and fire event
if(type == ComboType.CONTACT && contacts.size() > which) {
if(contacts.get(which).contactType == AppParams.MotoManualDial ||
(contacts.get(which).name == context.getString(R.string.dialGroup) ||
contacts.get(which).name == context.getString(R.string.dialPrivate))) {
//show manual dialog
showManualDial(contacts.get(which).name == context.getString(R.string.dialGroup) ? false : true);
}
else {
textViewComboValue.setText(contacts.get(which).name);
selectedContact = contacts.get(which);
imageViewCombo.setImageResource(getImageResourceFromGenericType(selectedContact));
_fireOnContactItemClick(contacts.get(which));
}
}
else if (type == ComboType.ZONE && zoneChannels.size() > which) {
// if a header was selected i will do nothing
if(zoneChannels.get(which).getChannel() == null)
return;
/*
textViewComboValue.setText(zoneChannels.get(which).getChannel().chName);
selectedZoneChannel = zoneChannels.get(which);
imageViewCombo.setImageResource(R.drawable.channel_small);*/
_fireOnZoneItemClick(zoneChannels.get(which));
}
}
});
alert = builder.create();
alert.show();
}
};
/**
* Set the type of elements that will be used with this ComboBox and the elements
* which needs to be added to ComboBox if no element if added
* @param type The type of ComboBox, it can be Zone, Contact
*/
public void setType(ComboType type) {
this.type = type;
}
/**
* Get the selected Channel
* @return the channel object or null if no channel is selected
*/
public Channel getSelectedChannel() {
if(selectedZoneChannel == null)
return null;
return selectedZoneChannel.getChannel();
}
/**
* Get the selected Zone, it contains the list of channels
* @return the zone object or null if no zone is selected
*/
public Zone getSelectedZone() {
if(selectedZoneChannel == null)
return null;
return selectedZoneChannel.getZone();
}
/**
* Update the selected zone and channel as a result of a change directly on the radio stations
* @param zone The selected zone onto the station
* @param channel The selected channel onto the station
*/
public void setSelectedZoneAndChannel(Zone zone, Channel channel) {
selectedZoneChannel = new ZoneChannel(zone, channel);
textViewComboValue.setText(channel.chName);
imageViewCombo.setImageResource(R.drawable.channel_small);
}
/**
* Get the selected contact, this can be a manualdial generated one
* @return The contact which is selected, or null if no contact is selected
*/
public Contact getSelectedContact() {
return selectedContact;
}
/**
* Update the selected contact as a result of a call made from a portable device
* @param contact The contact which needs to be selected
*/
public void setSelectedContact(Contact contact) {
selectedContact = contact;
textViewComboValue.setText(selectedContact.name);
imageViewCombo.setImageResource(getImageResourceFromGenericType(selectedContact));
}
/**
* Update the selected contact as a result of a call made from a portable device
* @param id The contact id
* @param contactType The contact type, which can be private, group, allcall
*/
public void setSelectedContact(long id, int contactType) {
boolean wasFound = false;
for(Contact ctc: contacts) {
// if contact type is all call or I have found the contact that I was searching for
if((ctc.contactType == contactType && contactType == AppParams.MotoAllCall ) ||
(ctc.id == id && ctc.contactType == contactType)) {
selectedContact = ctc;
textViewComboValue.setText(selectedContact.name);
imageViewCombo.setImageResource(getImageResourceFromGenericType(selectedContact));
wasFound = true;
break;
}
}
// create contact if it wasn't found and update the UI
if(!wasFound) {
Contact manualContact = new Contact(id, id+"", contactType, (int)id, (int) id);
contacts.add(0, manualContact);
textViewComboValue.setText(manualContact.name);
selectedContact = manualContact;
imageViewCombo.setImageResource(getImageResourceFromGenericType(selectedContact));
}
}
/**
* Hide all dialogs which are displayed. Usefull in case a call is received and
* the dialog for contacts/zones is displayed
*/
public void hideVisibleDialogs() {
if(alert == null)
return;
if(alert.isShowing())
alert.dismiss();
}
/* SELECT ITEM EVENTS + LISTENERS */
private ArrayList<OnComboItemClickListener> _listeners = new ArrayList<OnComboItemClickListener>();
public synchronized void setOnComboItemClickListener( OnComboItemClickListener l ) {
_listeners.add( l );
}
/** this event will be fired when a contact will be selected in the spinner */
private synchronized void _fireOnContactItemClick(Contact selectedItem) {
Iterator<OnComboItemClickListener> listeners = _listeners.iterator();
while( listeners.hasNext() ) {
( (OnComboItemClickListener) listeners.next() ).setOnContactItemClickListener(selectedItem);
}
}
/** this event will be fired when a zone will be selected in the spinner */
private synchronized void _fireOnZoneItemClick(ZoneChannel selectedItem) {
Iterator<OnComboItemClickListener> listeners = _listeners.iterator();
while( listeners.hasNext() ) {
( (OnComboItemClickListener) listeners.next() ).setOnZoneItemClickListener(selectedItem);
}
}
public interface OnComboItemClickListener {
public void setOnContactItemClickListener(Contact selectedItem);
public void setOnZoneItemClickListener(ZoneChannel selectedItem);
}
}