Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Adjusting translation provider #3361

Merged
merged 1 commit into from
Nov 16, 2023
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 5 additions & 0 deletions app/src/main/java/com/nextcloud/talk/api/NcApi.java
Original file line number Diff line number Diff line change
Expand Up @@ -49,6 +49,7 @@
import com.nextcloud.talk.models.json.userprofile.UserProfileFieldsOverall;
import com.nextcloud.talk.models.json.userprofile.UserProfileOverall;
import com.nextcloud.talk.polls.repositories.model.PollOverall;
import com.nextcloud.talk.translate.repositories.model.LanguagesOverall;
import com.nextcloud.talk.translate.repositories.model.TranslationsOverall;

import java.util.List;
Expand Down Expand Up @@ -675,6 +676,10 @@ Observable<TranslationsOverall> translateMessage(@Header("Authorization") String
@Query("toLanguage") String toLanguage,
@Nullable @Query("fromLanguage") String fromLanguage);

@GET
Observable<LanguagesOverall> getLanguages(@Header("Authorization") String authorization,
@Url String url);

@GET
Observable<ReminderOverall> getReminder(@Header("Authorization") String authorization,
@Url String url);
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
package com.nextcloud.talk.translate.repositories

import com.nextcloud.talk.translate.repositories.model.Language
import io.reactivex.Observable

interface TranslateRepository {
Expand All @@ -11,4 +12,9 @@ interface TranslateRepository {
toLanguage: String,
fromLanguage: String?
): Observable<String>

fun getLanguages(
authorization: String,
url: String
): Observable<List<Language>>
}
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
package com.nextcloud.talk.translate.repositories

import com.nextcloud.talk.api.NcApi
import com.nextcloud.talk.translate.repositories.model.Language
import io.reactivex.Observable
import javax.inject.Inject

Expand All @@ -15,4 +16,8 @@ class TranslateRepositoryImpl @Inject constructor(private val ncApi: NcApi) : Tr
): Observable<String> {
return ncApi.translateMessage(authorization, url, text, toLanguage, fromLanguage).map { it.ocs?.data!!.text }
}

