parent
6d880c938a
commit
8749be518f
@ -32,11 +32,9 @@ import eu.kanade.domain.download.interactor.DeleteDownload
|
|||||||
import eu.kanade.domain.extension.interactor.GetExtensionLanguages
|
import eu.kanade.domain.extension.interactor.GetExtensionLanguages
|
||||||
import eu.kanade.domain.extension.interactor.GetExtensionSources
|
import eu.kanade.domain.extension.interactor.GetExtensionSources
|
||||||
import eu.kanade.domain.extension.interactor.GetExtensionsByType
|
import eu.kanade.domain.extension.interactor.GetExtensionsByType
|
||||||
import eu.kanade.domain.history.interactor.DeleteAllHistory
|
|
||||||
import eu.kanade.domain.history.interactor.GetHistory
|
import eu.kanade.domain.history.interactor.GetHistory
|
||||||
import eu.kanade.domain.history.interactor.GetNextUnreadChapters
|
import eu.kanade.domain.history.interactor.GetNextChapters
|
||||||
import eu.kanade.domain.history.interactor.RemoveHistoryById
|
import eu.kanade.domain.history.interactor.RemoveHistory
|
||||||
import eu.kanade.domain.history.interactor.RemoveHistoryByMangaId
|
|
||||||
import eu.kanade.domain.history.interactor.UpsertHistory
|
import eu.kanade.domain.history.interactor.UpsertHistory
|
||||||
import eu.kanade.domain.history.repository.HistoryRepository
|
import eu.kanade.domain.history.repository.HistoryRepository
|
||||||
import eu.kanade.domain.manga.interactor.GetDuplicateLibraryManga
|
import eu.kanade.domain.manga.interactor.GetDuplicateLibraryManga
|
||||||
@ -94,7 +92,7 @@ class DomainModule : InjektModule {
|
|||||||
addFactory { GetLibraryManga(get()) }
|
addFactory { GetLibraryManga(get()) }
|
||||||
addFactory { GetMangaWithChapters(get(), get()) }
|
addFactory { GetMangaWithChapters(get(), get()) }
|
||||||
addFactory { GetManga(get()) }
|
addFactory { GetManga(get()) }
|
||||||
addFactory { GetNextUnreadChapters(get(), get(), get()) }
|
addFactory { GetNextChapters(get(), get(), get()) }
|
||||||
addFactory { ResetViewerFlags(get()) }
|
addFactory { ResetViewerFlags(get()) }
|
||||||
addFactory { SetMangaChapterFlags(get()) }
|
addFactory { SetMangaChapterFlags(get()) }
|
||||||
addFactory { SetMangaDefaultChapterFlags(get(), get(), get()) }
|
addFactory { SetMangaDefaultChapterFlags(get(), get(), get()) }
|
||||||
@ -119,11 +117,9 @@ class DomainModule : InjektModule {
|
|||||||
addFactory { SyncChaptersWithTrackServiceTwoWay(get(), get()) }
|
addFactory { SyncChaptersWithTrackServiceTwoWay(get(), get()) }
|
||||||
|
|
||||||
addSingletonFactory<HistoryRepository> { HistoryRepositoryImpl(get()) }
|
addSingletonFactory<HistoryRepository> { HistoryRepositoryImpl(get()) }
|
||||||
addFactory { DeleteAllHistory(get()) }
|
|
||||||
addFactory { GetHistory(get()) }
|
addFactory { GetHistory(get()) }
|
||||||
addFactory { UpsertHistory(get()) }
|
addFactory { UpsertHistory(get()) }
|
||||||
addFactory { RemoveHistoryById(get()) }
|
addFactory { RemoveHistory(get()) }
|
||||||
addFactory { RemoveHistoryByMangaId(get()) }
|
|
||||||
|
|
||||||
addFactory { DeleteDownload(get(), get()) }
|
addFactory { DeleteDownload(get(), get()) }
|
||||||
|
|
||||||
|
@ -1,12 +0,0 @@
|
|||||||
package eu.kanade.domain.history.interactor
|
|
||||||
|
|
||||||
import eu.kanade.domain.history.repository.HistoryRepository
|
|
||||||
|
|
||||||
class DeleteAllHistory(
|
|
||||||
private val repository: HistoryRepository,
|
|
||||||
) {
|
|
||||||
|
|
||||||
suspend fun await(): Boolean {
|
|
||||||
return repository.deleteAllHistory()
|
|
||||||
}
|
|
||||||
}
|
|
@ -7,6 +7,7 @@ import kotlinx.coroutines.flow.Flow
|
|||||||
class GetHistory(
|
class GetHistory(
|
||||||
private val repository: HistoryRepository,
|
private val repository: HistoryRepository,
|
||||||
) {
|
) {
|
||||||
|
|
||||||
fun subscribe(query: String): Flow<List<HistoryWithRelations>> {
|
fun subscribe(query: String): Flow<List<HistoryWithRelations>> {
|
||||||
return repository.getHistory(query)
|
return repository.getHistory(query)
|
||||||
}
|
}
|
||||||
|
@ -0,0 +1,52 @@
|
|||||||
|
package eu.kanade.domain.history.interactor
|
||||||
|
|
||||||
|
import eu.kanade.domain.chapter.interactor.GetChapterByMangaId
|
||||||
|
import eu.kanade.domain.chapter.model.Chapter
|
||||||
|
import eu.kanade.domain.history.repository.HistoryRepository
|
||||||
|
import eu.kanade.domain.manga.interactor.GetManga
|
||||||
|
import eu.kanade.tachiyomi.util.chapter.getChapterSort
|
||||||
|
import kotlin.math.max
|
||||||
|
|
||||||
|
class GetNextChapters(
|
||||||
|
private val getChapterByMangaId: GetChapterByMangaId,
|
||||||
|
private val getManga: GetManga,
|
||||||
|
private val historyRepository: HistoryRepository,
|
||||||
|
) {
|
||||||
|
|
||||||
|
suspend fun await(onlyUnread: Boolean = true): List<Chapter> {
|
||||||
|
val history = historyRepository.getLastHistory() ?: return emptyList()
|
||||||
|
return await(history.mangaId, history.chapterId, onlyUnread)
|
||||||
|
}
|
||||||
|
|
||||||
|
suspend fun await(mangaId: Long, onlyUnread: Boolean = true): List<Chapter> {
|
||||||
|
val manga = getManga.await(mangaId) ?: return emptyList()
|
||||||
|
val chapters = getChapterByMangaId.await(mangaId)
|
||||||
|
.sortedWith(getChapterSort(manga, sortDescending = false))
|
||||||
|
|
||||||
|
return if (onlyUnread) {
|
||||||
|
chapters.filterNot { it.read }
|
||||||
|
} else {
|
||||||
|
chapters
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
suspend fun await(mangaId: Long, fromChapterId: Long, onlyUnread: Boolean = true): List<Chapter> {
|
||||||
|
val chapters = await(mangaId, onlyUnread)
|
||||||
|
val currChapterIndex = chapters.indexOfFirst { it.id == fromChapterId }
|
||||||
|
val nextChapters = chapters.subList(max(0, currChapterIndex), chapters.size)
|
||||||
|
|
||||||
|
if (onlyUnread) {
|
||||||
|
return nextChapters
|
||||||
|
}
|
||||||
|
|
||||||
|
// The "next chapter" is either:
|
||||||
|
// - The current chapter if it isn't completely read
|
||||||
|
// - The chapters after the current chapter if the current one is completely read
|
||||||
|
val fromChapter = chapters.getOrNull(currChapterIndex)
|
||||||
|
return if (fromChapter != null && !fromChapter.read) {
|
||||||
|
nextChapters
|
||||||
|
} else {
|
||||||
|
nextChapters.drop(1)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -1,33 +0,0 @@
|
|||||||
package eu.kanade.domain.history.interactor
|
|
||||||
|
|
||||||
import eu.kanade.domain.chapter.interactor.GetChapterByMangaId
|
|
||||||
import eu.kanade.domain.chapter.model.Chapter
|
|
||||||
import eu.kanade.domain.history.repository.HistoryRepository
|
|
||||||
import eu.kanade.domain.manga.interactor.GetManga
|
|
||||||
import eu.kanade.tachiyomi.util.chapter.getChapterSort
|
|
||||||
import kotlin.math.max
|
|
||||||
|
|
||||||
class GetNextUnreadChapters(
|
|
||||||
private val getChapterByMangaId: GetChapterByMangaId,
|
|
||||||
private val getManga: GetManga,
|
|
||||||
private val historyRepository: HistoryRepository,
|
|
||||||
) {
|
|
||||||
|
|
||||||
suspend fun await(): Chapter? {
|
|
||||||
val history = historyRepository.getLastHistory() ?: return null
|
|
||||||
return await(history.mangaId, history.chapterId).firstOrNull()
|
|
||||||
}
|
|
||||||
|
|
||||||
suspend fun await(mangaId: Long): List<Chapter> {
|
|
||||||
val manga = getManga.await(mangaId) ?: return emptyList()
|
|
||||||
return getChapterByMangaId.await(mangaId)
|
|
||||||
.sortedWith(getChapterSort(manga, sortDescending = false))
|
|
||||||
.filterNot { it.read }
|
|
||||||
}
|
|
||||||
|
|
||||||
suspend fun await(mangaId: Long, fromChapterId: Long): List<Chapter> {
|
|
||||||
val unreadChapters = await(mangaId)
|
|
||||||
val currChapterIndex = unreadChapters.indexOfFirst { it.id == fromChapterId }
|
|
||||||
return unreadChapters.subList(max(0, currChapterIndex), unreadChapters.size)
|
|
||||||
}
|
|
||||||
}
|
|
@ -3,11 +3,19 @@ package eu.kanade.domain.history.interactor
|
|||||||
import eu.kanade.domain.history.model.HistoryWithRelations
|
import eu.kanade.domain.history.model.HistoryWithRelations
|
||||||
import eu.kanade.domain.history.repository.HistoryRepository
|
import eu.kanade.domain.history.repository.HistoryRepository
|
||||||
|
|
||||||
class RemoveHistoryById(
|
class RemoveHistory(
|
||||||
private val repository: HistoryRepository,
|
private val repository: HistoryRepository,
|
||||||
) {
|
) {
|
||||||
|
|
||||||
|
suspend fun awaitAll(): Boolean {
|
||||||
|
return repository.deleteAllHistory()
|
||||||
|
}
|
||||||
|
|
||||||
suspend fun await(history: HistoryWithRelations) {
|
suspend fun await(history: HistoryWithRelations) {
|
||||||
repository.resetHistory(history.id)
|
repository.resetHistory(history.id)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
suspend fun await(mangaId: Long) {
|
||||||
|
repository.resetHistoryByMangaId(mangaId)
|
||||||
|
}
|
||||||
}
|
}
|
@ -1,12 +0,0 @@
|
|||||||
package eu.kanade.domain.history.interactor
|
|
||||||
|
|
||||||
import eu.kanade.domain.history.repository.HistoryRepository
|
|
||||||
|
|
||||||
class RemoveHistoryByMangaId(
|
|
||||||
private val repository: HistoryRepository,
|
|
||||||
) {
|
|
||||||
|
|
||||||
suspend fun await(mangaId: Long) {
|
|
||||||
repository.resetHistoryByMangaId(mangaId)
|
|
||||||
}
|
|
||||||
}
|
|
@ -16,10 +16,10 @@ import eu.kanade.presentation.history.components.HistoryDeleteAllDialog
|
|||||||
import eu.kanade.presentation.history.components.HistoryDeleteDialog
|
import eu.kanade.presentation.history.components.HistoryDeleteDialog
|
||||||
import eu.kanade.presentation.history.components.HistoryToolbar
|
import eu.kanade.presentation.history.components.HistoryToolbar
|
||||||
import eu.kanade.tachiyomi.R
|
import eu.kanade.tachiyomi.R
|
||||||
|
import eu.kanade.tachiyomi.ui.history.HistoryPresenter
|
||||||
|
import eu.kanade.tachiyomi.ui.history.HistoryPresenter.Dialog
|
||||||
import eu.kanade.tachiyomi.ui.main.MainActivity
|
import eu.kanade.tachiyomi.ui.main.MainActivity
|
||||||
import eu.kanade.tachiyomi.ui.reader.ReaderActivity
|
import eu.kanade.tachiyomi.ui.reader.ReaderActivity
|
||||||
import eu.kanade.tachiyomi.ui.recent.history.HistoryPresenter
|
|
||||||
import eu.kanade.tachiyomi.ui.recent.history.HistoryPresenter.Dialog
|
|
||||||
import eu.kanade.tachiyomi.util.system.toast
|
import eu.kanade.tachiyomi.util.system.toast
|
||||||
import eu.kanade.tachiyomi.widget.TachiyomiBottomNavigationView
|
import eu.kanade.tachiyomi.widget.TachiyomiBottomNavigationView
|
||||||
import kotlinx.coroutines.flow.collectLatest
|
import kotlinx.coroutines.flow.collectLatest
|
||||||
@ -88,7 +88,7 @@ fun HistoryScreen(
|
|||||||
HistoryDeleteAllDialog(
|
HistoryDeleteAllDialog(
|
||||||
onDismissRequest = onDismissRequest,
|
onDismissRequest = onDismissRequest,
|
||||||
onDelete = {
|
onDelete = {
|
||||||
presenter.deleteAllHistory()
|
presenter.removeAllHistory()
|
||||||
},
|
},
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
@ -10,8 +10,8 @@ import androidx.compose.ui.res.stringResource
|
|||||||
import eu.kanade.presentation.components.AppBarTitle
|
import eu.kanade.presentation.components.AppBarTitle
|
||||||
import eu.kanade.presentation.components.SearchToolbar
|
import eu.kanade.presentation.components.SearchToolbar
|
||||||
import eu.kanade.tachiyomi.R
|
import eu.kanade.tachiyomi.R
|
||||||
import eu.kanade.tachiyomi.ui.recent.history.HistoryPresenter
|
import eu.kanade.tachiyomi.ui.history.HistoryPresenter
|
||||||
import eu.kanade.tachiyomi.ui.recent.history.HistoryState
|
import eu.kanade.tachiyomi.ui.history.HistoryState
|
||||||
|
|
||||||
@Composable
|
@Composable
|
||||||
fun HistoryToolbar(
|
fun HistoryToolbar(
|
||||||
|
@ -35,10 +35,10 @@ import eu.kanade.tachiyomi.R
|
|||||||
import eu.kanade.tachiyomi.data.download.model.Download
|
import eu.kanade.tachiyomi.data.download.model.Download
|
||||||
import eu.kanade.tachiyomi.data.library.LibraryUpdateService
|
import eu.kanade.tachiyomi.data.library.LibraryUpdateService
|
||||||
import eu.kanade.tachiyomi.ui.reader.ReaderActivity
|
import eu.kanade.tachiyomi.ui.reader.ReaderActivity
|
||||||
import eu.kanade.tachiyomi.ui.recent.updates.UpdatesItem
|
import eu.kanade.tachiyomi.ui.updates.UpdatesItem
|
||||||
import eu.kanade.tachiyomi.ui.recent.updates.UpdatesPresenter
|
import eu.kanade.tachiyomi.ui.updates.UpdatesPresenter
|
||||||
import eu.kanade.tachiyomi.ui.recent.updates.UpdatesPresenter.Dialog
|
import eu.kanade.tachiyomi.ui.updates.UpdatesPresenter.Dialog
|
||||||
import eu.kanade.tachiyomi.ui.recent.updates.UpdatesPresenter.Event
|
import eu.kanade.tachiyomi.ui.updates.UpdatesPresenter.Event
|
||||||
import eu.kanade.tachiyomi.util.system.toast
|
import eu.kanade.tachiyomi.util.system.toast
|
||||||
import eu.kanade.tachiyomi.widget.TachiyomiBottomNavigationView
|
import eu.kanade.tachiyomi.widget.TachiyomiBottomNavigationView
|
||||||
import kotlinx.coroutines.delay
|
import kotlinx.coroutines.delay
|
||||||
|
@ -6,8 +6,8 @@ import androidx.compose.runtime.getValue
|
|||||||
import androidx.compose.runtime.mutableStateOf
|
import androidx.compose.runtime.mutableStateOf
|
||||||
import androidx.compose.runtime.setValue
|
import androidx.compose.runtime.setValue
|
||||||
import eu.kanade.core.util.insertSeparators
|
import eu.kanade.core.util.insertSeparators
|
||||||
import eu.kanade.tachiyomi.ui.recent.updates.UpdatesItem
|
import eu.kanade.tachiyomi.ui.updates.UpdatesItem
|
||||||
import eu.kanade.tachiyomi.ui.recent.updates.UpdatesPresenter
|
import eu.kanade.tachiyomi.ui.updates.UpdatesPresenter
|
||||||
import eu.kanade.tachiyomi.util.lang.toDateKey
|
import eu.kanade.tachiyomi.util.lang.toDateKey
|
||||||
import java.util.Date
|
import java.util.Date
|
||||||
|
|
||||||
|
@ -44,7 +44,7 @@ import eu.kanade.presentation.util.horizontalPadding
|
|||||||
import eu.kanade.presentation.util.selectedBackground
|
import eu.kanade.presentation.util.selectedBackground
|
||||||
import eu.kanade.tachiyomi.R
|
import eu.kanade.tachiyomi.R
|
||||||
import eu.kanade.tachiyomi.data.download.model.Download
|
import eu.kanade.tachiyomi.data.download.model.Download
|
||||||
import eu.kanade.tachiyomi.ui.recent.updates.UpdatesItem
|
import eu.kanade.tachiyomi.ui.updates.UpdatesItem
|
||||||
import java.text.DateFormat
|
import java.text.DateFormat
|
||||||
import java.util.Date
|
import java.util.Date
|
||||||
import kotlin.time.Duration.Companion.minutes
|
import kotlin.time.Duration.Companion.minutes
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
package eu.kanade.tachiyomi.ui.recent.history
|
package eu.kanade.tachiyomi.ui.history
|
||||||
|
|
||||||
import androidx.compose.runtime.Composable
|
import androidx.compose.runtime.Composable
|
||||||
import eu.kanade.presentation.history.HistoryScreen
|
import eu.kanade.presentation.history.HistoryScreen
|
@ -1,4 +1,4 @@
|
|||||||
package eu.kanade.tachiyomi.ui.recent.history
|
package eu.kanade.tachiyomi.ui.history
|
||||||
|
|
||||||
import androidx.compose.runtime.Composable
|
import androidx.compose.runtime.Composable
|
||||||
import androidx.compose.runtime.Stable
|
import androidx.compose.runtime.Stable
|
||||||
@ -9,11 +9,9 @@ import androidx.compose.runtime.setValue
|
|||||||
import eu.kanade.core.util.insertSeparators
|
import eu.kanade.core.util.insertSeparators
|
||||||
import eu.kanade.domain.base.BasePreferences
|
import eu.kanade.domain.base.BasePreferences
|
||||||
import eu.kanade.domain.chapter.model.Chapter
|
import eu.kanade.domain.chapter.model.Chapter
|
||||||
import eu.kanade.domain.history.interactor.DeleteAllHistory
|
|
||||||
import eu.kanade.domain.history.interactor.GetHistory
|
import eu.kanade.domain.history.interactor.GetHistory
|
||||||
import eu.kanade.domain.history.interactor.GetNextUnreadChapters
|
import eu.kanade.domain.history.interactor.GetNextChapters
|
||||||
import eu.kanade.domain.history.interactor.RemoveHistoryById
|
import eu.kanade.domain.history.interactor.RemoveHistory
|
||||||
import eu.kanade.domain.history.interactor.RemoveHistoryByMangaId
|
|
||||||
import eu.kanade.domain.history.model.HistoryWithRelations
|
import eu.kanade.domain.history.model.HistoryWithRelations
|
||||||
import eu.kanade.presentation.history.HistoryUiModel
|
import eu.kanade.presentation.history.HistoryUiModel
|
||||||
import eu.kanade.tachiyomi.R
|
import eu.kanade.tachiyomi.R
|
||||||
@ -37,10 +35,8 @@ import java.util.Date
|
|||||||
class HistoryPresenter(
|
class HistoryPresenter(
|
||||||
private val state: HistoryStateImpl = HistoryState() as HistoryStateImpl,
|
private val state: HistoryStateImpl = HistoryState() as HistoryStateImpl,
|
||||||
private val getHistory: GetHistory = Injekt.get(),
|
private val getHistory: GetHistory = Injekt.get(),
|
||||||
private val getNextUnreadChapters: GetNextUnreadChapters = Injekt.get(),
|
private val getNextChapters: GetNextChapters = Injekt.get(),
|
||||||
private val deleteAllHistory: DeleteAllHistory = Injekt.get(),
|
private val removeHistory: RemoveHistory = Injekt.get(),
|
||||||
private val removeHistoryById: RemoveHistoryById = Injekt.get(),
|
|
||||||
private val removeHistoryByMangaId: RemoveHistoryByMangaId = Injekt.get(),
|
|
||||||
preferences: BasePreferences = Injekt.get(),
|
preferences: BasePreferences = Injekt.get(),
|
||||||
) : BasePresenter<HistoryController>(), HistoryState by state {
|
) : BasePresenter<HistoryController>(), HistoryState by state {
|
||||||
|
|
||||||
@ -48,7 +44,6 @@ class HistoryPresenter(
|
|||||||
val events: Flow<Event> = _events.receiveAsFlow()
|
val events: Flow<Event> = _events.receiveAsFlow()
|
||||||
|
|
||||||
val isDownloadOnly: Boolean by preferences.downloadedOnly().asState()
|
val isDownloadOnly: Boolean by preferences.downloadedOnly().asState()
|
||||||
|
|
||||||
val isIncognitoMode: Boolean by preferences.incognitoMode().asState()
|
val isIncognitoMode: Boolean by preferences.incognitoMode().asState()
|
||||||
|
|
||||||
@Composable
|
@Composable
|
||||||
@ -80,39 +75,42 @@ class HistoryPresenter(
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fun removeFromHistory(history: HistoryWithRelations) {
|
|
||||||
presenterScope.launchIO {
|
|
||||||
removeHistoryById.await(history)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
fun removeAllFromHistory(mangaId: Long) {
|
|
||||||
presenterScope.launchIO {
|
|
||||||
removeHistoryByMangaId.await(mangaId)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
fun getNextChapterForManga(mangaId: Long, chapterId: Long) {
|
fun getNextChapterForManga(mangaId: Long, chapterId: Long) {
|
||||||
presenterScope.launchIO {
|
presenterScope.launchIO {
|
||||||
val chapter = getNextUnreadChapters.await(mangaId, chapterId).firstOrNull()
|
sendNextChapterEvent(getNextChapters.await(mangaId, chapterId, onlyUnread = false))
|
||||||
_events.send(if (chapter != null) Event.OpenChapter(chapter) else Event.NoNextChapterFound)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
fun deleteAllHistory() {
|
|
||||||
presenterScope.launchIO {
|
|
||||||
val result = deleteAllHistory.await()
|
|
||||||
if (!result) return@launchIO
|
|
||||||
withUIContext {
|
|
||||||
view?.activity?.toast(R.string.clear_history_completed)
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fun resumeLastChapterRead() {
|
fun resumeLastChapterRead() {
|
||||||
presenterScope.launchIO {
|
presenterScope.launchIO {
|
||||||
val chapter = getNextUnreadChapters.await()
|
sendNextChapterEvent(getNextChapters.await(onlyUnread = false))
|
||||||
_events.send(if (chapter != null) Event.OpenChapter(chapter) else Event.NoNextChapterFound)
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private suspend fun sendNextChapterEvent(chapters: List<Chapter>) {
|
||||||
|
val chapter = chapters.firstOrNull()
|
||||||
|
_events.send(if (chapter != null) Event.OpenChapter(chapter) else Event.NoNextChapterFound)
|
||||||
|
}
|
||||||
|
|
||||||
|
fun removeFromHistory(history: HistoryWithRelations) {
|
||||||
|
presenterScope.launchIO {
|
||||||
|
removeHistory.await(history)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fun removeAllFromHistory(mangaId: Long) {
|
||||||
|
presenterScope.launchIO {
|
||||||
|
removeHistory.await(mangaId)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fun removeAllHistory() {
|
||||||
|
presenterScope.launchIO {
|
||||||
|
val result = removeHistory.awaitAll()
|
||||||
|
if (!result) return@launchIO
|
||||||
|
withUIContext {
|
||||||
|
view?.activity?.toast(R.string.clear_history_completed)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -19,7 +19,7 @@ import eu.kanade.domain.category.interactor.SetMangaCategories
|
|||||||
import eu.kanade.domain.category.model.Category
|
import eu.kanade.domain.category.model.Category
|
||||||
import eu.kanade.domain.chapter.interactor.SetReadStatus
|
import eu.kanade.domain.chapter.interactor.SetReadStatus
|
||||||
import eu.kanade.domain.chapter.model.toDbChapter
|
import eu.kanade.domain.chapter.model.toDbChapter
|
||||||
import eu.kanade.domain.history.interactor.GetNextUnreadChapters
|
import eu.kanade.domain.history.interactor.GetNextChapters
|
||||||
import eu.kanade.domain.library.model.LibraryManga
|
import eu.kanade.domain.library.model.LibraryManga
|
||||||
import eu.kanade.domain.library.model.LibrarySort
|
import eu.kanade.domain.library.model.LibrarySort
|
||||||
import eu.kanade.domain.library.model.sort
|
import eu.kanade.domain.library.model.sort
|
||||||
@ -78,7 +78,7 @@ class LibraryPresenter(
|
|||||||
private val getLibraryManga: GetLibraryManga = Injekt.get(),
|
private val getLibraryManga: GetLibraryManga = Injekt.get(),
|
||||||
private val getTracksPerManga: GetTracksPerManga = Injekt.get(),
|
private val getTracksPerManga: GetTracksPerManga = Injekt.get(),
|
||||||
private val getCategories: GetCategories = Injekt.get(),
|
private val getCategories: GetCategories = Injekt.get(),
|
||||||
private val getNextUnreadChapters: GetNextUnreadChapters = Injekt.get(),
|
private val getNextChapters: GetNextChapters = Injekt.get(),
|
||||||
private val setReadStatus: SetReadStatus = Injekt.get(),
|
private val setReadStatus: SetReadStatus = Injekt.get(),
|
||||||
private val updateManga: UpdateManga = Injekt.get(),
|
private val updateManga: UpdateManga = Injekt.get(),
|
||||||
private val setMangaCategories: SetMangaCategories = Injekt.get(),
|
private val setMangaCategories: SetMangaCategories = Injekt.get(),
|
||||||
@ -410,7 +410,7 @@ class LibraryPresenter(
|
|||||||
fun downloadUnreadChapters(mangas: List<Manga>, amount: Int?) {
|
fun downloadUnreadChapters(mangas: List<Manga>, amount: Int?) {
|
||||||
presenterScope.launchNonCancellable {
|
presenterScope.launchNonCancellable {
|
||||||
mangas.forEach { manga ->
|
mangas.forEach { manga ->
|
||||||
val chapters = getNextUnreadChapters.await(manga.id)
|
val chapters = getNextChapters.await(manga.id)
|
||||||
.filterNot { chapter ->
|
.filterNot { chapter ->
|
||||||
downloadManager.queue.any { chapter.id == it.chapter.id } ||
|
downloadManager.queue.any { chapter.id == it.chapter.id } ||
|
||||||
downloadManager.isChapterDownloaded(
|
downloadManager.isChapterDownloaded(
|
||||||
|
@ -52,13 +52,13 @@ import eu.kanade.tachiyomi.ui.browse.BrowseController
|
|||||||
import eu.kanade.tachiyomi.ui.browse.source.browse.BrowseSourceController
|
import eu.kanade.tachiyomi.ui.browse.source.browse.BrowseSourceController
|
||||||
import eu.kanade.tachiyomi.ui.browse.source.globalsearch.GlobalSearchController
|
import eu.kanade.tachiyomi.ui.browse.source.globalsearch.GlobalSearchController
|
||||||
import eu.kanade.tachiyomi.ui.download.DownloadController
|
import eu.kanade.tachiyomi.ui.download.DownloadController
|
||||||
|
import eu.kanade.tachiyomi.ui.history.HistoryController
|
||||||
import eu.kanade.tachiyomi.ui.library.LibraryController
|
import eu.kanade.tachiyomi.ui.library.LibraryController
|
||||||
import eu.kanade.tachiyomi.ui.manga.MangaController
|
import eu.kanade.tachiyomi.ui.manga.MangaController
|
||||||
import eu.kanade.tachiyomi.ui.more.MoreController
|
import eu.kanade.tachiyomi.ui.more.MoreController
|
||||||
import eu.kanade.tachiyomi.ui.more.NewUpdateDialogController
|
import eu.kanade.tachiyomi.ui.more.NewUpdateDialogController
|
||||||
import eu.kanade.tachiyomi.ui.recent.history.HistoryController
|
|
||||||
import eu.kanade.tachiyomi.ui.recent.updates.UpdatesController
|
|
||||||
import eu.kanade.tachiyomi.ui.setting.SettingsMainController
|
import eu.kanade.tachiyomi.ui.setting.SettingsMainController
|
||||||
|
import eu.kanade.tachiyomi.ui.updates.UpdatesController
|
||||||
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.preference.asHotFlow
|
import eu.kanade.tachiyomi.util.preference.asHotFlow
|
||||||
|
@ -40,6 +40,7 @@ import eu.kanade.tachiyomi.ui.browse.migration.search.SearchController
|
|||||||
import eu.kanade.tachiyomi.ui.browse.source.browse.BrowseSourceController
|
import eu.kanade.tachiyomi.ui.browse.source.browse.BrowseSourceController
|
||||||
import eu.kanade.tachiyomi.ui.browse.source.globalsearch.GlobalSearchController
|
import eu.kanade.tachiyomi.ui.browse.source.globalsearch.GlobalSearchController
|
||||||
import eu.kanade.tachiyomi.ui.category.CategoryController
|
import eu.kanade.tachiyomi.ui.category.CategoryController
|
||||||
|
import eu.kanade.tachiyomi.ui.history.HistoryController
|
||||||
import eu.kanade.tachiyomi.ui.library.LibraryController
|
import eu.kanade.tachiyomi.ui.library.LibraryController
|
||||||
import eu.kanade.tachiyomi.ui.main.MainActivity
|
import eu.kanade.tachiyomi.ui.main.MainActivity
|
||||||
import eu.kanade.tachiyomi.ui.manga.MangaPresenter.Dialog
|
import eu.kanade.tachiyomi.ui.manga.MangaPresenter.Dialog
|
||||||
@ -49,8 +50,7 @@ import eu.kanade.tachiyomi.ui.manga.track.TrackItem
|
|||||||
import eu.kanade.tachiyomi.ui.manga.track.TrackSearchDialog
|
import eu.kanade.tachiyomi.ui.manga.track.TrackSearchDialog
|
||||||
import eu.kanade.tachiyomi.ui.manga.track.TrackSheet
|
import eu.kanade.tachiyomi.ui.manga.track.TrackSheet
|
||||||
import eu.kanade.tachiyomi.ui.reader.ReaderActivity
|
import eu.kanade.tachiyomi.ui.reader.ReaderActivity
|
||||||
import eu.kanade.tachiyomi.ui.recent.history.HistoryController
|
import eu.kanade.tachiyomi.ui.updates.UpdatesController
|
||||||
import eu.kanade.tachiyomi.ui.recent.updates.UpdatesController
|
|
||||||
import eu.kanade.tachiyomi.ui.webview.WebViewActivity
|
import eu.kanade.tachiyomi.ui.webview.WebViewActivity
|
||||||
import eu.kanade.tachiyomi.util.system.isTabletUi
|
import eu.kanade.tachiyomi.util.system.isTabletUi
|
||||||
import eu.kanade.tachiyomi.util.system.logcat
|
import eu.kanade.tachiyomi.util.system.logcat
|
||||||
|
@ -11,7 +11,7 @@ import eu.kanade.domain.chapter.interactor.UpdateChapter
|
|||||||
import eu.kanade.domain.chapter.model.ChapterUpdate
|
import eu.kanade.domain.chapter.model.ChapterUpdate
|
||||||
import eu.kanade.domain.chapter.model.toDbChapter
|
import eu.kanade.domain.chapter.model.toDbChapter
|
||||||
import eu.kanade.domain.download.service.DownloadPreferences
|
import eu.kanade.domain.download.service.DownloadPreferences
|
||||||
import eu.kanade.domain.history.interactor.GetNextUnreadChapters
|
import eu.kanade.domain.history.interactor.GetNextChapters
|
||||||
import eu.kanade.domain.history.interactor.UpsertHistory
|
import eu.kanade.domain.history.interactor.UpsertHistory
|
||||||
import eu.kanade.domain.history.model.HistoryUpdate
|
import eu.kanade.domain.history.model.HistoryUpdate
|
||||||
import eu.kanade.domain.manga.interactor.GetManga
|
import eu.kanade.domain.manga.interactor.GetManga
|
||||||
@ -88,7 +88,7 @@ class ReaderPresenter(
|
|||||||
private val delayedTrackingStore: DelayedTrackingStore = Injekt.get(),
|
private val delayedTrackingStore: DelayedTrackingStore = Injekt.get(),
|
||||||
private val getManga: GetManga = Injekt.get(),
|
private val getManga: GetManga = Injekt.get(),
|
||||||
private val getChapterByMangaId: GetChapterByMangaId = Injekt.get(),
|
private val getChapterByMangaId: GetChapterByMangaId = Injekt.get(),
|
||||||
private val getNextUnreadChapters: GetNextUnreadChapters = Injekt.get(),
|
private val getNextChapters: GetNextChapters = Injekt.get(),
|
||||||
private val getTracks: GetTracks = Injekt.get(),
|
private val getTracks: GetTracks = Injekt.get(),
|
||||||
private val insertTrack: InsertTrack = Injekt.get(),
|
private val insertTrack: InsertTrack = Injekt.get(),
|
||||||
private val upsertHistory: UpsertHistory = Injekt.get(),
|
private val upsertHistory: UpsertHistory = Injekt.get(),
|
||||||
@ -475,7 +475,7 @@ class ReaderPresenter(
|
|||||||
)
|
)
|
||||||
if (!isNextChapterDownloaded) return@launchIO
|
if (!isNextChapterDownloaded) return@launchIO
|
||||||
|
|
||||||
val chaptersToDownload = getNextUnreadChapters.await(manga.id!!, nextChapter.id!!)
|
val chaptersToDownload = getNextChapters.await(manga.id!!, nextChapter.id!!)
|
||||||
.take(amount)
|
.take(amount)
|
||||||
downloadManager.downloadChapters(
|
downloadManager.downloadChapters(
|
||||||
manga.toDomainManga()!!,
|
manga.toDomainManga()!!,
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
package eu.kanade.tachiyomi.ui.recent.updates
|
package eu.kanade.tachiyomi.ui.updates
|
||||||
|
|
||||||
import androidx.compose.runtime.Composable
|
import androidx.compose.runtime.Composable
|
||||||
import androidx.compose.runtime.LaunchedEffect
|
import androidx.compose.runtime.LaunchedEffect
|
||||||
@ -26,6 +26,7 @@ class UpdatesController :
|
|||||||
(activity as? MainActivity)?.moveToStartScreen()
|
(activity as? MainActivity)?.moveToStartScreen()
|
||||||
},
|
},
|
||||||
)
|
)
|
||||||
|
|
||||||
LaunchedEffect(presenter.selectionMode) {
|
LaunchedEffect(presenter.selectionMode) {
|
||||||
(activity as? MainActivity)?.showBottomNav(presenter.selectionMode.not())
|
(activity as? MainActivity)?.showBottomNav(presenter.selectionMode.not())
|
||||||
}
|
}
|
@ -1,4 +1,4 @@
|
|||||||
package eu.kanade.tachiyomi.ui.recent.updates
|
package eu.kanade.tachiyomi.ui.updates
|
||||||
|
|
||||||
import android.os.Bundle
|
import android.os.Bundle
|
||||||
import androidx.compose.runtime.Immutable
|
import androidx.compose.runtime.Immutable
|
||||||
@ -47,13 +47,13 @@ import java.util.Date
|
|||||||
|
|
||||||
class UpdatesPresenter(
|
class UpdatesPresenter(
|
||||||
private val state: UpdatesStateImpl = UpdatesState() as UpdatesStateImpl,
|
private val state: UpdatesStateImpl = UpdatesState() as UpdatesStateImpl,
|
||||||
|
private val sourceManager: SourceManager = Injekt.get(),
|
||||||
|
private val downloadManager: DownloadManager = Injekt.get(),
|
||||||
|
private val downloadCache: DownloadCache = Injekt.get(),
|
||||||
private val updateChapter: UpdateChapter = Injekt.get(),
|
private val updateChapter: UpdateChapter = Injekt.get(),
|
||||||
private val setReadStatus: SetReadStatus = Injekt.get(),
|
private val setReadStatus: SetReadStatus = Injekt.get(),
|
||||||
private val getUpdates: GetUpdates = Injekt.get(),
|
private val getUpdates: GetUpdates = Injekt.get(),
|
||||||
private val getManga: GetManga = Injekt.get(),
|
private val getManga: GetManga = Injekt.get(),
|
||||||
private val sourceManager: SourceManager = Injekt.get(),
|
|
||||||
private val downloadManager: DownloadManager = Injekt.get(),
|
|
||||||
private val downloadCache: DownloadCache = Injekt.get(),
|
|
||||||
private val getChapter: GetChapter = Injekt.get(),
|
private val getChapter: GetChapter = Injekt.get(),
|
||||||
basePreferences: BasePreferences = Injekt.get(),
|
basePreferences: BasePreferences = Injekt.get(),
|
||||||
uiPreferences: UiPreferences = Injekt.get(),
|
uiPreferences: UiPreferences = Injekt.get(),
|
Loading…
Reference in New Issue
Block a user