Upgrade logging, now maps timber to XLog, new logging functions

This commit is contained in:
Jobobby04 2021-03-07 00:23:23 -05:00
parent 9457b832fc
commit 7e91ae02f1
31 changed files with 226 additions and 112 deletions

View File

@ -289,7 +289,7 @@ dependencies {
implementation("com.google.firebase:firebase-crashlytics-ktx:17.3.1") implementation("com.google.firebase:firebase-crashlytics-ktx:17.3.1")
// Better logging (EH) // Better logging (EH)
implementation("com.elvishew:xlog:1.7.1") implementation("com.elvishew:xlog:1.8.0")
// Debug utils (EH) // Debug utils (EH)
val debugOverlayVersion = "1.1.3" val debugOverlayVersion = "1.1.3"
@ -307,7 +307,7 @@ dependencies {
implementation("androidx.gridlayout:gridlayout:1.0.0") implementation("androidx.gridlayout:gridlayout:1.0.0")
implementation("com.mikepenz:fastadapter:5.3.4") implementation("com.mikepenz:fastadapter:5.3.4")
// SY --> // SY <--
} }
tasks { tasks {

View File

@ -22,7 +22,6 @@ import com.elvishew.xlog.printer.file.naming.DateFileNameGenerator
import com.google.android.gms.common.GooglePlayServicesNotAvailableException import com.google.android.gms.common.GooglePlayServicesNotAvailableException
import com.google.android.gms.common.GooglePlayServicesRepairableException import com.google.android.gms.common.GooglePlayServicesRepairableException
import com.google.android.gms.security.ProviderInstaller import com.google.android.gms.security.ProviderInstaller
import com.google.firebase.analytics.FirebaseAnalytics
import com.google.firebase.analytics.ktx.analytics import com.google.firebase.analytics.ktx.analytics
import com.google.firebase.ktx.Firebase import com.google.firebase.ktx.Firebase
import com.ms_square.debugoverlay.DebugOverlay import com.ms_square.debugoverlay.DebugOverlay
@ -36,6 +35,9 @@ import exh.log.CrashlyticsPrinter
import exh.log.EHDebugModeOverlay import exh.log.EHDebugModeOverlay
import exh.log.EHLogLevel import exh.log.EHLogLevel
import exh.log.EnhancedFilePrinter import exh.log.EnhancedFilePrinter
import exh.log.XLogTree
import exh.log.xLogD
import exh.log.xLogE
import exh.syDebugVersion import exh.syDebugVersion
import io.realm.Realm import io.realm.Realm
import org.conscrypt.Conscrypt import org.conscrypt.Conscrypt
@ -55,12 +57,11 @@ open class App : Application(), LifecycleObserver {
private val preferences: PreferencesHelper by injectLazy() private val preferences: PreferencesHelper by injectLazy()
private lateinit var firebaseAnalytics: FirebaseAnalytics
override fun onCreate() { override fun onCreate() {
super.onCreate() super.onCreate()
if (BuildConfig.DEBUG) Timber.plant(Timber.DebugTree()) // if (BuildConfig.DEBUG) Timber.plant(Timber.DebugTree())
setupExhLogging() // EXH logging setupExhLogging() // EXH logging
Timber.plant(XLogTree()) // SY Redirect Timber to XLog
if (!BuildConfig.DEBUG) addAnalytics() if (!BuildConfig.DEBUG) addAnalytics()
workaroundAndroid7BrokenSSL() workaroundAndroid7BrokenSSL()
@ -100,23 +101,22 @@ open class App : Application(), LifecycleObserver {
try { try {
SSLContext.getInstance("TLSv1.2") SSLContext.getInstance("TLSv1.2")
} catch (e: NoSuchAlgorithmException) { } catch (e: NoSuchAlgorithmException) {
XLog.tag("Init").e("Could not install Android 7 broken SSL workaround!", e) xLogE("Could not install Android 7 broken SSL workaround!", e)
} }
try { try {
ProviderInstaller.installIfNeeded(applicationContext) ProviderInstaller.installIfNeeded(applicationContext)
} catch (e: GooglePlayServicesRepairableException) { } catch (e: GooglePlayServicesRepairableException) {
XLog.tag("Init").e("Could not install Android 7 broken SSL workaround!", e) xLogE("Could not install Android 7 broken SSL workaround!", e)
} catch (e: GooglePlayServicesNotAvailableException) { } catch (e: GooglePlayServicesNotAvailableException) {
XLog.tag("Init").e("Could not install Android 7 broken SSL workaround!", e) xLogE("Could not install Android 7 broken SSL workaround!", e)
} }
} }
} }
private fun addAnalytics() { private fun addAnalytics() {
firebaseAnalytics = Firebase.analytics
if (syDebugVersion != "0") { if (syDebugVersion != "0") {
firebaseAnalytics.setUserProperty("preview_version", syDebugVersion) Firebase.analytics.setUserProperty("preview_version", syDebugVersion)
} }
} }
@ -137,8 +137,8 @@ open class App : Application(), LifecycleObserver {
EHLogLevel.init(this) EHLogLevel.init(this)
val logLevel = when { val logLevel = when {
EHLogLevel.shouldLog(EHLogLevel.EXTRA) -> LogLevel.ALL EHLogLevel.shouldLog(EHLogLevel.EXTREME) -> LogLevel.ALL
BuildConfig.DEBUG -> LogLevel.DEBUG EHLogLevel.shouldLog(EHLogLevel.EXTRA) || BuildConfig.DEBUG -> LogLevel.DEBUG
else -> LogLevel.WARN else -> LogLevel.WARN
} }
@ -160,9 +160,8 @@ open class App : Application(), LifecycleObserver {
@OptIn(ExperimentalTime::class) @OptIn(ExperimentalTime::class)
printers += EnhancedFilePrinter printers += EnhancedFilePrinter
.Builder(logFolder.absolutePath) .Builder(logFolder.absolutePath) {
.fileNameGenerator( fileNameGenerator = object : DateFileNameGenerator() {
object : DateFileNameGenerator() {
override fun generateFileName(logLevel: Int, timestamp: Long): String { override fun generateFileName(logLevel: Int, timestamp: Long): String {
return super.generateFileName( return super.generateFileName(
logLevel, logLevel,
@ -170,13 +169,12 @@ open class App : Application(), LifecycleObserver {
) + "-${BuildConfig.BUILD_TYPE}.log" ) + "-${BuildConfig.BUILD_TYPE}.log"
} }
} }
) flattener { timeMillis, level, tag, message ->
.flattener { timeMillis, level, tag, message -> "${dateFormat.format(timeMillis)} ${LogLevel.getShortLevelName(level)}/$tag: $message"
"${dateFormat.format(timeMillis)} ${LogLevel.getShortLevelName(level)}/$tag: $message" }
cleanStrategy = FileLastModifiedCleanStrategy(7.days.toLongMilliseconds())
backupStrategy = NeverBackupStrategy()
} }
.cleanStrategy(FileLastModifiedCleanStrategy(7.days.toLongMilliseconds()))
.backupStrategy(NeverBackupStrategy())
.build()
// Install Crashlytics in prod // Install Crashlytics in prod
if (!BuildConfig.DEBUG) { if (!BuildConfig.DEBUG) {
@ -188,8 +186,8 @@ open class App : Application(), LifecycleObserver {
*printers.toTypedArray() *printers.toTypedArray()
) )
XLog.tag("Init").d("Application booting...") xLogD("Application booting...")
XLog.tag("Init").d( xLogD(
"App version: ${BuildConfig.VERSION_NAME} (${BuildConfig.FLAVOR}, ${BuildConfig.COMMIT_SHA}, ${BuildConfig.VERSION_CODE})\n" + "App version: ${BuildConfig.VERSION_NAME} (${BuildConfig.FLAVOR}, ${BuildConfig.COMMIT_SHA}, ${BuildConfig.VERSION_CODE})\n" +
"Preview build: $syDebugVersion\n" + "Preview build: $syDebugVersion\n" +
"Android version: ${Build.VERSION.RELEASE} (SDK ${Build.VERSION.SDK_INT}) \n" + "Android version: ${Build.VERSION.RELEASE} (SDK ${Build.VERSION.SDK_INT}) \n" +
@ -214,7 +212,7 @@ open class App : Application(), LifecycleObserver {
.install() .install()
} catch (e: IllegalStateException) { } catch (e: IllegalStateException) {
// Crashes if app is in background // Crashes if app is in background
XLog.tag("Init").e("Failed to initialize debug overlay, app in background?", e) xLogE("Failed to initialize debug overlay, app in background?", e)
} }
} }
} }

View File

@ -3,7 +3,6 @@ package eu.kanade.tachiyomi.extension
import android.content.Context import android.content.Context
import android.graphics.drawable.Drawable import android.graphics.drawable.Drawable
import androidx.core.content.ContextCompat import androidx.core.content.ContextCompat
import com.elvishew.xlog.XLog
import com.jakewharton.rxrelay.BehaviorRelay import com.jakewharton.rxrelay.BehaviorRelay
import eu.kanade.tachiyomi.R import eu.kanade.tachiyomi.R
import eu.kanade.tachiyomi.data.preference.PreferencesHelper import eu.kanade.tachiyomi.data.preference.PreferencesHelper
@ -19,6 +18,7 @@ import eu.kanade.tachiyomi.source.Source
import eu.kanade.tachiyomi.source.SourceManager import eu.kanade.tachiyomi.source.SourceManager
import eu.kanade.tachiyomi.util.lang.launchNow import eu.kanade.tachiyomi.util.lang.launchNow
import eu.kanade.tachiyomi.util.system.toast import eu.kanade.tachiyomi.util.system.toast
import exh.log.xLogD
import exh.source.BlacklistedSources import exh.source.BlacklistedSources
import exh.source.EH_SOURCE_ID import exh.source.EH_SOURCE_ID
import exh.source.EXH_SOURCE_ID import exh.source.EXH_SOURCE_ID
@ -158,7 +158,7 @@ class ExtensionManager(
val blacklistEnabled = preferences.enableSourceBlacklist().get() val blacklistEnabled = preferences.enableSourceBlacklist().get()
return filter { return filter {
if (it.isBlacklisted(blacklistEnabled)) { if (it.isBlacklisted(blacklistEnabled)) {
XLog.tag("ExtensionManager").d("Removing blacklisted extension: (name: %s, pkgName: %s)!", it.name, it.pkgName) xLogD("Removing blacklisted extension: (name: %s, pkgName: %s)!", it.name, it.pkgName)
false false
} else true } else true
} }
@ -333,7 +333,7 @@ class ExtensionManager(
private fun registerNewExtension(extension: Extension.Installed) { private fun registerNewExtension(extension: Extension.Installed) {
// SY --> // SY -->
if (extension.isBlacklisted()) { if (extension.isBlacklisted()) {
XLog.tag("ExtensionManager").d("Removing blacklisted extension: (name: String, pkgName: %s)!", extension.name, extension.pkgName) xLogD("Removing blacklisted extension: (name: String, pkgName: %s)!", extension.name, extension.pkgName)
return return
} }
// SY <-- // SY <--
@ -351,7 +351,7 @@ class ExtensionManager(
private fun registerUpdatedExtension(extension: Extension.Installed) { private fun registerUpdatedExtension(extension: Extension.Installed) {
// SY --> // SY -->
if (extension.isBlacklisted()) { if (extension.isBlacklisted()) {
XLog.tag("ExtensionManager").d("Removing blacklisted extension: (name: String, pkgName: %s)!", extension.name, extension.pkgName) xLogD("Removing blacklisted extension: (name: %s, pkgName: %s)!", extension.name, extension.pkgName)
return return
} }
// SY <-- // SY <--

View File

@ -1,7 +1,6 @@
package eu.kanade.tachiyomi.source package eu.kanade.tachiyomi.source
import android.content.Context import android.content.Context
import com.elvishew.xlog.XLog
import eu.kanade.tachiyomi.R import eu.kanade.tachiyomi.R
import eu.kanade.tachiyomi.data.preference.PreferencesHelper import eu.kanade.tachiyomi.data.preference.PreferencesHelper
import eu.kanade.tachiyomi.source.model.Page import eu.kanade.tachiyomi.source.model.Page
@ -19,6 +18,7 @@ import eu.kanade.tachiyomi.source.online.english.HBrowse
import eu.kanade.tachiyomi.source.online.english.HentaiCafe import eu.kanade.tachiyomi.source.online.english.HentaiCafe
import eu.kanade.tachiyomi.source.online.english.Pururin import eu.kanade.tachiyomi.source.online.english.Pururin
import eu.kanade.tachiyomi.source.online.english.Tsumino import eu.kanade.tachiyomi.source.online.english.Tsumino
import exh.log.xLogD
import exh.source.BlacklistedSources import exh.source.BlacklistedSources
import exh.source.DelegatedHttpSource import exh.source.DelegatedHttpSource
import exh.source.EH_SOURCE_ID import exh.source.EH_SOURCE_ID
@ -115,7 +115,7 @@ open class SourceManager(private val context: Context) {
} else DELEGATED_SOURCES[sourceQName] } else DELEGATED_SOURCES[sourceQName]
} else null } else null
val newSource = if (source is HttpSource && delegate != null) { val newSource = if (source is HttpSource && delegate != null) {
XLog.tag("SourceManager").d("Delegating source: %s -> %s!", sourceQName, delegate.newSourceClass.qualifiedName) xLogD("Delegating source: %s -> %s!", sourceQName, delegate.newSourceClass.qualifiedName)
val enhancedSource = EnhancedHttpSource( val enhancedSource = EnhancedHttpSource(
source, source,
delegate.newSourceClass.constructors.find { it.parameters.size == 2 }!!.call(source, context) delegate.newSourceClass.constructors.find { it.parameters.size == 2 }!!.call(source, context)
@ -132,7 +132,7 @@ open class SourceManager(private val context: Context) {
} else source } else source
if (source.id in BlacklistedSources.BLACKLISTED_EXT_SOURCES) { if (source.id in BlacklistedSources.BLACKLISTED_EXT_SOURCES) {
XLog.tag("SourceManager").d("Removing blacklisted source: (id: %s, name: %s, lang: %s)!", source.id, source.name, (source as? CatalogueSource)?.lang) xLogD("Removing blacklisted source: (id: %s, name: %s, lang: %s)!", source.id, source.name, (source as? CatalogueSource)?.lang)
return return
} }
// EXH <-- // EXH <--

View File

@ -3,7 +3,6 @@ package eu.kanade.tachiyomi.source.online.all
import android.content.Context import android.content.Context
import android.net.Uri import android.net.Uri
import androidx.core.net.toUri import androidx.core.net.toUri
import com.elvishew.xlog.XLog
import eu.kanade.tachiyomi.annotations.Nsfw import eu.kanade.tachiyomi.annotations.Nsfw
import eu.kanade.tachiyomi.data.database.models.Manga import eu.kanade.tachiyomi.data.database.models.Manga
import eu.kanade.tachiyomi.data.preference.PreferencesHelper import eu.kanade.tachiyomi.data.preference.PreferencesHelper
@ -31,6 +30,7 @@ import exh.eh.EHTags
import exh.eh.EHentaiUpdateHelper import exh.eh.EHentaiUpdateHelper
import exh.eh.EHentaiUpdateWorkerConstants import exh.eh.EHentaiUpdateWorkerConstants
import exh.eh.GalleryEntry import exh.eh.GalleryEntry
import exh.log.xLogD
import exh.metadata.MetadataUtil import exh.metadata.MetadataUtil
import exh.metadata.metadata.EHentaiSearchMetadata import exh.metadata.metadata.EHentaiSearchMetadata
import exh.metadata.metadata.EHentaiSearchMetadata.Companion.EH_GENRE_NAMESPACE import exh.metadata.metadata.EHentaiSearchMetadata.Companion.EH_GENRE_NAMESPACE
@ -325,7 +325,7 @@ class EHentai(
url = EHentaiSearchMetadata.normalizeUrl(parentLink) url = EHentaiSearchMetadata.normalizeUrl(parentLink)
} else break } else break
} else { } else {
XLog.tag("EHentai").d("Parent cache hit: %s!", gid) xLogD("Parent cache hit: %s!", gid)
url = EHentaiSearchMetadata.idAndTokenToUrl( url = EHentaiSearchMetadata.idAndTokenToUrl(
cachedParent.gId, cachedParent.gId,
cachedParent.gToken cachedParent.gToken
@ -613,7 +613,7 @@ class EHentai(
lastUpdateCheck - datePosted!! > EHentaiUpdateWorkerConstants.GALLERY_AGE_TIME lastUpdateCheck - datePosted!! > EHentaiUpdateWorkerConstants.GALLERY_AGE_TIME
) { ) {
aged = true aged = true
XLog.tag("EHentai").d("aged %s - too old", title) xLogD("aged %s - too old", title)
} }
// Parse ratings // Parse ratings
@ -879,7 +879,7 @@ class EHentai(
stringBuilder.append(" ") stringBuilder.append(" ")
} }
XLog.tag("EHentai").d(stringBuilder.toString()) xLogD(stringBuilder.toString())
return stringBuilder.toString().trim() return stringBuilder.toString().trim()
} }

View File

@ -1,6 +1,5 @@
package eu.kanade.tachiyomi.source.online.all package eu.kanade.tachiyomi.source.online.all
import com.elvishew.xlog.XLog
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.Manga import eu.kanade.tachiyomi.data.database.models.Manga
@ -19,6 +18,7 @@ import eu.kanade.tachiyomi.source.online.HttpSource
import eu.kanade.tachiyomi.util.chapter.syncChaptersWithSource import eu.kanade.tachiyomi.util.chapter.syncChaptersWithSource
import eu.kanade.tachiyomi.util.lang.withIOContext import eu.kanade.tachiyomi.util.lang.withIOContext
import eu.kanade.tachiyomi.util.shouldDownloadNewChapters import eu.kanade.tachiyomi.util.shouldDownloadNewChapters
import exh.log.xLogW
import exh.merged.sql.models.MergedMangaReference import exh.merged.sql.models.MergedMangaReference
import exh.source.MERGED_SOURCE_ID import exh.source.MERGED_SOURCE_ID
import exh.util.executeOnIO import exh.util.executeOnIO
@ -185,7 +185,7 @@ class MergedSource : HttpSource() {
mangaId = manga.id mangaId = manga.id
db.insertNewMergedMangaId(this).executeOnIO() db.insertNewMergedMangaId(this).executeOnIO()
} catch (e: Exception) { } catch (e: Exception) {
XLog.tag("MergedSource").enableStackTrace(e.stackTrace.contentToString(), 5) xLogW("Error inserting merged manga id", e)
} }
} }
return LoadedMangaSource(source, manga, this) return LoadedMangaSource(source, manga, this)

View File

@ -17,7 +17,6 @@ import androidx.recyclerview.widget.RecyclerView
import com.afollestad.materialdialogs.MaterialDialog import com.afollestad.materialdialogs.MaterialDialog
import com.afollestad.materialdialogs.input.input import com.afollestad.materialdialogs.input.input
import com.afollestad.materialdialogs.list.listItems import com.afollestad.materialdialogs.list.listItems
import com.elvishew.xlog.XLog
import com.google.android.material.floatingactionbutton.ExtendedFloatingActionButton import com.google.android.material.floatingactionbutton.ExtendedFloatingActionButton
import com.google.android.material.snackbar.Snackbar import com.google.android.material.snackbar.Snackbar
import com.tfcporciuncula.flow.Preference import com.tfcporciuncula.flow.Preference
@ -57,6 +56,7 @@ import eu.kanade.tachiyomi.util.view.shrinkOnScroll
import eu.kanade.tachiyomi.util.view.snack import eu.kanade.tachiyomi.util.view.snack
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 exh.log.xLogW
import exh.md.similar.ui.EnableMangaDexSimilarDialogController import exh.md.similar.ui.EnableMangaDexSimilarDialogController
import exh.savedsearches.EXHSavedSearch import exh.savedsearches.EXHSavedSearch
import exh.source.getMainSource import exh.source.getMainSource
@ -542,8 +542,8 @@ open class BrowseSourceController(bundle: Bundle) :
*/ */
/* SY --> */ open /* SY <-- */fun onAddPageError(error: Throwable) { /* SY --> */ open /* SY <-- */fun onAddPageError(error: Throwable) {
// SY --> // SY -->
XLog.tag("BrowseSourceController").enableStackTrace(2).w("> Failed to load next catalogue page!", error) xLogW("> Failed to load next catalogue page!", error)
XLog.tag("BrowseSourceController").enableStackTrace(2).w( xLogW(
"> (source.id: %s, source.name: %s)", "> (source.id: %s, source.name: %s)",
presenter.source.id, presenter.source.id,
presenter.source.name presenter.source.name

View File

@ -7,7 +7,6 @@ import android.widget.AutoCompleteTextView
import android.widget.TextView import android.widget.TextView
import androidx.core.widget.addTextChangedListener import androidx.core.widget.addTextChangedListener
import androidx.recyclerview.widget.RecyclerView import androidx.recyclerview.widget.RecyclerView
import com.elvishew.xlog.XLog
import com.google.android.material.chip.Chip import com.google.android.material.chip.Chip
import com.google.android.material.chip.ChipGroup import com.google.android.material.chip.ChipGroup
import eu.davidea.flexibleadapter.FlexibleAdapter import eu.davidea.flexibleadapter.FlexibleAdapter
@ -17,6 +16,7 @@ import eu.davidea.viewholders.FlexibleViewHolder
import eu.kanade.tachiyomi.R import eu.kanade.tachiyomi.R
import eu.kanade.tachiyomi.source.model.Filter import eu.kanade.tachiyomi.source.model.Filter
import eu.kanade.tachiyomi.widget.AutoCompleteAdapter import eu.kanade.tachiyomi.widget.AutoCompleteAdapter
import exh.log.xLogD
open class AutoComplete(val filter: Filter.AutoComplete) : AbstractFlexibleItem<AutoComplete.Holder>() { open class AutoComplete(val filter: Filter.AutoComplete) : AbstractFlexibleItem<AutoComplete.Holder>() {
@ -97,7 +97,7 @@ open class AutoComplete(val filter: Filter.AutoComplete) : AbstractFlexibleItem<
addChipToGroup(name, holder) addChipToGroup(name, holder)
filter.state += name filter.state += name
} else { } else {
XLog.tag("AutoComplete").d("Invalid tag: $name") xLogD("Invalid tag: %s", name)
} }
} }

View File

@ -5,9 +5,9 @@ import android.os.Bundle
import com.afollestad.materialdialogs.MaterialDialog import com.afollestad.materialdialogs.MaterialDialog
import com.afollestad.materialdialogs.datetime.timePicker import com.afollestad.materialdialogs.datetime.timePicker
import com.bluelinelabs.conductor.Controller import com.bluelinelabs.conductor.Controller
import com.elvishew.xlog.XLog
import eu.kanade.tachiyomi.R import eu.kanade.tachiyomi.R
import eu.kanade.tachiyomi.ui.base.controller.DialogController import eu.kanade.tachiyomi.ui.base.controller.DialogController
import exh.log.xLogD
import java.util.Calendar import java.util.Calendar
import kotlin.time.Duration import kotlin.time.Duration
import kotlin.time.ExperimentalTime import kotlin.time.ExperimentalTime
@ -48,9 +48,9 @@ class BiometricTimesCreateDialog<T>(bundle: Bundle? = null) : DialogController(b
.title(if (startTime == null) R.string.biometric_lock_start_time else R.string.biometric_lock_end_time) .title(if (startTime == null) R.string.biometric_lock_start_time else R.string.biometric_lock_end_time)
.timePicker(show24HoursView = false) { _, datetime -> .timePicker(show24HoursView = false) { _, datetime ->
val hour = datetime.get(Calendar.HOUR_OF_DAY) val hour = datetime.get(Calendar.HOUR_OF_DAY)
XLog.disableStackTrace().d(hour) xLogD(hour)
val minute = datetime.get(Calendar.MINUTE) val minute = datetime.get(Calendar.MINUTE)
XLog.disableStackTrace().d(minute) xLogD(minute)
if (hour !in 0..24 || minute !in 0..60) return@timePicker if (hour !in 0..24 || minute !in 0..60) return@timePicker
if (startTime != null) { if (startTime != null) {
endTime = hour.hours + minute.minutes endTime = hour.hours + minute.minutes

View File

@ -1,10 +1,10 @@
package eu.kanade.tachiyomi.ui.category.biometric package eu.kanade.tachiyomi.ui.category.biometric
import android.os.Bundle import android.os.Bundle
import com.elvishew.xlog.XLog
import eu.kanade.tachiyomi.data.preference.PreferencesHelper import eu.kanade.tachiyomi.data.preference.PreferencesHelper
import eu.kanade.tachiyomi.data.preference.plusAssign import eu.kanade.tachiyomi.data.preference.plusAssign
import eu.kanade.tachiyomi.ui.base.presenter.BasePresenter import eu.kanade.tachiyomi.ui.base.presenter.BasePresenter
import exh.log.xLogD
import kotlinx.coroutines.flow.launchIn import kotlinx.coroutines.flow.launchIn
import kotlinx.coroutines.flow.onEach import kotlinx.coroutines.flow.onEach
import rx.Observable import rx.Observable
@ -36,7 +36,7 @@ class BiometricTimesPresenter : BasePresenter<BiometricTimesController>() {
preferences.biometricTimeRanges().asFlow().onEach { prefTimeRanges -> preferences.biometricTimeRanges().asFlow().onEach { prefTimeRanges ->
timeRanges = prefTimeRanges.toList() timeRanges = prefTimeRanges.toList()
.mapNotNull { TimeRange.fromPreferenceString(it) }.onEach { XLog.disableStackTrace().d(it) } .mapNotNull { TimeRange.fromPreferenceString(it) }.onEach { xLogD(it) }
Observable.just(timeRanges) Observable.just(timeRanges)
.map { it.map(::BiometricTimesItem) } .map { it.map(::BiometricTimesItem) }
@ -57,7 +57,7 @@ class BiometricTimesPresenter : BasePresenter<BiometricTimesController>() {
return return
} }
XLog.disableStackTrace().d(timeRange) xLogD(timeRange)
preferences.biometricTimeRanges() += timeRange.toPreferenceString() preferences.biometricTimeRanges() += timeRange.toPreferenceString()
} }

View File

@ -36,7 +36,6 @@ import com.afollestad.materialdialogs.list.listItemsSingleChoice
import com.bluelinelabs.conductor.ControllerChangeHandler import com.bluelinelabs.conductor.ControllerChangeHandler
import com.bluelinelabs.conductor.ControllerChangeType import com.bluelinelabs.conductor.ControllerChangeType
import com.bumptech.glide.load.engine.DiskCacheStrategy import com.bumptech.glide.load.engine.DiskCacheStrategy
import com.elvishew.xlog.XLog
import com.google.android.material.floatingactionbutton.ExtendedFloatingActionButton import com.google.android.material.floatingactionbutton.ExtendedFloatingActionButton
import com.google.android.material.snackbar.Snackbar import com.google.android.material.snackbar.Snackbar
import eu.davidea.flexibleadapter.FlexibleAdapter import eu.davidea.flexibleadapter.FlexibleAdapter
@ -102,6 +101,7 @@ import eu.kanade.tachiyomi.util.system.toast
import eu.kanade.tachiyomi.util.view.getCoordinates import eu.kanade.tachiyomi.util.view.getCoordinates
import eu.kanade.tachiyomi.util.view.shrinkOnScroll import eu.kanade.tachiyomi.util.view.shrinkOnScroll
import eu.kanade.tachiyomi.util.view.snack import eu.kanade.tachiyomi.util.view.snack
import exh.log.xLogD
import exh.md.similar.ui.MangaDexSimilarController import exh.md.similar.ui.MangaDexSimilarController
import exh.metadata.metadata.base.FlatMetadata import exh.metadata.metadata.base.FlatMetadata
import exh.recs.RecommendsController import exh.recs.RecommendsController
@ -355,7 +355,7 @@ class MangaController :
presenter.redirectFlow presenter.redirectFlow
.onEach { redirect -> .onEach { redirect ->
XLog.d("Redirecting to updated manga (manga.id: %s, manga.title: %s, update: %s)!", redirect.manga.id, redirect.manga.title, redirect.update) xLogD("Redirecting to updated manga (manga.id: %s, manga.title: %s, update: %s)!", redirect.manga.id, redirect.manga.title, redirect.update)
// Replace self // Replace self
router?.replaceTopController(MangaController(redirect).withFadeTransaction()) router?.replaceTopController(MangaController(redirect).withFadeTransaction())
} }

View File

@ -4,7 +4,6 @@ import android.content.Context
import android.net.Uri import android.net.Uri
import android.os.Bundle import android.os.Bundle
import android.os.Environment import android.os.Environment
import com.elvishew.xlog.XLog
import com.jakewharton.rxrelay.PublishRelay import com.jakewharton.rxrelay.PublishRelay
import eu.kanade.tachiyomi.R import eu.kanade.tachiyomi.R
import eu.kanade.tachiyomi.data.cache.CoverCache import eu.kanade.tachiyomi.data.cache.CoverCache
@ -46,6 +45,7 @@ import eu.kanade.tachiyomi.util.updateCoverLastModified
import eu.kanade.tachiyomi.widget.ExtendedNavigationView.Item.TriStateGroup.State import eu.kanade.tachiyomi.widget.ExtendedNavigationView.Item.TriStateGroup.State
import exh.debug.DebugToggles import exh.debug.DebugToggles
import exh.eh.EHentaiUpdateHelper import exh.eh.EHentaiUpdateHelper
import exh.log.xLogD
import exh.md.utils.FollowStatus import exh.md.utils.FollowStatus
import exh.md.utils.MdUtil import exh.md.utils.MdUtil
import exh.md.utils.scanlatorList import exh.md.utils.scanlatorList
@ -236,7 +236,7 @@ class MangaPresenter(
// Redirect if we are not the accepted root // Redirect if we are not the accepted root
if (manga.id != acceptedChain.manga.id && acceptedChain.manga.favorite) { if (manga.id != acceptedChain.manga.id && acceptedChain.manga.favorite) {
// Update if any of our chapters are not in accepted manga's chapters // Update if any of our chapters are not in accepted manga's chapters
XLog.disableStackTrace().d("Found accepted manga ${manga.url}") xLogD("Found accepted manga %s", manga.url)
val ourChapterUrls = chapters.map { it.url }.toSet() val ourChapterUrls = chapters.map { it.url }.toSet()
val acceptedChapterUrls = acceptedChain.chapters.map { it.url }.toSet() val acceptedChapterUrls = acceptedChain.chapters.map { it.url }.toSet()
val update = (ourChapterUrls - acceptedChapterUrls).isNotEmpty() val update = (ourChapterUrls - acceptedChapterUrls).isNotEmpty()

View File

@ -6,9 +6,9 @@ import android.view.ViewGroup
import android.widget.AdapterView import android.widget.AdapterView
import android.widget.ArrayAdapter import android.widget.ArrayAdapter
import androidx.recyclerview.widget.RecyclerView import androidx.recyclerview.widget.RecyclerView
import com.elvishew.xlog.XLog
import eu.kanade.tachiyomi.databinding.EditMergedSettingsHeaderBinding import eu.kanade.tachiyomi.databinding.EditMergedSettingsHeaderBinding
import eu.kanade.tachiyomi.source.SourceManager import eu.kanade.tachiyomi.source.SourceManager
import exh.log.xLogD
import exh.merged.sql.models.MergedMangaReference import exh.merged.sql.models.MergedMangaReference
import uy.kohesive.injekt.injectLazy import uy.kohesive.injekt.injectLazy
@ -74,7 +74,7 @@ class EditMergedSettingsHeaderAdapter(private val controller: EditMergedSettings
3 -> MergedMangaReference.CHAPTER_SORT_HIGHEST_CHAPTER_NUMBER 3 -> MergedMangaReference.CHAPTER_SORT_HIGHEST_CHAPTER_NUMBER
else -> MergedMangaReference.CHAPTER_SORT_NO_DEDUPE else -> MergedMangaReference.CHAPTER_SORT_NO_DEDUPE
} }
XLog.d(controller.mergeReference?.chapterSortMode) xLogD(controller.mergeReference?.chapterSortMode)
editMergedMangaItemSortingListener.onSetPrioritySort(canMove()) editMergedMangaItemSortingListener.onSetPrioritySort(canMove())
} }

View File

@ -28,7 +28,6 @@ import androidx.core.view.setPadding
import androidx.lifecycle.lifecycleScope import androidx.lifecycle.lifecycleScope
import com.afollestad.materialdialogs.MaterialDialog import com.afollestad.materialdialogs.MaterialDialog
import com.davemorrissey.labs.subscaleview.SubsamplingScaleImageView import com.davemorrissey.labs.subscaleview.SubsamplingScaleImageView
import com.elvishew.xlog.XLog
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.database.models.Chapter import eu.kanade.tachiyomi.data.database.models.Chapter
@ -70,6 +69,7 @@ import eu.kanade.tachiyomi.util.view.showBar
import eu.kanade.tachiyomi.util.view.snack import eu.kanade.tachiyomi.util.view.snack
import eu.kanade.tachiyomi.widget.SimpleAnimationListener import eu.kanade.tachiyomi.widget.SimpleAnimationListener
import eu.kanade.tachiyomi.widget.SimpleSeekBarListener import eu.kanade.tachiyomi.widget.SimpleSeekBarListener
import exh.log.xLogE
import exh.source.isEhBasedSource import exh.source.isEhBasedSource
import exh.util.defaultReaderType import exh.util.defaultReaderType
import exh.util.mangaType import exh.util.mangaType
@ -128,8 +128,6 @@ class ReaderActivity : BaseRxActivity<ReaderActivityBinding, ReaderPresenter>()
private var autoScrollJob: Job? = null private var autoScrollJob: Job? = null
private val sourceManager: SourceManager by injectLazy() private val sourceManager: SourceManager by injectLazy()
private val logger = XLog.tag("ReaderActivity")
private lateinit var chapterBottomSheet: ReaderChapterSheet private lateinit var chapterBottomSheet: ReaderChapterSheet
// SY <-- // SY <--
@ -985,7 +983,7 @@ class ReaderActivity : BaseRxActivity<ReaderActivityBinding, ReaderPresenter>()
ReaderPageSheet(this, page).show() ReaderPageSheet(this, page).show()
// EXH --> // EXH -->
} catch (e: WindowManager.BadTokenException) { } catch (e: WindowManager.BadTokenException) {
logger.e("Caught and ignoring reader page sheet launch exception!", e) xLogE("Caught and ignoring reader page sheet launch exception!", e)
} }
// EXH <-- // EXH <--
} }

View File

@ -1,7 +1,6 @@
package exh package exh
import android.content.Context import android.content.Context
import com.elvishew.xlog.XLog
import com.pushtorefresh.storio.sqlite.queries.Query import com.pushtorefresh.storio.sqlite.queries.Query
import com.pushtorefresh.storio.sqlite.queries.RawQuery import com.pushtorefresh.storio.sqlite.queries.RawQuery
import eu.kanade.tachiyomi.BuildConfig import eu.kanade.tachiyomi.BuildConfig
@ -24,6 +23,8 @@ import eu.kanade.tachiyomi.source.SourceManager
import eu.kanade.tachiyomi.source.model.SManga import eu.kanade.tachiyomi.source.model.SManga
import eu.kanade.tachiyomi.source.online.all.Hitomi import eu.kanade.tachiyomi.source.online.all.Hitomi
import eu.kanade.tachiyomi.source.online.all.NHentai import eu.kanade.tachiyomi.source.online.all.NHentai
import exh.log.xLogE
import exh.log.xLogW
import exh.merged.sql.models.MergedMangaReference import exh.merged.sql.models.MergedMangaReference
import exh.source.BlacklistedSources import exh.source.BlacklistedSources
import exh.source.EH_SOURCE_ID import exh.source.EH_SOURCE_ID
@ -48,8 +49,6 @@ object EXHMigrations {
private val db: DatabaseHelper by injectLazy() private val db: DatabaseHelper by injectLazy()
private val sourceManager: SourceManager by injectLazy() private val sourceManager: SourceManager by injectLazy()
private val logger by lazy { XLog.tag("EXHMigrations") }
/** /**
* Performs a migration when the application is updated. * Performs a migration when the application is updated.
* *
@ -272,14 +271,14 @@ object EXHMigrations {
// if (oldVersion < 1) { } (1 is current release version) // if (oldVersion < 1) { } (1 is current release version)
// do stuff here when releasing changed crap // do stuff here when releasing changed crap
// TODO BE CAREFUL TO NOT FUCK UP MergedSources IF CHANGING URLs // TODO BE CAREFUL TO NOT FUCK UP MergedSources IF CHANGING URLsxdcsv
preferences.ehLastVersionCode().set(BuildConfig.VERSION_CODE) preferences.ehLastVersionCode().set(BuildConfig.VERSION_CODE)
return true return true
} }
} catch (e: Exception) { } catch (e: Exception) {
logger.e("Failed to migrate app from $oldVersion -> ${BuildConfig.VERSION_CODE}!", e) xLogE("Failed to migrate app from $oldVersion -> ${BuildConfig.VERSION_CODE}!", e)
} }
return false return false
} }
@ -334,7 +333,7 @@ object EXHMigrations {
try { try {
dbLocation.copyTo(backupLocation, overwrite = true) dbLocation.copyTo(backupLocation, overwrite = true)
} catch (t: Throwable) { } catch (t: Throwable) {
logger.enableStackTrace(2).w("Failed to backup database!") xLogW("Failed to backup database!")
} }
} }

View File

@ -2,7 +2,6 @@ package exh
import android.content.Context import android.content.Context
import androidx.core.net.toUri import androidx.core.net.toUri
import com.elvishew.xlog.XLog
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.Chapter import eu.kanade.tachiyomi.data.database.models.Chapter
@ -15,6 +14,7 @@ import eu.kanade.tachiyomi.source.model.toSManga
import eu.kanade.tachiyomi.source.online.UrlImportableSource import eu.kanade.tachiyomi.source.online.UrlImportableSource
import eu.kanade.tachiyomi.source.online.all.EHentai import eu.kanade.tachiyomi.source.online.all.EHentai
import eu.kanade.tachiyomi.util.chapter.syncChaptersWithSource import eu.kanade.tachiyomi.util.chapter.syncChaptersWithSource
import exh.log.xLogStack
import exh.source.getMainSource import exh.source.getMainSource
import exh.util.executeOnIO import exh.util.executeOnIO
import uy.kohesive.injekt.Injekt import uy.kohesive.injekt.Injekt
@ -32,7 +32,7 @@ class GalleryAdder {
preferences.enabledLanguages().get() to preferences.disabledSources().get().map { it.toLong() }.toSet() preferences.enabledLanguages().get() to preferences.disabledSources().get().map { it.toLong() }.toSet()
} }
private val logger = XLog.tag("GalleryAdder").enableStackTrace(2).build() private val logger = xLogStack()
fun pickSource(url: String): List<UrlImportableSource> { fun pickSource(url: String): List<UrlImportableSource> {
val uri = url.toUri() val uri = url.toUri()

View File

@ -1,7 +1,6 @@
package exh.debug package exh.debug
import android.app.Application import android.app.Application
import com.elvishew.xlog.XLog
import com.pushtorefresh.storio.sqlite.queries.RawQuery import com.pushtorefresh.storio.sqlite.queries.RawQuery
import eu.kanade.tachiyomi.data.database.DatabaseHelper import eu.kanade.tachiyomi.data.database.DatabaseHelper
import eu.kanade.tachiyomi.data.database.models.toMangaInfo import eu.kanade.tachiyomi.data.database.models.toMangaInfo
@ -13,6 +12,7 @@ import eu.kanade.tachiyomi.source.model.toSManga
import exh.EXHMigrations import exh.EXHMigrations
import exh.eh.EHentaiThrottleManager import exh.eh.EHentaiThrottleManager
import exh.eh.EHentaiUpdateWorker import exh.eh.EHentaiUpdateWorker
import exh.log.xLogE
import exh.metadata.metadata.EHentaiSearchMetadata import exh.metadata.metadata.EHentaiSearchMetadata
import exh.metadata.metadata.base.getFlatMetadataForManga import exh.metadata.metadata.base.getFlatMetadataForManga
import exh.metadata.metadata.base.insertFlatMetadataAsync import exh.metadata.metadata.base.insertFlatMetadataAsync
@ -60,7 +60,7 @@ object DebugFunctions {
}.toList() }.toList()
allManga.forEach { manga -> allManga.forEach { manga ->
val meta = db.getFlatMetadataForManga(manga.id!!).executeAsBlocking()?.raise<EHentaiSearchMetadata>() ?: return@forEach val meta = db.getFlatMetadataForManga(manga.id!!).executeOnIO()?.raise<EHentaiSearchMetadata>() ?: return@forEach
// remove age flag // remove age flag
meta.aged = false meta.aged = false
db.insertFlatMetadataAsync(meta.flatten()).await() db.insertFlatMetadataAsync(meta.flatten()).await()
@ -94,7 +94,7 @@ object DebugFunctions {
)?.getMangaDetails(manga.toMangaInfo())?.let { networkManga -> )?.getMangaDetails(manga.toMangaInfo())?.let { networkManga ->
manga.copyFrom(networkManga.toSManga()) manga.copyFrom(networkManga.toSManga())
manga.initialized = true manga.initialized = true
db.insertManga(manga).executeAsBlocking() db.insertManga(manga).executeOnIO()
} }
} }
} }
@ -111,7 +111,7 @@ object DebugFunctions {
}.toList() }.toList()
allManga.forEach { manga -> allManga.forEach { manga ->
val meta = db.getFlatMetadataForManga(manga.id!!).executeAsBlocking()?.raise<EHentaiSearchMetadata>() ?: return@forEach val meta = db.getFlatMetadataForManga(manga.id!!).executeOnIO()?.raise<EHentaiSearchMetadata>() ?: return@forEach
galleries += "Aged: ${meta.aged}\t Title: ${manga.title}" galleries += "Aged: ${meta.aged}\t Title: ${manga.title}"
} }
} }
@ -121,7 +121,7 @@ object DebugFunctions {
fun countAgedFlagInEXHManga(): Int { fun countAgedFlagInEXHManga(): Int {
var agedAmount = 0 var agedAmount = 0
runBlocking { runBlocking {
val metadataManga = db.getFavoriteMangaWithMetadata().executeAsBlocking() val metadataManga = db.getFavoriteMangaWithMetadata().executeOnIO()
val allManga = metadataManga.asFlow().cancellable().mapNotNull { manga -> val allManga = metadataManga.asFlow().cancellable().mapNotNull { manga ->
if (manga.isEhBasedManga()) manga if (manga.isEhBasedManga()) manga
@ -129,7 +129,7 @@ object DebugFunctions {
}.toList() }.toList()
allManga.forEach { manga -> allManga.forEach { manga ->
val meta = db.getFlatMetadataForManga(manga.id!!).executeAsBlocking()?.raise<EHentaiSearchMetadata>() ?: return@forEach val meta = db.getFlatMetadataForManga(manga.id!!).executeOnIO()?.raise<EHentaiSearchMetadata>() ?: return@forEach
if (meta.aged) { if (meta.aged) {
// remove age flag // remove age flag
agedAmount++ agedAmount++
@ -239,7 +239,7 @@ object DebugFunctions {
Json.decodeFromString<JsonSavedSearch>(it.substringAfter(':')) Json.decodeFromString<JsonSavedSearch>(it.substringAfter(':'))
} catch (t: RuntimeException) { } catch (t: RuntimeException) {
// Load failed // Load failed
XLog.tag("DebugFunctions").e("Failed to load saved search!", t) xLogE("Failed to load saved search!", t)
t.printStackTrace() t.printStackTrace()
null null
} }
@ -251,7 +251,7 @@ object DebugFunctions {
Json.decodeFromString<JsonSavedSearch>(it.substringAfter(':')) Json.decodeFromString<JsonSavedSearch>(it.substringAfter(':'))
} catch (t: RuntimeException) { } catch (t: RuntimeException) {
// Load failed // Load failed
XLog.tag("DebugFunctions").e("Failed to load saved search!", t) xLogE("Failed to load saved search!", t)
t.printStackTrace() t.printStackTrace()
null null
} }
@ -278,7 +278,7 @@ object DebugFunctions {
Json.decodeFromString<JsonSavedSearch>(it.substringAfter(':')) Json.decodeFromString<JsonSavedSearch>(it.substringAfter(':'))
} catch (t: RuntimeException) { } catch (t: RuntimeException) {
// Load failed // Load failed
XLog.tag("DebugFunctions").e("Failed to load saved search!", t) xLogE("Failed to load saved search!", t)
t.printStackTrace() t.printStackTrace()
null null
} }
@ -290,7 +290,7 @@ object DebugFunctions {
Json.decodeFromString<JsonSavedSearch>(it.substringAfter(':')) Json.decodeFromString<JsonSavedSearch>(it.substringAfter(':'))
} catch (t: RuntimeException) { } catch (t: RuntimeException) {
// Load failed // Load failed
XLog.tag("DebugFunctions").e("Failed to load saved search!", t) xLogE("Failed to load saved search!", t)
t.printStackTrace() t.printStackTrace()
null null
} }

View File

@ -3,7 +3,7 @@ package exh.eh
import android.util.SparseArray import android.util.SparseArray
import androidx.core.util.AtomicFile import androidx.core.util.AtomicFile
import androidx.core.util.forEach import androidx.core.util.forEach
import com.elvishew.xlog.XLog import exh.log.xLogD
import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.Job import kotlinx.coroutines.Job
@ -95,7 +95,7 @@ class MemAutoFlushingLookupTable<T>(
} }
} }
} catch (e: FileNotFoundException) { } catch (e: FileNotFoundException) {
XLog.tag("MemAutoFlushingLookupTable").enableStackTrace(2).d("Lookup table not found!", e) xLogD("Lookup table not found!", e)
// Ignored // Ignored
} }

View File

@ -3,7 +3,6 @@ package exh.favorites
import android.content.Context import android.content.Context
import android.net.wifi.WifiManager import android.net.wifi.WifiManager
import android.os.PowerManager import android.os.PowerManager
import com.elvishew.xlog.XLog
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.Category import eu.kanade.tachiyomi.data.database.models.Category
@ -21,6 +20,7 @@ import exh.GalleryAddEvent
import exh.GalleryAdder import exh.GalleryAdder
import exh.eh.EHentaiThrottleManager import exh.eh.EHentaiThrottleManager
import exh.eh.EHentaiUpdateWorker import exh.eh.EHentaiUpdateWorker
import exh.log.xLog
import exh.source.EH_SOURCE_ID import exh.source.EH_SOURCE_ID
import exh.source.EXH_SOURCE_ID import exh.source.EXH_SOURCE_ID
import exh.source.isEhBasedManga import exh.source.isEhBasedManga
@ -61,7 +61,7 @@ class FavoritesSyncHelper(val context: Context) {
private var wifiLock: WifiManager.WifiLock? = null private var wifiLock: WifiManager.WifiLock? = null
private var wakeLock: PowerManager.WakeLock? = null private var wakeLock: PowerManager.WakeLock? = null
private val logger = XLog.tag("EHFavSync").build() private val logger = xLog()
val status: MutableStateFlow<FavoritesSyncStatus> = MutableStateFlow(FavoritesSyncStatus.Idle(context)) val status: MutableStateFlow<FavoritesSyncStatus> = MutableStateFlow(FavoritesSyncStatus.Idle(context))
@ -381,7 +381,7 @@ class FavoritesSyncHelper(val context: Context) {
if (result is GalleryAddEvent.Fail) { if (result is GalleryAddEvent.Fail) {
if (result is GalleryAddEvent.Fail.NotFound) { if (result is GalleryAddEvent.Fail.NotFound) {
XLog.tag("EHFavSync").enableStackTrace(2).e(context.getString(R.string.favorites_sync_remote_not_exist, it.getUrl())) logger.e(context.getString(R.string.favorites_sync_remote_not_exist, it.getUrl()))
// Skip this gallery, it no longer exists // Skip this gallery, it no longer exists
return@forEachIndexed return@forEachIndexed
} }

View File

@ -119,22 +119,22 @@ class EnhancedFilePrinter internal constructor(
/** /**
* The file name generator for log file. * The file name generator for log file.
*/ */
private var fileNameGenerator: FileNameGenerator? = null var fileNameGenerator: FileNameGenerator? = null
/** /**
* The backup strategy for log file. * The backup strategy for log file.
*/ */
private var backupStrategy: BackupStrategy? = null var backupStrategy: BackupStrategy? = null
/** /**
* The clean strategy for log file. * The clean strategy for log file.
*/ */
private var cleanStrategy: CleanStrategy? = null var cleanStrategy: CleanStrategy? = null
/** /**
* The flattener when print a log. * The flattener when print a log.
*/ */
private var flattener: Flattener? = null var flattener: Flattener? = null
/** /**
* Set the file name generator for log file. * Set the file name generator for log file.
@ -194,6 +194,12 @@ class EnhancedFilePrinter internal constructor(
flattener ?: DefaultsFactory.createFlattener2() flattener ?: DefaultsFactory.createFlattener2()
) )
} }
companion object {
operator fun invoke(folderPath: String, block: Builder.() -> Unit): EnhancedFilePrinter {
return Builder(folderPath).apply(block).build()
}
}
} }
private data class LogItem( private data class LogItem(

View File

@ -0,0 +1,76 @@
package exh.log
import android.util.Log
import com.elvishew.xlog.Logger
import com.elvishew.xlog.XLog
import com.elvishew.xlog.LogLevel as XLogLevel
fun Any.xLog(): Logger = XLog.tag(this::class.java.simpleName).build()
fun Any.xLogStack(): Logger = XLog.tag(this::class.java.simpleName).enableStackTrace(0).build()
fun Any.xLogE(log: String) = xLog().e(log)
fun Any.xLogW(log: String) = xLog().w(log)
fun Any.xLogD(log: String) = xLog().d(log)
fun Any.xLogI(log: String) = xLog().i(log)
fun Any.xLog(logLevel: LogLevel, log: String) = xLog().log(logLevel.int, log)
fun Any.xLogJson(log: String) = xLog().json(log)
fun Any.xLogXML(log: String) = xLog().xml(log)
fun Any.xLogE(log: Throwable) = xLogStack().e(log)
fun Any.xLogW(log: Throwable) = xLogStack().w(log)
fun Any.xLogD(log: Throwable) = xLogStack().d(log)
fun Any.xLogI(log: Throwable) = xLogStack().i(log)
fun Any.xLog(logLevel: LogLevel, log: Throwable) = xLogStack().log(logLevel.int, log)
fun Any.xLogE(log: String, e: Throwable) = xLogStack().e(log, e)
fun Any.xLogW(log: String, e: Throwable) = xLogStack().w(log, e)
fun Any.xLogD(log: String, e: Throwable) = xLogStack().d(log, e)
fun Any.xLogI(log: String, e: Throwable) = xLogStack().i(log, e)
fun Any.xLog(logLevel: LogLevel, log: String, e: Throwable) = xLogStack().log(logLevel.int, log, e)
fun Any.xLogE(log: Any?) = xLog().let { if (log == null) it.e("null") else it.e(log) }
fun Any.xLogW(log: Any?) = xLog().let { if (log == null) it.w("null") else it.w(log) }
fun Any.xLogD(log: Any?) = xLog().let { if (log == null) it.d("null") else it.d(log) }
fun Any.xLogI(log: Any?) = xLog().let { if (log == null) it.i("null") else it.i(log) }
fun Any.xLog(logLevel: LogLevel, log: Any?) = xLog().let { if (log == null) it.log(logLevel.int, "null") else it.log(logLevel.int, log) }
/*fun Any.xLogE(vararg logs: Any) = xLog().e(logs)
fun Any.xLogW(vararg logs: Any) = xLog().w(logs)
fun Any.xLogD(vararg logs: Any) = xLog().d(logs)
fun Any.xLogI(vararg logs: Any) = xLog().i(logs)
fun Any.xLog(logLevel: LogLevel, vararg logs: Any) = xLog().log(logLevel.int, logs)*/
fun Any.xLogE(format: String, vararg args: Any?) = xLog().e(format, *args)
fun Any.xLogW(format: String, vararg args: Any?) = xLog().w(format, *args)
fun Any.xLogD(format: String, vararg args: Any?) = xLog().d(format, *args)
fun Any.xLogI(format: String, vararg args: Any?) = xLog().i(format, *args)
fun Any.xLog(logLevel: LogLevel, format: String, vararg args: Any) = xLog().log(logLevel.int, format, *args)
sealed class LogLevel(val int: Int, val androidLevel: Int) {
object None : LogLevel(XLogLevel.NONE, Log.ASSERT)
object Error : LogLevel(XLogLevel.ERROR, Log.ERROR)
object Warn : LogLevel(XLogLevel.WARN, Log.WARN)
object Info : LogLevel(XLogLevel.INFO, Log.INFO)
object Debug : LogLevel(XLogLevel.DEBUG, Log.DEBUG)
object Verbose : LogLevel(XLogLevel.VERBOSE, Log.VERBOSE)
object All : LogLevel(XLogLevel.ALL, Log.VERBOSE)
val name get() = getLevelName(this)
val shortName get() = getLevelShortName(this)
companion object {
fun getLevelName(logLevel: LogLevel): String = XLogLevel.getLevelName(logLevel.int)
fun getLevelShortName(logLevel: LogLevel): String = XLogLevel.getShortLevelName(logLevel.int)
fun values() = listOf(
None,
Error,
Warn,
Info,
Debug,
Verbose,
All
)
}
}

View File

@ -0,0 +1,35 @@
package exh.log
import android.util.Log
import com.elvishew.xlog.XLog
import timber.log.Timber
class XLogTree : Timber.DebugTree() {
override fun log(priority: Int, tag: String?, message: String, throwable: Throwable?) {
if (tag != null) {
if (throwable != null) {
XLog.tag(tag).log(priority.toXLogLevel(), message, throwable)
} else {
XLog.tag(tag).log(priority.toXLogLevel(), message)
}
} else {
if (throwable != null) {
XLog.log(priority.toXLogLevel(), message, throwable)
} else {
XLog.log(priority.toXLogLevel(), message)
}
}
}
private fun Int.toXLogLevel(): Int {
return when (this) {
Log.ASSERT -> LogLevel.None.int
Log.ERROR -> LogLevel.Error.int
Log.WARN -> LogLevel.Warn.int
Log.INFO -> LogLevel.Info.int
Log.DEBUG -> LogLevel.Debug.int
Log.VERBOSE -> LogLevel.Verbose.int
else -> LogLevel.All.int
}
}
}

View File

@ -1,11 +1,11 @@
package exh.md.handlers package exh.md.handlers
import com.elvishew.xlog.XLog
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.network.parseAs import eu.kanade.tachiyomi.network.parseAs
import eu.kanade.tachiyomi.source.model.SManga import eu.kanade.tachiyomi.source.model.SManga
import eu.kanade.tachiyomi.util.asJsoup import eu.kanade.tachiyomi.util.asJsoup
import exh.log.xLogE
import exh.md.handlers.serializers.ApiChapterSerializer import exh.md.handlers.serializers.ApiChapterSerializer
import exh.md.handlers.serializers.ApiMangaSerializer import exh.md.handlers.serializers.ApiMangaSerializer
import exh.md.handlers.serializers.ChapterSerializer import exh.md.handlers.serializers.ChapterSerializer
@ -150,7 +150,7 @@ class ApiMangaParser(private val lang: String) {
if (tags.isNotEmpty()) tags.clear() if (tags.isNotEmpty()) tags.clear()
tags += genres.map { RaisedTag(null, it, MangaDexSearchMetadata.TAG_TYPE_DEFAULT) } tags += genres.map { RaisedTag(null, it, MangaDexSearchMetadata.TAG_TYPE_DEFAULT) }
} catch (e: Exception) { } catch (e: Exception) {
XLog.tag("ApiMangaParser").enableStackTrace(2).e(e) xLogE(e)
throw e throw e
} }
} }
@ -256,7 +256,7 @@ class ApiMangaParser(private val lang: String) {
} }
return response.parseAs<ApiChapterSerializer>().data.mangaId return response.parseAs<ApiChapterSerializer>().data.mangaId
} catch (e: Exception) { } catch (e: Exception) {
XLog.tag("ApiMangaParser").enableStackTrace(2).e(e) xLogE(e)
throw e throw e
} }
} }