override fun getLanguages(authorization: String, url: String): Observable<List<Language>> {
return ncApi.getLanguages(authorization, url).map { it.ocs?.data?.languages }
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,41 @@
/*
* Nextcloud Talk application
*
* @author Julius Linus
* Copyright (C) 2023 Julius Linus <[email protected]>
*
* 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 <http://www.gnu.org/licenses/>.
*/
package com.nextcloud.talk.translate.repositories.model

import android.os.Parcelable
import com.bluelinelabs.logansquare.annotation.JsonField
import com.bluelinelabs.logansquare.annotation.JsonObject
import kotlinx.parcelize.Parcelize

@Parcelize
@JsonObject
data class Language(
@JsonField(name = ["from"])
var from: String?,
@JsonField(name = ["fromLabel"])
var fromLabel: String?,
@JsonField(name = ["to"])
var to: String?,
@JsonField(name = ["toLabel"])
var toLabel: String?
) : Parcelable {
// This constructor is added to work with the 'com.bluelinelabs.logansquare.annotation.JsonObject'
constructor() : this(null, null, null, null)
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
/*
* Nextcloud Talk application
*
* @author Julius Linus
* Copyright (C) 2023 Julius Linus <[email protected]>
*
* 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 <http://www.gnu.org/licenses/>.
*/
package com.nextcloud.talk.translate.repositories.model

import android.os.Parcelable
import com.bluelinelabs.logansquare.annotation.JsonField
import com.bluelinelabs.logansquare.annotation.JsonObject
import kotlinx.parcelize.Parcelize

@Parcelize
@JsonObject
data class LanguagesData(
@JsonField(name = ["languageDetection"])
var languageDetection: Boolean?,
@JsonField(name = ["languages"])
var languages: List<Language>?
) : Parcelable {
// This constructor is added to work with the 'com.bluelinelabs.logansquare.annotation.JsonObject'
constructor() : this(null, null)
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
/*
* Nextcloud Talk application
*
* @author Julius Linus
* Copyright (C) 2023 Julius Linus <[email protected]>
*
* 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 <http://www.gnu.org/licenses/>.
*/
package com.nextcloud.talk.translate.repositories.model

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 LanguagesOCS(
@JsonField(name = ["meta"])
var meta: GenericMeta?,
@JsonField(name = ["data"])
var data: LanguagesData?
) : Parcelable {
// This constructor is added to work with the 'com.bluelinelabs.logansquare.annotation.JsonObject'
constructor() : this(null, null)
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
/*
* Nextcloud Talk application
*
* @author Julius Linus
* Copyright (C) 2023 Julius Linus <[email protected]>
*
* 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 <http://www.gnu.org/licenses/>.
*/
package com.nextcloud.talk.translate.repositories.model

import android.os.Parcelable
import com.bluelinelabs.logansquare.annotation.JsonField
import com.bluelinelabs.logansquare.annotation.JsonObject
import kotlinx.parcelize.Parcelize

@Parcelize
@JsonObject
class LanguagesOverall(
@JsonField(name = ["ocs"])
var ocs: LanguagesOCS?
) : Parcelable {
// This constructor is added to work with the 'com.bluelinelabs.logansquare.annotation.JsonObject'
constructor() : this(null)
}
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,7 @@ import kotlinx.parcelize.Parcelize

@Parcelize
@JsonObject
data class TranslateOCS( // TODO finish this model
data class TranslateOCS(
@JsonField(name = ["meta"])
var meta: GenericMeta?,
@JsonField(name = ["data"])
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,7 @@ import android.content.Context
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
Expand All @@ -38,14 +39,14 @@ import com.nextcloud.talk.R
import com.nextcloud.talk.activities.BaseActivity
import com.nextcloud.talk.application.NextcloudTalkApplication
import com.nextcloud.talk.databinding.ActivityTranslateBinding
import com.nextcloud.talk.translate.repositories.model.Language
import com.nextcloud.talk.translate.viewmodels.TranslateViewModel
import com.nextcloud.talk.users.UserManager
import com.nextcloud.talk.utils.bundle.BundleKeys
import com.nextcloud.talk.utils.database.user.CapabilitiesUtilNew
import org.json.JSONArray
import java.util.Locale
import javax.inject.Inject

@Suppress("TooManyFunctions")
@AutoInjector(NextcloudTalkApplication::class)
class TranslateActivity : BaseActivity() {

Expand All @@ -60,6 +61,7 @@ class TranslateActivity : BaseActivity() {

private var toLanguages: Array<String>? = null
private var fromLanguages: Array<String>? = null
private var languages: List<Language>? = null

override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
Expand All @@ -79,17 +81,28 @@ class TranslateActivity : BaseActivity() {
onTranslatedState(state.msg)
}

is TranslateViewModel.ErrorState -> {
onErrorState()
is TranslateViewModel.TranslationErrorState -> {
onTranslationErrorState()
}

is TranslateViewModel.LanguagesErrorState -> {
onLanguagesErrorState()
}

is TranslateViewModel.LanguagesRetrievedState -> {
Log.d(TAG, "Languages are: ${state.list}")
languages = state.list
getLanguageOptions()
setupSpinners()
setItems()
}
}
}
setupActionBar()
setContentView(binding.root)
setupSystemColors()
setupTextViews()
getLanguageOptions()
setupSpinners()
viewModel.getLanguages()
setupCopyButton()

if (savedInstanceState == null) {
Expand All @@ -102,7 +115,7 @@ class TranslateActivity : BaseActivity() {

override fun onResume() {
super.onResume()
setItems()
languages?.let { setItems() }
}
override fun onSaveInstanceState(outState: Bundle) {
outState.run {
Expand Down Expand Up @@ -155,19 +168,16 @@ class TranslateActivity : BaseActivity() {
}

private fun getLanguageOptions() {
val currentUser = userManager.currentUser.blockingGet()
val json = JSONArray((CapabilitiesUtilNew.getLanguages(currentUser) as ArrayList<*>).toArray())

val fromLanguagesSet = mutableSetOf(resources.getString(R.string.translation_detect_language))
val toLanguagesSet = mutableSetOf(resources.getString(R.string.translation_device_settings))

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))
for (language in languages!!) {
val locale = Locale.getDefault().language
if (language.from != locale) {
toLanguagesSet.add(language.fromLabel!!)
}

fromLanguagesSet.add(current.getString(TO_LABEL))
fromLanguagesSet.add(language.toLabel!!)
}

toLanguages = toLanguagesSet.toTypedArray()
Expand All @@ -179,16 +189,16 @@ class TranslateActivity : BaseActivity() {
binding.toLanguageInputLayout.isEnabled = value
}

private fun showDialog() {
private fun showDialog(titleInt: Int, messageInt: Int) {
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)
.setTitle(titleInt)
.setMessage(messageInt)
.setPositiveButton(R.string.nc_ok) { dialog, _ ->
dialog.dismiss()
}
Expand All @@ -210,18 +220,15 @@ class TranslateActivity : BaseActivity() {
return getISOFromServer(language)
}

private fun getISOFromServer(language: String): String {
val currentUser = userManager.currentUser.blockingGet()
val json = JSONArray((CapabilitiesUtilNew.getLanguages(currentUser) as ArrayList<*>).toArray())

for (i in 0 until json.length()) {
val current = json.getJSONObject(i)
if (current.getString(FROM_LABEL) == language) {
return current.getString(FROM_ID)
private fun getISOFromServer(label: String): String {
var result = ""
for (language in languages!!) {
if (language.fromLabel == label) {
result = language.from!!
}
}

return ""
return result
}

private fun setupSpinners() {
Expand Down Expand Up @@ -279,15 +286,19 @@ class TranslateActivity : BaseActivity() {
enableSpinners(true)
}

private fun onErrorState() {
private fun onTranslationErrorState() {
binding.progressBar.visibility = View.GONE
enableSpinners(true)
showDialog(R.string.translation_error_title, R.string.translation_error_message)
}

private fun onLanguagesErrorState() {
binding.progressBar.visibility = View.GONE
enableSpinners(true)
showDialog()
showDialog(R.string.languages_error_title, R.string.languages_error_message)
}

companion object {
private const val FROM_ID = "from"
private const val FROM_LABEL = "fromLabel"
private const val TO_LABEL = "toLabel"
val TAG = TranslateActivity::class.simpleName
}
}
Loading
Loading