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")
|
implementation("com.google.firebase:firebase-crashlytics-ktx:17.3.1")
|
||||||
|
|
||||||
// Better logging (EH)
|
// Better logging (EH)
|
||||||
implementation("com.elvishew:xlog:1.7.1")
|
implementation("com.elvishew:xlog:1.8.0")
|
||||||
|
|
||||||
// Debug utils (EH)
|
// Debug utils (EH)
|
||||||
val debugOverlayVersion = "1.1.3"
|
val debugOverlayVersion = "1.1.3"
|
||||||
@ -307,7 +307,7 @@ dependencies {
|
|||||||
implementation("androidx.gridlayout:gridlayout:1.0.0")
|
implementation("androidx.gridlayout:gridlayout:1.0.0")
|
||||||
|
|
||||||
implementation("com.mikepenz:fastadapter:5.3.4")
|
implementation("com.mikepenz:fastadapter:5.3.4")
|
||||||
// SY -->
|
// SY <--
|
||||||
}
|
}
|
||||||
|
|
||||||
tasks {
|
tasks {
|
||||||
|
@ -22,7 +22,6 @@ import com.elvishew.xlog.printer.file.naming.DateFileNameGenerator
|
|||||||
import com.google.android.gms.common.GooglePlayServicesNotAvailableException
|
import com.google.android.gms.common.GooglePlayServicesNotAvailableException
|
||||||
import com.google.android.gms.common.GooglePlayServicesRepairableException
|
import com.google.android.gms.common.GooglePlayServicesRepairableException
|
||||||
import com.google.android.gms.security.ProviderInstaller
|
import com.google.android.gms.security.ProviderInstaller
|
||||||
import com.google.firebase.analytics.FirebaseAnalytics
|
|
||||||
import com.google.firebase.analytics.ktx.analytics
|
import com.google.firebase.analytics.ktx.analytics
|
||||||
import com.google.firebase.ktx.Firebase
|
import com.google.firebase.ktx.Firebase
|
||||||
import com.ms_square.debugoverlay.DebugOverlay
|
import com.ms_square.debugoverlay.DebugOverlay
|
||||||
@ -36,6 +35,9 @@ import exh.log.CrashlyticsPrinter
|
|||||||
import exh.log.EHDebugModeOverlay
|
import exh.log.EHDebugModeOverlay
|
||||||
import exh.log.EHLogLevel
|
import exh.log.EHLogLevel
|
||||||
import exh.log.EnhancedFilePrinter
|
import exh.log.EnhancedFilePrinter
|
||||||
|
import exh.log.XLogTree
|
||||||
|
import exh.log.xLogD
|
||||||
|
import exh.log.xLogE
|
||||||
import exh.syDebugVersion
|
import exh.syDebugVersion
|
||||||
import io.realm.Realm
|
import io.realm.Realm
|
||||||
import org.conscrypt.Conscrypt
|
import org.conscrypt.Conscrypt
|
||||||
@ -55,12 +57,11 @@ open class App : Application(), LifecycleObserver {
|
|||||||
|
|
||||||
private val preferences: PreferencesHelper by injectLazy()
|
private val preferences: PreferencesHelper by injectLazy()
|
||||||
|
|
||||||
private lateinit var firebaseAnalytics: FirebaseAnalytics
|
|
||||||
|
|
||||||
override fun onCreate() {
|
override fun onCreate() {
|
||||||
super.onCreate()
|
super.onCreate()
|
||||||
if (BuildConfig.DEBUG) Timber.plant(Timber.DebugTree())
|
// if (BuildConfig.DEBUG) Timber.plant(Timber.DebugTree())
|
||||||
setupExhLogging() // EXH logging
|
setupExhLogging() // EXH logging
|
||||||
|
Timber.plant(XLogTree()) // SY Redirect Timber to XLog
|
||||||
if (!BuildConfig.DEBUG) addAnalytics()
|
if (!BuildConfig.DEBUG) addAnalytics()
|
||||||
|
|
||||||
workaroundAndroid7BrokenSSL()
|
workaroundAndroid7BrokenSSL()
|
||||||
@ -100,23 +101,22 @@ open class App : Application(), LifecycleObserver {
|
|||||||
try {
|
try {
|
||||||
SSLContext.getInstance("TLSv1.2")
|
SSLContext.getInstance("TLSv1.2")
|
||||||
} catch (e: NoSuchAlgorithmException) {
|
} catch (e: NoSuchAlgorithmException) {
|
||||||
XLog.tag("Init").e("Could not install Android 7 broken SSL workaround!", e)
|
xLogE("Could not install Android 7 broken SSL workaround!", e)
|
||||||
}
|
}
|
||||||
|
|
||||||
try {
|
try {
|
||||||
ProviderInstaller.installIfNeeded(applicationContext)
|
ProviderInstaller.installIfNeeded(applicationContext)
|
||||||
} catch (e: GooglePlayServicesRepairableException) {
|
} catch (e: GooglePlayServicesRepairableException) {
|
||||||
XLog.tag("Init").e("Could not install Android 7 broken SSL workaround!", e)
|
xLogE("Could not install Android 7 broken SSL workaround!", e)
|
||||||
} catch (e: GooglePlayServicesNotAvailableException) {
|
} catch (e: GooglePlayServicesNotAvailableException) {
|
||||||
XLog.tag("Init").e("Could not install Android 7 broken SSL workaround!", e)
|
xLogE("Could not install Android 7 broken SSL workaround!", e)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun addAnalytics() {
|
private fun addAnalytics() {
|
||||||
firebaseAnalytics = Firebase.analytics
|
|
||||||
if (syDebugVersion != "0") {
|
if (syDebugVersion != "0") {
|
||||||
firebaseAnalytics.setUserProperty("preview_version", syDebugVersion)
|
Firebase.analytics.setUserProperty("preview_version", syDebugVersion)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -137,8 +137,8 @@ open class App : Application(), LifecycleObserver {
|
|||||||
EHLogLevel.init(this)
|
EHLogLevel.init(this)
|
||||||
|
|
||||||
val logLevel = when {
|
val logLevel = when {
|
||||||
EHLogLevel.shouldLog(EHLogLevel.EXTRA) -> LogLevel.ALL
|
EHLogLevel.shouldLog(EHLogLevel.EXTREME) -> LogLevel.ALL
|
||||||
BuildConfig.DEBUG -> LogLevel.DEBUG
|
EHLogLevel.shouldLog(EHLogLevel.EXTRA) || BuildConfig.DEBUG -> LogLevel.DEBUG
|
||||||
else -> LogLevel.WARN
|
else -> LogLevel.WARN
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -160,9 +160,8 @@ open class App : Application(), LifecycleObserver {
|
|||||||
|
|
||||||
@OptIn(ExperimentalTime::class)
|
@OptIn(ExperimentalTime::class)
|
||||||
printers += EnhancedFilePrinter
|
printers += EnhancedFilePrinter
|
||||||
.Builder(logFolder.absolutePath)
|
.Builder(logFolder.absolutePath) {
|
||||||
.fileNameGenerator(
|
fileNameGenerator = object : DateFileNameGenerator() {
|
||||||
object : DateFileNameGenerator() {
|
|
||||||
override fun generateFileName(logLevel: Int, timestamp: Long): String {
|
override fun generateFileName(logLevel: Int, timestamp: Long): String {
|
||||||
return super.generateFileName(
|
return super.generateFileName(
|
||||||
logLevel,
|
logLevel,
|
||||||
@ -170,13 +169,12 @@ open class App : Application(), LifecycleObserver {
|
|||||||
) + "-${BuildConfig.BUILD_TYPE}.log"
|
) + "-${BuildConfig.BUILD_TYPE}.log"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
)
|
flattener { timeMillis, level, tag, message ->
|
||||||
.flattener { timeMillis, level, tag, message ->
|
"${dateFormat.format(timeMillis)} ${LogLevel.getShortLevelName(level)}/$tag: $message"
|
||||||
"${dateFormat.format(timeMillis)} ${LogLevel.getShortLevelName(level)}/$tag: $message"
|
}
|
||||||
|
cleanStrategy = FileLastModifiedCleanStrategy(7.days.toLongMilliseconds())
|
||||||
|
backupStrategy = NeverBackupStrategy()
|
||||||
}
|
}
|
||||||
.cleanStrategy(FileLastModifiedCleanStrategy(7.days.toLongMilliseconds()))
|
|
||||||
.backupStrategy(NeverBackupStrategy())
|
|
||||||
.build()
|
|
||||||
|
|
||||||
// Install Crashlytics in prod
|
// Install Crashlytics in prod
|
||||||
if (!BuildConfig.DEBUG) {
|
if (!BuildConfig.DEBUG) {
|
||||||
@ -188,8 +186,8 @@ open class App : Application(), LifecycleObserver {
|
|||||||
*printers.toTypedArray()
|
*printers.toTypedArray()
|
||||||
)
|
)
|
||||||
|
|
||||||
XLog.tag("Init").d("Application booting...")
|
xLogD("Application booting...")
|
||||||
XLog.tag("Init").d(
|
xLogD(
|
||||||
"App version: ${BuildConfig.VERSION_NAME} (${BuildConfig.FLAVOR}, ${BuildConfig.COMMIT_SHA}, ${BuildConfig.VERSION_CODE})\n" +
|
"App version: ${BuildConfig.VERSION_NAME} (${BuildConfig.FLAVOR}, ${BuildConfig.COMMIT_SHA}, ${BuildConfig.VERSION_CODE})\n" +
|
||||||
"Preview build: $syDebugVersion\n" +
|
"Preview build: $syDebugVersion\n" +
|
||||||
"Android version: ${Build.VERSION.RELEASE} (SDK ${Build.VERSION.SDK_INT}) \n" +
|
"Android version: ${Build.VERSION.RELEASE} (SDK ${Build.VERSION.SDK_INT}) \n" +
|
||||||
@ -214,7 +212,7 @@ open class App : Application(), LifecycleObserver {
|
|||||||
.install()
|
.install()
|
||||||
} catch (e: IllegalStateException) {
|
} catch (e: IllegalStateException) {
|
||||||
// Crashes if app is in background
|
// Crashes if app is in background
|
||||||
XLog.tag("Init").e("Failed to initialize debug overlay, app in background?", e)
|
xLogE("Failed to initialize debug overlay, app in background?", e)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -3,7 +3,6 @@ package eu.kanade.tachiyomi.extension
|
|||||||
import android.content.Context
|
import android.content.Context
|
||||||
import android.graphics.drawable.Drawable
|
import android.graphics.drawable.Drawable
|
||||||
import androidx.core.content.ContextCompat
|
import androidx.core.content.ContextCompat
|
||||||
import com.elvishew.xlog.XLog
|
|
||||||
import com.jakewharton.rxrelay.BehaviorRelay
|
import com.jakewharton.rxrelay.BehaviorRelay
|
||||||
import eu.kanade.tachiyomi.R
|
import eu.kanade.tachiyomi.R
|
||||||
import eu.kanade.tachiyomi.data.preference.PreferencesHelper
|
import eu.kanade.tachiyomi.data.preference.PreferencesHelper
|
||||||
@ -19,6 +18,7 @@ import eu.kanade.tachiyomi.source.Source
|
|||||||
import eu.kanade.tachiyomi.source.SourceManager
|
import eu.kanade.tachiyomi.source.SourceManager
|
||||||
import eu.kanade.tachiyomi.util.lang.launchNow
|
import eu.kanade.tachiyomi.util.lang.launchNow
|
||||||
import eu.kanade.tachiyomi.util.system.toast
|
import eu.kanade.tachiyomi.util.system.toast
|
||||||
|
import exh.log.xLogD
|
||||||
import exh.source.BlacklistedSources
|
import exh.source.BlacklistedSources
|
||||||
import exh.source.EH_SOURCE_ID
|
import exh.source.EH_SOURCE_ID
|
||||||
import exh.source.EXH_SOURCE_ID
|
import exh.source.EXH_SOURCE_ID
|
||||||
@ -158,7 +158,7 @@ class ExtensionManager(
|
|||||||
val blacklistEnabled = preferences.enableSourceBlacklist().get()
|
val blacklistEnabled = preferences.enableSourceBlacklist().get()
|
||||||
return filter {
|
return filter {
|
||||||
if (it.isBlacklisted(blacklistEnabled)) {
|
if (it.isBlacklisted(blacklistEnabled)) {
|
||||||
XLog.tag("ExtensionManager").d("Removing blacklisted extension: (name: %s, pkgName: %s)!", it.name, it.pkgName)
|
xLogD("Removing blacklisted extension: (name: %s, pkgName: %s)!", it.name, it.pkgName)
|
||||||
false
|
false
|
||||||
} else true
|
} else true
|
||||||
}
|
}
|
||||||
@ -333,7 +333,7 @@ class ExtensionManager(
|
|||||||
private fun registerNewExtension(extension: Extension.Installed) {
|
private fun registerNewExtension(extension: Extension.Installed) {
|
||||||
// SY -->
|
// SY -->
|
||||||
if (extension.isBlacklisted()) {
|
if (extension.isBlacklisted()) {
|
||||||
XLog.tag("ExtensionManager").d("Removing blacklisted extension: (name: String, pkgName: %s)!", extension.name, extension.pkgName)
|
xLogD("Removing blacklisted extension: (name: String, pkgName: %s)!", extension.name, extension.pkgName)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
// SY <--
|
// SY <--
|
||||||
@ -351,7 +351,7 @@ class ExtensionManager(
|
|||||||
private fun registerUpdatedExtension(extension: Extension.Installed) {
|
private fun registerUpdatedExtension(extension: Extension.Installed) {
|
||||||
// SY -->
|
// SY -->
|
||||||
if (extension.isBlacklisted()) {
|
if (extension.isBlacklisted()) {
|
||||||
XLog.tag("ExtensionManager").d("Removing blacklisted extension: (name: String, pkgName: %s)!", extension.name, extension.pkgName)
|
xLogD("Removing blacklisted extension: (name: %s, pkgName: %s)!", extension.name, extension.pkgName)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
// SY <--
|
// SY <--
|
||||||
|
@ -1,7 +1,6 @@
|
|||||||
package eu.kanade.tachiyomi.source
|
package eu.kanade.tachiyomi.source
|
||||||
|
|
||||||
import android.content.Context
|
import android.content.Context
|
||||||
import com.elvishew.xlog.XLog
|
|
||||||
import eu.kanade.tachiyomi.R
|
import eu.kanade.tachiyomi.R
|
||||||
import eu.kanade.tachiyomi.data.preference.PreferencesHelper
|
import eu.kanade.tachiyomi.data.preference.PreferencesHelper
|
||||||
import eu.kanade.tachiyomi.source.model.Page
|
import eu.kanade.tachiyomi.source.model.Page
|
||||||
@ -19,6 +18,7 @@ import eu.kanade.tachiyomi.source.online.english.HBrowse
|
|||||||
import eu.kanade.tachiyomi.source.online.english.HentaiCafe
|
import eu.kanade.tachiyomi.source.online.english.HentaiCafe
|
||||||
import eu.kanade.tachiyomi.source.online.english.Pururin
|
import eu.kanade.tachiyomi.source.online.english.Pururin
|
||||||
import eu.kanade.tachiyomi.source.online.english.Tsumino
|
import eu.kanade.tachiyomi.source.online.english.Tsumino
|
||||||
|
import exh.log.xLogD
|
||||||
import exh.source.BlacklistedSources
|
import exh.source.BlacklistedSources
|
||||||
import exh.source.DelegatedHttpSource
|
import exh.source.DelegatedHttpSource
|
||||||
import exh.source.EH_SOURCE_ID
|
import exh.source.EH_SOURCE_ID
|
||||||
@ -115,7 +115,7 @@ open class SourceManager(private val context: Context) {
|
|||||||
} else DELEGATED_SOURCES[sourceQName]
|
} else DELEGATED_SOURCES[sourceQName]
|
||||||
} else null
|
} else null
|
||||||
val newSource = if (source is HttpSource && delegate != null) {
|
val newSource = if (source is HttpSource && delegate != null) {
|
||||||
XLog.tag("SourceManager").d("Delegating source: %s -> %s!", sourceQName, delegate.newSourceClass.qualifiedName)
|
xLogD("Delegating source: %s -> %s!", sourceQName, delegate.newSourceClass.qualifiedName)
|
||||||
val enhancedSource = EnhancedHttpSource(
|
val enhancedSource = EnhancedHttpSource(
|
||||||
source,
|
source,
|
||||||
delegate.newSourceClass.constructors.find { it.parameters.size == 2 }!!.call(source, context)
|
delegate.newSourceClass.constructors.find { it.parameters.size == 2 }!!.call(source, context)
|
||||||
@ -132,7 +132,7 @@ open class SourceManager(private val context: Context) {
|
|||||||
} else source
|
} else source
|
||||||
|
|
||||||
if (source.id in BlacklistedSources.BLACKLISTED_EXT_SOURCES) {
|
if (source.id in BlacklistedSources.BLACKLISTED_EXT_SOURCES) {
|
||||||
XLog.tag("SourceManager").d("Removing blacklisted source: (id: %s, name: %s, lang: %s)!", source.id, source.name, (source as? CatalogueSource)?.lang)
|
xLogD("Removing blacklisted source: (id: %s, name: %s, lang: %s)!", source.id, source.name, (source as? CatalogueSource)?.lang)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
// EXH <--
|
// EXH <--
|
||||||
|
@ -3,7 +3,6 @@ package eu.kanade.tachiyomi.source.online.all
|
|||||||
import android.content.Context
|
import android.content.Context
|
||||||
import android.net.Uri
|
import android.net.Uri
|
||||||
import androidx.core.net.toUri
|
import androidx.core.net.toUri
|
||||||
import com.elvishew.xlog.XLog
|
|
||||||
import eu.kanade.tachiyomi.annotations.Nsfw
|
import eu.kanade.tachiyomi.annotations.Nsfw
|
||||||
import eu.kanade.tachiyomi.data.database.models.Manga
|
import eu.kanade.tachiyomi.data.database.models.Manga
|
||||||
import eu.kanade.tachiyomi.data.preference.PreferencesHelper
|
import eu.kanade.tachiyomi.data.preference.PreferencesHelper
|
||||||
@ -31,6 +30,7 @@ import exh.eh.EHTags
|
|||||||
import exh.eh.EHentaiUpdateHelper
|
import exh.eh.EHentaiUpdateHelper
|
||||||
import exh.eh.EHentaiUpdateWorkerConstants
|
import exh.eh.EHentaiUpdateWorkerConstants
|
||||||
import exh.eh.GalleryEntry
|
import exh.eh.GalleryEntry
|
||||||
|
import exh.log.xLogD
|
||||||
import exh.metadata.MetadataUtil
|
import exh.metadata.MetadataUtil
|
||||||
import exh.metadata.metadata.EHentaiSearchMetadata
|
import exh.metadata.metadata.EHentaiSearchMetadata
|
||||||
import exh.metadata.metadata.EHentaiSearchMetadata.Companion.EH_GENRE_NAMESPACE
|
import exh.metadata.metadata.EHentaiSearchMetadata.Companion.EH_GENRE_NAMESPACE
|
||||||
@ -325,7 +325,7 @@ class EHentai(
|
|||||||
url = EHentaiSearchMetadata.normalizeUrl(parentLink)
|
url = EHentaiSearchMetadata.normalizeUrl(parentLink)
|
||||||
} else break
|
} else break
|
||||||
} else {
|
} else {
|
||||||
XLog.tag("EHentai").d("Parent cache hit: %s!", gid)
|
xLogD("Parent cache hit: %s!", gid)
|
||||||
url = EHentaiSearchMetadata.idAndTokenToUrl(
|
url = EHentaiSearchMetadata.idAndTokenToUrl(
|
||||||
cachedParent.gId,
|
cachedParent.gId,
|
||||||
cachedParent.gToken
|
cachedParent.gToken
|
||||||
@ -613,7 +613,7 @@ class EHentai(
|
|||||||
lastUpdateCheck - datePosted!! > EHentaiUpdateWorkerConstants.GALLERY_AGE_TIME
|
lastUpdateCheck - datePosted!! > EHentaiUpdateWorkerConstants.GALLERY_AGE_TIME
|
||||||
) {
|
) {
|
||||||
aged = true
|
aged = true
|
||||||
XLog.tag("EHentai").d("aged %s - too old", title)
|
xLogD("aged %s - too old", title)
|
||||||
}
|
}
|
||||||
|
|
||||||
// Parse ratings
|
// Parse ratings
|
||||||
@ -879,7 +879,7 @@ class EHentai(
|
|||||||
stringBuilder.append(" ")
|
stringBuilder.append(" ")
|
||||||
}
|
}
|
||||||
|
|
||||||
XLog.tag("EHentai").d(stringBuilder.toString())
|
xLogD(stringBuilder.toString())
|
||||||
return stringBuilder.toString().trim()
|
return stringBuilder.toString().trim()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1,6 +1,5 @@
|
|||||||
package eu.kanade.tachiyomi.source.online.all
|
package eu.kanade.tachiyomi.source.online.all
|
||||||
|
|
||||||
import com.elvishew.xlog.XLog
|
|
||||||
import eu.kanade.tachiyomi.data.database.DatabaseHelper
|
import eu.kanade.tachiyomi.data.database.DatabaseHelper
|
||||||
import eu.kanade.tachiyomi.data.database.models.Chapter
|
import eu.kanade.tachiyomi.data.database.models.Chapter
|
||||||
import eu.kanade.tachiyomi.data.database.models.Manga
|
import eu.kanade.tachiyomi.data.database.models.Manga
|
||||||
@ -19,6 +18,7 @@ import eu.kanade.tachiyomi.source.online.HttpSource
|
|||||||
import eu.kanade.tachiyomi.util.chapter.syncChaptersWithSource
|
import eu.kanade.tachiyomi.util.chapter.syncChaptersWithSource
|
||||||
import eu.kanade.tachiyomi.util.lang.withIOContext
|
import eu.kanade.tachiyomi.util.lang.withIOContext
|
||||||
import eu.kanade.tachiyomi.util.shouldDownloadNewChapters
|
import eu.kanade.tachiyomi.util.shouldDownloadNewChapters
|
||||||
|
import exh.log.xLogW
|
||||||
import exh.merged.sql.models.MergedMangaReference
|
import exh.merged.sql.models.MergedMangaReference
|
||||||
import exh.source.MERGED_SOURCE_ID
|
import exh.source.MERGED_SOURCE_ID
|
||||||
import exh.util.executeOnIO
|
import exh.util.executeOnIO
|
||||||
@ -185,7 +185,7 @@ class MergedSource : HttpSource() {
|
|||||||
mangaId = manga.id
|
mangaId = manga.id
|
||||||
db.insertNewMergedMangaId(this).executeOnIO()
|
db.insertNewMergedMangaId(this).executeOnIO()
|
||||||
} catch (e: Exception) {
|
} catch (e: Exception) {
|
||||||
XLog.tag("MergedSource").enableStackTrace(e.stackTrace.contentToString(), 5)
|
xLogW("Error inserting merged manga id", e)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return LoadedMangaSource(source, manga, this)
|
return LoadedMangaSource(source, manga, this)
|
||||||
|
@ -17,7 +17,6 @@ import androidx.recyclerview.widget.RecyclerView
|
|||||||
import com.afollestad.materialdialogs.MaterialDialog
|
import com.afollestad.materialdialogs.MaterialDialog
|
||||||
import com.afollestad.materialdialogs.input.input
|
import com.afollestad.materialdialogs.input.input
|
||||||
import com.afollestad.materialdialogs.list.listItems
|
import com.afollestad.materialdialogs.list.listItems
|
||||||
import com.elvishew.xlog.XLog
|
|
||||||
import com.google.android.material.floatingactionbutton.ExtendedFloatingActionButton
|
import com.google.android.material.floatingactionbutton.ExtendedFloatingActionButton
|
||||||
import com.google.android.material.snackbar.Snackbar
|
import com.google.android.material.snackbar.Snackbar
|
||||||
import com.tfcporciuncula.flow.Preference
|
import com.tfcporciuncula.flow.Preference
|
||||||
@ -57,6 +56,7 @@ import eu.kanade.tachiyomi.util.view.shrinkOnScroll
|
|||||||
import eu.kanade.tachiyomi.util.view.snack
|
import eu.kanade.tachiyomi.util.view.snack
|
||||||
import eu.kanade.tachiyomi.widget.AutofitRecyclerView
|
import eu.kanade.tachiyomi.widget.AutofitRecyclerView
|
||||||
import eu.kanade.tachiyomi.widget.EmptyView
|
import eu.kanade.tachiyomi.widget.EmptyView
|
||||||
|
import exh.log.xLogW
|
||||||
import exh.md.similar.ui.EnableMangaDexSimilarDialogController
|
import exh.md.similar.ui.EnableMangaDexSimilarDialogController
|
||||||
import exh.savedsearches.EXHSavedSearch
|
import exh.savedsearches.EXHSavedSearch
|
||||||
import exh.source.getMainSource
|
import exh.source.getMainSource
|
||||||
@ -542,8 +542,8 @@ open class BrowseSourceController(bundle: Bundle) :
|
|||||||
*/
|
*/
|
||||||
/* SY --> */ open /* SY <-- */fun onAddPageError(error: Throwable) {
|
/* SY --> */ open /* SY <-- */fun onAddPageError(error: Throwable) {
|
||||||
// SY -->
|
// SY -->
|
||||||
XLog.tag("BrowseSourceController").enableStackTrace(2).w("> Failed to load next catalogue page!", error)
|
xLogW("> Failed to load next catalogue page!", error)
|
||||||
XLog.tag("BrowseSourceController").enableStackTrace(2).w(
|
xLogW(
|
||||||
"> (source.id: %s, source.name: %s)",
|
"> (source.id: %s, source.name: %s)",
|
||||||
presenter.source.id,
|
presenter.source.id,
|
||||||
presenter.source.name
|
presenter.source.name
|
||||||
|
@ -7,7 +7,6 @@ import android.widget.AutoCompleteTextView
|
|||||||
import android.widget.TextView
|
import android.widget.TextView
|
||||||
import androidx.core.widget.addTextChangedListener
|
import androidx.core.widget.addTextChangedListener
|
||||||
import androidx.recyclerview.widget.RecyclerView
|
import androidx.recyclerview.widget.RecyclerView
|
||||||
import com.elvishew.xlog.XLog
|
|
||||||
import com.google.android.material.chip.Chip
|
import com.google.android.material.chip.Chip
|
||||||
import com.google.android.material.chip.ChipGroup
|
import com.google.android.material.chip.ChipGroup
|
||||||
import eu.davidea.flexibleadapter.FlexibleAdapter
|
import eu.davidea.flexibleadapter.FlexibleAdapter
|
||||||
@ -17,6 +16,7 @@ import eu.davidea.viewholders.FlexibleViewHolder
|
|||||||
import eu.kanade.tachiyomi.R
|
import eu.kanade.tachiyomi.R
|
||||||
import eu.kanade.tachiyomi.source.model.Filter
|
import eu.kanade.tachiyomi.source.model.Filter
|
||||||
import eu.kanade.tachiyomi.widget.AutoCompleteAdapter
|
import eu.kanade.tachiyomi.widget.AutoCompleteAdapter
|
||||||
|
import exh.log.xLogD
|
||||||
|
|
||||||
open class AutoComplete(val filter: Filter.AutoComplete) : AbstractFlexibleItem<AutoComplete.Holder>() {
|
open class AutoComplete(val filter: Filter.AutoComplete) : AbstractFlexibleItem<AutoComplete.Holder>() {
|
||||||
|
|
||||||
@ -97,7 +97,7 @@ open class AutoComplete(val filter: Filter.AutoComplete) : AbstractFlexibleItem<
|
|||||||
addChipToGroup(name, holder)
|
addChipToGroup(name, holder)
|
||||||
filter.state += name
|
filter.state += name
|
||||||
} else {
|
} else {
|
||||||
XLog.tag("AutoComplete").d("Invalid tag: $name")
|
xLogD("Invalid tag: %s", name)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -5,9 +5,9 @@ import android.os.Bundle
|
|||||||
import com.afollestad.materialdialogs.MaterialDialog
|
import com.afollestad.materialdialogs.MaterialDialog
|
||||||
import com.afollestad.materialdialogs.datetime.timePicker
|
import com.afollestad.materialdialogs.datetime.timePicker
|
||||||
import com.bluelinelabs.conductor.Controller
|
import com.bluelinelabs.conductor.Controller
|
||||||
import com.elvishew.xlog.XLog
|
|
||||||
import eu.kanade.tachiyomi.R
|
import eu.kanade.tachiyomi.R
|
||||||
import eu.kanade.tachiyomi.ui.base.controller.DialogController
|
import eu.kanade.tachiyomi.ui.base.controller.DialogController
|
||||||
|
import exh.log.xLogD
|
||||||
import java.util.Calendar
|
import java.util.Calendar
|
||||||
import kotlin.time.Duration
|
import kotlin.time.Duration
|
||||||
import kotlin.time.ExperimentalTime
|
import kotlin.time.ExperimentalTime
|
||||||
@ -48,9 +48,9 @@ class BiometricTimesCreateDialog<T>(bundle: Bundle? = null) : DialogController(b
|
|||||||
.title(if (startTime == null) R.string.biometric_lock_start_time else R.string.biometric_lock_end_time)
|
.title(if (startTime == null) R.string.biometric_lock_start_time else R.string.biometric_lock_end_time)
|
||||||
.timePicker(show24HoursView = false) { _, datetime ->
|
.timePicker(show24HoursView = false) { _, datetime ->
|
||||||
val hour = datetime.get(Calendar.HOUR_OF_DAY)
|
val hour = datetime.get(Calendar.HOUR_OF_DAY)
|
||||||
XLog.disableStackTrace().d(hour)
|
xLogD(hour)
|
||||||
val minute = datetime.get(Calendar.MINUTE)
|
val minute = datetime.get(Calendar.MINUTE)
|
||||||
XLog.disableStackTrace().d(minute)
|
xLogD(minute)
|
||||||
if (hour !in 0..24 || minute !in 0..60) return@timePicker
|
if (hour !in 0..24 || minute !in 0..60) return@timePicker
|
||||||
if (startTime != null) {
|
if (startTime != null) {
|
||||||
endTime = hour.hours + minute.minutes
|
endTime = hour.hours + minute.minutes
|
||||||
|
@ -1,10 +1,10 @@
|
|||||||
package eu.kanade.tachiyomi.ui.category.biometric
|
package eu.kanade.tachiyomi.ui.category.biometric
|
||||||
|
|
||||||
import android.os.Bundle
|
import android.os.Bundle
|
||||||
import com.elvishew.xlog.XLog
|
|
||||||
import eu.kanade.tachiyomi.data.preference.PreferencesHelper
|
import eu.kanade.tachiyomi.data.preference.PreferencesHelper
|
||||||
import eu.kanade.tachiyomi.data.preference.plusAssign
|
import eu.kanade.tachiyomi.data.preference.plusAssign
|
||||||
import eu.kanade.tachiyomi.ui.base.presenter.BasePresenter
|
import eu.kanade.tachiyomi.ui.base.presenter.BasePresenter
|
||||||
|
import exh.log.xLogD
|
||||||
import kotlinx.coroutines.flow.launchIn
|
import kotlinx.coroutines.flow.launchIn
|
||||||
import kotlinx.coroutines.flow.onEach
|
import kotlinx.coroutines.flow.onEach
|
||||||
import rx.Observable
|
import rx.Observable
|
||||||
@ -36,7 +36,7 @@ class BiometricTimesPresenter : BasePresenter<BiometricTimesController>() {
|
|||||||
|
|
||||||
preferences.biometricTimeRanges().asFlow().onEach { prefTimeRanges ->
|
preferences.biometricTimeRanges().asFlow().onEach { prefTimeRanges ->
|
||||||
timeRanges = prefTimeRanges.toList()
|
timeRanges = prefTimeRanges.toList()
|
||||||
.mapNotNull { TimeRange.fromPreferenceString(it) }.onEach { XLog.disableStackTrace().d(it) }
|
.mapNotNull { TimeRange.fromPreferenceString(it) }.onEach { xLogD(it) }
|
||||||
|
|
||||||
Observable.just(timeRanges)
|
Observable.just(timeRanges)
|
||||||
.map { it.map(::BiometricTimesItem) }
|
.map { it.map(::BiometricTimesItem) }
|
||||||
@ -57,7 +57,7 @@ class BiometricTimesPresenter : BasePresenter<BiometricTimesController>() {
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
XLog.disableStackTrace().d(timeRange)
|
xLogD(timeRange)
|
||||||
|
|
||||||
preferences.biometricTimeRanges() += timeRange.toPreferenceString()
|
preferences.biometricTimeRanges() += timeRange.toPreferenceString()
|
||||||
}
|
}
|
||||||
|
@ -36,7 +36,6 @@ import com.afollestad.materialdialogs.list.listItemsSingleChoice
|
|||||||
import com.bluelinelabs.conductor.ControllerChangeHandler
|
import com.bluelinelabs.conductor.ControllerChangeHandler
|
||||||
import com.bluelinelabs.conductor.ControllerChangeType
|
import com.bluelinelabs.conductor.ControllerChangeType
|
||||||
import com.bumptech.glide.load.engine.DiskCacheStrategy
|
import com.bumptech.glide.load.engine.DiskCacheStrategy
|
||||||
import com.elvishew.xlog.XLog
|
|
||||||
import com.google.android.material.floatingactionbutton.ExtendedFloatingActionButton
|
import com.google.android.material.floatingactionbutton.ExtendedFloatingActionButton
|
||||||
import com.google.android.material.snackbar.Snackbar
|
import com.google.android.material.snackbar.Snackbar
|
||||||
import eu.davidea.flexibleadapter.FlexibleAdapter
|
import eu.davidea.flexibleadapter.FlexibleAdapter
|
||||||
@ -102,6 +101,7 @@ import eu.kanade.tachiyomi.util.system.toast
|
|||||||
import eu.kanade.tachiyomi.util.view.getCoordinates
|
import eu.kanade.tachiyomi.util.view.getCoordinates
|
||||||
import eu.kanade.tachiyomi.util.view.shrinkOnScroll
|
import eu.kanade.tachiyomi.util.view.shrinkOnScroll
|
||||||
import eu.kanade.tachiyomi.util.view.snack
|
import eu.kanade.tachiyomi.util.view.snack
|
||||||
|
import exh.log.xLogD
|
||||||
import exh.md.similar.ui.MangaDexSimilarController
|
import exh.md.similar.ui.MangaDexSimilarController
|
||||||
import exh.metadata.metadata.base.FlatMetadata
|
import exh.metadata.metadata.base.FlatMetadata
|
||||||
import exh.recs.RecommendsController
|
import exh.recs.RecommendsController
|
||||||
@ -355,7 +355,7 @@ class MangaController :
|
|||||||
|
|
||||||
presenter.redirectFlow
|
presenter.redirectFlow
|
||||||
.onEach { redirect ->
|
.onEach { redirect ->
|
||||||
XLog.d("Redirecting to updated manga (manga.id: %s, manga.title: %s, update: %s)!", redirect.manga.id, redirect.manga.title, redirect.update)
|
xLogD("Redirecting to updated manga (manga.id: %s, manga.title: %s, update: %s)!", redirect.manga.id, redirect.manga.title, redirect.update)
|
||||||
// Replace self
|
// Replace self
|
||||||
router?.replaceTopController(MangaController(redirect).withFadeTransaction())
|
router?.replaceTopController(MangaController(redirect).withFadeTransaction())
|
||||||
}
|
}
|
||||||
|
@ -4,7 +4,6 @@ import android.content.Context
|
|||||||
import android.net.Uri
|
import android.net.Uri
|
||||||
import android.os.Bundle
|
import android.os.Bundle
|
||||||
import android.os.Environment
|
import android.os.Environment
|
||||||
import com.elvishew.xlog.XLog
|
|
||||||
import com.jakewharton.rxrelay.PublishRelay
|
import com.jakewharton.rxrelay.PublishRelay
|
||||||
import eu.kanade.tachiyomi.R
|
import eu.kanade.tachiyomi.R
|
||||||
import eu.kanade.tachiyomi.data.cache.CoverCache
|
import eu.kanade.tachiyomi.data.cache.CoverCache
|
||||||
@ -46,6 +45,7 @@ import eu.kanade.tachiyomi.util.updateCoverLastModified
|
|||||||
import eu.kanade.tachiyomi.widget.ExtendedNavigationView.Item.TriStateGroup.State
|
import eu.kanade.tachiyomi.widget.ExtendedNavigationView.Item.TriStateGroup.State
|
||||||
import exh.debug.DebugToggles
|
import exh.debug.DebugToggles
|
||||||
import exh.eh.EHentaiUpdateHelper
|
import exh.eh.EHentaiUpdateHelper
|
||||||
|
import exh.log.xLogD
|
||||||
import exh.md.utils.FollowStatus
|
import exh.md.utils.FollowStatus
|
||||||
import exh.md.utils.MdUtil
|
import exh.md.utils.MdUtil
|
||||||
import exh.md.utils.scanlatorList
|
import exh.md.utils.scanlatorList
|
||||||
@ -236,7 +236,7 @@ class MangaPresenter(
|
|||||||
// Redirect if we are not the accepted root
|
// Redirect if we are not the accepted root
|
||||||
if (manga.id != acceptedChain.manga.id && acceptedChain.manga.favorite) {
|
if (manga.id != acceptedChain.manga.id && acceptedChain.manga.favorite) {
|
||||||
// Update if any of our chapters are not in accepted manga's chapters
|
// Update if any of our chapters are not in accepted manga's chapters
|
||||||
XLog.disableStackTrace().d("Found accepted manga ${manga.url}")
|
xLogD("Found accepted manga %s", manga.url)
|
||||||
val ourChapterUrls = chapters.map { it.url }.toSet()
|
val ourChapterUrls = chapters.map { it.url }.toSet()
|
||||||
val acceptedChapterUrls = acceptedChain.chapters.map { it.url }.toSet()
|
val acceptedChapterUrls = acceptedChain.chapters.map { it.url }.toSet()
|
||||||
val update = (ourChapterUrls - acceptedChapterUrls).isNotEmpty()
|
val update = (ourChapterUrls - acceptedChapterUrls).isNotEmpty()
|
||||||
|
@ -6,9 +6,9 @@ import android.view.ViewGroup
|
|||||||
import android.widget.AdapterView
|
import android.widget.AdapterView
|
||||||
import android.widget.ArrayAdapter
|
import android.widget.ArrayAdapter
|
||||||
import androidx.recyclerview.widget.RecyclerView
|
import androidx.recyclerview.widget.RecyclerView
|
||||||
import com.elvishew.xlog.XLog
|
|
||||||
import eu.kanade.tachiyomi.databinding.EditMergedSettingsHeaderBinding
|
import eu.kanade.tachiyomi.databinding.EditMergedSettingsHeaderBinding
|
||||||
import eu.kanade.tachiyomi.source.SourceManager
|
import eu.kanade.tachiyomi.source.SourceManager
|
||||||
|
import exh.log.xLogD
|
||||||
import exh.merged.sql.models.MergedMangaReference
|
import exh.merged.sql.models.MergedMangaReference
|
||||||
import uy.kohesive.injekt.injectLazy
|
import uy.kohesive.injekt.injectLazy
|
||||||
|
|
||||||
@ -74,7 +74,7 @@ class EditMergedSettingsHeaderAdapter(private val controller: EditMergedSettings
|
|||||||
3 -> MergedMangaReference.CHAPTER_SORT_HIGHEST_CHAPTER_NUMBER
|
3 -> MergedMangaReference.CHAPTER_SORT_HIGHEST_CHAPTER_NUMBER
|
||||||
else -> MergedMangaReference.CHAPTER_SORT_NO_DEDUPE
|
else -> MergedMangaReference.CHAPTER_SORT_NO_DEDUPE
|
||||||
}
|
}
|
||||||
XLog.d(controller.mergeReference?.chapterSortMode)
|
xLogD(controller.mergeReference?.chapterSortMode)
|
||||||
editMergedMangaItemSortingListener.onSetPrioritySort(canMove())
|
editMergedMangaItemSortingListener.onSetPrioritySort(canMove())
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -28,7 +28,6 @@ import androidx.core.view.setPadding
|
|||||||
import androidx.lifecycle.lifecycleScope
|
import androidx.lifecycle.lifecycleScope
|
||||||
import com.afollestad.materialdialogs.MaterialDialog
|
import com.afollestad.materialdialogs.MaterialDialog
|
||||||
import com.davemorrissey.labs.subscaleview.SubsamplingScaleImageView
|
import com.davemorrissey.labs.subscaleview.SubsamplingScaleImageView
|
||||||
import com.elvishew.xlog.XLog
|
|
||||||
import com.google.android.material.snackbar.Snackbar
|
import com.google.android.material.snackbar.Snackbar
|
||||||
import eu.kanade.tachiyomi.R
|
import eu.kanade.tachiyomi.R
|
||||||
import eu.kanade.tachiyomi.data.database.models.Chapter
|
import eu.kanade.tachiyomi.data.database.models.Chapter
|
||||||
@ -70,6 +69,7 @@ import eu.kanade.tachiyomi.util.view.showBar
|
|||||||
import eu.kanade.tachiyomi.util.view.snack
|
import eu.kanade.tachiyomi.util.view.snack
|
||||||
import eu.kanade.tachiyomi.widget.SimpleAnimationListener
|
import eu.kanade.tachiyomi.widget.SimpleAnimationListener
|
||||||
import eu.kanade.tachiyomi.widget.SimpleSeekBarListener
|
import eu.kanade.tachiyomi.widget.SimpleSeekBarListener
|
||||||
|
import exh.log.xLogE
|
||||||
import exh.source.isEhBasedSource
|
import exh.source.isEhBasedSource
|
||||||
import exh.util.defaultReaderType
|
import exh.util.defaultReaderType
|
||||||
import exh.util.mangaType
|
import exh.util.mangaType
|
||||||
@ -128,8 +128,6 @@ class ReaderActivity : BaseRxActivity<ReaderActivityBinding, ReaderPresenter>()
|
|||||||
private var autoScrollJob: Job? = null
|
private var autoScrollJob: Job? = null
|
||||||
private val sourceManager: SourceManager by injectLazy()
|
private val sourceManager: SourceManager by injectLazy()
|
||||||
|
|
||||||
private val logger = XLog.tag("ReaderActivity")
|
|
||||||
|
|
||||||
private lateinit var chapterBottomSheet: ReaderChapterSheet
|
private lateinit var chapterBottomSheet: ReaderChapterSheet
|
||||||
// SY <--
|
// SY <--
|
||||||
|
|
||||||
@ -985,7 +983,7 @@ class ReaderActivity : BaseRxActivity<ReaderActivityBinding, ReaderPresenter>()
|
|||||||
ReaderPageSheet(this, page).show()
|
ReaderPageSheet(this, page).show()
|
||||||
// EXH -->
|
// EXH -->
|
||||||
} catch (e: WindowManager.BadTokenException) {
|
} catch (e: WindowManager.BadTokenException) {
|
||||||
logger.e("Caught and ignoring reader page sheet launch exception!", e)
|
xLogE("Caught and ignoring reader page sheet launch exception!", e)
|
||||||
}
|
}
|
||||||
// EXH <--
|
// EXH <--
|
||||||
}
|
}
|
||||||
|
@ -1,7 +1,6 @@
|
|||||||
package exh
|
package exh
|
||||||
|
|
||||||
import android.content.Context
|
import android.content.Context
|
||||||
import com.elvishew.xlog.XLog
|
|
||||||
import com.pushtorefresh.storio.sqlite.queries.Query
|
import com.pushtorefresh.storio.sqlite.queries.Query
|
||||||
import com.pushtorefresh.storio.sqlite.queries.RawQuery
|
import com.pushtorefresh.storio.sqlite.queries.RawQuery
|
||||||
import eu.kanade.tachiyomi.BuildConfig
|
import eu.kanade.tachiyomi.BuildConfig
|
||||||
@ -24,6 +23,8 @@ import eu.kanade.tachiyomi.source.SourceManager
|
|||||||
import eu.kanade.tachiyomi.source.model.SManga
|
import eu.kanade.tachiyomi.source.model.SManga
|
||||||
import eu.kanade.tachiyomi.source.online.all.Hitomi
|
import eu.kanade.tachiyomi.source.online.all.Hitomi
|
||||||
import eu.kanade.tachiyomi.source.online.all.NHentai
|
import eu.kanade.tachiyomi.source.online.all.NHentai
|
||||||
|
import exh.log.xLogE
|
||||||
|
import exh.log.xLogW
|
||||||
import exh.merged.sql.models.MergedMangaReference
|
import exh.merged.sql.models.MergedMangaReference
|
||||||
import exh.source.BlacklistedSources
|
import exh.source.BlacklistedSources
|
||||||
import exh.source.EH_SOURCE_ID
|
import exh.source.EH_SOURCE_ID
|
||||||
@ -48,8 +49,6 @@ object EXHMigrations {
|
|||||||
private val db: DatabaseHelper by injectLazy()
|
private val db: DatabaseHelper by injectLazy()
|
||||||
private val sourceManager: SourceManager by injectLazy()
|
private val sourceManager: SourceManager by injectLazy()
|
||||||
|
|
||||||
private val logger by lazy { XLog.tag("EXHMigrations") }
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Performs a migration when the application is updated.
|
* Performs a migration when the application is updated.
|
||||||
*
|
*
|
||||||
@ -272,14 +271,14 @@ object EXHMigrations {
|
|||||||
// if (oldVersion < 1) { } (1 is current release version)
|
// if (oldVersion < 1) { } (1 is current release version)
|
||||||
// do stuff here when releasing changed crap
|
// do stuff here when releasing changed crap
|
||||||
|
|
||||||
// TODO BE CAREFUL TO NOT FUCK UP MergedSources IF CHANGING URLs
|
// TODO BE CAREFUL TO NOT FUCK UP MergedSources IF CHANGING URLsxdcsv
|
||||||
|
|
||||||
preferences.ehLastVersionCode().set(BuildConfig.VERSION_CODE)
|
preferences.ehLastVersionCode().set(BuildConfig.VERSION_CODE)
|
||||||
|
|
||||||
return true
|
return true
|
||||||
}
|
}
|
||||||
} catch (e: Exception) {
|
} catch (e: Exception) {
|
||||||
logger.e("Failed to migrate app from $oldVersion -> ${BuildConfig.VERSION_CODE}!", e)
|
xLogE("Failed to migrate app from $oldVersion -> ${BuildConfig.VERSION_CODE}!", e)
|
||||||
}
|
}
|
||||||
return false
|
return false
|
||||||
}
|
}
|
||||||
@ -334,7 +333,7 @@ object EXHMigrations {
|
|||||||
try {
|
try {
|
||||||
dbLocation.copyTo(backupLocation, overwrite = true)
|
dbLocation.copyTo(backupLocation, overwrite = true)
|
||||||
} catch (t: Throwable) {
|
} catch (t: Throwable) {
|
||||||
logger.enableStackTrace(2).w("Failed to backup database!")
|
xLogW("Failed to backup database!")
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -2,7 +2,6 @@ package exh
|
|||||||
|
|
||||||
import android.content.Context
|
import android.content.Context
|
||||||
import androidx.core.net.toUri
|
import androidx.core.net.toUri
|
||||||
import com.elvishew.xlog.XLog
|
|
||||||
import eu.kanade.tachiyomi.R
|
import eu.kanade.tachiyomi.R
|
||||||
import eu.kanade.tachiyomi.data.database.DatabaseHelper
|
import eu.kanade.tachiyomi.data.database.DatabaseHelper
|
||||||
import eu.kanade.tachiyomi.data.database.models.Chapter
|
import eu.kanade.tachiyomi.data.database.models.Chapter
|
||||||
@ -15,6 +14,7 @@ import eu.kanade.tachiyomi.source.model.toSManga
|
|||||||
import eu.kanade.tachiyomi.source.online.UrlImportableSource
|
import eu.kanade.tachiyomi.source.online.UrlImportableSource
|
||||||
import eu.kanade.tachiyomi.source.online.all.EHentai
|
import eu.kanade.tachiyomi.source.online.all.EHentai
|
||||||
import eu.kanade.tachiyomi.util.chapter.syncChaptersWithSource
|
import eu.kanade.tachiyomi.util.chapter.syncChaptersWithSource
|
||||||
|
import exh.log.xLogStack
|
||||||
import exh.source.getMainSource
|
import exh.source.getMainSource
|
||||||
import exh.util.executeOnIO
|
import exh.util.executeOnIO
|
||||||
import uy.kohesive.injekt.Injekt
|
import uy.kohesive.injekt.Injekt
|
||||||
@ -32,7 +32,7 @@ class GalleryAdder {
|
|||||||
preferences.enabledLanguages().get() to preferences.disabledSources().get().map { it.toLong() }.toSet()
|
preferences.enabledLanguages().get() to preferences.disabledSources().get().map { it.toLong() }.toSet()
|
||||||
}
|
}
|
||||||
|
|
||||||
private val logger = XLog.tag("GalleryAdder").enableStackTrace(2).build()
|
private val logger = xLogStack()
|
||||||
|
|
||||||
fun pickSource(url: String): List<UrlImportableSource> {
|
fun pickSource(url: String): List<UrlImportableSource> {
|
||||||
val uri = url.toUri()
|
val uri = url.toUri()
|
||||||
|
@ -1,7 +1,6 @@
|
|||||||
package exh.debug
|
package exh.debug
|
||||||
|
|
||||||
import android.app.Application
|
import android.app.Application
|
||||||
import com.elvishew.xlog.XLog
|
|
||||||
import com.pushtorefresh.storio.sqlite.queries.RawQuery
|
import com.pushtorefresh.storio.sqlite.queries.RawQuery
|
||||||
import eu.kanade.tachiyomi.data.database.DatabaseHelper
|
import eu.kanade.tachiyomi.data.database.DatabaseHelper
|
||||||
import eu.kanade.tachiyomi.data.database.models.toMangaInfo
|
import eu.kanade.tachiyomi.data.database.models.toMangaInfo
|
||||||
@ -13,6 +12,7 @@ import eu.kanade.tachiyomi.source.model.toSManga
|
|||||||
import exh.EXHMigrations
|
import exh.EXHMigrations
|
||||||
import exh.eh.EHentaiThrottleManager
|
import exh.eh.EHentaiThrottleManager
|
||||||
import exh.eh.EHentaiUpdateWorker
|
import exh.eh.EHentaiUpdateWorker
|
||||||
|
import exh.log.xLogE
|
||||||
import exh.metadata.metadata.EHentaiSearchMetadata
|
import exh.metadata.metadata.EHentaiSearchMetadata
|
||||||
import exh.metadata.metadata.base.getFlatMetadataForManga
|
import exh.metadata.metadata.base.getFlatMetadataForManga
|
||||||
import exh.metadata.metadata.base.insertFlatMetadataAsync
|
import exh.metadata.metadata.base.insertFlatMetadataAsync
|
||||||
@ -60,7 +60,7 @@ object DebugFunctions {
|
|||||||
}.toList()
|
}.toList()
|
||||||
|
|
||||||
allManga.forEach { manga ->
|
allManga.forEach { manga ->
|
||||||
val meta = db.getFlatMetadataForManga(manga.id!!).executeAsBlocking()?.raise<EHentaiSearchMetadata>() ?: return@forEach
|
val meta = db.getFlatMetadataForManga(manga.id!!).executeOnIO()?.raise<EHentaiSearchMetadata>() ?: return@forEach
|
||||||
// remove age flag
|
// remove age flag
|
||||||
meta.aged = false
|
meta.aged = false
|
||||||
db.insertFlatMetadataAsync(meta.flatten()).await()
|
db.insertFlatMetadataAsync(meta.flatten()).await()
|
||||||
@ -94,7 +94,7 @@ object DebugFunctions {
|
|||||||
)?.getMangaDetails(manga.toMangaInfo())?.let { networkManga ->
|
)?.getMangaDetails(manga.toMangaInfo())?.let { networkManga ->
|
||||||
manga.copyFrom(networkManga.toSManga())
|
manga.copyFrom(networkManga.toSManga())
|
||||||
manga.initialized = true
|
manga.initialized = true
|
||||||
db.insertManga(manga).executeAsBlocking()
|
db.insertManga(manga).executeOnIO()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -111,7 +111,7 @@ object DebugFunctions {
|
|||||||
}.toList()
|
}.toList()
|
||||||
|
|
||||||
allManga.forEach { manga ->
|
allManga.forEach { manga ->
|
||||||
val meta = db.getFlatMetadataForManga(manga.id!!).executeAsBlocking()?.raise<EHentaiSearchMetadata>() ?: return@forEach
|
val meta = db.getFlatMetadataForManga(manga.id!!).executeOnIO()?.raise<EHentaiSearchMetadata>() ?: return@forEach
|
||||||
galleries += "Aged: ${meta.aged}\t Title: ${manga.title}"
|
galleries += "Aged: ${meta.aged}\t Title: ${manga.title}"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -121,7 +121,7 @@ object DebugFunctions {
|
|||||||
fun countAgedFlagInEXHManga(): Int {
|
fun countAgedFlagInEXHManga(): Int {
|
||||||
var agedAmount = 0
|
var agedAmount = 0
|
||||||
runBlocking {
|
runBlocking {
|
||||||
val metadataManga = db.getFavoriteMangaWithMetadata().executeAsBlocking()
|
val metadataManga = db.getFavoriteMangaWithMetadata().executeOnIO()
|
||||||
|
|
||||||
val allManga = metadataManga.asFlow().cancellable().mapNotNull { manga ->
|
val allManga = metadataManga.asFlow().cancellable().mapNotNull { manga ->
|
||||||
if (manga.isEhBasedManga()) manga
|
if (manga.isEhBasedManga()) manga
|
||||||
@ -129,7 +129,7 @@ object DebugFunctions {
|
|||||||
}.toList()
|
}.toList()
|
||||||
|
|
||||||
allManga.forEach { manga ->
|
allManga.forEach { manga ->
|
||||||
val meta = db.getFlatMetadataForManga(manga.id!!).executeAsBlocking()?.raise<EHentaiSearchMetadata>() ?: return@forEach
|
val meta = db.getFlatMetadataForManga(manga.id!!).executeOnIO()?.raise<EHentaiSearchMetadata>() ?: return@forEach
|
||||||
if (meta.aged) {
|
if (meta.aged) {
|
||||||
// remove age flag
|
// remove age flag
|
||||||
agedAmount++
|
agedAmount++
|
||||||
@ -239,7 +239,7 @@ object DebugFunctions {
|
|||||||
Json.decodeFromString<JsonSavedSearch>(it.substringAfter(':'))
|
Json.decodeFromString<JsonSavedSearch>(it.substringAfter(':'))
|
||||||
} catch (t: RuntimeException) {
|
} catch (t: RuntimeException) {
|
||||||
// Load failed
|
// Load failed
|
||||||
XLog.tag("DebugFunctions").e("Failed to load saved search!", t)
|
xLogE("Failed to load saved search!", t)
|
||||||
t.printStackTrace()
|
t.printStackTrace()
|
||||||
null
|
null
|
||||||
}
|
}
|
||||||
@ -251,7 +251,7 @@ object DebugFunctions {
|
|||||||
Json.decodeFromString<JsonSavedSearch>(it.substringAfter(':'))
|
Json.decodeFromString<JsonSavedSearch>(it.substringAfter(':'))
|
||||||
} catch (t: RuntimeException) {
|
} catch (t: RuntimeException) {
|
||||||
// Load failed
|
// Load failed
|
||||||
XLog.tag("DebugFunctions").e("Failed to load saved search!", t)
|
xLogE("Failed to load saved search!", t)
|
||||||
t.printStackTrace()
|
t.printStackTrace()
|
||||||
null
|
null
|
||||||
}
|
}
|
||||||
@ -278,7 +278,7 @@ object DebugFunctions {
|
|||||||
Json.decodeFromString<JsonSavedSearch>(it.substringAfter(':'))
|
Json.decodeFromString<JsonSavedSearch>(it.substringAfter(':'))
|
||||||
} catch (t: RuntimeException) {
|
} catch (t: RuntimeException) {
|
||||||
// Load failed
|
// Load failed
|
||||||
XLog.tag("DebugFunctions").e("Failed to load saved search!", t)
|
xLogE("Failed to load saved search!", t)
|
||||||
t.printStackTrace()
|
t.printStackTrace()
|
||||||
null
|
null
|
||||||
}
|
}
|
||||||
@ -290,7 +290,7 @@ object DebugFunctions {
|
|||||||
Json.decodeFromString<JsonSavedSearch>(it.substringAfter(':'))
|
Json.decodeFromString<JsonSavedSearch>(it.substringAfter(':'))
|
||||||
} catch (t: RuntimeException) {
|
} catch (t: RuntimeException) {
|
||||||
// Load failed
|
// Load failed
|
||||||
XLog.tag("DebugFunctions").e("Failed to load saved search!", t)
|
xLogE("Failed to load saved search!", t)
|
||||||
t.printStackTrace()
|
t.printStackTrace()
|
||||||
null
|
null
|
||||||
}
|
}
|
||||||
|
@ -3,7 +3,7 @@ package exh.eh
|
|||||||
import android.util.SparseArray
|
import android.util.SparseArray
|
||||||
import androidx.core.util.AtomicFile
|
import androidx.core.util.AtomicFile
|
||||||
import androidx.core.util.forEach
|
import androidx.core.util.forEach
|
||||||
import com.elvishew.xlog.XLog
|
import exh.log.xLogD
|
||||||
import kotlinx.coroutines.CoroutineScope
|
import kotlinx.coroutines.CoroutineScope
|
||||||
import kotlinx.coroutines.Dispatchers
|
import kotlinx.coroutines.Dispatchers
|
||||||
import kotlinx.coroutines.Job
|
import kotlinx.coroutines.Job
|
||||||
@ -95,7 +95,7 @@ class MemAutoFlushingLookupTable<T>(
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
} catch (e: FileNotFoundException) {
|
} catch (e: FileNotFoundException) {
|
||||||
XLog.tag("MemAutoFlushingLookupTable").enableStackTrace(2).d("Lookup table not found!", e)
|
xLogD("Lookup table not found!", e)
|
||||||
// Ignored
|
// Ignored
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -3,7 +3,6 @@ package exh.favorites
|
|||||||
import android.content.Context
|
import android.content.Context
|
||||||
import android.net.wifi.WifiManager
|
import android.net.wifi.WifiManager
|
||||||
import android.os.PowerManager
|
import android.os.PowerManager
|
||||||
import com.elvishew.xlog.XLog
|
|
||||||
import eu.kanade.tachiyomi.R
|
import eu.kanade.tachiyomi.R
|
||||||
import eu.kanade.tachiyomi.data.database.DatabaseHelper
|
import eu.kanade.tachiyomi.data.database.DatabaseHelper
|
||||||
import eu.kanade.tachiyomi.data.database.models.Category
|
import eu.kanade.tachiyomi.data.database.models.Category
|
||||||
@ -21,6 +20,7 @@ import exh.GalleryAddEvent
|
|||||||
import exh.GalleryAdder
|
import exh.GalleryAdder
|
||||||
import exh.eh.EHentaiThrottleManager
|
import exh.eh.EHentaiThrottleManager
|
||||||
import exh.eh.EHentaiUpdateWorker
|
import exh.eh.EHentaiUpdateWorker
|
||||||
|
import exh.log.xLog
|
||||||
import exh.source.EH_SOURCE_ID
|
import exh.source.EH_SOURCE_ID
|
||||||
import exh.source.EXH_SOURCE_ID
|
import exh.source.EXH_SOURCE_ID
|
||||||
import exh.source.isEhBasedManga
|
import exh.source.isEhBasedManga
|
||||||
@ -61,7 +61,7 @@ class FavoritesSyncHelper(val context: Context) {
|
|||||||
private var wifiLock: WifiManager.WifiLock? = null
|
private var wifiLock: WifiManager.WifiLock? = null
|
||||||
private var wakeLock: PowerManager.WakeLock? = null
|
private var wakeLock: PowerManager.WakeLock? = null
|
||||||
|
|
||||||
private val logger = XLog.tag("EHFavSync").build()
|
private val logger = xLog()
|
||||||
|
|
||||||
val status: MutableStateFlow<FavoritesSyncStatus> = MutableStateFlow(FavoritesSyncStatus.Idle(context))
|
val status: MutableStateFlow<FavoritesSyncStatus> = MutableStateFlow(FavoritesSyncStatus.Idle(context))
|
||||||
|
|
||||||
@ -381,7 +381,7 @@ class FavoritesSyncHelper(val context: Context) {
|
|||||||
|
|
||||||
if (result is GalleryAddEvent.Fail) {
|
if (result is GalleryAddEvent.Fail) {
|
||||||
if (result is GalleryAddEvent.Fail.NotFound) {
|
if (result is GalleryAddEvent.Fail.NotFound) {
|
||||||
XLog.tag("EHFavSync").enableStackTrace(2).e(context.getString(R.string.favorites_sync_remote_not_exist, it.getUrl()))
|
logger.e(context.getString(R.string.favorites_sync_remote_not_exist, it.getUrl()))
|
||||||
// Skip this gallery, it no longer exists
|
// Skip this gallery, it no longer exists
|
||||||
return@forEachIndexed
|
return@forEachIndexed
|
||||||
}
|
}
|
||||||
|
@ -119,22 +119,22 @@ class EnhancedFilePrinter internal constructor(
|
|||||||
/**
|
/**
|
||||||
* The file name generator for log file.
|
* The file name generator for log file.
|
||||||
*/
|
*/
|
||||||
private var fileNameGenerator: FileNameGenerator? = null
|
var fileNameGenerator: FileNameGenerator? = null
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* The backup strategy for log file.
|
* The backup strategy for log file.
|
||||||
*/
|
*/
|
||||||
private var backupStrategy: BackupStrategy? = null
|
var backupStrategy: BackupStrategy? = null
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* The clean strategy for log file.
|
* The clean strategy for log file.
|
||||||
*/
|
*/
|
||||||
private var cleanStrategy: CleanStrategy? = null
|
var cleanStrategy: CleanStrategy? = null
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* The flattener when print a log.
|
* The flattener when print a log.
|
||||||
*/
|
*/
|
||||||
private var flattener: Flattener? = null
|
var flattener: Flattener? = null
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Set the file name generator for log file.
|
* Set the file name generator for log file.
|
||||||
@ -194,6 +194,12 @@ class EnhancedFilePrinter internal constructor(
|
|||||||
flattener ?: DefaultsFactory.createFlattener2()
|
flattener ?: DefaultsFactory.createFlattener2()
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
companion object {
|
||||||
|
operator fun invoke(folderPath: String, block: Builder.() -> Unit): EnhancedFilePrinter {
|
||||||
|
return Builder(folderPath).apply(block).build()
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private data class LogItem(
|
private data class LogItem(
|
||||||
|
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
|
package exh.md.handlers
|
||||||
|
|
||||||
import com.elvishew.xlog.XLog
|
|
||||||
import eu.kanade.tachiyomi.data.database.DatabaseHelper
|
import eu.kanade.tachiyomi.data.database.DatabaseHelper
|
||||||
import eu.kanade.tachiyomi.data.database.models.Manga
|
import eu.kanade.tachiyomi.data.database.models.Manga
|
||||||
import eu.kanade.tachiyomi.network.parseAs
|
import eu.kanade.tachiyomi.network.parseAs
|
||||||
import eu.kanade.tachiyomi.source.model.SManga
|
import eu.kanade.tachiyomi.source.model.SManga
|
||||||
import eu.kanade.tachiyomi.util.asJsoup
|
import eu.kanade.tachiyomi.util.asJsoup
|
||||||
|
import exh.log.xLogE
|
||||||
import exh.md.handlers.serializers.ApiChapterSerializer
|
import exh.md.handlers.serializers.ApiChapterSerializer
|
||||||
import exh.md.handlers.serializers.ApiMangaSerializer
|
import exh.md.handlers.serializers.ApiMangaSerializer
|
||||||
import exh.md.handlers.serializers.ChapterSerializer
|
import exh.md.handlers.serializers.ChapterSerializer
|
||||||
@ -150,7 +150,7 @@ class ApiMangaParser(private val lang: String) {
|
|||||||
if (tags.isNotEmpty()) tags.clear()
|
if (tags.isNotEmpty()) tags.clear()
|
||||||
tags += genres.map { RaisedTag(null, it, MangaDexSearchMetadata.TAG_TYPE_DEFAULT) }
|
tags += genres.map { RaisedTag(null, it, MangaDexSearchMetadata.TAG_TYPE_DEFAULT) }
|
||||||
} catch (e: Exception) {
|
} catch (e: Exception) {
|
||||||
XLog.tag("ApiMangaParser").enableStackTrace(2).e(e)
|
xLogE(e)
|
||||||
throw e
|
throw e
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -256,7 +256,7 @@ class ApiMangaParser(private val lang: String) {
|
|||||||
}
|
}
|
||||||
return response.parseAs<ApiChapterSerializer>().data.mangaId
|
return response.parseAs<ApiChapterSerializer>().data.mangaId
|
||||||
} catch (e: Exception) {
|
} catch (e: Exception) {
|
||||||
XLog.tag("ApiMangaParser").enableStackTrace(2).e(e)
|
xLogE(e)
|
||||||
throw e
|
throw e
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1,6 +1,5 @@
|
|||||||
package exh.md.handlers
|
package exh.md.handlers
|
||||||
|
|
||||||
import com.elvishew.xlog.XLog
|
|
||||||
import eu.kanade.tachiyomi.data.database.models.Track
|
import eu.kanade.tachiyomi.data.database.models.Track
|
||||||
import eu.kanade.tachiyomi.data.preference.PreferencesHelper
|
import eu.kanade.tachiyomi.data.preference.PreferencesHelper
|
||||||
import eu.kanade.tachiyomi.data.track.TrackManager
|
import eu.kanade.tachiyomi.data.track.TrackManager
|
||||||
@ -12,6 +11,8 @@ import eu.kanade.tachiyomi.source.model.MangasPage
|
|||||||
import eu.kanade.tachiyomi.source.model.MetadataMangasPage
|
import eu.kanade.tachiyomi.source.model.MetadataMangasPage
|
||||||
import eu.kanade.tachiyomi.source.model.SManga
|
import eu.kanade.tachiyomi.source.model.SManga
|
||||||
import eu.kanade.tachiyomi.util.lang.withIOContext
|
import eu.kanade.tachiyomi.util.lang.withIOContext
|
||||||
|
import exh.log.xLogD
|
||||||
|
import exh.log.xLogE
|
||||||
import exh.md.handlers.serializers.FollowPage
|
import exh.md.handlers.serializers.FollowPage
|
||||||
import exh.md.handlers.serializers.FollowsIndividualSerializer
|
import exh.md.handlers.serializers.FollowsIndividualSerializer
|
||||||
import exh.md.handlers.serializers.FollowsPageSerializer
|
import exh.md.handlers.serializers.FollowsPageSerializer
|
||||||
@ -50,7 +51,7 @@ class FollowsHandler(val client: OkHttpClient, val headers: Headers, val prefere
|
|||||||
response.body?.string().orEmpty()
|
response.body?.string().orEmpty()
|
||||||
)
|
)
|
||||||
} catch (e: Exception) {
|
} catch (e: Exception) {
|
||||||
XLog.tag("FollowsHandler").enableStackTrace(2).e("error parsing follows", e)
|
xLogE("error parsing follows", e)
|
||||||
FollowsPageSerializer(404, emptyList())
|
FollowsPageSerializer(404, emptyList())
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -78,7 +79,7 @@ class FollowsHandler(val client: OkHttpClient, val headers: Headers, val prefere
|
|||||||
val followsPageResult = try {
|
val followsPageResult = try {
|
||||||
response.parseAs<FollowsIndividualSerializer>(MdUtil.jsonParser)
|
response.parseAs<FollowsIndividualSerializer>(MdUtil.jsonParser)
|
||||||
} catch (e: Exception) {
|
} catch (e: Exception) {
|
||||||
XLog.tag("FollowsHandler").enableStackTrace(2).e("error parsing follows", e)
|
xLogE("error parsing follows", e)
|
||||||
throw e
|
throw e
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -161,7 +162,7 @@ class FollowsHandler(val client: OkHttpClient, val headers: Headers, val prefere
|
|||||||
val formBody = FormBody.Builder()
|
val formBody = FormBody.Builder()
|
||||||
.add("volume", "0")
|
.add("volume", "0")
|
||||||
.add("chapter", track.last_chapter_read.toString())
|
.add("chapter", track.last_chapter_read.toString())
|
||||||
XLog.tag("FollowsHandler").d("chapter to update %s", track.last_chapter_read.toString())
|
xLogD("chapter to update %s", track.last_chapter_read.toString())
|
||||||
val response = client.newCall(
|
val response = client.newCall(
|
||||||
POST(
|
POST(
|
||||||
"${MdUtil.baseUrl}/ajax/actions.ajax.php?function=edit_progress&id=$mangaID",
|
"${MdUtil.baseUrl}/ajax/actions.ajax.php?function=edit_progress&id=$mangaID",
|
||||||
@ -172,7 +173,7 @@ class FollowsHandler(val client: OkHttpClient, val headers: Headers, val prefere
|
|||||||
|
|
||||||
withIOContext {
|
withIOContext {
|
||||||
response.body?.string()
|
response.body?.string()
|
||||||
.also { XLog.tag("FollowsHandler").d(it) }
|
.also { xLogD(it) }
|
||||||
.let { it != null && it.isEmpty() }
|
.let { it != null && it.isEmpty() }
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -10,7 +10,6 @@ import androidx.core.app.NotificationCompat
|
|||||||
import androidx.core.app.NotificationManagerCompat
|
import androidx.core.app.NotificationManagerCompat
|
||||||
import androidx.core.content.ContextCompat
|
import androidx.core.content.ContextCompat
|
||||||
import androidx.core.text.isDigitsOnly
|
import androidx.core.text.isDigitsOnly
|
||||||
import com.elvishew.xlog.XLog
|
|
||||||
import com.squareup.moshi.JsonReader
|
import com.squareup.moshi.JsonReader
|
||||||
import eu.kanade.tachiyomi.R
|
import eu.kanade.tachiyomi.R
|
||||||
import eu.kanade.tachiyomi.data.database.DatabaseHelper
|
import eu.kanade.tachiyomi.data.database.DatabaseHelper
|
||||||
@ -23,6 +22,7 @@ import eu.kanade.tachiyomi.util.lang.withIOContext
|
|||||||
import eu.kanade.tachiyomi.util.system.acquireWakeLock
|
import eu.kanade.tachiyomi.util.system.acquireWakeLock
|
||||||
import eu.kanade.tachiyomi.util.system.isServiceRunning
|
import eu.kanade.tachiyomi.util.system.isServiceRunning
|
||||||
import eu.kanade.tachiyomi.util.system.notificationManager
|
import eu.kanade.tachiyomi.util.system.notificationManager
|
||||||
|
import exh.log.xLogE
|
||||||
import exh.md.similar.sql.models.MangaSimilarImpl
|
import exh.md.similar.sql.models.MangaSimilarImpl
|
||||||
import kotlinx.coroutines.CoroutineExceptionHandler
|
import kotlinx.coroutines.CoroutineExceptionHandler
|
||||||
import kotlinx.coroutines.CoroutineScope
|
import kotlinx.coroutines.CoroutineScope
|
||||||
@ -135,7 +135,7 @@ class SimilarUpdateService(
|
|||||||
// Unsubscribe from any previous subscription if needed.
|
// Unsubscribe from any previous subscription if needed.
|
||||||
job?.cancel()
|
job?.cancel()
|
||||||
val handler = CoroutineExceptionHandler { _, exception ->
|
val handler = CoroutineExceptionHandler { _, exception ->
|
||||||
XLog.tag("SimilarUpdateService").enableStackTrace(2).e(exception)
|
xLogE(exception)
|
||||||
stopSelf(startId)
|
stopSelf(startId)
|
||||||
showResultNotification(true)
|
showResultNotification(true)
|
||||||
cancelProgressNotification()
|
cancelProgressNotification()
|
||||||
|
@ -4,12 +4,12 @@ import android.app.Dialog
|
|||||||
import android.os.Bundle
|
import android.os.Bundle
|
||||||
import android.view.View
|
import android.view.View
|
||||||
import com.afollestad.materialdialogs.MaterialDialog
|
import com.afollestad.materialdialogs.MaterialDialog
|
||||||
import com.elvishew.xlog.XLog
|
|
||||||
import eu.kanade.tachiyomi.R
|
import eu.kanade.tachiyomi.R
|
||||||
import eu.kanade.tachiyomi.ui.base.controller.DialogController
|
import eu.kanade.tachiyomi.ui.base.controller.DialogController
|
||||||
import eu.kanade.tachiyomi.util.lang.launchIO
|
import eu.kanade.tachiyomi.util.lang.launchIO
|
||||||
import eu.kanade.tachiyomi.util.lang.launchUI
|
import eu.kanade.tachiyomi.util.lang.launchUI
|
||||||
import eu.kanade.tachiyomi.util.system.toast
|
import eu.kanade.tachiyomi.util.system.toast
|
||||||
|
import exh.log.xLogE
|
||||||
import kotlinx.coroutines.MainScope
|
import kotlinx.coroutines.MainScope
|
||||||
import kotlinx.coroutines.cancel
|
import kotlinx.coroutines.cancel
|
||||||
|
|
||||||
@ -35,7 +35,7 @@ class ConfiguringDialogController : DialogController() {
|
|||||||
.show()
|
.show()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
XLog.tag("ConfiguringDialogController").enableStackTrace(2).e("Configuration error!", e)
|
xLogE("Configuration error!", e)
|
||||||
}
|
}
|
||||||
launchUI {
|
launchUI {
|
||||||
finish()
|
finish()
|
||||||
|
@ -1,7 +1,6 @@
|
|||||||
package exh.uconfig
|
package exh.uconfig
|
||||||
|
|
||||||
import android.content.Context
|
import android.content.Context
|
||||||
import com.elvishew.xlog.XLog
|
|
||||||
import eu.kanade.tachiyomi.R
|
import eu.kanade.tachiyomi.R
|
||||||
import eu.kanade.tachiyomi.data.preference.PreferencesHelper
|
import eu.kanade.tachiyomi.data.preference.PreferencesHelper
|
||||||
import eu.kanade.tachiyomi.network.await
|
import eu.kanade.tachiyomi.network.await
|
||||||
@ -9,6 +8,7 @@ import eu.kanade.tachiyomi.source.SourceManager
|
|||||||
import eu.kanade.tachiyomi.source.online.all.EHentai
|
import eu.kanade.tachiyomi.source.online.all.EHentai
|
||||||
import eu.kanade.tachiyomi.util.asJsoup
|
import eu.kanade.tachiyomi.util.asJsoup
|
||||||
import exh.log.maybeInjectEHLogger
|
import exh.log.maybeInjectEHLogger
|
||||||
|
import exh.log.xLogD
|
||||||
import exh.source.EH_SOURCE_ID
|
import exh.source.EH_SOURCE_ID
|
||||||
import exh.source.EXH_SOURCE_ID
|
import exh.source.EXH_SOURCE_ID
|
||||||
import okhttp3.FormBody
|
import okhttp3.FormBody
|
||||||
@ -81,7 +81,7 @@ class EHConfigurator(val context: Context) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
XLog.tag("EHConfigurator").d("Hath perks: $hathPerks")
|
xLogD("Hath perks: %s", hathPerks.toString())
|
||||||
|
|
||||||
configure(ehSource, hathPerks)
|
configure(ehSource, hathPerks)
|
||||||
configure(exhSource, hathPerks)
|
configure(exhSource, hathPerks)
|
||||||
|
@ -1,7 +1,6 @@
|
|||||||
package exh.ui.batchadd
|
package exh.ui.batchadd
|
||||||
|
|
||||||
import android.content.Context
|
import android.content.Context
|
||||||
import com.elvishew.xlog.XLog
|
|
||||||
import com.jakewharton.rxrelay.BehaviorRelay
|
import com.jakewharton.rxrelay.BehaviorRelay
|
||||||
import com.jakewharton.rxrelay.ReplayRelay
|
import com.jakewharton.rxrelay.ReplayRelay
|
||||||
import eu.kanade.tachiyomi.R
|
import eu.kanade.tachiyomi.R
|
||||||
@ -10,6 +9,7 @@ import eu.kanade.tachiyomi.ui.base.presenter.BasePresenter
|
|||||||
import eu.kanade.tachiyomi.util.lang.withIOContext
|
import eu.kanade.tachiyomi.util.lang.withIOContext
|
||||||
import exh.GalleryAddEvent
|
import exh.GalleryAddEvent
|
||||||
import exh.GalleryAdder
|
import exh.GalleryAdder
|
||||||
|
import exh.log.xLogE
|
||||||
import exh.util.trimOrNull
|
import exh.util.trimOrNull
|
||||||
import kotlinx.coroutines.CoroutineExceptionHandler
|
import kotlinx.coroutines.CoroutineExceptionHandler
|
||||||
import kotlinx.coroutines.Dispatchers
|
import kotlinx.coroutines.Dispatchers
|
||||||
@ -56,7 +56,7 @@ class BatchAddPresenter : BasePresenter<BatchAddController>() {
|
|||||||
currentlyAddingRelay.call(STATE_INPUT_TO_PROGRESS)
|
currentlyAddingRelay.call(STATE_INPUT_TO_PROGRESS)
|
||||||
|
|
||||||
val handler = CoroutineExceptionHandler { _, throwable ->
|
val handler = CoroutineExceptionHandler { _, throwable ->
|
||||||
XLog.tag("BatchAddPresenter").enableStackTrace(2).e(throwable)
|
xLogE(throwable)
|
||||||
}
|
}
|
||||||
|
|
||||||
presenterScope.launch(Dispatchers.IO + handler) {
|
presenterScope.launch(Dispatchers.IO + handler) {
|
||||||
|
@ -12,7 +12,6 @@ import android.webkit.WebChromeClient
|
|||||||
import android.webkit.WebView
|
import android.webkit.WebView
|
||||||
import androidx.appcompat.app.AppCompatActivity
|
import androidx.appcompat.app.AppCompatActivity
|
||||||
import com.afollestad.materialdialogs.MaterialDialog
|
import com.afollestad.materialdialogs.MaterialDialog
|
||||||
import com.elvishew.xlog.XLog
|
|
||||||
import eu.kanade.tachiyomi.R
|
import eu.kanade.tachiyomi.R
|
||||||
import eu.kanade.tachiyomi.data.preference.PreferencesHelper
|
import eu.kanade.tachiyomi.data.preference.PreferencesHelper
|
||||||
import eu.kanade.tachiyomi.databinding.EhActivityCaptchaBinding
|
import eu.kanade.tachiyomi.databinding.EhActivityCaptchaBinding
|
||||||
@ -23,6 +22,8 @@ import eu.kanade.tachiyomi.source.SourceManager
|
|||||||
import eu.kanade.tachiyomi.source.online.HttpSource
|
import eu.kanade.tachiyomi.source.online.HttpSource
|
||||||
import eu.kanade.tachiyomi.util.lang.withUIContext
|
import eu.kanade.tachiyomi.util.lang.withUIContext
|
||||||
import eu.kanade.tachiyomi.util.system.setDefaultSettings
|
import eu.kanade.tachiyomi.util.system.setDefaultSettings
|
||||||
|
import exh.log.xLogD
|
||||||
|
import exh.log.xLogE
|
||||||
import exh.source.DelegatedHttpSource
|
import exh.source.DelegatedHttpSource
|
||||||
import exh.util.melt
|
import exh.util.melt
|
||||||
import kotlinx.coroutines.runBlocking
|
import kotlinx.coroutines.runBlocking
|
||||||
@ -186,7 +187,7 @@ class BrowserActionActivity : AppCompatActivity() {
|
|||||||
suspend fun captchaSolveFail() {
|
suspend fun captchaSolveFail() {
|
||||||
currentLoopId = null
|
currentLoopId = null
|
||||||
validateCurrentLoopId = null
|
validateCurrentLoopId = null
|
||||||
XLog.tag("BrowserActionActivity").enableStackTrace(2).e(IllegalStateException("Captcha solve failure!"))
|
xLogE(IllegalStateException("Captcha solve failure!"))
|
||||||
withUIContext {
|
withUIContext {
|
||||||
binding.webview.evaluateJavascript(SOLVE_UI_SCRIPT_HIDE, null)
|
binding.webview.evaluateJavascript(SOLVE_UI_SCRIPT_HIDE, null)
|
||||||
MaterialDialog(this@BrowserActionActivity)
|
MaterialDialog(this@BrowserActionActivity)
|
||||||
@ -230,7 +231,7 @@ class BrowserActionActivity : AppCompatActivity() {
|
|||||||
val ih = splitResult[3]
|
val ih = splitResult[3]
|
||||||
val x = binding.webview.x + origX / iw * binding.webview.width
|
val x = binding.webview.x + origX / iw * binding.webview.width
|
||||||
val y = binding.webview.y + origY / ih * binding.webview.height
|
val y = binding.webview.y + origY / ih * binding.webview.height
|
||||||
XLog.tag("BrowserActionActivity").d("Found audio button coords: %f %f", x, y)
|
xLogD("Found audio button coords: %f %f", x, y)
|
||||||
simulateClick(x + 50, y + 50)
|
simulateClick(x + 50, y + 50)
|
||||||
binding.webview.post {
|
binding.webview.post {
|
||||||
doStageDownloadAudio(loopId)
|
doStageDownloadAudio(loopId)
|
||||||
@ -246,12 +247,12 @@ class BrowserActionActivity : AppCompatActivity() {
|
|||||||
}
|
}
|
||||||
STAGE_DOWNLOAD_AUDIO -> {
|
STAGE_DOWNLOAD_AUDIO -> {
|
||||||
if (result != null) {
|
if (result != null) {
|
||||||
XLog.tag("BrowserActionActivity").d("Got audio URL: $result")
|
xLogD("Got audio URL: $result")
|
||||||
performRecognize(result)
|
performRecognize(result)
|
||||||
.observeOn(Schedulers.io())
|
.observeOn(Schedulers.io())
|
||||||
.subscribe(
|
.subscribe(
|
||||||
{
|
{
|
||||||
XLog.tag("BrowserActionActivity").d("Got audio transcript: $it")
|
xLogD("Got audio transcript: $it")
|
||||||
binding.webview.post {
|
binding.webview.post {
|
||||||
typeResult(
|
typeResult(
|
||||||
loopId,
|
loopId,
|
||||||
@ -464,7 +465,7 @@ class BrowserActionActivity : AppCompatActivity() {
|
|||||||
if (loopId != validateCurrentLoopId) return
|
if (loopId != validateCurrentLoopId) return
|
||||||
|
|
||||||
if (result) {
|
if (result) {
|
||||||
XLog.tag("BrowserActionActivity").d("Captcha solved!")
|
xLogD("Captcha solved!")
|
||||||
binding.webview.post {
|
binding.webview.post {
|
||||||
binding.webview.evaluateJavascript(SOLVE_UI_SCRIPT_HIDE, null)
|
binding.webview.evaluateJavascript(SOLVE_UI_SCRIPT_HIDE, null)
|
||||||
}
|
}
|
||||||
|
@ -8,13 +8,13 @@ import android.webkit.CookieManager
|
|||||||
import android.webkit.WebView
|
import android.webkit.WebView
|
||||||
import android.webkit.WebViewClient
|
import android.webkit.WebViewClient
|
||||||
import androidx.core.view.isVisible
|
import androidx.core.view.isVisible
|
||||||
import com.elvishew.xlog.XLog
|
|
||||||
import eu.kanade.tachiyomi.data.preference.PreferencesHelper
|
import eu.kanade.tachiyomi.data.preference.PreferencesHelper
|
||||||
import eu.kanade.tachiyomi.databinding.EhActivityLoginBinding
|
import eu.kanade.tachiyomi.databinding.EhActivityLoginBinding
|
||||||
import eu.kanade.tachiyomi.source.SourceManager
|
import eu.kanade.tachiyomi.source.SourceManager
|
||||||
import eu.kanade.tachiyomi.ui.base.controller.NucleusController
|
import eu.kanade.tachiyomi.ui.base.controller.NucleusController
|
||||||
import eu.kanade.tachiyomi.util.lang.launchUI
|
import eu.kanade.tachiyomi.util.lang.launchUI
|
||||||
import eu.kanade.tachiyomi.util.system.setDefaultSettings
|
import eu.kanade.tachiyomi.util.system.setDefaultSettings
|
||||||
|
import exh.log.xLogD
|
||||||
import exh.uconfig.WarnConfigureDialogController
|
import exh.uconfig.WarnConfigureDialogController
|
||||||
import uy.kohesive.injekt.injectLazy
|
import uy.kohesive.injekt.injectLazy
|
||||||
import java.net.HttpCookie
|
import java.net.HttpCookie
|
||||||
@ -91,7 +91,7 @@ class LoginController : NucleusController<EhActivityLoginBinding, LoginPresenter
|
|||||||
binding.webview.webViewClient = object : WebViewClient() {
|
binding.webview.webViewClient = object : WebViewClient() {
|
||||||
override fun onPageFinished(view: WebView, url: String) {
|
override fun onPageFinished(view: WebView, url: String) {
|
||||||
super.onPageFinished(view, url)
|
super.onPageFinished(view, url)
|
||||||
XLog.tag("LoginController").d(url)
|
xLogD(url)
|
||||||
val parsedUrl = Uri.parse(url)
|
val parsedUrl = Uri.parse(url)
|
||||||
if (parsedUrl.host.equals("forums.e-hentai.org", ignoreCase = true)) {
|
if (parsedUrl.host.equals("forums.e-hentai.org", ignoreCase = true)) {
|
||||||
// Hide distracting content
|
// Hide distracting content
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
package exh.util
|
package exh.util
|
||||||
|
|
||||||
import com.elvishew.xlog.XLog
|
|
||||||
import eu.kanade.tachiyomi.util.asJsoup
|
import eu.kanade.tachiyomi.util.asJsoup
|
||||||
|
import exh.log.xLogW
|
||||||
import okhttp3.Response
|
import okhttp3.Response
|
||||||
import okhttp3.ResponseBody.Companion.toResponseBody
|
import okhttp3.ResponseBody.Companion.toResponseBody
|
||||||
import org.jsoup.nodes.Document
|
import org.jsoup.nodes.Document
|
||||||
@ -21,7 +21,7 @@ fun Response.interceptAsHtml(block: (Document) -> Unit): Response {
|
|||||||
block(parsed)
|
block(parsed)
|
||||||
} catch (t: Throwable) {
|
} catch (t: Throwable) {
|
||||||
// Ignore all errors
|
// Ignore all errors
|
||||||
XLog.tag("Response.interceptAsHtml").enableStackTrace(2).w("Interception error!", t)
|
xLogW("Interception error!", t)
|
||||||
} finally {
|
} finally {
|
||||||
close()
|
close()
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user