After initializing TranslateString in calling function getTranslation(), i am getting Default (which is returned when value is empty) as return, Which shouldn't be case as I have put translate under runBlocking{ }, Kindly tell what would be best way to get return from getTranslation after input String is translated.
Here is my TranslateString Util class
class TranslateString(val inputString : String, val SourceLangCod : String, val TargetLangCode: String) {
private val SourceLangCode = SourceLangCod
private val languageIdentifier = LanguageIdentification.getClient()
private var translatedString: MutableLiveData<String> = MutableLiveData("")
private lateinit var englishGermanTranslator:
Translator
var LangCode= "1"
fun getTranslation(): String{
runBlocking {
findLanguage()
}
return if (translatedString.value.equals(""))
"Default" else translatedString.value!!
}
private fun findLanguage() {
if (SourceLangCode != "") {
LangCode = SourceLangCode
} else {
languageIdentifier.identifyLanguage(inputString)
.addOnSuccessListener { languageCode ->
if (languageCode != "und")
LangCode = languageCode
buidtranslation()
}
}
}
// checking model is downloaded or not and downloading it
private fun buidtranslation() {
val conditions = DownloadConditions.Builder()
.requireWifi()
.build()
val options = TranslatorOptions.Builder()
.setSourceLanguage(LangCode
)
.setTargetLanguage(
TargetLangCode
)
.build()
Log.e("from TranslateString", "langueageCode: $LangCode")
englishGermanTranslator = Translation.getClient(options)
var isDownloaded = false
englishGermanTranslator.downloadModelIfNeeded(conditions)
.addOnSuccessListener {
// Model downloaded successfully. Okay to start translating.
// (Set a flag, unhide the translation UI, etc.)
Log.e(TAG, "funIsModelDownloaded: model is downloaded")
isDownloaded = true
translate()
}
.addOnFailureListener { exception ->
// Model couldn’t be downloaded or other internal error.
isDownloaded = false
Log.e(TAG, "funIsModelDownloaded:" + exception.message)
}
}
private fun translate(){
englishGermanTranslator.translate(inputString)
.addOnSuccessListener { translatedText ->
// Translation successful.
translatedString.postValue(translatedText)
Log.e(TAG, "translated Text: $translatedText")
}
.addOnFailureListener { exception ->
// Error.
// ...
Log.e(TAG, "Translation Error"+exception.message )
}
}
If i call value from getTranslation after putting delay of 3 sec then it returns translated value, also same while testing.
If possible i want to acheive desired result without using observable of LiveData.