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")
// Better logging (EH)
implementation("com.elvishew:xlog:1.7.1")
implementation("com.elvishew:xlog:1.8.0")
// Debug utils (EH)
val debugOverlayVersion = "1.1.3"
@ -307,7 +307,7 @@ dependencies {
implementation("androidx.gridlayout:gridlayout:1.0.0")
implementation("com.mikepenz:fastadapter:5.3.4")
// SY -->
// SY <--
}
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.GooglePlayServicesRepairableException
import com.google.android.gms.security.ProviderInstaller
import com.google.firebase.analytics.FirebaseAnalytics
import com.google.firebase.analytics.ktx.analytics
import com.google.firebase.ktx.Firebase
import com.ms_square.debugoverlay.DebugOverlay
@ -36,6 +35,9 @@ import exh.log.CrashlyticsPrinter
import exh.log.EHDebugModeOverlay
import exh.log.EHLogLevel
import exh.log.EnhancedFilePrinter
import exh.log.XLogTree
import exh.log.xLogD
import exh.log.xLogE
import exh.syDebugVersion
import io.realm.Realm
import org.conscrypt.Conscrypt
@ -55,12 +57,11 @@ open class App : Application(), LifecycleObserver {
private val preferences: PreferencesHelper by injectLazy()
private lateinit var firebaseAnalytics: FirebaseAnalytics
override fun onCreate() {
super.onCreate()
if (BuildConfig.DEBUG) Timber.plant(Timber.DebugTree())
// if (BuildConfig.DEBUG) Timber.plant(Timber.DebugTree())
setupExhLogging() // EXH logging
Timber.plant(XLogTree()) // SY Redirect Timber to XLog
if (!BuildConfig.DEBUG) addAnalytics()
workaroundAndroid7BrokenSSL()
@ -100,23 +101,22 @@ open class App : Application(), LifecycleObserver {
try {
SSLContext.getInstance("TLSv1.2")
} 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 {
ProviderInstaller.installIfNeeded(applicationContext)
} 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) {
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() {
firebaseAnalytics = Firebase.analytics
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)
val logLevel = when {
EHLogLevel.shouldLog(EHLogLevel.EXTRA) -> LogLevel.ALL
BuildConfig.DEBUG -> LogLevel.DEBUG
EHLogLevel.shouldLog(EHLogLevel.EXTREME) -> LogLevel.ALL
EHLogLevel.shouldLog(EHLogLevel.EXTRA) || BuildConfig.DEBUG -> LogLevel.DEBUG
else -> LogLevel.WARN
}
@ -160,9 +160,8 @@ open class App : Application(), LifecycleObserver {
@OptIn(ExperimentalTime::class)
printers += EnhancedFilePrinter
.Builder(logFolder.absolutePath)
.fileNameGenerator(
object : DateFileNameGenerator() {
.Builder(logFolder.absolutePath) {
fileNameGenerator = object : DateFileNameGenerator() {
override fun generateFileName(logLevel: Int, timestamp: Long): String {
return super.generateFileName(
logLevel,
@ -170,13 +169,12 @@ open class App : Application(), LifecycleObserver {
) + "-${BuildConfig.BUILD_TYPE}.log"
}
}
)
.flattener { timeMillis, level, tag, message ->
"${dateFormat.format(timeMillis)} ${LogLevel.getShortLevelName(level)}/$tag: $message"
flattener { timeMillis, 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
if (!BuildConfig.DEBUG) {
@ -188,8 +186,8 @@ open class App : Application(), LifecycleObserver {
*printers.toTypedArray()
)
XLog.tag("Init").d("Application booting...")
XLog.tag("Init").d(
xLogD("Application booting...")
xLogD(
"App version: ${BuildConfig.VERSION_NAME} (${BuildConfig.FLAVOR}, ${BuildConfig.COMMIT_SHA}, ${BuildConfig.VERSION_CODE})\n" +
"Preview build: $syDebugVersion\n" +
"Android version: ${Build.VERSION.RELEASE} (SDK ${Build.VERSION.SDK_INT}) \n" +
@ -214,7 +212,7 @@ open class App : Application(), LifecycleObserver {
.install()
} catch (e: IllegalStateException) {
// 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.graphics.drawable.Drawable
import androidx.core.content.ContextCompat
import com.elvishew.xlog.XLog
import com.jakewharton.rxrelay.BehaviorRelay
import eu.kanade.tachiyomi.R
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.util.lang.launchNow
import eu.kanade.tachiyomi.util.system.toast
import exh.log.xLogD
import exh.source.BlacklistedSources
import exh.source.EH_SOURCE_ID
import exh.source.EXH_SOURCE_ID
@ -158,7 +158,7 @@ class ExtensionManager(
val blacklistEnabled = preferences.enableSourceBlacklist().get()
return filter {
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
} else true
}
@ -333,7 +333,7 @@ class ExtensionManager(
private fun registerNewExtension(extension: Extension.Installed) {
// SY -->
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
}
// SY <--
@ -351,7 +351,7 @@ class ExtensionManager(
private fun registerUpdatedExtension(extension: Extension.Installed) {
// SY -->
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
}
// SY <--

View File

@ -1,7 +1,6 @@
package eu.kanade.tachiyomi.source
import android.content.Context
import com.elvishew.xlog.XLog
import eu.kanade.tachiyomi.R
import eu.kanade.tachiyomi.data.preference.PreferencesHelper
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.Pururin
import eu.kanade.tachiyomi.source.online.english.Tsumino
import exh.log.xLogD
import exh.source.BlacklistedSources
import exh.source.DelegatedHttpSource
import exh.source.EH_SOURCE_ID
@ -115,7 +115,7 @@ open class SourceManager(private val context: Context) {
} else DELEGATED_SOURCES[sourceQName]
} else 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(
source,
delegate.newSourceClass.constructors.find { it.parameters.size == 2 }!!.call(source, context)
@ -132,7 +132,7 @@ open class SourceManager(private val context: Context) {
} else source
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
}
// EXH <--

View File

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

View File

@ -1,6 +1,5 @@
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.models.Chapter
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.lang.withIOContext
import eu.kanade.tachiyomi.util.shouldDownloadNewChapters
import exh.log.xLogW
import exh.merged.sql.models.MergedMangaReference
import exh.source.MERGED_SOURCE_ID
import exh.util.executeOnIO
@ -185,7 +185,7 @@ class MergedSource : HttpSource() {
mangaId = manga.id
db.insertNewMergedMangaId(this).executeOnIO()
} catch (e: Exception) {
XLog.tag("MergedSource").enableStackTrace(e.stackTrace.contentToString(), 5)
xLogW("Error inserting merged manga id", e)
}
}
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.input.input
import com.afollestad.materialdialogs.list.listItems
import com.elvishew.xlog.XLog
import com.google.android.material.floatingactionbutton.ExtendedFloatingActionButton
import com.google.android.material.snackbar.Snackbar
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.widget.AutofitRecyclerView
import eu.kanade.tachiyomi.widget.EmptyView
import exh.log.xLogW
import exh.md.similar.ui.EnableMangaDexSimilarDialogController
import exh.savedsearches.EXHSavedSearch
import exh.source.getMainSource
@ -542,8 +542,8 @@ open class BrowseSourceController(bundle: Bundle) :
*/
/* SY --> */ open /* SY <-- */fun onAddPageError(error: Throwable) {
// SY -->
XLog.tag("BrowseSourceController").enableStackTrace(2).w("> Failed to load next catalogue page!", error)
XLog.tag("BrowseSourceController").enableStackTrace(2).w(
xLogW("> Failed to load next catalogue page!", error)
xLogW(
"> (source.id: %s, source.name: %s)",
presenter.source.id,
presenter.source.name

View File

@ -7,7 +7,6 @@ import android.widget.AutoCompleteTextView
import android.widget.TextView
import androidx.core.widget.addTextChangedListener
import androidx.recyclerview.widget.RecyclerView
import com.elvishew.xlog.XLog
import com.google.android.material.chip.Chip
import com.google.android.material.chip.ChipGroup
import eu.davidea.flexibleadapter.FlexibleAdapter
@ -17,6 +16,7 @@ import eu.davidea.viewholders.FlexibleViewHolder
import eu.kanade.tachiyomi.R
import eu.kanade.tachiyomi.source.model.Filter
import eu.kanade.tachiyomi.widget.AutoCompleteAdapter
import exh.log.xLogD
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)
filter.state += name
} 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.datetime.timePicker
import com.bluelinelabs.conductor.Controller
import com.elvishew.xlog.XLog
import eu.kanade.tachiyomi.R
import eu.kanade.tachiyomi.ui.base.controller.DialogController
import exh.log.xLogD
import java.util.Calendar
import kotlin.time.Duration
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)
.timePicker(show24HoursView = false) { _, datetime ->
val hour = datetime.get(Calendar.HOUR_OF_DAY)
XLog.disableStackTrace().d(hour)
xLogD(hour)
val minute = datetime.get(Calendar.MINUTE)
XLog.disableStackTrace().d(minute)
xLogD(minute)
if (hour !in 0..24 || minute !in 0..60) return@timePicker
if (startTime != null) {
endTime = hour.hours + minute.minutes

View File

@ -1,10 +1,10 @@
package eu.kanade.tachiyomi.ui.category.biometric
import android.os.Bundle
import com.elvishew.xlog.XLog
import eu.kanade.tachiyomi.data.preference.PreferencesHelper
import eu.kanade.tachiyomi.data.preference.plusAssign
import eu.kanade.tachiyomi.ui.base.presenter.BasePresenter
import exh.log.xLogD
import kotlinx.coroutines.flow.launchIn
import kotlinx.coroutines.flow.onEach
import rx.Observable
@ -36,7 +36,7 @@ class BiometricTimesPresenter : BasePresenter<BiometricTimesController>() {
preferences.biometricTimeRanges().asFlow().onEach { prefTimeRanges ->
timeRanges = prefTimeRanges.toList()
.mapNotNull { TimeRange.fromPreferenceString(it) }.onEach { XLog.disableStackTrace().d(it) }
.mapNotNull { TimeRange.fromPreferenceString(it) }.onEach { xLogD(it) }
Observable.just(timeRanges)
.map { it.map(::BiometricTimesItem) }
@ -57,7 +57,7 @@ class BiometricTimesPresenter : BasePresenter<BiometricTimesController>() {
return
}
XLog.disableStackTrace().d(timeRange)
xLogD(timeRange)
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.ControllerChangeType
import com.bumptech.glide.load.engine.DiskCacheStrategy
import com.elvishew.xlog.XLog
import com.google.android.material.floatingactionbutton.ExtendedFloatingActionButton
import com.google.android.material.snackbar.Snackbar
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.shrinkOnScroll
import eu.kanade.tachiyomi.util.view.snack
import exh.log.xLogD
import exh.md.similar.ui.MangaDexSimilarController
import exh.metadata.metadata.base.FlatMetadata
import exh.recs.RecommendsController
@ -355,7 +355,7 @@ class MangaController :
presenter.redirectFlow
.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
router?.replaceTopController(MangaController(redirect).withFadeTransaction())
}

View File

@ -4,7 +4,6 @@ import android.content.Context
import android.net.Uri
import android.os.Bundle
import android.os.Environment
import com.elvishew.xlog.XLog
import com.jakewharton.rxrelay.PublishRelay
import eu.kanade.tachiyomi.R
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 exh.debug.DebugToggles
import exh.eh.EHentaiUpdateHelper
import exh.log.xLogD
import exh.md.utils.FollowStatus
import exh.md.utils.MdUtil
import exh.md.utils.scanlatorList
@ -236,7 +236,7 @@ class MangaPresenter(
// Redirect if we are not the accepted root
if (manga.id != acceptedChain.manga.id && acceptedChain.manga.favorite) {
// 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 acceptedChapterUrls = acceptedChain.chapters.map { it.url }.toSet()
val update = (ourChapterUrls - acceptedChapterUrls).isNotEmpty()

View File

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

View File

@ -28,7 +28,6 @@ import androidx.core.view.setPadding
import androidx.lifecycle.lifecycleScope
import com.afollestad.materialdialogs.MaterialDialog
import com.davemorrissey.labs.subscaleview.SubsamplingScaleImageView
import com.elvishew.xlog.XLog
import com.google.android.material.snackbar.Snackbar
import eu.kanade.tachiyomi.R
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.widget.SimpleAnimationListener
import eu.kanade.tachiyomi.widget.SimpleSeekBarListener
import exh.log.xLogE
import exh.source.isEhBasedSource
import exh.util.defaultReaderType
import exh.util.mangaType
@ -128,8 +128,6 @@ class ReaderActivity : BaseRxActivity<ReaderActivityBinding, ReaderPresenter>()
private var autoScrollJob: Job? = null
private val sourceManager: SourceManager by injectLazy()
private val logger = XLog.tag("ReaderActivity")
private lateinit var chapterBottomSheet: ReaderChapterSheet
// SY <--
@ -985,7 +983,7 @@ class ReaderActivity : BaseRxActivity<ReaderActivityBinding, ReaderPresenter>()
ReaderPageSheet(this, page).show()
// EXH -->
} 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 <--
}

View File

@ -1,7 +1,6 @@
package exh
import android.content.Context
import com.elvishew.xlog.XLog
import com.pushtorefresh.storio.sqlite.queries.Query
import com.pushtorefresh.storio.sqlite.queries.RawQuery
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.online.all.Hitomi
import eu.kanade.tachiyomi.source.online.all.NHentai
import exh.log.xLogE
import exh.log.xLogW
import exh.merged.sql.models.MergedMangaReference
import exh.source.BlacklistedSources
import exh.source.EH_SOURCE_ID
@ -48,8 +49,6 @@ object EXHMigrations {
private val db: DatabaseHelper by injectLazy()
private val sourceManager: SourceManager by injectLazy()
private val logger by lazy { XLog.tag("EXHMigrations") }
/**
* Performs a migration when the application is updated.
*
@ -272,14 +271,14 @@ object EXHMigrations {
// if (oldVersion < 1) { } (1 is current release version)
// 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)
return true
}
} 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
}
@ -334,7 +333,7 @@ object EXHMigrations {
try {
dbLocation.copyTo(backupLocation, overwrite = true)
} 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 androidx.core.net.toUri
import com.elvishew.xlog.XLog
import eu.kanade.tachiyomi.R
import eu.kanade.tachiyomi.data.database.DatabaseHelper
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.all.EHentai
import eu.kanade.tachiyomi.util.chapter.syncChaptersWithSource
import exh.log.xLogStack
import exh.source.getMainSource
import exh.util.executeOnIO
import uy.kohesive.injekt.Injekt
@ -32,7 +32,7 @@ class GalleryAdder {
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> {
val uri = url.toUri()

View File

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

View File

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

View File

@ -3,7 +3,6 @@ package exh.favorites
import android.content.Context
import android.net.wifi.WifiManager
import android.os.PowerManager
import com.elvishew.xlog.XLog
import eu.kanade.tachiyomi.R
import eu.kanade.tachiyomi.data.database.DatabaseHelper
import eu.kanade.tachiyomi.data.database.models.Category
@ -21,6 +20,7 @@ import exh.GalleryAddEvent
import exh.GalleryAdder
import exh.eh.EHentaiThrottleManager
import exh.eh.EHentaiUpdateWorker
import exh.log.xLog
import exh.source.EH_SOURCE_ID
import exh.source.EXH_SOURCE_ID
import exh.source.isEhBasedManga
@ -61,7 +61,7 @@ class FavoritesSyncHelper(val context: Context) {
private var wifiLock: WifiManager.WifiLock? = 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))
@ -381,7 +381,7 @@ class FavoritesSyncHelper(val context: Context) {
if (result is GalleryAddEvent.Fail) {
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
return@forEachIndexed
}

View File

@ -119,22 +119,22 @@ class EnhancedFilePrinter internal constructor(
/**
* The file name generator for log file.
*/
private var fileNameGenerator: FileNameGenerator? = null
var fileNameGenerator: FileNameGenerator? = null
/**
* The backup strategy for log file.
*/
private var backupStrategy: BackupStrategy? = null
var backupStrategy: BackupStrategy? = null
/**
* The clean strategy for log file.
*/
private var cleanStrategy: CleanStrategy? = null
var cleanStrategy: CleanStrategy? = null
/**
* The flattener when print a log.
*/
private var flattener: Flattener? = null
var flattener: Flattener? = null
/**
* Set the file name generator for log file.
@ -194,6 +194,12 @@ class EnhancedFilePrinter internal constructor(
flattener ?: DefaultsFactory.createFlattener2()
)
}
companion object {
operator fun invoke(folderPath: String, block: Builder.() -> Unit): EnhancedFilePrinter {
return Builder(folderPath).apply(block).build()
}
}
}
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
import com.elvishew.xlog.XLog
import eu.kanade.tachiyomi.data.database.DatabaseHelper
import eu.kanade.tachiyomi.data.database.models.Manga
import eu.kanade.tachiyomi.network.parseAs
import eu.kanade.tachiyomi.source.model.SManga
import eu.kanade.tachiyomi.util.asJsoup
import exh.log.xLogE
import exh.md.handlers.serializers.ApiChapterSerializer
import exh.md.handlers.serializers.ApiMangaSerializer
import exh.md.handlers.serializers.ChapterSerializer
@ -150,7 +150,7 @@ class ApiMangaParser(private val lang: String) {
if (tags.isNotEmpty()) tags.clear()
tags += genres.map { RaisedTag(null, it, MangaDexSearchMetadata.TAG_TYPE_DEFAULT) }
} catch (e: Exception) {
XLog.tag("ApiMangaParser").enableStackTrace(2).e(e)
xLogE(e)
throw e
}
}
@ -256,7 +256,7 @@ class ApiMangaParser(private val lang: String) {
}
return response.parseAs<ApiChapterSerializer>().data.mangaId
} catch (e: Exception) {
XLog.tag("ApiMangaParser").enableStackTrace(2).e(e)
xLogE(e)
throw e
}
}

View File

@ -1,6 +1,5 @@
package exh.md.handlers
import com.elvishew.xlog.XLog
import eu.kanade.tachiyomi.data.database.models.Track
import eu.kanade.tachiyomi.data.preference.PreferencesHelper
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.SManga
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.FollowsIndividualSerializer
import exh.md.handlers.serializers.FollowsPageSerializer
@ -50,7 +51,7 @@ class FollowsHandler(val client: OkHttpClient, val headers: Headers, val prefere
response.body?.string().orEmpty()
)
} catch (e: Exception) {
XLog.tag("FollowsHandler").enableStackTrace(2).e("error parsing follows", e)
xLogE("error parsing follows", e)
FollowsPageSerializer(404, emptyList())
}
@ -78,7 +79,7 @@ class FollowsHandler(val client: OkHttpClient, val headers: Headers, val prefere
val followsPageResult = try {
response.parseAs<FollowsIndividualSerializer>(MdUtil.jsonParser)
} catch (e: Exception) {
XLog.tag("FollowsHandler").enableStackTrace(2).e("error parsing follows", e)
xLogE("error parsing follows", e)
throw e
}
@ -161,7 +162,7 @@ class FollowsHandler(val client: OkHttpClient, val headers: Headers, val prefere
val formBody = FormBody.Builder()
.add("volume", "0")
.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(
POST(
"${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 {
response.body?.string()
.also { XLog.tag("FollowsHandler").d(it) }
.also { xLogD(it) }
.let { it != null && it.isEmpty() }
}
}

View File

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

View File

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

View File

@ -1,7 +1,6 @@
package exh.uconfig
import android.content.Context
import com.elvishew.xlog.XLog
import eu.kanade.tachiyomi.R
import eu.kanade.tachiyomi.data.preference.PreferencesHelper
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.util.asJsoup
import exh.log.maybeInjectEHLogger
import exh.log.xLogD
import exh.source.EH_SOURCE_ID
import exh.source.EXH_SOURCE_ID
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(exhSource, hathPerks)

View File

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

View File

@ -12,7 +12,6 @@ import android.webkit.WebChromeClient
import android.webkit.WebView
import androidx.appcompat.app.AppCompatActivity
import com.afollestad.materialdialogs.MaterialDialog
import com.elvishew.xlog.XLog
import eu.kanade.tachiyomi.R
import eu.kanade.tachiyomi.data.preference.PreferencesHelper
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.util.lang.withUIContext
import eu.kanade.tachiyomi.util.system.setDefaultSettings
import exh.log.xLogD
import exh.log.xLogE
import exh.source.DelegatedHttpSource
import exh.util.melt
import kotlinx.coroutines.runBlocking
@ -186,7 +187,7 @@ class BrowserActionActivity : AppCompatActivity() {
suspend fun captchaSolveFail() {
currentLoopId = null
validateCurrentLoopId = null
XLog.tag("BrowserActionActivity").enableStackTrace(2).e(IllegalStateException("Captcha solve failure!"))
xLogE(IllegalStateException("Captcha solve failure!"))
withUIContext {
binding.webview.evaluateJavascript(SOLVE_UI_SCRIPT_HIDE, null)
MaterialDialog(this@BrowserActionActivity)
@ -230,7 +231,7 @@ class BrowserActionActivity : AppCompatActivity() {
val ih = splitResult[3]
val x = binding.webview.x + origX / iw * binding.webview.width
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)
binding.webview.post {
doStageDownloadAudio(loopId)
@ -246,12 +247,12 @@ class BrowserActionActivity : AppCompatActivity() {
}
STAGE_DOWNLOAD_AUDIO -> {
if (result != null) {
XLog.tag("BrowserActionActivity").d("Got audio URL: $result")
xLogD("Got audio URL: $result")
performRecognize(result)
.observeOn(Schedulers.io())
.subscribe(
{
XLog.tag("BrowserActionActivity").d("Got audio transcript: $it")
xLogD("Got audio transcript: $it")
binding.webview.post {
typeResult(
loopId,
@ -464,7 +465,7 @@ class BrowserActionActivity : AppCompatActivity() {
if (loopId != validateCurrentLoopId) return
if (result) {
XLog.tag("BrowserActionActivity").d("Captcha solved!")
xLogD("Captcha solved!")
binding.webview.post {
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.WebViewClient
import androidx.core.view.isVisible
import com.elvishew.xlog.XLog
import eu.kanade.tachiyomi.data.preference.PreferencesHelper
import eu.kanade.tachiyomi.databinding.EhActivityLoginBinding
import eu.kanade.tachiyomi.source.SourceManager
import eu.kanade.tachiyomi.ui.base.controller.NucleusController
import eu.kanade.tachiyomi.util.lang.launchUI
import eu.kanade.tachiyomi.util.system.setDefaultSettings
import exh.log.xLogD
import exh.uconfig.WarnConfigureDialogController
import uy.kohesive.injekt.injectLazy
import java.net.HttpCookie
@ -91,7 +91,7 @@ class LoginController : NucleusController<EhActivityLoginBinding, LoginPresenter
binding.webview.webViewClient = object : WebViewClient() {
override fun onPageFinished(view: WebView, url: String) {
super.onPageFinished(view, url)
XLog.tag("LoginController").d(url)
xLogD(url)
val parsedUrl = Uri.parse(url)
if (parsedUrl.host.equals("forums.e-hentai.org", ignoreCase = true)) {
// Hide distracting content

View File

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