package com.integreight.onesheeld.shields.fragments; import android.os.Bundle; import android.support.annotation.Nullable; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.view.ViewTreeObserver; import android.widget.RelativeLayout; import android.widget.RelativeLayout.LayoutParams; import android.widget.TextView; import android.widget.Toast; import com.integreight.onesheeld.R; import com.integreight.onesheeld.shields.ShieldFragmentParent; import com.integreight.onesheeld.shields.controller.SpeechRecognitionShield; import com.integreight.onesheeld.shields.controller.utils.SpeechRecognition.RecognitionEventHandler; import com.integreight.onesheeld.utils.customviews.OneSheeldTextView; import java.util.List; public class SpeechRecognitionFragment extends ShieldFragmentParent<SpeechRecognitionFragment> { View statusCircle; OneSheeldTextView statusHint, recognizedResult; TextView rmsIndicator; RelativeLayout.LayoutParams params; int stepValue = 0; int marginValue; public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { return inflater.inflate(R.layout.voice_recognition_shield_fragment_view, container, false); } @Override public void doOnViewCreated(View v, @Nullable Bundle savedInstanceState) { statusCircle = v.findViewById(R.id.statusCircle); statusHint = (OneSheeldTextView) v.findViewById(R.id.statusHint); rmsIndicator = (TextView) v.findViewById(R.id.rmsLevelIndicator); recognizedResult = (OneSheeldTextView) v .findViewById(R.id.recognizedResult); params = (LayoutParams) rmsIndicator.getLayoutParams(); statusCircle.getViewTreeObserver().addOnGlobalLayoutListener( new ViewTreeObserver.OnGlobalLayoutListener() { @Override public void onGlobalLayout() { if (stepValue == 0) stepValue = statusCircle.getHeight() / 10; } }); } @Override public void doOnStart() { ((SpeechRecognitionShield) getApplication().getRunningShields().get( getControllerTag())) .setEventHandler(speechRecognitionEventHandler); statusCircle.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View arg0) { ((SpeechRecognitionShield) getApplication().getRunningShields() .get(getControllerTag())).startRecognizer(); } }); } private RecognitionEventHandler speechRecognitionEventHandler = new RecognitionEventHandler() { @Override public void onResult(final List<String> result) { uiHandler.post(new Runnable() { @Override public void run() { if (canChangeUI()) { setOff(); if (result.size() > 0) recognizedResult.setText(result.get(0) .toLowerCase()); } } }); } @Override public void onReadyForSpeach(Bundle params) { if (canChangeUI()) { uiHandler.post(new Runnable() { @Override public void run() { if (canChangeUI()) { recognizedResult.setText(""); setON(); } } }); } } @Override public void onError(final String error, int errorCode) { uiHandler.post(new Runnable() { @Override public void run() { if (canChangeUI()) { setOff(); Toast.makeText(activity, error, Toast.LENGTH_LONG) .show(); } } }); } @Override public void onEndOfSpeech() { if (canChangeUI()) { uiHandler.post(new Runnable() { @Override public void run() { // recognizedResult.setText(""); setOff(); } }); } } @Override public void onBeginingOfSpeech() { if (canChangeUI()) { uiHandler.post(new Runnable() { @Override public void run() { recognizedResult.setText(""); setON(); } }); } } @Override public void onRmsChanged(final float rmsdB) { uiHandler.removeCallbacksAndMessages(null); uiHandler.post(new Runnable() { @Override public void run() { marginValue = (int) (stepValue * (rmsdB > 10 ? 10 : rmsdB)); params.bottomMargin = marginValue < 0 ? 0 : marginValue; rmsIndicator.requestLayout(); } }); } }; private void setOff() { rmsIndicator.setVisibility(View.INVISIBLE); statusCircle.setBackgroundColor(getResources().getColor( R.color.voice_rec_circle_red)); statusHint.setText(R.string.voice_recognizer_tap_to_speak_button); } private void setON() { rmsIndicator.setVisibility(View.VISIBLE); statusCircle.setBackgroundColor(getResources().getColor( R.color.voice_rec_circle_green)); statusHint.setText(R.string.voice_recognizer_speak); } private void initializeFirmata() { if (getApplication().getRunningShields().get(getControllerTag()) == null) { getApplication().getRunningShields().put(getControllerTag(), new SpeechRecognitionShield(activity, getControllerTag())); } } @Override public void doOnServiceConnected() { initializeFirmata(); } }