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) implementation(libs.bundles.coil)
// Logging // Logging
implementation(libs.timber) implementation(libs.kermit)
// Sort // Sort
implementation(libs.java.nat.sort) implementation(libs.java.nat.sort)

View file

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

View file

@ -1,12 +1,12 @@
package dev.yokai.domain.extension.repo.interactor 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.ExtensionRepoRepository
import dev.yokai.domain.extension.repo.exception.SaveExtensionRepoException import dev.yokai.domain.extension.repo.exception.SaveExtensionRepoException
import dev.yokai.domain.extension.repo.model.ExtensionRepo import dev.yokai.domain.extension.repo.model.ExtensionRepo
import dev.yokai.domain.extension.repo.service.ExtensionRepoService import dev.yokai.domain.extension.repo.service.ExtensionRepoService
import eu.kanade.tachiyomi.network.NetworkHelper import eu.kanade.tachiyomi.network.NetworkHelper
import okhttp3.OkHttpClient import okhttp3.OkHttpClient
import timber.log.Timber
import uy.kohesive.injekt.injectLazy import uy.kohesive.injekt.injectLazy
class CreateExtensionRepo( class CreateExtensionRepo(
@ -41,7 +41,7 @@ class CreateExtensionRepo(
) )
Result.Success Result.Success
} catch (e: SaveExtensionRepoException) { } 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) return handleInsertionError(repo)
} }
} }

View file

