diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/library/LibraryCategoryView.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/library/LibraryCategoryView.kt index b9fdbe53ad..65bc1c0351 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/library/LibraryCategoryView.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/library/LibraryCategoryView.kt @@ -156,35 +156,24 @@ class LibraryCategoryView @JvmOverloads constructor(context: Context, attrs: Att subscriptions += controller.reorganizeRelay .subscribe { if (it.first == category.id) { - var items:List - if (it.second in 5..6) { - items = adapter.currentItems.toMutableList() + if (it.second in -2..-1) { + val items = adapter.currentItems.toMutableList() val mangas = controller.selectedMangas val selectedManga = items.filter { item -> item.manga in mangas } items.removeAll(selectedManga) - if (it.second == 5) items.addAll(0, selectedManga) + if (it.second == -1) items.addAll(0, selectedManga) else items.addAll(selectedManga) adapter.setItems(items) adapter.notifyDataSetChanged() saveDragSort() } else { - items = when (it.second) { - 1, 2 -> adapter.currentItems.sortedBy { - if (preferences.removeArticles().getOrDefault()) it.manga.title.removeArticles() - else it.manga.title - } - 3, 4 -> adapter.currentItems.sortedBy { it.manga.last_update } - else -> adapter.currentItems.sortedBy { it.manga.title } - } - if (it.second % 2 == 0) items = items.reversed() - adapter.setItems(items) - adapter.notifyDataSetChanged() category.mangaSort = ('a' + (it.second - 1)) if (category.name == "Default") preferences.defaultMangaOrder().set(category.mangaSort.toString()) else db.insertCategory(category).asRxObservable().subscribe() + controller.enableReorderItems(category) } } } @@ -218,11 +207,8 @@ class LibraryCategoryView @JvmOverloads constructor(context: Context, attrs: Att */ fun onNextLibraryManga(event: LibraryMangaEvent) { // Get the manga list for this category. - val sortingMode = preferences.librarySortingMode().getOrDefault() adapter.isLongPressDragEnabled = canDrag() - var mangaForCategory = event.getMangaForCategory(category).orEmpty() - if (sortingMode == LibrarySort.DRAG_AND_DROP) - mangaForCategory = sortMangaInDragAnDrop(mangaForCategory) + val mangaForCategory = event.getMangaForCategory(category).orEmpty() // Update the category with its manga. adapter.setItems(mangaForCategory) @@ -238,32 +224,6 @@ class LibraryCategoryView @JvmOverloads constructor(context: Context, attrs: Att } } - fun sortMangaInDragAnDrop(mangaForCategory: List): List { - if (category.name == "Default") { - val defOrder = preferences.defaultMangaOrder().getOrDefault() - if (defOrder.first().isLetter()) category.mangaSort = defOrder.first() - else category.mangaOrder = defOrder.split("/").mapNotNull { it.toLongOrNull() } - } - return if (category.mangaSort != null) { - var mangas = when (category.mangaSort) { - 'a', 'b' -> mangaForCategory.sortedBy { - if (preferences.removeArticles().getOrDefault()) it.manga.title.removeArticles() - else it.manga.title - } - 'c', 'd' -> mangaForCategory.sortedBy { it.manga.last_update } - else -> mangaForCategory.sortedBy { it.manga.title } - } - if (category.mangaSort == 'b' || category.mangaSort == 'd') - mangas = mangas.asReversed() - mangas - - } else mangaForCategory.sortedBy { - category.mangaOrder.indexOf( - it.manga.id - ) - } - } - /** * Subscribe to [LibrarySelectionEvent]. When an event is received, it updates the selection * depending on the type of event received. @@ -373,6 +333,8 @@ class LibraryCategoryView @JvmOverloads constructor(context: Context, attrs: Att preferences.defaultMangaOrder().set(mangaIds.joinToString("/")) else db.insertCategory(category).asRxObservable().subscribe() + controller.onSortChanged() + controller.enableReorderItems(category) } override fun shouldMoveItem(fromPosition: Int, toPosition: Int): Boolean { if (adapter.selectedItemCount > 1) diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/library/LibraryController.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/library/LibraryController.kt index 8da6c3f89f..cc7bc18d15 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/library/LibraryController.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/library/LibraryController.kt @@ -22,6 +22,7 @@ import androidx.core.content.ContextCompat.getSystemService import androidx.core.graphics.drawable.DrawableCompat import androidx.core.view.GravityCompat import androidx.drawerlayout.widget.DrawerLayout +import androidx.viewpager.widget.ViewPager import com.bluelinelabs.conductor.ControllerChangeHandler import com.bluelinelabs.conductor.ControllerChangeType import com.f2prateek.rx.preferences.Preference @@ -158,6 +159,8 @@ class LibraryController( var snack: Snackbar? = null + private var reorderMenuItem:MenuItem? = null + init { setHasOptionsMenu(true) retainViewMode = RetainViewMode.RETAIN_DETACH @@ -185,6 +188,20 @@ class LibraryController( activeCategory = it } + library_pager.addOnPageChangeListener(object : ViewPager.OnPageChangeListener { + override fun onPageSelected(position: Int) { + enableReorderItems(position) + } + + override fun onPageScrolled( + position: Int, + positionOffset: Float, + positionOffsetPixels: Int + ) { } + + override fun onPageScrollStateChanged(state: Int) { } + }) + getColumnsPreferenceForCurrentOrientation().asObservable() .doOnNext { mangaPerRow = it } .skip(1) @@ -196,6 +213,31 @@ class LibraryController( } } + fun enableReorderItems(category: Category) { + adapter?.categories?.getOrNull(library_pager.currentItem)?.mangaSort = category.mangaSort + enableReorderItems(sortType = category.mangaSort) + } + + private fun enableReorderItems(position: Int? = null, sortType: Char? = null) { + val pos = position ?: library_pager.currentItem + val orderOfCat = sortType ?: adapter?.categories?.getOrNull(pos)?.mangaSort + if (reorderMenuItem?.isVisible != true) return + val subMenu = reorderMenuItem?.subMenu ?: return + if (orderOfCat != null) { + subMenu.setGroupCheckable(R.id.reorder_group, true, true) + when (orderOfCat) { + 'a' -> subMenu.findItem(R.id.action_alpha_asc)?.isChecked = true + 'b' -> subMenu.findItem(R.id.action_alpha_dsc)?.isChecked = true + 'c' -> subMenu.findItem(R.id.action_update_asc)?.isChecked = true + 'd' -> subMenu.findItem(R.id.action_update_dsc)?.isChecked = true + 'e' -> subMenu.findItem(R.id.action_unread)?.isChecked = true + } + } + else { + subMenu.setGroupCheckable(R.id.reorder_group, false, false) + } + } + override fun onChangeStarted(handler: ControllerChangeHandler, type: ControllerChangeType) { super.onChangeStarted(handler, type) if (type.isEnter) { @@ -337,7 +379,7 @@ class LibraryController( /** * Called when the sorting mode is changed. */ - private fun onSortChanged() { + fun onSortChanged() { activity?.invalidateOptionsMenu() presenter.requestSortUpdate() } @@ -381,6 +423,8 @@ class LibraryController( val reorganizeItem = menu.findItem(R.id.action_reorganize) reorganizeItem.isVisible = preferences.librarySortingMode().getOrDefault() == LibrarySort.DRAG_AND_DROP + reorderMenuItem = reorganizeItem + enableReorderItems() val searchItem = menu.findItem(R.id.action_search) val searchView = searchItem.actionView as SearchView @@ -439,8 +483,9 @@ class LibraryController( } R.id.action_alpha_asc -> reOrder(1) R.id.action_alpha_dsc -> reOrder(2) - R.id.action_update_dsc -> reOrder(3) - R.id.action_update_asc -> reOrder(4) + R.id.action_update_asc -> reOrder(3) + R.id.action_update_dsc -> reOrder(4) + R.id.action_unread -> reOrder(5) else -> return super.onOptionsItemSelected(item) } @@ -450,6 +495,7 @@ class LibraryController( private fun reOrder(type: Int) { adapter?.categories?.getOrNull(library_pager.currentItem)?.id?.let { reorganizeRelay.call(it to type) + onSortChanged() } } @@ -527,7 +573,7 @@ class LibraryController( } R.id.action_to_top, R.id.action_to_bottom -> { adapter?.categories?.getOrNull(library_pager.currentItem)?.id?.let { - reorganizeRelay.call(it to if (item.itemId == R.id.action_to_top) 5 else 6) + reorganizeRelay.call(it to if (item.itemId == R.id.action_to_top) -1 else -2) } destroyActionModeIfNeeded() } diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/library/LibraryPresenter.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/library/LibraryPresenter.kt index cebb978dee..a61ddd072b 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/library/LibraryPresenter.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/library/LibraryPresenter.kt @@ -200,6 +200,14 @@ class LibraryPresenter( var counter = 0 db.getTotalChapterManga().executeAsBlocking().associate { it.id!! to counter++ } } + val catListing by lazy { + val default = Category.createDefault() + val defOrder = preferences.defaultMangaOrder().getOrDefault() + if (defOrder.firstOrNull()?.isLetter() == true) default.mangaSort = defOrder.first() + else default.mangaOrder = defOrder.split("/").mapNotNull { it.toLongOrNull() } + listOf(default) + db.getCategories().executeAsBlocking() + } + val sortFn: (LibraryItem, LibraryItem) -> Int = { i1, i2 -> when (sortingMode) { @@ -220,9 +228,35 @@ class LibraryPresenter( if (mangaCompare == 0) sortAlphabetical(i1, i2) else mangaCompare } LibrarySort.DRAG_AND_DROP -> { - 0 + if (i1.manga.category == i2.manga.category) { + val category = catListing.find { it.id == i1.manga.category } + when { + category?.mangaSort != null -> { + when (category.mangaSort) { + 'a' -> sortAlphabetical(i1, i2) + 'b' -> sortAlphabetical(i2, i1) + 'c' -> i2.manga.last_update.compareTo(i1.manga.last_update) + 'd' -> i1.manga.last_update.compareTo(i2.manga.last_update) + 'e' -> i2.manga.unread.compareTo(i1.manga.unread) + else -> sortAlphabetical(i1, i2) + } + } + category?.mangaOrder?.isEmpty() == false -> { + val order = category.mangaOrder + val index1 = order.indexOf(i1.manga.id!!) + val index2 = order.indexOf(i2.manga.id!!) + when { + index1 == -1 -> -1 + index2 == -1 -> 1 + else -> index1.compareTo(index2) + } + } + else -> 0 + } + } + else 0 } - else -> sortAlphabetical(i1, i2) + else -> 0 } } diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/reader/viewer/pager/PagerViewer.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/reader/viewer/pager/PagerViewer.kt index 1ce1b2f2c6..c2081f1e97 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/reader/viewer/pager/PagerViewer.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/reader/viewer/pager/PagerViewer.kt @@ -68,7 +68,7 @@ abstract class PagerViewer(val activity: ReaderActivity) : BaseViewer { pager.offscreenPageLimit = 1 pager.id = R.id.reader_pager pager.adapter = adapter - pager.addOnPageChangeListener(object : androidx.viewpager.widget.ViewPager.SimpleOnPageChangeListener() { + pager.addOnPageChangeListener(object : ViewPager.SimpleOnPageChangeListener() { override fun onPageSelected(position: Int) { val page = adapter.items.getOrNull(position) if (page != null && currentPage != page) { @@ -81,7 +81,7 @@ abstract class PagerViewer(val activity: ReaderActivity) : BaseViewer { } override fun onPageScrollStateChanged(state: Int) { - isIdle = state == androidx.viewpager.widget.ViewPager.SCROLL_STATE_IDLE + isIdle = state == ViewPager.SCROLL_STATE_IDLE } }) pager.tapListener = { event -> diff --git a/app/src/main/java/eu/kanade/tachiyomi/util/ChapterSourceSync.kt b/app/src/main/java/eu/kanade/tachiyomi/util/ChapterSourceSync.kt index 537d560c5c..6c1f5d5b07 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/util/ChapterSourceSync.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/util/ChapterSourceSync.kt @@ -134,8 +134,8 @@ fun syncChaptersWithSource(db: DatabaseHelper, db.fixChaptersSourceOrder(sourceChapters).executeAsBlocking() // Set this manga as updated since chapters were changed - val newestChaper = db.getChapters(manga).executeAsBlocking().maxBy { it.date_fetch } - val dateFetch = newestChaper?.date_fetch ?: manga.last_update + val newestChatper = db.getChapters(manga).executeAsBlocking().maxBy { it.date_upload } + val dateFetch = newestChatper?.date_upload ?: manga.last_update manga.last_update = dateFetch db.updateLastUpdated(manga).executeAsBlocking() } diff --git a/app/src/main/res/layout/library_controller.xml b/app/src/main/res/layout/library_controller.xml index a961400051..d01ff401f0 100644 --- a/app/src/main/res/layout/library_controller.xml +++ b/app/src/main/res/layout/library_controller.xml @@ -1,9 +1,7 @@ + android:layout_height="match_parent"> - - - - + + + + + + + + diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 7768cae3c4..b9725d41c8 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -117,6 +117,7 @@ Move to top Move to bottom Track + Sort category by… Deleting…