From 3321448dd29a74ca4d91fc2dd08590dcb12d265e Mon Sep 17 00:00:00 2001 From: Vitor Pamplona Date: Fri, 20 Oct 2023 18:11:09 -0400 Subject: [PATCH] Solving one of the OutOfMemory erros (too many translators instantiated at the same time) --- .../service/lang/LanguageTranslatorService.kt | 5 +++++ .../java/com/vitorpamplona/amethyst/Amethyst.kt | 3 +-- .../amethyst/service/playback/VideoCache.kt | 5 +++-- .../com/vitorpamplona/amethyst/ui/MainActivity.kt | 3 +++ .../service/lang/LanguageTranslatorService.kt | 13 +++++++++---- 5 files changed, 21 insertions(+), 8 deletions(-) create mode 100644 app/src/fdroid/java/com/vitorpamplona/amethyst/service/lang/LanguageTranslatorService.kt diff --git a/app/src/fdroid/java/com/vitorpamplona/amethyst/service/lang/LanguageTranslatorService.kt b/app/src/fdroid/java/com/vitorpamplona/amethyst/service/lang/LanguageTranslatorService.kt new file mode 100644 index 000000000..8e4c33967 --- /dev/null +++ b/app/src/fdroid/java/com/vitorpamplona/amethyst/service/lang/LanguageTranslatorService.kt @@ -0,0 +1,5 @@ +package com.vitorpamplona.amethyst.service.lang + +object LanguageTranslatorService { + fun clear() {} +} diff --git a/app/src/main/java/com/vitorpamplona/amethyst/Amethyst.kt b/app/src/main/java/com/vitorpamplona/amethyst/Amethyst.kt index 5ee6a9490..ea922f6e3 100644 --- a/app/src/main/java/com/vitorpamplona/amethyst/Amethyst.kt +++ b/app/src/main/java/com/vitorpamplona/amethyst/Amethyst.kt @@ -5,7 +5,6 @@ import android.os.StrictMode import android.os.StrictMode.ThreadPolicy import android.os.StrictMode.VmPolicy import android.util.Log -import androidx.media3.common.util.UnstableApi import coil.ImageLoader import com.vitorpamplona.amethyst.service.playback.VideoCache import kotlinx.coroutines.Dispatchers @@ -13,7 +12,7 @@ import kotlinx.coroutines.GlobalScope import kotlinx.coroutines.launch import kotlin.time.measureTimedValue -@UnstableApi class Amethyst : Application() { +class Amethyst : Application() { val videoCache: VideoCache by lazy { val newCache = VideoCache() newCache.initFileCache(instance) diff --git a/app/src/main/java/com/vitorpamplona/amethyst/service/playback/VideoCache.kt b/app/src/main/java/com/vitorpamplona/amethyst/service/playback/VideoCache.kt index 0ffbb0691..5a6ce0cf2 100644 --- a/app/src/main/java/com/vitorpamplona/amethyst/service/playback/VideoCache.kt +++ b/app/src/main/java/com/vitorpamplona/amethyst/service/playback/VideoCache.kt @@ -1,7 +1,7 @@ package com.vitorpamplona.amethyst.service.playback +import android.annotation.SuppressLint import android.content.Context -import androidx.media3.common.util.UnstableApi import androidx.media3.database.StandaloneDatabaseProvider import androidx.media3.datasource.cache.CacheDataSource import androidx.media3.datasource.cache.LeastRecentlyUsedCacheEvictor @@ -10,7 +10,8 @@ import androidx.media3.datasource.okhttp.OkHttpDataSource import okhttp3.OkHttpClient import java.io.File -@UnstableApi class VideoCache { +@SuppressLint("UnsafeOptInUsageError") +class VideoCache { var exoPlayerCacheSize: Long = 150 * 1024 * 1024 // 90MB diff --git a/app/src/main/java/com/vitorpamplona/amethyst/ui/MainActivity.kt b/app/src/main/java/com/vitorpamplona/amethyst/ui/MainActivity.kt index 5320fdb33..e09e3b70d 100644 --- a/app/src/main/java/com/vitorpamplona/amethyst/ui/MainActivity.kt +++ b/app/src/main/java/com/vitorpamplona/amethyst/ui/MainActivity.kt @@ -23,6 +23,7 @@ import androidx.lifecycle.viewmodel.compose.viewModel import com.vitorpamplona.amethyst.LocalPreferences import com.vitorpamplona.amethyst.ServiceManager import com.vitorpamplona.amethyst.service.ExternalSignerUtils +import com.vitorpamplona.amethyst.service.lang.LanguageTranslatorService import com.vitorpamplona.amethyst.service.notifications.PushNotificationUtils import com.vitorpamplona.amethyst.ui.components.DefaultMutedSetting import com.vitorpamplona.amethyst.ui.components.keepPlayingMutex @@ -104,7 +105,9 @@ class MainActivity : AppCompatActivity() { } override fun onPause() { + LanguageTranslatorService.clear() ServiceManager.cleanObservers() + // if (BuildConfig.DEBUG) { GlobalScope.launch(Dispatchers.IO) { debugState(this@MainActivity) diff --git a/app/src/play/java/com/vitorpamplona/amethyst/service/lang/LanguageTranslatorService.kt b/app/src/play/java/com/vitorpamplona/amethyst/service/lang/LanguageTranslatorService.kt index e539b18a2..2441c04d3 100644 --- a/app/src/play/java/com/vitorpamplona/amethyst/service/lang/LanguageTranslatorService.kt +++ b/app/src/play/java/com/vitorpamplona/amethyst/service/lang/LanguageTranslatorService.kt @@ -24,7 +24,7 @@ data class ResultOrError( ) object LanguageTranslatorService { - var executorService = Executors.newScheduledThreadPool(5) + var executorService = Executors.newScheduledThreadPool(3) private val options = LanguageIdentificationOptions.Builder().setExecutor(executorService).setConfidenceThreshold(0.6f).build() private val languageIdentification = LanguageIdentification.getClient(options) @@ -32,7 +32,7 @@ object LanguageTranslatorService { val tagRegex = Pattern.compile("(nostr:)?@?(nsec1|npub1|nevent1|naddr1|note1|nprofile1|nrelay1)([qpzry9x8gf2tvdw0s3jn54khce6mua7l]+)", Pattern.CASE_INSENSITIVE) private val translators = - object : LruCache(20) { + object : LruCache(3) { override fun create(options: TranslatorOptions): Translator { return Translation.getClient(options) } @@ -47,6 +47,10 @@ object LanguageTranslatorService { } } + fun clear() { + translators.evictAll() + } + fun identifyLanguage(text: String): Task { return languageIdentification.identifyLanguage(text) } @@ -61,6 +65,7 @@ object LanguageTranslatorService { } val options = TranslatorOptions.Builder() + .setExecutor(executorService) .setSourceLanguage(sourceLangCode) .setTargetLanguage(targetLangCode) .build() @@ -116,7 +121,7 @@ object LanguageTranslatorService { val short = "A$counter" counter++ returningList.put(short, tag) - } catch (e: Exception) { + } catch (_: Exception) { } } return returningList @@ -132,7 +137,7 @@ object LanguageTranslatorService { val short = "A$counter" counter++ returningList.put(short, lnInvoice) - } catch (e: Exception) { + } catch (_: Exception) { } } return returningList