Show progress of new chapters checking
This commit is contained in:
1
.idea/dictionaries/admin.xml
generated
1
.idea/dictionaries/admin.xml
generated
@@ -8,6 +8,7 @@
|
||||
<w>koin</w>
|
||||
<w>kotatsu</w>
|
||||
<w>manga</w>
|
||||
<w>snackbar</w>
|
||||
<w>upsert</w>
|
||||
<w>webtoon</w>
|
||||
</words>
|
||||
|
||||
@@ -19,6 +19,7 @@ import org.koitharu.kotatsu.list.ui.model.ListModel
|
||||
import org.koitharu.kotatsu.tracker.ui.adapter.FeedAdapter
|
||||
import org.koitharu.kotatsu.tracker.work.TrackWorker
|
||||
import org.koitharu.kotatsu.utils.ext.getDisplayMessage
|
||||
import org.koitharu.kotatsu.utils.progress.Progress
|
||||
|
||||
class FeedFragment : BaseFragment<FragmentFeedBinding>(), PaginationScrollListener.Callback,
|
||||
OnListItemClickListener<Manga> {
|
||||
@@ -26,6 +27,7 @@ class FeedFragment : BaseFragment<FragmentFeedBinding>(), PaginationScrollListen
|
||||
private val viewModel by viewModel<FeedViewModel>()
|
||||
|
||||
private var feedAdapter: FeedAdapter? = null
|
||||
private var updateStatusSnackbar: Snackbar? = null
|
||||
|
||||
override fun getTitle() = context?.getString(R.string.updates)
|
||||
|
||||
@@ -53,6 +55,8 @@ class FeedFragment : BaseFragment<FragmentFeedBinding>(), PaginationScrollListen
|
||||
|
||||
viewModel.content.observe(viewLifecycleOwner, this::onListChanged)
|
||||
viewModel.onError.observe(viewLifecycleOwner, this::onError)
|
||||
TrackWorker.getProgressLiveData(view.context.applicationContext)
|
||||
.observe(viewLifecycleOwner, this::onUpdateProgressChanged)
|
||||
}
|
||||
|
||||
override fun onCreateOptionsMenu(menu: Menu, inflater: MenuInflater) {
|
||||
@@ -66,7 +70,7 @@ class FeedFragment : BaseFragment<FragmentFeedBinding>(), PaginationScrollListen
|
||||
Snackbar.make(
|
||||
binding.recyclerView,
|
||||
R.string.feed_will_update_soon,
|
||||
Snackbar.LENGTH_LONG
|
||||
Snackbar.LENGTH_SHORT
|
||||
).show()
|
||||
true
|
||||
}
|
||||
@@ -75,6 +79,7 @@ class FeedFragment : BaseFragment<FragmentFeedBinding>(), PaginationScrollListen
|
||||
|
||||
override fun onDestroyView() {
|
||||
feedAdapter = null
|
||||
updateStatusSnackbar = null
|
||||
super.onDestroyView()
|
||||
}
|
||||
|
||||
@@ -98,6 +103,25 @@ class FeedFragment : BaseFragment<FragmentFeedBinding>(), PaginationScrollListen
|
||||
).show()
|
||||
}
|
||||
|
||||
private fun onUpdateProgressChanged(progress: Progress?) {
|
||||
if (progress == null) {
|
||||
updateStatusSnackbar?.dismiss()
|
||||
updateStatusSnackbar = null
|
||||
return
|
||||
}
|
||||
val summaryText = getString(
|
||||
R.string.chapers_checking_progress,
|
||||
progress.value + 1,
|
||||
progress.total
|
||||
)
|
||||
updateStatusSnackbar?.setText(summaryText) ?: run {
|
||||
val snackbar =
|
||||
Snackbar.make(binding.recyclerView, summaryText, Snackbar.LENGTH_INDEFINITE)
|
||||
updateStatusSnackbar = snackbar
|
||||
snackbar.show()
|
||||
}
|
||||
}
|
||||
|
||||
override fun onScrolledToEnd() {
|
||||
viewModel.loadList(append = true)
|
||||
}
|
||||
|
||||
@@ -8,6 +8,8 @@ import android.os.Build
|
||||
import androidx.annotation.RequiresApi
|
||||
import androidx.core.app.NotificationCompat
|
||||
import androidx.core.content.ContextCompat
|
||||
import androidx.lifecycle.LiveData
|
||||
import androidx.lifecycle.map
|
||||
import androidx.work.*
|
||||
import coil.ImageLoader
|
||||
import coil.request.ImageRequest
|
||||
@@ -24,6 +26,7 @@ import org.koitharu.kotatsu.tracker.domain.TrackingRepository
|
||||
import org.koitharu.kotatsu.utils.ext.mangaRepositoryOf
|
||||
import org.koitharu.kotatsu.utils.ext.toBitmapOrNull
|
||||
import org.koitharu.kotatsu.utils.ext.toUriOrNull
|
||||
import org.koitharu.kotatsu.utils.progress.Progress
|
||||
import java.util.concurrent.TimeUnit
|
||||
|
||||
class TrackWorker(context: Context, workerParams: WorkerParameters) :
|
||||
@@ -50,10 +53,14 @@ class TrackWorker(context: Context, workerParams: WorkerParameters) :
|
||||
return Result.success()
|
||||
}
|
||||
var success = 0
|
||||
for (track in tracks) {
|
||||
val workData = Data.Builder()
|
||||
.putInt(DATA_TOTAL, tracks.size)
|
||||
for ((index, track) in tracks.withIndex()) {
|
||||
val details = runCatching {
|
||||
mangaRepositoryOf(track.manga.source).getDetails(track.manga)
|
||||
}.getOrNull()
|
||||
workData.putInt(DATA_PROGRESS, index)
|
||||
setProgress(workData.build())
|
||||
val chapters = details?.chapters ?: continue
|
||||
when {
|
||||
track.knownChaptersCount == -1 -> { //first check
|
||||
@@ -194,6 +201,8 @@ class TrackWorker(context: Context, workerParams: WorkerParameters) :
|
||||
companion object {
|
||||
|
||||
const val CHANNEL_ID = "tracking"
|
||||
private const val DATA_PROGRESS = "progress"
|
||||
private const val DATA_TOTAL = "total"
|
||||
private const val TAG = "tracking"
|
||||
|
||||
@RequiresApi(Build.VERSION_CODES.O)
|
||||
@@ -240,5 +249,20 @@ class TrackWorker(context: Context, workerParams: WorkerParameters) :
|
||||
WorkManager.getInstance(context)
|
||||
.enqueue(request)
|
||||
}
|
||||
|
||||
fun getProgressLiveData(context: Context): LiveData<Progress?> {
|
||||
return WorkManager.getInstance(context)
|
||||
.getWorkInfosByTagLiveData(TAG)
|
||||
.map { list ->
|
||||
list.find { work ->
|
||||
work.state == WorkInfo.State.RUNNING
|
||||
}?.let { workInfo ->
|
||||
Progress(
|
||||
value = workInfo.progress.getInt(DATA_PROGRESS, 0),
|
||||
total = workInfo.progress.getInt(DATA_TOTAL, -1)
|
||||
).takeUnless { it.isIndeterminate }
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -192,4 +192,5 @@
|
||||
<string name="resolve">Resolve</string>
|
||||
<string name="clear_cookies">Очистить куки</string>
|
||||
<string name="cookies_cleared">Все куки удалены</string>
|
||||
<string name="chapers_checking_progress">Проверка новых глав: %1$d из %2$d</string>
|
||||
</resources>
|
||||
@@ -194,4 +194,5 @@
|
||||
<string name="resolve">Resolve</string>
|
||||
<string name="clear_cookies">Clear cookies</string>
|
||||
<string name="cookies_cleared">All cookies was removed</string>
|
||||
<string name="chapers_checking_progress">Checking for new chapters: %1$d of %2$d</string>
|
||||
</resources>
|
||||
Reference in New Issue
Block a user