diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/recent/updates/UpdatesController.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/recent/updates/UpdatesController.kt index 9f92fa9aa..50f308f63 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/recent/updates/UpdatesController.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/recent/updates/UpdatesController.kt @@ -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() + } } diff --git a/app/src/main/res/layout/updates_controller.xml b/app/src/main/res/layout/updates_controller.xml index e9cb1dc2a..49acd01fc 100644 --- a/app/src/main/res/layout/updates_controller.xml +++ b/app/src/main/res/layout/updates_controller.xml @@ -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> diff --git a/app/src/main/res/menu/generic_selection.xml b/app/src/main/res/menu/generic_selection.xml new file mode 100644 index 000000000..a00db717a --- /dev/null +++ b/app/src/main/res/menu/generic_selection.xml @@ -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> diff --git a/app/src/main/res/menu/updates_chapter_selection.xml b/app/src/main/res/menu/updates_chapter_selection.xml index baf1399be..742bc39f1 100644 --- a/app/src/main/res/menu/updates_chapter_selection.xml +++ b/app/src/main/res/menu/updates_chapter_selection.xml @@ -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>