refactor: Use Kermit instead of Timber

This commit is contained in:
Ahmad Ansori Palembani 2024-06-09 15:41:35 +07:00
parent 2218804d58
commit 555bcecfbc
Signed by: null2264
GPG key ID: BA64F8B60AF3EFB6
66 changed files with 274 additions and 258 deletions

View file

@ -248,7 +248,7 @@ dependencies {
implementation(libs.bundles.coil)
// Logging
implementation(libs.timber)
implementation(libs.kermit)
// Sort
implementation(libs.java.nat.sort)

View file

@ -1,12 +1,13 @@
package dev.yokai.data.library.custom
import android.database.sqlite.SQLiteException
import co.touchlab.kermit.Logger
import dev.yokai.data.DatabaseHandler
import dev.yokai.domain.library.custom.CustomMangaRepository
import dev.yokai.domain.library.custom.exception.SaveCustomMangaException
import dev.yokai.domain.library.custom.model.CustomMangaInfo
import eu.kanade.tachiyomi.util.system.e
import kotlinx.coroutines.flow.Flow
import timber.log.Timber
class CustomMangaRepositoryImpl(private val handler: DatabaseHandler) : CustomMangaRepository {
override fun subscribeAll(): Flow<List<CustomMangaInfo>> =
@ -27,7 +28,7 @@ class CustomMangaRepositoryImpl(private val handler: DatabaseHandler) : CustomMa
try {
handler.await { custom_manga_infoQueries.insert(mangaId, title, author, artist, description, genre, status?.toLong()) }
} catch (exc: SQLiteException) {
Timber.e(exc)
Logger.e(exc)
throw SaveCustomMangaException(exc)
}
}
@ -48,7 +49,7 @@ class CustomMangaRepositoryImpl(private val handler: DatabaseHandler) : CustomMa
}
}
} catch (exc: SQLiteException) {
Timber.e(exc)
Logger.e(exc)
throw SaveCustomMangaException(exc)
}
}

View file

@ -1,12 +1,12 @@
package dev.yokai.domain.extension.repo.interactor
import co.touchlab.kermit.Logger
import dev.yokai.domain.extension.repo.ExtensionRepoRepository
import dev.yokai.domain.extension.repo.exception.SaveExtensionRepoException
import dev.yokai.domain.extension.repo.model.ExtensionRepo
import dev.yokai.domain.extension.repo.service.ExtensionRepoService
import eu.kanade.tachiyomi.network.NetworkHelper
import okhttp3.OkHttpClient
import timber.log.Timber
import uy.kohesive.injekt.injectLazy
class CreateExtensionRepo(
@ -41,7 +41,7 @@ class CreateExtensionRepo(
)
Result.Success
} catch (e: SaveExtensionRepoException) {
Timber.e(e, "SQL Conflict attempting to add new repository ${repo.baseUrl}")
Logger.e(e) { "SQL Conflict attempting to add new repository ${repo.baseUrl}" }
return handleInsertionError(repo)
}
}

View file

@ -33,6 +33,10 @@ import coil3.request.crossfade
import coil3.util.DebugLogger
import com.google.firebase.crashlytics.ktx.crashlytics
import com.google.firebase.ktx.Firebase
import dev.yokai.core.di.AppModule
import dev.yokai.core.di.DomainModule
import dev.yokai.core.di.PreferenceModule
import dev.yokai.domain.base.BasePreferences
import eu.kanade.tachiyomi.appwidget.TachiyomiWidgetManager
import eu.kanade.tachiyomi.data.coil.BufferedSourceFetcher
import eu.kanade.tachiyomi.data.coil.CoilDiskCache
@ -41,13 +45,7 @@ import eu.kanade.tachiyomi.data.coil.MangaCoverKeyer
import eu.kanade.tachiyomi.data.coil.TachiyomiImageDecoder
import eu.kanade.tachiyomi.data.notification.Notifications
import eu.kanade.tachiyomi.data.preference.PreferencesHelper
import dev.yokai.core.di.AppModule
import dev.yokai.core.di.DomainModule
import dev.yokai.core.di.PreferenceModule
import dev.yokai.domain.base.BasePreferences
import eu.kanade.tachiyomi.network.NetworkHelper
import eu.kanade.tachiyomi.ui.crash.CrashActivity
import eu.kanade.tachiyomi.ui.crash.GlobalExceptionHandler
import eu.kanade.tachiyomi.ui.library.LibraryPresenter
import eu.kanade.tachiyomi.ui.recents.RecentsPresenter
import eu.kanade.tachiyomi.ui.security.SecureActivityDelegate
@ -60,7 +58,6 @@ import eu.kanade.tachiyomi.util.system.notification
import kotlinx.coroutines.flow.launchIn
import kotlinx.coroutines.flow.onEach
import org.conscrypt.Conscrypt
import timber.log.Timber
import uy.kohesive.injekt.Injekt
import uy.kohesive.injekt.api.get
import uy.kohesive.injekt.injectLazy
@ -77,8 +74,6 @@ open class App : Application(), DefaultLifecycleObserver, SingletonImageLoader.F
override fun onCreate() {
super<Application>.onCreate()
if (BuildConfig.DEBUG) Timber.plant(Timber.DebugTree())
// TLS 1.3 support for Android 10 and below
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.Q) {
Security.insertProviderAt(Conscrypt.newProvider(), 1)

View file

@ -2,6 +2,7 @@ package eu.kanade.tachiyomi
import androidx.core.content.edit
import androidx.preference.PreferenceManager
import co.touchlab.kermit.Logger
import dev.yokai.domain.base.BasePreferences
import dev.yokai.domain.extension.repo.ExtensionRepoRepository
import dev.yokai.domain.extension.repo.exception.SaveExtensionRepoException
@ -31,7 +32,6 @@ import eu.kanade.tachiyomi.util.system.launchIO
import eu.kanade.tachiyomi.util.system.toast
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.Dispatchers
import timber.log.Timber
import uy.kohesive.injekt.Injekt
import uy.kohesive.injekt.api.get
import uy.kohesive.injekt.injectLazy
@ -328,7 +328,7 @@ object Migrations {
"NOFINGERPRINT-${index + 1}",
)
} catch (e: SaveExtensionRepoException) {
Timber.e(e, "Error Migrating Extension Repo with baseUrl: $source")
Logger.e(e) { "Error Migrating Extension Repo with baseUrl: $source" }
}
}
extensionRepos.delete()

View file

@ -3,6 +3,7 @@ package eu.kanade.tachiyomi.core.preference
import android.content.SharedPreferences
import android.content.SharedPreferences.Editor
import androidx.core.content.edit
import co.touchlab.kermit.Logger
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.flow.Flow
import kotlinx.coroutines.flow.SharingStarted
@ -12,7 +13,6 @@ import kotlinx.coroutines.flow.filter
import kotlinx.coroutines.flow.map
import kotlinx.coroutines.flow.onStart
import kotlinx.coroutines.flow.stateIn
import timber.log.Timber
sealed class AndroidPreference<T>(
private val preferences: SharedPreferences,
@ -33,7 +33,7 @@ sealed class AndroidPreference<T>(
return try {
read(preferences, key, defaultValue)
} catch (e: ClassCastException) {
Timber.d("Invalid value for $key; deleting")
Logger.d { "Invalid value for $key; deleting" }
delete()
defaultValue
}

View file

@ -2,9 +2,12 @@ package eu.kanade.tachiyomi.data.backup
import android.content.Context
import android.net.Uri
import co.touchlab.kermit.Logger
import com.hippo.unifile.UniFile
import dev.yokai.domain.storage.StorageManager
import eu.kanade.tachiyomi.R
import eu.kanade.tachiyomi.core.preference.Preference
import eu.kanade.tachiyomi.core.preference.PreferenceStore
import eu.kanade.tachiyomi.data.backup.BackupConst.BACKUP_APP_PREFS
import eu.kanade.tachiyomi.data.backup.BackupConst.BACKUP_APP_PREFS_MASK
import eu.kanade.tachiyomi.data.backup.BackupConst.BACKUP_CATEGORY
@ -40,19 +43,17 @@ import eu.kanade.tachiyomi.data.backup.models.StringSetPreferenceValue
import eu.kanade.tachiyomi.data.database.DatabaseHelper
import eu.kanade.tachiyomi.data.database.models.Manga
import eu.kanade.tachiyomi.data.library.CustomMangaManager
import eu.kanade.tachiyomi.core.preference.Preference
import eu.kanade.tachiyomi.core.preference.PreferenceStore
import eu.kanade.tachiyomi.data.preference.PreferencesHelper
import eu.kanade.tachiyomi.source.ConfigurableSource
import eu.kanade.tachiyomi.source.SourceManager
import eu.kanade.tachiyomi.source.preferenceKey
import eu.kanade.tachiyomi.source.sourcePreferences
import eu.kanade.tachiyomi.ui.library.LibrarySort
import eu.kanade.tachiyomi.util.system.e
import kotlinx.serialization.protobuf.ProtoBuf
import okio.buffer
import okio.gzip
import okio.sink
import timber.log.Timber
import uy.kohesive.injekt.Injekt
import uy.kohesive.injekt.api.get
import uy.kohesive.injekt.injectLazy
@ -139,7 +140,7 @@ class BackupCreator(val context: Context) {
return fileUri.toString()
} catch (e: Exception) {
Timber.e(e)
Logger.e(e)
file?.delete()
throw e
}

View file

@ -12,14 +12,14 @@ import androidx.work.WorkManager
import androidx.work.Worker
import androidx.work.WorkerParameters
import androidx.work.workDataOf
import co.touchlab.kermit.Logger
import com.hippo.unifile.UniFile
import dev.yokai.domain.storage.StorageManager
import dev.yokai.domain.storage.StoragePreferences
import eu.kanade.tachiyomi.data.notification.Notifications
import eu.kanade.tachiyomi.data.preference.PreferencesHelper
import eu.kanade.tachiyomi.util.system.e
import eu.kanade.tachiyomi.util.system.localeContext
import eu.kanade.tachiyomi.util.system.notificationManager
import timber.log.Timber
import uy.kohesive.injekt.Injekt
import uy.kohesive.injekt.api.get
import uy.kohesive.injekt.injectLazy
@ -41,7 +41,7 @@ class BackupCreatorJob(private val context: Context, workerParams: WorkerParamet
if (!isAutoBackup) notifier.showBackupComplete(UniFile.fromUri(context, location.toUri())!!)
Result.success()
} catch (e: Exception) {
Timber.e(e)
Logger.e(e)
if (!isAutoBackup) notifier.showBackupError(e.message)
Result.failure()
} finally {

View file

@ -2,6 +2,7 @@ package eu.kanade.tachiyomi.data.cache
import android.content.Context
import android.text.format.Formatter
import co.touchlab.kermit.Logger
import coil3.imageLoader
import coil3.memory.MemoryCache
import eu.kanade.tachiyomi.R
@ -9,13 +10,13 @@ import eu.kanade.tachiyomi.data.database.DatabaseHelper
import eu.kanade.tachiyomi.data.database.models.Manga
import eu.kanade.tachiyomi.data.database.models.MangaImpl
import eu.kanade.tachiyomi.util.storage.DiskUtil
import eu.kanade.tachiyomi.util.system.e
import eu.kanade.tachiyomi.util.system.executeOnIO
import eu.kanade.tachiyomi.util.system.toast
import eu.kanade.tachiyomi.util.system.withIOContext
import eu.kanade.tachiyomi.util.system.withUIContext
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.withContext
import timber.log.Timber
import uy.kohesive.injekt.Injekt
import uy.kohesive.injekt.api.get
import java.io.File
@ -141,7 +142,7 @@ class CoverCache(val context: Context) {
}
}
} catch (e: Exception) {
Timber.e(e)
Logger.e(e)
}
lastClean = System.currentTimeMillis()
}

View file

@ -2,6 +2,7 @@ package eu.kanade.tachiyomi.data.coil
import android.webkit.MimeTypeMap
import androidx.core.net.toUri
import co.touchlab.kermit.Logger
import coil3.Extras
import coil3.ImageLoader
import coil3.decode.DataSource
@ -34,7 +35,6 @@ import okio.Source
import okio.buffer
import okio.sink
import okio.source
import timber.log.Timber
import uy.kohesive.injekt.injectLazy
import java.io.File
import java.net.HttpURLConnection
@ -200,7 +200,7 @@ class MangaCoverFetcher(
}
cacheFile.takeIf { it.exists() }
} catch (e: Exception) {
Timber.e(e, "Failed to write snapshot data to cover cache ${cacheFile.name}")
Logger.e(e) { "Failed to write snapshot data to cover cache ${cacheFile.name}" }
null
}
}
@ -213,7 +213,7 @@ class MangaCoverFetcher(
}
cacheFile.takeIf { it.exists() }
} catch (e: Exception) {
Timber.e(e, "Failed to write response data to cover cache ${cacheFile.name}")
Logger.e(e) { "Failed to write response data to cover cache ${cacheFile.name}" }
null
}
}

View file

