package de.tu.darmstadt.seemoo.ansian.gui.views.morse; import android.content.Context; import android.graphics.Color; import android.text.Editable; import android.text.SpannableString; import android.text.TextWatcher; import android.text.style.BackgroundColorSpan; import android.util.AttributeSet; import android.view.LayoutInflater; import android.widget.EditText; import android.widget.TextView.BufferType; import de.greenrobot.event.EventBus; import de.greenrobot.event.Subscribe; import de.tu.darmstadt.seemoo.ansian.MainActivity; import de.tu.darmstadt.seemoo.ansian.R; import de.tu.darmstadt.seemoo.ansian.control.events.morse.MorseCharPlayedEvent; import de.tu.darmstadt.seemoo.ansian.control.events.morse.MorseEditTextEvent; import de.tu.darmstadt.seemoo.ansian.control.events.morse.MorseSendEvent; import de.tu.darmstadt.seemoo.ansian.model.preferences.Preferences; import de.tu.darmstadt.seemoo.ansian.tools.morse.Decoder; import de.tu.darmstadt.seemoo.ansian.tools.morse.Encoder; import de.tu.darmstadt.seemoo.ansian.tools.morse.MorsePlayer; /** * This view bunches all the sensor data in a compact view with a picture for * understanding in the layout. * * @author Markus * */ public class MorseSendingView extends MyMorseView { private EditText morseTextField; private EditText morseCodeField; private Decoder morseDecoder; private Encoder morseEncoder; private String morseCodeTemp; protected boolean updating = false; private static MorsePlayer player; public MorseSendingView(Context context) { super(context); } public MorseSendingView(Context context, AttributeSet attrs) { super(context, attrs); } public MorseSendingView(Context context, AttributeSet attrs, int defaultStyle) { super(context, attrs, defaultStyle); } protected void init() { morseDecoder = new Decoder(); morseEncoder = new Encoder(); LayoutInflater inflater = (LayoutInflater) getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE); inflater.inflate(R.layout.morse_sending_view, this); morseCodeField = (EditText) findViewById(R.id.morseCode); morseCodeField.setTextColor(Color.WHITE); morseTextField = (EditText) findViewById(R.id.morseText); morseTextField.setTextColor(Color.WHITE); morseCodeField.addTextChangedListener(new TextWatcher() { @Override public void onTextChanged(CharSequence s, int start, int before, int count) { // if(morseDecoder.decode(s.toString()).contains(MorseCodeCharacterGetter.ERROR_STRING)) // morseCodeField.setText(morseCodeField.getText().subSequence(0, // start)); } @Override public void beforeTextChanged(CharSequence s, int start, int count, int after) { } @Override public void afterTextChanged(Editable s) { updateMorseText(); } }); morseTextField.addTextChangedListener(new TextWatcher() { @Override public void onTextChanged(CharSequence s, int start, int before, int count) { } @Override public void beforeTextChanged(CharSequence s, int start, int count, int after) { } @Override public void afterTextChanged(Editable s) { updateMorseCode(); } }); MorseEditTextEvent event = EventBus.getDefault().getStickyEvent(MorseEditTextEvent.class); if (event != null) { morseTextField.setText(event.getText()); morseCodeTemp = event.getMorseCodeTemp(); updateMorseCode(); } } private void updateMorseText() { if (updating) return; updating = true; morseTextField.setText(morseDecoder.decode(morseCodeField.getText().toString())); updating = false; } private void updateMorseCode() { if (updating) return; updating = true; morseCodeField.setText(morseEncoder.encode(morseTextField.getText().toString())); updating = false; } public String getWPMStringRepresentation() { float wpm = Preferences.MORSE_PREFERENCE.getWPM(); if (wpm < 1) return "<1"; if (wpm > 20) return ">20"; return "" + (int) wpm; } @Subscribe public void onEvent(final MorseCharPlayedEvent event) { MainActivity.instance.runOnUiThread(new Runnable() { @Override public void run() { setMorseCodeHighlight(event.getCounter()); } }); } @Subscribe public void onEvent(final MorseSendEvent event) { MainActivity.instance.runOnUiThread(new Runnable() { @Override public void run() { if (event.isSending()) playMorse(); else stopMorse(); } }); } private void setMorseCodeHighlight(int index) { if (index < morseCodeTemp.length()) { SpannableString text = new SpannableString(morseCodeTemp); text.setSpan(new BackgroundColorSpan(Color.RED), index, index + 1, 0); // text.setSpan(new ForegroundColorSpan(Color.MAGENTA), index, // index+1, 0); morseCodeField.setText(text, BufferType.SPANNABLE); } else { morseCodeField.setText(morseCodeTemp); enable(Preferences.MORSE_PREFERENCE.isClearAfter()); } ; } private void disable() { // morseStateText.setText(R.string.morse_state_playing_sound); findViewById(R.id.morseLayout).requestFocus(); morseCodeField.setFocusableInTouchMode(false); morseTextField.setFocusableInTouchMode(false); } private void enable(boolean clear) { // morseStateText.setText(R.string.morse_state_user_input); morseCodeField.setFocusableInTouchMode(true); morseTextField.setFocusableInTouchMode(true); if (clear) morseTextField.setText(""); } protected void playMorse() { disable(); player = new MorsePlayer(); morseCodeTemp = morseCodeField.getText().toString(); player.execute(morseCodeTemp); setMorseCodeHighlight(0); } protected void stopMorse() { enable(false); morseCodeField.setText(morseCodeTemp); player.stop(); } @Override protected void onDetachedFromWindow() { EventBus.getDefault().postSticky(new MorseEditTextEvent(morseTextField.getText(), morseCodeTemp)); super.onDetachedFromWindow(); } @Override public void update() { // TODO Auto-generated method stub } }