Skip to content

Commit

Permalink
Merge pull request #210 from gavine99/speechtotext_s1
Browse files Browse the repository at this point in the history
Basic speech to text for compose (and qkreply) take 2
  • Loading branch information
octoshrimpy authored Jan 13, 2025
2 parents 61293ce + 3388db8 commit 75b4cf1
Show file tree
Hide file tree
Showing 2 changed files with 73 additions and 31 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -26,14 +26,18 @@ import android.app.TimePickerDialog
import android.content.ContentValues
import android.content.Intent
import android.net.Uri
import android.os.Build
import android.os.Bundle
import android.provider.ContactsContract
import android.provider.MediaStore
import android.speech.RecognizerIntent
import android.text.format.DateFormat
import android.view.GestureDetector
import android.view.GestureDetector.SimpleOnGestureListener
import android.view.Menu
import android.view.MenuItem
import android.view.MotionEvent
import android.view.View
import android.view.View.OnTouchListener
import androidx.activity.result.contract.ActivityResultContracts
import androidx.appcompat.app.AlertDialog
import androidx.core.app.ActivityCompat
Expand All @@ -44,35 +48,33 @@ import com.google.android.flexbox.FlexboxLayoutManager
import com.google.android.material.snackbar.Snackbar
import com.jakewharton.rxbinding2.view.clicks
import com.jakewharton.rxbinding2.widget.textChanges
import com.uber.autodispose.android.lifecycle.scope
import com.uber.autodispose.autoDisposable
import dagger.android.AndroidInjection
import dev.octoshrimpy.quik.R
import dev.octoshrimpy.quik.common.Navigator
import dev.octoshrimpy.quik.common.base.QkThemedActivity
import dev.octoshrimpy.quik.common.util.DateFormatter
import dev.octoshrimpy.quik.common.util.extensions.autoScrollToStart
import dev.octoshrimpy.quik.common.util.extensions.dismissKeyboard
import dev.octoshrimpy.quik.common.util.extensions.hideKeyboard
import dev.octoshrimpy.quik.common.util.extensions.resolveThemeColor
import dev.octoshrimpy.quik.common.util.extensions.scrapViews
import dev.octoshrimpy.quik.common.util.extensions.setBackgroundTint
import dev.octoshrimpy.quik.common.util.extensions.setTint
import dev.octoshrimpy.quik.common.util.extensions.setVisible
import dev.octoshrimpy.quik.common.util.extensions.showKeyboard
import dev.octoshrimpy.quik.common.widget.QkEditText
import dev.octoshrimpy.quik.feature.compose.editing.ChipsAdapter
import dev.octoshrimpy.quik.feature.contacts.ContactsActivity
import dev.octoshrimpy.quik.model.Attachment
import dev.octoshrimpy.quik.model.Recipient
import com.uber.autodispose.android.lifecycle.scope
import com.uber.autodispose.autoDisposable
import dagger.android.AndroidInjection
import dev.octoshrimpy.quik.common.widget.QkEditText
import io.reactivex.Observable
import io.reactivex.subjects.PublishSubject
import io.reactivex.subjects.Subject
import kotlinx.android.synthetic.main.compose_activity.*
import java.text.SimpleDateFormat
import java.util.*
import javax.inject.Inject
import kotlin.collections.HashMap


class ComposeActivity : QkThemedActivity(), ComposeView {

Expand Down Expand Up @@ -178,16 +180,34 @@ class ComposeActivity : QkThemedActivity(), ComposeView {
.autoDisposable(scope())
.subscribe()

findViewById<QkEditText>(R.id.message)?.setOnLongClickListener {
val speechRecognizerIntent = Intent(RecognizerIntent.ACTION_RECOGNIZE_SPEECH)
speechRecognizerIntent.putExtra(
RecognizerIntent.EXTRA_LANGUAGE_MODEL,
RecognizerIntent.LANGUAGE_MODEL_FREE_FORM
)
// include if want a custom message that the STT can (optionally) display speechRecognizerIntent.putExtra(RecognizerIntent.EXTRA_PROMPT, "Dictate your message")
speechResultLauncher.launch(speechRecognizerIntent)
true
}
message.setOnTouchListener(object : OnTouchListener {
private val gestureDetector =
GestureDetector(this@ComposeActivity, object : SimpleOnGestureListener() {
override fun onDoubleTap(e: MotionEvent): Boolean {
val speechRecognizerIntent = Intent(RecognizerIntent.ACTION_RECOGNIZE_SPEECH)
.putExtra(
RecognizerIntent.EXTRA_LANGUAGE_MODEL,
RecognizerIntent.LANGUAGE_MODEL_FREE_FORM
)
// include if want a custom message that the STT can (optionally) display .putExtra(RecognizerIntent.EXTRA_PROMPT, "Speak your message")
speechResultLauncher.launch(speechRecognizerIntent)
return true
}

override fun onSingleTapConfirmed(e: MotionEvent): Boolean {
message.showKeyboard()
return true
}

override fun onSingleTapUp(e: MotionEvent): Boolean {
return true // don't show soft keyboard on this event
}
})

override fun onTouch(v: View, e: MotionEvent): Boolean {
return gestureDetector.onTouchEvent(e)
}
})

window.callback = ComposeWindowCallback(window.callback, this)
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -20,11 +20,15 @@ package dev.octoshrimpy.quik.feature.qkreply

import android.app.Activity
import android.content.Intent
import android.os.Build
import android.os.Bundle
import android.speech.RecognizerIntent
import android.view.GestureDetector
import android.view.GestureDetector.SimpleOnGestureListener
import android.view.Menu
import android.view.MenuItem
import android.view.MotionEvent
import android.view.View
import android.view.View.OnTouchListener
import android.view.ViewGroup
import android.view.Window
import android.view.WindowManager
Expand All @@ -37,14 +41,14 @@ import com.jakewharton.rxbinding2.widget.textChanges
import dev.octoshrimpy.quik.R
import dev.octoshrimpy.quik.common.base.QkThemedActivity
import dev.octoshrimpy.quik.common.util.extensions.autoScrollToStart
import dev.octoshrimpy.quik.common.util.extensions.resolveThemeColor
import dev.octoshrimpy.quik.common.util.extensions.setBackgroundTint
import dev.octoshrimpy.quik.common.util.extensions.setVisible
import dev.octoshrimpy.quik.feature.compose.MessagesAdapter
import dagger.android.AndroidInjection
import dev.octoshrimpy.quik.common.util.extensions.showKeyboard
import dev.octoshrimpy.quik.common.widget.QkEditText
import io.reactivex.subjects.PublishSubject
import io.reactivex.subjects.Subject
import kotlinx.android.synthetic.main.compose_activity.message
import kotlinx.android.synthetic.main.qkreply_activity.*
import javax.inject.Inject

Expand Down Expand Up @@ -100,16 +104,34 @@ class QkReplyActivity : QkThemedActivity(), QkReplyView {
override fun onChanged() = messages.scrollToPosition(adapter.itemCount - 1)
})

findViewById<QkEditText>(R.id.message)?.setOnLongClickListener {
val speechRecognizerIntent = Intent(RecognizerIntent.ACTION_RECOGNIZE_SPEECH)
speechRecognizerIntent.putExtra(
RecognizerIntent.EXTRA_LANGUAGE_MODEL,
RecognizerIntent.LANGUAGE_MODEL_FREE_FORM
)
// include if want a custom message that the STT can (optionally) display speechRecognizerIntent.putExtra(RecognizerIntent.EXTRA_PROMPT, "Dictate your message")
speechResultLauncher.launch(speechRecognizerIntent)
true
}
message.setOnTouchListener(object : OnTouchListener {
private val gestureDetector =
GestureDetector(this@QkReplyActivity, object : SimpleOnGestureListener() {
override fun onDoubleTap(e: MotionEvent): Boolean {
val speechRecognizerIntent = Intent(RecognizerIntent.ACTION_RECOGNIZE_SPEECH)
.putExtra(
RecognizerIntent.EXTRA_LANGUAGE_MODEL,
RecognizerIntent.LANGUAGE_MODEL_FREE_FORM
)
// include if want a custom message that the STT can (optionally) display .putExtra(RecognizerIntent.EXTRA_PROMPT, "Speak your message")
speechResultLauncher.launch(speechRecognizerIntent)
return true
}

override fun onSingleTapConfirmed(e: MotionEvent): Boolean {
message.showKeyboard()
return true
}

override fun onSingleTapUp(e: MotionEvent): Boolean {
return true // don't show soft keyboard on this event
}
})

override fun onTouch(v: View, e: MotionEvent): Boolean {
return gestureDetector.onTouchEvent(e)
}
})
}

override fun render(state: QkReplyState) {
Expand Down

0 comments on commit 75b4cf1

Please sign in to comment.