Librechat-Mobile/app/src/main/kotlin/com/librechat/android/LibreChatApplication.kt
2026-03-09 22:00:00 -05:00

86 lines
3 KiB
Kotlin

package com.librechat.android
import android.app.Application
import coil.ImageLoader
import coil.ImageLoaderFactory
import coil.disk.DiskCache
import coil.memory.MemoryCache
import com.librechat.android.core.network.client.TokenManager
import dagger.hilt.EntryPoint
import dagger.hilt.InstallIn
import dagger.hilt.android.EntryPointAccessors
import dagger.hilt.android.HiltAndroidApp
import dagger.hilt.components.SingletonComponent
import kotlinx.coroutines.runBlocking
import okhttp3.OkHttpClient
import timber.log.Timber
@HiltAndroidApp
class LibreChatApplication : Application(), ImageLoaderFactory {
@EntryPoint
@InstallIn(SingletonComponent::class)
interface ImageLoaderEntryPoint {
fun tokenManager(): TokenManager
}
override fun onCreate() {
super.onCreate()
if (BuildConfig.DEBUG) {
Timber.plant(Timber.DebugTree())
}
}
override fun newImageLoader(): ImageLoader {
val entryPoint = EntryPointAccessors.fromApplication(
this, ImageLoaderEntryPoint::class.java
)
val tokenManager = entryPoint.tokenManager()
val okHttpClient = OkHttpClient.Builder()
.addInterceptor { chain ->
val token = runBlocking { tokenManager.getAccessToken() }
val requestBuilder = chain.request().newBuilder()
// The backend's uaParser middleware (ua-parser-js) rejects requests
// without a recognized browser User-Agent with 403. This must match
// the UA string used by the Ktor HttpClient.
.header(
"User-Agent",
"Mozilla/5.0 (Linux; Android 14; Pixel 8) AppleWebKit/537.36 " +
"(KHTML, like Gecko) Chrome/131.0.0.0 Mobile Safari/537.36",
)
if (token != null) {
requestBuilder.addHeader("Authorization", "Bearer $token")
}
val request = requestBuilder.build()
Timber.d("Coil image request: %s", request.url)
val response = chain.proceed(request)
if (!response.isSuccessful) {
Timber.w(
"Coil image request failed: %s -> %d %s",
request.url,
response.code,
response.message,
)
}
response
}
.build()
return ImageLoader.Builder(this)
.okHttpClient(okHttpClient)
.memoryCache {
MemoryCache.Builder(this)
.maxSizePercent(0.25)
.build()
}
.diskCache {
DiskCache.Builder()
.directory(cacheDir.resolve("image_cache"))
.maxSizeBytes(250L * 1024 * 1024) // 250 MB
.build()
}
.crossfade(true)
.build()
}
}