pref: locale loading
This commit is contained in:
@@ -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
|
||||
|
||||
@@ -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("_")) {
|
||||
|
||||
@@ -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
|
||||
}
|
||||
|
||||
@@ -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]
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user