diff --git a/app/src/main/kotlin/org/koitharu/kotatsu/bookmarks/ui/AllBookmarksFragment.kt b/app/src/main/kotlin/org/koitharu/kotatsu/bookmarks/ui/AllBookmarksFragment.kt index cd43e2038..df03aa8db 100644 --- a/app/src/main/kotlin/org/koitharu/kotatsu/bookmarks/ui/AllBookmarksFragment.kt +++ b/app/src/main/kotlin/org/koitharu/kotatsu/bookmarks/ui/AllBookmarksFragment.kt @@ -39,6 +39,7 @@ import org.koitharu.kotatsu.list.ui.adapter.TypedListSpacingDecoration import org.koitharu.kotatsu.list.ui.model.ListHeader import org.koitharu.kotatsu.main.ui.owners.AppBarOwner import org.koitharu.kotatsu.parsers.model.Manga +import org.koitharu.kotatsu.reader.ui.PageSaveHelper import javax.inject.Inject @AndroidEntryPoint @@ -52,10 +53,19 @@ class AllBookmarksFragment : @Inject lateinit var settings: AppSettings + @Inject + lateinit var pageSaveHelperFactory: PageSaveHelper.Factory + + private lateinit var pageSaveHelper: PageSaveHelper private val viewModel by viewModels() private var bookmarksAdapter: BookmarksAdapter? = null private var selectionController: ListSelectionController? = null + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + pageSaveHelper = pageSaveHelperFactory.create(this) + } + override fun onCreateViewBinding( inflater: LayoutInflater, container: ViewGroup?, @@ -179,6 +189,12 @@ class AllBookmarksFragment : true } + R.id.action_save -> { + viewModel.savePages(pageSaveHelper, selectionController?.snapshot() ?: return false) + mode?.finish() + true + } + else -> false } } diff --git a/app/src/main/kotlin/org/koitharu/kotatsu/bookmarks/ui/AllBookmarksViewModel.kt b/app/src/main/kotlin/org/koitharu/kotatsu/bookmarks/ui/AllBookmarksViewModel.kt index ffa89b111..d1978dc20 100644 --- a/app/src/main/kotlin/org/koitharu/kotatsu/bookmarks/ui/AllBookmarksViewModel.kt +++ b/app/src/main/kotlin/org/koitharu/kotatsu/bookmarks/ui/AllBookmarksViewModel.kt @@ -22,6 +22,7 @@ import org.koitharu.kotatsu.list.ui.model.ListModel import org.koitharu.kotatsu.list.ui.model.LoadingState import org.koitharu.kotatsu.list.ui.model.toErrorState import org.koitharu.kotatsu.parsers.model.Manga +import org.koitharu.kotatsu.reader.ui.PageSaveHelper import javax.inject.Inject @HiltViewModel @@ -56,6 +57,23 @@ class AllBookmarksViewModel @Inject constructor( } } + fun savePages(pageSaveHelper: PageSaveHelper, ids: Set) { + launchLoadingJob(Dispatchers.Default) { + val tasks = content.value.mapNotNull { + if (it !is Bookmark || it.pageId !in ids) return@mapNotNull null + PageSaveHelper.Task( + manga = it.manga, + chapterId = it.chapterId, + pageNumber = it.page + 1, + page = it.toMangaPage(), + ) + } + val dest = pageSaveHelper.save(tasks) + val msg = if (dest.size == 1) R.string.page_saved else R.string.pages_saved + onActionDone.call(ReversibleAction(msg, null)) + } + } + private fun mapList(data: Map>): List { val result = ArrayList(data.values.sumOf { it.size + 1 }) for ((manga, bookmarks) in data) { diff --git a/app/src/main/kotlin/org/koitharu/kotatsu/details/ui/pager/bookmarks/BookmarksFragment.kt b/app/src/main/kotlin/org/koitharu/kotatsu/details/ui/pager/bookmarks/BookmarksFragment.kt index a1cd3671d..15e92a27b 100644 --- a/app/src/main/kotlin/org/koitharu/kotatsu/details/ui/pager/bookmarks/BookmarksFragment.kt +++ b/app/src/main/kotlin/org/koitharu/kotatsu/details/ui/pager/bookmarks/BookmarksFragment.kt @@ -39,6 +39,7 @@ import org.koitharu.kotatsu.details.ui.pager.ChaptersPagesViewModel import org.koitharu.kotatsu.list.ui.GridSpanResolver import org.koitharu.kotatsu.list.ui.adapter.ListItemType import org.koitharu.kotatsu.list.ui.adapter.TypedListSpacingDecoration +import org.koitharu.kotatsu.reader.ui.PageSaveHelper import org.koitharu.kotatsu.reader.ui.ReaderNavigationCallback import javax.inject.Inject @@ -54,9 +55,13 @@ class BookmarksFragment : BaseFragment(), @Inject lateinit var settings: AppSettings + @Inject + lateinit var pageSaveHelperFactory: PageSaveHelper.Factory + override val recyclerView: RecyclerView? get() = viewBinding?.recyclerView + private lateinit var pageSaveHelper: PageSaveHelper private var bookmarksAdapter: BookmarksAdapter? = null private var spanResolver: GridSpanResolver? = null private var selectionController: ListSelectionController? = null @@ -68,6 +73,7 @@ class BookmarksFragment : BaseFragment(), override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) + pageSaveHelper = pageSaveHelperFactory.create(this) activityViewModel.mangaDetails.observe(this, viewModel) } @@ -180,6 +186,12 @@ class BookmarksFragment : BaseFragment(), true } + R.id.action_save -> { + viewModel.savePages(pageSaveHelper, selectionController?.snapshot() ?: return false) + mode?.finish() + true + } + else -> false } } diff --git a/app/src/main/kotlin/org/koitharu/kotatsu/details/ui/pager/bookmarks/BookmarksViewModel.kt b/app/src/main/kotlin/org/koitharu/kotatsu/details/ui/pager/bookmarks/BookmarksViewModel.kt index c0d0f4377..f70b1abf3 100644 --- a/app/src/main/kotlin/org/koitharu/kotatsu/details/ui/pager/bookmarks/BookmarksViewModel.kt +++ b/app/src/main/kotlin/org/koitharu/kotatsu/details/ui/pager/bookmarks/BookmarksViewModel.kt @@ -21,12 +21,14 @@ import org.koitharu.kotatsu.core.ui.BaseViewModel import org.koitharu.kotatsu.core.ui.util.ReversibleAction import org.koitharu.kotatsu.core.util.ext.MutableEventFlow import org.koitharu.kotatsu.core.util.ext.call +import org.koitharu.kotatsu.core.util.ext.requireValue import org.koitharu.kotatsu.details.data.MangaDetails import org.koitharu.kotatsu.list.ui.model.EmptyState import org.koitharu.kotatsu.list.ui.model.ListHeader import org.koitharu.kotatsu.list.ui.model.ListModel import org.koitharu.kotatsu.list.ui.model.LoadingState import org.koitharu.kotatsu.parsers.model.Manga +import org.koitharu.kotatsu.reader.ui.PageSaveHelper import javax.inject.Inject @HiltViewModel @@ -62,6 +64,24 @@ class BookmarksViewModel @Inject constructor( } } + fun savePages(pageSaveHelper: PageSaveHelper, ids: Set) { + launchLoadingJob(Dispatchers.Default) { + val m = manga.requireValue() + val tasks = content.value.mapNotNull { + if (it !is Bookmark || it.pageId !in ids) return@mapNotNull null + PageSaveHelper.Task( + manga = m, + chapterId = it.chapterId, + pageNumber = it.page + 1, + page = it.toMangaPage(), + ) + } + val dest = pageSaveHelper.save(tasks) + val msg = if (dest.size == 1) R.string.page_saved else R.string.pages_saved + onActionDone.call(ReversibleAction(msg, null)) + } + } + private fun mapList(manga: Manga, bookmarks: List): List? { val chapters = manga.chapters ?: return null val bookmarksMap = bookmarks.groupBy { it.chapterId } diff --git a/app/src/main/kotlin/org/koitharu/kotatsu/details/ui/pager/pages/PagesViewModel.kt b/app/src/main/kotlin/org/koitharu/kotatsu/details/ui/pager/pages/PagesViewModel.kt index 0b14dbbf7..084602d2f 100644 --- a/app/src/main/kotlin/org/koitharu/kotatsu/details/ui/pager/pages/PagesViewModel.kt +++ b/app/src/main/kotlin/org/koitharu/kotatsu/details/ui/pager/pages/PagesViewModel.kt @@ -89,7 +89,7 @@ class PagesViewModel @Inject constructor( val tasks = pages.map { PageSaveHelper.Task( manga = manga, - chapter = manga.requireChapterById(it.chapterId), + chapterId = it.chapterId, pageNumber = it.index + 1, page = it.toMangaPage(), ) diff --git a/app/src/main/kotlin/org/koitharu/kotatsu/reader/ui/PageSaveHelper.kt b/app/src/main/kotlin/org/koitharu/kotatsu/reader/ui/PageSaveHelper.kt index 9619ea814..ac34f89b3 100644 --- a/app/src/main/kotlin/org/koitharu/kotatsu/reader/ui/PageSaveHelper.kt +++ b/app/src/main/kotlin/org/koitharu/kotatsu/reader/ui/PageSaveHelper.kt @@ -178,15 +178,17 @@ class PageSaveHelper @AssistedInject constructor( data class Task( val manga: Manga, - val chapter: MangaChapter, + val chapterId: Long, val pageNumber: Int, val page: MangaPage, ) { fun getFileBaseName() = buildString { append(manga.title.toFileNameSafe().take(MAX_BASENAME_LENGTH)) - append('-') - append(chapter.number) + manga.findChapterById(chapterId)?.let { chapter -> + append('-') + append(chapter.number) + } append('-') append(pageNumber) append('_') diff --git a/app/src/main/kotlin/org/koitharu/kotatsu/reader/ui/ReaderViewModel.kt b/app/src/main/kotlin/org/koitharu/kotatsu/reader/ui/ReaderViewModel.kt index 14b478147..9226f364e 100644 --- a/app/src/main/kotlin/org/koitharu/kotatsu/reader/ui/ReaderViewModel.kt +++ b/app/src/main/kotlin/org/koitharu/kotatsu/reader/ui/ReaderViewModel.kt @@ -257,7 +257,7 @@ class ReaderViewModel @Inject constructor( val currentManga = manga.requireValue() val task = PageSaveHelper.Task( manga = currentManga, - chapter = currentManga.requireChapterById(state.chapterId), + chapterId = state.chapterId, pageNumber = state.page + 1, page = checkNotNull(getCurrentPage()) { "Cannot find current page" }, ) diff --git a/app/src/main/res/menu/mode_bookmarks.xml b/app/src/main/res/menu/mode_bookmarks.xml index 52860b082..7ffcd19f1 100644 --- a/app/src/main/res/menu/mode_bookmarks.xml +++ b/app/src/main/res/menu/mode_bookmarks.xml @@ -9,4 +9,10 @@ android:title="@string/remove" app:showAsAction="ifRoom|withText" /> - \ No newline at end of file + + +