Compare commits

...

4 Commits

8 changed files with 397 additions and 729 deletions

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@ -14,13 +14,11 @@ import java.util.Timer;
import java.util.TimerTask; import java.util.TimerTask;
import com.google.android.gms.tasks.Task; import com.google.android.gms.tasks.Task;
import com.google.android.gms.tasks.TaskCompletionSource;
import com.safemobile.activities.AbstractEmptyActivity; import com.safemobile.activities.AbstractEmptyActivity;
import com.safemobile.activities.AbstractLiveActivity; import com.safemobile.activities.AbstractLiveActivity;
import com.safemobile.activities.AbstractMessagesActivity; import com.safemobile.activities.AbstractMessagesActivity;
import com.safemobile.activities.AbstractRadioActivity; import com.safemobile.activities.AbstractRadioActivity;
import com.safemobile.activities.AbstractSDParentActivity; import com.safemobile.activities.AbstractSDParentActivity;
import com.safemobile.safedispatch.R;
import com.safemobile.enums.AuthorizationCode; import com.safemobile.enums.AuthorizationCode;
import com.safemobile.enums.AuthorizationStatus; import com.safemobile.enums.AuthorizationStatus;
import com.safemobile.enums.ProviderSettingsStatus; import com.safemobile.enums.ProviderSettingsStatus;
@ -59,7 +57,7 @@ import com.safemobile.services.TCPService.TCPBinder;
import android.Manifest; import android.Manifest;
import android.annotation.SuppressLint; import android.annotation.SuppressLint;
import android.app.Dialog; import android.app.Dialog;
import android.app.Notification; import android.app.NotificationChannel;
import android.app.NotificationManager; import android.app.NotificationManager;
import android.app.PendingIntent; import android.app.PendingIntent;
import android.content.BroadcastReceiver; import android.content.BroadcastReceiver;
@ -74,6 +72,7 @@ import android.content.res.Configuration;
import android.content.res.Resources; import android.content.res.Resources;
import android.net.Uri; import android.net.Uri;
import android.os.AsyncTask; import android.os.AsyncTask;
import android.os.Build;
import android.os.Bundle; import android.os.Bundle;
import android.os.Handler; import android.os.Handler;
import android.os.IBinder; import android.os.IBinder;
@ -94,6 +93,8 @@ import android.widget.Toast;
import android.widget.TabHost.TabSpec; import android.widget.TabHost.TabSpec;
import androidx.annotation.NonNull; import androidx.annotation.NonNull;
import androidx.core.app.NotificationCompat;
import androidx.core.app.NotificationManagerCompat;
public class TabLayoutActivity extends AbstractSDParentActivity { public class TabLayoutActivity extends AbstractSDParentActivity {
@ -1233,7 +1234,7 @@ public class TabLayoutActivity extends AbstractSDParentActivity {
getMessageActivity().updateSMS(sms.smsList); getMessageActivity().updateSMS(sms.smsList);
} }
} catch (Exception ex) { } catch (Exception ex) {
SM.Debug("Error on smsReceived:" + ex.toString()); SM.Debug("Error on smsReceived:" + ex);
} }
} }
@ -1426,7 +1427,7 @@ public class TabLayoutActivity extends AbstractSDParentActivity {
SM.Debug("tmpHist seqID:" + tmpHist.seqID); SM.Debug("tmpHist seqID:" + tmpHist.seqID);
int pos = Integer.parseInt(tmpHist.seqID.substring(0, tmpHist.seqID.indexOf('.'))); 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 (all != 0) {
if (Boolean.TRUE.equals(getFirstHistoryData())) { if (Boolean.TRUE.equals(getFirstHistoryData())) {
try { try {
@ -1668,13 +1669,11 @@ public class TabLayoutActivity extends AbstractSDParentActivity {
case 137: case 137:
setMess("zone " + tempArr[1]); setMess("zone " + tempArr[1]);
break; break;
case 138:
setMess("emergency");
break;
case 140: case 140:
setMess("telemetry " + tempArr[1]); setMess("telemetry " + tempArr[1]);
break; break;
default: default:
// 138
setMess("emergency"); setMess("emergency");
} }
myHandler.post(updateResultsAlarm); myHandler.post(updateResultsAlarm);
@ -1896,10 +1895,7 @@ public class TabLayoutActivity extends AbstractSDParentActivity {
public void createNotification(int icon) { public void createNotification(int icon) {
mNotificationManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE); mNotificationManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
String tickerText = "SafeMobile Dispatch: New Message from " + getImei(); String contentTitle, contentText;
String contentTitle = "New Message from " + getImei();
String contentText = "\"" + getMess() + "\"";
Vehicle veh = getVehicle4Imei(getImei()); Vehicle veh = getVehicle4Imei(getImei());
int iconValue = icon; int iconValue = icon;
@ -1912,7 +1908,6 @@ public class TabLayoutActivity extends AbstractSDParentActivity {
case AppParams.pollNotif: case AppParams.pollNotif:
contentText = "\"" + getMess() + "\""; contentText = "\"" + getMess() + "\"";
contentTitle = "Poll Reply from " + (veh != null ? getVehicle4Imei(getImei()).name : getImei()); 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; icon = R.drawable.poll;
break; break;
case AppParams.alertNotif: case AppParams.alertNotif:
@ -1921,34 +1916,53 @@ public class TabLayoutActivity extends AbstractSDParentActivity {
vehName = getString(R.string.from) + ": " + getVehicle4Imei(getImei()).name; vehName = getString(R.string.from) + ": " + getVehicle4Imei(getImei()).name;
contentText = "\"" + getMess() + "\""; contentText = "\"" + getMess() + "\"";
contentTitle = getString(R.string.newAlarm) + vehName; contentTitle = getString(R.string.newAlarm) + vehName;
tickerText = "SafeMobile Dispatch: " + getString(R.string.newAlarm) + vehName; icon = R.drawable.arrow_down;
icon = R.drawable.alert;
break; break;
default: default:
throw new IllegalStateException("Unexpected value: " + icon); throw new IllegalStateException("Unexpected value: " + icon);
} }
Notification notification = new Notification(icon, tickerText, System.currentTimeMillis());
// set intent to be opened on NotificationClick // set intent to be opened on NotificationClick
/* Notification */ /* Notification */
Intent notificationIntent = new Intent(this, NotificationActivity.class); Intent intent = new Intent(this, NotificationActivity.class);
notificationIntent.putExtra("key", iconValue); intent.putExtra("key", iconValue);
// cancel old notification // cancel old notification
mNotificationManager.cancel(icon); mNotificationManager.cancel(icon);
PendingIntent contentIntent = PendingIntent.getActivity(context, NOTIFICATION_ACTIVITY_RESULT, notificationIntent, PendingIntent.FLAG_CANCEL_CURRENT); PendingIntent pendingIntent = PendingIntent.getActivity(context, NOTIFICATION_ACTIVITY_RESULT, intent, PendingIntent.FLAG_CANCEL_CURRENT);
createNotificationChannel(icon, contentTitle, contentText, pendingIntent);
// 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);
} }
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 // return vehicle according to imei
private Vehicle getVehicle4Imei(String imei) { private Vehicle getVehicle4Imei(String imei) {
Vehicle veh = null; Vehicle veh = null;
@ -2092,7 +2106,7 @@ public class TabLayoutActivity extends AbstractSDParentActivity {
setVehicleStatus(Integer.parseInt(params[1]), Integer.parseInt(params[2]), Integer.parseInt(params[3]), Integer.parseInt(params[4])); setVehicleStatus(Integer.parseInt(params[1]), Integer.parseInt(params[2]), Integer.parseInt(params[3]), Integer.parseInt(params[4]));
} catch (Exception ex) { } catch (Exception ex) {
SM.Exception("Paramas -> setVehicleStatus", "EXCeption ex " + ex.toString()); SM.Exception("Paramas -> setVehicleStatus", "EXCeption ex " + ex);
} }
break; break;
@ -2123,21 +2137,6 @@ public class TabLayoutActivity extends AbstractSDParentActivity {
new ConnectTask().execute(params); 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*/ /* Display Toast messages*/
@Override @Override
public void displayToast(final String msg) { public void displayToast(final String msg) {
@ -2247,10 +2246,8 @@ public class TabLayoutActivity extends AbstractSDParentActivity {
super.onRequestPermissionsResult(requestCode, permissions, grantResults); super.onRequestPermissionsResult(requestCode, permissions, grantResults);
SM.Debug("onRequestPermissionsResult", "[requestCode] " + requestCode); SM.Debug("onRequestPermissionsResult", "[requestCode] " + requestCode);
String permission = "";
switch (requestCode) { switch (requestCode) {
case PermissionModule.RECORD_AUDIO_PERMISSION_REQUEST_CODE: case PermissionModule.RECORD_AUDIO_PERMISSION_REQUEST_CODE:
permission = Manifest.permission.RECORD_AUDIO;
break; break;
default: default:
throw new IllegalStateException("Unexpected value: " + requestCode); throw new IllegalStateException("Unexpected value: " + requestCode);
@ -2301,10 +2298,9 @@ public class TabLayoutActivity extends AbstractSDParentActivity {
private void waitForUserInput(Boolean result) { private void waitForUserInput(Boolean result) {
if (result) { if (result) {
final int requestCode = 1202;
//navigate to application's settings //navigate to application's settings
String action = ProviderSettingsHelper.getAction(ProviderSettingsStatus.APPLICATION_DETAILS); String action = ProviderSettingsHelper.getAction(ProviderSettingsStatus.APPLICATION_DETAILS);
if (action == null || action == "") if (action == null || action.equals(""))
return; return;
boolean isActionApplicationDetailsSettings = action.equals(ProviderSettingsHelper.ACTION_APPLICATION_DETAILS_SETTINGS); boolean isActionApplicationDetailsSettings = action.equals(ProviderSettingsHelper.ACTION_APPLICATION_DETAILS_SETTINGS);

View File

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