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.util.system.notificationManager
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.recycler
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.
swipe_refresh.isRefreshing = false
}
bottom_menu.setOnMenuItemClickListener { onActionItemClicked(actionMode!!, it) }
}
override fun onDestroyView(view: View) {
adapter = null
actionMode = null
bottom_menu.setOnMenuItemClickListener(null)
super.onDestroyView(view)
}
@ -171,7 +176,6 @@ class UpdatesController : NucleusController<UpdatesPresenter>(),
* @param chapters list of selected [UpdatesItem]s
*/
fun downloadChapters(chapters: List<UpdatesItem>) {
destroyActionModeIfNeeded()
presenter.downloadChapters(chapters)
}
@ -220,7 +224,6 @@ class UpdatesController : NucleusController<UpdatesPresenter>(),
}
override fun deleteChapters(chaptersToDelete: List<UpdatesItem>) {
destroyActionModeIfNeeded()
DeletingChaptersDialog().showDialog(router)
presenter.deleteChapters(chaptersToDelete)
}
@ -228,7 +231,7 @@ class UpdatesController : NucleusController<UpdatesPresenter>(),
/**
* Destory [ActionMode] if it's shown
*/
fun destroyActionModeIfNeeded() {
private fun destroyActionModeIfNeeded() {
actionMode?.finish()
}
@ -240,23 +243,6 @@ class UpdatesController : NucleusController<UpdatesPresenter>(),
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) {
val chapterClicked = adapter?.getItem(position) as? UpdatesItem ?: return
openManga(chapterClicked)
@ -296,8 +282,14 @@ class UpdatesController : NucleusController<UpdatesPresenter>(),
* @param menu menu object of ActionMode
*/
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
// 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
}
@ -309,11 +301,7 @@ class UpdatesController : NucleusController<UpdatesPresenter>(),
} else {
mode.title = count.toString()
val chapters = getSelectedChapters()
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 }
bottom_menu_bar.visibility = View.VISIBLE
}
return false
@ -326,6 +314,7 @@ class UpdatesController : NucleusController<UpdatesPresenter>(),
*/
override fun onActionItemClicked(mode: ActionMode, item: MenuItem): Boolean {
when (item.itemId) {
R.id.action_select_all -> selectAll()
R.id.action_download -> downloadChapters(getSelectedChapters())
R.id.action_delete -> ConfirmDeleteChaptersDialog(this, getSelectedChapters())
.showDialog(router)
@ -341,8 +330,15 @@ class UpdatesController : NucleusController<UpdatesPresenter>(),
* @param mode the ActionMode object
*/
override fun onDestroyActionMode(mode: ActionMode?) {
bottom_menu_bar.visibility = View.GONE
adapter?.mode = SelectableAdapter.Mode.IDLE
adapter?.clearSelection()
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"?>
<androidx.swiperefreshlayout.widget.SwipeRefreshLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:id="@+id/swipe_refresh"
android:layout_width="match_parent"
android:layout_height="match_parent">
@ -23,6 +24,24 @@
android:layout_gravity="center"
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>
</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:icon="@drawable/ic_file_download_white_24dp"
android:title="@string/action_download"
app:showAsAction="ifRoom" />
app:showAsAction="always" />
<item
android:id="@+id/action_delete"
android:icon="@drawable/ic_delete_white_24dp"
android:title="@string/action_delete"
app:showAsAction="ifRoom" />
app:showAsAction="always" />
<item
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"
app:showAsAction="ifRoom" />
app:showAsAction="always" />
<item
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"
app:showAsAction="ifRoom" />
app:showAsAction="always" />
</menu>