diff --git a/app/src/main/java/eu/kanade/tachiyomi/data/database/queries/HistoryQueries.kt b/app/src/main/java/eu/kanade/tachiyomi/data/database/queries/HistoryQueries.kt index 853a2cd476..bb361af48c 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/data/database/queries/HistoryQueries.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/data/database/queries/HistoryQueries.kt @@ -23,10 +23,10 @@ interface HistoryQueries : DbProvider { * @param date recent date range * @offset offset the db by */ - fun getRecentManga(date: Date, offset: Int = 0) = db.get() + fun getRecentManga(date: Date, offset: Int = 0, search: String = "") = db.get() .listOfObjects(MangaChapterHistory::class.java) .withQuery(RawQuery.builder() - .query(getRecentMangasQuery(offset)) + .query(getRecentMangasQuery(offset, search)) .args(date.time) .observesTables(HistoryTable.TABLE) .build()) @@ -38,10 +38,10 @@ interface HistoryQueries : DbProvider { * @param date recent date range * @offset offset the db by */ - fun getRecentMangaLimit(date: Date, limit: Int = 0) = db.get() + fun getRecentMangaLimit(date: Date, limit: Int = 0, search: String = "") = db.get() .listOfObjects(MangaChapterHistory::class.java) .withQuery(RawQuery.builder() - .query(getRecentMangasLimitQuery(limit)) + .query(getRecentMangasLimitQuery(limit, search)) .args(date.time) .observesTables(HistoryTable.TABLE) .build()) diff --git a/app/src/main/java/eu/kanade/tachiyomi/data/database/queries/RawQueries.kt b/app/src/main/java/eu/kanade/tachiyomi/data/database/queries/RawQueries.kt index 468e5026ba..1c532948f3 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/data/database/queries/RawQueries.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/data/database/queries/RawQueries.kt @@ -47,7 +47,7 @@ fun getRecentsQuery() = """ * and are read after the given time period * @return return limit is 25 */ -fun getRecentMangasQuery(offset: Int = 0) = """ +fun getRecentMangasQuery(offset: Int = 0, search: String = "") = """ SELECT ${Manga.TABLE}.${Manga.COL_URL} as mangaUrl, ${Manga.TABLE}.*, ${Chapter.TABLE}.*, ${History.TABLE}.* FROM ${Manga.TABLE} JOIN ${Chapter.TABLE} @@ -60,7 +60,9 @@ fun getRecentMangasQuery(offset: Int = 0) = """ ON ${Chapter.TABLE}.${Chapter.COL_ID} = ${History.TABLE}.${History.COL_CHAPTER_ID} GROUP BY ${Chapter.TABLE}.${Chapter.COL_MANGA_ID}) AS max_last_read ON ${Chapter.TABLE}.${Chapter.COL_MANGA_ID} = max_last_read.${Chapter.COL_MANGA_ID} - WHERE ${History.TABLE}.${History.COL_LAST_READ} > ? AND max_last_read.${History.COL_CHAPTER_ID} = ${History.TABLE}.${History.COL_CHAPTER_ID} + WHERE ${History.TABLE}.${History.COL_LAST_READ} > ? + AND max_last_read.${History.COL_CHAPTER_ID} = ${History.TABLE}.${History.COL_CHAPTER_ID} + AND lower(${Manga.TABLE}.${Manga.COL_TITLE}) LIKE '%${search}%' ORDER BY max_last_read.${History.COL_LAST_READ} DESC LIMIT 25 OFFSET $offset """ @@ -71,7 +73,7 @@ fun getRecentMangasQuery(offset: Int = 0) = """ * The select statement returns all information of chapters that have the same id as the chapter in max_last_read * and are read after the given time period */ -fun getRecentMangasLimitQuery(limit: Int = 25) = """ +fun getRecentMangasLimitQuery(limit: Int = 25, search: String = "") = """ SELECT ${Manga.TABLE}.${Manga.COL_URL} as mangaUrl, ${Manga.TABLE}.*, ${Chapter.TABLE}.*, ${History.TABLE}.* FROM ${Manga.TABLE} JOIN ${Chapter.TABLE} @@ -84,7 +86,9 @@ fun getRecentMangasLimitQuery(limit: Int = 25) = """ ON ${Chapter.TABLE}.${Chapter.COL_ID} = ${History.TABLE}.${History.COL_CHAPTER_ID} GROUP BY ${Chapter.TABLE}.${Chapter.COL_MANGA_ID}) AS max_last_read ON ${Chapter.TABLE}.${Chapter.COL_MANGA_ID} = max_last_read.${Chapter.COL_MANGA_ID} - WHERE ${History.TABLE}.${History.COL_LAST_READ} > ? AND max_last_read.${History.COL_CHAPTER_ID} = ${History.TABLE}.${History.COL_CHAPTER_ID} + WHERE ${History.TABLE}.${History.COL_LAST_READ} > ? + AND max_last_read.${History.COL_CHAPTER_ID} = ${History.TABLE}.${History.COL_CHAPTER_ID} + AND lower(${Manga.TABLE}.${Manga.COL_TITLE}) LIKE '%${search}%' ORDER BY max_last_read.${History.COL_LAST_READ} DESC LIMIT $limit """ diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/recently_read/RecentlyReadController.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/recently_read/RecentlyReadController.kt index 8a39aad3e0..f6b6832a5d 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/recently_read/RecentlyReadController.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/recently_read/RecentlyReadController.kt @@ -4,6 +4,11 @@ import androidx.recyclerview.widget.LinearLayoutManager import android.view.LayoutInflater import android.view.View import android.view.ViewGroup +import android.view.Menu +import android.view.MenuInflater +import android.view.MenuItem +import androidx.appcompat.widget.SearchView +import com.jakewharton.rxbinding.support.v7.widget.queryTextChanges import eu.davidea.flexibleadapter.FlexibleAdapter import eu.kanade.tachiyomi.R import eu.kanade.tachiyomi.data.backup.BackupRestoreService @@ -31,6 +36,9 @@ class RecentlyReadController : NucleusController(), RecentlyReadAdapter.OnCoverClickListener, RemoveHistoryDialog.Listener { + init { + setHasOptionsMenu(true) + } /** * Adapter containing the recent manga. */ @@ -41,6 +49,7 @@ class RecentlyReadController : NucleusController(), * Endless loading item. */ private var progressItem: ProgressItem? = null + private var query = "" override fun getTitle(): String? { return resources?.getString(R.string.label_recent_manga) @@ -116,7 +125,7 @@ class RecentlyReadController : NucleusController(), return } val adapter = adapter ?: return - presenter.requestNext(adapter.itemCount) + presenter.requestNext(adapter.itemCount, query) } override fun noMoreLoad(newItemsSize: Int) { } @@ -154,5 +163,32 @@ class RecentlyReadController : NucleusController(), presenter.removeFromHistory(history) } } + override fun onCreateOptionsMenu(menu: Menu, inflater: MenuInflater) { + inflater.inflate(R.menu.recently_read, menu) + val searchItem = menu.findItem(R.id.action_search) + val searchView = searchItem.actionView as SearchView + searchView.maxWidth = Int.MAX_VALUE + if (query.isNotEmpty()) { + searchItem.expandActionView() + searchView.setQuery(query, true) + searchView.clearFocus() + } + searchView.queryTextChanges().filter { router.backstack.lastOrNull()?.controller() == this } + .subscribeUntilDestroy { + query = it.toString() + presenter.updateList(query) + } + // Fixes problem with the overflow icon showing up in lieu of search + searchItem.setOnActionExpandListener(object : MenuItem.OnActionExpandListener { + override fun onMenuItemActionExpand(item: MenuItem): Boolean { + return true + } + + override fun onMenuItemActionCollapse(item: MenuItem): Boolean { + activity?.invalidateOptionsMenu() + return true + } + }) + } } diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/recently_read/RecentlyReadPresenter.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/recently_read/RecentlyReadPresenter.kt index e18149268c..078c039759 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/recently_read/RecentlyReadPresenter.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/recently_read/RecentlyReadPresenter.kt @@ -27,6 +27,7 @@ class RecentlyReadPresenter : BasePresenter() { */ val db: DatabaseHelper by injectLazy() var lastCount = 25 + var lastSearch = "" override fun onCreate(savedState: Bundle?) { super.onCreate(savedState) @@ -36,9 +37,10 @@ class RecentlyReadPresenter : BasePresenter() { updateList() } - fun requestNext(offset: Int) { + fun requestNext(offset: Int, search: String = "") { lastCount = offset - getRecentMangaObservable((offset)) + lastSearch = search + getRecentMangaObservable((offset), search) .subscribeLatestCache({ view, mangas -> view.onNextManga(mangas) }, RecentlyReadController::onAddPageError) @@ -48,28 +50,28 @@ class RecentlyReadPresenter : BasePresenter() { * Get recent manga observable * @return list of history */ - private fun getRecentMangaObservable(offset: Int = 0): Observable> { + private fun getRecentMangaObservable(offset: Int = 0, search: String = ""): Observable> { // Set date for recent manga val cal = Calendar.getInstance() cal.time = Date() cal.add(Calendar.YEAR, -50) - return db.getRecentManga(cal.time, offset).asRxObservable() - .map { recents -> recents.map(::RecentlyReadItem) } - .observeOn(AndroidSchedulers.mainThread()) + return db.getRecentManga(cal.time, offset, search).asRxObservable() + .map { recents -> recents.map(::RecentlyReadItem) } + .observeOn(AndroidSchedulers.mainThread()) } /** * Get recent manga observable * @return list of history */ - private fun getRecentMangaLimitObservable(offset: Int = 0): Observable> { + private fun getRecentMangaLimitObservable(offset: Int = 0, search: String = ""): Observable> { // Set date for recent manga val cal = Calendar.getInstance() cal.time = Date() cal.add(Calendar.YEAR, -50) - return db.getRecentMangaLimit(cal.time, lastCount).asRxObservable() + return db.getRecentMangaLimit(cal.time, lastCount, search).asRxObservable() .map { recents -> recents.map(::RecentlyReadItem) } .observeOn(AndroidSchedulers.mainThread()) } @@ -84,9 +86,9 @@ class RecentlyReadPresenter : BasePresenter() { updateList() } - - fun updateList() { - getRecentMangaLimitObservable(lastCount).take(1) + fun updateList(search: String? = null) { + lastSearch = search?:lastSearch + getRecentMangaLimitObservable(lastCount, lastSearch).take(1) .subscribeLatestCache({ view, mangas -> view.onNextManga(mangas, true) }, RecentlyReadController::onAddPageError) diff --git a/app/src/main/res/menu/recently_read.xml b/app/src/main/res/menu/recently_read.xml new file mode 100644 index 0000000000..d8c2330fd6 --- /dev/null +++ b/app/src/main/res/menu/recently_read.xml @@ -0,0 +1,10 @@ + + + + + \ No newline at end of file