Can now filter unread manga + Code opt

This commit is contained in:
NoodleMage 2016-03-04 18:45:58 +01:00
parent d9f5a97d56
commit 8fbef4b4bb
5 changed files with 99 additions and 31 deletions

View file

@ -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)
}
} }

View file

@ -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.
* *

View file

@ -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()
} }

View file

@ -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>

View file

@ -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>