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); }