86 lines
3 KiB
Kotlin
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()
|
|
}
|
|
}
|