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.graphics.drawable.ColorDrawable
import android.os.Bundle import android.os.Bundle
import android.text.method.ScrollingMovementMethod import android.text.method.ScrollingMovementMethod
import android.util.Log
import android.view.View import android.view.View
import android.widget.AdapterView
import android.widget.ArrayAdapter import android.widget.ArrayAdapter
import autodagger.AutoInjector import autodagger.AutoInjector
import com.nextcloud.talk.R 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.users.UserManager
import com.nextcloud.talk.utils.ApiUtils import com.nextcloud.talk.utils.ApiUtils
import com.nextcloud.talk.utils.bundle.BundleKeys import com.nextcloud.talk.utils.bundle.BundleKeys
import com.nextcloud.talk.utils.database.user.CapabilitiesUtilNew
import io.reactivex.Observer import io.reactivex.Observer
import io.reactivex.android.schedulers.AndroidSchedulers import io.reactivex.android.schedulers.AndroidSchedulers
import io.reactivex.disposables.Disposable import io.reactivex.disposables.Disposable
import io.reactivex.schedulers.Schedulers import io.reactivex.schedulers.Schedulers
import org.json.JSONArray
import java.util.Locale import java.util.Locale
import javax.inject.Inject import javax.inject.Inject
@ -39,15 +43,16 @@ class TranslateActivity : BaseActivity()
@Inject @Inject
lateinit var userManager: UserManager 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 text : String? = null
var fromLanguage : String = "de"
val toLanguage : String = Locale.getDefault().language
override fun onCreate(savedInstanceState: Bundle?) { override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState) super.onCreate(savedInstanceState)
@ -58,8 +63,9 @@ class TranslateActivity : BaseActivity()
setContentView(binding.root) setContentView(binding.root)
setupTextViews() setupTextViews()
setupSpinners() setupSpinners()
translate()
getLanguageOptions() getLanguageOptions()
translate(null, Locale.getDefault().language)
} }
private fun setupActionBar() { private fun setupActionBar() {
@ -84,24 +90,49 @@ class TranslateActivity : BaseActivity()
val bundle = intent.extras val bundle = intent.extras
binding.originalMessageTextview.text = bundle?.getString(BundleKeys.KEY_TRANSLATE_MESSAGE) binding.originalMessageTextview.text = bundle?.getString(BundleKeys.KEY_TRANSLATE_MESSAGE)
text = bundle?.getString(BundleKeys.KEY_TRANSLATE_MESSAGE) text = bundle?.getString(BundleKeys.KEY_TRANSLATE_MESSAGE)
} }
private fun getLanguageOptions() { private fun getLanguageOptions() {
// TODO implement this function to retrieve an array of strings from the server for each language option val currentUser : User = userManager.currentUser.blockingGet()
// weird, for some reason I'm not getting a body from the server, but I'm getting a 200 OK, that's dumb 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() val currentUser : User = userManager.currentUser.blockingGet()
// Log.d("TranslateActivity Current User", currentUser.toString())
val credentials : String = ApiUtils.getCredentials(currentUser.username, currentUser.token) 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) ncApi.translateMessage(credentials, translateURL)
@ -109,6 +140,7 @@ class TranslateActivity : BaseActivity()
?.observeOn(AndroidSchedulers.mainThread()) ?.observeOn(AndroidSchedulers.mainThread())
?.subscribe(object : Observer<TranslationsOverall> { ?.subscribe(object : Observer<TranslationsOverall> {
override fun onSubscribe(d: Disposable) { override fun onSubscribe(d: Disposable) {
enableSpinners(false)
binding.translatedMessageTextview.visibility = View.GONE binding.translatedMessageTextview.visibility = View.GONE
binding.progressBar.visibility = View.VISIBLE binding.progressBar.visibility = View.VISIBLE
} }
@ -116,14 +148,11 @@ class TranslateActivity : BaseActivity()
override fun onNext(translationOverall: TranslationsOverall) { override fun onNext(translationOverall: TranslationsOverall) {
binding.progressBar.visibility = View.GONE binding.progressBar.visibility = View.GONE
binding.translatedMessageTextview.visibility = View.VISIBLE binding.translatedMessageTextview.visibility = View.VISIBLE
// binding.translatedMessageTextview.text = "Worked"
binding.translatedMessageTextview.text = translationOverall.ocs?.data?.text binding.translatedMessageTextview.text = translationOverall.ocs?.data?.text
} }
override fun onError(e: Throwable) { override fun onError(e: Throwable) {
binding.progressBar.visibility = View.GONE binding.progressBar.visibility = View.GONE
//
val builder = AlertDialog.Builder(this@TranslateActivity) val builder = AlertDialog.Builder(this@TranslateActivity)
builder.setTitle("Translation Failed") builder.setTitle("Translation Failed")
builder.setMessage("Could not detect language") builder.setMessage("Could not detect language")
@ -132,24 +161,69 @@ class TranslateActivity : BaseActivity()
} }
override fun onComplete() { 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, binding.fromLanguageSpinner.adapter = ArrayAdapter(this, android.R.layout.simple_spinner_dropdown_item,
fromLanguages) fromLanguages)
// binding.fromLanguageSpinner.isEnabled = false
binding.toLanguageSpinner.adapter = ArrayAdapter(this, android.R.layout.simple_spinner_dropdown_item, binding.toLanguageSpinner.adapter = ArrayAdapter(this, android.R.layout.simple_spinner_dropdown_item,
toLanguages) 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) viewThemeUtils.platform.themeDialog(dialogMessageActionsBinding.root)
initEmojiBar(hasChatPermission) initEmojiBar(hasChatPermission)
initMenuItemCopy(!message.isDeleted) initMenuItemCopy(!message.isDeleted)
initMenuItemTranslate(!message.isDeleted) initMenuItemTranslate(!message.isDeleted && CapabilitiesUtilNew.isTranslationsSupported(user))
initMenuReplyToMessage(message.replyable && hasChatPermission) initMenuReplyToMessage(message.replyable && hasChatPermission)
initMenuReplyPrivately( initMenuReplyPrivately(
message.replyable && message.replyable &&
@ -305,7 +305,7 @@ class MessageActionsDialog(
} }
} }
dialogMessageActionsBinding.menuCopyMessage.visibility = getVisibility(visible) dialogMessageActionsBinding.menuTranslateMessage.visibility = getVisibility(visible)
} }
private fun getVisibility(visible: Boolean): Int { private fun getVisibility(visible: Boolean): Int {

View File

@ -199,5 +199,27 @@ object CapabilitiesUtilNew {
return false 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 const val DEFAULT_CHAT_SIZE = 1000
} }

View File

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