package com.integreight.onesheeld.shields.fragments;
import android.content.Context;
import android.os.Build;
import android.os.Bundle;
import android.support.annotation.Nullable;
import android.text.format.DateFormat;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.view.inputmethod.InputMethodManager;
import android.widget.CompoundButton;
import android.widget.ListView;
import android.widget.ToggleButton;
import com.integreight.onesheeld.R;
import com.integreight.onesheeld.adapters.TerminalLinesAdapter;
import com.integreight.onesheeld.model.TerminalPrintedLine;
import com.integreight.onesheeld.shields.ShieldFragmentParent;
import com.integreight.onesheeld.shields.controller.TerminalShield;
import com.integreight.onesheeld.shields.controller.TerminalShield.TerminalHandler;
import com.integreight.onesheeld.utils.customviews.OneSheeldButton;
import com.integreight.onesheeld.utils.customviews.OneSheeldEditText;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.CopyOnWriteArrayList;
public class TerminalFragment extends ShieldFragmentParent<TerminalFragment> {
private ListView output;
private OneSheeldEditText inputField;
private OneSheeldButton send,copyAll;
private boolean endedWithNewLine = false;
private TerminalLinesAdapter outputAdapter;
private ToggleButton timeToggle, autoScrollingToggle;
public static String getTimeAsString() {
return DateFormat.format("MM/dd/yyyy hh:mm:ss", new java.util.Date())
.toString();
}
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
return inflater.inflate(R.layout.terminal_shield_fragment_layout,
container, false);
}
@Override
public void doOnViewCreated(final View v, @Nullable Bundle savedInstanceState) {
output = (ListView) v.findViewById(R.id.terminalOutput);
outputAdapter = new TerminalLinesAdapter(activity,
new ArrayList<TerminalPrintedLine>());
output.setAdapter(outputAdapter);
outputAdapter = (TerminalLinesAdapter) output.getAdapter();
inputField = (OneSheeldEditText) v.findViewById(R.id.terminalInput);
send = (OneSheeldButton) v.findViewById(R.id.send);
timeToggle = (ToggleButton) v.findViewById(R.id.toggleTime);
autoScrollingToggle = (ToggleButton) v
.findViewById(R.id.toggleAutoScrolling);
copyAll = (OneSheeldButton) v.findViewById(R.id.copy_all);
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.HONEYCOMB) {
copyAll.setVisibility(View.INVISIBLE);
}
timeToggle.setChecked(((TerminalShield) getApplication()
.getRunningShields().get(getControllerTag())).isTimeOn);
autoScrollingToggle.setChecked(((TerminalShield) getApplication()
.getRunningShields().get(getControllerTag())).isAutoScrolling);
timeToggle.setTypeface(getApplication().appFont);
autoScrollingToggle.setTypeface(getApplication().appFont);
timeToggle
.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
@Override
public void onCheckedChanged(CompoundButton buttonView,
boolean isChecked) {
((TerminalShield) getApplication().getRunningShields()
.get(getControllerTag())).isTimeOn = isChecked;
outputAdapter.isTimeOn = isChecked;
if (!TerminalLinesAdapter.isTextSelected)
outputAdapter.notifyDataSetChanged();
}
});
autoScrollingToggle
.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
@Override
public void onCheckedChanged(CompoundButton buttonView,
boolean isChecked) {
((TerminalShield) getApplication().getRunningShields()
.get(getControllerTag())).isAutoScrolling = isChecked;
}
});
v.findViewById(R.id.clearTerminal).setOnClickListener(
new View.OnClickListener() {
@Override
public void onClick(View arg0) {
outputAdapter
.updateLines(new ArrayList<TerminalPrintedLine>());
((TerminalShield) getApplication().getRunningShields()
.get(getControllerTag())).lastItemEndedWithNewLine = true;
((TerminalShield) getApplication().getRunningShields()
.get(getControllerTag())).tempLines = new CopyOnWriteArrayList<TerminalPrintedLine>();
((TerminalShield) getApplication().getRunningShields()
.get(getControllerTag())).terminalPrintedLines = new CopyOnWriteArrayList<TerminalPrintedLine>();
}
});
send.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View arg0) {
((TerminalShield) getApplication().getRunningShields().get(
getControllerTag())).input(inputField.getText()
.toString());
((TerminalShield) getApplication().getRunningShields().get(
getControllerTag())).terminalPrintedLines
.add(new TerminalPrintedLine((!endedWithNewLine ? "\n"
: "") + getTimeAsString() + " [TX] " + ": ",
inputField.getText().toString(), true, false));
((TerminalShield) getApplication().getRunningShields().get(
getControllerTag())).tempLines
.add(new TerminalPrintedLine((!endedWithNewLine ? "\n"
: "") + getTimeAsString() + " [TX] " + ": ",
((TerminalShield) getApplication()
.getRunningShields().get(
getControllerTag()))
.getEncodedString(inputField.getText()
.toString()), true, false));
((TerminalShield) getApplication().getRunningShields().get(
getControllerTag())).lastItemEndedWithNewLine = true;
outputAdapter
.updateLines(((TerminalShield) getApplication()
.getRunningShields().get(getControllerTag())).tempLines);
if (((TerminalShield) getApplication().getRunningShields().get(
getControllerTag())).tempLines.size() > 0
&& ((TerminalShield) getApplication()
.getRunningShields().get(getControllerTag())).isAutoScrolling)
output.setSelection(((TerminalShield) getApplication()
.getRunningShields().get(getControllerTag())).tempLines
.size() - 1);
endedWithNewLine = true;
inputField.setText("");
InputMethodManager imm = (InputMethodManager) activity
.getSystemService(Context.INPUT_METHOD_SERVICE);
imm.hideSoftInputFromWindow(inputField.getWindowToken(), 0);
}
});
copyAll.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
outputAdapter.copyAll();
}
});
int i = 0;
for (final int id : ((TerminalShield) getApplication()
.getRunningShields().get(getControllerTag())).encodingMths) {
final int x = i;
v.findViewById(id).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View vi) {
if (((TerminalShield) getApplication().getRunningShields()
.get(getControllerTag())).selectedEnMth != x) {
v.findViewById(
((TerminalShield) getApplication()
.getRunningShields().get(
getControllerTag())).encodingMths[((TerminalShield) getApplication()
.getRunningShields().get(
getControllerTag())).selectedEnMth])
.setBackgroundColor(
getResources()
.getColor(
R.color.arduino_conn_resetAll_bg));
v.findViewById(
((TerminalShield) getApplication()
.getRunningShields().get(
getControllerTag())).encodingMths[x])
.setBackgroundColor(
getResources().getColor(
R.color.arduinoPinsSelector));
((TerminalShield) getApplication().getRunningShields()
.get(getControllerTag())).selectedEnMth = x;
((TerminalShield) getApplication().getRunningShields()
.get(getControllerTag())).tempLines = new CopyOnWriteArrayList<TerminalPrintedLine>();
for (TerminalPrintedLine line : ((TerminalShield) getApplication()
.getRunningShields().get(getControllerTag())).terminalPrintedLines) {
((TerminalShield) getApplication()
.getRunningShields()
.get(getControllerTag())).tempLines
.add(new TerminalPrintedLine(
line.date,
((TerminalShield) getApplication()
.getRunningShields().get(
getControllerTag()))
.getEncodedString(line.print),
line.isEndedWithNewLine, line
.isRx()));
}
outputAdapter
.updateLines(((TerminalShield) getApplication()
.getRunningShields().get(
getControllerTag())).tempLines);
if (((TerminalShield) getApplication()
.getRunningShields().get(getControllerTag())).tempLines
.size() > 0
&& ((TerminalShield) getApplication()
.getRunningShields().get(
getControllerTag())).isAutoScrolling)
output.setSelection(((TerminalShield) getApplication()
.getRunningShields()
.get(getControllerTag())).tempLines.size() - 1);
}
}
});
i++;
}
}
@Override
public void doOnStart() {
if (getView() != null) {
getView().findViewById(
((TerminalShield) getApplication().getRunningShields().get(
getControllerTag())).encodingMths[0])
.setBackgroundColor(
getResources().getColor(
R.color.arduino_conn_resetAll_bg));
getView().findViewById(
((TerminalShield) getApplication().getRunningShields().get(
getControllerTag())).encodingMths[((TerminalShield) getApplication()
.getRunningShields().get(getControllerTag())).selectedEnMth])
.setBackgroundColor(
getResources().getColor(R.color.arduinoPinsSelector));
}
((TerminalShield) getApplication().getRunningShields().get(
getControllerTag())).setEventHandler(terminalHandler);
if (((TerminalShield) getApplication().getRunningShields().get(
getControllerTag())).terminalPrintedLines == null)
((TerminalShield) getApplication().getRunningShields().get(
getControllerTag())).terminalPrintedLines = new CopyOnWriteArrayList<>();
((TerminalShield) getApplication().getRunningShields().get(
getControllerTag())).tempLines = new CopyOnWriteArrayList<>();
for (TerminalPrintedLine line : ((TerminalShield) getApplication()
.getRunningShields().get(getControllerTag())).terminalPrintedLines) {
((TerminalShield) getApplication().getRunningShields().get(
getControllerTag())).tempLines.add(new TerminalPrintedLine(
line.date, ((TerminalShield) getApplication()
.getRunningShields().get(getControllerTag()))
.getEncodedString(line.print),
line.isEndedWithNewLine, line.isRx()));
}
outputAdapter.updateLines(((TerminalShield) getApplication()
.getRunningShields().get(getControllerTag())).tempLines);
if (((TerminalShield) getApplication().getRunningShields().get(
getControllerTag())).tempLines.size() > 0
&& ((TerminalShield) getApplication().getRunningShields().get(
getControllerTag())).isAutoScrolling)
output.setSelection(((TerminalShield) getApplication()
.getRunningShields().get(getControllerTag())).tempLines
.size() - 1);
outputAdapter.isTimeOn = ((TerminalShield) getApplication().getRunningShields().get(getControllerTag())).isTimeOn;
if (!TerminalLinesAdapter.isTextSelected)
outputAdapter.notifyDataSetChanged();
}
@Override
public void doOnPause() {
getAppActivity().hideSoftKeyboard();
}
TerminalHandler terminalHandler = new TerminalHandler() {
@Override
public void onPrint(final String outputTxt,
final boolean clearBeforeWriting) {
if (canChangeUI())
uiHandler.post(new Runnable() {
@SuppressWarnings("unchecked")
@Override
public void run() {
if (output != null && canChangeUI()) {
outputAdapter
.updateLines((List<TerminalPrintedLine>) ((TerminalShield) getApplication()
.getRunningShields().get(
getControllerTag())).tempLines
.clone());
if (((TerminalShield) getApplication()
.getRunningShields().get(getControllerTag())).tempLines
.size() > 0
&& ((TerminalShield) getApplication()
.getRunningShields().get(
getControllerTag())).isAutoScrolling)
output.setSelection(((TerminalShield) getApplication()
.getRunningShields()
.get(getControllerTag())).tempLines.size() - 1);
}
}
});
}
};
}