Custom STT dialog
This commit is contained in:
		
							
								
								
									
										4
									
								
								.idea/assetWizardSettings.xml
									
									
									
										generated
									
									
									
								
							
							
						
						
									
										4
									
								
								.idea/assetWizardSettings.xml
									
									
									
										generated
									
									
									
								
							| @ -65,7 +65,7 @@ | |||||||
|                                 <PersistentState> |                                 <PersistentState> | ||||||
|                                   <option name="values"> |                                   <option name="values"> | ||||||
|                                     <map> |                                     <map> | ||||||
|                                       <entry key="url" value="jar:file:/C:/Program%20Files/Android/Android%20Studio/plugins/android/lib/android.jar!/images/material_design_icons/social/ic_share_black_24dp.xml" /> |                                       <entry key="url" value="jar:file:/C:/Program%20Files/Android/Android%20Studio/plugins/android/lib/android.jar!/images/material_design_icons/hardware/ic_keyboard_voice_black_24dp.xml" /> | ||||||
|                                     </map> |                                     </map> | ||||||
|                                   </option> |                                   </option> | ||||||
|                                 </PersistentState> |                                 </PersistentState> | ||||||
| @ -76,7 +76,7 @@ | |||||||
|                         <option name="values"> |                         <option name="values"> | ||||||
|                           <map> |                           <map> | ||||||
|                             <entry key="color" value="ffffff" /> |                             <entry key="color" value="ffffff" /> | ||||||
|                             <entry key="outputName" value="ic_share" /> |                             <entry key="outputName" value="ic_stt" /> | ||||||
|                             <entry key="sourceFile" value="C:\Users\adima" /> |                             <entry key="sourceFile" value="C:\Users\adima" /> | ||||||
|                           </map> |                           </map> | ||||||
|                         </option> |                         </option> | ||||||
|  | |||||||
| @ -4,7 +4,6 @@ import android.arch.lifecycle.ViewModelProviders | |||||||
| import android.content.ActivityNotFoundException | import android.content.ActivityNotFoundException | ||||||
| import android.content.Intent | import android.content.Intent | ||||||
| import android.os.Bundle | import android.os.Bundle | ||||||
| import android.speech.RecognitionListener |  | ||||||
| import android.speech.RecognizerIntent | import android.speech.RecognizerIntent | ||||||
| import android.speech.SpeechRecognizer | import android.speech.SpeechRecognizer | ||||||
| import android.speech.tts.TextToSpeech | import android.speech.tts.TextToSpeech | ||||||
| @ -13,7 +12,6 @@ import android.support.design.widget.Snackbar | |||||||
| import android.support.v7.app.AppCompatActivity | import android.support.v7.app.AppCompatActivity | ||||||
| import android.support.v7.app.AppCompatDelegate | import android.support.v7.app.AppCompatDelegate | ||||||
| import android.text.method.LinkMovementMethod | import android.text.method.LinkMovementMethod | ||||||
| import android.util.Log |  | ||||||
| import android.view.View | import android.view.View | ||||||
| import android.widget.Button | import android.widget.Button | ||||||
| import android.widget.ImageView | import android.widget.ImageView | ||||||
| @ -27,140 +25,23 @@ class MatchActivity : AppCompatActivity() { | |||||||
|     var textScore: android.widget.TextView? = null |     var textScore: android.widget.TextView? = null | ||||||
|     var textService: android.widget.TextView? = null |     var textService: android.widget.TextView? = null | ||||||
|     var buttons: Array<Button> = emptyArray() |     var buttons: Array<Button> = emptyArray() | ||||||
|     var imageViews: Array<ImageView?> = emptyArray() |     var imageViews: Array<ImageView> = emptyArray() | ||||||
|     var tts: TextToSpeech? = null |     var tts: TextToSpeech? = null | ||||||
|     var stt: SpeechRecognizer? = null |  | ||||||
|     var sttIntent: Intent? = null |  | ||||||
|  |  | ||||||
|     inner class WaitForTtsInit : TextToSpeech.OnInitListener { |     inner class WaitForTtsInit : TextToSpeech.OnInitListener { | ||||||
|         override fun onInit(status: Int) { |         override fun onInit(status: Int) { | ||||||
|             updateUI() |             updateUI() | ||||||
|             matchModel?.apply{ |  | ||||||
|                 if (sttEnabled) { |  | ||||||
|                     speakText( |  | ||||||
|                         getString( |  | ||||||
|                             R.string.STT_hint, |  | ||||||
|                             players[0].name, |  | ||||||
|                             players[1].name |  | ||||||
|                         ), |  | ||||||
|                         TextToSpeech.QUEUE_ADD |  | ||||||
|                     ) |  | ||||||
|                 } |  | ||||||
|             } |  | ||||||
|         } |         } | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     inner class WaitForTtsSpeak : UtteranceProgressListener() { |     inner class SttAfterTts : UtteranceProgressListener() { | ||||||
|         override fun onDone(id: String) { |         override fun onDone(id: String) { | ||||||
|             launchStt() |             SttDialog().show( supportFragmentManager, "SttDialog") | ||||||
|         } |         } | ||||||
|         override fun onStart(id: String) {} |         override fun onStart(id: String) {} | ||||||
|         override fun onError(id: String) {} |         override fun onError(id: String) {} | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     inner class SttListener : RecognitionListener { |  | ||||||
|         val LOG_TAG: String = "SttListener" |  | ||||||
|  |  | ||||||
|         override fun onBeginningOfSpeech() { |  | ||||||
|             Log.i(LOG_TAG, "onBeginningOfSpeech") |  | ||||||
|         } |  | ||||||
|  |  | ||||||
|         override fun onBufferReceived(buffer: ByteArray?) { |  | ||||||
|             Log.i(LOG_TAG, "onBufferReceived: $buffer"); |  | ||||||
|         } |  | ||||||
|  |  | ||||||
|         override fun onEndOfSpeech() { |  | ||||||
|             Log.i(LOG_TAG, "onEndOfSpeech") |  | ||||||
|         } |  | ||||||
|  |  | ||||||
|         override fun onError(errorCode: Int) { |  | ||||||
|             val errorMessage: String = when(errorCode) { |  | ||||||
|                 SpeechRecognizer.ERROR_AUDIO -> "Audio recording error" |  | ||||||
|                 SpeechRecognizer.ERROR_CLIENT -> "Client side error" |  | ||||||
|                 SpeechRecognizer.ERROR_INSUFFICIENT_PERMISSIONS -> "Insufficient permissions" |  | ||||||
|                 SpeechRecognizer.ERROR_NETWORK -> "Network error" |  | ||||||
|                 SpeechRecognizer.ERROR_NETWORK_TIMEOUT -> "Network timeout" |  | ||||||
|                 SpeechRecognizer.ERROR_NO_MATCH -> "No match" |  | ||||||
|                 SpeechRecognizer.ERROR_RECOGNIZER_BUSY -> "RecognitionService busy" |  | ||||||
|                 SpeechRecognizer.ERROR_SERVER -> "error from server" |  | ||||||
|                 SpeechRecognizer.ERROR_SPEECH_TIMEOUT -> "No speech input" |  | ||||||
|                 else -> "Didn't understand, please try again." |  | ||||||
|             } |  | ||||||
|             Log.d(LOG_TAG, "FAILED $errorMessage") |  | ||||||
|             launchStt() |  | ||||||
|         } |  | ||||||
|  |  | ||||||
|         override fun onEvent(arg0: Int, arg1: Bundle?) { |  | ||||||
|             Log.i(LOG_TAG, "onEvent") |  | ||||||
|         } |  | ||||||
|  |  | ||||||
|         override fun onPartialResults(data: Bundle?) { |  | ||||||
|             //Log.i(LOG_TAG, "onPartialResults") |  | ||||||
|         } |  | ||||||
|  |  | ||||||
|         override fun onReadyForSpeech(arg0: Bundle?) { |  | ||||||
|             Log.i(LOG_TAG, "onReadyForSpeech") |  | ||||||
|         } |  | ||||||
|  |  | ||||||
|         override fun onResults(data: Bundle) { |  | ||||||
|             Log.i(LOG_TAG, "onResults"); |  | ||||||
|             val results:ArrayList<String> = data.getStringArrayList(SpeechRecognizer.RESULTS_RECOGNITION) |  | ||||||
|             var understood = false |  | ||||||
|  |  | ||||||
|             matchModel?.apply { |  | ||||||
|                 for (result in results) { |  | ||||||
|                     for (player in players) { |  | ||||||
|                         if (player.pattern?.matcher(result)?.find() == true) { |  | ||||||
|                             understood = true |  | ||||||
|                             updateScore(player) |  | ||||||
|                             updateUI() |  | ||||||
|                             break |  | ||||||
|                         } |  | ||||||
|                     } |  | ||||||
|                     if (understood) break |  | ||||||
|                 } |  | ||||||
|                 if (!understood) { |  | ||||||
|                     if (ttsEnabled) { |  | ||||||
|                         speakText(getString(R.string.not_understood)) |  | ||||||
|                     } |  | ||||||
|                     else { |  | ||||||
|                         showText(R.string.not_understood) |  | ||||||
|                     } |  | ||||||
|                 } |  | ||||||
|             } |  | ||||||
|             launchStt() |  | ||||||
|         } |  | ||||||
|  |  | ||||||
|         override fun onRmsChanged(rmsdB: Float) { |  | ||||||
|             //Log.i(LOG_TAG, "onRmsChanged: $rmsdB") |  | ||||||
|         } |  | ||||||
|     } |  | ||||||
|  |  | ||||||
|     fun showText(text: String, duration: Int = Snackbar.LENGTH_SHORT) { |  | ||||||
|         Snackbar.make( |  | ||||||
|             findViewById(R.id.coordinatorLayout), |  | ||||||
|             text, |  | ||||||
|             duration |  | ||||||
|         ).show() |  | ||||||
|     } |  | ||||||
|  |  | ||||||
|     fun showText(textId: Int, duration: Int = Snackbar.LENGTH_SHORT) { |  | ||||||
|         Snackbar.make( |  | ||||||
|             findViewById(R.id.coordinatorLayout), |  | ||||||
|             textId, |  | ||||||
|             duration |  | ||||||
|         ).show() |  | ||||||
|     } |  | ||||||
|  |  | ||||||
|     fun speakText(text: String, queueMode: Int = TextToSpeech.QUEUE_FLUSH) { |  | ||||||
|         //stt?.stopListening() |  | ||||||
|         tts?.speak( |  | ||||||
|             text, |  | ||||||
|             queueMode, |  | ||||||
|             hashMapOf(TextToSpeech.Engine.KEY_PARAM_UTTERANCE_ID to "TTS") |  | ||||||
|         ) |  | ||||||
|     } |  | ||||||
|  |  | ||||||
|     override fun onCreate(savedInstanceState: Bundle?) { |     override fun onCreate(savedInstanceState: Bundle?) { | ||||||
|         super.onCreate(savedInstanceState) |         super.onCreate(savedInstanceState) | ||||||
|         AppCompatDelegate.setCompatVectorFromResourcesEnabled(true) |         AppCompatDelegate.setCompatVectorFromResourcesEnabled(true) | ||||||
| @ -201,53 +82,14 @@ class MatchActivity : AppCompatActivity() { | |||||||
|                 } |                 } | ||||||
|                 if (ttsEnabled) { |                 if (ttsEnabled) { | ||||||
|                     tts = TextToSpeech(this@MatchActivity, WaitForTtsInit()) |                     tts = TextToSpeech(this@MatchActivity, WaitForTtsInit()) | ||||||
|                 } |                     if (sttEnabled) | ||||||
|                 if (sttEnabled) { |                         tts?.setOnUtteranceProgressListener(SttAfterTts()) | ||||||
|                     stt = SpeechRecognizer.createSpeechRecognizer(this@MatchActivity).apply { |  | ||||||
|                         setRecognitionListener(SttListener()) |  | ||||||
|                     } |  | ||||||
|                     sttIntent = Intent(RecognizerIntent.ACTION_RECOGNIZE_SPEECH).apply { |  | ||||||
|                         putExtra(RecognizerIntent.EXTRA_LANGUAGE_MODEL, RecognizerIntent.LANGUAGE_MODEL_FREE_FORM) |  | ||||||
|                         putExtra(RecognizerIntent.EXTRA_LANGUAGE, Locale.getDefault().displayLanguage) |  | ||||||
|                         putExtra(RecognizerIntent.EXTRA_MAX_RESULTS, 10) |  | ||||||
|                         putExtra(RecognizerIntent.EXTRA_CALLING_PACKAGE, this@MatchActivity.packageName) |  | ||||||
|                     } |  | ||||||
|                     if (ttsEnabled) { |  | ||||||
|                         tts?.setOnUtteranceProgressListener(WaitForTtsSpeak()) |  | ||||||
|                     } else { |  | ||||||
|                         matchModel?.apply { |  | ||||||
|                             showText( |  | ||||||
|                                 getString( |  | ||||||
|                                     R.string.STT_hint, |  | ||||||
|                                     players[0].name, |  | ||||||
|                                     players[1].name |  | ||||||
|                                 ), |  | ||||||
|                                 Snackbar.LENGTH_LONG |  | ||||||
|                             ) |  | ||||||
|                         } |  | ||||||
|                         launchStt() |  | ||||||
|                     } |  | ||||||
|                 } else { |  | ||||||
|                     showText(R.string.button_hint) |  | ||||||
|                 } |                 } | ||||||
|             } |             } | ||||||
|         } |         } | ||||||
|         updateUI() |         updateUI() | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     fun launchStt() { |  | ||||||
|         matchModel?.apply { |  | ||||||
|             if (sttEnabled and !matchFinished) { |  | ||||||
|                 try { |  | ||||||
|                     stt?.startListening(sttIntent) |  | ||||||
|                 } catch (e: ActivityNotFoundException) { |  | ||||||
|                     sttEnabled = false |  | ||||||
|                     showText(R.string.STT_unavailable) |  | ||||||
|                 } |  | ||||||
|             } |  | ||||||
|         } |  | ||||||
|     } |  | ||||||
|  |  | ||||||
|     override fun onBackPressed() { |     override fun onBackPressed() { | ||||||
|         if (matchModel?.pointId == 0) |         if (matchModel?.pointId == 0) | ||||||
|             super.onBackPressed() |             super.onBackPressed() | ||||||
| @ -316,6 +158,9 @@ class MatchActivity : AppCompatActivity() { | |||||||
|                     if (matchPoint) |                     if (matchPoint) | ||||||
|                         scoreSpeech += getString(R.string.match_point) |                         scoreSpeech += getString(R.string.match_point) | ||||||
|                     speakText(scoreSpeech) |                     speakText(scoreSpeech) | ||||||
|  |                 } else { | ||||||
|  |                     if (sttEnabled) | ||||||
|  |                         SttDialog().show(supportFragmentManager, "SttDialog") | ||||||
|                 } |                 } | ||||||
|             } |             } | ||||||
|         } |         } | ||||||
| @ -334,9 +179,27 @@ class MatchActivity : AppCompatActivity() { | |||||||
|         } |         } | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     override fun onStop() { |     fun showText(text: String, duration: Int = Snackbar.LENGTH_SHORT) { | ||||||
|         super.onStop() |         Snackbar.make( | ||||||
|         tts?.shutdown() |             findViewById(R.id.coordinatorLayout), | ||||||
|         stt?.destroy() |             text, | ||||||
|  |             duration | ||||||
|  |         ).show() | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     fun showText(textId: Int, duration: Int = Snackbar.LENGTH_SHORT) { | ||||||
|  |         Snackbar.make( | ||||||
|  |             findViewById(R.id.coordinatorLayout), | ||||||
|  |             textId, | ||||||
|  |             duration | ||||||
|  |         ).show() | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     fun speakText(text: String, queueMode: Int = TextToSpeech.QUEUE_FLUSH) { | ||||||
|  |         tts?.speak( | ||||||
|  |             text, | ||||||
|  |             queueMode, | ||||||
|  |             hashMapOf(TextToSpeech.Engine.KEY_PARAM_UTTERANCE_ID to "TTS") | ||||||
|  |         ) | ||||||
|     } |     } | ||||||
| } | } | ||||||
|  | |||||||
							
								
								
									
										143
									
								
								app/src/main/java/adrienmalin/pingpoints/SttDialog.kt
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										143
									
								
								app/src/main/java/adrienmalin/pingpoints/SttDialog.kt
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,143 @@ | |||||||
|  | package adrienmalin.pingpoints | ||||||
|  |  | ||||||
|  | import android.app.AlertDialog | ||||||
|  | import android.content.ActivityNotFoundException | ||||||
|  | import android.content.Context | ||||||
|  | import android.content.Intent | ||||||
|  | import android.os.Bundle | ||||||
|  | import android.speech.RecognitionListener | ||||||
|  | import android.speech.RecognizerIntent | ||||||
|  | import android.speech.SpeechRecognizer | ||||||
|  | import android.support.v4.app.DialogFragment | ||||||
|  | import android.util.Log | ||||||
|  | import android.view.LayoutInflater | ||||||
|  | import android.view.View | ||||||
|  | import android.widget.TextView | ||||||
|  | import java.util.* | ||||||
|  |  | ||||||
|  | class SttDialog : DialogFragment() { | ||||||
|  |     var partialResultsTextView: TextView? = null | ||||||
|  |     var matchActivity: MatchActivity? = null | ||||||
|  |     var stt: SpeechRecognizer? = null | ||||||
|  |     var sttIntent: Intent? = null | ||||||
|  |  | ||||||
|  |     inner class SttListener : RecognitionListener { | ||||||
|  |         val LOG_TAG: String = "SttListener" | ||||||
|  |  | ||||||
|  |         override fun onBeginningOfSpeech() { | ||||||
|  |             Log.i(LOG_TAG, "onBeginningOfSpeech") | ||||||
|  |         } | ||||||
|  |  | ||||||
|  |         override fun onBufferReceived(buffer: ByteArray?) { | ||||||
|  |             Log.i(LOG_TAG, "onBufferReceived: $buffer"); | ||||||
|  |         } | ||||||
|  |  | ||||||
|  |         override fun onEndOfSpeech() { | ||||||
|  |             Log.i(LOG_TAG, "onEndOfSpeech") | ||||||
|  |         } | ||||||
|  |  | ||||||
|  |         override fun onError(errorCode: Int) { | ||||||
|  |             val errorMessage: String = when (errorCode) { | ||||||
|  |                 SpeechRecognizer.ERROR_AUDIO -> "Audio recording error" | ||||||
|  |                 SpeechRecognizer.ERROR_CLIENT -> "Client side error" | ||||||
|  |                 SpeechRecognizer.ERROR_INSUFFICIENT_PERMISSIONS -> "Insufficient permissions" | ||||||
|  |                 SpeechRecognizer.ERROR_NETWORK -> "Network error" | ||||||
|  |                 SpeechRecognizer.ERROR_NETWORK_TIMEOUT -> "Network timeout" | ||||||
|  |                 SpeechRecognizer.ERROR_NO_MATCH -> "No match" | ||||||
|  |                 SpeechRecognizer.ERROR_RECOGNIZER_BUSY -> "RecognitionService busy" | ||||||
|  |                 SpeechRecognizer.ERROR_SERVER -> "error from server" | ||||||
|  |                 SpeechRecognizer.ERROR_SPEECH_TIMEOUT -> "No speech input" | ||||||
|  |                 else -> "Didn't understand, please try again." | ||||||
|  |             } | ||||||
|  |             Log.d(LOG_TAG, "FAILED $errorMessage") | ||||||
|  |             stt?.startListening(sttIntent) | ||||||
|  |         } | ||||||
|  |  | ||||||
|  |         override fun onEvent(arg0: Int, arg1: Bundle?) { | ||||||
|  |             Log.i(LOG_TAG, "onEvent") | ||||||
|  |         } | ||||||
|  |  | ||||||
|  |         override fun onPartialResults(data: Bundle) { | ||||||
|  |             //Log.i(LOG_TAG, "onPartialResults") | ||||||
|  |             partialResultsTextView?.text = data.getStringArrayList(SpeechRecognizer.RESULTS_RECOGNITION)[0] | ||||||
|  |         } | ||||||
|  |  | ||||||
|  |         override fun onReadyForSpeech(arg0: Bundle?) { | ||||||
|  |             Log.i(LOG_TAG, "onReadyForSpeech") | ||||||
|  |         } | ||||||
|  |  | ||||||
|  |         override fun onResults(data: Bundle) { | ||||||
|  |             Log.i(LOG_TAG, "onResults"); | ||||||
|  |             val results: ArrayList<String> = data.getStringArrayList(SpeechRecognizer.RESULTS_RECOGNITION) | ||||||
|  |             var understood = false | ||||||
|  |  | ||||||
|  |             matchActivity?.apply { | ||||||
|  |                 matchModel?.apply { | ||||||
|  |                     for (result in results) { | ||||||
|  |                         for (player in players) { | ||||||
|  |                             if (player.pattern?.matcher(result)?.find() == true) { | ||||||
|  |                                 understood = true | ||||||
|  |                                 dismiss() | ||||||
|  |                                 updateScore(player) | ||||||
|  |                                 updateUI() | ||||||
|  |                                 break | ||||||
|  |                             } | ||||||
|  |                         } | ||||||
|  |                         if (understood) break | ||||||
|  |                     } | ||||||
|  |                     if (!understood) { | ||||||
|  |                         partialResultsTextView?.text = getString(R.string.not_understood) | ||||||
|  |                         stt?.startListening(sttIntent) | ||||||
|  |                     } | ||||||
|  |                 } | ||||||
|  |             } | ||||||
|  |         } | ||||||
|  |  | ||||||
|  |         override fun onRmsChanged(rmsdB: Float) { | ||||||
|  |             //Log.i(LOG_TAG, "onRmsChanged: $rmsdB") | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     override fun onCreateDialog(savedInstanceState: Bundle?) = AlertDialog.Builder(activity).apply { | ||||||
|  |         val view: View = (context?.getSystemService(Context.LAYOUT_INFLATER_SERVICE) as LayoutInflater).inflate( | ||||||
|  |             R.layout.dialog_stt, | ||||||
|  |             null | ||||||
|  |         ) | ||||||
|  |         partialResultsTextView = view.findViewById(R.id.partialResultTextView) | ||||||
|  |  | ||||||
|  |         setView(view) | ||||||
|  |  | ||||||
|  |         matchActivity = (activity as MatchActivity).apply { | ||||||
|  |             matchModel?.apply { | ||||||
|  |                 view.findViewById<TextView>(R.id.sttHintTextView).text = getString( | ||||||
|  |                     R.string.STT_hint, | ||||||
|  |                     players[0].name, | ||||||
|  |                     players[1].name | ||||||
|  |                 ) | ||||||
|  |                 sttIntent = Intent(RecognizerIntent.ACTION_RECOGNIZE_SPEECH).apply { | ||||||
|  |                     putExtra(RecognizerIntent.EXTRA_LANGUAGE_MODEL, RecognizerIntent.LANGUAGE_MODEL_FREE_FORM) | ||||||
|  |                     putExtra(RecognizerIntent.EXTRA_LANGUAGE, Locale.getDefault().displayLanguage) | ||||||
|  |                     putExtra(RecognizerIntent.EXTRA_MAX_RESULTS, 10) | ||||||
|  |                     putExtra(RecognizerIntent.EXTRA_CALLING_PACKAGE, packageName) | ||||||
|  |                     putExtra(RecognizerIntent.EXTRA_PARTIAL_RESULTS, true) | ||||||
|  |                 } | ||||||
|  |                 stt = SpeechRecognizer.createSpeechRecognizer(activity).apply { | ||||||
|  |                     setRecognitionListener(SttListener()) | ||||||
|  |                     try { | ||||||
|  |                         startListening(sttIntent) | ||||||
|  |                     } catch (e: ActivityNotFoundException) { | ||||||
|  |                         sttEnabled = false | ||||||
|  |                         dismiss() | ||||||
|  |                         showText(R.string.STT_unavailable) | ||||||
|  |                     } | ||||||
|  |                 } | ||||||
|  |             } | ||||||
|  |         } | ||||||
|  |     }.create()!! | ||||||
|  |  | ||||||
|  |     override fun onStop() { | ||||||
|  |         super.onStop() | ||||||
|  |         stt?.destroy() | ||||||
|  |     } | ||||||
|  |  | ||||||
|  | } | ||||||
| @ -1,102 +0,0 @@ | |||||||
| package adrienmalin.pingpoints |  | ||||||
|  |  | ||||||
| import android.content.Context |  | ||||||
| import android.net.Uri |  | ||||||
| import android.os.Bundle |  | ||||||
| import android.app.Fragment |  | ||||||
| import android.view.LayoutInflater |  | ||||||
| import android.view.View |  | ||||||
| import android.view.ViewGroup |  | ||||||
|  |  | ||||||
|  |  | ||||||
| // TODO: Rename parameter arguments, choose names that match |  | ||||||
| // the fragment initialization parameters, e.g. ARG_ITEM_NUMBER |  | ||||||
| private const val ARG_PARAM1 = "param1" |  | ||||||
| private const val ARG_PARAM2 = "param2" |  | ||||||
|  |  | ||||||
| /** |  | ||||||
|  * A simple [Fragment] subclass. |  | ||||||
|  * Activities that contain this fragment must implement the |  | ||||||
|  * [SttFragment.OnFragmentInteractionListener] interface |  | ||||||
|  * to handle interaction events. |  | ||||||
|  * Use the [SttFragment.newInstance] factory method to |  | ||||||
|  * create an instance of this fragment. |  | ||||||
|  * |  | ||||||
|  */ |  | ||||||
| class SttFragment : Fragment() { |  | ||||||
|     // TODO: Rename and change types of parameters |  | ||||||
|     private var param1: String? = null |  | ||||||
|     private var param2: String? = null |  | ||||||
|     private var listener: OnFragmentInteractionListener? = null |  | ||||||
|  |  | ||||||
|     override fun onCreate(savedInstanceState: Bundle?) { |  | ||||||
|         super.onCreate(savedInstanceState) |  | ||||||
|         arguments?.let { |  | ||||||
|             param1 = it.getString(ARG_PARAM1) |  | ||||||
|             param2 = it.getString(ARG_PARAM2) |  | ||||||
|         } |  | ||||||
|     } |  | ||||||
|  |  | ||||||
|     override fun onCreateView( |  | ||||||
|         inflater: LayoutInflater, container: ViewGroup?, |  | ||||||
|         savedInstanceState: Bundle? |  | ||||||
|     ): View? { |  | ||||||
|         // Inflate the layout for this fragment |  | ||||||
|         return inflater.inflate(R.layout.fragment_stt, container, false) |  | ||||||
|     } |  | ||||||
|  |  | ||||||
|     // TODO: Rename method, update argument and hook method into UI event |  | ||||||
|     fun onButtonPressed(uri: Uri) { |  | ||||||
|         listener?.onFragmentInteraction(uri) |  | ||||||
|     } |  | ||||||
|  |  | ||||||
|     override fun onAttach(context: Context) { |  | ||||||
|         super.onAttach(context) |  | ||||||
|         if (context is OnFragmentInteractionListener) { |  | ||||||
|             listener = context |  | ||||||
|         } else { |  | ||||||
|             throw RuntimeException(context.toString() + " must implement OnFragmentInteractionListener") |  | ||||||
|         } |  | ||||||
|     } |  | ||||||
|  |  | ||||||
|     override fun onDetach() { |  | ||||||
|         super.onDetach() |  | ||||||
|         listener = null |  | ||||||
|     } |  | ||||||
|  |  | ||||||
|     /** |  | ||||||
|      * This interface must be implemented by activities that contain this |  | ||||||
|      * fragment to allow an interaction in this fragment to be communicated |  | ||||||
|      * to the activity and potentially other fragments contained in that |  | ||||||
|      * activity. |  | ||||||
|      * |  | ||||||
|      * |  | ||||||
|      * See the Android Training lesson [Communicating with Other Fragments] |  | ||||||
|      * (http://developer.android.com/training/basics/fragments/communicating.html) |  | ||||||
|      * for more information. |  | ||||||
|      */ |  | ||||||
|     interface OnFragmentInteractionListener { |  | ||||||
|         // TODO: Update argument type and name |  | ||||||
|         fun onFragmentInteraction(uri: Uri) |  | ||||||
|     } |  | ||||||
|  |  | ||||||
|     companion object { |  | ||||||
|         /** |  | ||||||
|          * Use this factory method to create a new instance of |  | ||||||
|          * this fragment using the provided parameters. |  | ||||||
|          * |  | ||||||
|          * @param param1 Parameter 1. |  | ||||||
|          * @param param2 Parameter 2. |  | ||||||
|          * @return A new instance of fragment SttFragment. |  | ||||||
|          */ |  | ||||||
|         // TODO: Rename and change types and number of parameters |  | ||||||
|         @JvmStatic |  | ||||||
|         fun newInstance(param1: String, param2: String) = |  | ||||||
|             SttFragment().apply { |  | ||||||
|                 arguments = Bundle().apply { |  | ||||||
|                     putString(ARG_PARAM1, param1) |  | ||||||
|                     putString(ARG_PARAM2, param2) |  | ||||||
|                 } |  | ||||||
|             } |  | ||||||
|     } |  | ||||||
| } |  | ||||||
							
								
								
									
										28
									
								
								app/src/main/res/layout/dialog_stt.xml
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										28
									
								
								app/src/main/res/layout/dialog_stt.xml
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,28 @@ | |||||||
|  | <?xml version="1.0" encoding="utf-8"?> | ||||||
|  | <FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" | ||||||
|  |              xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" | ||||||
|  |              android:layout_width="match_parent" | ||||||
|  |              android:layout_height="match_parent" | ||||||
|  |              tools:context=".SttDialog"> | ||||||
|  |  | ||||||
|  |     <!-- TODO: Update blank fragment layout --> | ||||||
|  |     <LinearLayout | ||||||
|  |             android:orientation="vertical" | ||||||
|  |             android:layout_width="match_parent" | ||||||
|  |             android:layout_height="match_parent"> | ||||||
|  |         <ImageView | ||||||
|  |                 app:srcCompat="@drawable/ic_stt" | ||||||
|  |                 android:layout_width="match_parent" | ||||||
|  |                 android:layout_height="wrap_content" android:id="@+id/imageView" android:layout_margin="8dp"/> | ||||||
|  |         <TextView | ||||||
|  |                 android:layout_width="match_parent" | ||||||
|  |                 android:layout_height="wrap_content" | ||||||
|  |                 android:text="@string/STT_hint" android:id="@+id/sttHintTextView" android:layout_margin="8dp" | ||||||
|  |                 android:textAppearance="@style/TextAppearance.AppCompat.Medium" android:gravity="center"/> | ||||||
|  |         <TextView | ||||||
|  |                 android:layout_width="match_parent" | ||||||
|  |                 android:layout_height="wrap_content" android:id="@+id/partialResultTextView" | ||||||
|  |                 android:layout_margin="8dp" android:gravity="center"/> | ||||||
|  |     </LinearLayout> | ||||||
|  |  | ||||||
|  | </FrameLayout> | ||||||
| @ -1,14 +0,0 @@ | |||||||
| <?xml version="1.0" encoding="utf-8"?> |  | ||||||
| <FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" |  | ||||||
|              xmlns:tools="http://schemas.android.com/tools" |  | ||||||
|              android:layout_width="match_parent" |  | ||||||
|              android:layout_height="match_parent" |  | ||||||
|              tools:context=".SttFragment"> |  | ||||||
|  |  | ||||||
|     <!-- TODO: Update blank fragment layout --> |  | ||||||
|     <TextView |  | ||||||
|             android:layout_width="match_parent" |  | ||||||
|             android:layout_height="match_parent" |  | ||||||
|             android:text="@string/hello_blank_fragment"/> |  | ||||||
|  |  | ||||||
| </FrameLayout> |  | ||||||
| @ -32,7 +32,7 @@ | |||||||
|     <string name="share_subject">Match Ping Points : %s contre %s</string> |     <string name="share_subject">Match Ping Points : %s contre %s</string> | ||||||
|     <string name="share_message">"%s contre %s:\n%s a gagné par %d à %d\nPing Points est disponible sur Google Play\n "</string> |     <string name="share_message">"%s contre %s:\n%s a gagné par %d à %d\nPing Points est disponible sur Google Play\n "</string> | ||||||
|     <string name="match_point">Balle de match</string> |     <string name="match_point">Balle de match</string> | ||||||
|     <string name="STT_hint">Dîtes : \"Point pour %s\" ou \"Point pour %s\"</string> |     <string name="STT_hint">Dîtes : \"Point pour %s\"\nou \"Point pour %s\"</string> | ||||||
|     <string name="pattern">(?i:Point pour %s)</string> |     <string name="pattern">(?i:Point pour %s)</string> | ||||||
|     <string name="not_understood">Pouvez-vous répéter ?</string> |     <string name="not_understood">Pouvez-vous répéter ?</string> | ||||||
|     <string name="STT_disabled">Reconnaissance vocale désactivée.</string> |     <string name="STT_disabled">Reconnaissance vocale désactivée.</string> | ||||||
|  | |||||||
| @ -37,7 +37,7 @@ | |||||||
|     <string name="share_subject">Ping Points Match: %s vs. %s</string> |     <string name="share_subject">Ping Points Match: %s vs. %s</string> | ||||||
|     <string name="share_message">%s vs. %s:\n%s won by %d to %d\nGet Ping Points on Google Play</string> |     <string name="share_message">%s vs. %s:\n%s won by %d to %d\nGet Ping Points on Google Play</string> | ||||||
|     <string name="match_point">Match point</string> |     <string name="match_point">Match point</string> | ||||||
|     <string name="STT_hint">Say: \"Point for %s\" or \"Point for %s\"</string> |     <string name="STT_hint">Say: \"Point for %s\"\nor \"Point for %s\"</string> | ||||||
|     <string name="pattern">(?i:Point for %s)</string> |     <string name="pattern">(?i:Point for %s)</string> | ||||||
|     <string name="not_understood">Can you repeat, please?</string> |     <string name="not_understood">Can you repeat, please?</string> | ||||||
|     <string name="score" translatable="false">%d - %d</string> |     <string name="score" translatable="false">%d - %d</string> | ||||||
|  | |||||||
		Reference in New Issue
	
	Block a user