@ -2,8 +2,8 @@ package eu.kanade.tachiyomi.data.database
import androidx.sqlite.db.SupportSQLiteDatabase
import app.cash.sqldelight.driver.android.AndroidSqliteDriver
import co.touchlab.kermit.Logger
import tachiyomi.data.Database
import timber.log.Timber
class DbOpenCallback : AndroidSqliteDriver.Callback(Database.Schema) {
@ -28,13 +28,13 @@ class DbOpenCallback : AndroidSqliteDriver.Callback(Database.Schema) {
}
override fun onCreate(db: SupportSQLiteDatabase) {
Timber.d("Creating new database...")
Logger.d { "Creating new database..." }
super.onCreate(db)
}
override fun onUpgrade(db: SupportSQLiteDatabase, oldVersion: Int, newVersion: Int) {
if (oldVersion < newVersion) {
Timber.d("Upgrading database from $oldVersion to $newVersion")
Logger.d { "Upgrading database from $oldVersion to $newVersion" }
super.onUpgrade(db, oldVersion, newVersion)
}
}

View file

@ -1,6 +1,7 @@
package eu.kanade.tachiyomi.data.download
import android.content.Context
import co.touchlab.kermit.Logger
import com.hippo.unifile.UniFile
import dev.yokai.domain.download.DownloadPreferences
import eu.kanade.tachiyomi.R
@ -16,7 +17,6 @@ import kotlinx.coroutines.DelicateCoroutinesApi
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.GlobalScope
import kotlinx.coroutines.launch
import timber.log.Timber
import uy.kohesive.injekt.injectLazy
/**
@ -327,7 +327,7 @@ class DownloadManager(val context: Context) {
mangaFolder.delete()
cache.removeManga(manga)
} else {
Timber.e("Cache and download folder doesn't match for %s", manga.title)
Logger.e { "Cache and download folder doesn't match for ${manga.title}" }
}
}
return cleaned
@ -395,7 +395,7 @@ class DownloadManager(val context: Context) {
cache.removeChapters(listOf(oldChapter), manga)
cache.addChapter(newName, manga)
} else {
Timber.e("Could not rename downloaded chapter: ${oldNames.joinToString()}")
Logger.e { "Could not rename downloaded chapter: ${oldNames.joinToString()}" }
}
}

View file

@ -3,6 +3,7 @@ package eu.kanade.tachiyomi.data.download
import android.content.Context
import android.os.Handler
import android.os.Looper
import co.touchlab.kermit.Logger
import com.hippo.unifile.UniFile
import com.jakewharton.rxrelay.PublishRelay
import dev.yokai.core.metadata.COMIC_INFO_FILE
@ -27,6 +28,7 @@ import eu.kanade.tachiyomi.util.storage.DiskUtil
import eu.kanade.tachiyomi.util.storage.DiskUtil.NOMEDIA_FILE
import eu.kanade.tachiyomi.util.storage.saveTo
import eu.kanade.tachiyomi.util.system.ImageUtil
import eu.kanade.tachiyomi.util.system.e
import eu.kanade.tachiyomi.util.system.launchIO
import eu.kanade.tachiyomi.util.system.launchNow
import eu.kanade.tachiyomi.util.system.withIOContext
@ -49,7 +51,6 @@ import rx.Observable
import rx.Subscription
import rx.android.schedulers.AndroidSchedulers
import rx.schedulers.Schedulers
import timber.log.Timber
import uy.kohesive.injekt.injectLazy
import java.io.BufferedOutputStream
import java.io.File
@ -250,7 +251,7 @@ class Downloader(
completeDownload(it)
},
{ error ->
Timber.e(error)
Logger.e(error)
notifier.onError(error.message)
stop()
},
@ -401,7 +402,7 @@ class Downloader(
} catch (error: Throwable) {
if (error is CancellationException) throw error
// If the page list threw, it will resume here
Timber.e(error)
Logger.e(error)
download.status = Download.State.ERROR
notifier.onError(error.message, chapName, download.manga.title)
}
@ -560,7 +561,7 @@ class Downloader(
return try {
ImageUtil.splitTallImage(imageFile, imageFilePath)
} catch (e: Exception) {
Timber.e(e)
Logger.e(e)
false
}
}

View file

@ -16,6 +16,7 @@ import androidx.work.WorkInfo
import androidx.work.WorkManager
import androidx.work.WorkQuery
import androidx.work.WorkerParameters
import co.touchlab.kermit.Logger
import coil3.imageLoader
import coil3.request.CachePolicy
import coil3.request.ImageRequest
@ -51,6 +52,7 @@ import eu.kanade.tachiyomi.util.manga.MangaShortcutManager
import eu.kanade.tachiyomi.util.shouldDownloadNewChapters
import eu.kanade.tachiyomi.util.storage.getUriCompat
import eu.kanade.tachiyomi.util.system.createFileInCacheDir
import eu.kanade.tachiyomi.util.system.e
import eu.kanade.tachiyomi.util.system.isConnectedToWifi
import eu.kanade.tachiyomi.util.system.localeContext
import eu.kanade.tachiyomi.util.system.tryToSetForeground
@ -71,12 +73,11 @@ import kotlinx.coroutines.launch
import kotlinx.coroutines.runBlocking
import kotlinx.coroutines.sync.Semaphore
import kotlinx.coroutines.sync.withPermit
import timber.log.Timber
import uy.kohesive.injekt.Injekt
import uy.kohesive.injekt.api.get
import java.io.File
import java.lang.ref.WeakReference
import java.util.Date
import java.util.*
import java.util.concurrent.CancellationException
import java.util.concurrent.TimeUnit
import java.util.concurrent.atomic.AtomicInteger
@ -179,7 +180,7 @@ class LibraryUpdateJob(private val context: Context, workerParams: WorkerParamet
finishUpdates(true)
Result.success()
} else {
Timber.e(e)
Logger.e(e)
Result.failure()
}
} finally {
@ -220,7 +221,7 @@ class LibraryUpdateJob(private val context: Context, workerParams: WorkerParamet
try {
requestSemaphore.withPermit { updateMangaInSource(source) }
} catch (e: Exception) {
Timber.e(e)
Logger.e(e)
false
}
}
@ -257,7 +258,7 @@ class LibraryUpdateJob(private val context: Context, workerParams: WorkerParamet
val networkManga = try {
source.getMangaDetails(manga.copy())
} catch (e: java.lang.Exception) {
Timber.e(e)
Logger.e(e)
null
}
if (networkManga != null) {
@ -314,7 +315,7 @@ class LibraryUpdateJob(private val context: Context, workerParams: WorkerParamet
syncChaptersWithTrackServiceTwoWay(db, db.getChapters(manga).executeAsBlocking(), track, service)
}
} catch (e: Exception) {
Timber.e(e)
Logger.e(e)
}
}
}
@ -433,7 +434,7 @@ class LibraryUpdateJob(private val context: Context, workerParams: WorkerParamet
} catch (e: Exception) {
if (e !is CancellationException) {
failedUpdates[manga] = e.message
Timber.e("Failed updating: ${manga.title}: $e")
Logger.e { "Failed updating: ${manga.title}: $e" }
}
return@coroutineScope false
}

View file

@ -9,11 +9,12 @@ import androidx.work.NetworkType
import androidx.work.OneTimeWorkRequestBuilder
import androidx.work.WorkManager
import androidx.work.WorkerParameters
import co.touchlab.kermit.Logger
import eu.kanade.tachiyomi.data.database.DatabaseHelper
import eu.kanade.tachiyomi.data.preference.PreferencesHelper
import eu.kanade.tachiyomi.util.system.e
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.withContext
import timber.log.Timber
import uy.kohesive.injekt.Injekt
import uy.kohesive.injekt.api.get
import java.util.concurrent.TimeUnit
@ -51,7 +52,7 @@ class DelayedTrackingUpdateJob(context: Context, workerParams: WorkerParameters)
service.update(track, true)
db.insertTrack(track).executeAsBlocking()
} catch (e: Exception) {
Timber.e(e)
Logger.e(e)
}
}
}

View file

@ -3,14 +3,14 @@ package eu.kanade.tachiyomi.data.track.anilist
import android.content.Context
import android.graphics.Color
import androidx.annotation.StringRes
import co.touchlab.kermit.Logger
import eu.kanade.tachiyomi.R
import eu.kanade.tachiyomi.data.database.models.Track
import eu.kanade.tachiyomi.data.track.TrackService
import eu.kanade.tachiyomi.data.track.updateNewTrackInfo
import kotlinx.serialization.decodeFromString
import eu.kanade.tachiyomi.util.system.e
import kotlinx.serialization.encodeToString
import kotlinx.serialization.json.Json
import timber.log.Timber
import uy.kohesive.injekt.injectLazy
class Anilist(private val context: Context, id: Int) : TrackService(id) {
@ -210,7 +210,7 @@ class Anilist(private val context: Context, id: Int) : TrackService(id) {
saveCredentials(username.toString(), oauth.access_token)
true
} catch (e: Exception) {
Timber.e(e)
Logger.e(e)
logout()
false
}
@ -222,7 +222,7 @@ class Anilist(private val context: Context, id: Int) : TrackService(id) {
scorePreference.set(scoreType)
true to null
} catch (e: Exception) {
Timber.e(e)
Logger.e(e)
false to e
}
}
@ -241,7 +241,7 @@ class Anilist(private val context: Context, id: Int) : TrackService(id) {
return try {
json.decodeFromString<OAuth>(trackPreferences.trackToken(this).get())
} catch (e: Exception) {
Timber.e(e)
Logger.e(e)
null
}
}

View file

@ -3,15 +3,15 @@ package eu.kanade.tachiyomi.data.track.bangumi
import android.content.Context
import android.graphics.Color
import androidx.annotation.StringRes
import co.touchlab.kermit.Logger
import eu.kanade.tachiyomi.R
import eu.kanade.tachiyomi.data.database.models.Track
import eu.kanade.tachiyomi.data.track.TrackService
import eu.kanade.tachiyomi.data.track.model.TrackSearch
import eu.kanade.tachiyomi.data.track.updateNewTrackInfo
import kotlinx.serialization.decodeFromString
import eu.kanade.tachiyomi.util.system.e
import kotlinx.serialization.encodeToString
import kotlinx.serialization.json.Json
import timber.log.Timber
import uy.kohesive.injekt.injectLazy
class Bangumi(private val context: Context, id: Int) : TrackService(id) {
@ -122,7 +122,7 @@ class Bangumi(private val context: Context, id: Int) : TrackService(id) {
saveCredentials(oauth.user_id.toString(), oauth.access_token)
return true
} catch (e: Exception) {
Timber.e(e)
Logger.e(e)
logout()
}
return false

View file

@ -1,5 +1,6 @@
package eu.kanade.tachiyomi.data.track.kavita
import co.touchlab.kermit.Logger
import eu.kanade.tachiyomi.data.database.models.Track
import eu.kanade.tachiyomi.data.track.model.TrackSearch
import eu.kanade.tachiyomi.network.GET
@ -12,7 +13,6 @@ import okhttp3.Dns
import okhttp3.MediaType.Companion.toMediaTypeOrNull
import okhttp3.OkHttpClient
import okhttp3.RequestBody.Companion.toRequestBody
import timber.log.Timber
import uy.kohesive.injekt.injectLazy
import java.io.IOException
import java.net.SocketTimeoutException
@ -46,11 +46,11 @@ class KavitaApi(private val client: OkHttpClient, interceptor: KavitaInterceptor
when (it.code) {
200 -> return with(json) { it.parseAs<AuthenticationDto>().token }
401 -> {
Timber.w("Unauthorized / api key not valid: Cleaned api URL: $apiUrl, Api key is empty: ${apiKey.isEmpty()}")
Logger.w { "Unauthorized / api key not valid: Cleaned api URL: $apiUrl, Api key is empty: ${apiKey.isEmpty()}" }
throw IOException("Unauthorized / api key not valid")
}
500 -> {
Timber.w("Error fetching JWT token. Cleaned api URL: $apiUrl, Api key is empty: ${apiKey.isEmpty()}")
Logger.w { "Error fetching JWT token. Cleaned api URL: $apiUrl, Api key is empty: ${apiKey.isEmpty()}" }
throw IOException("Error fetching JWT token")
}
else -> {}
@ -58,14 +58,14 @@ class KavitaApi(private val client: OkHttpClient, interceptor: KavitaInterceptor
}
// Not sure which one to catch
} catch (e: SocketTimeoutException) {
Timber.w(
"Could not fetch JWT token. Probably due to connectivity issue or the url '$apiUrl' is not available, skipping",
)
Logger.w {
"Could not fetch JWT token. Probably due to connectivity issue or the url '$apiUrl' is not available, skipping"
}
return null
} catch (e: Exception) {
Timber.e(
"Unhandled exception fetching JWT token for url: '$apiUrl'",
)
Logger.e {
"Unhandled exception fetching JWT token for url: '$apiUrl'"
}
throw IOException(e)
}
@ -106,7 +106,7 @@ class KavitaApi(private val client: OkHttpClient, interceptor: KavitaInterceptor
return if (maxChapterNumber > volumeNumber) maxChapterNumber else volumeNumber
} catch (e: Exception) {
Timber.w(e, "Exception fetching Total Chapters. Request:$requestUrl")
Logger.w(e) { "Exception fetching Total Chapters. Request:$requestUrl" }
throw e
}
}
@ -126,7 +126,7 @@ class KavitaApi(private val client: OkHttpClient, interceptor: KavitaInterceptor
}
}
} catch (e: Exception) {
Timber.w(e, "Exception getting latest chapter read. Could not get itemRequest: $requestUrl")
Logger.w(e) { "Exception getting latest chapter read. Could not get itemRequest: $requestUrl" }
throw e
}
return 0F
@ -155,7 +155,7 @@ class KavitaApi(private val client: OkHttpClient, interceptor: KavitaInterceptor
last_chapter_read = getLatestChapterRead(url)
}
} catch (e: Exception) {
Timber.w(e, "Could not get item: $url")
Logger.w(e) { "Could not get item: $url" }
throw e
}
}

View file

@ -3,15 +3,15 @@ package eu.kanade.tachiyomi.data.track.kitsu
import android.content.Context
import android.graphics.Color
import androidx.annotation.StringRes
import co.touchlab.kermit.Logger
import eu.kanade.tachiyomi.R
import eu.kanade.tachiyomi.data.database.models.Track
import eu.kanade.tachiyomi.data.track.TrackService
import eu.kanade.tachiyomi.data.track.model.TrackSearch
import eu.kanade.tachiyomi.data.track.updateNewTrackInfo
import kotlinx.serialization.decodeFromString
import eu.kanade.tachiyomi.util.system.e
import kotlinx.serialization.encodeToString
import kotlinx.serialization.json.Json
import timber.log.Timber
import uy.kohesive.injekt.injectLazy
import java.text.DecimalFormat
@ -139,7 +139,7 @@ class Kitsu(private val context: Context, id: Int) : TrackService(id) {
saveCredentials(username, userId)
true
} catch (e: Exception) {
Timber.e(e)
Logger.e(e)
false
}
}

View file

@ -1,5 +1,6 @@
package eu.kanade.tachiyomi.data.track.komga
import co.touchlab.kermit.Logger
import eu.kanade.tachiyomi.data.database.models.Track
import eu.kanade.tachiyomi.data.track.TrackManager
import eu.kanade.tachiyomi.data.track.model.TrackSearch
@ -13,7 +14,6 @@ import okhttp3.MediaType.Companion.toMediaType
import okhttp3.OkHttpClient
import okhttp3.Request
import okhttp3.RequestBody.Companion.toRequestBody
import timber.log.Timber
import uy.kohesive.injekt.injectLazy
const val READLIST_API = "/api/v1/readlists"
@ -72,7 +72,7 @@ class KomgaApi(private val client: OkHttpClient) {
last_chapter_read = progress.lastReadContinuousNumberSort
}
} catch (e: Exception) {
Timber.w(e, "Could not get item: $url")
Logger.w(e) { "Could not get item: $url" }
throw e
}
}

View file

@ -1,5 +1,6 @@
package eu.kanade.tachiyomi.data.track.mangaupdates
import co.touchlab.kermit.Logger
import eu.kanade.tachiyomi.data.database.models.Track
import eu.kanade.tachiyomi.data.track.mangaupdates.dto.Context
import eu.kanade.tachiyomi.data.track.mangaupdates.dto.ListItem
@ -11,6 +12,7 @@ import eu.kanade.tachiyomi.network.POST
import eu.kanade.tachiyomi.network.PUT
import eu.kanade.tachiyomi.network.awaitSuccess
import eu.kanade.tachiyomi.network.parseAs
import eu.kanade.tachiyomi.util.system.e
import kotlinx.serialization.json.Json
import kotlinx.serialization.json.JsonObject
import kotlinx.serialization.json.add
@ -25,7 +27,6 @@ import kotlinx.serialization.json.putJsonObject
import okhttp3.MediaType.Companion.toMediaType
import okhttp3.OkHttpClient
import okhttp3.RequestBody.Companion.toRequestBody
import timber.log.Timber
import uy.kohesive.injekt.injectLazy
class MangaUpdatesApi(
@ -193,7 +194,7 @@ class MangaUpdatesApi(
try {
json.decodeFromJsonElement<Context>(obj["context"]!!)
} catch (e: Exception) {
Timber.e(e)
Logger.e(e)
null
}
}

View file

@ -3,14 +3,15 @@ package eu.kanade.tachiyomi.data.track.myanimelist
import android.content.Context
import android.graphics.Color
import androidx.annotation.StringRes
import co.touchlab.kermit.Logger
import eu.kanade.tachiyomi.R
import eu.kanade.tachiyomi.data.database.models.Track
import eu.kanade.tachiyomi.data.track.TrackService
import eu.kanade.tachiyomi.data.track.model.TrackSearch
import eu.kanade.tachiyomi.data.track.updateNewTrackInfo
import eu.kanade.tachiyomi.util.system.e
import kotlinx.serialization.encodeToString
import kotlinx.serialization.json.Json
import timber.log.Timber
import uy.kohesive.injekt.injectLazy
class MyAnimeList(private val context: Context, id: Int) : TrackService(id) {
@ -129,7 +130,7 @@ class MyAnimeList(private val context: Context, id: Int) : TrackService(id) {
saveCredentials(username, oauth.access_token)
true
} catch (e: Exception) {
Timber.e(e)
Logger.e(e)
logout()
false
}

View file

@ -2,6 +2,7 @@ package eu.kanade.tachiyomi.data.track.myanimelist
import android.net.Uri
import androidx.core.net.toUri
import co.touchlab.kermit.Logger
import eu.kanade.tachiyomi.data.database.models.Track
import eu.kanade.tachiyomi.data.track.TrackManager
import eu.kanade.tachiyomi.data.track.model.TrackSearch
@ -10,6 +11,7 @@ import eu.kanade.tachiyomi.network.POST
import eu.kanade.tachiyomi.network.awaitSuccess
import eu.kanade.tachiyomi.network.parseAs
import eu.kanade.tachiyomi.util.PkceUtil
import eu.kanade.tachiyomi.util.system.w
import eu.kanade.tachiyomi.util.system.withIOContext
import kotlinx.coroutines.async
import kotlinx.coroutines.awaitAll
@ -28,10 +30,9 @@ import okhttp3.Headers
import okhttp3.OkHttpClient
import okhttp3.Request
import okhttp3.RequestBody
import timber.log.Timber
import uy.kohesive.injekt.injectLazy
import java.text.SimpleDateFormat
import java.util.Locale
import java.util.*
class MyAnimeListApi(private val client: OkHttpClient, interceptor: MyAnimeListInterceptor) {
@ -270,7 +271,7 @@ class MyAnimeListApi(private val client: OkHttpClient, interceptor: MyAnimeListI
authClient.newCall(request).awaitSuccess()
true
} catch (e: Exception) {
Timber.w(e)
Logger.w(e)
false
}
}

View file

@ -3,14 +3,14 @@ package eu.kanade.tachiyomi.data.track.shikimori
import android.content.Context
import android.graphics.Color
import androidx.annotation.StringRes
import co.touchlab.kermit.Logger
import eu.kanade.tachiyomi.R
import eu.kanade.tachiyomi.data.database.models.Track
import eu.kanade.tachiyomi.data.track.TrackService
import eu.kanade.tachiyomi.data.track.updateNewTrackInfo
import kotlinx.serialization.decodeFromString
import eu.kanade.tachiyomi.util.system.e
import kotlinx.serialization.encodeToString
import kotlinx.serialization.json.Json
import timber.log.Timber
import uy.kohesive.injekt.injectLazy
class Shikimori(private val context: Context, id: Int) : TrackService(id) {
@ -122,7 +122,7 @@ class Shikimori(private val context: Context, id: Int) : TrackService(id) {
saveCredentials(user.toString(), oauth.access_token)
true
} catch (e: java.lang.Exception) {
Timber.e(e)
Logger.e(e)
logout()
false
}

View file

@ -2,6 +2,7 @@ package eu.kanade.tachiyomi.data.track.shikimori
import android.net.Uri
import androidx.core.net.toUri
import co.touchlab.kermit.Logger
import eu.kanade.tachiyomi.data.database.models.Track
import eu.kanade.tachiyomi.data.track.TrackManager
import eu.kanade.tachiyomi.data.track.model.TrackSearch
@ -11,6 +12,7 @@ import eu.kanade.tachiyomi.network.POST
import eu.kanade.tachiyomi.network.awaitSuccess
import eu.kanade.tachiyomi.network.jsonMime
import eu.kanade.tachiyomi.network.parseAs
import eu.kanade.tachiyomi.util.system.w
import eu.kanade.tachiyomi.util.system.withIOContext
import kotlinx.serialization.json.Json
import kotlinx.serialization.json.JsonArray
@ -27,7 +29,6 @@ import kotlinx.serialization.json.putJsonObject
import okhttp3.FormBody
import okhttp3.OkHttpClient
import okhttp3.RequestBody.Companion.toRequestBody
import timber.log.Timber
import uy.kohesive.injekt.injectLazy
class ShikimoriApi(private val client: OkHttpClient, interceptor: ShikimoriInterceptor) {
@ -89,7 +90,7 @@ class ShikimoriApi(private val client: OkHttpClient, interceptor: ShikimoriInter
authClient.newCall(DELETE(url)).awaitSuccess()
true
} catch (e: Exception) {
Timber.w(e)
Logger.w(e)
false
}
}

View file

@ -19,6 +19,7 @@ import androidx.work.OneTimeWorkRequestBuilder
import androidx.work.OutOfQuotaPolicy
import androidx.work.WorkManager
import androidx.work.WorkerParameters
import co.touchlab.kermit.Logger
import eu.kanade.tachiyomi.BuildConfig
import eu.kanade.tachiyomi.data.notification.Notifications
import eu.kanade.tachiyomi.data.preference.PreferencesHelper
@ -30,6 +31,7 @@ import eu.kanade.tachiyomi.network.newCachelessCallWithProgress
import eu.kanade.tachiyomi.util.storage.getUriCompat
import eu.kanade.tachiyomi.util.storage.saveTo
import eu.kanade.tachiyomi.util.system.connectivityManager
import eu.kanade.tachiyomi.util.system.e
import eu.kanade.tachiyomi.util.system.jobIsRunning
import eu.kanade.tachiyomi.util.system.launchUI
import eu.kanade.tachiyomi.util.system.localeContext
@ -48,7 +50,6 @@ import kotlinx.coroutines.withContext
import okhttp3.Call
import okhttp3.internal.http2.ErrorCode
import okhttp3.internal.http2.StreamResetException
import timber.log.Timber
import uy.kohesive.injekt.Injekt
import uy.kohesive.injekt.api.get
import uy.kohesive.injekt.injectLazy
@ -166,7 +167,7 @@ class AppDownloadInstallJob(private val context: Context, workerParams: WorkerPa
notifier.onDownloadFinished(apkFile.getUriCompat(context))
}
} catch (error: Exception) {
Timber.e(error)
Logger.e(error)
if (error is CancellationException || isStopped ||
(error is StreamResetException && error.errorCode == ErrorCode.CANCEL)
) {

View file

@ -9,10 +9,11 @@ import androidx.work.NetworkType
import androidx.work.PeriodicWorkRequestBuilder
import androidx.work.WorkManager
import androidx.work.WorkerParameters
import co.touchlab.kermit.Logger
import eu.kanade.tachiyomi.data.notification.Notifications
import eu.kanade.tachiyomi.util.system.e
import eu.kanade.tachiyomi.util.system.notificationManager
import kotlinx.coroutines.coroutineScope
import timber.log.Timber
import java.util.concurrent.TimeUnit
class AppUpdateJob(private val context: Context, workerParams: WorkerParameters) :
@ -23,7 +24,7 @@ class AppUpdateJob(private val context: Context, workerParams: WorkerParameters)
AppUpdateChecker().checkForUpdate(context)
Result.success()
} catch (e: Exception) {
Timber.e(e)
Logger.e(e)
Result.failure()
}
}

View file

@ -13,6 +13,7 @@ import androidx.work.WorkInfo
import androidx.work.WorkManager
import androidx.work.WorkerParameters
import androidx.work.workDataOf
import co.touchlab.kermit.Logger
import eu.kanade.tachiyomi.R
import eu.kanade.tachiyomi.data.notification.Notifications
import eu.kanade.tachiyomi.data.preference.PreferencesHelper
@ -35,10 +36,8 @@ import kotlinx.coroutines.launch
import kotlinx.coroutines.sync.Semaphore
import kotlinx.coroutines.sync.withPermit
import kotlinx.coroutines.withContext
import kotlinx.serialization.decodeFromString
import kotlinx.serialization.encodeToString
import kotlinx.serialization.json.Json
import timber.log.Timber
import uy.kohesive.injekt.Injekt
import uy.kohesive.injekt.api.get
import java.lang.ref.WeakReference
@ -88,7 +87,7 @@ class ExtensionInstallerJob(val context: Context, workerParams: WorkerParameters
val infos = try {
Json.decodeFromString<Array<ExtensionManager.ExtensionInfo>>(json)
} catch (e: Exception) {
Timber.e(e, "Cannot decode string")
Logger.e(e) { "Cannot decode string" }
null
} ?: return Result.failure()
val list = infos.filter {

View file

@ -4,6 +4,7 @@ import android.content.Context
import android.graphics.drawable.Drawable
import android.os.Build
import android.os.Parcelable
import co.touchlab.kermit.Logger
import dev.yokai.domain.base.BasePreferences
import dev.yokai.domain.extension.interactor.TrustExtension
import eu.kanade.tachiyomi.data.preference.PreferencesHelper
@ -16,6 +17,7 @@ import eu.kanade.tachiyomi.extension.util.ExtensionInstaller
import eu.kanade.tachiyomi.extension.util.ExtensionLoader
import eu.kanade.tachiyomi.source.Source
import eu.kanade.tachiyomi.ui.extension.ExtensionIntallInfo
import eu.kanade.tachiyomi.util.system.e
import eu.kanade.tachiyomi.util.system.launchNow
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.async
@ -23,10 +25,9 @@ import kotlinx.coroutines.flow.Flow
import kotlinx.coroutines.flow.MutableStateFlow
import kotlinx.coroutines.flow.asStateFlow
import kotlinx.parcelize.Parcelize
import timber.log.Timber
import uy.kohesive.injekt.Injekt
import uy.kohesive.injekt.api.get
import java.util.Locale
import java.util.*
/**
* The manager of extensions installed as another apk which extend the available sources. It handles
@ -133,7 +134,7 @@ class ExtensionManager(
val extensions: List<Extension.Available> = try {
api.findExtensions()
} catch (e: Exception) {
Timber.e(e)
Logger.e(e)
emptyList()
}

View file

@ -7,6 +7,7 @@ import android.content.pm.PackageManager
import android.net.Uri
import android.os.Build
import androidx.localbroadcastmanager.content.LocalBroadcastManager
import co.touchlab.kermit.Logger
import eu.kanade.tachiyomi.R
import eu.kanade.tachiyomi.extension.util.ExtensionInstaller.Companion.EXTRA_DOWNLOAD_ID
import eu.kanade.tachiyomi.util.system.getUriSize
@ -18,11 +19,10 @@ import kotlinx.coroutines.cancel
import kotlinx.coroutines.launch
import rikka.shizuku.Shizuku
import rikka.sui.Sui
import timber.log.Timber
import uy.kohesive.injekt.injectLazy
import java.io.BufferedReader
import java.io.InputStream
import java.util.Collections
import java.util.*
import java.util.concurrent.atomic.AtomicReference
class ShizukuInstaller(private val context: Context, val finishedQueue: (ShizukuInstaller) -> Unit) {
@ -43,7 +43,7 @@ class ShizukuInstaller(private val context: Context, val finishedQueue: (Shizuku
private val queue = Collections.synchronizedList(mutableListOf<Entry>())
private val shizukuDeadListener = Shizuku.OnBinderDeadListener {
Timber.d("Shizuku was killed prematurely")
Logger.d { "Shizuku was killed prematurely" }
finishedQueue(this)
}
@ -110,7 +110,7 @@ class ShizukuInstaller(private val context: Context, val finishedQueue: (Shizuku
continueQueue(true)
}
} catch (e: Exception) {
Timber.e(e, "Failed to install extension ${entry.downloadId} ${entry.uri}")
Logger.e(e) { "Failed to install extension ${entry.downloadId} ${entry.uri}" }
if (sessionId != null) {
exec("pm install-abandon $sessionId")
}

View file

@ -1,6 +1,7 @@
package eu.kanade.tachiyomi.extension.api
import android.content.Context
import co.touchlab.kermit.Logger
import dev.yokai.domain.extension.repo.interactor.GetExtensionRepo
import dev.yokai.domain.extension.repo.interactor.UpdateExtensionRepo
import dev.yokai.domain.extension.repo.model.ExtensionRepo
@ -17,7 +18,6 @@ import kotlinx.coroutines.async
import kotlinx.coroutines.awaitAll
import kotlinx.serialization.Serializable
import kotlinx.serialization.json.Json
import timber.log.Timber
import uy.kohesive.injekt.Injekt
import uy.kohesive.injekt.api.get
import uy.kohesive.injekt.injectLazy
@ -53,7 +53,7 @@ internal class ExtensionApi {
.toExtensions(repoBaseUrl)
}
} catch (e: Throwable) {
Timber.e(e, "Failed to get extensions from $repoBaseUrl")
Logger.e(e) { "Failed to get extensions from $repoBaseUrl" }
emptyList()
}
}

View file

@ -11,6 +11,7 @@ import android.os.Build
import android.os.Environment
import androidx.core.content.ContextCompat
import androidx.core.net.toUri
import co.touchlab.kermit.Logger
import dev.yokai.domain.base.BasePreferences
import eu.kanade.tachiyomi.extension.ExtensionInstallerJob
import eu.kanade.tachiyomi.extension.ExtensionManager
@ -42,7 +43,6 @@ import kotlinx.coroutines.flow.onCompletion
import kotlinx.coroutines.flow.takeWhile
import kotlinx.coroutines.flow.transformWhile
import kotlinx.coroutines.launch
import timber.log.Timber
import uy.kohesive.injekt.Injekt
import uy.kohesive.injekt.api.get
import uy.kohesive.injekt.injectLazy
@ -156,7 +156,7 @@ internal class ExtensionInstaller(private val context: Context) {
}
.flowOn(Dispatchers.IO)
.catch { e ->
Timber.e(e)
Logger.e(e)
emit(InstallStep.Error to null)
}
.onCompletion {
@ -246,7 +246,7 @@ internal class ExtensionInstaller(private val context: Context) {
}
}
.catch {
Timber.e(it)
Logger.e(it)
}
.onCompletion {
deleteDownload(pkgName)
@ -319,7 +319,7 @@ internal class ExtensionInstaller(private val context: Context) {
setInstallationResult(pkgName, false)
}
} catch (e: Exception) {
Timber.e(e, "Failed to read downloaded extension file.")
Logger.e(e) { "Failed to read downloaded extension file." }
setInstallationResult(pkgName, false)
}
@ -454,7 +454,7 @@ internal class ExtensionInstaller(private val context: Context) {
if (uri != null && pkgName != null) {
emitToFlow(pkgName, ExtensionIntallInfo(InstallStep.Loading, null))
} else if (pkgName != null) {
Timber.e("Couldn't locate downloaded APK")
Logger.e { "Couldn't locate downloaded APK" }
emitToFlow(pkgName, ExtensionIntallInfo(InstallStep.Error, null))
return
}

View file

@ -7,6 +7,7 @@ import android.content.pm.PackageInfo
import android.content.pm.PackageManager
import android.os.Build
import androidx.core.content.pm.PackageInfoCompat
import co.touchlab.kermit.Logger
import dalvik.system.PathClassLoader
import dev.yokai.domain.extension.interactor.TrustExtension
import eu.kanade.tachiyomi.BuildConfig
@ -21,7 +22,6 @@ import eu.kanade.tachiyomi.util.system.withIOContext
import kotlinx.coroutines.async
import kotlinx.coroutines.awaitAll
import kotlinx.coroutines.runBlocking
import timber.log.Timber
import uy.kohesive.injekt.injectLazy
import java.io.File
import java.nio.file.Files
@ -67,18 +67,18 @@ internal object ExtensionLoader {
if (PackageInfoCompat.getLongVersionCode(extension) <
PackageInfoCompat.getLongVersionCode(currentExtension)
) {
Timber.e("Installed extension version is higher. Downgrading is not allowed.")
Logger.e { "Installed extension version is higher. Downgrading is not allowed." }
return false
}
val extensionSignatures = getSignatures(extension)
if (extensionSignatures.isNullOrEmpty()) {
Timber.e("Extension to be installed is not signed.")
Logger.e { "Extension to be installed is not signed." }
return false
}
if (!extensionSignatures.containsAll(getSignatures(currentExtension)!!)) {
Timber.e("Installed extension signature is not matched.")
Logger.e { "Installed extension signature is not matched." }
return false
}
}
@ -93,7 +93,7 @@ internal object ExtensionLoader {
}
true
} catch (e: Exception) {
Timber.e("Failed to copy extension file.")
Logger.e { "Failed to copy extension file." }
target.delete()
false
}
@ -177,7 +177,7 @@ internal object ExtensionLoader {
suspend fun loadExtensionFromPkgName(context: Context, pkgName: String): LoadResult {
val extensionPackage = getExtensionInfoFromPkgName(context, pkgName)
if (extensionPackage == null) {
Timber.e("Extension package is not found ($pkgName)")
Logger.e { "Extension package is not found ($pkgName)" }
return LoadResult.Error
}
return loadExtension(context, extensionPackage)
@ -285,22 +285,22 @@ internal object ExtensionLoader {
val versionCode = PackageInfoCompat.getLongVersionCode(pkgInfo)
if (versionName.isNullOrEmpty()) {
Timber.w("Missing versionName for extension $extName")
Logger.w { "Missing versionName for extension $extName" }
return LoadResult.Error
}
// Validate lib version
val libVersion = versionName.substringBeforeLast('.').toDoubleOrNull()
if (libVersion == null || libVersion < LIB_VERSION_MIN || libVersion > LIB_VERSION_MAX) {
Timber.w(
"Lib version is $libVersion, while only versions $LIB_VERSION_MIN to $LIB_VERSION_MAX are allowed",
)
Logger.w {
"Lib version is $libVersion, while only versions $LIB_VERSION_MIN to $LIB_VERSION_MAX are allowed"
}
return LoadResult.Error
}
val signatures = getSignatures(pkgInfo)
if (signatures.isNullOrEmpty()) {
Timber.w("Package $pkgName isn't signed")
Logger.w { "Package $pkgName isn't signed" }
return LoadResult.Error
} else if (!trustExtension.isTrusted(pkgInfo, signatures)) {
val extension = Extension.Untrusted(
@ -311,13 +311,13 @@ internal object ExtensionLoader {
libVersion,
signatures.last(),
)
Timber.w("Extension $pkgName isn't trusted")
Logger.w { "Extension $pkgName isn't trusted" }
return LoadResult.Untrusted(extension)
}
val isNsfw = appInfo.metaData.getInt(METADATA_NSFW) == 1
if (!loadNsfwSource && isNsfw) {
Timber.w("NSFW extension $pkgName not allowed")
Logger.w { "NSFW extension $pkgName not allowed" }
return LoadResult.Error
}
@ -344,7 +344,7 @@ internal object ExtensionLoader {
else -> throw Exception("Unknown source class type! ${obj.javaClass}")
}
} catch (e: Throwable) {
Timber.e(e, "Extension load error: $extName.")
Logger.e(e) { "Extension load error: $extName." }
return LoadResult.Error
}
}

View file

@ -2,6 +2,7 @@ package eu.kanade.tachiyomi.source
import android.content.Context
import androidx.core.net.toFile
import co.touchlab.kermit.Logger
import com.github.junrar.Archive
import com.hippo.unifile.UniFile
import dev.yokai.core.metadata.COMIC_INFO_FILE
@ -19,6 +20,7 @@ import eu.kanade.tachiyomi.util.chapter.ChapterRecognition
import eu.kanade.tachiyomi.util.lang.compareToCaseInsensitiveNaturalOrder
import eu.kanade.tachiyomi.util.storage.EpubFile
import eu.kanade.tachiyomi.util.system.ImageUtil
import eu.kanade.tachiyomi.util.system.e
import eu.kanade.tachiyomi.util.system.extension
import eu.kanade.tachiyomi.util.system.nameWithoutExtension
import eu.kanade.tachiyomi.util.system.openReadOnlyChannel
@ -32,7 +34,6 @@ import kotlinx.serialization.json.Json
import kotlinx.serialization.json.decodeFromStream
import nl.adaptivity.xmlutil.AndroidXmlReader
import nl.adaptivity.xmlutil.serialization.XML
import timber.log.Timber
import uy.kohesive.injekt.Injekt
import uy.kohesive.injekt.api.get
import uy.kohesive.injekt.injectLazy
@ -194,7 +195,7 @@ class LocalSource(private val context: Context) : CatalogueSource, UnmeteredSour
val dest = updateCover(chapter, manga)
thumbnail_url = dest?.filePath
} catch (e: Exception) {
Timber.e(e)
Logger.e(e)
}
}
}
@ -226,7 +227,7 @@ class LocalSource(private val context: Context) : CatalogueSource, UnmeteredSour
return@withIOContext rt
}
} catch (e: Exception) {
Timber.e(e)
Logger.e(e)
}
return@withIOContext manga
@ -382,7 +383,7 @@ class LocalSource(private val context: Context) : CatalogueSource, UnmeteredSour
}
}
} catch (e: Throwable) {
Timber.e(e, "Error updating cover for ${manga.title}")
Logger.e(e) { "Error updating cover for ${manga.title}" }
null
}
}
@ -420,7 +421,7 @@ class LocalSource(private val context: Context) : CatalogueSource, UnmeteredSour
}
}
} catch (e: Throwable) {
Timber.e(e, "Error updating a metadata")
Logger.e(e) { "Error updating a metadata" }
false
}
}

View file

@ -1,7 +1,6 @@
package eu.kanade.tachiyomi.ui.base.controller
import android.app.Activity
import android.graphics.drawable.Drawable
import android.os.Bundle
import android.view.Menu
import android.view.MenuItem
@ -10,11 +9,11 @@ import androidx.appcompat.app.AppCompatActivity
import androidx.core.view.forEach
import androidx.core.view.isVisible
import androidx.recyclerview.widget.RecyclerView
import co.touchlab.kermit.Logger
import com.bluelinelabs.conductor.Controller
import com.bluelinelabs.conductor.ControllerChangeHandler
import com.bluelinelabs.conductor.ControllerChangeType
import eu.kanade.tachiyomi.R
import eu.kanade.tachiyomi.ui.main.MainActivity
import eu.kanade.tachiyomi.util.view.BackHandlerControllerInterface
import eu.kanade.tachiyomi.util.view.activityBinding
import eu.kanade.tachiyomi.util.view.isControllerVisible
@ -22,7 +21,6 @@ import eu.kanade.tachiyomi.util.view.removeQueryListener
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.MainScope
import kotlinx.coroutines.cancel
import timber.log.Timber
abstract class BaseController(bundle: Bundle? = null) :
Controller(bundle), BackHandlerControllerInterface, BaseControllerPreferenceControllerCommonInterface {
@ -39,20 +37,20 @@ abstract class BaseController(bundle: Bundle? = null) :
override fun preCreateView(controller: Controller) {
viewScope = MainScope()
Timber.d("Create view for ${controller.instance()}")
Logger.d { "Create view for ${controller.instance()}" }
}
override fun preAttach(controller: Controller, view: View) {
Timber.d("Attach view for ${controller.instance()}")
Logger.d { "Attach view for ${controller.instance()}" }
}
override fun preDetach(controller: Controller, view: View) {
Timber.d("Detach view for ${controller.instance()}")
Logger.d { "Detach view for ${controller.instance()}" }
}
override fun preDestroyView(controller: Controller, view: View) {
viewScope.cancel()
Timber.d("Destroy view for ${controller.instance()}")
Logger.d { "Destroy view for ${controller.instance()}" }
}
},
)

View file

@ -2,6 +2,8 @@ package eu.kanade.tachiyomi.ui.crash
import android.content.Context
import android.content.Intent
import co.touchlab.kermit.Logger
import eu.kanade.tachiyomi.util.system.e
import kotlinx.serialization.KSerializer
import kotlinx.serialization.descriptors.PrimitiveKind
import kotlinx.serialization.descriptors.PrimitiveSerialDescriptor
@ -9,7 +11,6 @@ import kotlinx.serialization.descriptors.SerialDescriptor
import kotlinx.serialization.encoding.Decoder
import kotlinx.serialization.encoding.Encoder
import kotlinx.serialization.json.Json
import timber.log.Timber
import kotlin.system.exitProcess
class GlobalExceptionHandler private constructor(
@ -31,7 +32,7 @@ class GlobalExceptionHandler private constructor(
override fun uncaughtException(thread: Thread, exception: Throwable) {
try {
Timber.e(exception)
Logger.e(exception)
launchActivity(applicationContext, activityToBeLaunched, exception)
exitProcess(0)
} catch (_: Exception) {
@ -71,7 +72,7 @@ class GlobalExceptionHandler private constructor(
return try {
Json.decodeFromString(ThrowableSerializer, intent.getStringExtra(INTENT_EXTRA)!!)
} catch (e: Exception) {
Timber.e(e, "Wasn't able to retrieve throwable from intent")
Logger.e(e) { "Wasn't able to retrieve throwable from intent" }
null
}
}

View file

@ -20,12 +20,13 @@ import androidx.preference.PreferenceManager
import androidx.preference.PreferenceScreen
import androidx.preference.SwitchPreferenceCompat
import androidx.recyclerview.widget.ConcatAdapter
import co.touchlab.kermit.Logger
import com.google.android.material.snackbar.Snackbar
import eu.kanade.tachiyomi.R
import eu.kanade.tachiyomi.data.preference.PreferencesHelper
import eu.kanade.tachiyomi.data.preference.SharedPreferencesDataStore
import eu.kanade.tachiyomi.core.preference.minusAssign
import eu.kanade.tachiyomi.core.preference.plusAssign
import eu.kanade.tachiyomi.data.preference.PreferencesHelper
import eu.kanade.tachiyomi.data.preference.SharedPreferencesDataStore
import eu.kanade.tachiyomi.databinding.ExtensionDetailControllerBinding
import eu.kanade.tachiyomi.extension.model.Extension
import eu.kanade.tachiyomi.network.NetworkHelper
@ -51,7 +52,6 @@ import eu.kanade.tachiyomi.widget.preference.MultiListMatPreference
import kotlinx.coroutines.flow.launchIn
import kotlinx.coroutines.flow.onEach
import okhttp3.HttpUrl.Companion.toHttpUrl
import timber.log.Timber
import uy.kohesive.injekt.Injekt
import uy.kohesive.injekt.api.get
import uy.kohesive.injekt.injectLazy
@ -191,7 +191,7 @@ class ExtensionDetailsController(bundle: Bundle? = null) :
network.cookieJar.remove(it.toHttpUrl())
}
Timber.d("Cleared $cleared cookies for: ${urls.joinToString()}")
Logger.d { "Cleared $cleared cookies for: ${urls.joinToString()}" }
val context = view?.context ?: return
binding.coordinator.snack(context.getString(R.string.cookies_cleared))
}

View file

@ -58,6 +58,7 @@ import androidx.lifecycle.repeatOnLifecycle
import androidx.window.layout.DisplayFeature
import androidx.window.layout.FoldingFeature
import androidx.window.layout.WindowInfoTracker
import co.touchlab.kermit.Logger
import com.bluelinelabs.conductor.Conductor
import com.bluelinelabs.conductor.Controller
import com.bluelinelabs.conductor.ControllerChangeHandler
@ -113,6 +114,7 @@ import eu.kanade.tachiyomi.util.manga.MangaCoverMetadata
import eu.kanade.tachiyomi.util.manga.MangaShortcutManager
import eu.kanade.tachiyomi.util.system.contextCompatDrawable
import eu.kanade.tachiyomi.util.system.dpToPx
import eu.kanade.tachiyomi.util.system.e
import eu.kanade.tachiyomi.util.system.executeOnIO
import eu.kanade.tachiyomi.util.system.getResourceColor
import eu.kanade.tachiyomi.util.system.hasSideNavBar
@ -144,11 +146,10 @@ import kotlinx.coroutines.flow.launchIn
import kotlinx.coroutines.flow.onEach
import kotlinx.coroutines.launch
import kotlinx.coroutines.withContext
import timber.log.Timber
import uy.kohesive.injekt.Injekt
import uy.kohesive.injekt.api.get
import uy.kohesive.injekt.injectLazy
import java.util.Date
import java.util.*
import java.util.concurrent.TimeUnit
import kotlin.math.abs
import kotlin.math.min
@ -1009,7 +1010,7 @@ open class MainActivity : BaseActivity<MainActivityBinding>() {
}
}
} catch (error: Exception) {
Timber.e(error)
Logger.e(error)
}
}
}

View file

@ -42,6 +42,7 @@ import androidx.palette.graphics.Palette
import androidx.recyclerview.widget.ItemTouchHelper
import androidx.recyclerview.widget.LinearLayoutManager
import androidx.recyclerview.widget.RecyclerView
import co.touchlab.kermit.Logger
import coil3.imageLoader
import coil3.request.ImageRequest
import coil3.request.allowHardware
@ -53,13 +54,13 @@ import com.google.android.material.snackbar.Snackbar
import eu.davidea.flexibleadapter.FlexibleAdapter
import eu.davidea.flexibleadapter.SelectableAdapter
import eu.kanade.tachiyomi.R
import eu.kanade.tachiyomi.data.coil.getBestColor
import eu.kanade.tachiyomi.data.database.DatabaseHelper
import eu.kanade.tachiyomi.data.database.models.Category
import eu.kanade.tachiyomi.data.database.models.Chapter
import eu.kanade.tachiyomi.data.database.models.Manga
import eu.kanade.tachiyomi.data.download.DownloadJob
import eu.kanade.tachiyomi.data.download.model.Download
import eu.kanade.tachiyomi.data.coil.getBestColor
import eu.kanade.tachiyomi.data.notification.NotificationReceiver
import eu.kanade.tachiyomi.data.track.model.TrackSearch
import eu.kanade.tachiyomi.databinding.MangaDetailsControllerBinding
@ -100,6 +101,7 @@ import eu.kanade.tachiyomi.util.storage.getUriCompat
import eu.kanade.tachiyomi.util.system.addCheckBoxPrompt
import eu.kanade.tachiyomi.util.system.contextCompatColor
import eu.kanade.tachiyomi.util.system.dpToPx
import eu.kanade.tachiyomi.util.system.e
import eu.kanade.tachiyomi.util.system.getResourceColor
import eu.kanade.tachiyomi.util.system.ignoredSystemInsets
import eu.kanade.tachiyomi.util.system.isInNightMode
@ -129,12 +131,11 @@ import eu.kanade.tachiyomi.util.view.withFadeTransaction
import eu.kanade.tachiyomi.widget.LinearLayoutManagerAccurateOffset
import kotlinx.coroutines.runBlocking
import kotlinx.coroutines.withTimeoutOrNull
import timber.log.Timber
import uy.kohesive.injekt.Injekt
import uy.kohesive.injekt.api.get
import java.io.File
import java.io.IOException
import java.util.Locale
import java.util.*
import kotlin.math.max
import kotlin.math.roundToInt
@ -1720,7 +1721,7 @@ class MangaDetailsController :
}
fun trackRefreshError(error: Exception) {
Timber.e(error)
Logger.e(error)
trackingBottomSheet?.onRefreshError(error)
}
@ -1817,7 +1818,7 @@ class MangaDetailsController :
}
} catch (error: IOException) {
activity.toast(R.string.failed_to_update_cover)
Timber.e(error)
Logger.e(error)
}
}
}

View file

@ -26,6 +26,7 @@ import androidx.core.view.updateLayoutParams
import androidx.recyclerview.widget.LinearLayoutManager
import androidx.recyclerview.widget.RecyclerView
import androidx.transition.TransitionManager
import co.touchlab.kermit.Logger
import com.google.android.material.datepicker.MaterialDatePicker
import com.mikepenz.fastadapter.FastAdapter
import com.mikepenz.fastadapter.adapters.ItemAdapter
@ -42,6 +43,7 @@ import eu.kanade.tachiyomi.ui.manga.MangaDetailsDivider
import eu.kanade.tachiyomi.util.lang.indexesOf
import eu.kanade.tachiyomi.util.system.addCheckBoxPrompt
import eu.kanade.tachiyomi.util.system.dpToPx
import eu.kanade.tachiyomi.util.system.e
import eu.kanade.tachiyomi.util.system.isOnline
import eu.kanade.tachiyomi.util.system.isPromptChecked
import eu.kanade.tachiyomi.util.system.launchIO
@ -56,9 +58,8 @@ import eu.kanade.tachiyomi.util.view.RecyclerWindowInsetsListener
import eu.kanade.tachiyomi.util.view.checkHeightThen
import eu.kanade.tachiyomi.util.view.expand
import eu.kanade.tachiyomi.widget.E2EBottomSheetDialog
import timber.log.Timber
import java.text.DateFormat
import java.util.Calendar
import java.util.*
class TrackingBottomSheet(private val controller: MangaDetailsController) :
E2EBottomSheetDialog<TrackingBottomSheetBinding>(controller.activity!!),
@ -324,7 +325,7 @@ class TrackingBottomSheet(private val controller: MangaDetailsController) :
}
fun onSearchResultsError(error: Throwable) {
Timber.e(error)
Logger.e(error)
startTransition()
setMiddleTrackView(binding.searchEmptyView.id)
binding.searchProgress.isVisible = false

View file

@ -17,6 +17,7 @@ import androidx.core.graphics.ColorUtils
import androidx.core.view.isVisible
import androidx.recyclerview.widget.LinearLayoutManager
import androidx.vectordrawable.graphics.drawable.VectorDrawableCompat
import co.touchlab.kermit.Logger
import eu.kanade.tachiyomi.R
import eu.kanade.tachiyomi.data.database.DatabaseHelper
import eu.kanade.tachiyomi.data.database.models.Manga
@ -36,6 +37,7 @@ import eu.kanade.tachiyomi.ui.migration.SearchController
import eu.kanade.tachiyomi.ui.migration.manga.design.PreMigrationController
import eu.kanade.tachiyomi.util.chapter.syncChaptersWithSource
import eu.kanade.tachiyomi.util.lang.toNormalized
import eu.kanade.tachiyomi.util.system.e
import eu.kanade.tachiyomi.util.system.executeOnIO
import eu.kanade.tachiyomi.util.system.getParcelableCompat
import eu.kanade.tachiyomi.util.system.getResourceColor
@ -58,7 +60,6 @@ import kotlinx.coroutines.launch
import kotlinx.coroutines.sync.Semaphore
import kotlinx.coroutines.sync.withPermit
import kotlinx.coroutines.withContext
import timber.log.Timber
import uy.kohesive.injekt.injectLazy
import java.util.concurrent.atomic.AtomicInteger
import kotlin.coroutines.CoroutineContext
@ -227,7 +228,7 @@ class MigrationListController(bundle: Bundle? = null) :
val chapters: List<SChapter> = try {
source.getChapterList(localManga)
} catch (e: java.lang.Exception) {
Timber.e(e)
Logger.e(e)
emptyList()
}
withContext(Dispatchers.IO) {

View file

@ -12,6 +12,7 @@ import android.widget.TextView
import androidx.core.content.getSystemService
import androidx.core.net.toUri
import androidx.preference.PreferenceScreen
import co.touchlab.kermit.Logger
import com.google.android.gms.oss.licenses.OssLicensesMenuActivity
import eu.kanade.tachiyomi.BuildConfig
import eu.kanade.tachiyomi.R
@ -38,12 +39,10 @@ import io.noties.markwon.Markwon
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.launch
import kotlinx.coroutines.withContext
import timber.log.Timber
import java.text.DateFormat
import java.text.ParseException
import java.text.SimpleDateFormat
import java.util.Locale
import java.util.TimeZone
import java.util.*
class AboutController : SettingsLegacyController() {
@ -142,7 +141,7 @@ class AboutController : SettingsLegacyController() {
} catch (error: Exception) {
withContext(Dispatchers.Main) {
activity.toast(error.message)
Timber.e(error)
Logger.e(error) { "Couldn't check new update" }
}
}
when (result) {

View file

@ -4,6 +4,7 @@ import android.view.LayoutInflater
import android.view.View
import androidx.core.content.ContextCompat
import androidx.core.view.isVisible
import co.touchlab.kermit.Logger
import com.github.mikephil.charting.components.XAxis
import com.github.mikephil.charting.data.BarData
import com.github.mikephil.charting.data.BarDataSet
@ -27,7 +28,6 @@ import eu.kanade.tachiyomi.util.system.roundToTwoDecimal
import eu.kanade.tachiyomi.util.view.compatToolTipText
import eu.kanade.tachiyomi.util.view.scrollViewWith
import eu.kanade.tachiyomi.util.view.withFadeTransaction
import timber.log.Timber
import kotlin.math.roundToInt
class StatsController : BaseLegacyController<StatsControllerBinding>() {
@ -130,7 +130,7 @@ class StatsController : BaseLegacyController<StatsControllerBinding>() {
invalidate()
}
} catch (e: Exception) {
Timber.e(e)
Logger.e(e) { "Failed to show chart" }
}
}
@ -179,7 +179,7 @@ class StatsController : BaseLegacyController<StatsControllerBinding>() {
}
}
} catch (e: Exception) {
Timber.e(e)
Logger.e(e) { "Failed to show chart" }
}
}

View file

@ -6,6 +6,7 @@ import android.widget.LinearLayout
import android.widget.TextView
import androidx.core.content.ContextCompat
import androidx.core.view.isVisible
import co.touchlab.kermit.Logger
import com.github.mikephil.charting.charts.BarChart
import com.github.mikephil.charting.components.MarkerView
import com.github.mikephil.charting.components.XAxis
@ -30,8 +31,7 @@ import eu.kanade.tachiyomi.ui.more.stats.details.StatsDetailsPresenter.Stats
import eu.kanade.tachiyomi.ui.more.stats.details.StatsDetailsPresenter.StatsSort
import eu.kanade.tachiyomi.util.system.getResourceColor
import eu.kanade.tachiyomi.util.system.isLandscape
import timber.log.Timber
import java.util.Calendar
import java.util.*
import java.util.concurrent.TimeUnit
import kotlin.math.ceil
@ -231,7 +231,7 @@ class StatsDetailsChartLayout @JvmOverloads constructor(
invalidate()
}
} catch (e: Exception) {
Timber.e(e)
Logger.e(e) { "Failed setup pie chart" }
}
}
}
@ -325,7 +325,7 @@ class StatsDetailsChartLayout @JvmOverloads constructor(
listener?.getHighlight()?.let { highlightValue(it) }
}
} catch (e: Exception) {
Timber.e(e)
Logger.e(e) { "Failed setup bar chart" }
}
}
}
@ -392,7 +392,7 @@ class StatsDetailsChartLayout @JvmOverloads constructor(
invalidate()
}
} catch (e: Exception) {
Timber.e(e)
Logger.e(e) { "Failed setup line chart" }
}
}
}

View file

@ -66,6 +66,7 @@ import androidx.vectordrawable.graphics.drawable.AnimatedVectorDrawableCompat
import androidx.window.layout.DisplayFeature
import androidx.window.layout.FoldingFeature
import androidx.window.layout.WindowInfoTracker
import co.touchlab.kermit.Logger
import com.davemorrissey.labs.subscaleview.SubsamplingScaleImageView
import com.google.android.material.bottomsheet.BottomSheetBehavior
import com.google.android.material.bottomsheet.BottomSheetDialog
@ -79,10 +80,10 @@ import dev.yokai.domain.ui.settings.ReaderPreferences
import dev.yokai.domain.ui.settings.ReaderPreferences.LandscapeCutoutBehaviour
import eu.kanade.tachiyomi.BuildConfig
import eu.kanade.tachiyomi.R
import eu.kanade.tachiyomi.data.database.models.Chapter
import eu.kanade.tachiyomi.data.database.models.Manga
import eu.kanade.tachiyomi.core.preference.toggle
import eu.kanade.tachiyomi.data.coil.TachiyomiImageDecoder
import eu.kanade.tachiyomi.data.database.models.Chapter
import eu.kanade.tachiyomi.data.database.models.Manga
import eu.kanade.tachiyomi.data.preference.changesIn
import eu.kanade.tachiyomi.data.track.TrackService
import eu.kanade.tachiyomi.databinding.ReaderActivityBinding
@ -118,6 +119,7 @@ import eu.kanade.tachiyomi.util.system.ThemeUtil
import eu.kanade.tachiyomi.util.system.contextCompatColor
import eu.kanade.tachiyomi.util.system.contextCompatDrawable
import eu.kanade.tachiyomi.util.system.dpToPx
import eu.kanade.tachiyomi.util.system.e
import eu.kanade.tachiyomi.util.system.getBottomGestureInsets
import eu.kanade.tachiyomi.util.system.getResourceColor
import eu.kanade.tachiyomi.util.system.hasSideNavBar
@ -158,14 +160,11 @@ import kotlinx.coroutines.flow.onEach
import kotlinx.coroutines.flow.sample
import kotlinx.coroutines.launch
import kotlinx.coroutines.withContext
import timber.log.Timber
import uy.kohesive.injekt.injectLazy
import java.io.ByteArrayOutputStream
import java.io.File
import java.text.DecimalFormat
import java.text.DecimalFormatSymbols
import java.util.Collections
import java.util.Locale
import java.util.*
import kotlin.math.abs
import kotlin.math.max
import kotlin.math.roundToInt
@ -1434,7 +1433,7 @@ class ReaderActivity : BaseActivity<ReaderActivityBinding>() {
* this case the activity is closed and a toast is shown to the user.
*/
private fun setInitialChapterError(error: Throwable) {
Timber.e(error)
Logger.e(error)
finish()
toast(error.message)
}
@ -1725,7 +1724,7 @@ class ReaderActivity : BaseActivity<ReaderActivityBinding>() {
toast(R.string.picture_saved)
}
is ReaderViewModel.SaveImageResult.Error -> {
Timber.e(result.error)
Logger.e(result.error)
}
}
}

