diff --git a/libSafeMobile/src/main/java/com/safemobile/adapters/RecordingsGridViewAdapter.java b/libSafeMobile/src/main/java/com/safemobile/adapters/RecordingsGridViewAdapter.java index caac6da..2a97ae8 100644 --- a/libSafeMobile/src/main/java/com/safemobile/adapters/RecordingsGridViewAdapter.java +++ b/libSafeMobile/src/main/java/com/safemobile/adapters/RecordingsGridViewAdapter.java @@ -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 listRecordings; - private ArrayList recordingExists; - private ArrayList 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 hash = new Hashtable(); - - public RecordingsGridViewAdapter(Activity activity, Context context, ArrayList listRecordings, ArrayList 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 listRecordings; + private final ArrayList recordingExists; + private final ArrayList playingPositions; + private final Activity activity; + + private final Hashtable hash = new Hashtable<>(); + + public RecordingsGridViewAdapter(Activity activity, ArrayList listRecordings, ArrayList recordingExists) { super(); this.activity = activity; - this.context = context; this.listRecordings = listRecordings; this.recordingExists = recordingExists; - - playingPositions = new ArrayList(); - for(int i=0; i(); + 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); } -} +} \ No newline at end of file diff --git a/libSafeMobile/src/main/java/com/safemobile/database/DatabaseCommunication.java b/libSafeMobile/src/main/java/com/safemobile/database/DatabaseCommunication.java index 7049f6e..4fa1b11 100644 --- a/libSafeMobile/src/main/java/com/safemobile/database/DatabaseCommunication.java +++ b/libSafeMobile/src/main/java/com/safemobile/database/DatabaseCommunication.java @@ -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) diff --git a/libSafeMobile/src/main/java/com/safemobile/lib/RecordMSG.java b/libSafeMobile/src/main/java/com/safemobile/lib/RecordMSG.java index b4c4165..34c966e 100644 --- a/libSafeMobile/src/main/java/com/safemobile/lib/RecordMSG.java +++ b/libSafeMobile/src/main/java/com/safemobile/lib/RecordMSG.java @@ -4,36 +4,43 @@ import java.util.ArrayList; public class RecordMSG extends TCPmsg { - public ArrayList recordList; - public static int count=0; - public RecordMSG(TCPmsg tcp) - { - super(tcp); - recordList = new ArrayList(); + private ArrayList 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 getRecordList() { + return recordList; + } + + public void setRecordList(ArrayList recordList) { + this.recordList = recordList; } } diff --git a/libSafeMobile/src/main/java/com/safemobile/lib/Recording.java b/libSafeMobile/src/main/java/com/safemobile/lib/Recording.java index d7700b5..5b3ee63 100644 --- a/libSafeMobile/src/main/java/com/safemobile/lib/Recording.java +++ b/libSafeMobile/src/main/java/com/safemobile/lib/Recording.java @@ -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; } } diff --git a/libSafeMobile/src/main/java/com/safemobile/services/TCPhandler.java b/libSafeMobile/src/main/java/com/safemobile/services/TCPhandler.java index 8b9c96d..072dd7a 100644 --- a/libSafeMobile/src/main/java/com/safemobile/services/TCPhandler.java +++ b/libSafeMobile/src/main/java/com/safemobile/services/TCPhandler.java @@ -1,10 +1,4 @@ package com.safemobile.services; -import java.io.*; -import java.net.*; -import java.util.LinkedList; -import java.util.NoSuchElementException; -import java.util.Timer; -import java.util.TimerTask; import android.content.BroadcastReceiver; import android.content.Context; @@ -17,20 +11,31 @@ import com.safemobile.lib.AppParams; import com.safemobile.lib.SM; import com.safemobile.lib.TCPmsg; +import java.io.DataInputStream; +import java.io.DataOutputStream; +import java.io.IOException; +import java.net.InetSocketAddress; +import java.net.Socket; +import java.net.UnknownHostException; +import java.util.LinkedList; +import java.util.NoSuchElementException; +import java.util.Timer; +import java.util.TimerTask; + public class TCPhandler implements Runnable { private boolean alive = true; - + public String serverHostname; private int port; private Thread listenThread; - private Socket soc =null; - + private Socket soc = null; + private DataInputStream input; private DataOutputStream output; private String leftOver = ""; - + public static LinkedList msgList; public Boolean isConnectionUP = false; @@ -38,17 +43,17 @@ public class TCPhandler implements Runnable { private final Context context; private boolean isWiFiOn; - + public TCPhandler(Context context, String hostName, int p) { this.context = context; - serverHostname=hostName; + 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 timer = new Timer(); timer.scheduleAtFixedRate(new TimerTask() { @@ -76,13 +81,13 @@ public class TCPhandler implements Runnable { 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); @@ -100,62 +105,65 @@ public class TCPhandler implements Runnable { } 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); } - - while(isConnectionUP) { + + while (Boolean.TRUE.equals(isConnectionUP)) { try { - Thread.sleep(100); + Thread.sleep(100); + //process leftover try { boolean FinishLeftOver = true; while (FinishLeftOver) { - // add this replacement if message length doesn't contain the last # 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) { + messLen = Integer.parseInt(tempArr2[1]); + } catch (Exception e) { SM.Debug("leftovers", "incorect msg len leftOver =" + tempArr2[1]); - messLen =-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#")) + SM.Debug("leftovers", "RX from leftOver:" + msg.allData); + + if (msg.allData.contains("#92#")) prioritizePongReceived(); - + msgList.add(msg); - leftOver =""; + 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#")) + } 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); - } - } else FinishLeftOver = false; + leftOver = leftOver.substring(messLen, leftOver.length()); + } + } else FinishLeftOver = false; } } catch (Exception e) { - SM.Debug("leftovers", "Error on process leftover"+ e); + SM.Debug("leftovers", "Error on process leftover" + e.toString()); } - String data; - int n; + //end process leftover + + String data = ""; + int n = 0; byte[] buf = new byte[1024]; // read data into buffer @@ -169,20 +177,21 @@ public class TCPhandler implements Runnable { soc = null; break; } - - byte[] temp = new byte[n]; - System.arraycopy(buf, 0, temp, 0, n); - // decryptData - temp = decryptTEA(temp); - data = new String(temp); + byte[] temp = new byte[n]; + 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 # data = leftOver+data; leftOver = ""; } - + //search for overflow message String[] tempArr = data.split("#"); if ((tempArr.length == 0) || (tempArr.length == 1)) { @@ -192,7 +201,7 @@ public class TCPhandler implements Runnable { //get msg len 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; @@ -206,20 +215,20 @@ public class TCPhandler implements Runnable { //if expected string message is smaller then actual string then exit processing; if (messLen > data.length()) { leftOver = data; // Add by bigu - continue; + continue; } - //perform cut + //perform cut temMSG = data.substring(0,messLen).toCharArray(); leftOver = data.substring(messLen); } //decode TCP msg TCPmsg msg = new TCPmsg(temMSG); - + SM.Debug("������� RX �������", msg.allData); if (msg.allData.contains("#92#")) prioritizePongReceived(); - + msgList.add(msg); } catch(Exception ex) { SM.Debug("TCPHandler", "TCPhandler/run/break:"+ ex); @@ -236,15 +245,15 @@ public class TCPhandler implements Runnable { } //try to restart connection if (alive && isWiFiOn) - RestartTCP(); + 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(); @@ -252,7 +261,7 @@ public class TCPhandler implements Runnable { /* Broadcast Received for WiFi Connect/Disconnect */ public BroadcastReceiver mReceived = new BroadcastReceiver() { - + @Override public void onReceive(Context context, Intent intent) { final String action = intent.getAction(); @@ -267,7 +276,7 @@ public class TCPhandler implements Runnable { } }; - /** 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 @@ -277,41 +286,51 @@ public class TCPhandler implements Runnable { if (output != null) { try { Thread.sleep(10); - String cmdok = "#" + seqID + msg; - int tmp = cmdok.length() + 1; - //SM.Debug("tmp:"+tmp); + String cmdok = "#" + seqID + msg; + Integer tmp = cmdok.length() + 1; tmp += Integer.toString(tmp).length(); - if ((tmp == 10)||(tmp == 100)||(tmp == 1000)) tmp++; - cmdok = "#" + tmp + cmdok; + 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 + 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 (IOException | NoSuchElementException | InterruptedException e) { + } catch (InterruptedException e) { + SM.Exception("TCPClient[Send]", e.toString()); + Thread.currentThread().interrupt(); + } catch (NoSuchElementException e) { SM.Exception("TCPClient[Send]", e.toString()); } - } else + } else { return false; + } } catch (Exception e) { - SM.Debug("TCPhandler Write Procedure:"+ e); + SM.Debug("TCPhandler Write Procedure:" + e); } return 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) { // no encryption 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; @@ -320,7 +339,7 @@ public class TCPhandler implements Runnable { decryptedByteArray = toDecryptData; return decryptedByteArray; } - + public int getPort() { return port; } @@ -328,12 +347,12 @@ public class TCPhandler implements Runnable { 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 { port = Integer.parseInt(_port); @@ -342,44 +361,52 @@ public class TCPhandler implements Runnable { port = 13589; } } - + public void triggerTCPConnectionStateEvent() { if (!isConnectionUP) TCPmsgParser._fireTCPConnectionDownEvent(previousConnectionWasUP); - else + else TCPmsgParser._fireTCPConnectionUpEvent(previousConnectionWasUP); } - - private void RestartTCP() { + + private void restartTCP() { try { isConnectionUP = false; previousConnectionWasUP = false; - - SM.Debug("Restarting TCP...ip:"+serverHostname + ":" + port); + + SM.Debug("Restarting TCP...ip:" + serverHostname + ":" + port); soc = new Socket(); - soc.connect(new InetSocketAddress(serverHostname, port), 5000); - + soc.connect(new InetSocketAddress(serverHostname, port), 5000); + input = new DataInputStream(soc.getInputStream()); //output stream output = new DataOutputStream(soc.getOutputStream()); - - if (soc != null) + + if (soc != null) { isConnectionUP = true; - } catch (NullPointerException | IOException e) { - SM.Exception("RestartTCP break:"+ e); + } + + } catch (UnknownHostException e) { + SM.Exception("restartTCP break:" + e.toString()); isConnectionUP = false; } catch (IllegalArgumentException e) { - SM.Debug("IllegalArgumentException", "RestartTCP break:"+ e); + SM.Debug("IllegalArgumentException", "restartTCP break:" + e.toString()); + } catch (IOException e) { + SM.Exception("restartTCP break:" + e.toString()); + isConnectionUP = false; + } catch (NullPointerException e) { + SM.Exception("restartTCP break:" + e.toString()); + isConnectionUP = false; } triggerTCPConnectionStateEvent(); } - + /** 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) { diff --git a/safeDispatch/src/main/AndroidManifest.xml b/safeDispatch/src/main/AndroidManifest.xml index db92082..23f0048 100644 --- a/safeDispatch/src/main/AndroidManifest.xml +++ b/safeDispatch/src/main/AndroidManifest.xml @@ -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"> diff --git a/safeDispatch/src/main/java/com/safemobile/lib/sound/AudioHandle.java b/safeDispatch/src/main/java/com/safemobile/lib/sound/AudioHandle.java index 12bbd55..a164224 100644 --- a/safeDispatch/src/main/java/com/safemobile/lib/sound/AudioHandle.java +++ b/safeDispatch/src/main/java/com/safemobile/lib/sound/AudioHandle.java @@ -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); } } diff --git a/safeDispatch/src/main/java/com/safemobile/lib/sound/RecordingHandle.java b/safeDispatch/src/main/java/com/safemobile/lib/sound/RecordingHandle.java index e087ef8..eaee66b 100644 --- a/safeDispatch/src/main/java/com/safemobile/lib/sound/RecordingHandle.java +++ b/safeDispatch/src/main/java/com/safemobile/lib/sound/RecordingHandle.java @@ -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; + } +} \ No newline at end of file diff --git a/safeDispatch/src/main/java/com/safemobile/lib/sound/TCPaudioClient.java b/safeDispatch/src/main/java/com/safemobile/lib/sound/TCPaudioClient.java deleted file mode 100644 index 6ffb8a1..0000000 --- a/safeDispatch/src/main/java/com/safemobile/lib/sound/TCPaudioClient.java +++ /dev/null @@ -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 _listeners = new ArrayList(); - - 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 listeners = _listeners.iterator(); - while( listeners.hasNext() ) { - ( (ITCPaudioLis) listeners.next() ).dataRecv(event); - } - } -} diff --git a/safeDispatch/src/main/java/com/safemobile/lib/sound/TcpAudioClient.java b/safeDispatch/src/main/java/com/safemobile/lib/sound/TcpAudioClient.java new file mode 100644 index 0000000..81d09f0 --- /dev/null +++ b/safeDispatch/src/main/java/com/safemobile/lib/sound/TcpAudioClient.java @@ -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 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; + } +} \ No newline at end of file diff --git a/safeDispatch/src/main/java/com/safemobile/lib/sound/UDPclient.java b/safeDispatch/src/main/java/com/safemobile/lib/sound/UDPclient.java index b62c4af..3c041cb 100644 --- a/safeDispatch/src/main/java/com/safemobile/lib/sound/UDPclient.java +++ b/safeDispatch/src/main/java/com/safemobile/lib/sound/UDPclient.java @@ -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; diff --git a/safeDispatch/src/main/java/com/safemobile/safedispatch/RecordingsActivity.java b/safeDispatch/src/main/java/com/safemobile/safedispatch/RecordingsActivity.java index f4cdcef..a13aba0 100644 --- a/safeDispatch/src/main/java/com/safemobile/safedispatch/RecordingsActivity.java +++ b/safeDispatch/src/main/java/com/safemobile/safedispatch/RecordingsActivity.java @@ -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,349 @@ 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 allRecordings = new ArrayList(); - private ArrayList playingPositions = new ArrayList(); - private ArrayList allGWsIP = new ArrayList(); - private GridView gridView; + private TabLayoutActivity parentTab; + private ArrayList allRecordings = new ArrayList<>(); + private ArrayList playingPositions = new ArrayList<>(); + private GridView gridView; private RecordingsGridViewAdapter adapter; - public View convertViewRecording; - - public int playingPosition = -1; - + private View convertViewRecording; + + 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 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 adapter = new ArrayAdapter(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); + + 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 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; - + 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 list) - { - //SM.Debug("## UpdateRecordings: " + list.size()); - allRecordings = new ArrayList(); - 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 + gridView.setEnabled(true); + + // set playing Recording position to -1 + setPlayingPosition(-1); + } + + // Update Recordings received from AppServer + public void updateRecordings(ArrayList 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(); - for(int i=0; i(); + 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 getAllRecordings() { + return allRecordings; + } + + public void setAllRecordings(ArrayList 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; + } +} \ No newline at end of file diff --git a/safeDispatch/src/main/java/com/safemobile/safedispatch/TabLayoutActivity.java b/safeDispatch/src/main/java/com/safemobile/safedispatch/TabLayoutActivity.java index 9b3ce43..4a3a056 100644 --- a/safeDispatch/src/main/java/com/safemobile/safedispatch/TabLayoutActivity.java +++ b/safeDispatch/src/main/java/com/safemobile/safedispatch/TabLayoutActivity.java @@ -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; @@ -404,7 +403,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 +631,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 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 +642,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 +650,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 +1005,6 @@ public class TabLayoutActivity extends AbstractSDParentActivity { moribund.interrupt(); } - this.unregisterReceiver(mReceiver); - // unbound from tcp service if (isBound) { getApplicationContext().unbindService(serviceConnection); @@ -1047,7 +1044,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()); } @@ -1361,7 +1358,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 +1367,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()); } @@ -1578,7 +1575,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 +1609,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) @@ -1719,19 +1716,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 + ""); @@ -2324,4 +2378,10 @@ public class TabLayoutActivity extends AbstractSDParentActivity { this.startActivity(intent); } } + + @Override + protected void onDestroy() { + super.onDestroy(); + this.unregisterReceiver(mReceiver); + } }