Skip to content

Commit

Permalink
Adjusting Translation Provider
Browse files Browse the repository at this point in the history
- Added 4 new model data classes
- Added the new API function to NcApi
- Implemented the changes in the Repository + ViewModel
- Implemented the changes in the Activity
- Added some helper functions to support impl

Signed-off-by: Julius Linus <[email protected]>
  • Loading branch information
rapterjet2004 committed Nov 15, 2023
1 parent 6c4681d commit 46d0146
Show file tree
Hide file tree
Showing 14 changed files with 260 additions and 53 deletions.
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

0 comments on commit 46d0146

Please sign in to comment.