From 8cdd8e9d8fb7cd3f681c80c9076285d5ba0c650c Mon Sep 17 00:00:00 2001 From: rapterjet2004 Date: Mon, 15 May 2023 09:30:08 -0500 Subject: [PATCH 01/15] issue 2931 progress Signed-off-by: Julius Linus Signed-off-by: Andy Scherzinger --- app/src/main/AndroidManifest.xml | 4 + .../java/com/nextcloud/talk/api/NcApi.java | 15 ++ .../com/nextcloud/talk/chat/ChatActivity.kt | 11 ++ .../models/json/translations/TranslateData.kt | 19 +++ .../models/json/translations/TranslateOCS.kt | 19 +++ .../json/translations/TranslationsOverall.kt | 16 +++ .../talk/translate/TranslateActivity.kt | 136 ++++++++++++++++++ .../talk/ui/dialog/MessageActionsDialog.kt | 12 ++ .../nextcloud/talk/utils/bundle/BundleKeys.kt | 1 + .../res/drawable/ic_baseline_translate_24.xml | 5 + .../main/res/layout/activity_translate.xml | 100 +++++++++++++ .../res/layout/dialog_message_actions.xml | 33 +++++ app/src/main/res/values/strings.xml | 2 + 13 files changed, 373 insertions(+) create mode 100644 app/src/main/java/com/nextcloud/talk/models/json/translations/TranslateData.kt create mode 100644 app/src/main/java/com/nextcloud/talk/models/json/translations/TranslateOCS.kt create mode 100644 app/src/main/java/com/nextcloud/talk/models/json/translations/TranslationsOverall.kt create mode 100644 app/src/main/java/com/nextcloud/talk/translate/TranslateActivity.kt create mode 100644 app/src/main/res/drawable/ic_baseline_translate_24.xml create mode 100644 app/src/main/res/layout/activity_translate.xml diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index c9ce563ec..05ab0ba8e 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -189,6 +189,10 @@ android:name=".location.GeocodingActivity" android:theme="@style/AppTheme" /> + + diff --git a/app/src/main/java/com/nextcloud/talk/api/NcApi.java b/app/src/main/java/com/nextcloud/talk/api/NcApi.java index 6204f5218..2b41e9caa 100644 --- a/app/src/main/java/com/nextcloud/talk/api/NcApi.java +++ b/app/src/main/java/com/nextcloud/talk/api/NcApi.java @@ -44,6 +44,7 @@ import com.nextcloud.talk.models.json.search.ContactsByNumberOverall; import com.nextcloud.talk.models.json.signaling.SignalingOverall; import com.nextcloud.talk.models.json.signaling.settings.SignalingSettingsOverall; import com.nextcloud.talk.models.json.status.StatusOverall; +import com.nextcloud.talk.models.json.translations.TranslationsOverall; import com.nextcloud.talk.models.json.unifiedsearch.UnifiedSearchOverall; import com.nextcloud.talk.models.json.userprofile.UserProfileFieldsOverall; import com.nextcloud.talk.models.json.userprofile.UserProfileOverall; @@ -654,4 +655,18 @@ public interface NcApi { @DELETE Observable sendCommonDeleteRequest(@Header("Authorization") String authorization, @Url String url); + + @POST + Observable translateMessage(@Header("Authorization") String authorization, + @Url String url, + @Field("text") String text, + @Field("fromLanguage") String fromLanguage, + @Field("toLanguage") String toLanguage); + +// @GET +// Observable getLanguageOptions(@Header("Authorization") String authorization, +// @Url String url, +// @Field("languageDetection") String fromLanguage, +// @Field("languages") Object languages[]); + // TODO finish ^ function declaration } diff --git a/app/src/main/java/com/nextcloud/talk/chat/ChatActivity.kt b/app/src/main/java/com/nextcloud/talk/chat/ChatActivity.kt index 292911191..4827ac978 100644 --- a/app/src/main/java/com/nextcloud/talk/chat/ChatActivity.kt +++ b/app/src/main/java/com/nextcloud/talk/chat/ChatActivity.kt @@ -150,6 +150,7 @@ import com.nextcloud.talk.remotefilebrowser.activities.RemoteFileBrowserActivity import com.nextcloud.talk.repositories.reactions.ReactionsRepository import com.nextcloud.talk.shareditems.activities.SharedItemsActivity import com.nextcloud.talk.signaling.SignalingMessageReceiver +import com.nextcloud.talk.translate.TranslateActivity import com.nextcloud.talk.ui.bottom.sheet.ProfileBottomSheet import com.nextcloud.talk.ui.dialog.AttachmentDialog import com.nextcloud.talk.ui.dialog.MessageActionsDialog @@ -3231,6 +3232,16 @@ class ChatActivity : clipboardManager.setPrimaryClip(clipData) } + fun translateMessage(message: IMessage?) { + val bundle = Bundle() + bundle.putString(BundleKeys.KEY_TRANSLATE_MESSAGE, message?.text) + + val intent = Intent(this, TranslateActivity::class.java) + intent.putExtras(bundle) + startActivity(intent) + + } + private fun hasVisibleItems(message: ChatMessage): Boolean { return !message.isDeleted || // copy message message.replyable || // reply to diff --git a/app/src/main/java/com/nextcloud/talk/models/json/translations/TranslateData.kt b/app/src/main/java/com/nextcloud/talk/models/json/translations/TranslateData.kt new file mode 100644 index 000000000..761562e22 --- /dev/null +++ b/app/src/main/java/com/nextcloud/talk/models/json/translations/TranslateData.kt @@ -0,0 +1,19 @@ +package com.nextcloud.talk.models.json.translations + +import android.os.Parcelable +import com.bluelinelabs.logansquare.annotation.JsonField +import com.bluelinelabs.logansquare.annotation.JsonObject +import kotlinx.parcelize.Parcelize + +@Parcelize +@JsonObject +data class TranslateData( + + @JsonField(name = ["text"]) + var text: String?, + @JsonField(name = ["from"]) + var fromLanguage: String? +) : Parcelable { + // This constructor is added to work with the 'com.bluelinelabs.logansquare.annotation.JsonObject' + constructor() : this(null, null ) +} \ No newline at end of file diff --git a/app/src/main/java/com/nextcloud/talk/models/json/translations/TranslateOCS.kt b/app/src/main/java/com/nextcloud/talk/models/json/translations/TranslateOCS.kt new file mode 100644 index 000000000..608eeeb94 --- /dev/null +++ b/app/src/main/java/com/nextcloud/talk/models/json/translations/TranslateOCS.kt @@ -0,0 +1,19 @@ +package com.nextcloud.talk.models.json.translations + +import android.os.Parcelable +import com.bluelinelabs.logansquare.annotation.JsonField +import com.bluelinelabs.logansquare.annotation.JsonObject +import com.nextcloud.talk.models.json.generic.GenericMeta +import kotlinx.parcelize.Parcelize + +@Parcelize +@JsonObject +data class TranslateOCS( // TODO finish this model + @JsonField(name = ["meta"]) + var meta: GenericMeta?, + @JsonField(name = ["data"]) + var data: TranslateData? +) : Parcelable { + // This constructor is added to work with the 'com.bluelinelabs.logansquare.annotation.JsonObject' + constructor() : this(null, TranslateData()) +} \ No newline at end of file diff --git a/app/src/main/java/com/nextcloud/talk/models/json/translations/TranslationsOverall.kt b/app/src/main/java/com/nextcloud/talk/models/json/translations/TranslationsOverall.kt new file mode 100644 index 000000000..8fbc9b80d --- /dev/null +++ b/app/src/main/java/com/nextcloud/talk/models/json/translations/TranslationsOverall.kt @@ -0,0 +1,16 @@ +package com.nextcloud.talk.models.json.translations + +import android.os.Parcelable +import com.bluelinelabs.logansquare.annotation.JsonField +import com.bluelinelabs.logansquare.annotation.JsonObject +import kotlinx.parcelize.Parcelize + +@Parcelize +@JsonObject +class TranslationsOverall( + @JsonField(name = ["ocs"]) + var ocs: TranslateOCS? + ) : Parcelable { + // This constructor is added to work with the 'com.bluelinelabs.logansquare.annotation.JsonObject' + constructor() : this(null) + } \ No newline at end of file diff --git a/app/src/main/java/com/nextcloud/talk/translate/TranslateActivity.kt b/app/src/main/java/com/nextcloud/talk/translate/TranslateActivity.kt new file mode 100644 index 000000000..baf5f6fdb --- /dev/null +++ b/app/src/main/java/com/nextcloud/talk/translate/TranslateActivity.kt @@ -0,0 +1,136 @@ +package com.nextcloud.talk.translate +import android.graphics.drawable.ColorDrawable +import android.os.Bundle +import android.text.method.ScrollingMovementMethod +import android.view.View +import autodagger.AutoInjector +import com.nextcloud.talk.R +import com.nextcloud.talk.activities.BaseActivity +import com.nextcloud.talk.api.NcApi +import com.nextcloud.talk.application.NextcloudTalkApplication +import com.nextcloud.talk.data.user.model.User +import com.nextcloud.talk.databinding.ActivityTranslateBinding +import com.nextcloud.talk.users.UserManager +import com.nextcloud.talk.utils.bundle.BundleKeys +import javax.inject.Inject + + + +// TODO include license at top of the file + + +@AutoInjector(NextcloudTalkApplication::class) +class TranslateActivity : BaseActivity() +{ + private lateinit var binding: ActivityTranslateBinding + + @Inject + lateinit var ncApi: NcApi + + @Inject + lateinit var userManager: UserManager + + lateinit var currentUser: User + + val url : String? = currentUser.baseUrl + "/translation" + + var text : String? = null + + var fromLanguage : String = "en" + + val toLanguage : String = "de" + + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + binding = ActivityTranslateBinding.inflate(layoutInflater) + + + setupTextViews() + setupActionBar() + setupSpinners() + setContentView(binding.root) + // translate() + } + + private fun setupActionBar() { + setSupportActionBar(binding.translationToolbar) + binding.translationToolbar.setNavigationOnClickListener { + onBackPressed() + } + supportActionBar?.setDisplayHomeAsUpEnabled(true) + supportActionBar?.setDisplayShowHomeEnabled(true) + supportActionBar?.setIcon(ColorDrawable(resources!!.getColor(R.color.transparent))) + supportActionBar?.title = "Translation" + viewThemeUtils.material.themeToolbar(binding.translationToolbar) + } + + private fun setupTextViews() { + val original = binding.originalMessageTextview + val translation = binding.translatedMessageTextview + + original.movementMethod = ScrollingMovementMethod() + translation.movementMethod = ScrollingMovementMethod() + + val bundle = intent.extras + binding.originalMessageTextview.text = bundle?.getString(BundleKeys.KEY_TRANSLATE_MESSAGE) + text = binding.originalMessageTextview.text as String? + } + + + private fun getLanguageOptions() { + // TODO implement this function to retrieve an array of strings from the server for each language option + // this uses another call to their /languages endpoint which requires another separate function in ncAPI and + // seprarate models for the JSON :| + } + + // TODO get this function working + // private fun translate() { + // val credentials = ApiUtils.getCredentials(currentUser.username, currentUser.token) + // + // val translateURL = url + "/translate" + // + // + // + // ncApi.translateMessage(credentials, translateURL, text, fromLanguage, toLanguage) + // ?.subscribeOn(Schedulers.io()) + // ?.observeOn(AndroidSchedulers.mainThread()) + // ?.subscribe(object : Observer { + // override fun onSubscribe(d: Disposable) { + // // TODO set progress bar to show + // binding.translatedMessageTextview.visibility = View.GONE + // binding.progressBar.visibility = View.VISIBLE + // } + // + // override fun onNext(translationOverall: TranslationsOverall) { + // // TODO hide progress bar + // binding.progressBar.visibility = View.GONE + // binding.translatedMessageTextview.visibility = View.VISIBLE + // binding.translatedMessageTextview.text = translationOverall.ocs?.data?.text + // } + // + // override fun onError(e: Throwable) { + // Log.e("TranslateActivity", "Error") + // } + // + // override fun onComplete() { + // // not needed? + // } + // }) + // + // } + + private fun setupSpinners() { + // TODO set spinner options to use array from getLanguageOptions() + + // TODO set onClickListener to call server using translate() + binding.toLanguageSpinner.setOnClickListener(View.OnClickListener { + // translate() + }) + + binding.fromLanguageSpinner.setOnClickListener(View.OnClickListener { + // translate() + }) + } + + +} \ No newline at end of file diff --git a/app/src/main/java/com/nextcloud/talk/ui/dialog/MessageActionsDialog.kt b/app/src/main/java/com/nextcloud/talk/ui/dialog/MessageActionsDialog.kt index 9b93117fc..dbf59af04 100644 --- a/app/src/main/java/com/nextcloud/talk/ui/dialog/MessageActionsDialog.kt +++ b/app/src/main/java/com/nextcloud/talk/ui/dialog/MessageActionsDialog.kt @@ -88,6 +88,7 @@ class MessageActionsDialog( viewThemeUtils.platform.themeDialog(dialogMessageActionsBinding.root) initEmojiBar(hasChatPermission) initMenuItemCopy(!message.isDeleted) + initMenuItemTranslate(!message.isDeleted) initMenuReplyToMessage(message.replyable && hasChatPermission) initMenuReplyPrivately( message.replyable && @@ -296,6 +297,17 @@ class MessageActionsDialog( dialogMessageActionsBinding.menuCopyMessage.visibility = getVisibility(visible) } + private fun initMenuItemTranslate(visible: Boolean) { + if (visible) { + dialogMessageActionsBinding.menuTranslateMessage.setOnClickListener { + chatActivity.translateMessage(message) + dismiss() + } + } + + dialogMessageActionsBinding.menuCopyMessage.visibility = getVisibility(visible) + } + private fun getVisibility(visible: Boolean): Int { return if (visible) { View.VISIBLE diff --git a/app/src/main/java/com/nextcloud/talk/utils/bundle/BundleKeys.kt b/app/src/main/java/com/nextcloud/talk/utils/bundle/BundleKeys.kt index dc6a893d3..88f8acb4a 100644 --- a/app/src/main/java/com/nextcloud/talk/utils/bundle/BundleKeys.kt +++ b/app/src/main/java/com/nextcloud/talk/utils/bundle/BundleKeys.kt @@ -29,6 +29,7 @@ object BundleKeys { const val KEY_SELECTED_EMAILS = "KEY_SELECTED_EMAILS" const val KEY_USERNAME = "KEY_USERNAME" const val KEY_TOKEN = "KEY_TOKEN" + const val KEY_TRANSLATE_MESSAGE = "KEY_TRANSLATE_MESSAGE" const val KEY_BASE_URL = "KEY_BASE_URL" const val KEY_IS_ACCOUNT_IMPORT = "KEY_IS_ACCOUNT_IMPORT" const val KEY_ORIGINAL_PROTOCOL = "KEY_ORIGINAL_PROTOCOL" diff --git a/app/src/main/res/drawable/ic_baseline_translate_24.xml b/app/src/main/res/drawable/ic_baseline_translate_24.xml new file mode 100644 index 000000000..1a73c2d64 --- /dev/null +++ b/app/src/main/res/drawable/ic_baseline_translate_24.xml @@ -0,0 +1,5 @@ + + + diff --git a/app/src/main/res/layout/activity_translate.xml b/app/src/main/res/layout/activity_translate.xml new file mode 100644 index 000000000..806d24178 --- /dev/null +++ b/app/src/main/res/layout/activity_translate.xml @@ -0,0 +1,100 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/dialog_message_actions.xml b/app/src/main/res/layout/dialog_message_actions.xml index ebd2987f0..ebbf99827 100644 --- a/app/src/main/res/layout/dialog_message_actions.xml +++ b/app/src/main/res/layout/dialog_message_actions.xml @@ -287,6 +287,39 @@ + + + + + + + + You are not allowed to activate audio! You are not allowed to activate video! Scroll to bottom + Translate + Translation From 0168be395a2e90bac34c0c1f427c0a6463aedc1b Mon Sep 17 00:00:00 2001 From: rapterjet2004 Date: Mon, 15 May 2023 09:39:08 -0500 Subject: [PATCH 02/15] issue 2931 progress Signed-off-by: Julius Linus Signed-off-by: Andy Scherzinger --- .../talk/translate/TranslateActivity.kt | 28 +++++++++---------- 1 file changed, 13 insertions(+), 15 deletions(-) diff --git a/app/src/main/java/com/nextcloud/talk/translate/TranslateActivity.kt b/app/src/main/java/com/nextcloud/talk/translate/TranslateActivity.kt index baf5f6fdb..16286521e 100644 --- a/app/src/main/java/com/nextcloud/talk/translate/TranslateActivity.kt +++ b/app/src/main/java/com/nextcloud/talk/translate/TranslateActivity.kt @@ -2,13 +2,11 @@ package com.nextcloud.talk.translate import android.graphics.drawable.ColorDrawable import android.os.Bundle import android.text.method.ScrollingMovementMethod -import android.view.View import autodagger.AutoInjector import com.nextcloud.talk.R import com.nextcloud.talk.activities.BaseActivity import com.nextcloud.talk.api.NcApi import com.nextcloud.talk.application.NextcloudTalkApplication -import com.nextcloud.talk.data.user.model.User import com.nextcloud.talk.databinding.ActivityTranslateBinding import com.nextcloud.talk.users.UserManager import com.nextcloud.talk.utils.bundle.BundleKeys @@ -30,9 +28,9 @@ class TranslateActivity : BaseActivity() @Inject lateinit var userManager: UserManager - lateinit var currentUser: User + // lateinit var currentUser: User - val url : String? = currentUser.baseUrl + "/translation" + // val url : String? = currentUser.baseUrl + "/translation" var text : String? = null @@ -43,7 +41,9 @@ class TranslateActivity : BaseActivity() override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) binding = ActivityTranslateBinding.inflate(layoutInflater) - + val bundle = intent.extras + binding.originalMessageTextview.text = bundle?.getString(BundleKeys.KEY_TRANSLATE_MESSAGE) + text = binding.originalMessageTextview.text as String? setupTextViews() setupActionBar() @@ -71,9 +71,7 @@ class TranslateActivity : BaseActivity() original.movementMethod = ScrollingMovementMethod() translation.movementMethod = ScrollingMovementMethod() - val bundle = intent.extras - binding.originalMessageTextview.text = bundle?.getString(BundleKeys.KEY_TRANSLATE_MESSAGE) - text = binding.originalMessageTextview.text as String? + } @@ -123,13 +121,13 @@ class TranslateActivity : BaseActivity() // TODO set spinner options to use array from getLanguageOptions() // TODO set onClickListener to call server using translate() - binding.toLanguageSpinner.setOnClickListener(View.OnClickListener { - // translate() - }) - - binding.fromLanguageSpinner.setOnClickListener(View.OnClickListener { - // translate() - }) + // binding.toLanguageSpinner.setOnClickListener(View.OnClickListener { + // // translate() + // }) + // + // binding.fromLanguageSpinner.setOnClickListener(View.OnClickListener { + // // translate() + // }) } From 9e9c6e81b94021ead237627d6a661e1839d349ef Mon Sep 17 00:00:00 2001 From: rapterjet2004 Date: Mon, 15 May 2023 09:50:18 -0500 Subject: [PATCH 03/15] issue 2931 progress Signed-off-by: Julius Linus Signed-off-by: Andy Scherzinger --- .../talk/translate/TranslateActivity.kt | 91 ++++++++++--------- 1 file changed, 49 insertions(+), 42 deletions(-) diff --git a/app/src/main/java/com/nextcloud/talk/translate/TranslateActivity.kt b/app/src/main/java/com/nextcloud/talk/translate/TranslateActivity.kt index 16286521e..b3694ba97 100644 --- a/app/src/main/java/com/nextcloud/talk/translate/TranslateActivity.kt +++ b/app/src/main/java/com/nextcloud/talk/translate/TranslateActivity.kt @@ -2,14 +2,23 @@ package com.nextcloud.talk.translate import android.graphics.drawable.ColorDrawable import android.os.Bundle import android.text.method.ScrollingMovementMethod +import android.util.Log +import android.view.View import autodagger.AutoInjector import com.nextcloud.talk.R import com.nextcloud.talk.activities.BaseActivity import com.nextcloud.talk.api.NcApi import com.nextcloud.talk.application.NextcloudTalkApplication +import com.nextcloud.talk.data.user.model.User import com.nextcloud.talk.databinding.ActivityTranslateBinding +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 io.reactivex.Observer +import io.reactivex.android.schedulers.AndroidSchedulers +import io.reactivex.disposables.Disposable +import io.reactivex.schedulers.Schedulers import javax.inject.Inject @@ -28,9 +37,7 @@ class TranslateActivity : BaseActivity() @Inject lateinit var userManager: UserManager - // lateinit var currentUser: User - - // val url : String? = currentUser.baseUrl + "/translation" + lateinit var currentUser : User var text : String? = null @@ -41,15 +48,12 @@ class TranslateActivity : BaseActivity() override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) binding = ActivityTranslateBinding.inflate(layoutInflater) - val bundle = intent.extras - binding.originalMessageTextview.text = bundle?.getString(BundleKeys.KEY_TRANSLATE_MESSAGE) - text = binding.originalMessageTextview.text as String? - + currentUser = userManager.currentUser.blockingGet() setupTextViews() setupActionBar() setupSpinners() setContentView(binding.root) - // translate() + translate() } private fun setupActionBar() { @@ -71,6 +75,10 @@ class TranslateActivity : BaseActivity() original.movementMethod = ScrollingMovementMethod() translation.movementMethod = ScrollingMovementMethod() + val bundle = intent.extras + binding.originalMessageTextview.text = bundle?.getString(BundleKeys.KEY_TRANSLATE_MESSAGE) + text = binding.originalMessageTextview.text as String? + } @@ -82,40 +90,39 @@ class TranslateActivity : BaseActivity() } // TODO get this function working - // private fun translate() { - // val credentials = ApiUtils.getCredentials(currentUser.username, currentUser.token) - // - // val translateURL = url + "/translate" - // - // - // - // ncApi.translateMessage(credentials, translateURL, text, fromLanguage, toLanguage) - // ?.subscribeOn(Schedulers.io()) - // ?.observeOn(AndroidSchedulers.mainThread()) - // ?.subscribe(object : Observer { - // override fun onSubscribe(d: Disposable) { - // // TODO set progress bar to show - // binding.translatedMessageTextview.visibility = View.GONE - // binding.progressBar.visibility = View.VISIBLE - // } - // - // override fun onNext(translationOverall: TranslationsOverall) { - // // TODO hide progress bar - // binding.progressBar.visibility = View.GONE - // binding.translatedMessageTextview.visibility = View.VISIBLE - // binding.translatedMessageTextview.text = translationOverall.ocs?.data?.text - // } - // - // override fun onError(e: Throwable) { - // Log.e("TranslateActivity", "Error") - // } - // - // override fun onComplete() { - // // not needed? - // } - // }) - // - // } + private fun translate() { + val credentials = ApiUtils.getCredentials(currentUser.username, currentUser.token) + val translateURL = currentUser.baseUrl + "/translation" + "/translate" + + + + ncApi.translateMessage(credentials, translateURL, text, fromLanguage, toLanguage) + ?.subscribeOn(Schedulers.io()) + ?.observeOn(AndroidSchedulers.mainThread()) + ?.subscribe(object : Observer { + override fun onSubscribe(d: Disposable) { + // TODO set progress bar to show + binding.translatedMessageTextview.visibility = View.GONE + binding.progressBar.visibility = View.VISIBLE + } + + override fun onNext(translationOverall: TranslationsOverall) { + // TODO hide progress bar + binding.progressBar.visibility = View.GONE + binding.translatedMessageTextview.visibility = View.VISIBLE + binding.translatedMessageTextview.text = translationOverall.ocs?.data?.text + } + + override fun onError(e: Throwable) { + Log.e("TranslateActivity", "Error") + } + + override fun onComplete() { + // not needed? + } + }) + + } private fun setupSpinners() { // TODO set spinner options to use array from getLanguageOptions() From b91e17ca3dd291c623b87e0ee7606e09bf7327a2 Mon Sep 17 00:00:00 2001 From: rapterjet2004 Date: Mon, 15 May 2023 10:12:48 -0500 Subject: [PATCH 04/15] issue 2931 progress Signed-off-by: Julius Linus Signed-off-by: Andy Scherzinger --- .../talk/translate/TranslateActivity.kt | 71 ++++++++----------- 1 file changed, 31 insertions(+), 40 deletions(-) diff --git a/app/src/main/java/com/nextcloud/talk/translate/TranslateActivity.kt b/app/src/main/java/com/nextcloud/talk/translate/TranslateActivity.kt index b3694ba97..087e24817 100644 --- a/app/src/main/java/com/nextcloud/talk/translate/TranslateActivity.kt +++ b/app/src/main/java/com/nextcloud/talk/translate/TranslateActivity.kt @@ -2,23 +2,14 @@ package com.nextcloud.talk.translate import android.graphics.drawable.ColorDrawable import android.os.Bundle import android.text.method.ScrollingMovementMethod -import android.util.Log -import android.view.View import autodagger.AutoInjector import com.nextcloud.talk.R import com.nextcloud.talk.activities.BaseActivity import com.nextcloud.talk.api.NcApi import com.nextcloud.talk.application.NextcloudTalkApplication -import com.nextcloud.talk.data.user.model.User import com.nextcloud.talk.databinding.ActivityTranslateBinding -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 io.reactivex.Observer -import io.reactivex.android.schedulers.AndroidSchedulers -import io.reactivex.disposables.Disposable -import io.reactivex.schedulers.Schedulers import javax.inject.Inject @@ -37,8 +28,6 @@ class TranslateActivity : BaseActivity() @Inject lateinit var userManager: UserManager - lateinit var currentUser : User - var text : String? = null var fromLanguage : String = "en" @@ -48,7 +37,7 @@ class TranslateActivity : BaseActivity() override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) binding = ActivityTranslateBinding.inflate(layoutInflater) - currentUser = userManager.currentUser.blockingGet() + setupTextViews() setupActionBar() setupSpinners() @@ -77,7 +66,7 @@ class TranslateActivity : BaseActivity() val bundle = intent.extras binding.originalMessageTextview.text = bundle?.getString(BundleKeys.KEY_TRANSLATE_MESSAGE) - text = binding.originalMessageTextview.text as String? + text = bundle?.getString(BundleKeys.KEY_TRANSLATE_MESSAGE) } @@ -91,36 +80,38 @@ class TranslateActivity : BaseActivity() // TODO get this function working private fun translate() { - val credentials = ApiUtils.getCredentials(currentUser.username, currentUser.token) - val translateURL = currentUser.baseUrl + "/translation" + "/translate" + // var currentUser = userManager.currentUser.blockingGet() + // Log.d("TranslateActivity Current User", currentUser.toString()) + // val credentials = ApiUtils.getCredentials(currentUser.username, currentUser.token) + // val translateURL = currentUser.baseUrl + "/translation" + "/translate" - ncApi.translateMessage(credentials, translateURL, text, fromLanguage, toLanguage) - ?.subscribeOn(Schedulers.io()) - ?.observeOn(AndroidSchedulers.mainThread()) - ?.subscribe(object : Observer { - override fun onSubscribe(d: Disposable) { - // TODO set progress bar to show - binding.translatedMessageTextview.visibility = View.GONE - binding.progressBar.visibility = View.VISIBLE - } - - override fun onNext(translationOverall: TranslationsOverall) { - // TODO hide progress bar - binding.progressBar.visibility = View.GONE - binding.translatedMessageTextview.visibility = View.VISIBLE - binding.translatedMessageTextview.text = translationOverall.ocs?.data?.text - } - - override fun onError(e: Throwable) { - Log.e("TranslateActivity", "Error") - } - - override fun onComplete() { - // not needed? - } - }) + // ncApi.translateMessage(credentials, translateURL, text, fromLanguage, toLanguage) + // ?.subscribeOn(Schedulers.io()) + // ?.observeOn(AndroidSchedulers.mainThread()) + // ?.subscribe(object : Observer { + // override fun onSubscribe(d: Disposable) { + // // TODO set progress bar to show + // binding.translatedMessageTextview.visibility = View.GONE + // binding.progressBar.visibility = View.VISIBLE + // } + // + // override fun onNext(translationOverall: TranslationsOverall) { + // // TODO hide progress bar + // binding.progressBar.visibility = View.GONE + // binding.translatedMessageTextview.visibility = View.VISIBLE + // binding.translatedMessageTextview.text = translationOverall.ocs?.data?.text + // } + // + // override fun onError(e: Throwable) { + // Log.e("TranslateActivity", "Error") + // } + // + // override fun onComplete() { + // // not needed? + // } + // }) } From c6eacd30eab9ee940cce8cfd72a0db52e5afbb83 Mon Sep 17 00:00:00 2001 From: rapterjet2004 Date: Mon, 15 May 2023 15:54:32 -0500 Subject: [PATCH 05/15] issue 2931 progress - finally got most functionality + looks decent Signed-off-by: Julius Linus Signed-off-by: Andy Scherzinger --- .../java/com/nextcloud/talk/api/NcApi.java | 6 +- .../talk/translate/TranslateActivity.kt | 112 +++++++++++------- .../main/res/layout/activity_translate.xml | 58 ++++----- 3 files changed, 99 insertions(+), 77 deletions(-) diff --git a/app/src/main/java/com/nextcloud/talk/api/NcApi.java b/app/src/main/java/com/nextcloud/talk/api/NcApi.java index 2b41e9caa..5facfc05d 100644 --- a/app/src/main/java/com/nextcloud/talk/api/NcApi.java +++ b/app/src/main/java/com/nextcloud/talk/api/NcApi.java @@ -656,12 +656,10 @@ public interface NcApi { @DELETE Observable sendCommonDeleteRequest(@Header("Authorization") String authorization, @Url String url); + @POST Observable translateMessage(@Header("Authorization") String authorization, - @Url String url, - @Field("text") String text, - @Field("fromLanguage") String fromLanguage, - @Field("toLanguage") String toLanguage); + @Url String url); // @GET // Observable getLanguageOptions(@Header("Authorization") String authorization, diff --git a/app/src/main/java/com/nextcloud/talk/translate/TranslateActivity.kt b/app/src/main/java/com/nextcloud/talk/translate/TranslateActivity.kt index 087e24817..e1d84ad4c 100644 --- a/app/src/main/java/com/nextcloud/talk/translate/TranslateActivity.kt +++ b/app/src/main/java/com/nextcloud/talk/translate/TranslateActivity.kt @@ -1,15 +1,26 @@ package com.nextcloud.talk.translate +import android.app.AlertDialog import android.graphics.drawable.ColorDrawable import android.os.Bundle import android.text.method.ScrollingMovementMethod +import android.view.View +import android.widget.ArrayAdapter import autodagger.AutoInjector import com.nextcloud.talk.R import com.nextcloud.talk.activities.BaseActivity import com.nextcloud.talk.api.NcApi import com.nextcloud.talk.application.NextcloudTalkApplication +import com.nextcloud.talk.data.user.model.User import com.nextcloud.talk.databinding.ActivityTranslateBinding +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 io.reactivex.Observer +import io.reactivex.android.schedulers.AndroidSchedulers +import io.reactivex.disposables.Disposable +import io.reactivex.schedulers.Schedulers +import java.util.Locale import javax.inject.Inject @@ -28,21 +39,27 @@ class TranslateActivity : BaseActivity() @Inject lateinit var userManager: UserManager + var fromLanguages = arrayOf("Detect Language") + + var toLanguages = arrayOf("Device Default") + var text : String? = null - var fromLanguage : String = "en" + var fromLanguage : String = "de" - val toLanguage : String = "de" + val toLanguage : String = Locale.getDefault().language override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) + NextcloudTalkApplication.sharedApplication!!.componentApplication.inject(this) binding = ActivityTranslateBinding.inflate(layoutInflater) - setupTextViews() setupActionBar() - setupSpinners() setContentView(binding.root) + setupTextViews() + setupSpinners() translate() + getLanguageOptions() } private fun setupActionBar() { @@ -74,58 +91,65 @@ class TranslateActivity : BaseActivity() private fun getLanguageOptions() { // TODO implement this function to retrieve an array of strings from the server for each language option - // this uses another call to their /languages endpoint which requires another separate function in ncAPI and - // seprarate models for the JSON :| + // weird, for some reason I'm not getting a body from the server, but I'm getting a 200 OK, that's dumb + + } - // TODO get this function working + private fun translate() { - // var currentUser = userManager.currentUser.blockingGet() + val currentUser : User = userManager.currentUser.blockingGet() // Log.d("TranslateActivity Current User", currentUser.toString()) - // val credentials = ApiUtils.getCredentials(currentUser.username, currentUser.token) - // val translateURL = currentUser.baseUrl + "/translation" + "/translate" + val credentials : String = ApiUtils.getCredentials(currentUser.username, currentUser.token) + val translateURL = currentUser.baseUrl + "/ocs/v2.php//translation/translate?text=" + text+ "&toLanguage=" + toLanguage + ncApi.translateMessage(credentials, translateURL) + ?.subscribeOn(Schedulers.io()) + ?.observeOn(AndroidSchedulers.mainThread()) + ?.subscribe(object : Observer { + override fun onSubscribe(d: Disposable) { + binding.translatedMessageTextview.visibility = View.GONE + binding.progressBar.visibility = View.VISIBLE + } - // ncApi.translateMessage(credentials, translateURL, text, fromLanguage, toLanguage) - // ?.subscribeOn(Schedulers.io()) - // ?.observeOn(AndroidSchedulers.mainThread()) - // ?.subscribe(object : Observer { - // override fun onSubscribe(d: Disposable) { - // // TODO set progress bar to show - // binding.translatedMessageTextview.visibility = View.GONE - // binding.progressBar.visibility = View.VISIBLE - // } - // - // override fun onNext(translationOverall: TranslationsOverall) { - // // TODO hide progress bar - // binding.progressBar.visibility = View.GONE - // binding.translatedMessageTextview.visibility = View.VISIBLE - // binding.translatedMessageTextview.text = translationOverall.ocs?.data?.text - // } - // - // override fun onError(e: Throwable) { - // Log.e("TranslateActivity", "Error") - // } - // - // override fun onComplete() { - // // not needed? - // } - // }) + 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") + val dialog = builder.create() + dialog.show() + } + + override fun onComplete() { + // not needed? + } + }) } private fun setupSpinners() { - // TODO set spinner options to use array from getLanguageOptions() - // TODO set onClickListener to call server using translate() - // binding.toLanguageSpinner.setOnClickListener(View.OnClickListener { - // // translate() - // }) - // - // binding.fromLanguageSpinner.setOnClickListener(View.OnClickListener { - // // translate() - // }) + //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 + + + + + binding.toLanguageSpinner.adapter = ArrayAdapter(this, android.R.layout.simple_spinner_dropdown_item, + toLanguages) + // binding.toLanguageSpinner.isEnabled = false } diff --git a/app/src/main/res/layout/activity_translate.xml b/app/src/main/res/layout/activity_translate.xml index 806d24178..41e48776f 100644 --- a/app/src/main/res/layout/activity_translate.xml +++ b/app/src/main/res/layout/activity_translate.xml @@ -27,43 +27,40 @@ - - - + + android:background="@color/grey_200" + android:layout_marginRight="@dimen/standard_margin" + /> + + + + + + android:layout_height="wrap_content" + android:layout_toRightOf="@id/fromLanguageSpinner" + android:background="@color/grey_200" + android:layout_marginLeft="@dimen/standard_margin" + /> - + @@ -85,8 +82,11 @@ android:layout_margin="@dimen/standard_margin" android:layout_weight="1" android:scrollbars="vertical" + android:padding="@dimen/dialog_padding" + android:background="@drawable/shape_grouped_incoming_message" android:text="" android:textSize="@dimen/message_text_size" + android:textColor="@color/nc_incoming_text_default" android:visibility="visible" /> Date: Tue, 16 May 2023 14:41:06 -0500 Subject: [PATCH 06/15] issue 2931 progress - pretty much done with the functionality, just got a couple small adjustments Signed-off-by: Julius Linus Signed-off-by: Andy Scherzinger --- .../talk/translate/TranslateActivity.kt | 122 ++++++++++++++---- .../talk/ui/dialog/MessageActionsDialog.kt | 4 +- .../database/user/CapabilitiesUtilNew.kt | 22 ++++ .../main/res/layout/activity_translate.xml | 2 +- 4 files changed, 123 insertions(+), 27 deletions(-) diff --git a/app/src/main/java/com/nextcloud/talk/translate/TranslateActivity.kt b/app/src/main/java/com/nextcloud/talk/translate/TranslateActivity.kt index e1d84ad4c..2d5384b76 100644 --- a/app/src/main/java/com/nextcloud/talk/translate/TranslateActivity.kt +++ b/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() + + var toLanguages = arrayOf() 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("Detect Language") + var toLanguagesSet = mutableSetOf("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 { 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 + } + } + + + } diff --git a/app/src/main/java/com/nextcloud/talk/ui/dialog/MessageActionsDialog.kt b/app/src/main/java/com/nextcloud/talk/ui/dialog/MessageActionsDialog.kt index dbf59af04..6f56161d4 100644 --- a/app/src/main/java/com/nextcloud/talk/ui/dialog/MessageActionsDialog.kt +++ b/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 { diff --git a/app/src/main/java/com/nextcloud/talk/utils/database/user/CapabilitiesUtilNew.kt b/app/src/main/java/com/nextcloud/talk/utils/database/user/CapabilitiesUtilNew.kt index 2c1802faf..64ad6056b 100644 --- a/app/src/main/java/com/nextcloud/talk/utils/database/user/CapabilitiesUtilNew.kt +++ b/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 } diff --git a/app/src/main/res/layout/activity_translate.xml b/app/src/main/res/layout/activity_translate.xml index 41e48776f..04f431520 100644 --- a/app/src/main/res/layout/activity_translate.xml +++ b/app/src/main/res/layout/activity_translate.xml @@ -45,7 +45,7 @@ From 5bc0f82398effbcd459af31c2a8949ae0cfda637 Mon Sep 17 00:00:00 2001 From: rapterjet2004 Date: Tue, 16 May 2023 16:38:45 -0500 Subject: [PATCH 07/15] issue 2931 progress - final push I hope Signed-off-by: Julius Linus Signed-off-by: Andy Scherzinger --- .../java/com/nextcloud/talk/api/NcApi.java | 7 ---- .../talk/translate/TranslateActivity.kt | 34 +++++++++---------- 2 files changed, 17 insertions(+), 24 deletions(-) diff --git a/app/src/main/java/com/nextcloud/talk/api/NcApi.java b/app/src/main/java/com/nextcloud/talk/api/NcApi.java index 5facfc05d..77e6c3ac7 100644 --- a/app/src/main/java/com/nextcloud/talk/api/NcApi.java +++ b/app/src/main/java/com/nextcloud/talk/api/NcApi.java @@ -660,11 +660,4 @@ public interface NcApi { @POST Observable translateMessage(@Header("Authorization") String authorization, @Url String url); - -// @GET -// Observable getLanguageOptions(@Header("Authorization") String authorization, -// @Url String url, -// @Field("languageDetection") String fromLanguage, -// @Field("languages") Object languages[]); - // TODO finish ^ function declaration } diff --git a/app/src/main/java/com/nextcloud/talk/translate/TranslateActivity.kt b/app/src/main/java/com/nextcloud/talk/translate/TranslateActivity.kt index 2d5384b76..0100d97cb 100644 --- a/app/src/main/java/com/nextcloud/talk/translate/TranslateActivity.kt +++ b/app/src/main/java/com/nextcloud/talk/translate/TranslateActivity.kt @@ -43,15 +43,13 @@ class TranslateActivity : BaseActivity() @Inject lateinit var userManager: UserManager - - - var fromLanguages = arrayOf() var toLanguages = arrayOf() var text : String? = null + var check : Int = 0 override fun onCreate(savedInstanceState: Bundle?) { @@ -65,7 +63,6 @@ class TranslateActivity : BaseActivity() setupSpinners() getLanguageOptions() translate(null, Locale.getDefault().language) - } private fun setupActionBar() { @@ -132,9 +129,9 @@ class TranslateActivity : BaseActivity() val credentials : String = ApiUtils.getCredentials(currentUser.username, currentUser.token) val translateURL = currentUser.baseUrl + "/ocs/v2.php/translation/translate?text=$text&toLanguage=$toLanguage" + - if(fromLanguage != "") { "&fromLanguage=$fromLanguage" } else {""} - + if(fromLanguage != null && fromLanguage != "") { "&fromLanguage=$fromLanguage" } else {""} + Log.i("TranslateActivity", "Url is: $translateURL") ncApi.translateMessage(credentials, translateURL) ?.subscribeOn(Schedulers.io()) ?.observeOn(AndroidSchedulers.mainThread()) @@ -195,13 +192,15 @@ class TranslateActivity : BaseActivity() binding.toLanguageSpinner.adapter = ArrayAdapter(this, android.R.layout.simple_spinner_dropdown_item, toLanguages) - // 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) + if(++check > 1) { + var fromLabel : String = getISOFromLanguage(parent.getItemAtPosition(position).toString()) + var toLabel : String = getISOFromLanguage(binding.toLanguageSpinner.selectedItem.toString()) + Log.i("TranslateActivity", "fromLanguageSpinner :: fromLabel = $fromLabel, toLabel = $ count: " + + "$check") + translate(fromLabel, toLabel) + } } override fun onNothingSelected(parent: AdapterView<*>) { @@ -211,10 +210,13 @@ class TranslateActivity : BaseActivity() 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) + if(++check > 2) { + var toLabel : String = getISOFromLanguage(parent.getItemAtPosition(position).toString()) + var fromLabel : String = getISOFromLanguage(binding.fromLanguageSpinner.selectedItem.toString()) + Log.i("TranslateActivity", "toLanguageSpinner :: fromLabel = $fromLabel, toLabel = $toLabel " + + "count: $check") + translate(fromLabel, toLabel) + } } override fun onNothingSelected(parent: AdapterView<*>) { @@ -222,8 +224,6 @@ class TranslateActivity : BaseActivity() } } - - } From ac0f8608a78c28229b4da7fb3707efc01dd5ad02 Mon Sep 17 00:00:00 2001 From: Andy Scherzinger Date: Wed, 17 May 2023 09:35:42 +0200 Subject: [PATCH 08/15] Add licence headers and optimize/theme translation layout Signed-off-by: Andy Scherzinger --- .../com/nextcloud/talk/chat/ChatActivity.kt | 1 - .../models/json/translations/TranslateData.kt | 21 ++- .../models/json/translations/TranslateOCS.kt | 21 ++- .../json/translations/TranslationsOverall.kt | 27 +++- .../talk/translate/TranslateActivity.kt | 136 ++++++++++-------- .../ui/theme/TalkSpecificViewThemeUtils.kt | 4 +- .../database/user/CapabilitiesUtilNew.kt | 2 - .../res/drawable-night/ic_chevron_right.xml | 25 ++++ .../res/drawable/ic_baseline_translate_24.xml | 29 +++- .../main/res/drawable/ic_chevron_right.xml | 25 ++++ .../main/res/layout/activity_translate.xml | 87 ++++++----- 11 files changed, 272 insertions(+), 106 deletions(-) create mode 100644 app/src/main/res/drawable-night/ic_chevron_right.xml create mode 100644 app/src/main/res/drawable/ic_chevron_right.xml diff --git a/app/src/main/java/com/nextcloud/talk/chat/ChatActivity.kt b/app/src/main/java/com/nextcloud/talk/chat/ChatActivity.kt index 4827ac978..0a23661bf 100644 --- a/app/src/main/java/com/nextcloud/talk/chat/ChatActivity.kt +++ b/app/src/main/java/com/nextcloud/talk/chat/ChatActivity.kt @@ -3239,7 +3239,6 @@ class ChatActivity : val intent = Intent(this, TranslateActivity::class.java) intent.putExtras(bundle) startActivity(intent) - } private fun hasVisibleItems(message: ChatMessage): Boolean { diff --git a/app/src/main/java/com/nextcloud/talk/models/json/translations/TranslateData.kt b/app/src/main/java/com/nextcloud/talk/models/json/translations/TranslateData.kt index 761562e22..2f37fb57f 100644 --- a/app/src/main/java/com/nextcloud/talk/models/json/translations/TranslateData.kt +++ b/app/src/main/java/com/nextcloud/talk/models/json/translations/TranslateData.kt @@ -1,3 +1,22 @@ +/* + * Nextcloud Talk application + * + * @author Julius Linus + * Copyright (C) 2023 Julius Linus + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ package com.nextcloud.talk.models.json.translations import android.os.Parcelable @@ -16,4 +35,4 @@ data class TranslateData( ) : Parcelable { // This constructor is added to work with the 'com.bluelinelabs.logansquare.annotation.JsonObject' constructor() : this(null, null ) -} \ No newline at end of file +} diff --git a/app/src/main/java/com/nextcloud/talk/models/json/translations/TranslateOCS.kt b/app/src/main/java/com/nextcloud/talk/models/json/translations/TranslateOCS.kt index 608eeeb94..74ba31327 100644 --- a/app/src/main/java/com/nextcloud/talk/models/json/translations/TranslateOCS.kt +++ b/app/src/main/java/com/nextcloud/talk/models/json/translations/TranslateOCS.kt @@ -1,3 +1,22 @@ +/* + * Nextcloud Talk application + * + * @author Julius Linus + * Copyright (C) 2023 Julius Linus + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ package com.nextcloud.talk.models.json.translations import android.os.Parcelable @@ -16,4 +35,4 @@ data class TranslateOCS( // TODO finish this model ) : Parcelable { // This constructor is added to work with the 'com.bluelinelabs.logansquare.annotation.JsonObject' constructor() : this(null, TranslateData()) -} \ No newline at end of file +} diff --git a/app/src/main/java/com/nextcloud/talk/models/json/translations/TranslationsOverall.kt b/app/src/main/java/com/nextcloud/talk/models/json/translations/TranslationsOverall.kt index 8fbc9b80d..1b832e9cd 100644 --- a/app/src/main/java/com/nextcloud/talk/models/json/translations/TranslationsOverall.kt +++ b/app/src/main/java/com/nextcloud/talk/models/json/translations/TranslationsOverall.kt @@ -1,3 +1,22 @@ +/* + * Nextcloud Talk application + * + * @author Julius Linus + * Copyright (C) 2023 Julius Linus + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ package com.nextcloud.talk.models.json.translations import android.os.Parcelable @@ -10,7 +29,7 @@ import kotlinx.parcelize.Parcelize class TranslationsOverall( @JsonField(name = ["ocs"]) var ocs: TranslateOCS? - ) : Parcelable { - // This constructor is added to work with the 'com.bluelinelabs.logansquare.annotation.JsonObject' - constructor() : this(null) - } \ No newline at end of file +) : Parcelable { + // This constructor is added to work with the 'com.bluelinelabs.logansquare.annotation.JsonObject' + constructor() : this(null) +} diff --git a/app/src/main/java/com/nextcloud/talk/translate/TranslateActivity.kt b/app/src/main/java/com/nextcloud/talk/translate/TranslateActivity.kt index 0100d97cb..73f98a124 100644 --- a/app/src/main/java/com/nextcloud/talk/translate/TranslateActivity.kt +++ b/app/src/main/java/com/nextcloud/talk/translate/TranslateActivity.kt @@ -1,4 +1,24 @@ +/* + * Nextcloud Talk application + * + * @author Julius Linus + * Copyright (C) 2023 Julius Linus + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ package com.nextcloud.talk.translate + import android.app.AlertDialog import android.graphics.drawable.ColorDrawable import android.os.Bundle @@ -27,14 +47,8 @@ import org.json.JSONArray import java.util.Locale import javax.inject.Inject - - -// TODO include license at top of the file - - @AutoInjector(NextcloudTalkApplication::class) -class TranslateActivity : BaseActivity() -{ +class TranslateActivity : BaseActivity() { private lateinit var binding: ActivityTranslateBinding @Inject @@ -47,10 +61,9 @@ class TranslateActivity : BaseActivity() var toLanguages = arrayOf() - var text : String? = null - - var check : Int = 0 + var text: String? = null + var check: Int = 0 override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) @@ -59,6 +72,7 @@ class TranslateActivity : BaseActivity() setupActionBar() setContentView(binding.root) + setupSystemColors() setupTextViews() setupSpinners() getLanguageOptions() @@ -73,7 +87,7 @@ class TranslateActivity : BaseActivity() supportActionBar?.setDisplayHomeAsUpEnabled(true) supportActionBar?.setDisplayShowHomeEnabled(true) supportActionBar?.setIcon(ColorDrawable(resources!!.getColor(R.color.transparent))) - supportActionBar?.title = "Translation" + supportActionBar?.title = resources!!.getString(R.string.translation) viewThemeUtils.material.themeToolbar(binding.translationToolbar) } @@ -81,6 +95,9 @@ class TranslateActivity : BaseActivity() val original = binding.originalMessageTextview val translation = binding.translatedMessageTextview + viewThemeUtils.talk.themeIncomingMessageBubble(original, grouped = true, deleted = false) + viewThemeUtils.talk.themeIncomingMessageBubble(translation, grouped = true, deleted = false) + original.movementMethod = ScrollingMovementMethod() translation.movementMethod = ScrollingMovementMethod() @@ -89,19 +106,17 @@ class TranslateActivity : BaseActivity() text = bundle?.getString(BundleKeys.KEY_TRANSLATE_MESSAGE) } - private fun getLanguageOptions() { - val currentUser : User = userManager.currentUser.blockingGet() - val json = JSONArray(CapabilitiesUtilNew.getLanguages(currentUser).toString()) - Log.i("TranslateActivity", "json is: ${json.toString()}") + val currentUser: User = userManager.currentUser.blockingGet() + val json = JSONArray(CapabilitiesUtilNew.getLanguages(currentUser).toString()) + Log.i("TranslateActivity", "json is: $json") - var fromLanguagesSet = mutableSetOf("Detect Language") - var toLanguagesSet = mutableSetOf("Device Settings") + val fromLanguagesSet = mutableSetOf("Detect Language") + val toLanguagesSet = mutableSetOf("Device Settings") - for( i in 0..json.length()-1) { + for (i in 0..json.length() - 1) { val current = json.getJSONObject(i) - if(current.getString("from") != Locale.getDefault().language) - { + if (current.getString("from") != Locale.getDefault().language) { toLanguagesSet.add(current.getString("fromLabel")) } @@ -111,25 +126,32 @@ class TranslateActivity : BaseActivity() 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) + 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) { + private fun enableSpinners(value: Boolean) { binding.fromLanguageSpinner.isEnabled = value binding.toLanguageSpinner.isEnabled = value } - private fun translate(fromLanguage: String?, toLanguage : String) { - val currentUser : User = userManager.currentUser.blockingGet() - val credentials : String = ApiUtils.getCredentials(currentUser.username, currentUser.token) + private fun translate(fromLanguage: String?, toLanguage: String) { + val currentUser: User = userManager.currentUser.blockingGet() + val credentials: String = ApiUtils.getCredentials(currentUser.username, currentUser.token) val translateURL = currentUser.baseUrl + "/ocs/v2.php/translation/translate?text=$text&toLanguage=$toLanguage" + - if(fromLanguage != null && fromLanguage != "") { "&fromLanguage=$fromLanguage" } else {""} + if (fromLanguage != null && fromLanguage != "") { + "&fromLanguage=$fromLanguage" + } else { + "" + } Log.i("TranslateActivity", "Url is: $translateURL") ncApi.translateMessage(credentials, translateURL) @@ -165,17 +187,15 @@ class TranslateActivity : BaseActivity() enableSpinners(true) } - - private fun getISOFromLanguage(language: String) : String { - if(language == "Device Settings") { + 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()) - val currentUser : User = userManager.currentUser.blockingGet() - val json = JSONArray(CapabilitiesUtilNew.getLanguages(currentUser).toString()) - - for( i in 0..json.length()-1) { + for (i in 0..json.length() - 1) { val current = json.getJSONObject(i) if (current.getString("fromLabel") == language) { return current.getString("from") @@ -185,20 +205,25 @@ class TranslateActivity : BaseActivity() 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.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.fromLanguageSpinner.onItemSelectedListener = object : AdapterView.OnItemSelectedListener { override fun onItemSelected(parent: AdapterView<*>, view: View, position: Int, id: Long) { - if(++check > 1) { - var fromLabel : String = getISOFromLanguage(parent.getItemAtPosition(position).toString()) - var toLabel : String = getISOFromLanguage(binding.toLanguageSpinner.selectedItem.toString()) - Log.i("TranslateActivity", "fromLanguageSpinner :: fromLabel = $fromLabel, toLabel = $ count: " + - "$check") + if (++check > 1) { + val fromLabel: String = getISOFromLanguage(parent.getItemAtPosition(position).toString()) + val toLabel: String = getISOFromLanguage(binding.toLanguageSpinner.selectedItem.toString()) + Log.i( + "TranslateActivity", "fromLanguageSpinner :: fromLabel = $fromLabel, toLabel = $ count: " + + "$check" + ) translate(fromLabel, toLabel) } } @@ -210,11 +235,13 @@ class TranslateActivity : BaseActivity() binding.toLanguageSpinner.onItemSelectedListener = object : AdapterView.OnItemSelectedListener { override fun onItemSelected(parent: AdapterView<*>, view: View, position: Int, id: Long) { - if(++check > 2) { - var toLabel : String = getISOFromLanguage(parent.getItemAtPosition(position).toString()) - var fromLabel : String = getISOFromLanguage(binding.fromLanguageSpinner.selectedItem.toString()) - Log.i("TranslateActivity", "toLanguageSpinner :: fromLabel = $fromLabel, toLabel = $toLabel " + - "count: $check") + if (++check > 2) { + val toLabel: String = getISOFromLanguage(parent.getItemAtPosition(position).toString()) + val fromLabel: String = getISOFromLanguage(binding.fromLanguageSpinner.selectedItem.toString()) + Log.i( + "TranslateActivity", "toLanguageSpinner :: fromLabel = $fromLabel, toLabel = $toLabel " + + "count: $check" + ) translate(fromLabel, toLabel) } } @@ -223,8 +250,5 @@ class TranslateActivity : BaseActivity() // write code to perform some action } } - } - - -} \ No newline at end of file +} diff --git a/app/src/main/java/com/nextcloud/talk/ui/theme/TalkSpecificViewThemeUtils.kt b/app/src/main/java/com/nextcloud/talk/ui/theme/TalkSpecificViewThemeUtils.kt index b4b78bd81..4c69bcda3 100644 --- a/app/src/main/java/com/nextcloud/talk/ui/theme/TalkSpecificViewThemeUtils.kt +++ b/app/src/main/java/com/nextcloud/talk/ui/theme/TalkSpecificViewThemeUtils.kt @@ -65,7 +65,7 @@ class TalkSpecificViewThemeUtils @Inject constructor( private val appcompat: AndroidXViewThemeUtils ) : ViewThemeUtilsBase(schemes) { - fun themeIncomingMessageBubble(bubble: ViewGroup, grouped: Boolean, deleted: Boolean) { + fun themeIncomingMessageBubble(bubble: View, grouped: Boolean, deleted: Boolean) { val resources = bubble.resources var bubbleResource = R.drawable.shape_incoming_message @@ -88,7 +88,7 @@ class TalkSpecificViewThemeUtils @Inject constructor( ViewCompat.setBackground(bubble, bubbleDrawable) } - fun themeOutgoingMessageBubble(bubble: ViewGroup, grouped: Boolean, deleted: Boolean) { + fun themeOutgoingMessageBubble(bubble: View, grouped: Boolean, deleted: Boolean) { withScheme(bubble) { scheme -> val bgBubbleColor = if (deleted) { ColorUtils.setAlphaComponent(scheme.surfaceVariant, HALF_ALPHA_INT) diff --git a/app/src/main/java/com/nextcloud/talk/utils/database/user/CapabilitiesUtilNew.kt b/app/src/main/java/com/nextcloud/talk/utils/database/user/CapabilitiesUtilNew.kt index 64ad6056b..f88c031fc 100644 --- a/app/src/main/java/com/nextcloud/talk/utils/database/user/CapabilitiesUtilNew.kt +++ b/app/src/main/java/com/nextcloud/talk/utils/database/user/CapabilitiesUtilNew.kt @@ -219,7 +219,5 @@ object CapabilitiesUtilNew { return null } - - const val DEFAULT_CHAT_SIZE = 1000 } diff --git a/app/src/main/res/drawable-night/ic_chevron_right.xml b/app/src/main/res/drawable-night/ic_chevron_right.xml new file mode 100644 index 000000000..253ff96a2 --- /dev/null +++ b/app/src/main/res/drawable-night/ic_chevron_right.xml @@ -0,0 +1,25 @@ + + + + diff --git a/app/src/main/res/drawable/ic_baseline_translate_24.xml b/app/src/main/res/drawable/ic_baseline_translate_24.xml index 1a73c2d64..4b511684c 100644 --- a/app/src/main/res/drawable/ic_baseline_translate_24.xml +++ b/app/src/main/res/drawable/ic_baseline_translate_24.xml @@ -1,5 +1,26 @@ - - + + + diff --git a/app/src/main/res/drawable/ic_chevron_right.xml b/app/src/main/res/drawable/ic_chevron_right.xml new file mode 100644 index 000000000..91ec3a701 --- /dev/null +++ b/app/src/main/res/drawable/ic_chevron_right.xml @@ -0,0 +1,25 @@ + + + + diff --git a/app/src/main/res/layout/activity_translate.xml b/app/src/main/res/layout/activity_translate.xml index 04f431520..37ea6348f 100644 --- a/app/src/main/res/layout/activity_translate.xml +++ b/app/src/main/res/layout/activity_translate.xml @@ -1,16 +1,36 @@ + + android:layout_height="match_parent" + android:orientation="vertical" + android:weightSum="2"> + + tools:title=""> - - - + android:layout_height="@dimen/min_size_clickable_area" + android:layout_weight="1" + android:background="@color/grey_200" /> + + android:layout_height="@dimen/min_size_clickable_area" + android:layout_weight="1" + android:background="@color/grey_200" /> @@ -66,27 +80,31 @@ android:id="@+id/original_message_textview" android:layout_width="match_parent" android:layout_height="wrap_content" + android:layout_marginStart="@dimen/standard_margin" + android:layout_marginEnd="@dimen/standard_margin" + android:layout_marginBottom="@dimen/standard_margin" android:layout_weight="1" - android:textSize="@dimen/message_text_size" - android:textColor="@color/nc_incoming_text_default" - android:padding="@dimen/dialog_padding" - android:layout_margin="@dimen/standard_margin" android:background="@drawable/shape_grouped_incoming_message" + android:padding="@dimen/dialog_padding" android:scrollbars="vertical" - android:text="" /> + android:text="" + android:textColor="@color/nc_incoming_text_default" + android:textSize="@dimen/message_text_size" /> - - \ No newline at end of file + From 98690a02d16fa0d40bc2412a35c087bccbd8e20c Mon Sep 17 00:00:00 2001 From: Andy Scherzinger Date: Wed, 17 May 2023 11:12:15 +0200 Subject: [PATCH 09/15] Makes dialog strings translatable and move to themed Material dialog Signed-off-by: Andy Scherzinger --- .../talk/translate/TranslateActivity.kt | 30 +++++++++++++++---- app/src/main/res/values/strings.xml | 2 ++ 2 files changed, 26 insertions(+), 6 deletions(-) diff --git a/app/src/main/java/com/nextcloud/talk/translate/TranslateActivity.kt b/app/src/main/java/com/nextcloud/talk/translate/TranslateActivity.kt index 73f98a124..ee9c90e55 100644 --- a/app/src/main/java/com/nextcloud/talk/translate/TranslateActivity.kt +++ b/app/src/main/java/com/nextcloud/talk/translate/TranslateActivity.kt @@ -2,7 +2,9 @@ * Nextcloud Talk application * * @author Julius Linus + * @author Andy Scherzinger * Copyright (C) 2023 Julius Linus + * Copyright (C) 2023 Andy Scherzinger * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -19,7 +21,6 @@ */ package com.nextcloud.talk.translate -import android.app.AlertDialog import android.graphics.drawable.ColorDrawable import android.os.Bundle import android.text.method.ScrollingMovementMethod @@ -27,7 +28,9 @@ import android.util.Log import android.view.View import android.widget.AdapterView import android.widget.ArrayAdapter +import androidx.appcompat.app.AlertDialog import autodagger.AutoInjector +import com.google.android.material.dialog.MaterialAlertDialogBuilder import com.nextcloud.talk.R import com.nextcloud.talk.activities.BaseActivity import com.nextcloud.talk.api.NcApi @@ -172,11 +175,26 @@ class TranslateActivity : BaseActivity() { 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") - val dialog = builder.create() - dialog.show() + val dialogBuilder = MaterialAlertDialogBuilder(this@TranslateActivity) + .setIcon( + viewThemeUtils.dialog.colorMaterialAlertDialogIcon( + context, + R.drawable.ic_warning_white + ) + ) + .setTitle(R.string.translation_error_title) + .setMessage(R.string.translation_error_message) + .setPositiveButton(R.string.nc_ok) { dialog, _ -> + dialog.dismiss() + } + + viewThemeUtils.dialog.colorMaterialAlertDialogBackground(context, dialogBuilder) + + val dialog = dialogBuilder.show() + + viewThemeUtils.platform.colorTextButtons( + dialog.getButton(AlertDialog.BUTTON_POSITIVE) + ) } override fun onComplete() { diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 5f6fc167b..a1b3e757b 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -658,5 +658,7 @@ How to translate with transifex: Scroll to bottom Translate Translation + Translation failed + Could not detect language From f1805c9ddd982f1a3bee76e0b14948f377429868 Mon Sep 17 00:00:00 2001 From: Andy Scherzinger Date: Wed, 17 May 2023 11:25:07 +0200 Subject: [PATCH 10/15] convert further strings to be translatable and unify logging tag Signed-off-by: Andy Scherzinger --- .../talk/translate/TranslateActivity.kt | 37 ++++++++++--------- app/src/main/res/values/strings.xml | 2 + 2 files changed, 21 insertions(+), 18 deletions(-) diff --git a/app/src/main/java/com/nextcloud/talk/translate/TranslateActivity.kt b/app/src/main/java/com/nextcloud/talk/translate/TranslateActivity.kt index ee9c90e55..520dce1b2 100644 --- a/app/src/main/java/com/nextcloud/talk/translate/TranslateActivity.kt +++ b/app/src/main/java/com/nextcloud/talk/translate/TranslateActivity.kt @@ -112,18 +112,18 @@ class TranslateActivity : BaseActivity() { private fun getLanguageOptions() { val currentUser: User = userManager.currentUser.blockingGet() val json = JSONArray(CapabilitiesUtilNew.getLanguages(currentUser).toString()) - Log.i("TranslateActivity", "json is: $json") + Log.i(TAG, "json is: $json") - val fromLanguagesSet = mutableSetOf("Detect Language") - val toLanguagesSet = mutableSetOf("Device Settings") + val fromLanguagesSet = mutableSetOf(resources.getString(R.string.translation_detect_language)) + val toLanguagesSet = mutableSetOf(resources.getString(R.string.translation_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")) + if (current.getString(FROM_ID) != Locale.getDefault().language) { + toLanguagesSet.add(current.getString(FROM_LABEL)) } - fromLanguagesSet.add(current.getString("toLabel")) + fromLanguagesSet.add(current.getString(TO_LABEL)) } fromLanguages = fromLanguagesSet.toTypedArray() @@ -156,7 +156,7 @@ class TranslateActivity : BaseActivity() { "" } - Log.i("TranslateActivity", "Url is: $translateURL") + Log.i(TAG, "Url is: $translateURL") ncApi.translateMessage(credentials, translateURL) ?.subscribeOn(Schedulers.io()) ?.observeOn(AndroidSchedulers.mainThread()) @@ -206,7 +206,7 @@ class TranslateActivity : BaseActivity() { } private fun getISOFromLanguage(language: String): String { - if (language == "Device Settings") { + if (resources.getString(R.string.translation_device_settings).equals(language)) { return Locale.getDefault().language } @@ -215,8 +215,8 @@ class TranslateActivity : BaseActivity() { for (i in 0..json.length() - 1) { val current = json.getJSONObject(i) - if (current.getString("fromLabel") == language) { - return current.getString("from") + if (current.getString(FROM_LABEL) == language) { + return current.getString(FROM_ID) } } @@ -238,10 +238,7 @@ class TranslateActivity : BaseActivity() { if (++check > 1) { val fromLabel: String = getISOFromLanguage(parent.getItemAtPosition(position).toString()) val toLabel: String = getISOFromLanguage(binding.toLanguageSpinner.selectedItem.toString()) - Log.i( - "TranslateActivity", "fromLanguageSpinner :: fromLabel = $fromLabel, toLabel = $ count: " + - "$check" - ) + Log.i(TAG, "fromLanguageSpinner :: $FROM_LABEL = $fromLabel, $TO_LABEL = $ count: $check") translate(fromLabel, toLabel) } } @@ -256,10 +253,7 @@ class TranslateActivity : BaseActivity() { if (++check > 2) { val toLabel: String = getISOFromLanguage(parent.getItemAtPosition(position).toString()) val fromLabel: String = getISOFromLanguage(binding.fromLanguageSpinner.selectedItem.toString()) - Log.i( - "TranslateActivity", "toLanguageSpinner :: fromLabel = $fromLabel, toLabel = $toLabel " + - "count: $check" - ) + Log.i(TAG, "toLanguageSpinner :: $FROM_LABEL = $fromLabel, $TO_LABEL = $toLabel count: $check") translate(fromLabel, toLabel) } } @@ -269,4 +263,11 @@ class TranslateActivity : BaseActivity() { } } } + + companion object { + private val TAG = TranslateActivity::class.simpleName + private const val FROM_ID = "from" + private const val FROM_LABEL = "fromLabel" + private const val TO_LABEL = "toLabel" + } } diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index a1b3e757b..e386f5d1a 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -658,6 +658,8 @@ How to translate with transifex: Scroll to bottom Translate Translation + Detect language + Device settings Translation failed Could not detect language From 6adf741dc165d90dddcd60060ba6ac62a490735c Mon Sep 17 00:00:00 2001 From: Andy Scherzinger Date: Wed, 17 May 2023 11:46:14 +0200 Subject: [PATCH 11/15] Fix detekt issues Signed-off-by: Andy Scherzinger --- .../models/json/translations/TranslateData.kt | 3 +- .../talk/translate/TranslateActivity.kt | 37 ++++++++++--------- .../ui/theme/TalkSpecificViewThemeUtils.kt | 1 - .../database/user/CapabilitiesUtilNew.kt | 11 +++--- 4 files changed, 26 insertions(+), 26 deletions(-) diff --git a/app/src/main/java/com/nextcloud/talk/models/json/translations/TranslateData.kt b/app/src/main/java/com/nextcloud/talk/models/json/translations/TranslateData.kt index 2f37fb57f..9ebfdd971 100644 --- a/app/src/main/java/com/nextcloud/talk/models/json/translations/TranslateData.kt +++ b/app/src/main/java/com/nextcloud/talk/models/json/translations/TranslateData.kt @@ -27,12 +27,11 @@ import kotlinx.parcelize.Parcelize @Parcelize @JsonObject data class TranslateData( - @JsonField(name = ["text"]) var text: String?, @JsonField(name = ["from"]) var fromLanguage: String? ) : Parcelable { // This constructor is added to work with the 'com.bluelinelabs.logansquare.annotation.JsonObject' - constructor() : this(null, null ) + constructor() : this(null, null) } diff --git a/app/src/main/java/com/nextcloud/talk/translate/TranslateActivity.kt b/app/src/main/java/com/nextcloud/talk/translate/TranslateActivity.kt index 520dce1b2..43feedde8 100644 --- a/app/src/main/java/com/nextcloud/talk/translate/TranslateActivity.kt +++ b/app/src/main/java/com/nextcloud/talk/translate/TranslateActivity.kt @@ -129,15 +129,7 @@ class TranslateActivity : BaseActivity() { 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 - ) + fillSpinners() } private fun enableSpinners(value: Boolean) { @@ -174,6 +166,7 @@ class TranslateActivity : BaseActivity() { } override fun onError(e: Throwable) { + Log.w(TAG, "Error while translating message", e) binding.progressBar.visibility = View.GONE val dialogBuilder = MaterialAlertDialogBuilder(this@TranslateActivity) .setIcon( @@ -210,6 +203,10 @@ class TranslateActivity : BaseActivity() { return Locale.getDefault().language } + return getISOFromServer(language) + } + + private fun getISOFromServer(language: String): String { val currentUser: User = userManager.currentUser.blockingGet() val json = JSONArray(CapabilitiesUtilNew.getLanguages(currentUser).toString()) @@ -224,14 +221,7 @@ class TranslateActivity : BaseActivity() { } 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 - ) + fillSpinners() binding.fromLanguageSpinner.onItemSelectedListener = object : AdapterView.OnItemSelectedListener { override fun onItemSelected(parent: AdapterView<*>, view: View, position: Int, id: Long) { @@ -264,6 +254,19 @@ class TranslateActivity : BaseActivity() { } } + private fun fillSpinners() { + 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 + ) + } + companion object { private val TAG = TranslateActivity::class.simpleName private const val FROM_ID = "from" diff --git a/app/src/main/java/com/nextcloud/talk/ui/theme/TalkSpecificViewThemeUtils.kt b/app/src/main/java/com/nextcloud/talk/ui/theme/TalkSpecificViewThemeUtils.kt index 4c69bcda3..93e833f7c 100644 --- a/app/src/main/java/com/nextcloud/talk/ui/theme/TalkSpecificViewThemeUtils.kt +++ b/app/src/main/java/com/nextcloud/talk/ui/theme/TalkSpecificViewThemeUtils.kt @@ -28,7 +28,6 @@ import android.graphics.drawable.Drawable import android.graphics.drawable.LayerDrawable import android.os.Build import android.view.View -import android.view.ViewGroup import android.widget.LinearLayout import android.widget.TextView import androidx.annotation.ColorInt diff --git a/app/src/main/java/com/nextcloud/talk/utils/database/user/CapabilitiesUtilNew.kt b/app/src/main/java/com/nextcloud/talk/utils/database/user/CapabilitiesUtilNew.kt index f88c031fc..d91a4178f 100644 --- a/app/src/main/java/com/nextcloud/talk/utils/database/user/CapabilitiesUtilNew.kt +++ b/app/src/main/java/com/nextcloud/talk/utils/database/user/CapabilitiesUtilNew.kt @@ -210,13 +210,12 @@ object CapabilitiesUtilNew { return false } - fun getLanguages(user: User?) : Any? { - - if(isTranslationsSupported(user)) { - return user!!.capabilities!!.spreedCapability!!.config!!["chat"]!!["translations"] + fun getLanguages(user: User?): Any? { + return if (isTranslationsSupported(user)) { + user!!.capabilities!!.spreedCapability!!.config!!["chat"]!!["translations"] + } else { + null } - - return null } const val DEFAULT_CHAT_SIZE = 1000 From e4f94dbcfd312f80c5eb26250050d2a030d6569f Mon Sep 17 00:00:00 2001 From: Andy Scherzinger Date: Wed, 17 May 2023 12:16:33 +0200 Subject: [PATCH 12/15] Only show translation menu item for text messages Signed-off-by: Andy Scherzinger --- .../com/nextcloud/talk/ui/dialog/MessageActionsDialog.kt | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/app/src/main/java/com/nextcloud/talk/ui/dialog/MessageActionsDialog.kt b/app/src/main/java/com/nextcloud/talk/ui/dialog/MessageActionsDialog.kt index 6f56161d4..9fe2e2b9c 100644 --- a/app/src/main/java/com/nextcloud/talk/ui/dialog/MessageActionsDialog.kt +++ b/app/src/main/java/com/nextcloud/talk/ui/dialog/MessageActionsDialog.kt @@ -88,7 +88,11 @@ class MessageActionsDialog( viewThemeUtils.platform.themeDialog(dialogMessageActionsBinding.root) initEmojiBar(hasChatPermission) initMenuItemCopy(!message.isDeleted) - initMenuItemTranslate(!message.isDeleted && CapabilitiesUtilNew.isTranslationsSupported(user)) + initMenuItemTranslate( + !message.isDeleted && + ChatMessage.MessageType.REGULAR_TEXT_MESSAGE == message.getCalculateMessageType() && + CapabilitiesUtilNew.isTranslationsSupported(user) + ) initMenuReplyToMessage(message.replyable && hasChatPermission) initMenuReplyPrivately( message.replyable && From cff28de8b15007b96fee479cb1f194fd28972d5d Mon Sep 17 00:00:00 2001 From: Andy Scherzinger Date: Wed, 17 May 2023 13:17:34 +0200 Subject: [PATCH 13/15] hide translation option of no target languages available Signed-off-by: Andy Scherzinger --- .../java/com/nextcloud/talk/ui/dialog/MessageActionsDialog.kt | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/app/src/main/java/com/nextcloud/talk/ui/dialog/MessageActionsDialog.kt b/app/src/main/java/com/nextcloud/talk/ui/dialog/MessageActionsDialog.kt index 9fe2e2b9c..87384a286 100644 --- a/app/src/main/java/com/nextcloud/talk/ui/dialog/MessageActionsDialog.kt +++ b/app/src/main/java/com/nextcloud/talk/ui/dialog/MessageActionsDialog.kt @@ -55,6 +55,7 @@ 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 javax.inject.Inject @AutoInjector(NextcloudTalkApplication::class) @@ -91,7 +92,8 @@ class MessageActionsDialog( initMenuItemTranslate( !message.isDeleted && ChatMessage.MessageType.REGULAR_TEXT_MESSAGE == message.getCalculateMessageType() && - CapabilitiesUtilNew.isTranslationsSupported(user) + CapabilitiesUtilNew.isTranslationsSupported(user) && + JSONArray(CapabilitiesUtilNew.getLanguages(user).toString()).length() > 0 ) initMenuReplyToMessage(message.replyable && hasChatPermission) initMenuReplyPrivately( From 325be4b9f66a634349ade003b67393a412bc5f19 Mon Sep 17 00:00:00 2001 From: Andy Scherzinger Date: Wed, 17 May 2023 15:34:29 +0200 Subject: [PATCH 14/15] Optimze translation layout with specific landscape layout and use of autocomplete fields instead of spinner Signed-off-by: Andy Scherzinger --- .../talk/translate/TranslateActivity.kt | 33 ++-- .../res/layout-land/activity_translate.xml | 145 ++++++++++++++++++ .../main/res/layout/activity_translate.xml | 137 ++++++++++------- app/src/main/res/values/strings.xml | 2 + 4 files changed, 250 insertions(+), 67 deletions(-) create mode 100644 app/src/main/res/layout-land/activity_translate.xml diff --git a/app/src/main/java/com/nextcloud/talk/translate/TranslateActivity.kt b/app/src/main/java/com/nextcloud/talk/translate/TranslateActivity.kt index 43feedde8..b2cbd7458 100644 --- a/app/src/main/java/com/nextcloud/talk/translate/TranslateActivity.kt +++ b/app/src/main/java/com/nextcloud/talk/translate/TranslateActivity.kt @@ -133,8 +133,8 @@ class TranslateActivity : BaseActivity() { } private fun enableSpinners(value: Boolean) { - binding.fromLanguageSpinner.isEnabled = value - binding.toLanguageSpinner.isEnabled = value + binding.fromLanguageInputLayout.isEnabled = value + binding.toLanguageInputLayout.isEnabled = value } private fun translate(fromLanguage: String?, toLanguage: String) { @@ -221,13 +221,15 @@ class TranslateActivity : BaseActivity() { } private fun setupSpinners() { + viewThemeUtils.material.colorTextInputLayout(binding.fromLanguageInputLayout) + viewThemeUtils.material.colorTextInputLayout(binding.toLanguageInputLayout) fillSpinners() - binding.fromLanguageSpinner.onItemSelectedListener = object : AdapterView.OnItemSelectedListener { + binding.fromLanguage.onItemSelectedListener = object : AdapterView.OnItemSelectedListener { override fun onItemSelected(parent: AdapterView<*>, view: View, position: Int, id: Long) { if (++check > 1) { val fromLabel: String = getISOFromLanguage(parent.getItemAtPosition(position).toString()) - val toLabel: String = getISOFromLanguage(binding.toLanguageSpinner.selectedItem.toString()) + val toLabel: String = getISOFromLanguage(binding.fromLanguage.text.toString()) Log.i(TAG, "fromLanguageSpinner :: $FROM_LABEL = $fromLabel, $TO_LABEL = $ count: $check") translate(fromLabel, toLabel) } @@ -238,11 +240,11 @@ class TranslateActivity : BaseActivity() { } } - binding.toLanguageSpinner.onItemSelectedListener = object : AdapterView.OnItemSelectedListener { + binding.toLanguage.onItemSelectedListener = object : AdapterView.OnItemSelectedListener { override fun onItemSelected(parent: AdapterView<*>, view: View, position: Int, id: Long) { if (++check > 2) { val toLabel: String = getISOFromLanguage(parent.getItemAtPosition(position).toString()) - val fromLabel: String = getISOFromLanguage(binding.fromLanguageSpinner.selectedItem.toString()) + val fromLabel: String = getISOFromLanguage(binding.fromLanguage.text.toString()) Log.i(TAG, "toLanguageSpinner :: $FROM_LABEL = $fromLabel, $TO_LABEL = $toLabel count: $check") translate(fromLabel, toLabel) } @@ -255,16 +257,19 @@ class TranslateActivity : BaseActivity() { } private fun fillSpinners() { - binding.fromLanguageSpinner.adapter = ArrayAdapter( - this, - android.R.layout.simple_spinner_dropdown_item, - fromLanguages + binding.fromLanguage.setAdapter( + ArrayAdapter(this, android.R.layout.simple_spinner_dropdown_item, fromLanguages) ) - binding.toLanguageSpinner.adapter = ArrayAdapter( - this, - android.R.layout.simple_spinner_dropdown_item, - toLanguages + if (fromLanguages.isNotEmpty()) { + binding.fromLanguage.setText(fromLanguages[0]) + } + + binding.toLanguage.setAdapter( + ArrayAdapter(this, android.R.layout.simple_spinner_dropdown_item, toLanguages) ) + if (toLanguages.isNotEmpty()) { + binding.toLanguage.setText(toLanguages[0]) + } } companion object { diff --git a/app/src/main/res/layout-land/activity_translate.xml b/app/src/main/res/layout-land/activity_translate.xml new file mode 100644 index 000000000..144fd2010 --- /dev/null +++ b/app/src/main/res/layout-land/activity_translate.xml @@ -0,0 +1,145 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/app/src/main/res/layout/activity_translate.xml b/app/src/main/res/layout/activity_translate.xml index 37ea6348f..8dbdd7977 100644 --- a/app/src/main/res/layout/activity_translate.xml +++ b/app/src/main/res/layout/activity_translate.xml @@ -41,9 +41,7 @@ app:navigationIconTint="@color/fontAppbar" app:popupTheme="@style/appActionBarPopupMenu" app:titleTextColor="@color/fontAppbar" - tools:title=""> - - + tools:title="@string/translation" /> @@ -51,67 +49,100 @@ android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_gravity="center" - android:orientation="horizontal" + android:orientation="vertical" android:padding="@dimen/standard_padding"> - + android:hint="@string/translation_from"> - + - + + + android:hint="@string/translation_to"> + + + + - + android:layout_height="match_parent" + android:layout_marginTop="@dimen/standard_quarter_margin"> - + - + + + + + + + + + diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index e386f5d1a..f612264ae 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -658,6 +658,8 @@ How to translate with transifex: Scroll to bottom Translate Translation + From + To Detect language Device settings Translation failed From b779a01c274919c464a40ec3e71cfc947071bb92 Mon Sep 17 00:00:00 2001 From: Andy Scherzinger Date: Wed, 17 May 2023 18:59:04 +0200 Subject: [PATCH 15/15] extract URL creation and shift paramters to retrofit API Signed-off-by: Andy Scherzinger --- .../java/com/nextcloud/talk/api/NcApi.java | 5 ++++- .../talk/translate/TranslateActivity.kt | 18 ++++++++---------- .../com/nextcloud/talk/utils/ApiUtils.java | 4 ++++ 3 files changed, 16 insertions(+), 11 deletions(-) diff --git a/app/src/main/java/com/nextcloud/talk/api/NcApi.java b/app/src/main/java/com/nextcloud/talk/api/NcApi.java index 77e6c3ac7..6bf7f984c 100644 --- a/app/src/main/java/com/nextcloud/talk/api/NcApi.java +++ b/app/src/main/java/com/nextcloud/talk/api/NcApi.java @@ -659,5 +659,8 @@ public interface NcApi { @POST Observable translateMessage(@Header("Authorization") String authorization, - @Url String url); + @Url String url, + @Query("text") String text, + @Query("toLanguage") String toLanguage, + @Nullable @Query("fromLanguage") String fromLanguage); } diff --git a/app/src/main/java/com/nextcloud/talk/translate/TranslateActivity.kt b/app/src/main/java/com/nextcloud/talk/translate/TranslateActivity.kt index b2cbd7458..b9bb17e8e 100644 --- a/app/src/main/java/com/nextcloud/talk/translate/TranslateActivity.kt +++ b/app/src/main/java/com/nextcloud/talk/translate/TranslateActivity.kt @@ -112,12 +112,11 @@ class TranslateActivity : BaseActivity() { private fun getLanguageOptions() { val currentUser: User = userManager.currentUser.blockingGet() val json = JSONArray(CapabilitiesUtilNew.getLanguages(currentUser).toString()) - Log.i(TAG, "json is: $json") val fromLanguagesSet = mutableSetOf(resources.getString(R.string.translation_detect_language)) val toLanguagesSet = mutableSetOf(resources.getString(R.string.translation_device_settings)) - for (i in 0..json.length() - 1) { + for (i in 0 until json.length()) { val current = json.getJSONObject(i) if (current.getString(FROM_ID) != Locale.getDefault().language) { toLanguagesSet.add(current.getString(FROM_LABEL)) @@ -140,16 +139,15 @@ class TranslateActivity : BaseActivity() { private fun translate(fromLanguage: String?, toLanguage: String) { val currentUser: User = userManager.currentUser.blockingGet() val credentials: String = ApiUtils.getCredentials(currentUser.username, currentUser.token) - val translateURL = currentUser.baseUrl + - "/ocs/v2.php/translation/translate?text=$text&toLanguage=$toLanguage" + - if (fromLanguage != null && fromLanguage != "") { - "&fromLanguage=$fromLanguage" - } else { - "" - } + val translateURL = ApiUtils.getUrlForTranslation(currentUser.baseUrl) + val calculatedFromLanguage = if (fromLanguage == null || fromLanguage == "") { + null + } else { + fromLanguage + } Log.i(TAG, "Url is: $translateURL") - ncApi.translateMessage(credentials, translateURL) + ncApi.translateMessage(credentials, translateURL, text, toLanguage, calculatedFromLanguage) ?.subscribeOn(Schedulers.io()) ?.observeOn(AndroidSchedulers.mainThread()) ?.subscribe(object : Observer { diff --git a/app/src/main/java/com/nextcloud/talk/utils/ApiUtils.java b/app/src/main/java/com/nextcloud/talk/utils/ApiUtils.java index bc4b04027..7c209e574 100644 --- a/app/src/main/java/com/nextcloud/talk/utils/ApiUtils.java +++ b/app/src/main/java/com/nextcloud/talk/utils/ApiUtils.java @@ -526,4 +526,8 @@ public class ApiUtils { public static String getUrlForConversationDescription(int version, String baseUrl, String token) { return getUrlForRoom(version, baseUrl, token) + "/description"; } + + public static String getUrlForTranslation(String baseUrl) { + return baseUrl + ocsApiVersion + "/translation/translate"; + } }