@ -33,6 +33,10 @@ import coil3.request.crossfade
import coil3.util.DebugLogger import coil3.util.DebugLogger
import com.google.firebase.crashlytics.ktx.crashlytics import com.google.firebase.crashlytics.ktx.crashlytics
import com.google.firebase.ktx.Firebase 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.appwidget.TachiyomiWidgetManager
import eu.kanade.tachiyomi.data.coil.BufferedSourceFetcher import eu.kanade.tachiyomi.data.coil.BufferedSourceFetcher
import eu.kanade.tachiyomi.data.coil.CoilDiskCache 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.coil.TachiyomiImageDecoder
import eu.kanade.tachiyomi.data.notification.Notifications import eu.kanade.tachiyomi.data.notification.Notifications
import eu.kanade.tachiyomi.data.preference.PreferencesHelper 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.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.library.LibraryPresenter
import eu.kanade.tachiyomi.ui.recents.RecentsPresenter import eu.kanade.tachiyomi.ui.recents.RecentsPresenter
import eu.kanade.tachiyomi.ui.security.SecureActivityDelegate 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.launchIn
import kotlinx.coroutines.flow.onEach import kotlinx.coroutines.flow.onEach
import org.conscrypt.Conscrypt import org.conscrypt.Conscrypt
import timber.log.Timber
import uy.kohesive.injekt.Injekt import uy.kohesive.injekt.Injekt
import uy.kohesive.injekt.api.get import uy.kohesive.injekt.api.get
import uy.kohesive.injekt.injectLazy import uy.kohesive.injekt.injectLazy
@ -77,8 +74,6 @@ open class App : Application(), DefaultLifecycleObserver, SingletonImageLoader.F
override fun onCreate() { override fun onCreate() {
super<Application>.onCreate() super<Application>.onCreate()
if (BuildConfig.DEBUG) Timber.plant(Timber.DebugTree())
// TLS 1.3 support for Android 10 and below // TLS 1.3 support for Android 10 and below
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.Q) { if (Build.VERSION.SDK_INT < Build.VERSION_CODES.Q) {
Security.insertProviderAt(Conscrypt.newProvider(), 1) Security.insertProviderAt(Conscrypt.newProvider(), 1)

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

@ -1,6 +1,7 @@
package eu.kanade.tachiyomi.data.download package eu.kanade.tachiyomi.data.download
import android.content.Context import android.content.Context
import co.touchlab.kermit.Logger
import com.hippo.unifile.UniFile import com.hippo.unifile.UniFile
import dev.yokai.domain.download.DownloadPreferences import dev.yokai.domain.download.DownloadPreferences
import eu.kanade.tachiyomi.R import eu.kanade.tachiyomi.R
@ -16,7 +17,6 @@ import kotlinx.coroutines.DelicateCoroutinesApi
import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.GlobalScope import kotlinx.coroutines.GlobalScope
import kotlinx.coroutines.launch import kotlinx.coroutines.launch
import timber.log.Timber
import uy.kohesive.injekt.injectLazy import uy.kohesive.injekt.injectLazy
/** /**
@ -327,7 +327,7 @@ class DownloadManager(val context: Context) {
mangaFolder.delete() mangaFolder.delete()
cache.removeManga(manga) cache.removeManga(manga)
} else { } 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 return cleaned
@ -395,7 +395,7 @@ class DownloadManager(val context: Context) {
cache.removeChapters(listOf(oldChapter), manga) cache.removeChapters(listOf(oldChapter), manga)
cache.addChapter(newName, manga) cache.addChapter(newName, manga)
} else { } 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.content.Context
import android.os.Handler import android.os.Handler
import android.os.Looper import android.os.Looper
import co.touchlab.kermit.Logger
import com.hippo.unifile.UniFile import com.hippo.unifile.UniFile
import com.jakewharton.rxrelay.PublishRelay import com.jakewharton.rxrelay.PublishRelay
import dev.yokai.core.metadata.COMIC_INFO_FILE 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.DiskUtil.NOMEDIA_FILE
import eu.kanade.tachiyomi.util.storage.saveTo import eu.kanade.tachiyomi.util.storage.saveTo
import eu.kanade.tachiyomi.util.system.ImageUtil 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.launchIO
import eu.kanade.tachiyomi.util.system.launchNow import eu.kanade.tachiyomi.util.system.launchNow
import eu.kanade.tachiyomi.util.system.withIOContext import eu.kanade.tachiyomi.util.system.withIOContext
@ -49,7 +51,6 @@ import rx.Observable
import rx.Subscription import rx.Subscription
import rx.android.schedulers.AndroidSchedulers import rx.android.schedulers.AndroidSchedulers
import rx.schedulers.Schedulers import rx.schedulers.Schedulers
import timber.log.Timber
import uy.kohesive.injekt.injectLazy import uy.kohesive.injekt.injectLazy
import java.io.BufferedOutputStream import java.io.BufferedOutputStream
import java.io.File import java.io.File
@ -250,7 +251,7 @@ class Downloader(
completeDownload(it) completeDownload(it)
}, },
{ error -> { error ->
Timber.e(error) Logger.e(error)
notifier.onError(error.message) notifier.onError(error.message)
stop() stop()
}, },
@ -401,7 +402,7 @@ class Downloader(
} catch (error: Throwable) { } catch (error: Throwable) {
if (error is CancellationException) throw error if (error is CancellationException) throw error
// If the page list threw, it will resume here // If the page list threw, it will resume here
Timber.e(error) Logger.e(error)
download.status = Download.State.ERROR download.status = Download.State.ERROR
notifier.onError(error.message, chapName, download.manga.title) notifier.onError(error.message, chapName, download.manga.title)
} }
@ -560,7 +561,7 @@ class Downloader(
return try { return try {
ImageUtil.splitTallImage(imageFile, imageFilePath) ImageUtil.splitTallImage(imageFile, imageFilePath)
} catch (e: Exception) { } catch (e: Exception) {
Timber.e(e) Logger.e(e)
false false
} }
} }

View file

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

View file

@ -9,11 +9,12 @@ import androidx.work.NetworkType
import androidx.work.OneTimeWorkRequestBuilder import androidx.work.OneTimeWorkRequestBuilder
import androidx.work.WorkManager import androidx.work.WorkManager
import androidx.work.WorkerParameters import androidx.work.WorkerParameters
import co.touchlab.kermit.Logger
import eu.kanade.tachiyomi.data.database.DatabaseHelper import eu.kanade.tachiyomi.data.database.DatabaseHelper
import eu.kanade.tachiyomi.data.preference.PreferencesHelper import eu.kanade.tachiyomi.data.preference.PreferencesHelper
import eu.kanade.tachiyomi.util.system.e
import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.withContext import kotlinx.coroutines.withContext
import timber.log.Timber
import uy.kohesive.injekt.Injekt import uy.kohesive.injekt.Injekt
import uy.kohesive.injekt.api.get import uy.kohesive.injekt.api.get
import java.util.concurrent.TimeUnit import java.util.concurrent.TimeUnit
@ -51,7 +52,7 @@ class DelayedTrackingUpdateJob(context: Context, workerParams: WorkerParameters)
service.update(track, true) service.update(track, true)
db.insertTrack(track).executeAsBlocking() db.insertTrack(track).executeAsBlocking()
} catch (e: Exception) { } 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.content.Context
import android.graphics.Color import android.graphics.Color
import androidx.annotation.StringRes import androidx.annotation.StringRes
import co.touchlab.kermit.Logger
import eu.kanade.tachiyomi.R import eu.kanade.tachiyomi.R
import eu.kanade.tachiyomi.data.database.models.Track import eu.kanade.tachiyomi.data.database.models.Track
import eu.kanade.tachiyomi.data.track.TrackService import eu.kanade.tachiyomi.data.track.TrackService
import eu.kanade.tachiyomi.data.track.updateNewTrackInfo 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.encodeToString
import kotlinx.serialization.json.Json import kotlinx.serialization.json.Json
import timber.log.Timber
import uy.kohesive.injekt.injectLazy import uy.kohesive.injekt.injectLazy
class Anilist(private val context: Context, id: Int) : TrackService(id) { 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) saveCredentials(username.toString(), oauth.access_token)
true true
} catch (e: Exception) { } catch (e: Exception) {
Timber.e(e) Logger.e(e)
logout() logout()
false false
} }
@ -222,7 +222,7 @@ class Anilist(private val context: Context, id: Int) : TrackService(id) {
scorePreference.set(scoreType) scorePreference.set(scoreType)
true to null true to null
} catch (e: Exception) { } catch (e: Exception) {
Timber.e(e) Logger.e(e)
false to e false to e
} }
} }
@ -241,7 +241,7 @@ class Anilist(private val context: Context, id: Int) : TrackService(id) {
return try { return try {
json.decodeFromString<OAuth>(trackPreferences.trackToken(this).get()) json.decodeFromString<OAuth>(trackPreferences.trackToken(this).get())
} catch (e: Exception) { } catch (e: Exception) {
Timber.e(e) Logger.e(e)
null null
} }
} }

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

@ -4,6 +4,7 @@ import android.content.Context
import android.graphics.drawable.Drawable import android.graphics.drawable.Drawable
import android.os.Build import android.os.Build
import android.os.Parcelable import android.os.Parcelable
import co.touchlab.kermit.Logger
import dev.yokai.domain.base.BasePreferences import dev.yokai.domain.base.BasePreferences
import dev.yokai.domain.extension.interactor.TrustExtension import dev.yokai.domain.extension.interactor.TrustExtension
import eu.kanade.tachiyomi.data.preference.PreferencesHelper 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.extension.util.ExtensionLoader
import eu.kanade.tachiyomi.source.Source import eu.kanade.tachiyomi.source.Source
import eu.kanade.tachiyomi.ui.extension.ExtensionIntallInfo import eu.kanade.tachiyomi.ui.extension.ExtensionIntallInfo
import eu.kanade.tachiyomi.util.system.e
import eu.kanade.tachiyomi.util.system.launchNow import eu.kanade.tachiyomi.util.system.launchNow
import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.async import kotlinx.coroutines.async
@ -23,10 +25,9 @@ import kotlinx.coroutines.flow.Flow
import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.MutableStateFlow
import kotlinx.coroutines.flow.asStateFlow import kotlinx.coroutines.flow.asStateFlow
import kotlinx.parcelize.Parcelize import kotlinx.parcelize.Parcelize
import timber.log.Timber
import uy.kohesive.injekt.Injekt import uy.kohesive.injekt.Injekt
import uy.kohesive.injekt.api.get 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 * 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 { val extensions: List<Extension.Available> = try {
api.findExtensions() api.findExtensions()
} catch (e: Exception) { } catch (e: Exception) {
Timber.e(e) Logger.e(e)
emptyList() emptyList()
} }

View file

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

View file

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

View file

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

View file

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

View file

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

View file

@ -1,7 +1,6 @@
package eu.kanade.tachiyomi.ui.base.controller package eu.kanade.tachiyomi.ui.base.controller
import android.app.Activity import android.app.Activity
import android.graphics.drawable.Drawable
import android.os.Bundle import android.os.Bundle
import android.view.Menu import android.view.Menu
import android.view.MenuItem import android.view.MenuItem
@ -10,11 +9,11 @@ import androidx.appcompat.app.AppCompatActivity
import androidx.core.view.forEach import androidx.core.view.forEach
import androidx.core.view.isVisible import androidx.core.view.isVisible
import androidx.recyclerview.widget.RecyclerView import androidx.recyclerview.widget.RecyclerView
import co.touchlab.kermit.Logger
import com.bluelinelabs.conductor.Controller import com.bluelinelabs.conductor.Controller
import com.bluelinelabs.conductor.ControllerChangeHandler import com.bluelinelabs.conductor.ControllerChangeHandler
import com.bluelinelabs.conductor.ControllerChangeType import com.bluelinelabs.conductor.ControllerChangeType
import eu.kanade.tachiyomi.R 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.BackHandlerControllerInterface
import eu.kanade.tachiyomi.util.view.activityBinding import eu.kanade.tachiyomi.util.view.activityBinding
import eu.kanade.tachiyomi.util.view.isControllerVisible 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.CoroutineScope
import kotlinx.coroutines.MainScope import kotlinx.coroutines.MainScope
import kotlinx.coroutines.cancel import kotlinx.coroutines.cancel
import timber.log.Timber
abstract class BaseController(bundle: Bundle? = null) : abstract class BaseController(bundle: Bundle? = null) :
Controller(bundle), BackHandlerControllerInterface, BaseControllerPreferenceControllerCommonInterface { Controller(bundle), BackHandlerControllerInterface, BaseControllerPreferenceControllerCommonInterface {
@ -39,20 +37,20 @@ abstract class BaseController(bundle: Bundle? = null) :
override fun preCreateView(controller: Controller) { override fun preCreateView(controller: Controller) {
viewScope = MainScope() viewScope = MainScope()
Timber.d("Create view for ${controller.instance()}") Logger.d { "Create view for ${controller.instance()}" }
} }
override fun preAttach(controller: Controller, view: View) { 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) { 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) { override fun preDestroyView(controller: Controller, view: View) {
viewScope.cancel() 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.Context
import android.content.Intent import android.content.Intent
import co.touchlab.kermit.Logger
import eu.kanade.tachiyomi.util.system.e
import kotlinx.serialization.KSerializer import kotlinx.serialization.KSerializer
import kotlinx.serialization.descriptors.PrimitiveKind import kotlinx.serialization.descriptors.PrimitiveKind
import kotlinx.serialization.descriptors.PrimitiveSerialDescriptor import kotlinx.serialization.descriptors.PrimitiveSerialDescriptor
@ -9,7 +11,6 @@ import kotlinx.serialization.descriptors.SerialDescriptor
import kotlinx.serialization.encoding.Decoder import kotlinx.serialization.encoding.Decoder
import kotlinx.serialization.encoding.Encoder import kotlinx.serialization.encoding.Encoder
import kotlinx.serialization.json.Json import kotlinx.serialization.json.Json
import timber.log.Timber
import kotlin.system.exitProcess import kotlin.system.exitProcess
class GlobalExceptionHandler private constructor( class GlobalExceptionHandler private constructor(
@ -31,7 +32,7 @@ class GlobalExceptionHandler private constructor(
override fun uncaughtException(thread: Thread, exception: Throwable) { override fun uncaughtException(thread: Thread, exception: Throwable) {
try { try {
Timber.e(exception) Logger.e(exception)
launchActivity(applicationContext, activityToBeLaunched, exception) launchActivity(applicationContext, activityToBeLaunched, exception)
exitProcess(0) exitProcess(0)
} catch (_: Exception) { } catch (_: Exception) {
@ -71,7 +72,7 @@ class GlobalExceptionHandler private constructor(
return try { return try {
Json.decodeFromString(ThrowableSerializer, intent.getStringExtra(INTENT_EXTRA)!!) Json.decodeFromString(ThrowableSerializer, intent.getStringExtra(INTENT_EXTRA)!!)
} catch (e: Exception) { } 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 null
} }
} }

View file

@ -20,12 +20,13 @@ import androidx.preference.PreferenceManager
import androidx.preference.PreferenceScreen import androidx.preference.PreferenceScreen
import androidx.preference.SwitchPreferenceCompat import androidx.preference.SwitchPreferenceCompat
import androidx.recyclerview.widget.ConcatAdapter import androidx.recyclerview.widget.ConcatAdapter
import co.touchlab.kermit.Logger
import com.google.android.material.snackbar.Snackbar import com.google.android.material.snackbar.Snackbar
import eu.kanade.tachiyomi.R 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.minusAssign
import eu.kanade.tachiyomi.core.preference.plusAssign 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.databinding.ExtensionDetailControllerBinding
import eu.kanade.tachiyomi.extension.model.Extension import eu.kanade.tachiyomi.extension.model.Extension
import eu.kanade.tachiyomi.network.NetworkHelper 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.launchIn
import kotlinx.coroutines.flow.onEach import kotlinx.coroutines.flow.onEach
import okhttp3.HttpUrl.Companion.toHttpUrl import okhttp3.HttpUrl.Companion.toHttpUrl
import timber.log.Timber
import uy.kohesive.injekt.Injekt import uy.kohesive.injekt.Injekt
import uy.kohesive.injekt.api.get import uy.kohesive.injekt.api.get
import uy.kohesive.injekt.injectLazy import uy.kohesive.injekt.injectLazy
@ -191,7 +191,7 @@ class ExtensionDetailsController(bundle: Bundle? = null) :
network.cookieJar.remove(it.toHttpUrl()) 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 val context = view?.context ?: return
binding.coordinator.snack(context.getString(R.string.cookies_cleared)) 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.DisplayFeature
import androidx.window.layout.FoldingFeature import androidx.window.layout.FoldingFeature
import androidx.window.layout.WindowInfoTracker import androidx.window.layout.WindowInfoTracker
import co.touchlab.kermit.Logger
import com.bluelinelabs.conductor.Conductor import com.bluelinelabs.conductor.Conductor
import com.bluelinelabs.conductor.Controller import com.bluelinelabs.conductor.Controller
import com.bluelinelabs.conductor.ControllerChangeHandler 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.manga.MangaShortcutManager
import eu.kanade.tachiyomi.util.system.contextCompatDrawable import eu.kanade.tachiyomi.util.system.contextCompatDrawable
import eu.kanade.tachiyomi.util.system.dpToPx 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.executeOnIO
import eu.kanade.tachiyomi.util.system.getResourceColor import eu.kanade.tachiyomi.util.system.getResourceColor
import eu.kanade.tachiyomi.util.system.hasSideNavBar import eu.kanade.tachiyomi.util.system.hasSideNavBar
@ -144,11 +146,10 @@ import kotlinx.coroutines.flow.launchIn
import kotlinx.coroutines.flow.onEach import kotlinx.coroutines.flow.onEach
import kotlinx.coroutines.launch import kotlinx.coroutines.launch
import kotlinx.coroutines.withContext import kotlinx.coroutines.withContext
import timber.log.Timber
import uy.kohesive.injekt.Injekt import uy.kohesive.injekt.Injekt
import uy.kohesive.injekt.api.get import uy.kohesive.injekt.api.get
import uy.kohesive.injekt.injectLazy import uy.kohesive.injekt.injectLazy
import java.util.Date import java.util.*
import java.util.concurrent.TimeUnit import java.util.concurrent.TimeUnit
import kotlin.math.abs import kotlin.math.abs
import kotlin.math.min import kotlin.math.min
@ -1009,7 +1010,7 @@ open class MainActivity : BaseActivity<MainActivityBinding>() {
} }
} }
} catch (error: Exception) { } 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.ItemTouchHelper
import androidx.recyclerview.widget.LinearLayoutManager import androidx.recyclerview.widget.LinearLayoutManager
import androidx.recyclerview.widget.RecyclerView import androidx.recyclerview.widget.RecyclerView
import co.touchlab.kermit.Logger
import coil3.imageLoader import coil3.imageLoader
import coil3.request.ImageRequest import coil3.request.ImageRequest
import coil3.request.allowHardware import coil3.request.allowHardware
@ -53,13 +54,13 @@ import com.google.android.material.snackbar.Snackbar
import eu.davidea.flexibleadapter.FlexibleAdapter import eu.davidea.flexibleadapter.FlexibleAdapter
import eu.davidea.flexibleadapter.SelectableAdapter import eu.davidea.flexibleadapter.SelectableAdapter
import eu.kanade.tachiyomi.R 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.DatabaseHelper
import eu.kanade.tachiyomi.data.database.models.Category import eu.kanade.tachiyomi.data.database.models.Category
import eu.kanade.tachiyomi.data.database.models.Chapter import eu.kanade.tachiyomi.data.database.models.Chapter
import eu.kanade.tachiyomi.data.database.models.Manga import eu.kanade.tachiyomi.data.database.models.Manga
import eu.kanade.tachiyomi.data.download.DownloadJob import eu.kanade.tachiyomi.data.download.DownloadJob
import eu.kanade.tachiyomi.data.download.model.Download 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.notification.NotificationReceiver
import eu.kanade.tachiyomi.data.track.model.TrackSearch import eu.kanade.tachiyomi.data.track.model.TrackSearch
import eu.kanade.tachiyomi.databinding.MangaDetailsControllerBinding 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.addCheckBoxPrompt
import eu.kanade.tachiyomi.util.system.contextCompatColor import eu.kanade.tachiyomi.util.system.contextCompatColor
import eu.kanade.tachiyomi.util.system.dpToPx 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.getResourceColor
import eu.kanade.tachiyomi.util.system.ignoredSystemInsets import eu.kanade.tachiyomi.util.system.ignoredSystemInsets
import eu.kanade.tachiyomi.util.system.isInNightMode 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 eu.kanade.tachiyomi.widget.LinearLayoutManagerAccurateOffset
import kotlinx.coroutines.runBlocking import kotlinx.coroutines.runBlocking
import kotlinx.coroutines.withTimeoutOrNull import kotlinx.coroutines.withTimeoutOrNull
import timber.log.Timber
import uy.kohesive.injekt.Injekt import uy.kohesive.injekt.Injekt
import uy.kohesive.injekt.api.get import uy.kohesive.injekt.api.get
import java.io.File import java.io.File
import java.io.IOException import java.io.IOException
import java.util.Locale import java.util.*
import kotlin.math.max import kotlin.math.max
import kotlin.math.roundToInt import kotlin.math.roundToInt
@ -1720,7 +1721,7 @@ class MangaDetailsController :
} }
fun trackRefreshError(error: Exception) { fun trackRefreshError(error: Exception) {
Timber.e(error) Logger.e(error)
trackingBottomSheet?.onRefreshError(error) trackingBottomSheet?.onRefreshError(error)
} }
@ -1817,7 +1818,7 @@ class MangaDetailsController :
} }
} catch (error: IOException) { } catch (error: IOException) {
activity.toast(R.string.failed_to_update_cover) 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.LinearLayoutManager
import androidx.recyclerview.widget.RecyclerView import androidx.recyclerview.widget.RecyclerView
import androidx.transition.TransitionManager import androidx.transition.TransitionManager
import co.touchlab.kermit.Logger
import com.google.android.material.datepicker.MaterialDatePicker import com.google.android.material.datepicker.MaterialDatePicker
import com.mikepenz.fastadapter.FastAdapter import com.mikepenz.fastadapter.FastAdapter
import com.mikepenz.fastadapter.adapters.ItemAdapter 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.lang.indexesOf
import eu.kanade.tachiyomi.util.system.addCheckBoxPrompt import eu.kanade.tachiyomi.util.system.addCheckBoxPrompt
import eu.kanade.tachiyomi.util.system.dpToPx 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.isOnline
import eu.kanade.tachiyomi.util.system.isPromptChecked import eu.kanade.tachiyomi.util.system.isPromptChecked
import eu.kanade.tachiyomi.util.system.launchIO 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.checkHeightThen
import eu.kanade.tachiyomi.util.view.expand import eu.kanade.tachiyomi.util.view.expand
import eu.kanade.tachiyomi.widget.E2EBottomSheetDialog import eu.kanade.tachiyomi.widget.E2EBottomSheetDialog
import timber.log.Timber
import java.text.DateFormat import java.text.DateFormat
import java.util.Calendar import java.util.*
class TrackingBottomSheet(private val controller: MangaDetailsController) : class TrackingBottomSheet(private val controller: MangaDetailsController) :
E2EBottomSheetDialog<TrackingBottomSheetBinding>(controller.activity!!), E2EBottomSheetDialog<TrackingBottomSheetBinding>(controller.activity!!),
@ -324,7 +325,7 @@ class TrackingBottomSheet(private val controller: MangaDetailsController) :
} }
fun onSearchResultsError(error: Throwable) { fun onSearchResultsError(error: Throwable) {
Timber.e(error) Logger.e(error)
startTransition() startTransition()
setMiddleTrackView(binding.searchEmptyView.id) setMiddleTrackView(binding.searchEmptyView.id)
binding.searchProgress.isVisible = false binding.searchProgress.isVisible = false

View file

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

View file

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

View file

@ -4,6 +4,7 @@ import android.view.LayoutInflater
import android.view.View import android.view.View
import androidx.core.content.ContextCompat import androidx.core.content.ContextCompat
import androidx.core.view.isVisible import androidx.core.view.isVisible
import co.touchlab.kermit.Logger
import com.github.mikephil.charting.components.XAxis import com.github.mikephil.charting.components.XAxis
import com.github.mikephil.charting.data.BarData import com.github.mikephil.charting.data.BarData
import com.github.mikephil.charting.data.BarDataSet 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.compatToolTipText
import eu.kanade.tachiyomi.util.view.scrollViewWith import eu.kanade.tachiyomi.util.view.scrollViewWith
import eu.kanade.tachiyomi.util.view.withFadeTransaction import eu.kanade.tachiyomi.util.view.withFadeTransaction
import timber.log.Timber
import kotlin.math.roundToInt import kotlin.math.roundToInt
class StatsController : BaseLegacyController<StatsControllerBinding>() { class StatsController : BaseLegacyController<StatsControllerBinding>() {
@ -130,7 +130,7 @@ class StatsController : BaseLegacyController<StatsControllerBinding>() {
invalidate() invalidate()
} }
} catch (e: Exception) { } catch (e: Exception) {
Timber.e(e) Logger.e(e) { "Failed to show chart" }
} }
} }
@ -179,7 +179,7 @@ class StatsController : BaseLegacyController<StatsControllerBinding>() {
} }
} }
} catch (e: Exception) { } 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 android.widget.TextView
import androidx.core.content.ContextCompat import androidx.core.content.ContextCompat
import androidx.core.view.isVisible import androidx.core.view.isVisible
import co.touchlab.kermit.Logger
import com.github.mikephil.charting.charts.BarChart import com.github.mikephil.charting.charts.BarChart
import com.github.mikephil.charting.components.MarkerView import com.github.mikephil.charting.components.MarkerView
import com.github.mikephil.charting.components.XAxis 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.ui.more.stats.details.StatsDetailsPresenter.StatsSort
import eu.kanade.tachiyomi.util.system.getResourceColor import eu.kanade.tachiyomi.util.system.getResourceColor
import eu.kanade.tachiyomi.util.system.isLandscape import eu.kanade.tachiyomi.util.system.isLandscape
import timber.log.Timber import java.util.*
import java.util.Calendar
import java.util.concurrent.TimeUnit import java.util.concurrent.TimeUnit
import kotlin.math.ceil import kotlin.math.ceil
@ -231,7 +231,7 @@ class StatsDetailsChartLayout @JvmOverloads constructor(
invalidate() invalidate()
} }
} catch (e: Exception) { } 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) } listener?.getHighlight()?.let { highlightValue(it) }
} }
} catch (e: Exception) { } catch (e: Exception) {
Timber.e(e) Logger.e(e) { "Failed setup bar chart" }
} }
} }
} }
@ -392,7 +392,7 @@ class StatsDetailsChartLayout @JvmOverloads constructor(
invalidate() invalidate()
} }
} catch (e: Exception) { } 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.DisplayFeature
import androidx.window.layout.FoldingFeature import androidx.window.layout.FoldingFeature
import androidx.window.layout.WindowInfoTracker import androidx.window.layout.WindowInfoTracker
import co.touchlab.kermit.Logger
import com.davemorrissey.labs.subscaleview.SubsamplingScaleImageView import com.davemorrissey.labs.subscaleview.SubsamplingScaleImageView
import com.google.android.material.bottomsheet.BottomSheetBehavior import com.google.android.material.bottomsheet.BottomSheetBehavior
import com.google.android.material.bottomsheet.BottomSheetDialog 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 dev.yokai.domain.ui.settings.ReaderPreferences.LandscapeCutoutBehaviour
import eu.kanade.tachiyomi.BuildConfig import eu.kanade.tachiyomi.BuildConfig
import eu.kanade.tachiyomi.R 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.core.preference.toggle
import eu.kanade.tachiyomi.data.coil.TachiyomiImageDecoder 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.preference.changesIn
import eu.kanade.tachiyomi.data.track.TrackService import eu.kanade.tachiyomi.data.track.TrackService
import eu.kanade.tachiyomi.databinding.ReaderActivityBinding 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.contextCompatColor
import eu.kanade.tachiyomi.util.system.contextCompatDrawable import eu.kanade.tachiyomi.util.system.contextCompatDrawable
import eu.kanade.tachiyomi.util.system.dpToPx 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.getBottomGestureInsets
import eu.kanade.tachiyomi.util.system.getResourceColor import eu.kanade.tachiyomi.util.system.getResourceColor
import eu.kanade.tachiyomi.util.system.hasSideNavBar import eu.kanade.tachiyomi.util.system.hasSideNavBar
@ -158,14 +160,11 @@ import kotlinx.coroutines.flow.onEach
import kotlinx.coroutines.flow.sample import kotlinx.coroutines.flow.sample
import kotlinx.coroutines.launch import kotlinx.coroutines.launch
import kotlinx.coroutines.withContext import kotlinx.coroutines.withContext
import timber.log.Timber
import uy.kohesive.injekt.injectLazy import uy.kohesive.injekt.injectLazy
import java.io.ByteArrayOutputStream import java.io.ByteArrayOutputStream
import java.io.File
import java.text.DecimalFormat import java.text.DecimalFormat
import java.text.DecimalFormatSymbols import java.text.DecimalFormatSymbols
import java.util.Collections import java.util.*
import java.util.Locale
import kotlin.math.abs import kotlin.math.abs
import kotlin.math.max import kotlin.math.max
import kotlin.math.roundToInt 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. * this case the activity is closed and a toast is shown to the user.
*/ */
private fun setInitialChapterError(error: Throwable) { private fun setInitialChapterError(error: Throwable) {
Timber.e(error) Logger.e(error)
finish() finish()
toast(error.message) toast(error.message)
} }
@ -1725,7 +1724,7 @@ class ReaderActivity : BaseActivity<ReaderActivityBinding>() {
toast(R.string.picture_saved) toast(R.string.picture_saved)
} }
is ReaderViewModel.SaveImageResult.Error -> { 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.app.Application
import android.graphics.BitmapFactory import android.graphics.BitmapFactory
import android.net.Uri import android.net.Uri
import android.os.Environment
import androidx.annotation.ColorInt import androidx.annotation.ColorInt
import androidx.core.net.toFile
import androidx.lifecycle.SavedStateHandle import androidx.lifecycle.SavedStateHandle
import androidx.lifecycle.ViewModel import androidx.lifecycle.ViewModel
import androidx.lifecycle.viewModelScope import androidx.lifecycle.viewModelScope
import co.touchlab.kermit.Logger
import com.hippo.unifile.UniFile import com.hippo.unifile.UniFile
import dev.yokai.domain.chapter.interactor.GetChapters import dev.yokai.domain.chapter.interactor.GetChapters
import dev.yokai.domain.download.DownloadPreferences 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.isLocal
import eu.kanade.tachiyomi.util.storage.DiskUtil import eu.kanade.tachiyomi.util.storage.DiskUtil
import eu.kanade.tachiyomi.util.system.ImageUtil 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.executeOnIO
import eu.kanade.tachiyomi.util.system.launchIO import eu.kanade.tachiyomi.util.system.launchIO
import eu.kanade.tachiyomi.util.system.launchNonCancellable import eu.kanade.tachiyomi.util.system.launchNonCancellable
@ -73,12 +73,10 @@ import kotlinx.coroutines.runBlocking
import kotlinx.coroutines.withContext import kotlinx.coroutines.withContext
import rx.Completable import rx.Completable
import rx.schedulers.Schedulers import rx.schedulers.Schedulers
import timber.log.Timber
import uy.kohesive.injekt.Injekt import uy.kohesive.injekt.Injekt
import uy.kohesive.injekt.api.get import uy.kohesive.injekt.api.get
import uy.kohesive.injekt.injectLazy import uy.kohesive.injekt.injectLazy
import java.io.File import java.util.*
import java.util.Date
import java.util.concurrent.CancellationException import java.util.concurrent.CancellationException
/** /**
@ -364,7 +362,7 @@ class ReaderViewModel(
private suspend fun loadNewChapter(chapter: ReaderChapter) { private suspend fun loadNewChapter(chapter: ReaderChapter) {
val loader = loader ?: return val loader = loader ?: return
Timber.d("Loading ${chapter.chapter.url}") Logger.d { "Loading ${chapter.chapter.url}" }
withIOContext { withIOContext {
try { try {
@ -373,7 +371,7 @@ class ReaderViewModel(
if (e is CancellationException) { if (e is CancellationException) {
throw e throw e
} }
Timber.e(e) Logger.e(e)
} }
} }
} }
@ -414,7 +412,7 @@ class ReaderViewModel(
suspend fun loadChapter(chapter: ReaderChapter): Int? { suspend fun loadChapter(chapter: ReaderChapter): Int? {
val loader = loader ?: return -1 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 var lastPage: Int? = if (chapter.chapter.pages_left <= 1) 0 else chapter.chapter.last_page_read
mutableState.update { it.copy(isLoadingAdjacentChapter = true) } mutableState.update { it.copy(isLoadingAdjacentChapter = true) }
try { try {
@ -425,7 +423,7 @@ class ReaderViewModel(
if (e is CancellationException) { if (e is CancellationException) {
throw e throw e
} }
Timber.e(e) Logger.e(e)
lastPage = null lastPage = null
} finally { } finally {
mutableState.update { it.copy(isLoadingAdjacentChapter = false) } mutableState.update { it.copy(isLoadingAdjacentChapter = false) }
@ -455,7 +453,7 @@ class ReaderViewModel(
return return
} }
Timber.d("Preloading ${chapter.chapter.url}") Logger.d { "Preloading ${chapter.chapter.url}" }
val loader = loader ?: return val loader = loader ?: return
withIOContext { withIOContext {
@ -504,7 +502,7 @@ class ReaderViewModel(
} }
if (selectedChapter != currentChapters.currChapter) { if (selectedChapter != currentChapters.currChapter) {
Timber.d("Setting ${selectedChapter.chapter.url} as active") Logger.d { "Setting ${selectedChapter.chapter.url} as active" }
saveReadingProgress(currentChapters.currChapter) saveReadingProgress(currentChapters.currChapter)
setReadStartTime() setReadStartTime()
scope.launch { loadNewChapter(selectedChapter) } scope.launch { loadNewChapter(selectedChapter) }
@ -730,7 +728,7 @@ class ReaderViewModel(
this.manga?.orientationType = rotationType this.manga?.orientationType = rotationType
db.updateViewerFlags(manga).executeAsBlocking() db.updateViewerFlags(manga).executeAsBlocking()
Timber.i("Manga orientation is ${manga.orientationType}") Logger.i { "Manga orientation is ${manga.orientationType}" }
viewModelScope.launchIO { viewModelScope.launchIO {
db.updateViewerFlags(manga).executeAsBlocking() db.updateViewerFlags(manga).executeAsBlocking()

View file

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

View file

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

View file

@ -15,6 +15,7 @@ import android.view.Gravity
import android.view.LayoutInflater import android.view.LayoutInflater
import androidx.core.view.isVisible import androidx.core.view.isVisible
import androidx.core.view.updateLayoutParams import androidx.core.view.updateLayoutParams
import co.touchlab.kermit.Logger
import com.davemorrissey.labs.subscaleview.SubsamplingScaleImageView import com.davemorrissey.labs.subscaleview.SubsamplingScaleImageView
import eu.kanade.tachiyomi.R import eu.kanade.tachiyomi.R
import eu.kanade.tachiyomi.data.preference.PreferencesHelper import eu.kanade.tachiyomi.data.preference.PreferencesHelper
@ -50,7 +51,6 @@ import kotlinx.coroutines.launch
import kotlinx.coroutines.withContext import kotlinx.coroutines.withContext
import okio.Buffer import okio.Buffer
import okio.BufferedSource import okio.BufferedSource
import timber.log.Timber
import uy.kohesive.injekt.injectLazy import uy.kohesive.injekt.injectLazy
import java.io.InputStream import java.io.InputStream
import kotlin.math.min import kotlin.math.min
@ -508,7 +508,7 @@ class PagerPageHolder(
try { try {
setBG(actualSource.peek().inputStream()) setBG(actualSource.peek().inputStream())
} catch (e: Exception) { } catch (e: Exception) {
Timber.e(e.localizedMessage) Logger.e { e.localizedMessage }
ColorDrawable(Color.WHITE) ColorDrawable(Color.WHITE)
} }
setImage(actualSource, false, imageConfig) setImage(actualSource, false, imageConfig)
@ -642,7 +642,7 @@ class PagerPageHolder(
val imageBitmap = try { val imageBitmap = try {
BitmapFactory.decodeStream(imageSource.inputStream()) BitmapFactory.decodeStream(imageSource.inputStream())
} catch (e: Exception) { } catch (e: Exception) {
Timber.e("Cannot split page ${e.message}") Logger.e { "Cannot split page ${e.message}" }
return imageSource return imageSource
} }
val isLTR = (viewer !is R2LPagerViewer).xor(viewer.config.invertDoublePages) val isLTR = (viewer !is R2LPagerViewer).xor(viewer.config.invertDoublePages)
@ -663,7 +663,7 @@ class PagerPageHolder(
} catch (e: Exception) { } catch (e: Exception) {
page.longPage = true page.longPage = true
splitDoublePages() splitDoublePages()
Timber.e("Cannot split page ${e.message}") Logger.e { "Cannot split page ${e.message}" }
return imageSource return imageSource
} }
val height = imageBitmap.height val height = imageBitmap.height
@ -696,7 +696,7 @@ class PagerPageHolder(
closeSources(imageSource2) closeSources(imageSource2)
page.fullPage = true page.fullPage = true
splitDoublePages() splitDoublePages()
Timber.e("Cannot combine pages ${e.message}") Logger.e { "Cannot combine pages ${e.message}" }
return supportHingeIfThere(imageSource) return supportHingeIfThere(imageSource)
} }
scope.launchUI { progressBar.setProgress(96) } scope.launchUI { progressBar.setProgress(96) }
@ -780,7 +780,7 @@ class PagerPageHolder(
extraPage?.fullPage = true extraPage?.fullPage = true
page.isolatedPage = true page.isolatedPage = true
splitDoublePages() splitDoublePages()
Timber.e("Cannot combine pages ${e.message}") Logger.e { "Cannot combine pages ${e.message}" }
return supportHingeIfThere(imageSource) return supportHingeIfThere(imageSource)
} }
scope.launchUI { progressBar.setProgress(97) } 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.children
import androidx.core.view.isVisible import androidx.core.view.isVisible
import androidx.viewpager.widget.ViewPager import androidx.viewpager.widget.ViewPager
import co.touchlab.kermit.Logger
import eu.kanade.tachiyomi.R import eu.kanade.tachiyomi.R
import eu.kanade.tachiyomi.data.download.DownloadManager import eu.kanade.tachiyomi.data.download.DownloadManager
import eu.kanade.tachiyomi.ui.reader.ReaderActivity 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 eu.kanade.tachiyomi.ui.reader.viewer.ViewerNavigation
import kotlinx.coroutines.MainScope import kotlinx.coroutines.MainScope
import kotlinx.coroutines.cancel import kotlinx.coroutines.cancel
import timber.log.Timber
import uy.kohesive.injekt.injectLazy import uy.kohesive.injekt.injectLazy
/** /**
@ -251,14 +251,14 @@ abstract class PagerViewer(val activity: ReaderActivity) : BaseViewer {
val offset = if (hasExtraPage) 1 else 0 val offset = if (hasExtraPage) 1 else 0
val pages = page.chapter.pages ?: return val pages = page.chapter.pages ?: return
if (hasExtraPage) { if (hasExtraPage) {
Timber.d("onReaderPageSelected: ${page.number}-${page.number + offset}/${pages.size}") Logger.d { "onReaderPageSelected: ${page.number}-${page.number + offset}/${pages.size}" }
} else { } 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 // Preload next chapter once we're within the last 5 pages of the current chapter
val inPreloadRange = pages.size - page.number < 5 val inPreloadRange = pages.size - page.number < 5
if (inPreloadRange && allowPreload && page.chapter == adapter.currentChapter) { 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 { adapter.nextTransition?.to?.let {
activity.requestPreloadChapter(it) activity.requestPreloadChapter(it)
} }
@ -270,10 +270,10 @@ abstract class PagerViewer(val activity: ReaderActivity) : BaseViewer {
* preload of the destination chapter of the transition. * preload of the destination chapter of the transition.
*/ */
private fun onTransitionSelected(transition: ChapterTransition) { private fun onTransitionSelected(transition: ChapterTransition) {
Timber.d("onTransitionSelected: $transition") Logger.d { "onTransitionSelected: $transition" }
val toChapter = transition.to val toChapter = transition.to
if (toChapter != null) { 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) activity.requestPreloadChapter(toChapter)
} else if (transition is ChapterTransition.Next) { } else if (transition is ChapterTransition.Next) {
// No more chapters, show menu because the user is probably going to close the reader // 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. * Sets the active [chapters] on this pager.
*/ */
private fun setChaptersInternal(chapters: ViewerChapters) { private fun setChaptersInternal(chapters: ViewerChapters) {
Timber.d("setChaptersInternal") Logger.d { "setChaptersInternal" }
val forceTransition = config.alwaysShowChapterTransition || adapter.joinedItems.getOrNull( val forceTransition = config.alwaysShowChapterTransition || adapter.joinedItems.getOrNull(
pager pager
.currentItem, .currentItem,
@ -341,7 +341,7 @@ abstract class PagerViewer(val activity: ReaderActivity) : BaseViewer {
// Layout the pager once a chapter is being set // Layout the pager once a chapter is being set
if (pager.visibility == View.GONE) { if (pager.visibility == View.GONE) {
Timber.d("Pager first layout") Logger.d { "Pager first layout" }
val pages = chapters.currChapter.pages ?: return val pages = chapters.currChapter.pages ?: return
moveToPage(pages[chapters.currChapter.requestedPage]) moveToPage(pages[chapters.currChapter.requestedPage])
pager.isVisible = true pager.isVisible = true
@ -353,7 +353,7 @@ abstract class PagerViewer(val activity: ReaderActivity) : BaseViewer {
* Tells this viewer to move to the given [page]. * Tells this viewer to move to the given [page].
*/ */
override fun moveToPage(page: ReaderPage, animated: Boolean) { override fun moveToPage(page: ReaderPage, animated: Boolean) {
Timber.d("moveToPage ${page.number}") Logger.d { "moveToPage ${page.number}" }
val position = adapter.joinedItems.indexOfFirst { val position = adapter.joinedItems.indexOfFirst {
it.first == page || it.second == page || it.first == page || it.second == page ||
( (
@ -378,7 +378,7 @@ abstract class PagerViewer(val activity: ReaderActivity) : BaseViewer {
) )
} }
} else { } 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.View
import android.view.ViewGroup import android.view.ViewGroup
import co.touchlab.kermit.Logger
import eu.kanade.tachiyomi.ui.reader.model.ChapterTransition import eu.kanade.tachiyomi.ui.reader.model.ChapterTransition
import eu.kanade.tachiyomi.ui.reader.model.InsertPage import eu.kanade.tachiyomi.ui.reader.model.InsertPage
import eu.kanade.tachiyomi.ui.reader.model.ReaderChapter 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.util.system.launchUI
import eu.kanade.tachiyomi.widget.ViewPagerAdapter import eu.kanade.tachiyomi.widget.ViewPagerAdapter
import kotlinx.coroutines.delay import kotlinx.coroutines.delay
import timber.log.Timber
import kotlin.math.max import kotlin.math.max
/** /**
@ -154,7 +154,7 @@ class PagerViewerAdapter(private val viewer: PagerViewer) : ViewPagerAdapter() {
if (position != -1) { if (position != -1) {
return position return position
} else { } else {
Timber.d("Position for ${view.item} not found") Logger.d { "Position for ${view.item} not found" }
} }
} }
return POSITION_NONE return POSITION_NONE

View file

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

View file

@ -11,6 +11,7 @@ import androidx.core.view.isGone
import androidx.core.view.isVisible import androidx.core.view.isVisible
import androidx.recyclerview.widget.RecyclerView import androidx.recyclerview.widget.RecyclerView
import androidx.recyclerview.widget.WebtoonLayoutManager import androidx.recyclerview.widget.WebtoonLayoutManager
import co.touchlab.kermit.Logger
import eu.kanade.tachiyomi.data.download.DownloadManager import eu.kanade.tachiyomi.data.download.DownloadManager
import eu.kanade.tachiyomi.ui.reader.ReaderActivity import eu.kanade.tachiyomi.ui.reader.ReaderActivity
import eu.kanade.tachiyomi.ui.reader.model.ChapterTransition 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 eu.kanade.tachiyomi.ui.reader.viewer.ViewerNavigation
import kotlinx.coroutines.MainScope import kotlinx.coroutines.MainScope
import kotlinx.coroutines.cancel import kotlinx.coroutines.cancel
import timber.log.Timber
import uy.kohesive.injekt.injectLazy import uy.kohesive.injekt.injectLazy
import kotlin.math.max import kotlin.math.max
import kotlin.math.min import kotlin.math.min
@ -186,15 +186,15 @@ class WebtoonViewer(val activity: ReaderActivity, val hasMargins: Boolean = fals
activity.onPageSelected(page, false) activity.onPageSelected(page, false)
val pages = page.chapter.pages ?: return 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 // Preload next chapter once we're within the last 5 pages of the current chapter
val inPreloadRange = pages.size - page.number < 5 val inPreloadRange = pages.size - page.number < 5
if (inPreloadRange && allowPreload && page.chapter == adapter.currentChapter) { 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 nextItem = adapter.items.getOrNull(adapter.items.size - 1)
val transitionChapter = (nextItem as? ChapterTransition.Next)?.to ?: (nextItem as?ReaderPage)?.chapter val transitionChapter = (nextItem as? ChapterTransition.Next)?.to ?: (nextItem as?ReaderPage)?.chapter
if (transitionChapter != null) { 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) activity.requestPreloadChapter(transitionChapter)
} }
} }
@ -205,10 +205,10 @@ class WebtoonViewer(val activity: ReaderActivity, val hasMargins: Boolean = fals
* preload of the destination chapter of the transition. * preload of the destination chapter of the transition.
*/ */
private fun onTransitionSelected(transition: ChapterTransition) { private fun onTransitionSelected(transition: ChapterTransition) {
Timber.d("onTransitionSelected: $transition") Logger.d { "onTransitionSelected: $transition" }
val toChapter = transition.to val toChapter = transition.to
if (toChapter != null) { 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) 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. * Tells this viewer to set the given [chapters] as active.
*/ */
override fun setChapters(chapters: ViewerChapters) { override fun setChapters(chapters: ViewerChapters) {
Timber.d("setChapters") Logger.d { "setChapters" }
val forceTransition = config.alwaysShowChapterTransition || currentPage is ChapterTransition val forceTransition = config.alwaysShowChapterTransition || currentPage is ChapterTransition
adapter.setChapters(chapters, forceTransition) adapter.setChapters(chapters, forceTransition)
if (recycler.isGone) { if (recycler.isGone) {
Timber.d("Recycler first layout") Logger.d { "Recycler first layout" }
val pages = chapters.currChapter.pages ?: return val pages = chapters.currChapter.pages ?: return
moveToPage(pages[min(chapters.currChapter.requestedPage, pages.lastIndex)]) moveToPage(pages[min(chapters.currChapter.requestedPage, pages.lastIndex)])
recycler.isVisible = true 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]. * Tells this viewer to move to the given [page].
*/ */
override fun moveToPage(page: ReaderPage, animated: Boolean) { override fun moveToPage(page: ReaderPage, animated: Boolean) {
Timber.d("moveToPage") Logger.d { "moveToPage" }
val position = adapter.items.indexOf(page) val position = adapter.items.indexOf(page)
if (position != -1) { if (position != -1) {
recycler.scrollToPosition(position) recycler.scrollToPosition(position)
@ -241,7 +241,7 @@ class WebtoonViewer(val activity: ReaderActivity, val hasMargins: Boolean = fals
onScrolled(position) onScrolled(position)
} }
} else { } 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.core.net.toUri
import androidx.lifecycle.lifecycleScope import androidx.lifecycle.lifecycleScope
import androidx.preference.PreferenceScreen import androidx.preference.PreferenceScreen
import co.touchlab.kermit.Logger
import com.hippo.unifile.UniFile import com.hippo.unifile.UniFile
import dev.yokai.domain.base.BasePreferences.ExtensionInstaller import dev.yokai.domain.base.BasePreferences.ExtensionInstaller
import dev.yokai.domain.extension.interactor.TrustExtension 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.ui.setting.titleRes
import eu.kanade.tachiyomi.util.CrashLogUtil import eu.kanade.tachiyomi.util.CrashLogUtil
import eu.kanade.tachiyomi.util.system.disableItems 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.isPackageInstalled
import eu.kanade.tachiyomi.util.system.launchIO import eu.kanade.tachiyomi.util.system.launchIO
import eu.kanade.tachiyomi.util.system.launchUI import eu.kanade.tachiyomi.util.system.launchUI
@ -73,7 +75,6 @@ import kotlinx.coroutines.Job
import kotlinx.coroutines.launch import kotlinx.coroutines.launch
import okhttp3.Headers import okhttp3.Headers
import rikka.sui.Sui import rikka.sui.Sui
import timber.log.Timber
import uy.kohesive.injekt.Injekt import uy.kohesive.injekt.Injekt
import uy.kohesive.injekt.api.get import uy.kohesive.injekt.api.get
import uy.kohesive.injekt.injectLazy import uy.kohesive.injekt.injectLazy
@ -455,7 +456,7 @@ class SettingsAdvancedController : SettingsLegacyController() {
activity?.applicationInfo?.dataDir?.let { File("$it/app_webview/").deleteRecursively() } activity?.applicationInfo?.dataDir?.let { File("$it/app_webview/").deleteRecursively() }
activity?.toast(R.string.webview_data_deleted) activity?.toast(R.string.webview_data_deleted)
} catch (e: Throwable) { } catch (e: Throwable) {
Timber.e(e) Logger.e(e)
activity?.toast(R.string.cache_delete_error) 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.DividerItemDecoration
import androidx.recyclerview.widget.LinearLayoutManager import androidx.recyclerview.widget.LinearLayoutManager
import androidx.recyclerview.widget.RecyclerView import androidx.recyclerview.widget.RecyclerView
import co.touchlab.kermit.Logger
import com.bluelinelabs.conductor.ControllerChangeHandler import com.bluelinelabs.conductor.ControllerChangeHandler
import com.bluelinelabs.conductor.ControllerChangeType import com.bluelinelabs.conductor.ControllerChangeType
import com.google.android.material.snackbar.Snackbar 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.addOrRemoveToFavorites
import eu.kanade.tachiyomi.util.system.connectivityManager import eu.kanade.tachiyomi.util.system.connectivityManager
import eu.kanade.tachiyomi.util.system.dpToPx 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.openInBrowser
import eu.kanade.tachiyomi.util.system.toast import eu.kanade.tachiyomi.util.system.toast
import eu.kanade.tachiyomi.util.view.activityBinding 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.AutofitRecyclerView
import eu.kanade.tachiyomi.widget.EmptyView import eu.kanade.tachiyomi.widget.EmptyView
import eu.kanade.tachiyomi.widget.LinearLayoutManagerAccurateOffset import eu.kanade.tachiyomi.widget.LinearLayoutManagerAccurateOffset
import timber.log.Timber
import uy.kohesive.injekt.injectLazy import uy.kohesive.injekt.injectLazy
import kotlin.math.roundToInt import kotlin.math.roundToInt
@ -555,7 +556,7 @@ open class BrowseSourceController(bundle: Bundle) :
* @param error the error received. * @param error the error received.
*/ */
fun onAddPageError(error: Throwable) { fun onAddPageError(error: Throwable) {
Timber.e(error) Logger.e(error)
val adapter = adapter ?: return val adapter = adapter ?: return
adapter.onLoadMoreComplete(null) adapter.onLoadMoreComplete(null)
hideProgressBar() hideProgressBar()

View file

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

View file

@ -11,6 +11,7 @@ import android.webkit.WebView
import androidx.activity.OnBackPressedCallback import androidx.activity.OnBackPressedCallback
import androidx.activity.addCallback import androidx.activity.addCallback
import androidx.core.graphics.ColorUtils import androidx.core.graphics.ColorUtils
import co.touchlab.kermit.Logger
import eu.kanade.tachiyomi.R import eu.kanade.tachiyomi.R
import eu.kanade.tachiyomi.network.NetworkHelper import eu.kanade.tachiyomi.network.NetworkHelper
import eu.kanade.tachiyomi.source.SourceManager 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.openInBrowser
import eu.kanade.tachiyomi.util.system.toast import eu.kanade.tachiyomi.util.system.toast
import okhttp3.HttpUrl.Companion.toHttpUrl import okhttp3.HttpUrl.Companion.toHttpUrl
import timber.log.Timber
import uy.kohesive.injekt.injectLazy import uy.kohesive.injekt.injectLazy
open class WebViewActivity : BaseWebViewActivity() { open class WebViewActivity : BaseWebViewActivity() {
@ -70,7 +70,7 @@ open class WebViewActivity : BaseWebViewActivity() {
try { try {
headers = source.headers.toMultimap().mapValues { it.value.getOrNull(0) ?: "" } headers = source.headers.toMultimap().mapValues { it.value.getOrNull(0) ?: "" }
} catch (e: Exception) { } 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.view.View
import android.widget.Toast import android.widget.Toast
import androidx.appcompat.app.AlertDialog import androidx.appcompat.app.AlertDialog
import co.touchlab.kermit.Logger
import com.bluelinelabs.conductor.Controller import com.bluelinelabs.conductor.Controller
import com.google.android.material.snackbar.BaseTransientBottomBar import com.google.android.material.snackbar.BaseTransientBottomBar
import com.google.android.material.snackbar.Snackbar 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.snack
import eu.kanade.tachiyomi.util.view.withFadeTransaction import eu.kanade.tachiyomi.util.view.withFadeTransaction
import eu.kanade.tachiyomi.widget.TriStateCheckBox import eu.kanade.tachiyomi.widget.TriStateCheckBox
import timber.log.Timber
import uy.kohesive.injekt.Injekt import uy.kohesive.injekt.Injekt
import uy.kohesive.injekt.api.get import uy.kohesive.injekt.api.get
import java.util.Date import java.util.*
import java.util.Locale
fun Manga.isLocal() = source == LocalSource.ID fun Manga.isLocal() = source == LocalSource.ID
@ -413,7 +412,7 @@ fun Manga.autoAddTrack(db: DatabaseHelper, onMangaMoved: () -> Unit) {
} }
} }
} catch (e: Exception) { } 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 package eu.kanade.tachiyomi.util.chapter
import co.touchlab.kermit.Logger
import eu.kanade.tachiyomi.data.database.DatabaseHelper import eu.kanade.tachiyomi.data.database.DatabaseHelper
import eu.kanade.tachiyomi.data.database.models.Chapter import eu.kanade.tachiyomi.data.database.models.Chapter
import eu.kanade.tachiyomi.data.database.models.Track 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.DelayedTrackingUpdateJob
import eu.kanade.tachiyomi.data.track.TrackManager import eu.kanade.tachiyomi.data.track.TrackManager
import eu.kanade.tachiyomi.data.track.TrackService 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.isOnline
import eu.kanade.tachiyomi.util.system.launchIO import eu.kanade.tachiyomi.util.system.launchIO
import eu.kanade.tachiyomi.util.system.w
import kotlinx.coroutines.Job import kotlinx.coroutines.Job
import kotlinx.coroutines.delay import kotlinx.coroutines.delay
import timber.log.Timber
import uy.kohesive.injekt.Injekt import uy.kohesive.injekt.Injekt
import uy.kohesive.injekt.api.get import uy.kohesive.injekt.api.get
@ -41,7 +43,7 @@ fun syncChaptersWithTrackServiceTwoWay(db: DatabaseHelper, chapters: List<Chapte
service.update(remoteTrack) service.update(remoteTrack)
db.insertTrack(remoteTrack).executeAsBlocking() db.insertTrack(remoteTrack).executeAsBlocking()
} catch (e: Throwable) { } catch (e: Throwable) {
Timber.w(e) Logger.w(e)
} }
} }
} }
@ -100,7 +102,7 @@ suspend fun updateTrackChapterRead(
service.update(track, true) service.update(track, true)
db.insertTrack(track).executeAsBlocking() db.insertTrack(track).executeAsBlocking()
} catch (e: Exception) { } catch (e: Exception) {
Timber.e(e) Logger.e(e)
failures.add(service to e.localizedMessage) failures.add(service to e.localizedMessage)
if (retryWhenOnline) { if (retryWhenOnline) {
delayTrackingUpdate(preferences, mangaId, newChapterRead, track) delayTrackingUpdate(preferences, mangaId, newChapterRead, track)

View file

@ -7,6 +7,7 @@ import android.content.pm.ShortcutManager
import android.graphics.Bitmap import android.graphics.Bitmap
import android.graphics.drawable.BitmapDrawable import android.graphics.drawable.BitmapDrawable
import android.graphics.drawable.Icon import android.graphics.drawable.Icon
import co.touchlab.kermit.Logger
import coil3.imageLoader import coil3.imageLoader
import coil3.request.ImageRequest import coil3.request.ImageRequest
import eu.kanade.tachiyomi.R 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.recents.RecentsPresenter
import eu.kanade.tachiyomi.ui.source.browse.BrowseSourceController import eu.kanade.tachiyomi.ui.source.browse.BrowseSourceController
import eu.kanade.tachiyomi.util.system.launchIO import eu.kanade.tachiyomi.util.system.launchIO
import timber.log.Timber
import uy.kohesive.injekt.Injekt import uy.kohesive.injekt.Injekt
import uy.kohesive.injekt.api.get import uy.kohesive.injekt.api.get
import kotlin.math.min 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 shortcutManager.dynamicShortcuts = shortcuts
} }
} }

View file

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

View file

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

View file

@ -23,13 +23,13 @@ import androidx.core.graphics.blue
import androidx.core.graphics.green import androidx.core.graphics.green
import androidx.core.graphics.red import androidx.core.graphics.red
import androidx.core.graphics.scale import androidx.core.graphics.scale
import co.touchlab.kermit.Logger
import com.hippo.unifile.UniFile import com.hippo.unifile.UniFile
import eu.kanade.tachiyomi.R import eu.kanade.tachiyomi.R
import okio.Buffer import okio.Buffer
import okio.BufferedSource import okio.BufferedSource
import tachiyomi.decoder.Format import tachiyomi.decoder.Format
import tachiyomi.decoder.ImageDecoder import tachiyomi.decoder.ImageDecoder
import timber.log.Timber
import java.io.File import java.io.File
import java.io.FileOutputStream import java.io.FileOutputStream
import java.io.InputStream import java.io.InputStream
@ -553,7 +553,7 @@ object ImageUtil {
} }
if (bitmapRegionDecoder == null) { if (bitmapRegionDecoder == null) {
Timber.d("Failed to create new instance of BitmapRegionDecoder") Logger.d { "Failed to create new instance of BitmapRegionDecoder" }
return false return false
} }
@ -573,9 +573,9 @@ object ImageUtil {
splitBitmap.compress(Bitmap.CompressFormat.JPEG, 100, outputStream) splitBitmap.compress(Bitmap.CompressFormat.JPEG, 100, outputStream)
splitBitmap.recycle() splitBitmap.recycle()
} }
Timber.d( Logger.d {
"Success: Split #${splitData.index + 1} with topOffset=${splitData.topOffset} height=${splitData.splitHeight} bottomOffset=${splitData.bottomOffset}", "Success: Split #${splitData.index + 1} with topOffset=${splitData.topOffset} height=${splitData.splitHeight} bottomOffset=${splitData.bottomOffset}"
) }
} }
imageFile.delete() imageFile.delete()
true true
@ -584,7 +584,7 @@ object ImageUtil {
splitDataList splitDataList
.map { splitImagePath(imageFilePath, it.index) } .map { splitImagePath(imageFilePath, it.index) }
.forEach { File(it).delete() } .forEach { File(it).delete() }
Timber.e(e) Logger.e(e)
false false
} finally { } finally {
bitmapRegionDecoder.recycle() bitmapRegionDecoder.recycle()
@ -605,9 +605,9 @@ object ImageUtil {
val partCount = (imageHeight - 1) / optimalImageHeight + 1 val partCount = (imageHeight - 1) / optimalImageHeight + 1
val optimalSplitHeight = imageHeight / partCount val optimalSplitHeight = imageHeight / partCount
Timber.d( Logger.d {
"Splitting image with height of $imageHeight into $partCount part with estimated ${optimalSplitHeight}px height per split", "Splitting image with height of $imageHeight into $partCount part with estimated ${optimalSplitHeight}px height per split"
) }
return mutableListOf<SplitData>().apply { return mutableListOf<SplitData>().apply {
val range = 0 until partCount 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.CookieManager
import android.webkit.WebSettings import android.webkit.WebSettings
import android.webkit.WebView import android.webkit.WebView
import timber.log.Timber import co.touchlab.kermit.Logger
object WebViewUtil { object WebViewUtil {
const val MINIMUM_WEBVIEW_VERSION = 114 const val MINIMUM_WEBVIEW_VERSION = 114
@ -17,7 +17,7 @@ object WebViewUtil {
// is not installed // is not installed
CookieManager.getInstance() CookieManager.getInstance()
} catch (e: Throwable) { } catch (e: Throwable) {
Timber.e(e) Logger.e(e)
return false 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" } guava = { module = "com.google.guava:guava", version = "31.1-android" }
image-decoder = { module = "com.github.tachiyomiorg:image-decoder", version = "e08e9be535" } image-decoder = { module = "com.github.tachiyomiorg:image-decoder", version = "e08e9be535" }
injekt-core = { module = "com.github.inorichi.injekt:injekt-core", version = "65b0440" } 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 = { module = "com.google.android.material:material", version = "1.12.0" }
material-design-dimens = { module = "com.dmitrymalkovich.android:material-design-dimens", version = "1.4" } material-design-dimens = { module = "com.dmitrymalkovich.android:material-design-dimens", version = "1.4" }
markwon = { module = "io.noties.markwon:core", version = "4.6.2" } 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-api = { module = "dev.rikka.shizuku:api", version.ref = "shizuku" }
shizuku-provider = { module = "dev.rikka.shizuku:provider", version.ref = "shizuku" } shizuku-provider = { module = "dev.rikka.shizuku:provider", version.ref = "shizuku" }
taptargetview = { module = "com.getkeepsafe.taptargetview:taptargetview", version = "1.13.3" } 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" } oss-licenses-plugin = { module = "com.google.android.gms:oss-licenses-plugin", version = "0.10.6" }
unifile = { module = "com.github.tachiyomiorg:unifile", version = "7c257e1c64" } unifile = { module = "com.github.tachiyomiorg:unifile", version = "7c257e1c64" }
viewstatepageradapter = { module = "com.nightlynexus.viewstatepageradapter:viewstatepageradapter", version = "1.1.0" } viewstatepageradapter = { module = "com.nightlynexus.viewstatepageradapter:viewstatepageradapter", version = "1.1.0" }