mirror of
https://github.com/aniyomiorg/aniyomi.git
synced 2024-11-27 08:16:36 +03:00
Can now filter unread manga + Code opt
This commit is contained in:
parent
d9f5a97d56
commit
8fbef4b4bb
5 changed files with 99 additions and 31 deletions
|
@ -186,4 +186,8 @@ class PreferencesHelper(private val context: Context) {
|
||||||
return rxPrefs.getBoolean(getKey(R.string.pref_filter_downloaded), false)
|
return rxPrefs.getBoolean(getKey(R.string.pref_filter_downloaded), false)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fun filterUnread(): Preference<Boolean> {
|
||||||
|
return rxPrefs.getBoolean(getKey(R.string.pref_filter_unread), false)
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -116,6 +116,7 @@ class LibraryFragment : BaseRxFragment<LibraryPresenter>(), ActionMode.Callback
|
||||||
super.onCreate(savedInstanceState)
|
super.onCreate(savedInstanceState)
|
||||||
setHasOptionsMenu(true)
|
setHasOptionsMenu(true)
|
||||||
isFilterDownloaded = presenter.preferences.filterDownloaded().get() as Boolean
|
isFilterDownloaded = presenter.preferences.filterDownloaded().get() as Boolean
|
||||||
|
isFilterUnread = presenter.preferences.filterUnread().get() as Boolean
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedState: Bundle?): View? {
|
override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedState: Bundle?): View? {
|
||||||
|
@ -194,23 +195,30 @@ class LibraryFragment : BaseRxFragment<LibraryPresenter>(), ActionMode.Callback
|
||||||
override fun onOptionsItemSelected(item: MenuItem): Boolean {
|
override fun onOptionsItemSelected(item: MenuItem): Boolean {
|
||||||
when (item.itemId) {
|
when (item.itemId) {
|
||||||
R.id.action_filter_unread -> {
|
R.id.action_filter_unread -> {
|
||||||
|
// Change unread filter status.
|
||||||
isFilterUnread = !isFilterUnread
|
isFilterUnread = !isFilterUnread
|
||||||
activity.supportInvalidateOptionsMenu();
|
// Update settings.
|
||||||
ToastUtil.showShort(context, "Filter Unread Clicked")
|
presenter.preferences.filterUnread().set(isFilterUnread)
|
||||||
|
// Apply filter.
|
||||||
|
onFilterCheckboxChanged()
|
||||||
}
|
}
|
||||||
R.id.action_filter_downloaded -> {
|
R.id.action_filter_downloaded -> {
|
||||||
|
// Change downloaded filter status.
|
||||||
isFilterDownloaded = !isFilterDownloaded
|
isFilterDownloaded = !isFilterDownloaded
|
||||||
|
// Update settings.
|
||||||
presenter.preferences.filterDownloaded().set(isFilterDownloaded)
|
presenter.preferences.filterDownloaded().set(isFilterDownloaded)
|
||||||
presenter.updateLibrary()
|
// Apply filter.
|
||||||
adapter.notifyDataSetChanged()
|
onFilterCheckboxChanged()
|
||||||
activity.supportInvalidateOptionsMenu();
|
|
||||||
ToastUtil.showShort(context, "Filter Download Clicked")
|
|
||||||
}
|
}
|
||||||
R.id.action_filter_empty -> {
|
R.id.action_filter_empty -> {
|
||||||
|
// Remove filter status.
|
||||||
isFilterUnread = false
|
isFilterUnread = false
|
||||||
isFilterDownloaded = false
|
isFilterDownloaded = false
|
||||||
activity.supportInvalidateOptionsMenu();
|
// Update settings.
|
||||||
ToastUtil.showShort(context, "Filter Clear Clicked")
|
presenter.preferences.filterUnread().set(isFilterUnread)
|
||||||
|
presenter.preferences.filterDownloaded().set(isFilterDownloaded)
|
||||||
|
// Apply filter
|
||||||
|
onFilterCheckboxChanged()
|
||||||
}
|
}
|
||||||
R.id.action_refresh -> LibraryUpdateService.start(activity)
|
R.id.action_refresh -> LibraryUpdateService.start(activity)
|
||||||
R.id.action_edit_categories -> {
|
R.id.action_edit_categories -> {
|
||||||
|
@ -223,6 +231,17 @@ class LibraryFragment : BaseRxFragment<LibraryPresenter>(), ActionMode.Callback
|
||||||
return true
|
return true
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Applies filter change
|
||||||
|
*/
|
||||||
|
private fun onFilterCheckboxChanged() {
|
||||||
|
presenter.updateLibrary()
|
||||||
|
adapter.notifyDataSetChanged()
|
||||||
|
adapter.refreshRegisteredAdapters()
|
||||||
|
activity.supportInvalidateOptionsMenu();
|
||||||
|
ToastUtil.showShort(context, getString(R.string.library_filter_change))
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Updates the query.
|
* Updates the query.
|
||||||
*
|
*
|
||||||
|
|
|
@ -37,8 +37,6 @@ class LibraryPresenter : BasePresenter<LibraryFragment>() {
|
||||||
*/
|
*/
|
||||||
lateinit var selectedMangas: MutableList<Manga>
|
lateinit var selectedMangas: MutableList<Manga>
|
||||||
|
|
||||||
lateinit var libraryFragment: LibraryFragment
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Search query of the library.
|
* Search query of the library.
|
||||||
*/
|
*/
|
||||||
|
@ -95,7 +93,6 @@ class LibraryPresenter : BasePresenter<LibraryFragment>() {
|
||||||
|
|
||||||
override fun onTakeView(libraryFragment: LibraryFragment) {
|
override fun onTakeView(libraryFragment: LibraryFragment) {
|
||||||
super.onTakeView(libraryFragment)
|
super.onTakeView(libraryFragment)
|
||||||
this.libraryFragment = libraryFragment
|
|
||||||
if (isUnsubscribed(GET_LIBRARY)) {
|
if (isUnsubscribed(GET_LIBRARY)) {
|
||||||
start(GET_LIBRARY)
|
start(GET_LIBRARY)
|
||||||
}
|
}
|
||||||
|
@ -112,6 +109,9 @@ class LibraryPresenter : BasePresenter<LibraryFragment>() {
|
||||||
.observeOn(AndroidSchedulers.mainThread())
|
.observeOn(AndroidSchedulers.mainThread())
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Update the library information
|
||||||
|
*/
|
||||||
fun updateLibrary() {
|
fun updateLibrary() {
|
||||||
start(GET_LIBRARY)
|
start(GET_LIBRARY)
|
||||||
}
|
}
|
||||||
|
@ -134,29 +134,72 @@ class LibraryPresenter : BasePresenter<LibraryFragment>() {
|
||||||
*/
|
*/
|
||||||
fun getLibraryMangasObservable(): Observable<Map<Int, List<Manga>>> {
|
fun getLibraryMangasObservable(): Observable<Map<Int, List<Manga>>> {
|
||||||
return db.libraryMangas.asRxObservable()
|
return db.libraryMangas.asRxObservable()
|
||||||
.flatMap { mangas -> Observable.from(mangas)
|
.flatMap { mangas ->
|
||||||
.filter {
|
Observable.from(mangas)
|
||||||
if (preferences.filterDownloaded().get() as Boolean) {
|
.filter {
|
||||||
val downloadManager = DownloadManager(context, sourceManager, preferences)
|
// Filter library by options
|
||||||
|
filterLibrary(it)
|
||||||
val chapters = getChapters(it)
|
}
|
||||||
|
.groupBy { it.category }
|
||||||
var hasDownloaded = false
|
.flatMap { group -> group.toList().map { Pair(group.key, it) } }
|
||||||
chapters?.forEach { chapter ->
|
.toMap({ it.first }, { it.second })
|
||||||
if (downloadManager.isChapterDownloaded(sourceManager.get(it.source), it, chapter)) {
|
|
||||||
hasDownloaded = true
|
|
||||||
}
|
|
||||||
}
|
|
||||||
hasDownloaded
|
|
||||||
} else
|
|
||||||
true
|
|
||||||
}
|
|
||||||
.groupBy { it.category }
|
|
||||||
.flatMap { group -> group.toList().map { Pair(group.key, it) } }
|
|
||||||
.toMap({ it.first }, { it.second })
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Filter library by preference
|
||||||
|
*
|
||||||
|
* @param manga from library
|
||||||
|
* @return filter status
|
||||||
|
*/
|
||||||
|
fun filterLibrary(manga: Manga): Boolean {
|
||||||
|
// Check if filter option is selected
|
||||||
|
if (preferences.filterDownloaded().get() as Boolean || preferences.filterUnread().get() as Boolean) {
|
||||||
|
|
||||||
|
// Does it have downloaded chapters.
|
||||||
|
var hasDownloaded = false
|
||||||
|
|
||||||
|
// Does it have unread chapters.
|
||||||
|
var hasUnread = false
|
||||||
|
|
||||||
|
// Get chapters from database.
|
||||||
|
val chapters = getChapters(manga)
|
||||||
|
|
||||||
|
if (preferences.filterDownloaded().get() as Boolean) {
|
||||||
|
// Get download manager.
|
||||||
|
val downloadManager = DownloadManager(context, sourceManager, preferences)
|
||||||
|
// Loop through chapters and check if library has downloaded manga
|
||||||
|
chapters?.forEach { chapter ->
|
||||||
|
if (downloadManager.isChapterDownloaded(sourceManager.get(manga.source), manga, chapter)) {
|
||||||
|
hasDownloaded = true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (preferences.filterUnread().get() as Boolean) {
|
||||||
|
// Loop through chapters and check if library has unread manga
|
||||||
|
chapters?.forEach { chapter ->
|
||||||
|
if (!chapter.read) {
|
||||||
|
hasUnread = true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Return correct filter status
|
||||||
|
if (preferences.filterDownloaded().get() as Boolean && preferences.filterUnread().get() as Boolean) {
|
||||||
|
return (hasDownloaded && hasUnread)
|
||||||
|
} else {
|
||||||
|
return (hasDownloaded || hasUnread)
|
||||||
|
}
|
||||||
|
} else
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns list of chapters belonging to manga
|
||||||
|
*
|
||||||
|
* @param manga manga from library
|
||||||
|
* @return list of chapters belonging to manga
|
||||||
|
*/
|
||||||
fun getChapters(manga: Manga): MutableList<Chapter>? {
|
fun getChapters(manga: Manga): MutableList<Chapter>? {
|
||||||
return db.getChapters(manga).executeAsBlocking()
|
return db.getChapters(manga).executeAsBlocking()
|
||||||
}
|
}
|
||||||
|
|
|
@ -29,6 +29,7 @@
|
||||||
<string name="pref_image_decoder_key">pref_image_decoder_key</string>
|
<string name="pref_image_decoder_key">pref_image_decoder_key</string>
|
||||||
<string name="pref_seamless_mode_key">pref_seamless_mode_key</string>
|
<string name="pref_seamless_mode_key">pref_seamless_mode_key</string>
|
||||||
<string name="pref_filter_downloaded">pref_filter_downloaded</string>
|
<string name="pref_filter_downloaded">pref_filter_downloaded</string>
|
||||||
|
<string name="pref_filter_unread">pref_filter_unread</string>
|
||||||
|
|
||||||
<string name="pref_download_directory_key">pref_download_directory_key</string>
|
<string name="pref_download_directory_key">pref_download_directory_key</string>
|
||||||
<string name="pref_download_slots_key">pref_download_slots_key</string>
|
<string name="pref_download_slots_key">pref_download_slots_key</string>
|
||||||
|
|
|
@ -162,6 +162,7 @@
|
||||||
<!-- Library fragment -->
|
<!-- Library fragment -->
|
||||||
<string name="library_search_hint">Title or author…</string>
|
<string name="library_search_hint">Title or author…</string>
|
||||||
<string name="library_selection_title">Selected</string>
|
<string name="library_selection_title">Selected</string>
|
||||||
|
<string name="library_filter_change">Filtering…</string>
|
||||||
|
|
||||||
<!-- Catalogue fragment -->
|
<!-- Catalogue fragment -->
|
||||||
<string name="source_requires_login">This source requires you to log in</string>
|
<string name="source_requires_login">This source requires you to log in</string>
|
||||||
|
|
Loading…
Reference in a new issue