Suggested Start/Completed Date for Trackers based on reading history

This commit is contained in:
Jays2Kings 2021-03-22 01:34:55 -04:00
parent 1e3de8a67f
commit 9090f87756
6 changed files with 101 additions and 4 deletions

View File

@ -929,7 +929,7 @@ class LibraryPresenter(
libraryManga.forEach { manga ->
if (manga.date_added == 0L) {
val chapters = db.getChapters(manga).executeAsBlocking()
manga.date_added = chapters.minBy { it.date_fetch }?.date_fetch ?: 0L
manga.date_added = chapters.minByOrNull { it.date_fetch }?.date_fetch ?: 0L
db.insertManga(manga).executeAsBlocking()
}
db.resetMangaInfo(manga).executeAsBlocking()

View File

@ -30,6 +30,7 @@ import eu.kanade.tachiyomi.source.Source
import eu.kanade.tachiyomi.source.model.toSChapter
import eu.kanade.tachiyomi.source.model.toSManga
import eu.kanade.tachiyomi.ui.manga.chapter.ChapterItem
import eu.kanade.tachiyomi.ui.manga.track.SetTrackReadingDatesDialog
import eu.kanade.tachiyomi.ui.manga.track.TrackItem
import eu.kanade.tachiyomi.ui.security.SecureActivityDelegate
import eu.kanade.tachiyomi.util.chapter.ChapterFilter
@ -895,6 +896,15 @@ class MangaDetailsPresenter(
updateRemote(track, item.service)
}
fun getSuggestedDate(readingDate: SetTrackReadingDatesDialog.ReadingDate): Long? {
val chapters = db.getHistoryByMangaId(manga.id ?: 0L).executeAsBlocking()
val date = when (readingDate) {
SetTrackReadingDatesDialog.ReadingDate.Start -> chapters.minByOrNull { it.last_read }?.last_read
SetTrackReadingDatesDialog.ReadingDate.Finish -> chapters.maxByOrNull { it.last_read }?.last_read
} ?: return null
return if (date <= 0L) null else date
}
companion object {
const val MULTIPLE_VOLUMES = 1
const val TENS_OF_CHAPTERS = 2

View File

@ -3,15 +3,22 @@ package eu.kanade.tachiyomi.ui.manga.track
import android.app.Dialog
import android.os.Bundle
import androidx.core.os.bundleOf
import com.afollestad.date.dayOfMonth
import com.afollestad.date.month
import com.afollestad.date.year
import com.afollestad.materialdialogs.MaterialDialog
import com.afollestad.materialdialogs.datetime.datePicker
import com.bluelinelabs.conductor.Controller
import eu.kanade.tachiyomi.R
import eu.kanade.tachiyomi.data.database.models.Track
import eu.kanade.tachiyomi.data.preference.PreferencesHelper
import eu.kanade.tachiyomi.data.track.TrackManager
import eu.kanade.tachiyomi.ui.base.controller.DialogController
import eu.kanade.tachiyomi.util.view.setDate
import uy.kohesive.injekt.Injekt
import uy.kohesive.injekt.api.get
import uy.kohesive.injekt.injectLazy
import java.text.DateFormat
import java.util.Calendar
class SetTrackReadingDatesDialog<T> : DialogController
@ -20,16 +27,23 @@ class SetTrackReadingDatesDialog<T> : DialogController
private val item: TrackItem
private val dateToUpdate: ReadingDate
private val suggestedDate: Long?
private val preferences: PreferencesHelper by injectLazy()
private val dateFormat: DateFormat by lazy {
preferences.dateFormat()
}
private lateinit var listener: Listener
constructor(target: T, listener: Listener, dateToUpdate: ReadingDate, item: TrackItem) : super(
constructor(target: T, listener: Listener, dateToUpdate: ReadingDate, item: TrackItem, suggestedDate: Long?) : super(
bundleOf(KEY_ITEM_TRACK to item.track)
) {
targetController = target
this.listener = listener
this.item = item
this.dateToUpdate = dateToUpdate
this.suggestedDate = suggestedDate
}
@Suppress("unused")
@ -38,6 +52,7 @@ class SetTrackReadingDatesDialog<T> : DialogController
val service = Injekt.get<TrackManager>().getService(track.sync_id)!!
item = TrackItem(track, service)
dateToUpdate = ReadingDate.Start
suggestedDate = null
}
override fun onCreateDialog(savedViewState: Bundle?): Dialog {
@ -53,12 +68,59 @@ class SetTrackReadingDatesDialog<T> : DialogController
}
.neutralButton(R.string.remove) {
listener.setReadingDate(item, dateToUpdate, 0L)
}.apply {
getSuggestedDate()?.let {
message(text = it,
applySettings = {
messageTextView.setOnClickListener {
this@apply.setDate(suggestedDate ?: 0L)
}
})
}
}
}
private fun getSuggestedDate(): String? {
item.track ?: return null
val date = when (dateToUpdate) {
ReadingDate.Start -> item.track.started_reading_date
ReadingDate.Finish -> item.track.finished_reading_date
}
if (date != 0L) {
if (suggestedDate != null) {
val calendar = Calendar.getInstance()
calendar.timeInMillis = date
val suggestedCalendar = Calendar.getInstance()
suggestedCalendar.timeInMillis = suggestedDate
return if (date > suggestedDate &&
(suggestedCalendar.year != calendar.year ||
suggestedCalendar.month != calendar.month ||
suggestedCalendar.dayOfMonth != calendar.dayOfMonth)
) {
activity?.getString(
R.string.suggested_date_,
dateFormat.format(suggestedDate)
)
} else {
null
}
}
}
suggestedDate?.let {
return activity?.getString(
R.string.suggested_date_,
dateFormat.format(suggestedDate)
)
}
return null
}
private fun getCurrentDate(): Calendar {
// Today if no date is set, otherwise the already set date
return Calendar.getInstance().apply {
suggestedDate?.let {
timeInMillis = it
}
item.track?.let {
val date = when (dateToUpdate) {
ReadingDate.Start -> it.started_reading_date

View File

@ -187,14 +187,26 @@ class TrackingBottomSheet(private val controller: MangaDetailsController) :
val item = adapter?.getItem(position) ?: return
if (item.track == null) return
SetTrackReadingDatesDialog(controller, this, SetTrackReadingDatesDialog.ReadingDate.Start, item).showDialog(controller.router)
val suggestedDate = presenter.getSuggestedDate(SetTrackReadingDatesDialog.ReadingDate.Start)
SetTrackReadingDatesDialog(controller,
this,
SetTrackReadingDatesDialog.ReadingDate.Start,
item,
suggestedDate)
.showDialog(controller.router)
}
override fun onFinishDateClick(position: Int) {
val item = adapter?.getItem(position) ?: return
if (item.track == null) return
SetTrackReadingDatesDialog(controller, this, SetTrackReadingDatesDialog.ReadingDate.Finish, item).showDialog(controller.router)
val suggestedDate = presenter.getSuggestedDate(SetTrackReadingDatesDialog.ReadingDate.Finish)
SetTrackReadingDatesDialog(controller,
this,
SetTrackReadingDatesDialog.ReadingDate.Finish,
item,
suggestedDate)
.showDialog(controller.router)
}
override fun setStatus(item: TrackItem, selection: Int) {

View File

@ -0,0 +1,12 @@
package eu.kanade.tachiyomi.util.view
import com.afollestad.date.DatePicker
import com.afollestad.materialdialogs.MaterialDialog
import java.util.Calendar
fun MaterialDialog.setDate(date: Long) {
val datePicker = findViewById<DatePicker>(com.afollestad.materialdialogs.datetime.R.id.datetimeDatePicker) ?: return
val calendar = Calendar.getInstance()
calendar.timeInMillis = date
datePicker.setDate(calendar)
}

View File

@ -436,6 +436,7 @@
<string name="started_reading_date">Started reading date</string>
<string name="finished_reading_date">Finished reading date</string>
<string name="myanimelist_relogin">Please login to MAL again</string>
<string name="suggested_date_">Suggested date: %1$s</string>
<!-- Migration -->
<string name="select_sources">Select sources</string>