package com.integreight.onesheeld.adapters; import android.app.Activity; import android.content.ClipData; import android.content.ClipboardManager; import android.content.Context; import android.graphics.Color; import android.os.Build; import android.os.Handler; import android.view.LayoutInflater; import android.view.MotionEvent; import android.view.View; import android.view.ViewGroup; import android.widget.BaseAdapter; import android.widget.TextView; import android.widget.Toast; import com.integreight.onesheeld.R; import com.integreight.onesheeld.model.TerminalPrintedLine; import com.integreight.onesheeld.utils.customviews.OneSheeldTextView; import java.util.List; public class TerminalLinesAdapter extends BaseAdapter { Activity activity; List<TerminalPrintedLine> lines; LayoutInflater inflater; public boolean isTimeOn = true; public static boolean isTextSelected = false; private static String copyLine = ""; private Handler uiHandler; private Runnable copyRunnable; ClipboardManager clipboardManager = null; ClipData clipData = null; public TerminalLinesAdapter(Activity a, List<TerminalPrintedLine> lines) { this.activity = a; this.lines = lines; inflater = (LayoutInflater) activity .getSystemService(Context.LAYOUT_INFLATER_SERVICE); uiHandler = new Handler(); copyRunnable = new Runnable() { @Override public void run() { clipboardManager = (ClipboardManager) activity.getSystemService(Context.CLIPBOARD_SERVICE); if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) { if (!copyLine.equals("")) { clipboardManager.setPrimaryClip(ClipData.newPlainText("OneSheeldClipboard", copyLine)); Toast.makeText(activity.getApplicationContext(), R.string.terminal_line_copied_toast, Toast.LENGTH_SHORT).show(); }else Toast.makeText(activity.getApplicationContext(), R.string.terminal_couldnt_copy_empty_line_toast, Toast.LENGTH_SHORT).show(); } } }; } public int getCount() { return lines.size(); } public TerminalPrintedLine getItem(int position) { return lines.get(position); } public long getItemId(int position) { return position; } public void updateLines(List<TerminalPrintedLine> lines) { this.lines = lines; if (!isTextSelected) notifyDataSetChanged(); } @Override public View getView(final int position, View convertView, final ViewGroup parent) { View row = convertView; Holder holder = null; if (row == null) { row = inflater.inflate(R.layout.terminal_printed_line, parent, false); holder = new Holder(); holder.contScrollView = row.findViewById(R.id.terminal_line_scroll_view); holder.contTextContainer = row.findViewById(R.id.terminal_line_text_container); holder.dateX = (OneSheeldTextView) row.findViewById(R.id.dateX); holder.output = (OneSheeldTextView) row .findViewById(R.id.terminalOutput); holder.seperator = (TextView) row.findViewById(R.id.seperator); row.setTag(holder); } else { holder = (Holder) row.getTag(); } final TerminalPrintedLine line = lines.get(position); if (isTimeOn) { holder.dateX.setVisibility(View.VISIBLE); holder.dateX.setText(line.date); } else holder.dateX.setVisibility(View.GONE); holder.output.setText(line.print); holder.dateX.setClickable(false); holder.output.setClickable(false); if (line.isRx()) { holder.output.setTextColor(Color.GREEN); holder.dateX.setTextColor(Color.GREEN); } else { holder.output.setTextColor(Color.BLUE); holder.dateX.setTextColor(Color.BLUE); } final View textContainer = holder.contTextContainer; final View scrollContainer = holder.contScrollView; holder.contScrollView.setOnTouchListener(new View.OnTouchListener() { @Override public boolean onTouch(View v, MotionEvent event) { switch (event.getAction()) { case MotionEvent.ACTION_UP: case MotionEvent.ACTION_OUTSIDE: case MotionEvent.ACTION_CANCEL: if (isTextSelected) { textContainer.setBackgroundColor(Color.BLACK); scrollContainer.setBackgroundColor(Color.BLACK); isTextSelected = false; uiHandler.removeCallbacks(copyRunnable); } break; case MotionEvent.ACTION_DOWN: case MotionEvent.ACTION_POINTER_DOWN: if (!isTextSelected) { textContainer.setBackgroundColor(activity.getResources().getColor(R.color.arduino_conn_gray_bg)); scrollContainer.setBackgroundColor(activity.getResources().getColor(R.color.arduino_conn_gray_bg)); if (isTimeOn) copyLine = line.date+line.print; else copyLine = line.print; uiHandler.postDelayed(copyRunnable, 1500); isTextSelected = true; } break; default: //textContainer.setBackgroundColor(Color.BLACK); break; } return false; } }); ((ViewGroup) holder.output.getParent()).invalidate(); ((ViewGroup) holder.output.getParent().getParent()).invalidate(); return row; } private StringBuilder allLines; public void copyAll(){ if (!lines.isEmpty()) { allLines = new StringBuilder(""); if (isTimeOn){ for (int lineCounter = 0; lineCounter < lines.size(); lineCounter++) { allLines.append(lines.get(lineCounter).date+lines.get(lineCounter).print + "\n"); } }else { for (int lineCounter = 0; lineCounter < lines.size(); lineCounter++) { allLines.append(lines.get(lineCounter).print + "\n"); } } clipboardManager = (ClipboardManager) activity.getSystemService(Context.CLIPBOARD_SERVICE); if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) { clipboardManager.setPrimaryClip(ClipData.newPlainText("OneSheeldClipboard", new String(allLines))); Toast.makeText(activity.getApplicationContext(), R.string.terminal_lines_copied_toast, Toast.LENGTH_SHORT).show(); } } } static class Holder { View contScrollView; View contTextContainer; OneSheeldTextView dateX, output; TextView seperator; } }