View File

@ -1,6 +1,5 @@
package exh.md.handlers package exh.md.handlers
import com.elvishew.xlog.XLog
import eu.kanade.tachiyomi.data.database.models.Track import eu.kanade.tachiyomi.data.database.models.Track
import eu.kanade.tachiyomi.data.preference.PreferencesHelper import eu.kanade.tachiyomi.data.preference.PreferencesHelper
import eu.kanade.tachiyomi.data.track.TrackManager import eu.kanade.tachiyomi.data.track.TrackManager
@ -12,6 +11,8 @@ import eu.kanade.tachiyomi.source.model.MangasPage
import eu.kanade.tachiyomi.source.model.MetadataMangasPage import eu.kanade.tachiyomi.source.model.MetadataMangasPage
import eu.kanade.tachiyomi.source.model.SManga import eu.kanade.tachiyomi.source.model.SManga
import eu.kanade.tachiyomi.util.lang.withIOContext import eu.kanade.tachiyomi.util.lang.withIOContext
import exh.log.xLogD
import exh.log.xLogE
import exh.md.handlers.serializers.FollowPage import exh.md.handlers.serializers.FollowPage
import exh.md.handlers.serializers.FollowsIndividualSerializer import exh.md.handlers.serializers.FollowsIndividualSerializer
import exh.md.handlers.serializers.FollowsPageSerializer import exh.md.handlers.serializers.FollowsPageSerializer
@ -50,7 +51,7 @@ class FollowsHandler(val client: OkHttpClient, val headers: Headers, val prefere
response.body?.string().orEmpty() response.body?.string().orEmpty()
) )
} catch (e: Exception) { } catch (e: Exception) {
XLog.tag("FollowsHandler").enableStackTrace(2).e("error parsing follows", e) xLogE("error parsing follows", e)
FollowsPageSerializer(404, emptyList()) FollowsPageSerializer(404, emptyList())
} }
@ -78,7 +79,7 @@ class FollowsHandler(val client: OkHttpClient, val headers: Headers, val prefere
val followsPageResult = try { val followsPageResult = try {
response.parseAs<FollowsIndividualSerializer>(MdUtil.jsonParser) response.parseAs<FollowsIndividualSerializer>(MdUtil.jsonParser)
} catch (e: Exception) { } catch (e: Exception) {
XLog.tag("FollowsHandler").enableStackTrace(2).e("error parsing follows", e) xLogE("error parsing follows", e)
throw e throw e
} }
@ -161,7 +162,7 @@ class FollowsHandler(val client: OkHttpClient, val headers: Headers, val prefere
val formBody = FormBody.Builder() val formBody = FormBody.Builder()
.add("volume", "0") .add("volume", "0")
.add("chapter", track.last_chapter_read.toString()) .add("chapter", track.last_chapter_read.toString())
XLog.tag("FollowsHandler").d("chapter to update %s", track.last_chapter_read.toString()) xLogD("chapter to update %s", track.last_chapter_read.toString())
val response = client.newCall( val response = client.newCall(
POST( POST(
"${MdUtil.baseUrl}/ajax/actions.ajax.php?function=edit_progress&id=$mangaID", "${MdUtil.baseUrl}/ajax/actions.ajax.php?function=edit_progress&id=$mangaID",
@ -172,7 +173,7 @@ class FollowsHandler(val client: OkHttpClient, val headers: Headers, val prefere
withIOContext { withIOContext {
response.body?.string() response.body?.string()
.also { XLog.tag("FollowsHandler").d(it) } .also { xLogD(it) }
.let { it != null && it.isEmpty() } .let { it != null && it.isEmpty() }
} }
} }

View File

@ -10,7 +10,6 @@ import androidx.core.app.NotificationCompat
import androidx.core.app.NotificationManagerCompat import androidx.core.app.NotificationManagerCompat
import androidx.core.content.ContextCompat import androidx.core.content.ContextCompat
import androidx.core.text.isDigitsOnly import androidx.core.text.isDigitsOnly
import com.elvishew.xlog.XLog
import com.squareup.moshi.JsonReader import com.squareup.moshi.JsonReader
import eu.kanade.tachiyomi.R import eu.kanade.tachiyomi.R
import eu.kanade.tachiyomi.data.database.DatabaseHelper import eu.kanade.tachiyomi.data.database.DatabaseHelper
@ -23,6 +22,7 @@ import eu.kanade.tachiyomi.util.lang.withIOContext
import eu.kanade.tachiyomi.util.system.acquireWakeLock import eu.kanade.tachiyomi.util.system.acquireWakeLock
import eu.kanade.tachiyomi.util.system.isServiceRunning import eu.kanade.tachiyomi.util.system.isServiceRunning
import eu.kanade.tachiyomi.util.system.notificationManager import eu.kanade.tachiyomi.util.system.notificationManager
import exh.log.xLogE
import exh.md.similar.sql.models.MangaSimilarImpl import exh.md.similar.sql.models.MangaSimilarImpl
import kotlinx.coroutines.CoroutineExceptionHandler import kotlinx.coroutines.CoroutineExceptionHandler
import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.CoroutineScope
@ -135,7 +135,7 @@ class SimilarUpdateService(
// Unsubscribe from any previous subscription if needed. // Unsubscribe from any previous subscription if needed.
job?.cancel() job?.cancel()
val handler = CoroutineExceptionHandler { _, exception -> val handler = CoroutineExceptionHandler { _, exception ->
XLog.tag("SimilarUpdateService").enableStackTrace(2).e(exception) xLogE(exception)
stopSelf(startId) stopSelf(startId)
showResultNotification(true) showResultNotification(true)
cancelProgressNotification() cancelProgressNotification()

View File

@ -4,12 +4,12 @@ import android.app.Dialog
import android.os.Bundle import android.os.Bundle
import android.view.View import android.view.View
import com.afollestad.materialdialogs.MaterialDialog import com.afollestad.materialdialogs.MaterialDialog
import com.elvishew.xlog.XLog
import eu.kanade.tachiyomi.R import eu.kanade.tachiyomi.R
import eu.kanade.tachiyomi.ui.base.controller.DialogController import eu.kanade.tachiyomi.ui.base.controller.DialogController
import eu.kanade.tachiyomi.util.lang.launchIO import eu.kanade.tachiyomi.util.lang.launchIO
import eu.kanade.tachiyomi.util.lang.launchUI import eu.kanade.tachiyomi.util.lang.launchUI
import eu.kanade.tachiyomi.util.system.toast import eu.kanade.tachiyomi.util.system.toast
import exh.log.xLogE
import kotlinx.coroutines.MainScope import kotlinx.coroutines.MainScope
import kotlinx.coroutines.cancel import kotlinx.coroutines.cancel
@ -35,7 +35,7 @@ class ConfiguringDialogController : DialogController() {
.show() .show()
} }
} }
XLog.tag("ConfiguringDialogController").enableStackTrace(2).e("Configuration error!", e) xLogE("Configuration error!", e)
} }
launchUI { launchUI {
finish() finish()

View File

@ -1,7 +1,6 @@
package exh.uconfig package exh.uconfig
import android.content.Context import android.content.Context
import com.elvishew.xlog.XLog
import eu.kanade.tachiyomi.R import eu.kanade.tachiyomi.R
import eu.kanade.tachiyomi.data.preference.PreferencesHelper import eu.kanade.tachiyomi.data.preference.PreferencesHelper
import eu.kanade.tachiyomi.network.await import eu.kanade.tachiyomi.network.await
@ -9,6 +8,7 @@ import eu.kanade.tachiyomi.source.SourceManager
import eu.kanade.tachiyomi.source.online.all.EHentai import eu.kanade.tachiyomi.source.online.all.EHentai
import eu.kanade.tachiyomi.util.asJsoup import eu.kanade.tachiyomi.util.asJsoup
import exh.log.maybeInjectEHLogger import exh.log.maybeInjectEHLogger
import exh.log.xLogD
import exh.source.EH_SOURCE_ID import exh.source.EH_SOURCE_ID
import exh.source.EXH_SOURCE_ID import exh.source.EXH_SOURCE_ID
import okhttp3.FormBody import okhttp3.FormBody
@ -81,7 +81,7 @@ class EHConfigurator(val context: Context) {
} }
} }
XLog.tag("EHConfigurator").d("Hath perks: $hathPerks") xLogD("Hath perks: %s", hathPerks.toString())
configure(ehSource, hathPerks) configure(ehSource, hathPerks)
configure(exhSource, hathPerks) configure(exhSource, hathPerks)

View File

@ -1,7 +1,6 @@
package exh.ui.batchadd package exh.ui.batchadd
import android.content.Context import android.content.Context
import com.elvishew.xlog.XLog
import com.jakewharton.rxrelay.BehaviorRelay import com.jakewharton.rxrelay.BehaviorRelay
import com.jakewharton.rxrelay.ReplayRelay import com.jakewharton.rxrelay.ReplayRelay
import eu.kanade.tachiyomi.R import eu.kanade.tachiyomi.R
@ -10,6 +9,7 @@ import eu.kanade.tachiyomi.ui.base.presenter.BasePresenter
import eu.kanade.tachiyomi.util.lang.withIOContext import eu.kanade.tachiyomi.util.lang.withIOContext
import exh.GalleryAddEvent import exh.GalleryAddEvent
import exh.GalleryAdder import exh.GalleryAdder
import exh.log.xLogE
import exh.util.trimOrNull import exh.util.trimOrNull
import kotlinx.coroutines.CoroutineExceptionHandler import kotlinx.coroutines.CoroutineExceptionHandler
import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.Dispatchers
@ -56,7 +56,7 @@ class BatchAddPresenter : BasePresenter<BatchAddController>() {
currentlyAddingRelay.call(STATE_INPUT_TO_PROGRESS) currentlyAddingRelay.call(STATE_INPUT_TO_PROGRESS)
val handler = CoroutineExceptionHandler { _, throwable -> val handler = CoroutineExceptionHandler { _, throwable ->
XLog.tag("BatchAddPresenter").enableStackTrace(2).e(throwable) xLogE(throwable)
} }
presenterScope.launch(Dispatchers.IO + handler) { presenterScope.launch(Dispatchers.IO + handler) {

View File

@ -12,7 +12,6 @@ import android.webkit.WebChromeClient
import android.webkit.WebView import android.webkit.WebView
import androidx.appcompat.app.AppCompatActivity import androidx.appcompat.app.AppCompatActivity
import com.afollestad.materialdialogs.MaterialDialog import com.afollestad.materialdialogs.MaterialDialog
import com.elvishew.xlog.XLog
import eu.kanade.tachiyomi.R import eu.kanade.tachiyomi.R
import eu.kanade.tachiyomi.data.preference.PreferencesHelper import eu.kanade.tachiyomi.data.preference.PreferencesHelper
import eu.kanade.tachiyomi.databinding.EhActivityCaptchaBinding import eu.kanade.tachiyomi.databinding.EhActivityCaptchaBinding
@ -23,6 +22,8 @@ import eu.kanade.tachiyomi.source.SourceManager
import eu.kanade.tachiyomi.source.online.HttpSource import eu.kanade.tachiyomi.source.online.HttpSource
import eu.kanade.tachiyomi.util.lang.withUIContext import eu.kanade.tachiyomi.util.lang.withUIContext
import eu.kanade.tachiyomi.util.system.setDefaultSettings import eu.kanade.tachiyomi.util.system.setDefaultSettings
import exh.log.xLogD
import exh.log.xLogE
import exh.source.DelegatedHttpSource import exh.source.DelegatedHttpSource
import exh.util.melt import exh.util.melt
import kotlinx.coroutines.runBlocking import kotlinx.coroutines.runBlocking
@ -186,7 +187,7 @@ class BrowserActionActivity : AppCompatActivity() {
suspend fun captchaSolveFail() { suspend fun captchaSolveFail() {
currentLoopId = null currentLoopId = null
validateCurrentLoopId = null validateCurrentLoopId = null
XLog.tag("BrowserActionActivity").enableStackTrace(2).e(IllegalStateException("Captcha solve failure!")) xLogE(IllegalStateException("Captcha solve failure!"))
withUIContext { withUIContext {
binding.webview.evaluateJavascript(SOLVE_UI_SCRIPT_HIDE, null) binding.webview.evaluateJavascript(SOLVE_UI_SCRIPT_HIDE, null)
MaterialDialog(this@BrowserActionActivity) MaterialDialog(this@BrowserActionActivity)
@ -230,7 +231,7 @@ class BrowserActionActivity : AppCompatActivity() {
val ih = splitResult[3] val ih = splitResult[3]
val x = binding.webview.x + origX / iw * binding.webview.width val x = binding.webview.x + origX / iw * binding.webview.width
val y = binding.webview.y + origY / ih * binding.webview.height val y = binding.webview.y + origY / ih * binding.webview.height
XLog.tag("BrowserActionActivity").d("Found audio button coords: %f %f", x, y) xLogD("Found audio button coords: %f %f", x, y)
simulateClick(x + 50, y + 50) simulateClick(x + 50, y + 50)
binding.webview.post { binding.webview.post {
doStageDownloadAudio(loopId) doStageDownloadAudio(loopId)
@ -246,12 +247,12 @@ class BrowserActionActivity : AppCompatActivity() {
} }
STAGE_DOWNLOAD_AUDIO -> { STAGE_DOWNLOAD_AUDIO -> {
if (result != null) { if (result != null) {
XLog.tag("BrowserActionActivity").d("Got audio URL: $result") xLogD("Got audio URL: $result")
performRecognize(result) performRecognize(result)
.observeOn(Schedulers.io()) .observeOn(Schedulers.io())
.subscribe( .subscribe(
{ {
XLog.tag("BrowserActionActivity").d("Got audio transcript: $it") xLogD("Got audio transcript: $it")
binding.webview.post { binding.webview.post {
typeResult( typeResult(
loopId, loopId,
@ -464,7 +465,7 @@ class BrowserActionActivity : AppCompatActivity() {
if (loopId != validateCurrentLoopId) return if (loopId != validateCurrentLoopId) return
if (result) { if (result) {
XLog.tag("BrowserActionActivity").d("Captcha solved!") xLogD("Captcha solved!")
binding.webview.post { binding.webview.post {
binding.webview.evaluateJavascript(SOLVE_UI_SCRIPT_HIDE, null) binding.webview.evaluateJavascript(SOLVE_UI_SCRIPT_HIDE, null)
} }

View File

@ -8,13 +8,13 @@ import android.webkit.CookieManager
import android.webkit.WebView import android.webkit.WebView
import android.webkit.WebViewClient import android.webkit.WebViewClient
import androidx.core.view.isVisible import androidx.core.view.isVisible
import com.elvishew.xlog.XLog
import eu.kanade.tachiyomi.data.preference.PreferencesHelper import eu.kanade.tachiyomi.data.preference.PreferencesHelper
import eu.kanade.tachiyomi.databinding.EhActivityLoginBinding import eu.kanade.tachiyomi.databinding.EhActivityLoginBinding
import eu.kanade.tachiyomi.source.SourceManager import eu.kanade.tachiyomi.source.SourceManager
import eu.kanade.tachiyomi.ui.base.controller.NucleusController import eu.kanade.tachiyomi.ui.base.controller.NucleusController
import eu.kanade.tachiyomi.util.lang.launchUI import eu.kanade.tachiyomi.util.lang.launchUI
import eu.kanade.tachiyomi.util.system.setDefaultSettings import eu.kanade.tachiyomi.util.system.setDefaultSettings
import exh.log.xLogD
import exh.uconfig.WarnConfigureDialogController import exh.uconfig.WarnConfigureDialogController
import uy.kohesive.injekt.injectLazy import uy.kohesive.injekt.injectLazy
import java.net.HttpCookie import java.net.HttpCookie
@ -91,7 +91,7 @@ class LoginController : NucleusController<EhActivityLoginBinding, LoginPresenter
binding.webview.webViewClient = object : WebViewClient() { binding.webview.webViewClient = object : WebViewClient() {
override fun onPageFinished(view: WebView, url: String) { override fun onPageFinished(view: WebView, url: String) {
super.onPageFinished(view, url) super.onPageFinished(view, url)
XLog.tag("LoginController").d(url) xLogD(url)
val parsedUrl = Uri.parse(url) val parsedUrl = Uri.parse(url)
if (parsedUrl.host.equals("forums.e-hentai.org", ignoreCase = true)) { if (parsedUrl.host.equals("forums.e-hentai.org", ignoreCase = true)) {
// Hide distracting content // Hide distracting content

View File

@ -1,7 +1,7 @@
package exh.util package exh.util
import com.elvishew.xlog.XLog
import eu.kanade.tachiyomi.util.asJsoup import eu.kanade.tachiyomi.util.asJsoup
import exh.log.xLogW
import okhttp3.Response import okhttp3.Response
import okhttp3.ResponseBody.Companion.toResponseBody import okhttp3.ResponseBody.Companion.toResponseBody
import org.jsoup.nodes.Document import org.jsoup.nodes.Document
@ -21,7 +21,7 @@ fun Response.interceptAsHtml(block: (Document) -> Unit): Response {
block(parsed) block(parsed)
} catch (t: Throwable) { } catch (t: Throwable) {
// Ignore all errors // Ignore all errors
XLog.tag("Response.interceptAsHtml").enableStackTrace(2).w("Interception error!", t) xLogW("Interception error!", t)
} finally { } finally {
close() close()
} }