From 8bb6f36e60462a52a904e3f45b6f9ca6c4b21700 Mon Sep 17 00:00:00 2001 From: Bogdan Date: Fri, 25 Mar 2022 17:28:53 +0200 Subject: [PATCH 1/3] SD-211 - fix case when the app was sending request on the ui thread -fix audio hadler -small refactor --- libSafeMobile/src/main/AndroidManifest.xml | 1 + .../adapters/RecordingsGridViewAdapter.java | 339 ++++---- .../com/safemobile/services/TCPhandler.java | 789 +++++++----------- .../safemobile/lib/sound/RecordingHandle.java | 103 +-- .../com/safemobile/lib/sound/UDPclient.java | 2 +- .../safedispatch/RecordingsActivity.java | 637 +++++++------- .../safedispatch/TabLayoutActivity.java | 12 +- 7 files changed, 823 insertions(+), 1060 deletions(-) diff --git a/libSafeMobile/src/main/AndroidManifest.xml b/libSafeMobile/src/main/AndroidManifest.xml index dc6d6f5..be6e973 100644 --- a/libSafeMobile/src/main/AndroidManifest.xml +++ b/libSafeMobile/src/main/AndroidManifest.xml @@ -4,6 +4,7 @@ android:versionCode="1" android:versionName="1.0" > + 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 Context context; + + private final Hashtable hash = new Hashtable<>(); + + public RecordingsGridViewAdapter(Activity activity, Context context, 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 +62,190 @@ 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((LinearLayout) convertView.findViewById(R.id.layoutRecording)); + view.setImageViewPlay((ImageView) convertView.findViewById(R.id.imageViewPlay)); + view.setTextViewSender((TextView) convertView.findViewById(R.id.textViewSender)); + view.setTextViewDuration((TextView) convertView.findViewById(R.id.textViewDuration)); + view.setTextViewDate((TextView) convertView.findViewById(R.id.textViewDate)); + view.setImageViewRecycle((ImageView) 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) - { + 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; + if (listRecordings.get(position).destinationRadioID == 0) + view.getImageViewPlay().setImageResource(R.drawable.call_received_all); + else + view.getImageViewPlay().setImageResource(R.drawable.call_made_all); + break; case AppParams.PrivateCall: - if(listRecordings.get(position).destinationRadioID == 0) - view.imageViewPlay.setImageResource(R.drawable.call_received); - else - view.imageViewPlay.setImageResource(R.drawable.call_made); - break; - case AppParams.GroupCall: - if(listRecordings.get(position).destinationRadioID == 0) - view.imageViewPlay.setImageResource(R.drawable.call_received_group); - else - view.imageViewPlay.setImageResource(R.drawable.call_made_group); - break; - } - /* - try - { - if(receivedPositions.get(position)) - { - if(playingPositions.get(position)) - view.imageViewPlay.setImageResource(R.drawable.play_received); + if (listRecordings.get(position).destinationRadioID == 0) + view.getImageViewPlay().setImageResource(R.drawable.call_received); else - view.imageViewPlay.setImageResource(R.drawable.call_received); - - } - else - { - if(playingPositions.get(position)) - view.imageViewPlay.setImageResource(R.drawable.play_made); + view.getImageViewPlay().setImageResource(R.drawable.call_made); + break; + case AppParams.GroupCall: + if (listRecordings.get(position).destinationRadioID == 0) + view.getImageViewPlay().setImageResource(R.drawable.call_received_group); else - view.imageViewPlay.setImageResource(R.drawable.call_made); - } + view.getImageViewPlay().setImageResource(R.drawable.call_made_group); + break; + default: + view.getImageViewPlay().setImageResource(R.drawable.alert); } - 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); + if (getItem(position).NameForDisplay.equals(AppParams.USERNAME)) + view.getImageViewPlay().setImageDrawable(context.getResources().getDrawable(R.drawable.call_made_group)); + else + view.getImageViewPlay().setImageDrawable(context.getResources().getDrawable(R.drawable.call_received_group)); + + view.getTextViewSender().setText(getItem(position).NameForDisplay); view.textViewDuration.setText("[" + getItem(position).duration + " sec]"); - + /* Add call Date */ Date date = new Date(); date.setTime(listRecordings.get(position).date * 1000); - - SimpleDateFormat sdf = new SimpleDateFormat("HH:mm:ss"); + + 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/services/TCPhandler.java b/libSafeMobile/src/main/java/com/safemobile/services/TCPhandler.java index 038ca86..f9416d4 100644 --- a/libSafeMobile/src/main/java/com/safemobile/services/TCPhandler.java +++ b/libSafeMobile/src/main/java/com/safemobile/services/TCPhandler.java @@ -1,11 +1,4 @@ package com.safemobile.services; -import java.io.*; -import java.net.*; -import java.nio.charset.Charset; -import java.util.LinkedList; -import java.util.NoSuchElementException; -import java.util.Timer; -import java.util.TimerTask; import android.content.BroadcastReceiver; import android.content.Context; @@ -19,612 +12,434 @@ import com.safemobile.lib.AppParams; import com.safemobile.lib.SM; import com.safemobile.lib.TCPmsg; +import java.io.DataInputStream; +import java.io.DataOutputStream; +import java.io.IOException; +import java.net.InetSocketAddress; +import java.net.Socket; +import java.net.UnknownHostException; +import java.util.LinkedList; +import java.util.NoSuchElementException; +import java.util.Timer; +import java.util.TimerTask; -public class TCPhandler implements Runnable -{ + +public class TCPhandler implements Runnable { private boolean alive = true; - - public String serverHostname = new String ("10.120.1.114");// - private int port = 13579; + + public String serverHostname; + private int port; private Thread listenThread; - private Socket soc =null; - - //private BufferedReader recv; - //private PrintWriter writer; - + private Socket soc = null; + private DataInputStream input; private DataOutputStream output; - private Timer timer; - + private String leftOver = ""; - + public static LinkedList msgList; - private volatile int n=0; - + private volatile int n = 0; + public Boolean isConnectionUP = false; public Boolean previousConnectionWasUP = false; - + private Context context; private boolean isWiFiOn = true; - - public TCPhandler(Context context, String hostName, int p) - { - + + public TCPhandler(Context context, String hostName, int p) { + this.context = context; - serverHostname=hostName; - port=p; + serverHostname = hostName; + port = p; msgList = new LinkedList(); SM.Debug("---TCPhandler constructor [" + hostName + "," + p + "] ---"); - listenThread = new Thread(this, "TCPlisten"); + listenThread = new Thread(this, "TCPlisten"); listenThread.start(); // (2) Start the thread. - - + // create timer to check socket status - timer = new Timer(); + Timer timer = new Timer(); timer.scheduleAtFixedRate(new TimerTask() { - @Override - public void run() { - try { - //Looper.prepare(); - //mBluetoothAdapter = BluetoothAdapter.getDefaultAdapter(); - // get if is authenticated - //Write("0.0", "d"); - previousConnectionWasUP = isConnectionUP; - - // try to send something - TCPmsgParser._fireonTCPConnectionStatusEvent(isConnectionUP, previousConnectionWasUP); - } - catch (Exception e) { - //e.printStackTrace(); + @Override + public void run() { + try { + previousConnectionWasUP = isConnectionUP; + + // try to send something + TCPmsgParser._fireonTCPConnectionStatusEvent(isConnectionUP, previousConnectionWasUP); + } catch (Exception e) { SM.Exception("TIMERException", e.toString()); } } }, 0, 3000); - + // get WiFi state ConnectivityManager connManager = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE); NetworkInfo mWifi = connManager.getNetworkInfo(ConnectivityManager.TYPE_WIFI); - if(mWifi.isConnectedOrConnecting()) + if (mWifi.isConnectedOrConnecting()) isWiFiOn = true; - + IntentFilter intentFilter = new IntentFilter(); intentFilter.addAction(WifiManager.NETWORK_STATE_CHANGED_ACTION); context.registerReceiver(mReceived, intentFilter); } - + @Override - public void run() - { - try - { - if(soc!=null) - soc.close(); - - soc = new Socket(); - soc.connect(new InetSocketAddress(serverHostname, port), 5000); - - //soc.setSoTimeout(3000); - //SM.Debug("Socket timeout:" + soc.getSoTimeout() ); - //soc.setSoTimeout(5000); - - input = new DataInputStream(soc.getInputStream()); - output = new DataOutputStream(soc.getOutputStream()); - - //recv= new BufferedReader(new InputStreamReader(soc.getInputStream())); - //writer =new PrintWriter(soc.getOutputStream()) ; - - - if(soc !=null) { - //previousConnectionWasUP = isConnectionUP; - isConnectionUP = true; - triggerTCPConnectionStateEvent(); - } - - } - catch (UnknownHostException e) - { - SM.Debug("UnknownHostException", "TCPhandler break:"+e.toString()); - } - catch (IllegalArgumentException e) - { - SM.Debug("IllegalArgumentException", "TCPhandler break:"+e.toString()); - } - catch (IOException e) - { - SM.Debug("IOException", "TCPhandler break:"+e.toString()); + public void run() { + try { + if (soc != null) + soc.close(); + + soc = new Socket(); + soc.connect(new InetSocketAddress(serverHostname, port), 5000); + + input = new DataInputStream(soc.getInputStream()); + output = new DataOutputStream(soc.getOutputStream()); + + if (soc != null) { + isConnectionUP = true; + triggerTCPConnectionStateEvent(); } - - while(alive) - { - //SM.Debug("Waiting for data..."); + + } catch (UnknownHostException e) { + SM.Debug("UnknownHostException", "TCPhandler break:" + e.toString()); + } catch (IllegalArgumentException e) { + SM.Debug("IllegalArgumentException", "TCPhandler break:" + e.toString()); + } catch (IOException e) { + SM.Debug("IOException", "TCPhandler break:" + e.toString()); + } + + while (alive) { try { Thread.sleep(3000); } catch (InterruptedException e) { - SM.Debug("TCPhandler Crash1 on sleep:"+e.toString()); + SM.Debug("TCPhandler Crash1 on sleep:" + e.toString()); } - - while(isConnectionUP) - { - try - { - Thread.sleep(100); - //SM.Debug("Waiting for data..."); - //process leftover - try - { - boolean FinishLeftOver =true; - while (FinishLeftOver) - { - // add this replacement if message length doesn't contain the last # - // leftOver = leftOver.replace("##", "#"); - String[] tempArr2 = leftOver.split("#"); - if (tempArr2.length > 1) - { - int messLen; - try - { - messLen = Integer.parseInt(tempArr2[1]); - - //TODO talk to Gaby to fix this on Bridge - - } - catch (Exception e) - { - SM.Debug("leftovers", "incorect msg len leftOver =" + tempArr2[1]); - messLen =-1; - } - - if(messLen>leftOver.length()) - { - FinishLeftOver =false; - break; - } - else if(messLen==leftOver.length()) - { - TCPmsg msg = new TCPmsg(leftOver.toCharArray()); - SM.Debug("leftovers", "RX from leftOver:"+msg.allData); - - if(msg.allData.contains("#92#")) - prioritizePongReceived(); - - msgList.add(msg); - leftOver =""; - FinishLeftOver =false; - break; - } - else // we have more message in leftover - { - TCPmsg msg = new TCPmsg(leftOver.substring(0,messLen).toCharArray()); - SM.Debug("leftovers", "RX from leftOver:"+msg.allData); - - if(msg.allData.contains("#92#")) - prioritizePongReceived(); - - msgList.add(msg); - leftOver = leftOver.substring(messLen,leftOver.length()); - } - } - else FinishLeftOver = false; - } - } - catch (Exception e) - { - SM.Debug("leftovers", "Error on process leftover"+e.toString()); - } + + while (Boolean.TRUE.equals(isConnectionUP)) { + try { + Thread.sleep(100); + //process leftover + try { + boolean FinishLeftOver = true; + while (FinishLeftOver) { + String[] tempArr2 = leftOver.split("#"); + if (tempArr2.length > 1) { + int messLen; + try { + messLen = Integer.parseInt(tempArr2[1]); + } catch (Exception e) { + SM.Debug("leftovers", "incorect msg len leftOver =" + tempArr2[1]); + messLen = -1; + } + + if (messLen > leftOver.length()) { + FinishLeftOver = false; + break; + } else if (messLen == leftOver.length()) { + TCPmsg msg = new TCPmsg(leftOver.toCharArray()); + SM.Debug("leftovers", "RX from leftOver:" + msg.allData); + + if (msg.allData.contains("#92#")) + prioritizePongReceived(); + + msgList.add(msg); + leftOver = ""; + FinishLeftOver = false; + break; + } else // we have more message in leftover + { + TCPmsg msg = new TCPmsg(leftOver.substring(0, messLen).toCharArray()); + SM.Debug("leftovers", "RX from leftOver:" + msg.allData); + + if (msg.allData.contains("#92#")) + prioritizePongReceived(); + + msgList.add(msg); + leftOver = leftOver.substring(messLen, leftOver.length()); + } + } else FinishLeftOver = false; + } + } catch (Exception e) { + SM.Debug("leftovers", "Error on process leftover" + e.toString()); + } //end process leftover - - String data =""; - n=0; - //char[] buf = new char[1024]; - //n = recv.read(buf); - + + String data = ""; + n = 0; + byte[] buf = new byte[1024]; // read data into buffer n = input.read(buf); //connection closed by server - if(n==-1) - { + if (n == -1) { SM.Debug("TCP Client", "Connection closed by server!"); soc.close(); - //previousConnectionWasUP = isConnectionUP; isConnectionUP = false; triggerTCPConnectionStateEvent(); soc = null; break; } - - - byte[] temp = new byte[n]; - for(int i=0;i1) // avoid case with only one # - { - data = leftOver+data; - leftOver = ""; - } - - //search for overflow message - String[] tempArr = data.split("#"); - if ((tempArr.length == 0) || (tempArr.length == 1)) - { - SM.Debug("TCP Client", "incorect messagebuss message=" + data); - continue; - } - //get msg len - // for(int i=0;i= 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)) { + SM.Debug("TCP Client", "incorect messagebuss message=" + data); + continue; + } + //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; - } - //messLen not int - if(messLen == -1) - { - //SM.Debug("messLen not int=" + messLen +" tempArr[1]:" +tempArr[1]); - continue; - } - char[] temMSG = data.toCharArray(); - //SM.Debug("MessLen:"+messLen+" Data len:"+data.length()+"IF:"+(data.length() != messLen)); - if (data.length() != messLen) - { - //if expected string message is smaller then actual string then exit processing; - if(messLen>data.length()) - //if(messLen>n) - { - //SM.Debug("duda","messLen=" + messLen +" data.length():" +data.length()+"n:"+n); - leftOver = data; // Add by bigu - continue; - } - //perform cut - //SM.Debug("We got leftover ....message length("+messLen+") != actual length("+data.length()+")"); - temMSG = data.substring(0,messLen).toCharArray(); - //SM.Debug("temMSG:"+temMSG.toString()); - leftOver = data.substring(messLen,data.length()); - //SM.Debug("leftOver:"+leftOver); - //leftOver = data.substring(messLen,n); - //SM.Debug("left over string:"+leftOver); - } + } + //messLen not int + if (messLen == -1) { + continue; + } + char[] temMSG = data.toCharArray(); + if (data.length() != messLen) { + if (messLen > data.length()) { + leftOver = data; // Add by bigu + continue; + } + //perform cut + temMSG = data.substring(0, messLen).toCharArray(); + leftOver = data.substring(messLen, data.length()); + } //decode TCP msg TCPmsg msg = new TCPmsg(temMSG); - + SM.Debug("������� RX �������", msg.allData); - - if(msg.allData.contains("#92#")) + + if (msg.allData.contains("#92#")) prioritizePongReceived(); - + msgList.add(msg); - - } - catch(Exception ex) - { - SM.Debug("TCPHandler", "TCPhandler/run/break:"+ex.toString()); - //previousConnectionWasUP = isConnectionUP; + + } catch (Exception ex) { + SM.Debug("TCPHandler", "TCPhandler/run/break:" + ex.toString()); isConnectionUP = false; triggerTCPConnectionStateEvent(); } - }//while(connOK) - - + } + + // try { Thread.sleep(1000); } catch (InterruptedException e) { - SM.Debug("TCPhandler Crash2 on sleep:"+e.toString()); - //previousConnectionWasUP = isConnectionUP; + SM.Debug("TCPhandler Crash2 on sleep:" + e.toString()); } - + //try to restart connection - if(alive && isWiFiOn) - RestartTCP(); - - }//while(alive) + if (alive && isWiFiOn) + restartTCP(); + + } SM.Debug("=================================="); SM.Debug("TCP listenThread stoped!! alive = false"); SM.Debug("=================================="); } - - + + /** - * Create a bypass in order to trigger the ping received event + * Create a bypass in order to trigger the ping received event */ private void prioritizePongReceived() { TCPmsgParser._firePONGReceivedEvent(); } - - + + /* Broadcast Received for WiFi Connect/Disconnect */ public BroadcastReceiver mReceived = new BroadcastReceiver() { - + @Override public void onReceive(Context context, Intent intent) { - final String action = intent.getAction(); - SM.Debug("WIFI STATE", action); - - if(action.equals(WifiManager.NETWORK_STATE_CHANGED_ACTION)){ - NetworkInfo info = intent.getParcelableExtra(WifiManager.EXTRA_NETWORK_INFO); - // close socket if the wifi is disconnecting or disconnected - if(!info.isConnectedOrConnecting()) { - closeSocket(); - isWiFiOn = false; - } - else - isWiFiOn = true; - } + final String action = intent.getAction(); + SM.Debug("WIFI STATE", action); + + if (action.equals(WifiManager.NETWORK_STATE_CHANGED_ACTION)) { + NetworkInfo info = intent.getParcelableExtra(WifiManager.EXTRA_NETWORK_INFO); + // close socket if the wifi is disconnecting or disconnected + if (!info.isConnectedOrConnecting()) { + closeSocket(); + isWiFiOn = false; + } else + isWiFiOn = true; + } } }; - - - - /** Send a message through the TCP Socket + + + /** + * 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 + * @param msg The messages which will be sent * @return True if the message was sent */ - public boolean Write(String seqID, String msg) - { - - try - { - - /* - if(writer != null) - { - String cmdok = "#" + seqID + msg; - Integer tmp = cmdok.length() + 1; - //SM.Debug("tmp:"+tmp); - - tmp += Integer.toString(tmp).length();// tmp.ToString().Length; - if((tmp==10)||(tmp==100)||(tmp==1000)) tmp++; - cmdok = "#" + Integer.toString(tmp) + cmdok; - writer.write(encryptTEA(cmdok)); - writer.flush(); - SM.Debug("TX:"+encryptTEA(cmdok)); - return true; - }*/ - - if(output != null) - { + public boolean Write(String seqID, String msg) { + try { + if (output != null) { try { Thread.sleep(10); - String cmdok = "#" + seqID + msg; - Integer tmp = cmdok.length() + 1; - //SM.Debug("tmp:"+tmp); + String cmdok = "#" + seqID + msg; + Integer tmp = cmdok.length() + 1; - tmp += Integer.toString(tmp).length();// tmp.ToString().Length; - if((tmp==10)||(tmp==100)||(tmp==1000)) tmp++; + tmp += Integer.toString(tmp).length(); + if ((tmp == 10) || (tmp == 100) || (tmp == 1000)) tmp++; cmdok = "#" + Integer.toString(tmp) + cmdok; byte[] mess = encryptTEA(cmdok); - - - output.write(mess); - output.flush(); - - // show only notACK messages - //if(mess[3] != 0x0C) + Thread gfgThread = new Thread(() -> { + try { + output.write(mess); + output.flush(); + } catch (Exception e) { + e.printStackTrace(); + } + }); + + gfgThread.start(); + + SM.Debug(" ", new String(mess)); return true; + //} catch (IOException e) { + // SM.Exception("TCPClient[Send]", e.toString()); + } catch (InterruptedException e) { + SM.Exception("TCPClient[Send]", e.toString()); + } catch (NoSuchElementException e) { + SM.Exception("TCPClient[Send]", e.toString()); } - catch (IOException e) { - //e.printStackTrace(); - SM.Exception("TCPClient[Send]", e.toString()); - } catch (InterruptedException e) { - SM.Exception("TCPClient[Send]", e.toString()); - } catch (NoSuchElementException e) { - SM.Exception("TCPClient[Send]", e.toString()); - } - } - else - { + } else { return false; } - } - catch (Exception e) - { - SM.Debug("TCPhandler Write Procedure:"+e.toString()); + } catch (Exception e) { + SM.Debug("TCPhandler Write Procedure:" + e.toString()); } return false; } - - + + + + public void setConnectionIsDown() { - if(input != null) { + if (input != null) { try { input.close(); } catch (IOException e) { - } - finally { + } finally { input = null; } } - + isConnectionUP = false; } - - /* Encrypt a string using an encryption algorithm, + + /* Encrypt a string using an encryption algorithm, * in this case TEA */ public static byte[] encryptTEA(String toEncryptData) { byte[] encryptedByteArray = new byte[]{}; - - /* - //encrypt message using TEA - try { - encryptedByteArray = TEA.encrypt(toEncryptData); - } catch (UnsupportedEncodingException e) { - SM.Exception("encryptTEA Exception(UEE): " + e.toString()); - } catch (IndexOutOfBoundsException e) { - SM.Exception("encryptTEA Exception(IOoBE): " + e.toString()); - } catch (NullPointerException e) { - SM.Exception("encryptTEA Exception(NPE): " + e.toString()); - } - //*/ - + // no encryption encryptedByteArray = toEncryptData.getBytes(); - + return encryptedByteArray; } - - /* Decrypt a string using an encryption algorithm, + + /* Decrypt a string using an encryption algorithm, * in this case TEA */ public static byte[] decryptTEA(byte[] toDecryptData) { byte[] decryptedByteArray = new byte[]{}; - /* - String sm = ""; - for(int i=0; i { + 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 - { + } else { SM.Debug("Cannot play sound playDev NOT init corectly"); } } } - - 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/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..21dfec9 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,352 @@ 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 = (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, getAllRecordings(), 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(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) { + if (rec.typeID == 1 && rec.subID == AppParams.USERID) + getAllRecordings().add(rec); + else if (rec.typeID != 1) + 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, context, 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..1b9a4fc 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; @@ -632,7 +630,7 @@ 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"; @@ -657,7 +655,7 @@ public class TabLayoutActivity extends AbstractSDParentActivity { rec.startGMT = rec.endGMT - 3; listRecordings.add(rec); rec.type = 103; - getRecordingsActivity().UpdateRecordings(listRecordings); + getRecordingsActivity().updateRecordings(listRecordings); } } }); @@ -1047,7 +1045,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()); } @@ -1370,7 +1368,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 +1576,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); } -- 2.37.1 From 3f96055a6e4cee36a5844536c81aa930b9203985 Mon Sep 17 00:00:00 2001 From: Bogdan Date: Wed, 30 Mar 2022 10:34:57 +0300 Subject: [PATCH 2/3] SD-211 - show all recordings and play them --- .../adapters/RecordingsGridViewAdapter.java | 62 ++--- .../database/DatabaseCommunication.java | 6 +- .../java/com/safemobile/lib/RecordMSG.java | 61 +++-- .../java/com/safemobile/lib/Recording.java | 18 +- .../com/safemobile/services/TCPhandler.java | 11 +- safeDispatch/src/main/AndroidManifest.xml | 1 - .../com/safemobile/lib/sound/AudioHandle.java | 6 +- .../safemobile/lib/sound/RecordingHandle.java | 4 +- .../safemobile/lib/sound/TCPaudioClient.java | 241 ++++++++---------- .../safedispatch/RecordingsActivity.java | 19 +- .../safedispatch/TabLayoutActivity.java | 98 +++++-- .../src/main/res/layout/dialog_login.xml | 6 +- 12 files changed, 283 insertions(+), 250 deletions(-) diff --git a/libSafeMobile/src/main/java/com/safemobile/adapters/RecordingsGridViewAdapter.java b/libSafeMobile/src/main/java/com/safemobile/adapters/RecordingsGridViewAdapter.java index d626ec5..2a97ae8 100644 --- a/libSafeMobile/src/main/java/com/safemobile/adapters/RecordingsGridViewAdapter.java +++ b/libSafeMobile/src/main/java/com/safemobile/adapters/RecordingsGridViewAdapter.java @@ -1,7 +1,6 @@ package com.safemobile.adapters; import android.app.Activity; -import android.content.Context; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; @@ -11,7 +10,6 @@ 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.SM; @@ -27,14 +25,12 @@ public class RecordingsGridViewAdapter extends BaseAdapter { private final ArrayList recordingExists; private final ArrayList playingPositions; private final Activity activity; - private final Context context; private final Hashtable hash = new Hashtable<>(); - public RecordingsGridViewAdapter(Activity activity, Context context, ArrayList listRecordings, ArrayList recordingExists) { + public RecordingsGridViewAdapter(Activity activity, ArrayList listRecordings, ArrayList recordingExists) { super(); this.activity = activity; - this.context = context; this.listRecordings = listRecordings; this.recordingExists = recordingExists; @@ -129,12 +125,12 @@ public class RecordingsGridViewAdapter extends BaseAdapter { if (convertView == null) { view = new ViewHolder(); convertView = layoutInflater.inflate(R.layout.row_recordings, null); - view.setLayoutRecording((LinearLayout) convertView.findViewById(R.id.layoutRecording)); - view.setImageViewPlay((ImageView) convertView.findViewById(R.id.imageViewPlay)); - view.setTextViewSender((TextView) convertView.findViewById(R.id.textViewSender)); - view.setTextViewDuration((TextView) convertView.findViewById(R.id.textViewDuration)); - view.setTextViewDate((TextView) convertView.findViewById(R.id.textViewDate)); - view.setImageViewRecycle((ImageView) convertView.findViewById(R.id.imageViewRecycle)); + 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 { @@ -155,25 +151,25 @@ public class RecordingsGridViewAdapter extends BaseAdapter { } /* 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.getImageViewPlay().setImageResource(R.drawable.call_received_all); - else - view.getImageViewPlay().setImageResource(R.drawable.call_made_all); + 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 AppParams.PrivateCall: - if (listRecordings.get(position).destinationRadioID == 0) - view.getImageViewPlay().setImageResource(R.drawable.call_received); - else - view.getImageViewPlay().setImageResource(R.drawable.call_made); + case 2: + view.getImageViewPlay().setImageResource(R.drawable.call_made_all); break; - case AppParams.GroupCall: - if (listRecordings.get(position).destinationRadioID == 0) - view.getImageViewPlay().setImageResource(R.drawable.call_received_group); - else - view.getImageViewPlay().setImageResource(R.drawable.call_made_group); + 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); @@ -193,14 +189,8 @@ public class RecordingsGridViewAdapter extends BaseAdapter { ((AbstractRecordingsActivity) activity).deleteSelected(position); }); - // set recording image - if (getItem(position).NameForDisplay.equals(AppParams.USERNAME)) - view.getImageViewPlay().setImageDrawable(context.getResources().getDrawable(R.drawable.call_made_group)); - else - view.getImageViewPlay().setImageDrawable(context.getResources().getDrawable(R.drawable.call_received_group)); - - view.getTextViewSender().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(); 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 f9416d4..bc89785 100644 --- a/libSafeMobile/src/main/java/com/safemobile/services/TCPhandler.java +++ b/libSafeMobile/src/main/java/com/safemobile/services/TCPhandler.java @@ -293,7 +293,7 @@ public class TCPhandler implements Runnable { /** * 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 * @return True if the message was sent */ @@ -310,7 +310,7 @@ public class TCPhandler implements Runnable { cmdok = "#" + Integer.toString(tmp) + cmdok; byte[] mess = encryptTEA(cmdok); - Thread gfgThread = new Thread(() -> { + Thread tcpThread = new Thread(() -> { try { output.write(mess); output.flush(); @@ -319,15 +319,14 @@ public class TCPhandler implements Runnable { } }); - gfgThread.start(); + tcpThread.start(); SM.Debug(" ", new String(mess)); return true; - //} catch (IOException e) { - // SM.Exception("TCPClient[Send]", e.toString()); } catch (InterruptedException e) { SM.Exception("TCPClient[Send]", e.toString()); + Thread.currentThread().interrupt(); } catch (NoSuchElementException e) { SM.Exception("TCPClient[Send]", e.toString()); } @@ -335,7 +334,7 @@ public class TCPhandler implements Runnable { return false; } } catch (Exception e) { - SM.Debug("TCPhandler Write Procedure:" + e.toString()); + SM.Debug("TCPhandler Write Procedure:" + e); } return false; } 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 844fd86..eaee66b 100644 --- a/safeDispatch/src/main/java/com/safemobile/lib/sound/RecordingHandle.java +++ b/safeDispatch/src/main/java/com/safemobile/lib/sound/RecordingHandle.java @@ -13,7 +13,7 @@ public class RecordingHandle { public RecordingHandle(String ip) { try { final int RECORDING_PORT = 50003; - TCPaudioClient tcp = new TCPaudioClient(ip, RECORDING_PORT); + 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 @@ -36,7 +36,7 @@ public class RecordingHandle { playDev.write(data, 0, data.length); playDev.play(); } else { - SM.Debug("Cannot play sound playDev NOT init corectly"); + SM.Debug("Cannot play sound playDev NOT init correctly"); } } } diff --git a/safeDispatch/src/main/java/com/safemobile/lib/sound/TCPaudioClient.java b/safeDispatch/src/main/java/com/safemobile/lib/sound/TCPaudioClient.java index 6ffb8a1..81d09f0 100644 --- a/safeDispatch/src/main/java/com/safemobile/lib/sound/TCPaudioClient.java +++ b/safeDispatch/src/main/java/com/safemobile/lib/sound/TCPaudioClient.java @@ -8,140 +8,108 @@ 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; +public class TcpAudioClient implements Runnable { + private boolean alive = true; + + private String serverHostname; + private final int port; private Thread listenThread; - private Socket soc =null; - + private Socket soc = null; + private InputStream recv; private OutputStream writer; - private volatile int n=0; - - public Boolean connOK=false; + private 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"); + 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(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()); + 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) - { + + while (alive) { try { Thread.sleep(3000); } catch (InterruptedException e) { - // TODO Auto-generated catch block SM.Debug(e.toString()); + Thread.currentThread().interrupt(); } - while(connOK) - { - try - { - buffer = new byte[16384]; - n = recv.read(buffer); - if(n==-1) + while (Boolean.TRUE.equals(getConnOK())) { + try { + buffer = new byte[16384]; + int n = recv.read(buffer); + if (n == -1) break; - _fireDataArrived(buffer,n); + fireDataArrived(buffer, n); + } catch (Exception ex) { + SM.Debug("break:" + ex); + setConnOK(false); } - 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()); + Thread.currentThread().interrupt(); } - if(alive)RestartTCP(); - }//while(alive) + + if (alive) restartTCP(); + } SM.Debug("=================================="); - SM.Debug("TCP listenThread stoped!! alive = false"); + 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); + + public boolean send(byte[] data, int len) { + + try { + + if (writer != null) { + writer.write(data, 0, len); return true; - } - else - { + } else { return false; } - } - catch (Exception e) - { - // TODO Auto-generated catch block + } catch (Exception e) { 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()); + + 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); } } @@ -152,44 +120,55 @@ private boolean alive = true; public void setAlive(boolean alive) { this.alive = alive; } - - public void Stop() - { - + + public void stop() { + this.alive = false; - if(soc !=null) - { + if (soc != null) { try { soc.close(); soc = null; } catch (IOException e) { - // TODO Auto-generated catch block - SM.Debug("break:"+e.toString()); + SM.Debug("break:" + e); } - connOK = false; + setConnOK(false); } // stop thread - if(listenThread != null) - { - Thread moribund = listenThread; - listenThread = null; - moribund.interrupt(); - } + 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 ); + + public synchronized void addTCPListener(ITCPaudioLis l) { + listeners.add(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); - } + + 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/safedispatch/RecordingsActivity.java b/safeDispatch/src/main/java/com/safemobile/safedispatch/RecordingsActivity.java index 21dfec9..a13aba0 100644 --- a/safeDispatch/src/main/java/com/safemobile/safedispatch/RecordingsActivity.java +++ b/safeDispatch/src/main/java/com/safemobile/safedispatch/RecordingsActivity.java @@ -80,12 +80,12 @@ public class RecordingsActivity extends Activity { activity = this; // change tab header fontFace - TextView textView1 = (TextView) findViewById(R.id.textViewTitle); + TextView textView1 = 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, getAllRecordings(), playingPositions); + gridView = findViewById(R.id.gridViewRecordings); + adapter = new RecordingsGridViewAdapter(activity, getAllRecordings(), playingPositions); gridView.setAdapter(adapter); gridView.setOnItemClickListener(onItemClickListener); @@ -93,10 +93,10 @@ public class RecordingsActivity extends Activity { if (recHandle == null && !AppParams.DEMO) recHandle = new RecordingHandle(AppParams.IP); - textViewCount = (TextView) findViewById(R.id.textViewCount); + textViewCount = findViewById(R.id.textViewCount); updateNumberOfRecordings(); - textViewGateway = (TextView) findViewById(R.id.textViewGateway); + textViewGateway = findViewById(R.id.textViewGateway); textViewGateway.setTypeface(Typeface.createFromAsset(getAssets(), "Sketch_Block.ttf")); textViewGateway.setTextSize(24); textViewGateway.setOnClickListener(v -> { @@ -185,7 +185,7 @@ public class RecordingsActivity extends Activity { // if no recording is playing and not DEMO if (getPlayingPosition() < 0 && !AppParams.DEMO) { // send recording request to App Server - sendPlayRequest(getAllRecordings().get(position).ID); + sendPlayRequest(getAllRecordings().get(position).id); // flag that sound is needed recHandle.startSound(); recHandle.setSoundNeeded(true); @@ -272,10 +272,7 @@ public class RecordingsActivity extends Activity { public void updateRecordings(ArrayList list) { setAllRecordings(new ArrayList<>()); for (Recording rec : list) { - if (rec.typeID == 1 && rec.subID == AppParams.USERID) - getAllRecordings().add(rec); - else if (rec.typeID != 1) - getAllRecordings().add(rec); + getAllRecordings().add(rec); } myHandler.post(updateResultsRUN); } @@ -294,7 +291,7 @@ public class RecordingsActivity extends Activity { for (int i = 0; i < getAllRecordings().size(); i++) playingPositions.add(true); // set adapter - where playingPositions stores exists values - adapter = new RecordingsGridViewAdapter(activity, context, getAllRecordings(), playingPositions); + adapter = new RecordingsGridViewAdapter(activity, getAllRecordings(), playingPositions); // playing positions need to be false because no recording is played playingPositions.clear(); diff --git a/safeDispatch/src/main/java/com/safemobile/safedispatch/TabLayoutActivity.java b/safeDispatch/src/main/java/com/safemobile/safedispatch/TabLayoutActivity.java index 1b9a4fc..4a3a056 100644 --- a/safeDispatch/src/main/java/com/safemobile/safedispatch/TabLayoutActivity.java +++ b/safeDispatch/src/main/java/com/safemobile/safedispatch/TabLayoutActivity.java @@ -47,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; @@ -402,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); @@ -633,7 +634,7 @@ public class TabLayoutActivity extends AbstractSDParentActivity { 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; @@ -641,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; @@ -649,7 +650,7 @@ 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; @@ -1004,8 +1005,6 @@ public class TabLayoutActivity extends AbstractSDParentActivity { moribund.interrupt(); } - this.unregisterReceiver(mReceiver); - // unbound from tcp service if (isBound) { getApplicationContext().unbindService(serviceConnection); @@ -1359,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) { @@ -1610,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) @@ -1717,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 + ""); @@ -2322,4 +2378,10 @@ public class TabLayoutActivity extends AbstractSDParentActivity { this.startActivity(intent); } } + + @Override + protected void onDestroy() { + super.onDestroy(); + this.unregisterReceiver(mReceiver); + } } diff --git a/safeDispatch/src/main/res/layout/dialog_login.xml b/safeDispatch/src/main/res/layout/dialog_login.xml index 681d913..95b8f57 100644 --- a/safeDispatch/src/main/res/layout/dialog_login.xml +++ b/safeDispatch/src/main/res/layout/dialog_login.xml @@ -11,7 +11,7 @@ android:paddingTop="2dp" android:text="TITLE" android:textAppearance="?android:attr/textAppearanceLarge" - android:textColor="#FFFFFF" + android:textColor="@color/black" /> -- 2.37.1 From 3935b3ad0ba87340bed5974752354f4814ecc063 Mon Sep 17 00:00:00 2001 From: Bogdan Date: Wed, 30 Mar 2022 11:19:33 +0300 Subject: [PATCH 3/3] SD-211 - fix file rename issue after merge --- .../lib/sound/{TCPaudioClient.java => TcpAudioClient.java} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename safeDispatch/src/main/java/com/safemobile/lib/sound/{TCPaudioClient.java => TcpAudioClient.java} (100%) diff --git a/safeDispatch/src/main/java/com/safemobile/lib/sound/TCPaudioClient.java b/safeDispatch/src/main/java/com/safemobile/lib/sound/TcpAudioClient.java similarity index 100% rename from safeDispatch/src/main/java/com/safemobile/lib/sound/TCPaudioClient.java rename to safeDispatch/src/main/java/com/safemobile/lib/sound/TcpAudioClient.java -- 2.37.1