issue 2931 progress - pretty much done with the functionality, just got a couple small adjustments

Signed-off-by: Julius Linus <juliuslinus1@gmail.com>

Signed-off-by: Andy Scherzinger <info@andy-scherzinger.de>
This commit is contained in:
rapterjet2004 2023-05-16 14:41:06 -05:00 committed by Andy Scherzinger
parent c6eacd30ea
commit 0f8aa7f9e6
No known key found for this signature in database
GPG Key ID: 6CADC7E3523C308B
4 changed files with 123 additions and 27 deletions

View File

@ -3,7 +3,9 @@ import android.app.AlertDialog
import android.graphics.drawable.ColorDrawable
import android.os.Bundle
import android.text.method.ScrollingMovementMethod
import android.util.Log
import android.view.View
import android.widget.AdapterView
import android.widget.ArrayAdapter
import autodagger.AutoInjector
import com.nextcloud.talk.R
@ -16,10 +18,12 @@ import com.nextcloud.talk.models.json.translations.TranslationsOverall
import com.nextcloud.talk.users.UserManager
import com.nextcloud.talk.utils.ApiUtils
import com.nextcloud.talk.utils.bundle.BundleKeys
import com.nextcloud.talk.utils.database.user.CapabilitiesUtilNew
import io.reactivex.Observer
import io.reactivex.android.schedulers.AndroidSchedulers
import io.reactivex.disposables.Disposable
import io.reactivex.schedulers.Schedulers
import org.json.JSONArray
import java.util.Locale
import javax.inject.Inject
@ -39,15 +43,16 @@ class TranslateActivity : BaseActivity()
@Inject
lateinit var userManager: UserManager
var fromLanguages = arrayOf("Detect Language")
var toLanguages = arrayOf("Device Default")
var fromLanguages = arrayOf<String>()
var toLanguages = arrayOf<String>()
var text : String? = null
var fromLanguage : String = "de"
val toLanguage : String = Locale.getDefault().language
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
@ -58,8 +63,9 @@ class TranslateActivity : BaseActivity()
setContentView(binding.root)
setupTextViews()
setupSpinners()
translate()
getLanguageOptions()
translate(null, Locale.getDefault().language)
}
private fun setupActionBar() {
@ -84,24 +90,49 @@ class TranslateActivity : BaseActivity()
val bundle = intent.extras
binding.originalMessageTextview.text = bundle?.getString(BundleKeys.KEY_TRANSLATE_MESSAGE)
text = bundle?.getString(BundleKeys.KEY_TRANSLATE_MESSAGE)
}
private fun getLanguageOptions() {
// TODO implement this function to retrieve an array of strings from the server for each language option
// weird, for some reason I'm not getting a body from the server, but I'm getting a 200 OK, that's dumb
val currentUser : User = userManager.currentUser.blockingGet()
val json = JSONArray(CapabilitiesUtilNew.getLanguages(currentUser).toString())
Log.i("TranslateActivity", "json is: ${json.toString()}")
var fromLanguagesSet = mutableSetOf<String>("Detect Language")
var toLanguagesSet = mutableSetOf<String>("Device Settings")
for( i in 0..json.length()-1) {
val current = json.getJSONObject(i)
if(current.getString("from") != Locale.getDefault().language)
{
toLanguagesSet.add(current.getString("fromLabel"))
}
fromLanguagesSet.add(current.getString("toLabel"))
}
fromLanguages = fromLanguagesSet.toTypedArray()
toLanguages = toLanguagesSet.toTypedArray()
binding.fromLanguageSpinner.adapter = ArrayAdapter(this, android.R.layout.simple_spinner_dropdown_item,
fromLanguages)
binding.toLanguageSpinner.adapter = ArrayAdapter(this, android.R.layout.simple_spinner_dropdown_item,
toLanguages)
}
private fun enableSpinners(value : Boolean) {
binding.fromLanguageSpinner.isEnabled = value
binding.toLanguageSpinner.isEnabled = value
}
private fun translate() {
private fun translate(fromLanguage: String?, toLanguage : String) {
val currentUser : User = userManager.currentUser.blockingGet()
// Log.d("TranslateActivity Current User", currentUser.toString())
val credentials : String = ApiUtils.getCredentials(currentUser.username, currentUser.token)
val translateURL = currentUser.baseUrl + "/ocs/v2.php//translation/translate?text=" + text+ "&toLanguage=" + toLanguage
val translateURL = currentUser.baseUrl +
"/ocs/v2.php/translation/translate?text=$text&toLanguage=$toLanguage" +
if(fromLanguage != "") { "&fromLanguage=$fromLanguage" } else {""}
ncApi.translateMessage(credentials, translateURL)
@ -109,6 +140,7 @@ class TranslateActivity : BaseActivity()
?.observeOn(AndroidSchedulers.mainThread())
?.subscribe(object : Observer<TranslationsOverall> {
override fun onSubscribe(d: Disposable) {
enableSpinners(false)
binding.translatedMessageTextview.visibility = View.GONE
binding.progressBar.visibility = View.VISIBLE
}
@ -116,14 +148,11 @@ class TranslateActivity : BaseActivity()
override fun onNext(translationOverall: TranslationsOverall) {
binding.progressBar.visibility = View.GONE
binding.translatedMessageTextview.visibility = View.VISIBLE
// binding.translatedMessageTextview.text = "Worked"
binding.translatedMessageTextview.text = translationOverall.ocs?.data?.text
}
override fun onError(e: Throwable) {
binding.progressBar.visibility = View.GONE
//
val builder = AlertDialog.Builder(this@TranslateActivity)
builder.setTitle("Translation Failed")
builder.setMessage("Could not detect language")
@ -132,24 +161,69 @@ class TranslateActivity : BaseActivity()
}
override fun onComplete() {
// not needed?
// nothing?
}
})
enableSpinners(true)
}
private fun setupSpinners() {
//TODO create a way to show that items are disabled/enabled
private fun getISOFromLanguage(language: String) : String {
if(language == "Device Settings") {
return Locale.getDefault().language
}
val currentUser : User = userManager.currentUser.blockingGet()
val json = JSONArray(CapabilitiesUtilNew.getLanguages(currentUser).toString())
for( i in 0..json.length()-1) {
val current = json.getJSONObject(i)
if (current.getString("fromLabel") == language) {
return current.getString("from")
}
}
return ""
}
private fun setupSpinners() {
binding.fromLanguageSpinner.adapter = ArrayAdapter(this, android.R.layout.simple_spinner_dropdown_item,
fromLanguages)
// binding.fromLanguageSpinner.isEnabled = false
binding.toLanguageSpinner.adapter = ArrayAdapter(this, android.R.layout.simple_spinner_dropdown_item,
toLanguages)
// binding.toLanguageSpinner.isEnabled = false
// TODO set up onclickers make sure to deal with options becoming unavaliable in the spinner onClicker
binding.fromLanguageSpinner.onItemSelectedListener = object : AdapterView.OnItemSelectedListener {
override fun onItemSelected(parent: AdapterView<*>, view: View, position: Int, id: Long) {
var fromLabel : String = getISOFromLanguage(parent.getItemAtPosition(position).toString())
var toLabel : String = getISOFromLanguage(binding.toLanguageSpinner.selectedItem.toString())
Log.i("TranslateActivity", "fromLanguageSpinner :: fromLabel = $fromLabel, toLabel = $toLabel")
translate(fromLabel, toLabel)
}
override fun onNothingSelected(parent: AdapterView<*>) {
// write code to perform some action
}
}
binding.toLanguageSpinner.onItemSelectedListener = object : AdapterView.OnItemSelectedListener {
override fun onItemSelected(parent: AdapterView<*>, view: View, position: Int, id: Long) {
var toLabel : String = getISOFromLanguage(parent.getItemAtPosition(position).toString())
var fromLabel : String = getISOFromLanguage(binding.fromLanguageSpinner.selectedItem.toString())
Log.i("TranslateActivity", "toLanguageSpinner :: fromLabel = $fromLabel, toLabel = $toLabel")
translate(fromLabel, toLabel)
}
override fun onNothingSelected(parent: AdapterView<*>) {
// write code to perform some action
}
}
}

View File

@ -88,7 +88,7 @@ class MessageActionsDialog(
viewThemeUtils.platform.themeDialog(dialogMessageActionsBinding.root)
initEmojiBar(hasChatPermission)
initMenuItemCopy(!message.isDeleted)
initMenuItemTranslate(!message.isDeleted)
initMenuItemTranslate(!message.isDeleted && CapabilitiesUtilNew.isTranslationsSupported(user))
initMenuReplyToMessage(message.replyable && hasChatPermission)
initMenuReplyPrivately(
message.replyable &&
@ -305,7 +305,7 @@ class MessageActionsDialog(
}
}
dialogMessageActionsBinding.menuCopyMessage.visibility = getVisibility(visible)
dialogMessageActionsBinding.menuTranslateMessage.visibility = getVisibility(visible)
}
private fun getVisibility(visible: Boolean): Int {

View File

@ -199,5 +199,27 @@ object CapabilitiesUtilNew {
return false
}
fun isTranslationsSupported(user: User?): Boolean {
if (user?.capabilities != null) {
val capabilities = user.capabilities
return capabilities?.spreedCapability?.config?.containsKey("chat") == true &&
capabilities.spreedCapability!!.config!!["chat"] != null &&
capabilities.spreedCapability!!.config!!["chat"]!!.containsKey("translations")
}
return false
}
fun getLanguages(user: User?) : Any? {
if(isTranslationsSupported(user)) {
return user!!.capabilities!!.spreedCapability!!.config!!["chat"]!!["translations"]
}
return null
}
const val DEFAULT_CHAT_SIZE = 1000
}

View File

@ -45,7 +45,7 @@
<ImageButton
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:backgroundTint="@color/colorBackgroundDarker"
android:backgroundTint="@color/medium_emphasis_text"
android:background="@drawable/ic_chevron_right"
/>