Upgrade logging, now maps timber to XLog, new logging functions
This commit is contained in:
parent
9457b832fc
commit
7e91ae02f1
@ -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 {
|
||||
|
@ -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)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -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 <--
|
||||
|
@ -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 <--
|
||||
|
@ -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()
|
||||
}
|
||||
|
||||
|
@ -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)
|
||||
|
@ -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
|
||||
|
@ -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)
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -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
|
||||
|
@ -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()
|
||||
}
|
||||
|
@ -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())
|
||||
}
|
||||
|
@ -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()
|
||||
|
@ -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())
|
||||
}
|
||||
|
||||
|
@ -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 <--
|
||||
}
|
||||
|
@ -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!")
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -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()
|
||||
|
@ -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
|
||||
}
|
||||
|
@ -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
|
||||
}
|
||||
|
||||
|
@ -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
|
||||
}
|
||||
|
@ -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(
|
||||
|
76
app/src/main/java/exh/log/Logging.kt
Normal file
76
app/src/main/java/exh/log/Logging.kt
Normal 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
|
||||
)
|
||||
}
|
||||
}
|
35
app/src/main/java/exh/log/XLogTree.kt
Normal file
35
app/src/main/java/exh/log/XLogTree.kt
Normal 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
|
||||
}
|
||||
}
|
||||
}
|
@ -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
|
||||
}
|
||||
}
|
||||
|
@ -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() }
|
||||
}
|
||||
}
|
||||
|
@ -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()
|
||||
|
@ -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()
|
||||
|
@ -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)
|
||||
|
@ -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) {
|
||||
|
@ -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)
|
||||
}
|
||||
|
@ -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
|
||||
|
@ -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()
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user