/* * Copyright (c) 2010-2020 Belledonne Communications SARL. * * This file is part of linphone-android * (see https://www.linphone.org). * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ package org.linphone import android.annotation.SuppressLint import android.app.Application import android.content.Context import coil.ImageLoader import coil.ImageLoaderFactory import coil.decode.GifDecoder import coil.decode.ImageDecoderDecoder import coil.decode.SvgDecoder import coil.decode.VideoFrameDecoder import coil.disk.DiskCache import coil.memory.MemoryCache import org.linphone.core.* import org.linphone.core.tools.Log import org.linphone.mediastream.Version class LinphoneApplication : Application(), ImageLoaderFactory { companion object { @SuppressLint("StaticFieldLeak") lateinit var corePreferences: CorePreferences @SuppressLint("StaticFieldLeak") lateinit var coreContext: CoreContext private fun createConfig(context: Context) { if (::corePreferences.isInitialized) { return } Factory.instance().setLogCollectionPath(context.filesDir.absolutePath) Factory.instance().enableLogCollection(LogCollectionState.Enabled) // For VFS Factory.instance().setCacheDir(context.cacheDir.absolutePath) corePreferences = CorePreferences(context) corePreferences.copyAssetsFromPackage() if (corePreferences.vfsEnabled) { CoreContext.activateVFS() } val config = Factory.instance().createConfigWithFactory(corePreferences.configPath, corePreferences.factoryConfigPath) corePreferences.config = config val appName = context.getString(R.string.app_name) Factory.instance().setLoggerDomain(appName) Factory.instance().enableLogcatLogs(corePreferences.logcatLogsOutput) if (corePreferences.debugLogs) { Factory.instance().loggingService.setLogLevel(LogLevel.Message) } Log.i("[Application] Core config & preferences created") } fun ensureCoreExists( context: Context, pushReceived: Boolean = false, service: CoreService? = null, useAutoStartDescription: Boolean = false ): Boolean { if (::coreContext.isInitialized && !coreContext.stopped) { Log.d("[Application] Skipping Core creation (push received? $pushReceived)") return false } Log.i("[Application] Core context is being created ${if (pushReceived) "from push" else ""}") coreContext = CoreContext(context, corePreferences.config, service, useAutoStartDescription) coreContext.start() return true } fun contextExists(): Boolean { return ::coreContext.isInitialized } } override fun onCreate() { super.onCreate() val appName = getString(R.string.app_name) android.util.Log.i("[$appName]", "Application is being created") createConfig(applicationContext) Log.i("[Application] Created") } override fun newImageLoader(): ImageLoader { return ImageLoader.Builder(this) .components { add(VideoFrameDecoder.Factory()) add(SvgDecoder.Factory()) if (Version.sdkAboveOrEqual(Version.API28_PIE_90)) { add(ImageDecoderDecoder.Factory()) } else { add(GifDecoder.Factory()) } } .memoryCache { MemoryCache.Builder(this) .maxSizePercent(0.25) .build() } .diskCache { DiskCache.Builder() .directory(cacheDir.resolve("image_cache")) .maxSizePercent(0.02) .build() } .build() } }