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