Compare commits

...

22 Commits

Author SHA1 Message Date
8ab29576c5 make messages view match parent 2022-04-04 08:56:52 +03:00
d9a031a46d Merge pull request 'feature/notifications' (#18) from feature/notifications into develop
Reviewed-on: #18
2022-04-01 07:03:54 +00:00
ba0dc850f7 display notifications 2022-03-31 14:12:03 +03:00
b2fdb1c8d7 Merge pull request 'SD-203- added dialogs similar to SafeDispatch History to inform of 0 positions or >2000 positions' (#17) from features/SD-203-add-dialogs-for-history-tab into develop
Reviewed-on: #17
2022-03-31 05:13:10 +00:00
19f5fe01a3 SD-203- added dialogs similar to SafeDispatch History to inform of 0 positions or >2000 positions 2022-03-31 08:07:39 +03:00
7b45edb624 Merge pull request 'SD-216 - fix back button functionality for recordings and history tabs' (#16) from fix/SD-216-back-navigation-broken into develop
Reviewed-on: #16
2022-03-31 04:21:59 +00:00
3a0fe96708 SD-216 - fix back button functionality for recordings and history tabs 2022-03-31 07:19:40 +03:00
5cd598bec9 Merge pull request 'features/SD-211-recordings-tab' (#14) from features/SD-211-recordings-tab into develop
Reviewed-on: #14
2022-03-30 11:26:25 +00:00
79234c9830 Merge branch 'develop' into features/SD-211-recordings-tab 2022-03-30 14:22:20 +03:00
ca4255943a clean code 2022-03-30 12:52:38 +03:00
cbeb912820 Merge pull request 'allow server to reconnect on mobile data' (#15) from feature/allow_server_reconnection_on_mobile_data into develop
Reviewed-on: #15
2022-03-30 08:52:35 +00:00
f15688b9a1 allow server to reconnect on mobile data 2022-03-30 11:50:48 +03:00
3935b3ad0b SD-211 - fix file rename issue after merge 2022-03-30 11:19:33 +03:00
e59b522ccb Merge branch 'develop' into features/SD-211-recordings-tab
# Conflicts:
#	libSafeMobile/src/main/java/com/safemobile/services/TCPhandler.java
#	safeDispatch/src/main/res/layout/dialog_login.xml
2022-03-30 10:38:47 +03:00
3f96055a6e SD-211 - show all recordings and play them 2022-03-30 10:34:57 +03:00
94091a9a31 Merge pull request 'text color on radio' (#13) from feature/icon_and_background into develop
Reviewed-on: #13
2022-03-28 13:38:39 +00:00
d9d325b18b text color on radio 2022-03-28 16:34:53 +03:00
f4c6b8163d Merge pull request 'change text color + small changes' (#12) from feature/icon_and_background into develop
Reviewed-on: #12
2022-03-28 11:09:20 +00:00
17a7e1711e merge with develop 2022-03-28 14:06:36 +03:00
9b302d0461 change text color + small changes 2022-03-28 14:02:10 +03:00
8bb6f36e60 SD-211 - fix case when the app was sending request on the ui thread
-fix audio hadler
-small refactor
2022-03-25 17:28:53 +02:00
e80272e0a4 Merge pull request 'features/SD-188-Create_Permission_module_and_request_audio' (#11) from features/SD-188-Create_Permission_module_and_request_audio into develop
Reviewed-on: #11
Reviewed-by: Adriana <adriana.epure@safemobile.com>
2022-03-24 16:59:12 +00:00
41 changed files with 2206 additions and 2493 deletions

View File

@ -4,6 +4,7 @@
android:versionCode="1"
android:versionName="1.0" >
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"

View File

@ -1,18 +1,8 @@
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;
@ -20,41 +10,39 @@ 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)
{
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.Hashtable;
public class RecordingsGridViewAdapter extends BaseAdapter {
private final ArrayList<Recording> listRecordings;
private final ArrayList<Boolean> recordingExists;
private final ArrayList<Boolean> playingPositions;
private final Activity activity;
private final Hashtable<Integer, View> hash = new Hashtable<>();
public RecordingsGridViewAdapter(Activity activity, ArrayList<Recording> listRecordings, ArrayList<Boolean> recordingExists) {
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 = new ArrayList<>();
for (int i = 0; i < recordingExists.size(); i++) {
playingPositions.add(false);
listRecordings.get(i).date = listRecordings.get(i).startGMT;
listRecordings.get(i).duration = listRecordings.get(i).endGMT - listRecordings.get(i).startGMT;
listRecordings.get(i).duration = listRecordings.get(i).endGMT - listRecordings.get(i).startGMT;
}
}
@Override
public int getCount() {
return listRecordings.size();
@ -70,185 +58,184 @@ public class RecordingsGridViewAdapter extends BaseAdapter
return 0;
}
/** Define Row Template */
public static class ViewHolder
{
public LinearLayout layoutRecording;
public ImageView imageViewPlay, imageViewRecycle;
public TextView textViewSender, textViewDuration, textViewDate;
/**
* Define Row Template
*/
public static class ViewHolder {
private LinearLayout layoutRecording;
private ImageView imageViewPlay;
private ImageView imageViewRecycle;
private TextView textViewSender;
private TextView textViewDuration;
private TextView textViewDate;
public LinearLayout getLayoutRecording() {
return layoutRecording;
}
public void setLayoutRecording(LinearLayout layoutRecording) {
this.layoutRecording = layoutRecording;
}
public ImageView getImageViewPlay() {
return imageViewPlay;
}
public void setImageViewPlay(ImageView imageViewPlay) {
this.imageViewPlay = imageViewPlay;
}
public ImageView getImageViewRecycle() {
return imageViewRecycle;
}
public void setImageViewRecycle(ImageView imageViewRecycle) {
this.imageViewRecycle = imageViewRecycle;
}
public TextView getTextViewSender() {
return textViewSender;
}
public void setTextViewSender(TextView textViewSender) {
this.textViewSender = textViewSender;
}
public TextView getTextViewDuration() {
return textViewDuration;
}
public void setTextViewDuration(TextView textViewDuration) {
this.textViewDuration = textViewDuration;
}
public TextView getTextViewDate() {
return textViewDate;
}
public void setTextViewDate(TextView textViewDate) {
this.textViewDate = textViewDate;
}
}
@Override
public View getView(final int position, View convertView, ViewGroup parent) {
final ViewHolder view;
LayoutInflater inflator = activity.getLayoutInflater();
if(convertView==null)
{
LayoutInflater layoutInflater = 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 = layoutInflater.inflate(R.layout.row_recordings, null);
view.setLayoutRecording(convertView.findViewById(R.id.layoutRecording));
view.setImageViewPlay(convertView.findViewById(R.id.imageViewPlay));
view.setTextViewSender(convertView.findViewById(R.id.textViewSender));
view.setTextViewDuration(convertView.findViewById(R.id.textViewDuration));
view.setTextViewDate(convertView.findViewById(R.id.textViewDate));
view.setImageViewRecycle(convertView.findViewById(R.id.imageViewRecycle));
view.getImageViewRecycle().setVisibility(View.GONE);
convertView.setTag(view);
}
else
{
} 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 (Boolean.FALSE.equals(recordingExists.get(position)))
view.getLayoutRecording().setBackgroundColor(0xFFFFFFFF);
else {
/* if recording is not playing let background to white */
if(!playingPositions.get(position))
view.layoutRecording.setBackgroundColor(0xFFFFFFFF);
if (Boolean.FALSE.equals(playingPositions.get(position)))
view.getLayoutRecording().setBackgroundColor(0xFFFFFFFF);
else
view.layoutRecording.setBackgroundColor(0xFF457c98);
view.getLayoutRecording().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;
SM.Exception("REC TYPE : " + listRecordings.get(position).callType);
switch (listRecordings.get(position).callType) {
case 6:
view.getImageViewPlay().setImageResource(R.drawable.call_received_all);
break;
case 2:
view.getImageViewPlay().setImageResource(R.drawable.call_made_all);
break;
case 4:
view.getImageViewPlay().setImageResource(R.drawable.call_received);
break;
case 0:
view.getImageViewPlay().setImageResource(R.drawable.call_made);
break;
case 5:
view.getImageViewPlay().setImageResource(R.drawable.call_received_group);
break;
case 1:
view.getImageViewPlay().setImageResource(R.drawable.call_made_group);
break;
default:
view.getImageViewPlay().setImageResource(R.drawable.alert);
}
/*
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);
view.getImageViewRecycle().setOnClickListener(v -> {
// change the background for marked record
View view1 = hash.get(position);
ViewHolder viewHolder = null;
if (view1 != null) {
viewHolder = (ViewHolder) view1.getTag();
}
if (viewHolder != null) {
viewHolder.getLayoutRecording().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]");
view.getTextViewSender().setText(String.format("%s -> %s", getItem(position).userWhoCalled, getItem(position).userWhoWasCalled));
view.textViewDuration.setText(String.format("[%d sec]", getItem(position).duration));
/* Add call Date */
Date date = new Date();
date.setTime(listRecordings.get(position).date * 1000);
SimpleDateFormat sdf = new SimpleDateFormat("HH:mm:ss");
SimpleDateFormat simpleDateFormat = new SimpleDateFormat("HH:mm:ss");
Calendar calendar = Calendar.getInstance();
calendar.set(Calendar.HOUR_OF_DAY,0);
calendar.set(Calendar.HOUR_OF_DAY, 0);
calendar.set(Calendar.MINUTE, 0);
calendar.set(Calendar.SECOND, 0);
calendar.set(Calendar.MILLISECOND, 0);
if(date.after(calendar.getTime()))
sdf = new SimpleDateFormat("HH:mm:ss");
if (date.after(calendar.getTime()))
simpleDateFormat = 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));
simpleDateFormat = new SimpleDateFormat("MMM-dd HH:mm");
view.getTextViewDate().setText(simpleDateFormat.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 hash.get(position);
}
/** 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 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);
if (!playing)
viewHolder.getLayoutRecording().setBackgroundColor(0xFFFFFFFF);
else
viewHolder.layoutRecording.setBackgroundColor(0xFF457c98);
// update hash
hash.get(position).setTag(viewHolder);
viewHolder.getLayoutRecording().setBackgroundColor(0xFF457c98);
View view = hash.get(position);
// update hash
if (view != null)
view.setTag(viewHolder);
}
}
}

View File

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

View File

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

View File

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

View File

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

View File

@ -1,648 +1,412 @@
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;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.net.InetSocketAddress;
import java.net.Socket;
import java.net.UnknownHostException;
import java.util.LinkedList;
import java.util.NoSuchElementException;
import java.util.Timer;
import java.util.TimerTask;
public class TCPhandler implements Runnable
{
public class TCPhandler implements Runnable {
private boolean alive = true;
public String serverHostname = new String ("10.120.1.114");//
private int port = 13579;
public String serverHostname;
private int port;
private Thread listenThread;
private Socket soc =null;
//private BufferedReader recv;
//private PrintWriter writer;
private Socket soc = null;
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;
private final Context context;
private boolean isWiFiOn;
msgList = new LinkedList<TCPmsg>();
public TCPhandler(Context context, String hostName, int p) {
this.context = context;
serverHostname = hostName;
port = p;
msgList = new LinkedList<>();
SM.Debug("---TCPhandler constructor [" + hostName + "," + p + "] ---");
listenThread = new Thread(this, "TCPlisten");
listenThread = new Thread(this, "TCPlisten");
listenThread.start(); // (2) Start the thread.
// create timer to check socket status
timer = new Timer();
Timer 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();
@Override
public void run() {
try {
previousConnectionWasUP = isConnectionUP;
// try to send something
TCPmsgParser._fireonTCPConnectionStatusEvent(isConnectionUP, previousConnectionWasUP);
} catch (Exception e) {
SM.Exception("TIMERException", e.toString());
}
}
}, 0, 3000);
// get WiFi state
ConnectivityManager connManager = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo mWifi = connManager.getNetworkInfo(ConnectivityManager.TYPE_WIFI);
if(mWifi.isConnectedOrConnecting())
isWiFiOn = true;
// get WiFi state
isWiFiOn = isNetworkConnected();
IntentFilter intentFilter = new IntentFilter();
intentFilter.addAction(WifiManager.NETWORK_STATE_CHANGED_ACTION);
context.registerReceiver(mReceived, intentFilter);
}
private boolean isNetworkConnected() {
ConnectivityManager cm = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
return cm.getActiveNetworkInfo() != null && cm.getActiveNetworkInfo().isConnected();
}
@Override
public void run()
{
try
{
if(soc!=null)
soc.close();
soc = new Socket();
soc.connect(new InetSocketAddress(serverHostname, port), 5000);
//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());
public void run() {
try {
if (soc != null)
soc.close();
soc = new Socket();
soc.connect(new InetSocketAddress(serverHostname, port), 5000);
input = new DataInputStream(soc.getInputStream());
output = new DataOutputStream(soc.getOutputStream());
if (soc != null) {
isConnectionUP = true;
triggerTCPConnectionStateEvent();
}
while(alive)
{
//SM.Debug("Waiting for data...");
} catch (UnknownHostException e) {
SM.Debug("UnknownHostException", "TCPhandler break:"+ e);
} catch (IllegalArgumentException e) {
SM.Debug("IllegalArgumentException", "TCPhandler break:"+ e);
} catch (IOException e) {
SM.Debug("IOException", "TCPhandler break:"+ e);
}
while (alive) {
try {
Thread.sleep(3000);
} catch (InterruptedException e) {
SM.Debug("TCPhandler Crash1 on sleep:"+e.toString());
SM.Debug("TCPhandler Crash1 on sleep:"+ e);
}
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());
}
while (Boolean.TRUE.equals(isConnectionUP)) {
try {
Thread.sleep(100);
//process leftover
try {
boolean FinishLeftOver = true;
while (FinishLeftOver) {
String[] tempArr2 = leftOver.split("#");
if (tempArr2.length > 1) {
int messLen;
try {
messLen = Integer.parseInt(tempArr2[1]);
} catch (Exception e) {
SM.Debug("leftovers", "incorect msg len leftOver =" + tempArr2[1]);
messLen = -1;
}
if (messLen > leftOver.length()) {
FinishLeftOver = false;
break;
} else if (messLen == leftOver.length()) {
TCPmsg msg = new TCPmsg(leftOver.toCharArray());
SM.Debug("leftovers", "RX from leftOver:" + msg.allData);
if (msg.allData.contains("#92#"))
prioritizePongReceived();
msgList.add(msg);
leftOver = "";
FinishLeftOver = false;
break;
} else // we have more message in leftover
{
TCPmsg msg = new TCPmsg(leftOver.substring(0, messLen).toCharArray());
SM.Debug("leftovers", "RX from leftOver:" + msg.allData);
if (msg.allData.contains("#92#"))
prioritizePongReceived();
msgList.add(msg);
leftOver = leftOver.substring(messLen, leftOver.length());
}
} else FinishLeftOver = false;
}
} catch (Exception e) {
SM.Debug("leftovers", "Error on process leftover" + e.toString());
}
//end process leftover
String data ="";
n=0;
//char[] buf = new char[1024];
//n = recv.read(buf);
String data = "";
int n = 0;
byte[] buf = new byte[1024];
// read data into buffer
n = input.read(buf);
//connection closed by server
if(n==-1)
{
if (n == -1) {
SM.Debug("TCP Client", "Connection closed by server!");
soc.close();
//previousConnectionWasUP = isConnectionUP;
isConnectionUP = false;
triggerTCPConnectionStateEvent();
soc = null;
break;
}
byte[] temp = new byte[n];
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 (n >= 0) System.arraycopy(buf, 0, temp, 0, n);
// decryptData
temp = decryptTEA(temp);
data = new String(temp);
//if we have any leftovers from previous message add them
if(leftOver.length()>1) // avoid case with only one #
{
if(leftOver.length() > 1) { // avoid case with only one #
data = leftOver+data;
leftOver = "";
}
//search for overflow message
String[] tempArr = data.split("#");
if ((tempArr.length == 0) || (tempArr.length == 1))
{
if ((tempArr.length == 0) || (tempArr.length == 1)) {
SM.Debug("TCP Client", "incorect messagebuss message=" + data);
continue;
}
//get msg len
// for(int i=0;i<tempArr.length;i++)
// SM.Debug("I:"+i+" tempArr[i]:"+tempArr[i]);
int messLen;
try {
messLen = Integer.parseInt(tempArr[1]);
messLen = Integer.parseInt(tempArr[1]);
} catch (Exception e) {
SM.Debug("TCP Client", "incorect msg len =" + tempArr[1]);
continue;
}
//messLen not int
if(messLen == -1)
{
//SM.Debug("messLen not int=" + messLen +" tempArr[1]:" +tempArr[1]);
if (messLen == -1) {
continue;
}
char[] temMSG = data.toCharArray();
//SM.Debug("MessLen:"+messLen+" Data len:"+data.length()+"IF:"+(data.length() != messLen));
if (data.length() != messLen)
{
if (data.length() != messLen) {
//if expected string message is smaller then actual string then exit processing;
if(messLen>data.length())
//if(messLen>n)
{
//SM.Debug("duda","messLen=" + messLen +" data.length():" +data.length()+"n:"+n);
leftOver = data; // Add by bigu
continue;
if (messLen > data.length()) {
leftOver = data; // Add by bigu
continue;
}
//perform cut
//SM.Debug("We got leftover ....message length("+messLen+") != actual length("+data.length()+")");
//perform cut
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);
leftOver = data.substring(messLen);
}
//decode TCP msg
TCPmsg msg = new TCPmsg(temMSG);
SM.Debug("<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> RX <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>", msg.allData);
if(msg.allData.contains("#92#"))
if (msg.allData.contains("#92#"))
prioritizePongReceived();
msgList.add(msg);
}
catch(Exception ex)
{
SM.Debug("TCPHandler", "TCPhandler/run/break:"+ex.toString());
//previousConnectionWasUP = isConnectionUP;
} catch(Exception ex) {
SM.Debug("TCPHandler", "TCPhandler/run/break:"+ ex);
isConnectionUP = false;
triggerTCPConnectionStateEvent();
}
}//while(connOK)
}
//
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
SM.Debug("TCPhandler Crash2 on sleep:"+e.toString());
//previousConnectionWasUP = isConnectionUP;
SM.Debug("TCPhandler Crash2 on sleep:"+ e);
}
//try to restart connection
if(alive && isWiFiOn)
RestartTCP();
}//while(alive)
if (alive && isWiFiOn)
restartTCP();
}
SM.Debug("==================================");
SM.Debug("TCP listenThread stoped!! alive = false");
SM.Debug("==================================");
}
/**
* Create a bypass in order to trigger the ping received event
* Create a bypass in order to trigger the ping received event
*/
private void prioritizePongReceived() {
TCPmsgParser._firePONGReceivedEvent();
}
/* 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;
if (action.equals(WifiManager.NETWORK_STATE_CHANGED_ACTION)){
// close socket if the wifi is disconnecting or disconnected
isWiFiOn = isNetworkConnected();
if (!isWiFiOn)
closeSocket();
}
}
};
/** Send a message through the TCP Socket
/** Send a message through the TCP Socket
* @param seqID The messages's sequence ID (a number of order)
* @param msg The messages which will be sent
* @return True if the message was sent
*/
public boolean Write(String seqID, String msg)
{
try
{
/*
if(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)
{
public boolean Write(String seqID, String msg) {
try {
if (output != null) {
try {
Thread.sleep(10);
String cmdok = "#" + seqID + msg;
Integer tmp = cmdok.length() + 1;
//SM.Debug("tmp:"+tmp);
String cmdok = "#" + seqID + msg;
Integer tmp = cmdok.length() + 1;
tmp += Integer.toString(tmp).length();// tmp.ToString().Length;
if((tmp==10)||(tmp==100)||(tmp==1000)) tmp++;
tmp += Integer.toString(tmp).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)
Thread tcpThread = new Thread(() -> {
try {
output.write(mess);
output.flush();
} catch (Exception e) {
e.printStackTrace();
}
});
tcpThread.start();
SM.Debug(" ", new String(mess));
return true;
} catch (InterruptedException e) {
SM.Exception("TCPClient[Send]", e.toString());
Thread.currentThread().interrupt();
} catch (NoSuchElementException e) {
SM.Exception("TCPClient[Send]", e.toString());
}
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
{
} else {
return false;
}
}
catch (Exception e)
{
SM.Debug("TCPhandler Write Procedure:"+e.toString());
} catch (Exception e) {
SM.Debug("TCPhandler Write Procedure:" + e);
}
return false;
}
public void setConnectionIsDown() {
if(input != null) {
try {
input.close();
} catch (IOException e) {
}
finally {
input = null;
}
}
isConnectionUP = false;
}
/* Encrypt a string using an encryption algorithm,
/* Encrypt a string using an encryption algorithm,
* in this case TEA */
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;
return toEncryptData.getBytes();
}
/* Decrypt a string using an encryption algorithm,
/* Decrypt a string using an encryption algorithm,
* in this case TEA */
public static byte[] decryptTEA(byte[] toDecryptData) {
byte[] decryptedByteArray = 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());
//*/
byte[] decryptedByteArray;
// no decryption
decryptedByteArray = toDecryptData;
return decryptedByteArray;
}
public int getPort() {
return port;
}
public void updateTCPparameters(String ip, String _port)
{
public void updateTCPparameters(String ip, String _port) {
// stop socket
try {
if(soc != null)
if (soc != null)
soc.close();
} catch (IOException e1) {
e1.printStackTrace();
}
serverHostname = ip;
try
{
try {
port = Integer.parseInt(_port);
}
catch (Exception e) {
}
finally
{
} catch (Exception ignored) { }
finally {
port = 13589;
}
}
public void triggerTCPConnectionStateEvent() {
if(!isConnectionUP)
if (!isConnectionUP)
TCPmsgParser._fireTCPConnectionDownEvent(previousConnectionWasUP);
else
else
TCPmsgParser._fireTCPConnectionUpEvent(previousConnectionWasUP);
}
private void RestartTCP()
{
try
{
private void restartTCP() {
try {
isConnectionUP = false;
previousConnectionWasUP = false;
SM.Debug("Restarting TCP...ip:"+serverHostname + ":" + port);
SM.Debug("Restarting TCP...ip:" + serverHostname + ":" + port);
soc = new Socket();
soc.connect(new InetSocketAddress(serverHostname, port), 5000);
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;
if (soc != null) {
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());
} 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());
} 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;
}
catch (NullPointerException e)
{
SM.Exception("RestartTCP break:"+e.toString());
isConnectionUP = false;
}
triggerTCPConnectionStateEvent();
}
public boolean isAlive() {
return alive;
}
public void setAlive(boolean alive) {
this.alive = alive;
}
/** close Socket when unReachable */
public void closeSocket() {
try {
input = null;
output = null;
if(soc!=null)
if (soc != null)
soc.close();
soc = null;
} catch (IOException e) {
@ -650,27 +414,23 @@ public class TCPhandler implements Runnable
}
}
public void Stop()
{
public void Stop() {
SM.Debug("Stopping TCP", "TCP Connection is stopping on " + AppParams.IP + ":" + port);
alive = false;
if(mReceived!= null)
try{ context.unregisterReceiver(mReceived); } catch(Exception ex) {/* receiver not registered //*/};
if (mReceived!= null)
try {
context.unregisterReceiver(mReceived);
} catch(Exception ex) {/* receiver not registered //*/}
// stop thread
if(listenThread != null)
{
if (listenThread != null) {
Thread moribund = listenThread;
listenThread = null;
moribund.interrupt();
}
if(input!=null)
{
if (input != null) {
try {
input.close();
input = null;
@ -679,8 +439,7 @@ public class TCPhandler implements Runnable
}
}
if(output!=null)
{
if (output != null) {
try {
output.close();
output = null;
@ -689,16 +448,13 @@ public class TCPhandler implements Runnable
}
}
if(soc !=null)
{
if (soc !=null) {
try {
soc.close();
soc = null;
}
catch (IOException e) {
SM.Exception("TCPClient[STOP]", "Stop break:"+e.toString());
} catch (IOException e) {
SM.Exception("TCPClient[STOP]", "Stop break:"+ e);
}
}
}
}
}

View File

@ -1,7 +1,6 @@
package com.safemobile.services;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.NoSuchElementException;
@ -12,16 +11,14 @@ import com.safemobile.lib.SM;
import com.safemobile.lib.TCPmsg;
public class TCPmsgParser implements Runnable{
public class TCPmsgParser implements Runnable {
public boolean run = true;
private TCPmsg _msg;
private static List<ITCPListener> _listeners = new ArrayList<ITCPListener>();
private static final List<ITCPListener> _listeners = new ArrayList<>();
private Thread TCPmsgParserThread;
public TCPmsgParser()
{
public TCPmsgParser() {
TCPmsgParserThread = new Thread(this, "TCPmsgParserThread");
TCPmsgParserThread.start(); // (2) Start the thread.
}
@ -37,404 +34,349 @@ public class TCPmsgParser implements Runnable{
public synchronized void clearITCPListeners() {
_listeners.clear();
}
public int getListenersSize()
{
return _listeners.size();
}
private synchronized void _fireLoginEvent() {
TCPEvent event = new TCPEvent( this, _msg );
Iterator<ITCPListener> listeners = _listeners.iterator();
while( listeners.hasNext() ) {
( (ITCPListener) listeners.next() ).onLoginReceived( event );
for (ITCPListener listener : _listeners) {
listener.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);
for (ITCPListener listener : _listeners) {
listener.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 );
for (ITCPListener listener : _listeners) {
listener.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);
for (ITCPListener listener : _listeners) {
listener.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 );
for (ITCPListener listener : _listeners) {
listener.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);
for (ITCPListener listener : _listeners) {
listener.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);
for (ITCPListener listener : _listeners) {
listener.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);
for (ITCPListener listener : _listeners) {
listener.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);
for (ITCPListener listener : _listeners) {
listener.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);
for (ITCPListener listener : _listeners) {
listener.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);
for (ITCPListener listener : _listeners) {
listener.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);
for (ITCPListener listener : _listeners) {
listener.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);
for (ITCPListener listener : _listeners) {
listener.onAlarmAckReceived(event);
}
}
private synchronized void _fireAlarmLive() {
TCPEvent event = new TCPEvent( this, _msg );
Iterator<ITCPListener> listeners = _listeners.iterator();
while( listeners.hasNext() ) {
( (ITCPListener) listeners.next() ).alarmLiveReceived(event);
for (ITCPListener listener : _listeners) {
listener.alarmLiveReceived(event);
}
}
private synchronized void _fireRecordList() {
TCPEvent event = new TCPEvent( this, _msg );
Iterator<ITCPListener> listeners = _listeners.iterator();
while( listeners.hasNext() ) {
( (ITCPListener) listeners.next()).onRecordingsListReceived(event);
for (ITCPListener listener : _listeners) {
listener.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);
for (ITCPListener listener : _listeners) {
listener.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);
for (ITCPListener listener : _listeners) {
listener.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);
for (ITCPListener listener : _listeners) {
listener.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);
for (ITCPListener listener : _listeners) {
listener.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);
for (ITCPListener listener : _listeners) {
listener.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);
for (ITCPListener listener : _listeners) {
listener.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);
for (ITCPListener listener : _listeners) {
listener.onRecordingPlayReceived(event);
}
}
public static synchronized void _fireTCPConnectionDownEvent(boolean previuosWasConnectionUp) {
Iterator<ITCPListener> listeners = _listeners.iterator();
while( listeners.hasNext() ) {
( (ITCPListener) listeners.next()).onTCPConnectionDown(previuosWasConnectionUp);
for (ITCPListener listener : _listeners) {
listener.onTCPConnectionDown(previuosWasConnectionUp);
}
}
public static synchronized void _fireTCPConnectionUpEvent(boolean previuosWasConnectionUp) {
Iterator<ITCPListener> listeners = _listeners.iterator();
while( listeners.hasNext() ) {
( (ITCPListener) listeners.next()).onTCPConnectionUp(previuosWasConnectionUp);
for (ITCPListener listener : _listeners) {
listener.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);
for (ITCPListener listener : _listeners) {
listener.onTCPConnectionStatusReceived(isConnectionUp, previuosWasConnectionUp);
}
}
public static synchronized void _firePONGReceivedEvent() {
Iterator<ITCPListener> listeners = _listeners.iterator();
while( listeners.hasNext() ) {
( (ITCPListener) listeners.next()).onPONGReceived();
for (ITCPListener listener : _listeners) {
listener.onPONGReceived();
}
}
@Override
public void run()
{
while(run)
{
//SM.Debug("TCPmsgParser waiting for data...");
public void run() {
while(run) {
sleep(1);
if(TCPhandler.msgList==null)
if (TCPhandler.msgList == null)
continue;
if(!TCPhandler.msgList.isEmpty())
{
try
{
if(!TCPhandler.msgList.isEmpty()) {
try {
_msg = TCPhandler.msgList.poll();
if(_msg == null)
continue;
if(_msg.OK == false)
if(!_msg.OK)
continue;
//parse the rest of the message;
switch(_msg.opCode)
{
case 40:{
_fireLoginEvent();
break;
}
switch(_msg.opCode) {
case 40:{
_fireLoginEvent();
break;
}
case 41:{
_fireVehEvent();
break;
}
case 41:{
_fireVehEvent();
break;
}
case 42:{
_fireSMSEvent();
break;
}
case 42:{
_fireSMSEvent();
break;
}
case 43:{
_fireLastSMSEvent();
break;
}
case 43:{
_fireLastSMSEvent();
break;
}
case OperationCodes.TM_ACK:{
_fireSMSconfirm();
break;
}
case OperationCodes.TM_ACK_SD:{
_fireSMSconfirm();
break;
}
case OperationCodes.TM_ACK:
case OperationCodes.TM_ACK_SD: {
_fireSMSconfirm();
break;
}
case OperationCodes.RECEIVED_TM:{
_fireNewSMS();
break;
}
case OperationCodes.RECEIVED_TM:{
_fireNewSMS();
break;
}
case 45:{
_fireLastPos();
break;
}
case 45:{
_fireLastPos();
break;
}
case 131:{
_fireGPSEvent();
break;
}
case 131:{
_fireGPSEvent();
break;
}
case 231:{
_firePOLLEvent();
break;
}
case 231:{
_firePOLLEvent();
break;
}
case 50:{
_fireRadioEvent();
break;
}
case 50:{
_fireRadioEvent();
break;
}
case 46:{
_fireHistPos();
break;
}
case 46:{
_fireHistPos();
break;
}
case 86:{
_fireHistCount();
break;
}
case 86:{
_fireHistCount();
break;
}
case 47:{
_fireAlarmList();
break;
}
case 47:{
_fireAlarmList();
break;
}
case 48:{
_fireAlarmACK();
break;
}
case 48:{
_fireAlarmACK();
break;
}
case 49:{
_fireRecordList();
break;
}
case 49:{
_fireRecordList();
break;
}
case 38:{
_fireRecordPlay();
break;
}
case 38:{
_fireRecordPlay();
break;
}
case 135:
case 136:
case 137:
case 138:
case 140:{
_fireAlarmLive();
break;
}
case 135:
case 136:
case 137:
case 138:
case 140:{
_fireAlarmLive();
break;
}
case OperationCodes.PONG: {
//_firePONGReceivedEvent();
break;
}
case OperationCodes.PONG: {
//_firePONGReceivedEvent();
break;
}
case OperationCodes.CONNECTION_REP: {
_fireConnectionReplyEvent();
break;
}
case OperationCodes.CONNECTION_REP: {
_fireConnectionReplyEvent();
break;
}
case OperationCodes.CONTACTS_REP: {
sleep(15);
_fireContactsReceivedEvent();
break;
}
case OperationCodes.CONTACTS_REP: {
sleep(15);
_fireContactsReceivedEvent();
break;
}
case OperationCodes.TM_LIST_REP: {
_fireTextMessagesReceivedEvent();
break;
}
case OperationCodes.TM_LIST_REP: {
_fireTextMessagesReceivedEvent();
break;
}
case OperationCodes.RECORDINGS_LIST_REP: {
_fireRecordingsReceivedEvent();
break;
}
case OperationCodes.RECORDINGS_LIST_REP: {
_fireRecordingsReceivedEvent();
break;
}
case OperationCodes.RECORDING_REP: {
_fireRecordingPlayReceivedEvent();
break;
}
case OperationCodes.RECORDING_REP: {
_fireRecordingPlayReceivedEvent();
break;
}
default:
break;
}
}
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;
}
}*/
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");
}
}
}
}
SM.Debug("TCPmsgParser listen thread stoped.");
}
private void sleep(int miliseconds) {
try {
Thread.sleep(miliseconds);
} catch (InterruptedException e) {
}
} catch (InterruptedException ignored) { }
}
public void clearMsgList()
@ -442,17 +384,14 @@ public class TCPmsgParser implements Runnable{
TCPhandler.msgList.clear();
}
public void Stop()
{
public void Stop() {
run = false;
// stop thread
if(TCPmsgParserThread != null)
{
if(TCPmsgParserThread != null) {
Thread moribund = TCPmsgParserThread;
TCPmsgParserThread = null;
moribund.interrupt();
}
SM.Debug("Stoping TCPmsgParser");
}
}
}

View File

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

View File

@ -45,7 +45,6 @@
android:name="com.safemobile.safedispatch.SDMobileActivity"
android:configChanges="orientation"
android:exported="true"
android:label="@string/app_name_demo"
android:screenOrientation="landscape">
<intent-filter>
<action android:name="android.intent.action.MAIN" />

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@ -3,6 +3,7 @@ package com.safemobile.safedispatch;
import androidx.annotation.NonNull;
import androidx.appcompat.app.AppCompatActivity;
import android.app.AlertDialog;
import android.app.DatePickerDialog;
import android.app.Dialog;
import android.graphics.Color;
@ -124,6 +125,18 @@ public class HistoryActivity extends AppCompatActivity implements OnMapReadyCall
googleMap.moveCamera(CameraUpdateFactory.newLatLngZoom(latLng, 14));
}
@Override
public void onBackPressed() {
AlertDialog.Builder builder = new AlertDialog.Builder(this);
builder.setMessage(getString(R.string.exit))
.setCancelable(false)
.setNeutralButton(getString(R.string.logout), (dialog, id) -> parentTab.whenBackPressed(AppParams.ActivityResult.logout))
.setPositiveButton(getString(R.string.ext), (dialog, id) -> parentTab.whenBackPressed(AppParams.ActivityResult.exit))
.setNegativeButton(getString(R.string.cancel), (dialog, id) -> dialog.cancel());
AlertDialog alert = builder.create();
alert.show();
}
private void setDate() {
Calendar calendar = Calendar.getInstance();
endDate = calendar.getTime();

View File

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

View File

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

View File

@ -233,10 +233,10 @@ public class SDMobileActivity extends Activity {
etPassword.setText(AppParams.PASSWORD.equalsIgnoreCase("n/a") ? "" : AppParams.PASSWORD);
}
layoutTCP = (RelativeLayout) findViewById(R.id.layoutTCP);
layoutTCP = findViewById(R.id.layoutTCP);
llUsername = (LinearLayout) findViewById(R.id.llUsername);
llPassword = (LinearLayout) findViewById(R.id.llPassword);
llUsername = findViewById(R.id.llUsername);
llPassword = findViewById(R.id.llPassword);
// enable ui after the language is changed and tcp connection is on
if (tcp != null && tcp.isConnectionUP) {
@ -663,7 +663,7 @@ public class SDMobileActivity extends Activity {
// get default password
AppParams.PASSWORD = AppParams.prefs.getString(PASSWORD, "n/a");
// get default IP
AppParams.IP = AppParams.prefs.getString("ip", "192.168.2.100");
AppParams.IP = AppParams.prefs.getString("ip", "185.8.154.190");
// get Radio ID & IP
AppParams.RADIOID = AppParams.prefs.getInt("radioId", 100);
@ -737,10 +737,10 @@ public class SDMobileActivity extends Activity {
Dialog dialogInfo = new Dialog(context);
dialogInfo.requestWindowFeature(Window.FEATURE_NO_TITLE);
dialogInfo.setContentView(R.layout.dialog_login);
TextView textTitle = (TextView) dialogInfo.findViewById(R.id.textTitle);
TextView text = (TextView) dialogInfo.findViewById(R.id.text);
TextView text2 = (TextView) dialogInfo.findViewById(R.id.text2);
ImageView image = (ImageView) dialogInfo.findViewById(R.id.image);
TextView textTitle = dialogInfo.findViewById(R.id.textTitle);
TextView text = dialogInfo.findViewById(R.id.text);
TextView text2 = dialogInfo.findViewById(R.id.text2);
ImageView image = dialogInfo.findViewById(R.id.image);
textTitle.setText(getString(R.string.connectionError));
image.setImageResource(R.drawable.error);

View File

@ -14,13 +14,11 @@ import java.util.Timer;
import java.util.TimerTask;
import com.google.android.gms.tasks.Task;
import com.google.android.gms.tasks.TaskCompletionSource;
import com.safemobile.activities.AbstractEmptyActivity;
import com.safemobile.activities.AbstractLiveActivity;
import com.safemobile.activities.AbstractMessagesActivity;
import com.safemobile.activities.AbstractRadioActivity;
import com.safemobile.activities.AbstractSDParentActivity;
import com.safemobile.safedispatch.R;
import com.safemobile.enums.AuthorizationCode;
import com.safemobile.enums.AuthorizationStatus;
import com.safemobile.enums.ProviderSettingsStatus;
@ -49,6 +47,7 @@ import com.safemobile.lib.SMSmsg;
import com.safemobile.lib.SerializedObject;
import com.safemobile.lib.SuperVehicle;
import com.safemobile.lib.TCPmsg;
import com.safemobile.lib.User;
import com.safemobile.lib.VehMSG;
import com.safemobile.lib.Vehicle;
import com.safemobile.lib.radio.RadioGW;
@ -58,8 +57,9 @@ import com.safemobile.services.TCPService.TCPBinder;
import android.Manifest;
import android.annotation.SuppressLint;
import android.app.Activity;
import android.app.Dialog;
import android.app.Notification;
import android.app.NotificationChannel;
import android.app.NotificationManager;
import android.app.PendingIntent;
import android.content.BroadcastReceiver;
@ -74,6 +74,7 @@ import android.content.res.Configuration;
import android.content.res.Resources;
import android.net.Uri;
import android.os.AsyncTask;
import android.os.Build;
import android.os.Bundle;
import android.os.Handler;
import android.os.IBinder;
@ -94,6 +95,8 @@ import android.widget.Toast;
import android.widget.TabHost.TabSpec;
import androidx.annotation.NonNull;
import androidx.core.app.NotificationCompat;
import androidx.core.app.NotificationManagerCompat;
public class TabLayoutActivity extends AbstractSDParentActivity {
@ -404,7 +407,7 @@ public class TabLayoutActivity extends AbstractSDParentActivity {
}
}
SM.Debug("Logged user:" + AppParams.USERNAME + " | ID: " + AppParams.USERID);
SM.Debug("Logged user:" + AppParams.USERNAME + " | id: " + AppParams.USERID);
// do not dim the display
getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
@ -632,10 +635,10 @@ public class TabLayoutActivity extends AbstractSDParentActivity {
tabHost.setCurrentTabByTag(RECORDINGS);
AppParams.crtTab = AppParams.Tabs.recordings;
if (AppParams.DEMO && getRecordingsActivity() != null && getRecordingsActivity().allRecordings != null && getRecordingsActivity().allRecordings.isEmpty()) {
if (AppParams.DEMO && getRecordingsActivity() != null && getRecordingsActivity().getAllRecordings() != null && getRecordingsActivity().getAllRecordings().isEmpty()) {
ArrayList<Recording> listRecordings = new ArrayList<>();
Recording rec = new Recording();
rec.NameForDisplay = "Rob";
rec.userWhoWasCalled = "Rob";
rec.subID = 101;
rec.endGMT = (int) Calendar.getInstance().getTime().getTime();
rec.startGMT = rec.endGMT - 2;
@ -643,7 +646,7 @@ public class TabLayoutActivity extends AbstractSDParentActivity {
listRecordings.add(rec);
rec = new Recording();
rec.NameForDisplay = "Call1 [Rob]";
rec.userWhoWasCalled = "Call1 [Rob]";
rec.subID = 102;
rec.endGMT = (int) Calendar.getInstance().getTime().getTime();
rec.startGMT = rec.endGMT - 2;
@ -651,13 +654,13 @@ public class TabLayoutActivity extends AbstractSDParentActivity {
listRecordings.add(rec);
rec = new Recording();
rec.NameForDisplay = "Call2 [Rob]";
rec.userWhoWasCalled = "Call2 [Rob]";
rec.subID = 101;
rec.endGMT = (int) Calendar.getInstance().getTime().getTime();
rec.startGMT = rec.endGMT - 3;
listRecordings.add(rec);
rec.type = 103;
getRecordingsActivity().UpdateRecordings(listRecordings);
getRecordingsActivity().updateRecordings(listRecordings);
}
}
});
@ -1006,8 +1009,6 @@ public class TabLayoutActivity extends AbstractSDParentActivity {
moribund.interrupt();
}
this.unregisterReceiver(mReceiver);
// unbound from tcp service
if (isBound) {
getApplicationContext().unbindService(serviceConnection);
@ -1047,7 +1048,7 @@ public class TabLayoutActivity extends AbstractSDParentActivity {
if (getMessageActivity() != null)
getMessageActivity().onCreate(getMessageActivity().getSavedInstanceState());
if (getRecordingsActivity() != null)
getRecordingsActivity().onCreate(getRecordingsActivity().savedInstanceState);
getRecordingsActivity().onCreate(getRecordingsActivity().getSavedInstanceState());
if (getAlarmActivity() != null)
getAlarmActivity().onCreate(getAlarmActivity().getSavedInstanceState());
}
@ -1233,7 +1234,7 @@ public class TabLayoutActivity extends AbstractSDParentActivity {
getMessageActivity().updateSMS(sms.smsList);
}
} catch (Exception ex) {
SM.Debug("Error on smsReceived:" + ex.toString());
SM.Debug("Error on smsReceived:" + ex);
}
}
@ -1361,7 +1362,7 @@ public class TabLayoutActivity extends AbstractSDParentActivity {
SM.Debug("Got PlayRec :" + msg.allData);
if (NO_SOUND) {
SM.Debug("Recording Play file ID:" + msg.data);
SM.Debug("Recording Play file id:" + msg.data);
//list for SMS
if (AppParams.crtTab == AppParams.Tabs.recordings) {
@ -1370,7 +1371,7 @@ public class TabLayoutActivity extends AbstractSDParentActivity {
try {
long id = Long.parseLong(tmp);
if (getRecordingsActivity() != null)
getRecordingsActivity().PlayRecording(id);
getRecordingsActivity().playRecording(id);
} catch (Exception ex) {
SM.Exception(ex.toString());
}
@ -1398,7 +1399,7 @@ public class TabLayoutActivity extends AbstractSDParentActivity {
HistCountmsg histCountMsg = new HistCountmsg(msg);
SM.Debug("Message Count:" + histCountMsg.histcountValue.count);
if (histCountMsg.histcountValue.count >= 2000 && AppParams.crtTab == AppParams.Tabs.history) {
if (AppParams.crtTab != AppParams.Tabs.history) {
//list for live
SM.Debug("currentActivity instanceof HistoryActivity");
try {
@ -1409,6 +1410,44 @@ public class TabLayoutActivity extends AbstractSDParentActivity {
} catch (Exception ex) {
SM.Debug(HASH_ERROR_MESSAGE + ex);
}
return;
}
if (histCountMsg.histcountValue.count >= 2000) {
try {
if (getHistoryActivity() != null) {
getHistoryActivity().UpdateCancel();
getHistoryActivity().UpdateUnableDisp();
}
} catch (Exception ex) {
SM.Debug(HASH_ERROR_MESSAGE + ex);
}
runOnUiThread(new Runnable() {
public void run() {
DialogService dialogService = new DialogService();
dialogService.showError(getHistoryActivity(), getString(R.string.too_many_positions, String.valueOf(histCountMsg.histcountValue.count)));
}
});
return;
}
if (histCountMsg.histcountValue.count == 0) {
try {
if (getHistoryActivity() != null) {
getHistoryActivity().UpdateCancel();
getHistoryActivity().UpdateUnableDisp();
}
} catch (Exception ex) {
SM.Debug(HASH_ERROR_MESSAGE + ex);
}
runOnUiThread(new Runnable() {
public void run() {
DialogService dialogService = new DialogService();
dialogService.showError(getHistoryActivity(), getString(R.string.no_data_for_interval));
}
});
return;
}
}
@ -1426,7 +1465,7 @@ public class TabLayoutActivity extends AbstractSDParentActivity {
SM.Debug("tmpHist seqID:" + tmpHist.seqID);
int pos = Integer.parseInt(tmpHist.seqID.substring(0, tmpHist.seqID.indexOf('.')));
int all = Integer.parseInt(tmpHist.seqID.substring(tmpHist.seqID.indexOf('.') + 1, tmpHist.seqID.length()));
int all = Integer.parseInt(tmpHist.seqID.substring(tmpHist.seqID.indexOf('.') + 1));
if (all != 0) {
if (Boolean.TRUE.equals(getFirstHistoryData())) {
try {
@ -1578,7 +1617,7 @@ public class TabLayoutActivity extends AbstractSDParentActivity {
if (radioMSG.incCall.callStatus == 3) {
setInCall(false);
// update recordings list
if (AppParams.crtTab == AppParams.Tabs.recordings && getRecordingsActivity() != null && getRecordingsActivity().playingPosition < 0) {
if (AppParams.crtTab == AppParams.Tabs.recordings && getRecordingsActivity() != null && getRecordingsActivity().getPlayingPosition() < 0) {
// no recording is playing
getRecordings(getCrtRadio().GW_ID, getCrtRadio().ID);
}
@ -1612,13 +1651,13 @@ public class TabLayoutActivity extends AbstractSDParentActivity {
setAllRadios(radioMSG.RadioGWList);
if (getCrtRadio() == null) {
setCrtRadio(getAllRadios().get(0));
SM.Debug("radioMSG set 0 crtRadio GW_ID:" + getCrtRadio().GW_ID + " ID:" + getCrtRadio().ID + ")");
SM.Debug("radioMSG set 0 crtRadio GW_ID:" + getCrtRadio().GW_ID + " id:" + getCrtRadio().ID + ")");
notifyBroadcast(OperationCodes.RADIOID_CHANGED + "");
}
}
// save crt Radio ID and GW
// save crt Radio id and GW
if (radioMSG.zac != null) {
for (RadioGW radio : getAllRadios()) {
if (radio.GW_ID == radioMSG.zac.gwID && radio.ID == radioMSG.zac.rgwID)
@ -1668,13 +1707,11 @@ public class TabLayoutActivity extends AbstractSDParentActivity {
case 137:
setMess("zone " + tempArr[1]);
break;
case 138:
setMess("emergency");
break;
case 140:
setMess("telemetry " + tempArr[1]);
break;
default:
// 138
setMess("emergency");
}
myHandler.post(updateResultsAlarm);
@ -1719,19 +1756,76 @@ public class TabLayoutActivity extends AbstractSDParentActivity {
//list for SMS
if (AppParams.crtTab == AppParams.Tabs.recordings) {
for (Recording rec : recordMSG.recordList) {
// set the name to be displayed
if (rec.typeID == 1)
rec.NameForDisplay = AppParams.USERNAME;
else {
SuperVehicle superVehicle = getSuperVehHash().get((long) rec.subID);
if (superVehicle != null)
rec.NameForDisplay = superVehicle.name;
for (Recording rec : recordMSG.getRecordList()) {
SuperVehicle superVehicle = getSuperVehHash().get((long) rec.subID);
// set the name to be displayed
switch (rec.callType) {
case 0:
for (User u : AppParams.allUsers) {
if (u.id == rec.dispatcherId)
rec.userWhoCalled = u.login;
}
if (rec.userWhoCalled == null || rec.userWhoCalled.isEmpty())
rec.userWhoCalled = String.valueOf(rec.dispatcherId);
if (superVehicle != null)
rec.userWhoWasCalled = superVehicle.name;
else
rec.userWhoWasCalled = String.valueOf(rec.subID);
break;
case 4:
rec.userWhoWasCalled = AppParams.USERNAME;
if (superVehicle != null)
rec.userWhoCalled = superVehicle.name;
else
rec.userWhoCalled = String.valueOf(rec.subID);
break;
case 1:
for (User u : AppParams.allUsers) {
if (u.id == rec.dispatcherId)
rec.userWhoCalled = u.login;
}
if (rec.userWhoCalled == null || rec.userWhoCalled.isEmpty())
rec.userWhoCalled = String.valueOf(rec.dispatcherId);
if (rec.groupName == null || rec.groupName.isEmpty())
rec.userWhoWasCalled = String.valueOf(rec.groupCpsId);
else
rec.userWhoWasCalled = rec.groupName;
break;
case 5:
if (superVehicle != null)
rec.userWhoCalled = superVehicle.name;
else
rec.userWhoCalled = String.valueOf(rec.subID);
if (rec.groupName == null || rec.groupName.isEmpty())
rec.userWhoWasCalled = String.valueOf(rec.groupCpsId);
else
rec.userWhoWasCalled = rec.groupName;
break;
case 2:
for (User u : AppParams.allUsers) {
if (u.id == rec.dispatcherId)
rec.userWhoCalled = u.login;
}
if (rec.userWhoCalled == null || rec.userWhoCalled.isEmpty())
rec.userWhoCalled = String.valueOf(rec.dispatcherId);
rec.userWhoWasCalled = "All Call";
break;
case 6:
rec.userWhoWasCalled = "All Call";
if (superVehicle != null)
rec.userWhoCalled = superVehicle.name;
else
rec.userWhoCalled = String.valueOf(rec.subID);
break;
}
}
// save recordings to AppParams
AppParams.recordings = recordMSG.recordList;
AppParams.recordings = recordMSG.getRecordList();
// notify recordings were received
notifyBroadcast(OperationCodes.RECORDINGS_LIST_REP + "");
@ -1896,10 +1990,7 @@ public class TabLayoutActivity extends AbstractSDParentActivity {
public void createNotification(int icon) {
mNotificationManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
String tickerText = "SafeMobile Dispatch: New Message from " + getImei();
String contentTitle = "New Message from " + getImei();
String contentText = "\"" + getMess() + "\"";
String contentTitle, contentText;
Vehicle veh = getVehicle4Imei(getImei());
int iconValue = icon;
@ -1912,7 +2003,6 @@ public class TabLayoutActivity extends AbstractSDParentActivity {
case AppParams.pollNotif:
contentText = "\"" + getMess() + "\"";
contentTitle = "Poll Reply from " + (veh != null ? getVehicle4Imei(getImei()).name : getImei());
tickerText = "SafeMobile Dispatch: Poll Reply from " + (veh != null ? getVehicle4Imei(getImei()).name : getImei());
icon = R.drawable.poll;
break;
case AppParams.alertNotif:
@ -1921,34 +2011,53 @@ public class TabLayoutActivity extends AbstractSDParentActivity {
vehName = getString(R.string.from) + ": " + getVehicle4Imei(getImei()).name;
contentText = "\"" + getMess() + "\"";
contentTitle = getString(R.string.newAlarm) + vehName;
tickerText = "SafeMobile Dispatch: " + getString(R.string.newAlarm) + vehName;
icon = R.drawable.alert;
icon = R.drawable.arrow_down;
break;
default:
throw new IllegalStateException("Unexpected value: " + icon);
}
Notification notification = new Notification(icon, tickerText, System.currentTimeMillis());
// set intent to be opened on NotificationClick
/* Notification */
Intent notificationIntent = new Intent(this, NotificationActivity.class);
notificationIntent.putExtra("key", iconValue);
Intent intent = new Intent(this, NotificationActivity.class);
intent.putExtra("key", iconValue);
// cancel old notification
mNotificationManager.cancel(icon);
PendingIntent contentIntent = PendingIntent.getActivity(context, NOTIFICATION_ACTIVITY_RESULT, notificationIntent, PendingIntent.FLAG_CANCEL_CURRENT);
// flag that the notification will be closed when clicked
notification.flags |= Notification.FLAG_AUTO_CANCEL;
notification.number = 1; // the same notification will be shown;
notification.tickerText = tickerText; // notification text when arrives
notification.sound = Uri.parse("android.resource://" + getPackageName() + "/" + R.raw.new_sms);
// add notification to the manager
mNotificationManager.notify(icon, notification);
PendingIntent pendingIntent = PendingIntent.getActivity(context, NOTIFICATION_ACTIVITY_RESULT, intent, PendingIntent.FLAG_CANCEL_CURRENT);
createNotificationChannel(icon, contentTitle, contentText, pendingIntent);
}
private void createNotificationChannel(int icon, String title, String text, PendingIntent pendingIntent) {
// Create the NotificationChannel, but only on API 26+ because
// the NotificationChannel class is new and not in the support library
String notificationChannelID = String.valueOf(icon);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
CharSequence name = "Notification Channel";
int importance = NotificationManager.IMPORTANCE_HIGH;
NotificationChannel channel = new NotificationChannel(notificationChannelID, name, importance);
// Register the channel with the system; you can't change the importance
// or other notification behaviors after this
NotificationManager notificationManager = getSystemService(NotificationManager.class);
notificationManager.createNotificationChannel(channel);
}
NotificationCompat.Builder builder = new NotificationCompat.Builder(context, notificationChannelID)
.setSmallIcon(icon)
.setContentTitle(title)
.setContentText(text)
.setPriority(NotificationCompat.PRIORITY_DEFAULT)
.setAutoCancel(true)
.setContentIntent(pendingIntent);
Log.v("test111", "test");
NotificationManagerCompat managerCompat = NotificationManagerCompat.from(context);
managerCompat.notify(icon, builder.build());
}
// return vehicle according to imei
private Vehicle getVehicle4Imei(String imei) {
Vehicle veh = null;
@ -2092,7 +2201,7 @@ public class TabLayoutActivity extends AbstractSDParentActivity {
setVehicleStatus(Integer.parseInt(params[1]), Integer.parseInt(params[2]), Integer.parseInt(params[3]), Integer.parseInt(params[4]));
} catch (Exception ex) {
SM.Exception("Paramas -> setVehicleStatus", "EXCeption ex " + ex.toString());
SM.Exception("Paramas -> setVehicleStatus", "EXCeption ex " + ex);
}
break;
@ -2123,21 +2232,6 @@ public class TabLayoutActivity extends AbstractSDParentActivity {
new ConnectTask().execute(params);
}
public class ConnectParserTask extends AsyncTask<String, Void, TCPhandler> {
@Override
protected TCPhandler doInBackground(String... params) {
if (myService != null)
tcpParser = myService.getTCPmsgParser();
// add TCPParserListener
if (tcpParser != null) {
SM.Debug("## tcpParser != null ", "#### call tcpParserListener(");
tcpParserListener();
}
return null;
}
}
/* Display Toast messages*/
@Override
public void displayToast(final String msg) {
@ -2247,10 +2341,8 @@ public class TabLayoutActivity extends AbstractSDParentActivity {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
SM.Debug("onRequestPermissionsResult", "[requestCode] " + requestCode);
String permission = "";
switch (requestCode) {
case PermissionModule.RECORD_AUDIO_PERMISSION_REQUEST_CODE:
permission = Manifest.permission.RECORD_AUDIO;
break;
default:
throw new IllegalStateException("Unexpected value: " + requestCode);
@ -2301,10 +2393,9 @@ public class TabLayoutActivity extends AbstractSDParentActivity {
private void waitForUserInput(Boolean result) {
if (result) {
final int requestCode = 1202;
//navigate to application's settings
String action = ProviderSettingsHelper.getAction(ProviderSettingsStatus.APPLICATION_DETAILS);
if (action == null || action == "")
if (action == null || action.equals(""))
return;
boolean isActionApplicationDetailsSettings = action.equals(ProviderSettingsHelper.ACTION_APPLICATION_DETAILS_SETTINGS);
@ -2324,4 +2415,10 @@ public class TabLayoutActivity extends AbstractSDParentActivity {
this.startActivity(intent);
}
}
@Override
protected void onDestroy() {
super.onDestroy();
this.unregisterReceiver(mReceiver);
}
}

View File

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

View File

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

View File

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

View File

@ -166,7 +166,7 @@
<GridView
android:id="@+id/gridView1"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_height="match_parent"
android:background="#999999"
android:drawSelectorOnTop="false"
android:horizontalSpacing="0dp"

View File

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

View File

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

View File

@ -11,7 +11,7 @@
android:paddingTop="2dp"
android:text="TITLE"
android:textAppearance="?android:attr/textAppearanceLarge"
android:textColor="#FFFFFF"
android:textColor="@color/black"
/>
<LinearLayout
android:id="@+id/layout_horizontal"
@ -40,7 +40,6 @@
android:paddingTop="8dp"
android:text="Row1"
android:textAppearance="?android:attr/textAppearanceLarge"
android:textColor="#FFFFFF"
/>
<TextView android:id="@+id/text2"
android:layout_width="wrap_content"
@ -48,7 +47,6 @@
android:paddingTop="8dp"
android:textAppearance="?android:attr/textAppearanceMedium"
android:text="Row2"
android:textColor="#FFFFFF"
/>
</LinearLayout>
</LinearLayout>

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@ -7,356 +7,352 @@
style="?bg">
<LinearLayout
android:id="@+id/layoutGateway"
android:layout_height="wrap_content"
android:layout_width="fill_parent"
android:weightSum="100"
android:orientation="horizontal"
style="?header">
android:id="@+id/layoutGateway"
android:layout_height="wrap_content"
android:layout_width="fill_parent"
android:weightSum="100"
android:orientation="horizontal"
style="?header">
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="horizontal" >
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="horizontal" >
<ImageView
android:id="@+id/imageViewRadioStation"
android:layout_width="wrap_content"
android:layout_height="fill_parent"
android:src="@drawable/enable"
android:layout_weight="0" />
<ImageView
android:id="@+id/imageViewRadioStation"
android:layout_width="wrap_content"
android:layout_height="fill_parent"
android:src="@drawable/enable"
android:layout_weight="0" />
<TextView
android:layout_width="wrap_content"
android:layout_height="fill_parent"
android:gravity="center_vertical"
android:id="@+id/textViewGateway"
android:text="n/a"
android:layout_marginLeft="5dp"
android:textStyle="bold"
android:paddingTop="7dp"
android:textColor="#FFFFFF"
android:textAppearance="?android:attr/textAppearanceMedium"
android:layout_weight="1"/>
<TextView
android:layout_width="wrap_content"
android:layout_height="fill_parent"
android:gravity="center_vertical"
android:id="@+id/textViewGateway"
android:text="n/a"
android:layout_marginLeft="5dp"
android:textStyle="bold"
android:paddingTop="7dp"
android:textColor="#FFFFFF"
android:textAppearance="?android:attr/textAppearanceMedium"
android:layout_weight="1"/>
<TextView
android:layout_width="wrap_content"
android:layout_height="fill_parent"
android:gravity="center_vertical"
android:id="@+id/textViewIP"
android:text="[192.168.2.100]"
android:paddingLeft="4dp"
android:paddingTop="17dp"
android:textColor="#FFFFFF"
android:visibility="gone"
android:textAppearance="?android:attr/textAppearanceMedium"
android:layout_weight="1"/>
<TextView
android:layout_width="wrap_content"
android:layout_height="fill_parent"
android:gravity="center_vertical"
android:id="@+id/textViewIP"
android:text="[192.168.2.100]"
android:paddingLeft="4dp"
android:paddingTop="17dp"
android:textColor="#FFFFFF"
android:visibility="gone"
android:textAppearance="?android:attr/textAppearanceMedium"
android:layout_weight="1"/>
<ImageView
android:id="@+id/imageViewSeparator"
android:layout_width="wrap_content"
android:layout_height="fill_parent"
android:layout_gravity="center_vertical"
android:src="@drawable/separator_white"
android:layout_margin="2dp"
android:layout_weight="0"
android:visibility="invisible"
android:focusable="false" />
<ImageView
android:id="@+id/imageViewSeparator"
android:layout_width="wrap_content"
android:layout_height="fill_parent"
android:layout_gravity="center_vertical"
android:src="@drawable/separator_white"
android:layout_margin="2dp"
android:layout_weight="0"
android:visibility="invisible"
android:focusable="false" />
<ImageView
android:id="@+id/imageViewDown"
android:layout_width="20dp"
android:layout_height="fill_parent"
android:layout_gravity="center_vertical"
android:layout_marginBottom="2dp"
android:layout_marginTop="2dp"
android:focusable="false"
android:visibility="visible"
android:src="@drawable/arrow_menu_down" />
<ImageView
android:id="@+id/imageViewDown"
android:layout_width="20dp"
android:layout_height="fill_parent"
android:layout_gravity="center_vertical"
android:layout_marginBottom="2dp"
android:layout_marginTop="2dp"
android:focusable="false"
android:visibility="visible"
android:src="@drawable/arrow_menu_down" />
<ImageView
android:id="@+id/imageViewStatus"
android:layout_width="wrap_content"
android:layout_height="fill_parent"
android:gravity="center_vertical"
android:scaleType="fitCenter"
android:src="@drawable/status_offline" />
<ImageView
android:id="@+id/imageViewStatus"
android:layout_width="wrap_content"
android:layout_height="fill_parent"
android:gravity="center_vertical"
android:scaleType="fitCenter"
android:src="@drawable/status_offline" />
</LinearLayout>
</LinearLayout>
<LinearLayout
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:orientation="horizontal"
android:gravity="right"
android:layout_marginRight="8dp"
android:visibility="gone">
<LinearLayout
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:orientation="horizontal"
android:gravity="right"
android:layout_marginRight="8dp"
android:visibility="gone">
<ImageButton
android:id="@+id/imageButtonAdd"
android:layout_width="1dp"
android:layout_height="wrap_content"
android:layout_weight="0"
android:layout_marginRight="2dp"
android:paddingLeft="2dp"
android:background="@drawable/addmessage_selector"
android:visibility="invisible"/>
<ImageView
android:id="@+id/imageViewGreen"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:scaleType="fitCenter"
android:paddingTop="4dp"
android:src="@drawable/call_private_green_small"
android:layout_gravity="center_vertical" />
<ImageButton
android:id="@+id/imageButtonAdd"
android:layout_width="1dp"
android:layout_height="wrap_content"
android:layout_weight="0"
android:layout_marginRight="2dp"
android:paddingLeft="2dp"
android:background="@drawable/addmessage_selector"
android:visibility="invisible"/>
<ImageView
android:id="@+id/imageViewGreen"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:scaleType="fitCenter"
android:paddingTop="4dp"
android:src="@drawable/call_private_green_small"
android:layout_gravity="center_vertical" />
<TextView
android:id="@+id/textViewLoggedIn"
android:layout_width="wrap_content"
android:layout_height="fill_parent"
android:gravity="center_vertical"
android:layout_gravity="center_vertical"
android:text="@string/login"
android:textColor="#FFFFFF"
android:textSize="16dp"
android:paddingTop="7dp" />
</LinearLayout>
<!-- android:background="@drawable/addmessage_selector" -->
</LinearLayout>
<LinearLayout
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:background="@drawable/style_bluebutton"
android:paddingLeft="5dp"
android:paddingTop="2dp"
android:paddingBottom="2dp"
android:visibility="gone"
android:orientation="horizontal">
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_weight="1"
android:layout_gravity="center_vertical"
android:orientation="horizontal">
<TextView
android:id="@+id/textView1"
android:layout_width="wrap_content"
android:layout_height="fill_parent"
android:layout_gravity="center_vertical"
android:text="@string/IP"
android:textColor="#FFFFFF"
android:textSize="17dp" />
<TextView
android:id="@+id/textViewIP2"
android:layout_width="wrap_content"
android:layout_height="fill_parent"
android:layout_gravity="center_vertical"
android:text="@string/emptyIP"
android:textColor="#FFFFFF"
android:textSize="17dp" />
</LinearLayout>
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_weight="1"
android:id="@+id/layoutGateway2">
<ImageView
android:id="@+id/imageView1"
android:layout_width="wrap_content"
android:layout_height="fill_parent"
android:src="@drawable/enable" />
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content">
<TextView
android:id="@+id/textViewGateway2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text=""
android:textColor="#FFFFFF"
android:textSize="17dp"
android:paddingRight="2dp"/>
<ImageView
android:id="@+id/imageViewGateway"
android:layout_width="wrap_content"
android:layout_height="fill_parent"
android:src="@drawable/arrow_down" />
</LinearLayout>
</LinearLayout>
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="fill_parent"
android:layout_gravity="center_vertical"
android:layout_weight="6">
<TextView
android:id="@+id/textView3"
android:layout_width="wrap_content"
android:layout_height="fill_parent"
android:layout_gravity="center_vertical"
android:text="@string/Status"
android:textColor="#FFFFFF"
android:textSize="17dp" />
<ImageView
android:id="@+id/imageViewStatus2"
android:layout_width="wrap_content"
android:layout_height="fill_parent"
android:src="@drawable/status_offline"
/>
</LinearLayout>
</LinearLayout>
<LinearLayout
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:orientation="vertical"
android:paddingTop="2dp">
<TextView
android:id="@+id/textViewLoggedIn"
android:layout_width="wrap_content"
android:layout_height="fill_parent"
android:gravity="center_vertical"
android:layout_gravity="center_vertical"
android:text="@string/login"
android:textColor="#FFFFFF"
android:textSize="16dp"
android:paddingTop="7dp" />
</LinearLayout>
</LinearLayout>
<LinearLayout
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:background="@drawable/style_bluebutton"
android:paddingLeft="5dp"
android:paddingTop="2dp"
android:paddingBottom="2dp"
android:visibility="gone"
android:orientation="horizontal">
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_weight="1"
android:layout_gravity="center_vertical"
android:orientation="horizontal">
<TextView
android:id="@+id/textView1"
android:layout_width="wrap_content"
android:layout_height="fill_parent"
android:layout_gravity="center_vertical"
android:text="@string/IP"
android:textColor="#FFFFFF"
android:textSize="17dp" />
<TextView
android:id="@+id/textViewIP2"
android:layout_width="wrap_content"
android:layout_height="fill_parent"
android:layout_gravity="center_vertical"
android:text="@string/emptyIP"
android:textColor="#FFFFFF"
android:textSize="17dp" />
</LinearLayout>
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_weight="1"
android:id="@+id/layoutGateway2">
<ImageView
android:id="@+id/imageView1"
android:layout_width="wrap_content"
android:layout_height="fill_parent"
android:src="@drawable/enable" />
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content">
<TextView
android:id="@+id/textViewGateway2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text=""
android:textColor="#FFFFFF"
android:textSize="17dp"
android:paddingRight="2dp"/>
<ImageView
android:id="@+id/imageViewGateway"
android:layout_width="wrap_content"
android:layout_height="fill_parent"
android:src="@drawable/arrow_down" />
</LinearLayout>
</LinearLayout>
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="fill_parent"
android:layout_gravity="center_vertical"
android:layout_weight="6">
<TextView
android:id="@+id/textView3"
android:layout_width="wrap_content"
android:layout_height="fill_parent"
android:layout_gravity="center_vertical"
android:text="@string/Status"
android:textColor="#FFFFFF"
android:textSize="17dp" />
<ImageView
android:id="@+id/imageViewStatus2"
android:layout_width="wrap_content"
android:layout_height="fill_parent"
android:src="@drawable/status_offline" />
</LinearLayout>
</LinearLayout>
<LinearLayout
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:orientation="vertical"
android:paddingTop="2dp">
</LinearLayout>
<LinearLayout
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical"
android:layout_gravity="center"
android:gravity="center">
<LinearLayout
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical"
android:layout_gravity="center"
android:gravity="center">
<LinearLayout
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:orientation="horizontal"
android:paddingRight="10dp"
android:layout_gravity="center_vertical">
<LinearLayout
android:layout_weight="1"
android:layout_height="wrap_content"
android:layout_width="fill_parent"
android:gravity="center">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/Zone"
android:textStyle="bold"
android:textColor="#ffffffff"
android:textAppearance="?android:attr/textAppearanceMedium"/>
<LinearLayout
android:id="@+id/layoutSpinnerZone"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:background="@drawable/style_spinner"
android:gravity="right"
android:minWidth="150dp"
android:orientation="horizontal"
android:paddingBottom="4dp"
android:paddingLeft="3dp"
android:paddingRight="3dp"
android:paddingTop="4dp" >
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:orientation="horizontal"
android:paddingRight="10dp"
android:layout_gravity="center_vertical">
<LinearLayout
android:layout_weight="1"
android:layout_height="wrap_content"
android:layout_width="fill_parent"
android:gravity="center">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/Zone"
android:textStyle="bold"
android:textAppearance="?android:attr/textAppearanceMedium"/>
<LinearLayout
android:id="@+id/layoutSpinnerZone"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:background="@drawable/style_spinner"
android:gravity="right"
android:minWidth="150dp"
android:orientation="horizontal"
android:paddingBottom="4dp"
android:paddingLeft="3dp"
android:paddingRight="3dp"
android:paddingTop="4dp" >
<TextView
android:id="@+id/textViewZone"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_vertical"
android:text=""
android:textColor="#000000"
android:textStyle="bold"
android:textSize="20dp"/>
<ImageView
android:src="@drawable/arrow_spinner"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_vertical" />
</LinearLayout>
</LinearLayout>
<LinearLayout
android:layout_weight="1"
android:layout_height="wrap_content"
android:layout_width="fill_parent"
android:gravity="center">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/Channel"
android:textColor="#ffffffff"
android:textStyle="bold"
android:textAppearance="?android:attr/textAppearanceMedium"/>
<TextView
android:id="@+id/textViewZone"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_vertical"
android:text=""
android:textColor="#000000"
android:textStyle="bold"
android:textSize="20dp"/>
<ImageView
android:src="@drawable/arrow_spinner"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_vertical" />
</LinearLayout>
</LinearLayout>
<LinearLayout
android:layout_weight="1"
android:layout_height="wrap_content"
android:layout_width="fill_parent"
android:gravity="center">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/Channel"
android:textStyle="bold"
android:textAppearance="?android:attr/textAppearanceMedium"/>
<LinearLayout
android:id="@+id/layoutSpinnerChannel"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:background="@drawable/style_spinner"
android:gravity="right"
android:minWidth="150dp"
android:orientation="horizontal"
android:paddingBottom="4dp"
android:paddingLeft="3dp"
android:paddingRight="3dp"
android:paddingTop="4dp" >
<LinearLayout
android:id="@+id/layoutSpinnerChannel"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:background="@drawable/style_spinner"
android:gravity="right"
android:minWidth="150dp"
android:orientation="horizontal"
android:paddingBottom="4dp"
android:paddingLeft="3dp"
android:paddingRight="3dp"
android:paddingTop="4dp" >
<TextView
android:id="@+id/textViewChannel"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_vertical"
android:text=""
android:textColor="#000000"
android:textStyle="bold"
android:textSize="20dp"/>
<ImageView
android:src="@drawable/arrow_spinner"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_vertical" />
</LinearLayout>
</LinearLayout>
</LinearLayout>
<TextView
android:id="@+id/textViewChannel"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_vertical"
android:text=""
android:textColor="#000000"
android:textStyle="bold"
android:textSize="20dp"/>
<ImageView
android:src="@drawable/arrow_spinner"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_vertical" />
</LinearLayout>
</LinearLayout>
</LinearLayout>
<LinearLayout
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:orientation="horizontal"
android:gravity="center"
android:layout_gravity="center_horizontal">
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:orientation="horizontal"
android:gravity="center"
android:layout_gravity="center_horizontal">
<LinearLayout
android:layout_weight="1"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:gravity="center"
android:paddingTop="3dp">
<LinearLayout
android:layout_width="276dp"
android:layout_height="93dp"
android:layout_gravity="center"
android:background="@drawable/screen"
android:gravity="center"
android:orientation="vertical"
android:paddingBottom="0dp"
android:paddingTop="7dp">
<LinearLayout
android:layout_weight="1"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:gravity="center"
android:paddingTop="3dp">
<LinearLayout
android:layout_width="276dp"
android:layout_height="93dp"
android:layout_gravity="center"
android:background="@drawable/screen"
android:gravity="center"
android:orientation="vertical"
android:paddingBottom="0dp"
android:paddingTop="7dp">
<TextView
android:id="@+id/textViewMessageChannel"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
android:paddingBottom="7dp"
android:textColor="#000000"
android:textSize="20dp"
android:textStyle="bold"/>
<TextView
android:id="@+id/textViewMessageStatus"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
android:textColor="#000000"
android:textSize="20dp"
android:textStyle="bold"/>
</LinearLayout>
</LinearLayout>
</LinearLayout>
<TextView
android:id="@+id/textViewMessageChannel"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
android:paddingBottom="7dp"
android:textColor="#000000"
android:textSize="20dp"
android:textStyle="bold"/>
<TextView
android:id="@+id/textViewMessageStatus"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
android:textColor="#000000"
android:textSize="20dp"
android:textStyle="bold"/>
</LinearLayout>
</LinearLayout>
</LinearLayout>
<LinearLayout
android:layout_width="fill_parent"
@ -366,104 +362,104 @@
android:layout_gravity="center_horizontal"
android:gravity="center_horizontal">
<LinearLayout
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:orientation="vertical"
android:gravity="center_horizontal"
android:layout_weight="1">
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="vertical">
<RadioGroup android:id="@+id/radioGroupCallType"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginBottom="3sp">
<LinearLayout
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:orientation="vertical"
android:gravity="center_horizontal"
android:layout_weight="1">
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="vertical">
<RadioGroup
android:id="@+id/radioGroupCallType"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginBottom="3sp">
<RadioButton
android:id="@+id/radioAll"
android:layout_width="wrap_content"
android:layout_height="30dp"
android:checked="true"
android:text="@string/AllCall"
android:textAppearance="?android:attr/textAppearanceMedium"
android:textColor="#ffffffff" />
<RadioButton
android:id="@+id/radioAll"
android:layout_width="wrap_content"
android:layout_height="30dp"
android:checked="true"
android:text="@string/AllCall"
android:textAppearance="?android:attr/textAppearanceMedium"
/>
<RadioButton
android:id="@+id/radioGroup"
android:layout_width="wrap_content"
android:layout_height="30dp"
android:text="@string/GroupCall"
android:textAppearance="?android:attr/textAppearanceMedium"
android:textColor="#ffffffff" />
<RadioButton
android:id="@+id/radioGroup"
android:layout_width="wrap_content"
android:layout_height="30dp"
android:text="@string/GroupCall"
android:textAppearance="?android:attr/textAppearanceMedium"
/>
<RadioButton
android:id="@+id/radioPrivate"
android:layout_width="wrap_content"
android:layout_height="30dp"
android:text="@string/PrivateCall"
android:textAppearance="?android:attr/textAppearanceMedium"
android:textColor="#ffffffff" />
<RadioButton
android:id="@+id/radioPrivate"
android:layout_width="wrap_content"
android:layout_height="30dp"
android:text="@string/PrivateCall"
android:textAppearance="?android:attr/textAppearanceMedium"
/>
</RadioGroup>
<LinearLayout
android:id="@+id/layoutSpinnerCallType"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:background="@drawable/style_spinner"
android:gravity="right"
android:minWidth="150dp"
android:orientation="horizontal"
android:paddingBottom="4dp"
android:paddingLeft="3dp"
android:paddingRight="3dp"
android:paddingTop="4dp"
android:visibility="invisible" >
</RadioGroup>
<LinearLayout
android:id="@+id/layoutSpinnerCallType"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:background="@drawable/style_spinner"
android:gravity="right"
android:minWidth="150dp"
android:orientation="horizontal"
android:paddingBottom="4dp"
android:paddingLeft="3dp"
android:paddingRight="3dp"
android:paddingTop="4dp"
android:visibility="invisible" >
<TextView
android:id="@+id/textViewCallType"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_vertical"
android:text=""
android:textColor="#000000"
android:textStyle="bold"
android:textSize="20dp"/>
<ImageView
android:src="@drawable/arrow_spinner"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_vertical" />
</LinearLayout>
</LinearLayout>
</LinearLayout>
<LinearLayout
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_weight="1"
android:gravity="center_vertical|center_horizontal"
android:orientation="vertical" >
<Button
android:id="@+id/buttonPTT"
style="@style/ButtonPTT"
android:layout_width="135dp"
android:layout_height="88dp"
android:background="@drawable/style_buttonptt"
android:gravity="center"
android:paddingBottom="20dp"
android:text="@string/PTT" />
<Button
android:id="@+id/buttonDKey"
style="@style/ButtonText"
android:layout_width="135dp"
android:layout_height="wrap_content"
android:background="@drawable/style_bluebutton"
android:text="@string/DeKey"
android:textSize="18dp" />
</LinearLayout>
<TextView
android:id="@+id/textViewCallType"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_vertical"
android:text=""
android:textColor="#000000"
android:textStyle="bold"
android:textSize="20dp"/>
<ImageView
android:src="@drawable/arrow_spinner"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_vertical" />
</LinearLayout>
</LinearLayout>
</LinearLayout>
<LinearLayout
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_weight="1"
android:gravity="center_vertical|center_horizontal"
android:orientation="vertical" >
<Button
android:id="@+id/buttonPTT"
style="@style/ButtonPTT"
android:layout_width="135dp"
android:layout_height="88dp"
android:background="@drawable/style_buttonptt"
android:gravity="center"
android:paddingBottom="20dp"
android:text="@string/PTT" />
<Button
android:id="@+id/buttonDKey"
style="@style/ButtonText"
android:layout_width="135dp"
android:layout_height="wrap_content"
android:background="@drawable/style_bluebutton"
android:text="@string/DeKey"
android:textSize="18dp" />
</LinearLayout>
</LinearLayout>
</LinearLayout>
</LinearLayout>
</LinearLayout>

View File

@ -123,19 +123,18 @@
android:visibility="gone"
android:background="@drawable/recycle"/>
<!-- android:background="@drawable/addmessage_selector" -->
</LinearLayout>
<GridView
android:id="@+id/gridViewRecordings"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:verticalSpacing="1dp"
android:horizontalSpacing="0dp"
android:background="#999999"
android:drawSelectorOnTop="false"
android:listSelector="@drawable/gridalarm_selector"
android:numColumns="1"
android:padding="5dp"></GridView>
</LinearLayout>
<GridView
android:id="@+id/gridViewRecordings"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:verticalSpacing="1dp"
android:horizontalSpacing="0dp"
android:background="#999999"
android:drawSelectorOnTop="false"
android:listSelector="@drawable/gridalarm_selector"
android:numColumns="1"
android:padding="5dp"></GridView>
</LinearLayout>
</LinearLayout>

View File

@ -1,5 +1,6 @@
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/layoutMain"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
@ -10,246 +11,237 @@
android:layout_height="fill_parent"
android:layout_width="fill_parent"
android:layout_weight="80">
<LinearLayout
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:orientation="vertical"
android:layout_gravity="center"
android:paddingLeft="5dp"
android:paddingBottom="50dp" >
<LinearLayout
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:orientation="horizontal">
<LinearLayout
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:orientation="horizontal"
android:gravity="left"
android:paddingTop="10dp"
android:paddingLeft="7dp"
android:layout_weight="0.4">
<TextView
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="@string/serverIP"
android:textSize="14dp"
android:textColor="#FFFFFF"
android:textStyle="bold"
android:layout_gravity="center_vertical"
android:gravity="center_vertical|right"
android:layout_weight="2"/>
<LinearLayout
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:orientation="vertical"
android:layout_gravity="center"
android:paddingLeft="5dp"
android:paddingBottom="50dp" >
<LinearLayout
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:orientation="horizontal">
<LinearLayout
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:orientation="horizontal"
android:gravity="left"
android:paddingTop="10dp"
android:paddingLeft="7dp"
android:layout_weight="0.4">
<TextView
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="@string/serverIP"
android:textSize="14dp"
android:textStyle="bold"
android:layout_gravity="center_vertical"
android:gravity="center_vertical|right"
android:layout_weight="2"/>
<LinearLayout
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_weight="1"
android:paddingTop="3dp">
<EditText
android:id="@+id/appServerIP"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:gravity="center"
android:minWidth="200dp"
android:singleLine="true"
android:imeOptions="actionDone" >
</EditText>
</LinearLayout>
<LinearLayout
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_weight="1"
android:paddingTop="3dp">
<EditText
android:id="@+id/appServerIP"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:gravity="center"
android:minWidth="200dp"
android:singleLine="true"
android:imeOptions="actionDone" >
</EditText>
</LinearLayout>
</LinearLayout>
<LinearLayout
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:orientation="horizontal"
android:gravity="left"
android:paddingTop="10dp"
android:layout_weight="0.6">
<TextView
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="@string/serverPort"
android:textSize="14dp"
android:textColor="#FFFFFF"
android:textStyle="bold"
android:gravity="center_vertical|right"
android:layout_gravity="center_vertical|right"
android:layout_weight="1.4"/>
<LinearLayout
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_weight="1"
android:paddingTop="3dp">
<EditText
android:layout_height="wrap_content"
android:id="@+id/appServerPort"
android:maxLength="5"
android:minWidth="73dp"
android:gravity="center"
android:layout_width="wrap_content"
android:layout_gravity="center_vertical|right"
android:inputType="number"
android:imeOptions="actionDone">
</EditText>
</LinearLayout>
<LinearLayout
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:orientation="horizontal"
android:gravity="left"
android:paddingTop="10dp"
android:layout_weight="0.6">
<TextView
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="@string/serverPort"
android:textSize="14dp"
android:textStyle="bold"
android:gravity="center_vertical|right"
android:layout_gravity="center_vertical|right"
android:layout_weight="1.4"/>
<LinearLayout
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_weight="1"
android:paddingTop="3dp">
<EditText
android:layout_height="wrap_content"
android:id="@+id/appServerPort"
android:maxLength="5"
android:minWidth="73dp"
android:gravity="center"
android:layout_width="wrap_content"
android:layout_gravity="center_vertical|right"
android:inputType="number"
android:imeOptions="actionDone" />
</LinearLayout>
</LinearLayout>
</LinearLayout>
<LinearLayout
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:orientation="horizontal"
android:id="@+id/layoutPath">
<LinearLayout
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:orientation="horizontal"
android:paddingTop="0dp"
android:gravity="center_vertical|left">
<LinearLayout
android:layout_height="wrap_content"
android:layout_width="95dp"
android:layout_weight="0">
<TextView
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="@string/configName"
android:textSize="14dp"
android:textColor="#FFFFFF"
android:textStyle="bold"
android:gravity="center_vertical|right"
android:layout_gravity="center_vertical"/>
</LinearLayout>
<LinearLayout
android:layout_height="wrap_content"
android:layout_width="0dp"
android:layout_weight="1"
android:paddingTop="3dp">
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:orientation="horizontal"
android:paddingTop="0dp"
android:gravity="center_vertical|left">
<LinearLayout
android:layout_height="wrap_content"
android:layout_width="95dp"
android:layout_weight="0">
<TextView
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="@string/configName"
android:textSize="14dp"
android:textStyle="bold"
android:gravity="center_vertical|right"
android:layout_gravity="center_vertical"/>
</LinearLayout>
<LinearLayout
android:layout_height="wrap_content"
android:layout_width="0dp"
android:layout_weight="1"
android:paddingTop="3dp">
<EditText
android:id="@+id/editTextPath"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:gravity="right|center_vertical"
android:text="serial"
android:imeOptions="actionDone"
android:minWidth="73dp"
android:singleLine="true" >
<requestFocus />
</EditText>
<EditText
android:id="@+id/editTextPath"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:gravity="right|center_vertical"
android:text="serial"
android:imeOptions="actionDone"
android:minWidth="73dp"
android:singleLine="true" >
<requestFocus />
</EditText>
</LinearLayout>
<LinearLayout
android:layout_height="wrap_content"
android:layout_width="wrap_content"
android:layout_weight="0"
android:paddingTop="3dp">
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/btn_browse"
android:text="@string/load"
style="@style/ButtonText"
android:textColor="#000"
android:textSize="18dp"/>
</LinearLayout>
<LinearLayout
android:layout_height="wrap_content"
android:layout_width="wrap_content"
android:layout_weight="0"
android:paddingTop="3dp"
android:paddingRight="3dp">
</LinearLayout>
<LinearLayout
android:layout_height="wrap_content"
android:layout_width="wrap_content"
android:layout_weight="0"
android:paddingTop="3dp">
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/btn_browse"
android:text="@string/load"
style="@style/ButtonText"
android:textColor="#000"
android:textSize="18dp"/>
</LinearLayout>
<LinearLayout
android:layout_height="wrap_content"
android:layout_width="wrap_content"
android:layout_weight="0"
android:paddingTop="3dp"
android:paddingRight="3dp">
<ImageView
android:id="@+id/imageViewQuestionMark"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:src="@drawable/questionmark_small" />
</LinearLayout>
<ImageView
android:id="@+id/imageViewQuestionMark"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:src="@drawable/questionmark_small" />
</LinearLayout>
</LinearLayout>
</LinearLayout>
<LinearLayout
android:id="@+id/frameLayout11"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:orientation="horizontal"
android:gravity="left" >
android:id="@+id/frameLayout11"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:orientation="horizontal"
android:gravity="left" >
<TextView
android:layout_width="95dp"
android:layout_height="wrap_content"
android:text="@string/language"
android:textSize="14dp"
android:layout_marginRight="2dp"
android:textColor="#FFFFFF"
android:textStyle="bold"
android:gravity="right"
android:layout_gravity="center_vertical"/>
<LinearLayout
android:id="@+id/layoutSpinnerLanguage"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:background="@drawable/style_spinner"
android:gravity="left|center_vertical"
android:minWidth="223dp"
android:orientation="horizontal"
android:paddingBottom="4dp"
android:paddingLeft="3dp"
android:paddingRight="3dp"
android:paddingTop="4dp" >
<ImageView
android:id="@+id/imageLanguage"
android:src="@drawable/de"
android:layout_width="wrap_content"
android:layout_height="fill_parent"
android:layout_gravity="center_vertical"
android:layout_weight="0" />
<TextView
android:id="@+id/textViewSpinnerLanguage"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_gravity="center_vertical"
android:gravity="left"
android:text="Germany"
android:textColor="#000000"
android:textSize="17dp"
android:layout_weight="1"
android:paddingBottom="2dp"
android:paddingLeft="3dp">
<requestFocus />
</TextView>
<ImageView
android:src="@drawable/arrow_spinner"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_vertical"
android:layout_weight="0" />
</LinearLayout>
<TextView
android:layout_width="95dp"
android:layout_height="wrap_content"
android:text="@string/language"
android:textSize="14dp"
android:layout_marginRight="2dp"
android:textStyle="bold"
android:gravity="right"
android:layout_gravity="center_vertical"/>
<LinearLayout
android:id="@+id/layoutSpinnerLanguage"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:background="@drawable/style_spinner"
android:gravity="left|center_vertical"
android:minWidth="223dp"
android:orientation="horizontal"
android:paddingBottom="4dp"
android:paddingLeft="3dp"
android:paddingRight="3dp"
android:paddingTop="4dp" >
<ImageView
android:id="@+id/imageLanguage"
android:src="@drawable/de"
android:layout_width="wrap_content"
android:layout_height="fill_parent"
android:layout_gravity="center_vertical"
android:layout_weight="0" />
<TextView
android:id="@+id/textViewSpinnerLanguage"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_gravity="center_vertical"
android:gravity="left"
android:text="Germany"
android:textColor="#000000"
android:textSize="17dp"
android:layout_weight="1"
android:paddingBottom="2dp"
android:paddingLeft="3dp">
<requestFocus />
</TextView>
<ImageView
android:src="@drawable/arrow_spinner"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_vertical"
android:layout_weight="0" />
</LinearLayout>
</LinearLayout>
<LinearLayout
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:orientation="horizontal"
android:gravity="center_horizontal"
android:layout_marginTop="20dp">
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/btn_save"
android:text="@string/save"
style="@style/ButtonText"
android:textSize="22dp"
android:background="@drawable/style_bluebutton"/>
</LinearLayout>
<LinearLayout
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:orientation="horizontal"
android:gravity="center_horizontal"
android:layout_marginTop="20dp">
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/btn_save"
android:text="@string/save"
style="@style/ButtonText"
android:textSize="22dp"
android:background="@drawable/style_bluebutton"/>
</LinearLayout>
</LinearLayout>
</LinearLayout>
<RelativeLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content">
<RelativeLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>
</RelativeLayout>
</LinearLayout>

View File

@ -164,7 +164,7 @@
<GridView
android:id="@+id/gridView1"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_height="match_parent"
android:background="#999999"
android:drawSelectorOnTop="false"
android:horizontalSpacing="0dp"

View File

@ -263,5 +263,7 @@
<string name="permissionBlocked">%1$s permission was not accepted. To be able to use the %2$s, please open application settings and grant the %3$s permission</string>
<string name="microphone">Microphone</string>
<string name="radio_tab">Radio Tab</string>
<string name="too_many_positions">You have selected %1$s positions.\nPlease select a smalled interval.</string>
<string name="no_data_for_interval">No data for this interval</string>
</resources>