Browse Source

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>

rapterjet2004 2 years ago
parent
commit
0f8aa7f9e6

+ 96 - 22
app/src/main/java/com/nextcloud/talk/translate/TranslateActivity.kt

@@ -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
-        binding.fromLanguageSpinner.adapter = ArrayAdapter(this, android.R.layout.simple_spinner_dropdown_item,
-            fromLanguages)
-        // binding.fromLanguageSpinner.isEnabled = false
+    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.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
+            }
+        }
+
+
+
     }
 
 

+ 2 - 2
app/src/main/java/com/nextcloud/talk/ui/dialog/MessageActionsDialog.kt

@@ -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 {

+ 22 - 0
app/src/main/java/com/nextcloud/talk/utils/database/user/CapabilitiesUtilNew.kt

@@ -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
 }

+ 1 - 1
app/src/main/res/layout/activity_translate.xml

@@ -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"
             />