fix: optimization # 2
This commit is contained in:
parent
14f29d09df
commit
b187cf06be
10 changed files with 123 additions and 70 deletions
|
@ -51,7 +51,7 @@ android {
|
||||||
}
|
}
|
||||||
debug {
|
debug {
|
||||||
applicationIdSuffix ".beta"
|
applicationIdSuffix ".beta"
|
||||||
versionNameSuffix "-beta02"
|
versionNameSuffix "-beta03"
|
||||||
manifestPlaceholders.icon_placeholder = "@mipmap/ic_launcher_beta"
|
manifestPlaceholders.icon_placeholder = "@mipmap/ic_launcher_beta"
|
||||||
manifestPlaceholders.icon_placeholder_round = "@mipmap/ic_launcher_beta_round"
|
manifestPlaceholders.icon_placeholder_round = "@mipmap/ic_launcher_beta_round"
|
||||||
debuggable false
|
debuggable false
|
||||||
|
|
|
@ -4,6 +4,7 @@ import android.annotation.SuppressLint
|
||||||
import android.app.Activity
|
import android.app.Activity
|
||||||
import android.content.Context
|
import android.content.Context
|
||||||
import android.os.Bundle
|
import android.os.Bundle
|
||||||
|
import android.util.Log
|
||||||
import androidx.multidex.MultiDex
|
import androidx.multidex.MultiDex
|
||||||
import androidx.multidex.MultiDexApplication
|
import androidx.multidex.MultiDexApplication
|
||||||
import ani.dantotsu.addons.download.DownloadAddonManager
|
import ani.dantotsu.addons.download.DownloadAddonManager
|
||||||
|
@ -93,7 +94,7 @@ class App : MultiDexApplication() {
|
||||||
|
|
||||||
Logger.init(this)
|
Logger.init(this)
|
||||||
Thread.setDefaultUncaughtExceptionHandler(FinalExceptionHandler())
|
Thread.setDefaultUncaughtExceptionHandler(FinalExceptionHandler())
|
||||||
Logger.log("App: Logging started")
|
Logger.log(Log.WARN, "App: Logging started")
|
||||||
|
|
||||||
initializeNetwork()
|
initializeNetwork()
|
||||||
|
|
||||||
|
|
|
@ -33,8 +33,8 @@ import androidx.lifecycle.Lifecycle
|
||||||
import androidx.lifecycle.lifecycleScope
|
import androidx.lifecycle.lifecycleScope
|
||||||
import androidx.media3.common.util.UnstableApi
|
import androidx.media3.common.util.UnstableApi
|
||||||
import androidx.viewpager2.adapter.FragmentStateAdapter
|
import androidx.viewpager2.adapter.FragmentStateAdapter
|
||||||
import ani.dantotsu.addons.torrent.TorrentServerService
|
|
||||||
import ani.dantotsu.addons.torrent.TorrentAddonManager
|
import ani.dantotsu.addons.torrent.TorrentAddonManager
|
||||||
|
import ani.dantotsu.addons.torrent.TorrentServerService
|
||||||
import ani.dantotsu.connections.anilist.Anilist
|
import ani.dantotsu.connections.anilist.Anilist
|
||||||
import ani.dantotsu.connections.anilist.AnilistHomeViewModel
|
import ani.dantotsu.connections.anilist.AnilistHomeViewModel
|
||||||
import ani.dantotsu.databinding.ActivityMainBinding
|
import ani.dantotsu.databinding.ActivityMainBinding
|
||||||
|
@ -336,43 +336,35 @@ class MainActivity : AppCompatActivity() {
|
||||||
startActivity(Intent(this, NoInternet::class.java))
|
startActivity(Intent(this, NoInternet::class.java))
|
||||||
} else {
|
} else {
|
||||||
val model: AnilistHomeViewModel by viewModels()
|
val model: AnilistHomeViewModel by viewModels()
|
||||||
model.genres.observe(this) {
|
val navbar = binding.includedNavbar.navbar
|
||||||
if (it != null) {
|
bottomBar = navbar
|
||||||
if (it) {
|
navbar.visibility = View.VISIBLE
|
||||||
val navbar = binding.includedNavbar.navbar
|
binding.mainProgressBar.visibility = View.GONE
|
||||||
bottomBar = navbar
|
val mainViewPager = binding.viewpager
|
||||||
navbar.visibility = View.VISIBLE
|
mainViewPager.isUserInputEnabled = false
|
||||||
binding.mainProgressBar.visibility = View.GONE
|
mainViewPager.adapter =
|
||||||
val mainViewPager = binding.viewpager
|
ViewPagerAdapter(supportFragmentManager, lifecycle)
|
||||||
mainViewPager.isUserInputEnabled = false
|
mainViewPager.setPageTransformer(ZoomOutPageTransformer())
|
||||||
mainViewPager.adapter =
|
navbar.setOnTabSelectListener(object :
|
||||||
ViewPagerAdapter(supportFragmentManager, lifecycle)
|
AnimatedBottomBar.OnTabSelectListener {
|
||||||
mainViewPager.setPageTransformer(ZoomOutPageTransformer())
|
override fun onTabSelected(
|
||||||
navbar.setOnTabSelectListener(object :
|
lastIndex: Int,
|
||||||
AnimatedBottomBar.OnTabSelectListener {
|
lastTab: AnimatedBottomBar.Tab?,
|
||||||
override fun onTabSelected(
|
newIndex: Int,
|
||||||
lastIndex: Int,
|
newTab: AnimatedBottomBar.Tab
|
||||||
lastTab: AnimatedBottomBar.Tab?,
|
) {
|
||||||
newIndex: Int,
|
navbar.animate().translationZ(12f).setDuration(200).start()
|
||||||
newTab: AnimatedBottomBar.Tab
|
selectedOption = newIndex
|
||||||
) {
|
mainViewPager.setCurrentItem(newIndex, false)
|
||||||
navbar.animate().translationZ(12f).setDuration(200).start()
|
}
|
||||||
selectedOption = newIndex
|
})
|
||||||
mainViewPager.setCurrentItem(newIndex, false)
|
if (mainViewPager.currentItem != selectedOption) {
|
||||||
}
|
navbar.selectTabAt(selectedOption)
|
||||||
})
|
mainViewPager.post {
|
||||||
if (mainViewPager.currentItem != selectedOption) {
|
mainViewPager.setCurrentItem(
|
||||||
navbar.selectTabAt(selectedOption)
|
selectedOption,
|
||||||
mainViewPager.post {
|
false
|
||||||
mainViewPager.setCurrentItem(
|
)
|
||||||
selectedOption,
|
|
||||||
false
|
|
||||||
)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
binding.mainProgressBar.visibility = View.GONE
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
//Load Data
|
//Load Data
|
||||||
|
|
|
@ -35,6 +35,8 @@ object Anilist {
|
||||||
|
|
||||||
var rateLimitReset: Long = 0
|
var rateLimitReset: Long = 0
|
||||||
|
|
||||||
|
var initialized = false
|
||||||
|
|
||||||
val sortBy = listOf(
|
val sortBy = listOf(
|
||||||
"SCORE_DESC",
|
"SCORE_DESC",
|
||||||
"POPULARITY_DESC",
|
"POPULARITY_DESC",
|
||||||
|
|
|
@ -57,6 +57,7 @@ class AnilistQueries {
|
||||||
Anilist.unreadNotificationCount = user.unreadNotificationCount ?: 0
|
Anilist.unreadNotificationCount = user.unreadNotificationCount ?: 0
|
||||||
val unread = PrefManager.getVal<Int>(PrefName.UnreadCommentNotifications)
|
val unread = PrefManager.getVal<Int>(PrefName.UnreadCommentNotifications)
|
||||||
Anilist.unreadNotificationCount += unread
|
Anilist.unreadNotificationCount += unread
|
||||||
|
Anilist.initialized = true
|
||||||
return true
|
return true
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -5,6 +5,7 @@ import androidx.fragment.app.FragmentActivity
|
||||||
import androidx.lifecycle.LiveData
|
import androidx.lifecycle.LiveData
|
||||||
import androidx.lifecycle.MutableLiveData
|
import androidx.lifecycle.MutableLiveData
|
||||||
import androidx.lifecycle.ViewModel
|
import androidx.lifecycle.ViewModel
|
||||||
|
import androidx.lifecycle.lifecycleScope
|
||||||
import ani.dantotsu.BuildConfig
|
import ani.dantotsu.BuildConfig
|
||||||
import ani.dantotsu.R
|
import ani.dantotsu.R
|
||||||
import ani.dantotsu.connections.discord.Discord
|
import ani.dantotsu.connections.discord.Discord
|
||||||
|
@ -12,31 +13,26 @@ import ani.dantotsu.connections.mal.MAL
|
||||||
import ani.dantotsu.media.Media
|
import ani.dantotsu.media.Media
|
||||||
import ani.dantotsu.others.AppUpdater
|
import ani.dantotsu.others.AppUpdater
|
||||||
import ani.dantotsu.profile.User
|
import ani.dantotsu.profile.User
|
||||||
import ani.dantotsu.profile.activity.ActivityItemBuilder
|
|
||||||
import ani.dantotsu.settings.saving.PrefManager
|
import ani.dantotsu.settings.saving.PrefManager
|
||||||
import ani.dantotsu.settings.saving.PrefName
|
import ani.dantotsu.settings.saving.PrefName
|
||||||
import ani.dantotsu.snackString
|
import ani.dantotsu.snackString
|
||||||
import ani.dantotsu.tryWithSuspend
|
import ani.dantotsu.tryWithSuspend
|
||||||
import ani.dantotsu.util.Logger
|
|
||||||
import kotlinx.coroutines.CoroutineScope
|
|
||||||
import kotlinx.coroutines.Dispatchers
|
import kotlinx.coroutines.Dispatchers
|
||||||
import kotlinx.coroutines.launch
|
import kotlinx.coroutines.launch
|
||||||
|
import kotlinx.coroutines.withContext
|
||||||
|
|
||||||
suspend fun getUserId(context: Context, block: () -> Unit) {
|
suspend fun getUserId(context: Context, block: () -> Unit) {
|
||||||
val anilist = if (Anilist.userid == null && Anilist.token != null) {
|
if (!Anilist.initialized) {
|
||||||
if (Anilist.query.getUserData()) {
|
if (Anilist.query.getUserData()) {
|
||||||
tryWithSuspend {
|
tryWithSuspend {
|
||||||
if (MAL.token != null && !MAL.query.getUserData())
|
if (MAL.token != null && !MAL.query.getUserData())
|
||||||
snackString(context.getString(R.string.error_loading_mal_user_data))
|
snackString(context.getString(R.string.error_loading_mal_user_data))
|
||||||
}
|
}
|
||||||
true
|
|
||||||
} else {
|
} else {
|
||||||
snackString(context.getString(R.string.error_loading_anilist_user_data))
|
snackString(context.getString(R.string.error_loading_anilist_user_data))
|
||||||
false
|
|
||||||
}
|
}
|
||||||
} else true
|
}
|
||||||
|
block.invoke()
|
||||||
if (anilist) block.invoke()
|
|
||||||
}
|
}
|
||||||
|
|
||||||
class AnilistHomeViewModel : ViewModel() {
|
class AnilistHomeViewModel : ViewModel() {
|
||||||
|
@ -90,6 +86,7 @@ class AnilistHomeViewModel : ViewModel() {
|
||||||
MutableLiveData<ArrayList<Media>>(null)
|
MutableLiveData<ArrayList<Media>>(null)
|
||||||
|
|
||||||
fun getHidden(): LiveData<ArrayList<Media>> = hidden
|
fun getHidden(): LiveData<ArrayList<Media>> = hidden
|
||||||
|
|
||||||
@Suppress("UNCHECKED_CAST")
|
@Suppress("UNCHECKED_CAST")
|
||||||
suspend fun initHomePage() {
|
suspend fun initHomePage() {
|
||||||
val res = Anilist.query.initHomePage()
|
val res = Anilist.query.initHomePage()
|
||||||
|
@ -104,15 +101,20 @@ class AnilistHomeViewModel : ViewModel() {
|
||||||
res["status"]?.let { userStatus.postValue(it as ArrayList<User>?) }
|
res["status"]?.let { userStatus.postValue(it as ArrayList<User>?) }
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
suspend fun loadMain(context: FragmentActivity) {
|
suspend fun loadMain(context: FragmentActivity) {
|
||||||
Anilist.getSavedToken()
|
Anilist.getSavedToken()
|
||||||
MAL.getSavedToken()
|
MAL.getSavedToken()
|
||||||
Discord.getSavedToken()
|
Discord.getSavedToken()
|
||||||
if (!BuildConfig.FLAVOR.contains("fdroid")) {
|
if (!BuildConfig.FLAVOR.contains("fdroid")) {
|
||||||
if (PrefManager.getVal(PrefName.CheckUpdate)) AppUpdater.check(context)
|
if (PrefManager.getVal(PrefName.CheckUpdate))
|
||||||
|
context.lifecycleScope.launch(Dispatchers.IO) {
|
||||||
|
AppUpdater.check(context, true)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
val ret = Anilist.query.getGenresAndTags()
|
||||||
|
withContext(Dispatchers.Main) {
|
||||||
|
genres.value = ret
|
||||||
}
|
}
|
||||||
genres.postValue(Anilist.query.getGenresAndTags())
|
|
||||||
}
|
}
|
||||||
|
|
||||||
val empty = MutableLiveData<Boolean>(null)
|
val empty = MutableLiveData<Boolean>(null)
|
||||||
|
|
|
@ -36,6 +36,7 @@ import ani.dantotsu.settings.saving.PrefManager
|
||||||
import ani.dantotsu.settings.saving.PrefName
|
import ani.dantotsu.settings.saving.PrefName
|
||||||
import ani.dantotsu.snackString
|
import ani.dantotsu.snackString
|
||||||
import ani.dantotsu.statusBarHeight
|
import ani.dantotsu.statusBarHeight
|
||||||
|
import kotlinx.coroutines.CoroutineScope
|
||||||
import kotlinx.coroutines.Dispatchers
|
import kotlinx.coroutines.Dispatchers
|
||||||
import kotlinx.coroutines.delay
|
import kotlinx.coroutines.delay
|
||||||
import kotlinx.coroutines.launch
|
import kotlinx.coroutines.launch
|
||||||
|
@ -268,13 +269,25 @@ class AnimeFragment : Fragment() {
|
||||||
true
|
true
|
||||||
}
|
}
|
||||||
|
|
||||||
|
var running = false
|
||||||
val live = Refresh.activity.getOrPut(this.hashCode()) { MutableLiveData(false) }
|
val live = Refresh.activity.getOrPut(this.hashCode()) { MutableLiveData(false) }
|
||||||
live.observe(viewLifecycleOwner) {
|
live.observe(viewLifecycleOwner) {
|
||||||
if (it) {
|
if (it && !running) {
|
||||||
|
running = true
|
||||||
scope.launch {
|
scope.launch {
|
||||||
withContext(Dispatchers.IO) {
|
withContext(Dispatchers.IO) {
|
||||||
getUserId(requireContext()) {
|
Anilist.userid = PrefManager.getNullableVal<String>(PrefName.AnilistUserId, null)
|
||||||
load()
|
?.toIntOrNull()
|
||||||
|
if (Anilist.userid == null) {
|
||||||
|
getUserId(requireContext()) {
|
||||||
|
load()
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
CoroutineScope(Dispatchers.IO).launch {
|
||||||
|
getUserId(requireContext()) {
|
||||||
|
load()
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
model.loaded = true
|
model.loaded = true
|
||||||
model.loadTrending(1)
|
model.loadTrending(1)
|
||||||
|
@ -287,6 +300,7 @@ class AnimeFragment : Fragment() {
|
||||||
}
|
}
|
||||||
live.postValue(false)
|
live.postValue(false)
|
||||||
_binding?.animeRefresh?.isRefreshing = false
|
_binding?.animeRefresh?.isRefreshing = false
|
||||||
|
running = false
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -48,9 +48,9 @@ import ani.dantotsu.settings.saving.PrefName
|
||||||
import ani.dantotsu.snackString
|
import ani.dantotsu.snackString
|
||||||
import ani.dantotsu.statusBarHeight
|
import ani.dantotsu.statusBarHeight
|
||||||
import ani.dantotsu.util.Logger
|
import ani.dantotsu.util.Logger
|
||||||
|
import kotlinx.coroutines.CoroutineScope
|
||||||
import kotlinx.coroutines.Dispatchers
|
import kotlinx.coroutines.Dispatchers
|
||||||
import kotlinx.coroutines.launch
|
import kotlinx.coroutines.launch
|
||||||
import kotlinx.coroutines.runBlocking
|
|
||||||
import kotlinx.coroutines.withContext
|
import kotlinx.coroutines.withContext
|
||||||
import kotlin.math.max
|
import kotlin.math.max
|
||||||
import kotlin.math.min
|
import kotlin.math.min
|
||||||
|
@ -379,7 +379,8 @@ class HomeFragment : Fragment() {
|
||||||
model.getHidden().observe(viewLifecycleOwner) {
|
model.getHidden().observe(viewLifecycleOwner) {
|
||||||
if (it != null) {
|
if (it != null) {
|
||||||
if (it.isNotEmpty()) {
|
if (it.isNotEmpty()) {
|
||||||
binding.homeHiddenItemsRecyclerView.adapter = MediaAdaptor(0, it, requireActivity())
|
binding.homeHiddenItemsRecyclerView.adapter =
|
||||||
|
MediaAdaptor(0, it, requireActivity())
|
||||||
binding.homeHiddenItemsRecyclerView.layoutManager = LinearLayoutManager(
|
binding.homeHiddenItemsRecyclerView.layoutManager = LinearLayoutManager(
|
||||||
requireContext(),
|
requireContext(),
|
||||||
LinearLayoutManager.HORIZONTAL,
|
LinearLayoutManager.HORIZONTAL,
|
||||||
|
@ -393,7 +394,8 @@ class HomeFragment : Fragment() {
|
||||||
}
|
}
|
||||||
binding.homeHiddenItemsMore.setSafeOnClickListener { _ ->
|
binding.homeHiddenItemsMore.setSafeOnClickListener { _ ->
|
||||||
ContextCompat.startActivity(
|
ContextCompat.startActivity(
|
||||||
requireActivity(), Intent(requireActivity(), MediaListViewActivity::class.java)
|
requireActivity(),
|
||||||
|
Intent(requireActivity(), MediaListViewActivity::class.java)
|
||||||
.putExtra("title", getString(R.string.hidden))
|
.putExtra("title", getString(R.string.hidden))
|
||||||
.putExtra("media", it),
|
.putExtra("media", it),
|
||||||
null
|
null
|
||||||
|
@ -403,8 +405,7 @@ class HomeFragment : Fragment() {
|
||||||
binding.homeHiddenItemsContainer.visibility = View.GONE
|
binding.homeHiddenItemsContainer.visibility = View.GONE
|
||||||
true
|
true
|
||||||
}
|
}
|
||||||
}
|
} else {
|
||||||
else {
|
|
||||||
binding.homeContinueWatch.setOnLongClickListener {
|
binding.homeContinueWatch.setOnLongClickListener {
|
||||||
snackString(getString(R.string.no_hidden_items))
|
snackString(getString(R.string.no_hidden_items))
|
||||||
true
|
true
|
||||||
|
@ -457,17 +458,29 @@ class HomeFragment : Fragment() {
|
||||||
val live = Refresh.activity.getOrPut(1) { MutableLiveData(true) }
|
val live = Refresh.activity.getOrPut(1) { MutableLiveData(true) }
|
||||||
live.observe(viewLifecycleOwner)
|
live.observe(viewLifecycleOwner)
|
||||||
{
|
{
|
||||||
if (it && !running) {
|
if (!running && it) {
|
||||||
running = true
|
running = true
|
||||||
scope.launch {
|
scope.launch {
|
||||||
withContext(Dispatchers.IO) {
|
withContext(Dispatchers.IO) {
|
||||||
//Get userData First
|
//Get userData First
|
||||||
getUserId(requireContext()) {
|
Anilist.userid =
|
||||||
load()
|
PrefManager.getNullableVal<String>(PrefName.AnilistUserId, null)
|
||||||
|
?.toIntOrNull()
|
||||||
|
if (Anilist.userid == null) {
|
||||||
|
getUserId(requireContext()) {
|
||||||
|
load()
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
CoroutineScope(Dispatchers.IO).launch {
|
||||||
|
getUserId(requireContext()) {
|
||||||
|
load()
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
model.loaded = true
|
model.loaded = true
|
||||||
model.setListImages()
|
CoroutineScope(Dispatchers.IO).launch {
|
||||||
Logger.log("HomeFragment: Refreshing")
|
model.setListImages()
|
||||||
|
}
|
||||||
var empty = true
|
var empty = true
|
||||||
val homeLayoutShow: List<Boolean> =
|
val homeLayoutShow: List<Boolean> =
|
||||||
PrefManager.getVal(PrefName.HomeLayout)
|
PrefManager.getVal(PrefName.HomeLayout)
|
||||||
|
@ -483,9 +496,9 @@ class HomeFragment : Fragment() {
|
||||||
}
|
}
|
||||||
live.postValue(false)
|
live.postValue(false)
|
||||||
_binding?.homeRefresh?.isRefreshing = false
|
_binding?.homeRefresh?.isRefreshing = false
|
||||||
|
running = false
|
||||||
}
|
}
|
||||||
binding.homeHiddenItemsContainer.visibility = View.GONE
|
binding.homeHiddenItemsContainer.visibility = View.GONE
|
||||||
running = false
|
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -33,6 +33,7 @@ import ani.dantotsu.settings.saving.PrefManager
|
||||||
import ani.dantotsu.settings.saving.PrefName
|
import ani.dantotsu.settings.saving.PrefName
|
||||||
import ani.dantotsu.snackString
|
import ani.dantotsu.snackString
|
||||||
import ani.dantotsu.statusBarHeight
|
import ani.dantotsu.statusBarHeight
|
||||||
|
import kotlinx.coroutines.CoroutineScope
|
||||||
import kotlinx.coroutines.Dispatchers
|
import kotlinx.coroutines.Dispatchers
|
||||||
import kotlinx.coroutines.delay
|
import kotlinx.coroutines.delay
|
||||||
import kotlinx.coroutines.launch
|
import kotlinx.coroutines.launch
|
||||||
|
@ -253,13 +254,25 @@ class MangaFragment : Fragment() {
|
||||||
mangaPageAdapter.updateAvatar()
|
mangaPageAdapter.updateAvatar()
|
||||||
}
|
}
|
||||||
|
|
||||||
val live = Refresh.activity.getOrPut(this.hashCode()) { MutableLiveData(false) }
|
var running = false
|
||||||
|
val live = Refresh.activity.getOrPut(this.hashCode()) { MutableLiveData(true) }
|
||||||
live.observe(viewLifecycleOwner) {
|
live.observe(viewLifecycleOwner) {
|
||||||
if (it) {
|
if (!running && it) {
|
||||||
|
running = true
|
||||||
scope.launch {
|
scope.launch {
|
||||||
withContext(Dispatchers.IO) {
|
withContext(Dispatchers.IO) {
|
||||||
getUserId(requireContext()) {
|
Anilist.userid = PrefManager.getNullableVal<String>(PrefName.AnilistUserId, null)
|
||||||
load()
|
?.toIntOrNull()
|
||||||
|
if (Anilist.userid == null) {
|
||||||
|
getUserId(requireContext()) {
|
||||||
|
load()
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
CoroutineScope(Dispatchers.IO).launch {
|
||||||
|
getUserId(requireContext()) {
|
||||||
|
load()
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
model.loaded = true
|
model.loaded = true
|
||||||
model.loadTrending()
|
model.loadTrending()
|
||||||
|
@ -272,6 +285,7 @@ class MangaFragment : Fragment() {
|
||||||
}
|
}
|
||||||
live.postValue(false)
|
live.postValue(false)
|
||||||
_binding?.mangaRefresh?.isRefreshing = false
|
_binding?.mangaRefresh?.isRefreshing = false
|
||||||
|
running = false
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -59,6 +59,20 @@ object Logger {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fun log(level: Int, message: String, tag: String = "Internal Logger") {
|
||||||
|
val trace = Thread.currentThread().stackTrace[3]
|
||||||
|
loggerExecutor.execute {
|
||||||
|
if (file == null) Log.println(level, tag, message)
|
||||||
|
else {
|
||||||
|
val className = trace.className
|
||||||
|
val methodName = trace.methodName
|
||||||
|
val lineNumber = trace.lineNumber
|
||||||
|
file?.appendText("date/time: ${Date()} | $className.$methodName($lineNumber)\n")
|
||||||
|
file?.appendText("message: $message\n-\n")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
fun log(e: Exception) {
|
fun log(e: Exception) {
|
||||||
loggerExecutor.execute {
|
loggerExecutor.execute {
|
||||||
if (file == null) e.printStackTrace() else {
|
if (file == null) e.printStackTrace() else {
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue