Bottom action menu for updates

This commit is contained in:
arkon 2020-03-08 12:16:17 -04:00
parent a4410f3a02
commit af05c34da3
4 changed files with 58 additions and 32 deletions

View file

@ -27,6 +27,8 @@ import eu.kanade.tachiyomi.ui.manga.MangaController
import eu.kanade.tachiyomi.ui.reader.ReaderActivity import eu.kanade.tachiyomi.ui.reader.ReaderActivity
import eu.kanade.tachiyomi.util.system.notificationManager import eu.kanade.tachiyomi.util.system.notificationManager
import eu.kanade.tachiyomi.util.system.toast import eu.kanade.tachiyomi.util.system.toast
import kotlinx.android.synthetic.main.updates_controller.bottom_menu
import kotlinx.android.synthetic.main.updates_controller.bottom_menu_bar
import kotlinx.android.synthetic.main.updates_controller.empty_view import kotlinx.android.synthetic.main.updates_controller.empty_view
import kotlinx.android.synthetic.main.updates_controller.recycler import kotlinx.android.synthetic.main.updates_controller.recycler
import kotlinx.android.synthetic.main.updates_controller.swipe_refresh import kotlinx.android.synthetic.main.updates_controller.swipe_refresh
@ -100,11 +102,14 @@ class UpdatesController : NucleusController<UpdatesPresenter>(),
// It can be a very long operation, so we disable swipe refresh and show a toast. // It can be a very long operation, so we disable swipe refresh and show a toast.
swipe_refresh.isRefreshing = false swipe_refresh.isRefreshing = false
} }
bottom_menu.setOnMenuItemClickListener { onActionItemClicked(actionMode!!, it) }
} }
override fun onDestroyView(view: View) { override fun onDestroyView(view: View) {
adapter = null adapter = null
actionMode = null actionMode = null
bottom_menu.setOnMenuItemClickListener(null)
super.onDestroyView(view) super.onDestroyView(view)
} }
@ -171,7 +176,6 @@ class UpdatesController : NucleusController<UpdatesPresenter>(),
* @param chapters list of selected [UpdatesItem]s * @param chapters list of selected [UpdatesItem]s
*/ */
fun downloadChapters(chapters: List<UpdatesItem>) { fun downloadChapters(chapters: List<UpdatesItem>) {
destroyActionModeIfNeeded()
presenter.downloadChapters(chapters) presenter.downloadChapters(chapters)
} }
@ -220,7 +224,6 @@ class UpdatesController : NucleusController<UpdatesPresenter>(),
} }
override fun deleteChapters(chaptersToDelete: List<UpdatesItem>) { override fun deleteChapters(chaptersToDelete: List<UpdatesItem>) {
destroyActionModeIfNeeded()
DeletingChaptersDialog().showDialog(router) DeletingChaptersDialog().showDialog(router)
presenter.deleteChapters(chaptersToDelete) presenter.deleteChapters(chaptersToDelete)
} }
@ -228,7 +231,7 @@ class UpdatesController : NucleusController<UpdatesPresenter>(),
/** /**
* Destory [ActionMode] if it's shown * Destory [ActionMode] if it's shown
*/ */
fun destroyActionModeIfNeeded() { private fun destroyActionModeIfNeeded() {
actionMode?.finish() actionMode?.finish()
} }
@ -240,23 +243,6 @@ class UpdatesController : NucleusController<UpdatesPresenter>(),
presenter.markChapterRead(chapters, false) presenter.markChapterRead(chapters, false)
} }
/**
* Start downloading chapter
* @param chapter selected chapter with manga
*/
fun downloadChapter(chapter: UpdatesItem) {
presenter.downloadChapters(listOf(chapter))
}
/**
* Start deleting chapter
* @param chapter selected chapter with manga
*/
fun deleteChapter(chapter: UpdatesItem) {
DeletingChaptersDialog().showDialog(router)
presenter.deleteChapters(listOf(chapter))
}
override fun onCoverClick(position: Int) { override fun onCoverClick(position: Int) {
val chapterClicked = adapter?.getItem(position) as? UpdatesItem ?: return val chapterClicked = adapter?.getItem(position) as? UpdatesItem ?: return
openManga(chapterClicked) openManga(chapterClicked)
@ -296,8 +282,14 @@ class UpdatesController : NucleusController<UpdatesPresenter>(),
* @param menu menu object of ActionMode * @param menu menu object of ActionMode
*/ */
override fun onCreateActionMode(mode: ActionMode, menu: Menu): Boolean { override fun onCreateActionMode(mode: ActionMode, menu: Menu): Boolean {
mode.menuInflater.inflate(R.menu.updates_chapter_selection, menu) mode.menuInflater.inflate(R.menu.generic_selection, menu)
adapter?.mode = SelectableAdapter.Mode.MULTI adapter?.mode = SelectableAdapter.Mode.MULTI
// Avoid reinflating the menu multiple times
if (bottom_menu.menu.size() == 0) {
mode.menuInflater.inflate(R.menu.updates_chapter_selection, bottom_menu.menu)
}
return true return true
} }
@ -309,11 +301,7 @@ class UpdatesController : NucleusController<UpdatesPresenter>(),
} else { } else {
mode.title = count.toString() mode.title = count.toString()
val chapters = getSelectedChapters() bottom_menu_bar.visibility = View.VISIBLE
menu.findItem(R.id.action_download).isVisible = chapters.any { !it.isDownloaded }
menu.findItem(R.id.action_delete).isVisible = chapters.any { it.isDownloaded }
menu.findItem(R.id.action_mark_as_read).isVisible = chapters.any { !it.chapter.read }
menu.findItem(R.id.action_mark_as_unread).isVisible = chapters.any { it.chapter.read }
} }
return false return false
@ -326,6 +314,7 @@ class UpdatesController : NucleusController<UpdatesPresenter>(),
*/ */
override fun onActionItemClicked(mode: ActionMode, item: MenuItem): Boolean { override fun onActionItemClicked(mode: ActionMode, item: MenuItem): Boolean {
when (item.itemId) { when (item.itemId) {
R.id.action_select_all -> selectAll()
R.id.action_download -> downloadChapters(getSelectedChapters()) R.id.action_download -> downloadChapters(getSelectedChapters())
R.id.action_delete -> ConfirmDeleteChaptersDialog(this, getSelectedChapters()) R.id.action_delete -> ConfirmDeleteChaptersDialog(this, getSelectedChapters())
.showDialog(router) .showDialog(router)
@ -341,8 +330,15 @@ class UpdatesController : NucleusController<UpdatesPresenter>(),
* @param mode the ActionMode object * @param mode the ActionMode object
*/ */
override fun onDestroyActionMode(mode: ActionMode?) { override fun onDestroyActionMode(mode: ActionMode?) {
bottom_menu_bar.visibility = View.GONE
adapter?.mode = SelectableAdapter.Mode.IDLE adapter?.mode = SelectableAdapter.Mode.IDLE
adapter?.clearSelection() adapter?.clearSelection()
actionMode = null actionMode = null
} }
private fun selectAll() {
val adapter = adapter ?: return
adapter.selectAll()
actionMode?.invalidate()
}
} }

View file

@ -1,6 +1,7 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<androidx.swiperefreshlayout.widget.SwipeRefreshLayout xmlns:android="http://schemas.android.com/apk/res/android" <androidx.swiperefreshlayout.widget.SwipeRefreshLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools" xmlns:tools="http://schemas.android.com/tools"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:id="@+id/swipe_refresh" android:id="@+id/swipe_refresh"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="match_parent"> android:layout_height="match_parent">
@ -23,6 +24,24 @@
android:layout_gravity="center" android:layout_gravity="center"
android:visibility="gone" /> android:visibility="gone" />
<androidx.appcompat.widget.Toolbar
android:id="@+id/bottom_menu_bar"
android:layout_width="match_parent"
android:layout_height="?attr/actionBarSize"
android:layout_gravity="bottom"
android:background="?attr/colorPrimary"
android:theme="?attr/actionBarTheme"
android:visibility="gone"
app:contentInsetStart="8dp"
app:contentInsetEnd="8dp">
<androidx.appcompat.widget.ActionMenuView
android:id="@+id/bottom_menu"
android:layout_width="match_parent"
android:layout_height="match_parent" />
</androidx.appcompat.widget.Toolbar>
</FrameLayout> </FrameLayout>
</androidx.swiperefreshlayout.widget.SwipeRefreshLayout> </androidx.swiperefreshlayout.widget.SwipeRefreshLayout>

View file

@ -0,0 +1,11 @@
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto">
<item
android:id="@+id/action_select_all"
android:icon="@drawable/ic_select_all_white_24dp"
android:title="@string/action_select_all"
app:showAsAction="ifRoom" />
</menu>

View file

@ -6,24 +6,24 @@
android:id="@+id/action_download" android:id="@+id/action_download"
android:icon="@drawable/ic_file_download_white_24dp" android:icon="@drawable/ic_file_download_white_24dp"
android:title="@string/action_download" android:title="@string/action_download"
app:showAsAction="ifRoom" /> app:showAsAction="always" />
<item <item
android:id="@+id/action_delete" android:id="@+id/action_delete"
android:icon="@drawable/ic_delete_white_24dp" android:icon="@drawable/ic_delete_white_24dp"
android:title="@string/action_delete" android:title="@string/action_delete"
app:showAsAction="ifRoom" /> app:showAsAction="always" />
<item <item
android:id="@+id/action_mark_as_read" android:id="@+id/action_mark_as_read"
android:icon="@drawable/ic_done_all_white_24dp" android:icon="@drawable/ic_done_all_grey_24dp"
android:title="@string/action_mark_as_read" android:title="@string/action_mark_as_read"
app:showAsAction="ifRoom" /> app:showAsAction="always" />
<item <item
android:id="@+id/action_mark_as_unread" android:id="@+id/action_mark_as_unread"
android:icon="@drawable/ic_done_all_grey_24dp" android:icon="@drawable/ic_done_all_white_24dp"
android:title="@string/action_mark_as_unread" android:title="@string/action_mark_as_unread"
app:showAsAction="ifRoom" /> app:showAsAction="always" />
</menu> </menu>