Skip to content
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
9 changes: 7 additions & 2 deletions crowdin/src/main/java/com/crowdin/platform/Crowdin.kt
Original file line number Diff line number Diff line change
Expand Up @@ -17,8 +17,8 @@ import com.crowdin.platform.data.model.ApiAuthConfig
import com.crowdin.platform.data.model.AuthConfig
import com.crowdin.platform.data.model.AuthInfo
import com.crowdin.platform.data.model.LanguageData
import com.crowdin.platform.data.model.LanguagesInfo
import com.crowdin.platform.data.model.ManifestData
import com.crowdin.platform.data.model.SupportedLanguages
import com.crowdin.platform.data.parser.StringResourceParser
import com.crowdin.platform.data.parser.XmlReader
import com.crowdin.platform.data.remote.Connectivity
Expand Down Expand Up @@ -565,7 +565,12 @@ object Crowdin {

fun getManifest(): ManifestData? = dataManager?.getManifest()

fun getSupportedLanguages(): LanguagesInfo? = dataManager?.getSupportedLanguages()
/**
* Get all supported languages from the distribution.
* @return Map where key is language code and value contains language details (name, locale).
* Example: `{"de": LanguageDetails("German", "de-DE"), "it": LanguageDetails("Italian", "it-IT")}`
*/
fun getSupportedLanguages(): SupportedLanguages? = dataManager?.getSupportedLanguages()

private fun initDistributionInfo() {
if (config.apiAuthConfig?.apiToken == null) {
Expand Down
60 changes: 34 additions & 26 deletions crowdin/src/main/java/com/crowdin/platform/data/DataManager.kt
Original file line number Diff line number Diff line change
Expand Up @@ -10,11 +10,13 @@ import com.crowdin.platform.Preferences
import com.crowdin.platform.data.local.LocalRepository
import com.crowdin.platform.data.model.ArrayData
import com.crowdin.platform.data.model.AuthInfo
import com.crowdin.platform.data.model.CachedLanguages
import com.crowdin.platform.data.model.LanguageData
import com.crowdin.platform.data.model.LanguagesInfo
import com.crowdin.platform.data.model.ManifestData
import com.crowdin.platform.data.model.PluralData
import com.crowdin.platform.data.model.StringData
import com.crowdin.platform.data.model.SupportedLanguages
import com.crowdin.platform.data.model.SyncData
import com.crowdin.platform.data.model.TextMetaData
import com.crowdin.platform.data.remote.Connectivity
import com.crowdin.platform.data.remote.NetworkType
Expand All @@ -32,20 +34,6 @@ internal class DataManager(
private val crowdinPreferences: Preferences,
private val dataChangeObserver: LocalDataChangeObserver,
) : TextMetaDataProvider {
companion object {
private const val STATUS_OK = "ok"
const val SUF_COPY = "-copy"
const val DISTRIBUTION_DATA = "distribution_data"
const val AUTH_INFO = "auth_info"
const val DISTRIBUTION_HASH = "distribution_hash"
const val MAPPING_SUF = "-mapping"
const val SUPPORTED_LANGUAGES = "supported_languages"
const val MANIFEST_DATA = "manifest_data"
const val SYNC_DATA = "sync_data"
const val EVENT_TICKETS = "event_tickets"
const val EVENT_TICKETS_EXPIRATION = 1000 * 60 * 4
}

private var loadingStateListeners: ArrayList<LoadingStateListener>? = null

override fun provideTextMetaData(
Expand Down Expand Up @@ -216,7 +204,7 @@ internal class DataManager(
}

fun saveMapping(languageData: LanguageData) {
languageData.language = languageData.language + MAPPING_SUF
languageData.language += MAPPING_SUF
localRepository.saveLanguageData(languageData)
}

Expand Down Expand Up @@ -266,18 +254,24 @@ internal class DataManager(
}

@WorkerThread
fun getSupportedLanguages(): LanguagesInfo? {
fun getSupportedLanguages(): SupportedLanguages? {
Log.v(CROWDIN_TAG, "Getting supported languages started")

var info: LanguagesInfo? = getData(SUPPORTED_LANGUAGES, LanguagesInfo::class.java)
if (info == null) {
info = remoteRepository.getSupportedLanguages()
saveData(SUPPORTED_LANGUAGES, info)
val syncData = crowdinPreferences.getData<SyncData>(SYNC_DATA, SyncData::class.java)
val cachedLanguages = getData<CachedLanguages>(CACHED_LANGUAGES, CachedLanguages::class.java)
val currentTimestamp = syncData?.timestamp ?: 0L

return if (cachedLanguages != null && cachedLanguages.manifestTimestamp == currentTimestamp) {
cachedLanguages.languages
} else {
val fetchedLanguages = remoteRepository.getSupportedLanguages()
if (fetchedLanguages != null) {
saveData(CACHED_LANGUAGES, CachedLanguages(fetchedLanguages, currentTimestamp))
} else {
Log.v(CROWDIN_TAG, "Failed to fetch languages from distribution")
}
Log.v(CROWDIN_TAG, "Supported languages: $fetchedLanguages")
fetchedLanguages
}

Log.v(CROWDIN_TAG, "Supported languages: $info")

return info
}

@WorkerThread
Expand Down Expand Up @@ -320,4 +314,18 @@ internal class DataManager(
) {
fun isExpired(): Boolean = System.currentTimeMillis() > expirationTime
}

companion object {
private const val STATUS_OK = "ok"
const val SUF_COPY = "-copy"
const val DISTRIBUTION_DATA = "distribution_data"
const val AUTH_INFO = "auth_info"
const val DISTRIBUTION_HASH = "distribution_hash"
const val MAPPING_SUF = "-mapping"
const val CACHED_LANGUAGES = "cached_languages"
const val MANIFEST_DATA = "manifest_data"
const val SYNC_DATA = "sync_data"
const val EVENT_TICKETS = "event_tickets"
const val EVENT_TICKETS_EXPIRATION = 1000 * 60 * 4
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
package com.crowdin.platform.data.model

internal data class CachedLanguages(
val languages: SupportedLanguages,
val manifestTimestamp: Long,
)

This file was deleted.

This file was deleted.

Original file line number Diff line number Diff line change
Expand Up @@ -9,27 +9,10 @@ data class ManifestData(
val timestamp: Long,
@SerializedName("languages")
val languages: List<String>,
@SerializedName("custom_languages")
val customLanguages: Map<String, CustomLanguage>,
@SerializedName("language_mapping")
val languageMapping: Map<String, Map<String, String>>,
@SerializedName("content")
val content: Map<String, List<String>>,
@SerializedName("mapping")
val mapping: List<String>,
)

data class CustomLanguage(
@SerializedName("name")
val name: String,
@SerializedName("two_letters_code")
val twoLettersCode: String,
@SerializedName("three_letters_code")
val threeLettersCode: String,
@SerializedName("locale")
val locale: String,
@SerializedName("android_code")
val androidCode: String,
@SerializedName("locale_with_underscore")
val localeWithUnderscore: String,
)
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
package com.crowdin.platform.data.model

import com.google.gson.annotations.SerializedName

/**
* Map of supported languages from distribution API.
* Key: language code (e.g., "de", "de-BE", "it", "tra")
* Value: language details
*/
typealias SupportedLanguages = Map<String, LanguageDetails>

data class LanguageDetails(
@SerializedName("name")
val name: String,
@SerializedName("locale")
val locale: String,
)
Original file line number Diff line number Diff line change
Expand Up @@ -5,9 +5,9 @@ import android.util.Log
import androidx.annotation.WorkerThread
import com.crowdin.platform.Crowdin
import com.crowdin.platform.data.LanguageDataCallback
import com.crowdin.platform.data.model.LanguageInfo
import com.crowdin.platform.data.model.LanguagesInfo
import com.crowdin.platform.data.model.LanguageDetails
import com.crowdin.platform.data.model.ManifestData
import com.crowdin.platform.data.model.SupportedLanguages
import com.crowdin.platform.data.model.TicketRequestBody
import com.crowdin.platform.data.model.TicketResponseBody
import com.crowdin.platform.data.remote.api.CrowdinApi
Expand All @@ -24,7 +24,7 @@ internal abstract class CrowdingRepository(
private val distributionHash: String,
) : BaseRepository() {
var crowdinApi: CrowdinApi? = null
var crowdinLanguages: LanguagesInfo? = null
var crowdinLanguages: SupportedLanguages? = null

override fun getManifest(
languageDataCallback: LanguageDataCallback?,
Expand Down Expand Up @@ -87,15 +87,18 @@ internal abstract class CrowdingRepository(
languageDataCallback: LanguageDataCallback?,
)

override fun getSupportedLanguages(): LanguagesInfo? {
override fun getSupportedLanguages(): SupportedLanguages? {
Log.v(Crowdin.CROWDIN_TAG, "Getting supported languages from Api started")
var languages: SupportedLanguages? = null
executeIO {
val response = crowdinDistributionApi.getLanguages(distributionHash)?.execute()?.body()
if (response != null) {
languages = response
}
}
Log.v(Crowdin.CROWDIN_TAG, "Supported languages from Api: $languages")

var info: LanguagesInfo? = null
executeIO { info = crowdinApi?.getLanguagesInfo()?.execute()?.body() }

Log.v(Crowdin.CROWDIN_TAG, "Supported languages from Api: $info")

return info
return languages
}

@WorkerThread
Expand All @@ -105,14 +108,5 @@ internal abstract class CrowdingRepository(
return result
}

fun getLanguageInfo(sourceLanguage: String): LanguageInfo? {
crowdinLanguages?.data?.forEach {
val languageInfo = it.data
if (languageInfo.id == sourceLanguage) {
return languageInfo
}
}

return null
}
fun getLanguageInfo(sourceLanguage: String): LanguageDetails? = crowdinLanguages?.get(sourceLanguage)
}
Original file line number Diff line number Diff line change
Expand Up @@ -8,8 +8,8 @@ import com.crowdin.platform.data.DataManager
import com.crowdin.platform.data.DataManager.Companion.MANIFEST_DATA
import com.crowdin.platform.data.LanguageDataCallback
import com.crowdin.platform.data.model.LanguageData
import com.crowdin.platform.data.model.LanguagesInfo
import com.crowdin.platform.data.model.ManifestData
import com.crowdin.platform.data.model.SupportedLanguages
import com.crowdin.platform.data.parser.Reader
import com.crowdin.platform.data.remote.api.CrowdinDistributionApi
import com.crowdin.platform.util.executeIO
Expand All @@ -23,14 +23,11 @@ internal class MappingRepository(
private val dataManager: DataManager,
private val distributionHash: String,
private val sourceLanguage: String,
) : CrowdingRepository(
crowdinDistributionApi,
distributionHash,
) {
) : CrowdingRepository(crowdinDistributionApi, distributionHash) {
override fun fetchData(
configuration: Configuration?,
languageCode: String?,
supportedLanguages: LanguagesInfo?,
supportedLanguages: SupportedLanguages?,
languageDataCallback: LanguageDataCallback?,
) {
Log.v(Crowdin.CROWDIN_TAG, "MappingRepository. Fetch data from Api started")
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,8 +4,8 @@ import android.content.res.Configuration
import androidx.annotation.WorkerThread
import com.crowdin.platform.data.LanguageDataCallback
import com.crowdin.platform.data.model.LanguageData
import com.crowdin.platform.data.model.LanguagesInfo
import com.crowdin.platform.data.model.ManifestData
import com.crowdin.platform.data.model.SupportedLanguages
import com.crowdin.platform.data.model.TicketResponseBody

/**
Expand All @@ -17,12 +17,13 @@ internal interface RemoteRepository {
*
* @param configuration device configuration for locale context.
* @param languageCode code to be user for search data.
* @param supportedLanguages map of supported languages (code -> details).
* @param languageDataCallback delivers data back to caller.
*/
fun fetchData(
configuration: Configuration? = null,
languageCode: String? = null,
supportedLanguages: LanguagesInfo? = null,
supportedLanguages: SupportedLanguages? = null,
languageDataCallback: LanguageDataCallback? = null,
)

Expand All @@ -32,10 +33,10 @@ internal interface RemoteRepository {
)

/**
* Fetch all supported languages.
* Fetch all supported languages as a map (language code -> details).
*/
@WorkerThread
fun getSupportedLanguages(): LanguagesInfo?
fun getSupportedLanguages(): SupportedLanguages?

/**
* Fetch ticket for WebSocket connection.
Expand Down
Loading
Loading