pref: locale loading

This commit is contained in:
rhunk
2024-05-28 20:55:03 +02:00
parent 8ad40e1190
commit c8abd8162b
8 changed files with 45 additions and 34 deletions

View File

@@ -33,7 +33,7 @@ interface BridgeInterface {
*
* @return the map of locales (key: locale short name, value: locale data as json)
*/
Map<String, String> fetchLocales(String userLocale);
Map<String, ParcelFileDescriptor> fetchLocales(String userLocale);
/**
* Enqueue a download

View File

@@ -1,10 +1,11 @@
package me.rhunk.snapenhance.common.bridge.types
import android.os.ParcelFileDescriptor
import java.util.Locale
data class LocalePair(
val locale: String,
val content: String
val content: ParcelFileDescriptor
) {
fun getLocale(): Locale {
if (locale.contains("_")) {

View File

@@ -1,10 +1,14 @@
package me.rhunk.snapenhance.common.bridge.wrapper
import android.content.Context
import android.os.ParcelFileDescriptor.AutoCloseInputStream
import com.google.gson.JsonObject
import com.google.gson.JsonParser
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.Dispatchers
import me.rhunk.snapenhance.common.bridge.types.LocalePair
import me.rhunk.snapenhance.common.logger.AbstractLogger
import me.rhunk.snapenhance.common.util.ktx.toParcelFileDescriptor
import java.util.Locale
@@ -13,17 +17,21 @@ class LocaleWrapper {
const val DEFAULT_LOCALE = "en_US"
fun fetchLocales(context: Context, locale: String = DEFAULT_LOCALE): List<LocalePair> {
val coroutineScope = CoroutineScope(Dispatchers.IO)
val locales = mutableListOf<LocalePair>().apply {
add(LocalePair(DEFAULT_LOCALE, context.resources.assets.open("lang/$DEFAULT_LOCALE.json").bufferedReader().use { it.readText() }))
add(LocalePair(DEFAULT_LOCALE, context.resources.assets.open("lang/$DEFAULT_LOCALE.json").toParcelFileDescriptor(coroutineScope)))
}
if (locale == DEFAULT_LOCALE) return locales
val compatibleLocale = context.resources.assets.list("lang")?.firstOrNull { it.startsWith(locale) }?.substringBefore(".") ?: return locales
context.resources.assets.open("lang/$compatibleLocale.json").use { inputStream ->
locales.add(LocalePair(compatibleLocale, inputStream.bufferedReader().use { it.readText() }))
}
locales.add(
LocalePair(
compatibleLocale,
context.resources.assets.open("lang/$compatibleLocale.json").toParcelFileDescriptor(coroutineScope)
)
)
return locales
}
@@ -42,7 +50,9 @@ class LocaleWrapper {
private fun load(localePair: LocalePair) {
loadedLocale = localePair.getLocale()
val translations = JsonParser.parseString(localePair.content).asJsonObject
val translations = AutoCloseInputStream(localePair.content).use {
JsonParser.parseReader(it.reader()).asJsonObject
}
if (translations == null || translations.isJsonNull) {
return
}

View File

@@ -5,6 +5,11 @@ import android.content.Context
import android.content.pm.PackageManager
import android.content.pm.PackageManager.ApplicationInfoFlags
import android.os.Build
import android.os.ParcelFileDescriptor
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.launch
import java.io.InputStream
fun PackageManager.getApplicationInfoCompat(packageName: String, flags: Int) =
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) {
@@ -17,4 +22,21 @@ fun PackageManager.getApplicationInfoCompat(packageName: String, flags: Int) =
fun Context.copyToClipboard(data: String, label: String = "Copied Text") {
getSystemService(android.content.ClipboardManager::class.java).setPrimaryClip(
ClipData.newPlainText(label, data))
}
}
fun InputStream.toParcelFileDescriptor(coroutineScope: CoroutineScope): ParcelFileDescriptor {
val pfd = ParcelFileDescriptor.createPipe()
val fos = ParcelFileDescriptor.AutoCloseOutputStream(pfd[1])
coroutineScope.launch(Dispatchers.IO) {
try {
copyTo(fos)
} finally {
close()
fos.flush()
fos.close()
}
}
return pfd[0]
}