View file

@ -3,12 +3,11 @@ package eu.kanade.tachiyomi.ui.reader
import android.app.Application
import android.graphics.BitmapFactory
import android.net.Uri
import android.os.Environment
import androidx.annotation.ColorInt
import androidx.core.net.toFile
import androidx.lifecycle.SavedStateHandle
import androidx.lifecycle.ViewModel
import androidx.lifecycle.viewModelScope
import co.touchlab.kermit.Logger
import com.hippo.unifile.UniFile
import dev.yokai.domain.chapter.interactor.GetChapters
import dev.yokai.domain.download.DownloadPreferences
@ -49,6 +48,7 @@ import eu.kanade.tachiyomi.util.chapter.updateTrackChapterRead
import eu.kanade.tachiyomi.util.isLocal
import eu.kanade.tachiyomi.util.storage.DiskUtil
import eu.kanade.tachiyomi.util.system.ImageUtil
import eu.kanade.tachiyomi.util.system.e
import eu.kanade.tachiyomi.util.system.executeOnIO
import eu.kanade.tachiyomi.util.system.launchIO
import eu.kanade.tachiyomi.util.system.launchNonCancellable
@ -73,12 +73,10 @@ import kotlinx.coroutines.runBlocking
import kotlinx.coroutines.withContext
import rx.Completable
import rx.schedulers.Schedulers
import timber.log.Timber
import uy.kohesive.injekt.Injekt
import uy.kohesive.injekt.api.get
import uy.kohesive.injekt.injectLazy
import java.io.File
import java.util.Date
import java.util.*
import java.util.concurrent.CancellationException
/**
@ -364,7 +362,7 @@ class ReaderViewModel(
private suspend fun loadNewChapter(chapter: ReaderChapter) {
val loader = loader ?: return
Timber.d("Loading ${chapter.chapter.url}")
Logger.d { "Loading ${chapter.chapter.url}" }
withIOContext {
try {
@ -373,7 +371,7 @@ class ReaderViewModel(
if (e is CancellationException) {
throw e
}
Timber.e(e)
Logger.e(e)
}
}
}
@ -414,7 +412,7 @@ class ReaderViewModel(
suspend fun loadChapter(chapter: ReaderChapter): Int? {
val loader = loader ?: return -1
Timber.d("Loading adjacent ${chapter.chapter.url}")
Logger.d { "Loading adjacent ${chapter.chapter.url}" }
var lastPage: Int? = if (chapter.chapter.pages_left <= 1) 0 else chapter.chapter.last_page_read
mutableState.update { it.copy(isLoadingAdjacentChapter = true) }
try {
@ -425,7 +423,7 @@ class ReaderViewModel(
if (e is CancellationException) {
throw e
}
Timber.e(e)
Logger.e(e)
lastPage = null
} finally {
mutableState.update { it.copy(isLoadingAdjacentChapter = false) }
@ -455,7 +453,7 @@ class ReaderViewModel(
return
}
Timber.d("Preloading ${chapter.chapter.url}")
Logger.d { "Preloading ${chapter.chapter.url}" }
val loader = loader ?: return
withIOContext {
@ -504,7 +502,7 @@ class ReaderViewModel(
}
if (selectedChapter != currentChapters.currChapter) {
Timber.d("Setting ${selectedChapter.chapter.url} as active")
Logger.d { "Setting ${selectedChapter.chapter.url} as active" }
saveReadingProgress(currentChapters.currChapter)
setReadStartTime()
scope.launch { loadNewChapter(selectedChapter) }
@ -730,7 +728,7 @@ class ReaderViewModel(
this.manga?.orientationType = rotationType
db.updateViewerFlags(manga).executeAsBlocking()
Timber.i("Manga orientation is ${manga.orientationType}")
Logger.i { "Manga orientation is ${manga.orientationType}" }
viewModelScope.launchIO {
db.updateViewerFlags(manga).executeAsBlocking()

View file

@ -1,6 +1,7 @@
package eu.kanade.tachiyomi.ui.reader.loader
import android.content.Context
import co.touchlab.kermit.Logger
import com.github.junrar.exception.UnsupportedRarV5Exception
import eu.kanade.tachiyomi.R
import eu.kanade.tachiyomi.data.database.models.Manga
@ -12,7 +13,6 @@ import eu.kanade.tachiyomi.source.online.HttpSource
import eu.kanade.tachiyomi.ui.reader.model.ReaderChapter
import eu.kanade.tachiyomi.util.system.openReadOnlyChannel
import eu.kanade.tachiyomi.util.system.withIOContext
import timber.log.Timber
/**
* Loader used to retrieve the [PageLoader] for a given chapter.
@ -36,7 +36,7 @@ class ChapterLoader(
chapter.state = ReaderChapter.State.Loading
withIOContext {
Timber.d("Loading pages for ${chapter.chapter.name}")
Logger.d { "Loading pages for ${chapter.chapter.name}" }
try {
val loader = getPageLoader(chapter)
chapter.pageLoader = loader

View file

@ -1,9 +1,9 @@
package eu.kanade.tachiyomi.ui.reader.model
import co.touchlab.kermit.Logger
import eu.kanade.tachiyomi.data.database.models.Chapter
import eu.kanade.tachiyomi.ui.reader.loader.PageLoader
import kotlinx.coroutines.flow.MutableStateFlow
import timber.log.Timber
data class ReaderChapter(val chapter: Chapter) {
@ -31,7 +31,7 @@ data class ReaderChapter(val chapter: Chapter) {
references--
if (references == 0) {
if (pageLoader != null) {
Timber.d("Recycling chapter ${chapter.name}")
Logger.d { "Recycling chapter ${chapter.name}" }
}
pageLoader?.recycle()
pageLoader = null

View file

@ -15,6 +15,7 @@ import android.view.Gravity
import android.view.LayoutInflater
import androidx.core.view.isVisible
import androidx.core.view.updateLayoutParams
import co.touchlab.kermit.Logger
import com.davemorrissey.labs.subscaleview.SubsamplingScaleImageView
import eu.kanade.tachiyomi.R
import eu.kanade.tachiyomi.data.preference.PreferencesHelper
@ -50,7 +51,6 @@ import kotlinx.coroutines.launch
import kotlinx.coroutines.withContext
import okio.Buffer
import okio.BufferedSource
import timber.log.Timber
import uy.kohesive.injekt.injectLazy
import java.io.InputStream
import kotlin.math.min
@ -508,7 +508,7 @@ class PagerPageHolder(
try {
setBG(actualSource.peek().inputStream())
} catch (e: Exception) {
Timber.e(e.localizedMessage)
Logger.e { e.localizedMessage }
ColorDrawable(Color.WHITE)
}
setImage(actualSource, false, imageConfig)
@ -642,7 +642,7 @@ class PagerPageHolder(
val imageBitmap = try {
BitmapFactory.decodeStream(imageSource.inputStream())
} catch (e: Exception) {
Timber.e("Cannot split page ${e.message}")
Logger.e { "Cannot split page ${e.message}" }
return imageSource
}
val isLTR = (viewer !is R2LPagerViewer).xor(viewer.config.invertDoublePages)
@ -663,7 +663,7 @@ class PagerPageHolder(
} catch (e: Exception) {
page.longPage = true
splitDoublePages()
Timber.e("Cannot split page ${e.message}")
Logger.e { "Cannot split page ${e.message}" }
return imageSource
}
val height = imageBitmap.height
@ -696,7 +696,7 @@ class PagerPageHolder(
closeSources(imageSource2)
page.fullPage = true
splitDoublePages()
Timber.e("Cannot combine pages ${e.message}")
Logger.e { "Cannot combine pages ${e.message}" }
return supportHingeIfThere(imageSource)
}
scope.launchUI { progressBar.setProgress(96) }
@ -780,7 +780,7 @@ class PagerPageHolder(
extraPage?.fullPage = true
page.isolatedPage = true
splitDoublePages()
Timber.e("Cannot combine pages ${e.message}")
Logger.e { "Cannot combine pages ${e.message}" }
return supportHingeIfThere(imageSource)
}
scope.launchUI { progressBar.setProgress(97) }

View file

@ -9,6 +9,7 @@ import android.view.ViewGroup.LayoutParams
import androidx.core.view.children
import androidx.core.view.isVisible
import androidx.viewpager.widget.ViewPager
import co.touchlab.kermit.Logger
import eu.kanade.tachiyomi.R
import eu.kanade.tachiyomi.data.download.DownloadManager
import eu.kanade.tachiyomi.ui.reader.ReaderActivity
@ -21,7 +22,6 @@ import eu.kanade.tachiyomi.ui.reader.viewer.BaseViewer
import eu.kanade.tachiyomi.ui.reader.viewer.ViewerNavigation
import kotlinx.coroutines.MainScope
import kotlinx.coroutines.cancel
import timber.log.Timber
import uy.kohesive.injekt.injectLazy
/**
@ -251,14 +251,14 @@ abstract class PagerViewer(val activity: ReaderActivity) : BaseViewer {
val offset = if (hasExtraPage) 1 else 0
val pages = page.chapter.pages ?: return
if (hasExtraPage) {
Timber.d("onReaderPageSelected: ${page.number}-${page.number + offset}/${pages.size}")
Logger.d { "onReaderPageSelected: ${page.number}-${page.number + offset}/${pages.size}" }
} else {
Timber.d("onReaderPageSelected: ${page.number}/${pages.size}")
Logger.d { "onReaderPageSelected: ${page.number}/${pages.size}" }
}
// Preload next chapter once we're within the last 5 pages of the current chapter
val inPreloadRange = pages.size - page.number < 5
if (inPreloadRange && allowPreload && page.chapter == adapter.currentChapter) {
Timber.d("Request preload next chapter because we're at page ${page.number} of ${pages.size}")
Logger.d { "Request preload next chapter because we're at page ${page.number} of ${pages.size}" }
adapter.nextTransition?.to?.let {
activity.requestPreloadChapter(it)
}
@ -270,10 +270,10 @@ abstract class PagerViewer(val activity: ReaderActivity) : BaseViewer {
* preload of the destination chapter of the transition.
*/
private fun onTransitionSelected(transition: ChapterTransition) {
Timber.d("onTransitionSelected: $transition")
Logger.d { "onTransitionSelected: $transition" }
val toChapter = transition.to
if (toChapter != null) {
Timber.d("Request preload destination chapter because we're on the transition")
Logger.d { "Request preload destination chapter because we're on the transition" }
activity.requestPreloadChapter(toChapter)
} else if (transition is ChapterTransition.Next) {
// No more chapters, show menu because the user is probably going to close the reader
@ -332,7 +332,7 @@ abstract class PagerViewer(val activity: ReaderActivity) : BaseViewer {
* Sets the active [chapters] on this pager.
*/
private fun setChaptersInternal(chapters: ViewerChapters) {
Timber.d("setChaptersInternal")
Logger.d { "setChaptersInternal" }
val forceTransition = config.alwaysShowChapterTransition || adapter.joinedItems.getOrNull(
pager
.currentItem,
@ -341,7 +341,7 @@ abstract class PagerViewer(val activity: ReaderActivity) : BaseViewer {
// Layout the pager once a chapter is being set
if (pager.visibility == View.GONE) {
Timber.d("Pager first layout")
Logger.d { "Pager first layout" }
val pages = chapters.currChapter.pages ?: return
moveToPage(pages[chapters.currChapter.requestedPage])
pager.isVisible = true
@ -353,7 +353,7 @@ abstract class PagerViewer(val activity: ReaderActivity) : BaseViewer {
* Tells this viewer to move to the given [page].
*/
override fun moveToPage(page: ReaderPage, animated: Boolean) {
Timber.d("moveToPage ${page.number}")
Logger.d { "moveToPage ${page.number}" }
val position = adapter.joinedItems.indexOfFirst {
it.first == page || it.second == page ||
(
@ -378,7 +378,7 @@ abstract class PagerViewer(val activity: ReaderActivity) : BaseViewer {
)
}
} else {
Timber.d("Page $page not found in adapter")
Logger.d { "Page $page not found in adapter" }
}
}

View file

@ -2,6 +2,7 @@ package eu.kanade.tachiyomi.ui.reader.viewer.pager
import android.view.View
import android.view.ViewGroup
import co.touchlab.kermit.Logger
import eu.kanade.tachiyomi.ui.reader.model.ChapterTransition
import eu.kanade.tachiyomi.ui.reader.model.InsertPage
import eu.kanade.tachiyomi.ui.reader.model.ReaderChapter
@ -11,7 +12,6 @@ import eu.kanade.tachiyomi.ui.reader.viewer.hasMissingChapters
import eu.kanade.tachiyomi.util.system.launchUI
import eu.kanade.tachiyomi.widget.ViewPagerAdapter
import kotlinx.coroutines.delay
import timber.log.Timber
import kotlin.math.max
/**
@ -154,7 +154,7 @@ class PagerViewerAdapter(private val viewer: PagerViewer) : ViewPagerAdapter() {
if (position != -1) {
return position
} else {
Timber.d("Position for ${view.item} not found")
Logger.d { "Position for ${view.item} not found" }
}
}
return POSITION_NONE

View file

@ -11,6 +11,7 @@ import android.view.ViewGroup.LayoutParams.WRAP_CONTENT
import android.widget.FrameLayout
import androidx.core.view.isVisible
import androidx.core.view.updatePaddingRelative
import co.touchlab.kermit.Logger
import com.davemorrissey.labs.subscaleview.SubsamplingScaleImageView
import eu.kanade.tachiyomi.databinding.ReaderErrorBinding
import eu.kanade.tachiyomi.source.model.Page
@ -20,6 +21,7 @@ import eu.kanade.tachiyomi.ui.reader.viewer.ReaderPageImageView
import eu.kanade.tachiyomi.ui.reader.viewer.ReaderProgressBar
import eu.kanade.tachiyomi.util.system.ImageUtil
import eu.kanade.tachiyomi.util.system.dpToPx
import eu.kanade.tachiyomi.util.system.e
import eu.kanade.tachiyomi.util.system.launchIO
import eu.kanade.tachiyomi.util.system.withIOContext
import eu.kanade.tachiyomi.util.system.withUIContext
@ -30,7 +32,6 @@ import kotlinx.coroutines.launch
import kotlinx.coroutines.supervisorScope
import okio.Buffer
import okio.BufferedSource
import timber.log.Timber
/**
* Holder of the webtoon reader for a single page of a chapter.
@ -238,7 +239,7 @@ class WebtoonPageHolder(
Pair(source, isAnimated)
}
} catch (e: Exception) {
Timber.e(e)
Logger.e(e)
setError()
return
}

View file

@ -11,6 +11,7 @@ import androidx.core.view.isGone
import androidx.core.view.isVisible
import androidx.recyclerview.widget.RecyclerView
import androidx.recyclerview.widget.WebtoonLayoutManager
import co.touchlab.kermit.Logger
import eu.kanade.tachiyomi.data.download.DownloadManager
import eu.kanade.tachiyomi.ui.reader.ReaderActivity
import eu.kanade.tachiyomi.ui.reader.model.ChapterTransition
@ -20,7 +21,6 @@ import eu.kanade.tachiyomi.ui.reader.viewer.BaseViewer
import eu.kanade.tachiyomi.ui.reader.viewer.ViewerNavigation
import kotlinx.coroutines.MainScope
import kotlinx.coroutines.cancel
import timber.log.Timber
import uy.kohesive.injekt.injectLazy
import kotlin.math.max
import kotlin.math.min
@ -186,15 +186,15 @@ class WebtoonViewer(val activity: ReaderActivity, val hasMargins: Boolean = fals
activity.onPageSelected(page, false)
val pages = page.chapter.pages ?: return
Timber.d("onReaderPageSelected: ${page.number}/${pages.size}")
Logger.d { "onReaderPageSelected: ${page.number}/${pages.size}" }
// Preload next chapter once we're within the last 5 pages of the current chapter
val inPreloadRange = pages.size - page.number < 5
if (inPreloadRange && allowPreload && page.chapter == adapter.currentChapter) {
Timber.d("Request preload next chapter because we're at page ${page.number} of ${pages.size}")
Logger.d { "Request preload next chapter because we're at page ${page.number} of ${pages.size}" }
val nextItem = adapter.items.getOrNull(adapter.items.size - 1)
val transitionChapter = (nextItem as? ChapterTransition.Next)?.to ?: (nextItem as?ReaderPage)?.chapter
if (transitionChapter != null) {
Timber.d("Requesting to preload chapter ${transitionChapter.chapter.chapter_number}")
Logger.d { "Requesting to preload chapter ${transitionChapter.chapter.chapter_number}" }
activity.requestPreloadChapter(transitionChapter)
}
}
@ -205,10 +205,10 @@ class WebtoonViewer(val activity: ReaderActivity, val hasMargins: Boolean = fals
* preload of the destination chapter of the transition.
*/
private fun onTransitionSelected(transition: ChapterTransition) {
Timber.d("onTransitionSelected: $transition")
Logger.d { "onTransitionSelected: $transition" }
val toChapter = transition.to
if (toChapter != null) {
Timber.d("Request preload destination chapter because we're on the transition")
Logger.d { "Request preload destination chapter because we're on the transition" }
activity.requestPreloadChapter(toChapter)
}
}
@ -217,12 +217,12 @@ class WebtoonViewer(val activity: ReaderActivity, val hasMargins: Boolean = fals
* Tells this viewer to set the given [chapters] as active.
*/
override fun setChapters(chapters: ViewerChapters) {
Timber.d("setChapters")
Logger.d { "setChapters" }
val forceTransition = config.alwaysShowChapterTransition || currentPage is ChapterTransition
adapter.setChapters(chapters, forceTransition)
if (recycler.isGone) {
Timber.d("Recycler first layout")
Logger.d { "Recycler first layout" }
val pages = chapters.currChapter.pages ?: return
moveToPage(pages[min(chapters.currChapter.requestedPage, pages.lastIndex)])
recycler.isVisible = true
@ -233,7 +233,7 @@ class WebtoonViewer(val activity: ReaderActivity, val hasMargins: Boolean = fals
* Tells this viewer to move to the given [page].
*/
override fun moveToPage(page: ReaderPage, animated: Boolean) {
Timber.d("moveToPage")
Logger.d { "moveToPage" }
val position = adapter.items.indexOf(page)
if (position != -1) {
recycler.scrollToPosition(position)
@ -241,7 +241,7 @@ class WebtoonViewer(val activity: ReaderActivity, val hasMargins: Boolean = fals
onScrolled(position)
}
} else {
Timber.d("Page $page not found in adapter")
Logger.d { "Page $page not found in adapter" }
}
}

View file

@ -14,6 +14,7 @@ import androidx.appcompat.app.AppCompatActivity
import androidx.core.net.toUri
import androidx.lifecycle.lifecycleScope
import androidx.preference.PreferenceScreen
import co.touchlab.kermit.Logger
import com.hippo.unifile.UniFile
import dev.yokai.domain.base.BasePreferences.ExtensionInstaller
import dev.yokai.domain.extension.interactor.TrustExtension
@ -56,6 +57,7 @@ import eu.kanade.tachiyomi.ui.setting.switchPreference
import eu.kanade.tachiyomi.ui.setting.titleRes
import eu.kanade.tachiyomi.util.CrashLogUtil
import eu.kanade.tachiyomi.util.system.disableItems
import eu.kanade.tachiyomi.util.system.e
import eu.kanade.tachiyomi.util.system.isPackageInstalled
import eu.kanade.tachiyomi.util.system.launchIO
import eu.kanade.tachiyomi.util.system.launchUI
@ -73,7 +75,6 @@ import kotlinx.coroutines.Job
import kotlinx.coroutines.launch
import okhttp3.Headers
import rikka.sui.Sui
import timber.log.Timber
import uy.kohesive.injekt.Injekt
import uy.kohesive.injekt.api.get
import uy.kohesive.injekt.injectLazy
@ -455,7 +456,7 @@ class SettingsAdvancedController : SettingsLegacyController() {
activity?.applicationInfo?.dataDir?.let { File("$it/app_webview/").deleteRecursively() }
activity?.toast(R.string.webview_data_deleted)
} catch (e: Throwable) {
Timber.e(e)
Logger.e(e)
activity?.toast(R.string.cache_delete_error)
}
}

View file

@ -16,6 +16,7 @@ import androidx.core.view.updatePadding
import androidx.recyclerview.widget.DividerItemDecoration
import androidx.recyclerview.widget.LinearLayoutManager
import androidx.recyclerview.widget.RecyclerView
import co.touchlab.kermit.Logger
import com.bluelinelabs.conductor.ControllerChangeHandler
import com.bluelinelabs.conductor.ControllerChangeType
import com.google.android.material.snackbar.Snackbar
@ -41,6 +42,7 @@ import eu.kanade.tachiyomi.ui.webview.WebViewActivity
import eu.kanade.tachiyomi.util.addOrRemoveToFavorites
import eu.kanade.tachiyomi.util.system.connectivityManager
import eu.kanade.tachiyomi.util.system.dpToPx
import eu.kanade.tachiyomi.util.system.e
import eu.kanade.tachiyomi.util.system.openInBrowser
import eu.kanade.tachiyomi.util.system.toast
import eu.kanade.tachiyomi.util.view.activityBinding
@ -55,7 +57,6 @@ import eu.kanade.tachiyomi.util.view.withFadeTransaction
import eu.kanade.tachiyomi.widget.AutofitRecyclerView
import eu.kanade.tachiyomi.widget.EmptyView
import eu.kanade.tachiyomi.widget.LinearLayoutManagerAccurateOffset
import timber.log.Timber
import uy.kohesive.injekt.injectLazy
import kotlin.math.roundToInt
@ -555,7 +556,7 @@ open class BrowseSourceController(bundle: Bundle) :
* @param error the error received.
*/
fun onAddPageError(error: Throwable) {
Timber.e(error)
Logger.e(error)
val adapter = adapter ?: return
adapter.onLoadMoreComplete(null)
hideProgressBar()

View file

@ -1,5 +1,6 @@
package eu.kanade.tachiyomi.ui.source.browse
import co.touchlab.kermit.Logger
import dev.yokai.domain.ui.UiPreferences
import eu.davidea.flexibleadapter.items.IFlexible
import eu.kanade.tachiyomi.data.cache.CoverCache
@ -27,6 +28,7 @@ import eu.kanade.tachiyomi.ui.source.filter.TextItem
import eu.kanade.tachiyomi.ui.source.filter.TextSectionItem
import eu.kanade.tachiyomi.ui.source.filter.TriStateItem
import eu.kanade.tachiyomi.ui.source.filter.TriStateSectionItem
import eu.kanade.tachiyomi.util.system.e
import eu.kanade.tachiyomi.util.system.launchIO
import eu.kanade.tachiyomi.util.system.withUIContext
import kotlinx.coroutines.Job
@ -36,7 +38,6 @@ import kotlinx.coroutines.flow.collect
import kotlinx.coroutines.flow.filter
import kotlinx.coroutines.flow.map
import kotlinx.coroutines.flow.onEach
import timber.log.Timber
import uy.kohesive.injekt.Injekt
import uy.kohesive.injekt.api.get
@ -185,7 +186,7 @@ open class BrowseSourcePresenter(
this@BrowseSourcePresenter.items.addAll(items)
withUIContext { view?.onAddPage(page, items) }
} catch (error: Exception) {
Timber.e(error)
Logger.e(error)
}
}.collect()
}
@ -256,7 +257,7 @@ open class BrowseSourcePresenter(
.onEach {
withUIContext { view?.onMangaInitialized(it) }
}
.catch { e -> Timber.e(e) }
.catch { e -> Logger.e(e) }
.collect()
}
}
@ -274,7 +275,7 @@ open class BrowseSourcePresenter(
manga.initialized = true
db.insertManga(manga).executeAsBlocking()
} catch (e: Exception) {
Timber.e(e)
Logger.e(e)
}
return manga
}

View file

@ -11,6 +11,7 @@ import android.webkit.WebView
import androidx.activity.OnBackPressedCallback
import androidx.activity.addCallback
import androidx.core.graphics.ColorUtils
import co.touchlab.kermit.Logger
import eu.kanade.tachiyomi.R
import eu.kanade.tachiyomi.network.NetworkHelper
import eu.kanade.tachiyomi.source.SourceManager
@ -21,7 +22,6 @@ import eu.kanade.tachiyomi.util.system.getResourceColor
import eu.kanade.tachiyomi.util.system.openInBrowser
import eu.kanade.tachiyomi.util.system.toast
import okhttp3.HttpUrl.Companion.toHttpUrl
import timber.log.Timber
import uy.kohesive.injekt.injectLazy
open class WebViewActivity : BaseWebViewActivity() {
@ -70,7 +70,7 @@ open class WebViewActivity : BaseWebViewActivity() {
try {
headers = source.headers.toMultimap().mapValues { it.value.getOrNull(0) ?: "" }
} catch (e: Exception) {
Timber.e(e, "Failed to build headers")
Logger.e(e) { "Failed to build headers" }
}
}

View file

@ -6,6 +6,7 @@ import android.content.DialogInterface
import android.view.View
import android.widget.Toast
import androidx.appcompat.app.AlertDialog
import co.touchlab.kermit.Logger
import com.bluelinelabs.conductor.Controller
import com.google.android.material.snackbar.BaseTransientBottomBar
import com.google.android.material.snackbar.Snackbar
@ -36,11 +37,9 @@ import eu.kanade.tachiyomi.util.system.withUIContext
import eu.kanade.tachiyomi.util.view.snack
import eu.kanade.tachiyomi.util.view.withFadeTransaction
import eu.kanade.tachiyomi.widget.TriStateCheckBox
import timber.log.Timber
import uy.kohesive.injekt.Injekt
import uy.kohesive.injekt.api.get
import java.util.Date
import java.util.Locale
import java.util.*
fun Manga.isLocal() = source == LocalSource.ID
@ -413,7 +412,7 @@ fun Manga.autoAddTrack(db: DatabaseHelper, onMangaMoved: () -> Unit) {
}
}
} catch (e: Exception) {
Timber.w(e, "Could not match manga: ${this@autoAddTrack.title} with service $service")
Logger.w(e) { "Could not match manga: ${this@autoAddTrack.title} with service $service" }
}
}
}

View file

@ -1,5 +1,6 @@
package eu.kanade.tachiyomi.util.chapter
import co.touchlab.kermit.Logger
import eu.kanade.tachiyomi.data.database.DatabaseHelper
import eu.kanade.tachiyomi.data.database.models.Chapter
import eu.kanade.tachiyomi.data.database.models.Track
@ -7,11 +8,12 @@ import eu.kanade.tachiyomi.data.preference.PreferencesHelper
import eu.kanade.tachiyomi.data.track.DelayedTrackingUpdateJob
import eu.kanade.tachiyomi.data.track.TrackManager
import eu.kanade.tachiyomi.data.track.TrackService
import eu.kanade.tachiyomi.util.system.e
import eu.kanade.tachiyomi.util.system.isOnline
import eu.kanade.tachiyomi.util.system.launchIO
import eu.kanade.tachiyomi.util.system.w
import kotlinx.coroutines.Job
import kotlinx.coroutines.delay
import timber.log.Timber
import uy.kohesive.injekt.Injekt
import uy.kohesive.injekt.api.get
@ -41,7 +43,7 @@ fun syncChaptersWithTrackServiceTwoWay(db: DatabaseHelper, chapters: List<Chapte
service.update(remoteTrack)
db.insertTrack(remoteTrack).executeAsBlocking()
} catch (e: Throwable) {
Timber.w(e)
Logger.w(e)
}
}
}
@ -100,7 +102,7 @@ suspend fun updateTrackChapterRead(
service.update(track, true)
db.insertTrack(track).executeAsBlocking()
} catch (e: Exception) {
Timber.e(e)
Logger.e(e)
failures.add(service to e.localizedMessage)
if (retryWhenOnline) {
delayTrackingUpdate(preferences, mangaId, newChapterRead, track)

View file

@ -7,6 +7,7 @@ import android.content.pm.ShortcutManager
import android.graphics.Bitmap
import android.graphics.drawable.BitmapDrawable
import android.graphics.drawable.Icon
import co.touchlab.kermit.Logger
import coil3.imageLoader
import coil3.request.ImageRequest
import eu.kanade.tachiyomi.R
@ -23,7 +24,6 @@ import eu.kanade.tachiyomi.ui.main.SearchActivity
import eu.kanade.tachiyomi.ui.recents.RecentsPresenter
import eu.kanade.tachiyomi.ui.source.browse.BrowseSourceController
import eu.kanade.tachiyomi.util.system.launchIO
import timber.log.Timber
import uy.kohesive.injekt.Injekt
import uy.kohesive.injekt.api.get
import kotlin.math.min
@ -138,7 +138,7 @@ class MangaShortcutManager(
}
}
}
Timber.d("Shortcuts: ${shortcuts.joinToString(", ") { it.longLabel ?: "n/a" }}")
Logger.d { "Shortcuts: ${shortcuts.joinToString(", ") { it.longLabel ?: "n/a" }}" }
shortcutManager.dynamicShortcuts = shortcuts
}
}

View file

@ -36,6 +36,7 @@ import androidx.core.net.toUri
import androidx.work.CoroutineWorker
import androidx.work.WorkInfo
import androidx.work.WorkManager
import co.touchlab.kermit.Logger
import com.hippo.unifile.UniFile
import eu.kanade.tachiyomi.App
import eu.kanade.tachiyomi.R
@ -45,7 +46,6 @@ import eu.kanade.tachiyomi.ui.main.MainActivity
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.NonCancellable
import kotlinx.coroutines.withContext
import timber.log.Timber
import uy.kohesive.injekt.Injekt
import uy.kohesive.injekt.api.get
import java.io.File
@ -453,7 +453,7 @@ suspend fun CoroutineWorker.tryToSetForeground() {
try {
setForeground(getForegroundInfo())
} catch (e: IllegalStateException) {
Timber.e(e, "Not allowed to set foreground job")
Logger.e(e) { "Not allowed to set foreground job" }
}
}
@ -486,6 +486,6 @@ suspend fun <T> withNonCancellableContext(block: suspend CoroutineScope.() -> T)
fun Context.tryTakePersistableUriPermission(uri: Uri, flags: Int) = try {
contentResolver.takePersistableUriPermission(uri, flags)
} catch (e: SecurityException) {
Timber.e(e)
Logger.e(e)
toast(R.string.file_picker_uri_permission_unsupported)
}

View file

@ -8,9 +8,7 @@ import android.view.Display
import android.view.Window
import androidx.core.content.getSystemService
import androidx.core.view.WindowInsetsCompat
import timber.log.Timber
import java.lang.reflect.InvocationTargetException
import co.touchlab.kermit.Logger
object DeviceUtil {
@ -80,7 +78,7 @@ object DeviceUtil {
.getDeclaredMethod("get", String::class.java)
.invoke(null, key) as String
} catch (e: Exception) {
Timber.w(e, "Unable to use SystemProperties.get")
Logger.w(e) { "Unable to use SystemProperties.get" }
null
}
}

View file

@ -23,13 +23,13 @@ import androidx.core.graphics.blue
import androidx.core.graphics.green
import androidx.core.graphics.red
import androidx.core.graphics.scale
import co.touchlab.kermit.Logger
import com.hippo.unifile.UniFile
import eu.kanade.tachiyomi.R
import okio.Buffer
import okio.BufferedSource
import tachiyomi.decoder.Format
import tachiyomi.decoder.ImageDecoder
import timber.log.Timber
import java.io.File
import java.io.FileOutputStream
import java.io.InputStream
@ -553,7 +553,7 @@ object ImageUtil {
}
if (bitmapRegionDecoder == null) {
Timber.d("Failed to create new instance of BitmapRegionDecoder")
Logger.d { "Failed to create new instance of BitmapRegionDecoder" }
return false
}
@ -573,9 +573,9 @@ object ImageUtil {
splitBitmap.compress(Bitmap.CompressFormat.JPEG, 100, outputStream)
splitBitmap.recycle()
}
Timber.d(
"Success: Split #${splitData.index + 1} with topOffset=${splitData.topOffset} height=${splitData.splitHeight} bottomOffset=${splitData.bottomOffset}",
)
Logger.d {
"Success: Split #${splitData.index + 1} with topOffset=${splitData.topOffset} height=${splitData.splitHeight} bottomOffset=${splitData.bottomOffset}"
}
}
imageFile.delete()
true
@ -584,7 +584,7 @@ object ImageUtil {
splitDataList
.map { splitImagePath(imageFilePath, it.index) }
.forEach { File(it).delete() }
Timber.e(e)
Logger.e(e)
false
} finally {
bitmapRegionDecoder.recycle()
@ -605,9 +605,9 @@ object ImageUtil {
val partCount = (imageHeight - 1) / optimalImageHeight + 1
val optimalSplitHeight = imageHeight / partCount
Timber.d(
"Splitting image with height of $imageHeight into $partCount part with estimated ${optimalSplitHeight}px height per split",
)
Logger.d {
"Splitting image with height of $imageHeight into $partCount part with estimated ${optimalSplitHeight}px height per split"
}
return mutableListOf<SplitData>().apply {
val range = 0 until partCount

View file

@ -0,0 +1,6 @@
package eu.kanade.tachiyomi.util.system
import co.touchlab.kermit.Logger
fun Logger.w(e: Throwable) = w(e) { "Something is not right..." }
fun Logger.e(e: Throwable) = e(e) { "Something went wrong!" }

View file

@ -6,7 +6,7 @@ import android.content.pm.PackageManager
import android.webkit.CookieManager
import android.webkit.WebSettings
import android.webkit.WebView
import timber.log.Timber
import co.touchlab.kermit.Logger
object WebViewUtil {
const val MINIMUM_WEBVIEW_VERSION = 114
@ -17,7 +17,7 @@ object WebViewUtil {
// is not installed
CookieManager.getInstance()
} catch (e: Throwable) {
Timber.e(e)
Logger.e(e)
return false
}

View file

@ -39,6 +39,7 @@ gradle = { module = "com.android.tools.build:gradle", version = "8.2.0" }
guava = { module = "com.google.guava:guava", version = "31.1-android" }
image-decoder = { module = "com.github.tachiyomiorg:image-decoder", version = "e08e9be535" }
injekt-core = { module = "com.github.inorichi.injekt:injekt-core", version = "65b0440" }
kermit = { module = "co.touchlab:kermit", version = "2.0.3" }
material = { module = "com.google.android.material:material", version = "1.12.0" }
material-design-dimens = { module = "com.dmitrymalkovich.android:material-design-dimens", version = "1.4" }
markwon = { module = "io.noties.markwon:core", version = "4.6.2" }
@ -82,7 +83,6 @@ subsamplingscaleimageview = { module = "com.github.null2264:subsampling-scale-im
shizuku-api = { module = "dev.rikka.shizuku:api", version.ref = "shizuku" }
shizuku-provider = { module = "dev.rikka.shizuku:provider", version.ref = "shizuku" }
taptargetview = { module = "com.getkeepsafe.taptargetview:taptargetview", version = "1.13.3" }
timber = { module = "com.jakewharton.timber:timber", version = "4.7.1" }
oss-licenses-plugin = { module = "com.google.android.gms:oss-licenses-plugin", version = "0.10.6" }
unifile = { module = "com.github.tachiyomiorg:unifile", version = "7c257e1c64" }
viewstatepageradapter = { module = "com.nightlynexus.viewstatepageradapter:viewstatepageradapter", version = "1.1.0" }