mirror of
				https://github.com/mihonapp/mihon.git
				synced 2025-10-31 14:27:57 +01:00 
			
		
		
		
	Bottom action menu for updates
This commit is contained in:
		| @@ -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() | ||||
|     } | ||||
| } | ||||
|   | ||||
| @@ -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> | ||||
|   | ||||
							
								
								
									
										11
									
								
								app/src/main/res/menu/generic_selection.xml
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										11
									
								
								app/src/main/res/menu/generic_selection.xml
									
									
									
									
									
										Normal 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> | ||||
| @@ -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> | ||||
|   | ||||
		Reference in New Issue
	
	Block a user