From b331e12fde25f01d179e6bd85c0e401522c609e5 Mon Sep 17 00:00:00 2001 From: Jay Date: Sun, 22 Mar 2020 04:10:27 -0400 Subject: [PATCH] Made chapters swipeable to change read/bookmark status --- .../tachiyomi/data/download/model/Download.kt | 2 +- .../tachiyomi/ui/download/DownloadButton.kt | 14 ++ .../tachiyomi/ui/library/LibraryController.kt | 2 +- .../kanade/tachiyomi/ui/main/MainActivity.kt | 15 -- .../ui/manga/MangaDetailsController.kt | 89 ++++++++++-- .../tachiyomi/ui/manga/MangaHeaderItem.kt | 4 + .../tachiyomi/ui/manga/chapter/ChapterItem.kt | 4 + .../ui/manga/chapter/ChapterMatHolder.kt | 83 +++++++++-- .../ui/manga/chapter/ChaptersAdapter.kt | 21 ++- .../tachiyomi/ui/manga/track/TrackHolder.kt | 2 + .../ui/setting/SettingsMainController.kt | 2 +- .../tachiyomi/util/view/ViewExtensions.kt | 14 +- app/src/main/res/drawable/eye.xml | 8 ++ app/src/main/res/drawable/eye_off.xml | 8 ++ ...r_mode_black_24dp.xml => ic_read_24dp.xml} | 0 app/src/main/res/drawable/star.xml | 8 ++ app/src/main/res/drawable/star_off.xml | 8 ++ app/src/main/res/layout/chapters_mat_item.xml | 133 +++++++++++++----- app/src/main/res/menu/manga_details.xml | 15 +- app/src/main/res/values-night/themes.xml | 3 + app/src/main/res/values-pl/strings.xml | 2 +- app/src/main/res/values-ru/strings.xml | 2 +- app/src/main/res/values/strings.xml | 3 +- 23 files changed, 352 insertions(+), 90 deletions(-) create mode 100644 app/src/main/res/drawable/eye.xml create mode 100644 app/src/main/res/drawable/eye_off.xml rename app/src/main/res/drawable/{ic_chrome_reader_mode_black_24dp.xml => ic_read_24dp.xml} (100%) create mode 100644 app/src/main/res/drawable/star.xml create mode 100644 app/src/main/res/drawable/star_off.xml diff --git a/app/src/main/java/eu/kanade/tachiyomi/data/download/model/Download.kt b/app/src/main/java/eu/kanade/tachiyomi/data/download/model/Download.kt index 8ef7af7ee5..968c3d6e10 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/data/download/model/Download.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/data/download/model/Download.kt @@ -40,7 +40,7 @@ class Download(val source: HttpSource, val manga: Manga, val chapter: Chapter) { } companion object { - + const val CHECKED = -1 const val NOT_DOWNLOADED = 0 const val QUEUE = 1 const val DOWNLOADING = 2 diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/download/DownloadButton.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/download/DownloadButton.kt index 1ff691b163..40458b5025 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/download/DownloadButton.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/download/DownloadButton.kt @@ -29,6 +29,10 @@ class DownloadButton @JvmOverloads constructor(context: Context, attrs: Attribut R.drawable.filled_circle)?.mutate() private val borderCircle = ContextCompat.getDrawable(context, R.drawable.border_circle)?.mutate() + private val downloadDrawable = ContextCompat.getDrawable(context, + R.drawable.ic_arrow_down_white_24dp)?.mutate() + private val checkDrawable = ContextCompat.getDrawable(context, + R.drawable.ic_check_white_24dp)?.mutate() private var isAnimating = false private var iconAnimation: ObjectAnimator? = null @@ -38,7 +42,17 @@ class DownloadButton @JvmOverloads constructor(context: Context, attrs: Attribut download_icon.alpha = 1f isAnimating = false } + download_icon.setImageDrawable(if (state == Download.CHECKED) + checkDrawable else downloadDrawable) when (state) { + Download.CHECKED -> { + download_progress.gone() + download_border.visible() + download_progress_indeterminate.gone() + download_border.setImageDrawable(filledCircle) + download_border.drawable.setTint(activeColor) + download_icon.drawable.setTint(Color.WHITE) + } Download.NOT_DOWNLOADED -> { download_border.visible() download_progress.gone() diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/library/LibraryController.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/library/LibraryController.kt index ce1e77b23d..eb5679e20e 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/library/LibraryController.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/library/LibraryController.kt @@ -441,7 +441,7 @@ open class LibraryController( val searchItem = menu.findItem(R.id.action_search) val searchView = searchItem.actionView as SearchView - searchView.queryHint = resources?.getString(R.string.search_hint) + searchView.queryHint = resources?.getString(R.string.library_search_hint) searchItem.collapseActionView() if (query.isNotEmpty()) { diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/main/MainActivity.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/main/MainActivity.kt index 45ba03dc1e..67bb6a83ef 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/main/MainActivity.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/main/MainActivity.kt @@ -59,10 +59,8 @@ import eu.kanade.tachiyomi.ui.setting.SettingsController import eu.kanade.tachiyomi.ui.setting.SettingsMainController import eu.kanade.tachiyomi.util.system.getResourceColor import eu.kanade.tachiyomi.util.system.launchUI -import eu.kanade.tachiyomi.util.view.gone import eu.kanade.tachiyomi.util.view.updateLayoutParams import eu.kanade.tachiyomi.util.view.updatePadding -import eu.kanade.tachiyomi.util.view.visible import java.util.Date import java.util.concurrent.TimeUnit import kotlin.math.abs @@ -197,19 +195,6 @@ open class MainActivity : BaseActivity(), DownloadServiceListener { container.systemUiVisibility = View.SYSTEM_UI_FLAG_LAYOUT_STABLE or View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN or View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION updateRecentsIcon() - content.viewTreeObserver.addOnGlobalLayoutListener { - val heightDiff: Int = content.rootView.height - content.height - if (heightDiff > 200 && window.attributes.softInputMode == WindowManager.LayoutParams.SOFT_INPUT_ADJUST_RESIZE) { - // keyboard is open, hide layout - bottom_nav.gone() - } else if (bottom_nav.visibility == View.GONE && window.attributes.softInputMode == WindowManager.LayoutParams.SOFT_INPUT_ADJUST_RESIZE) { - // keyboard is hidden, show layout - // use coroutine to delay so the bottom bar doesn't flash on top of the keyboard - launchUI { - bottom_nav.visible() - } - } - } supportActionBar?.setDisplayShowCustomEnabled(true) diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/manga/MangaDetailsController.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/manga/MangaDetailsController.kt index b368935837..cc8bf3cbfc 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/manga/MangaDetailsController.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/manga/MangaDetailsController.kt @@ -19,7 +19,6 @@ import android.graphics.drawable.BitmapDrawable import android.graphics.drawable.Drawable import android.os.Build import android.os.Bundle -import android.view.Gravity import android.view.LayoutInflater import android.view.Menu import android.view.MenuInflater @@ -31,12 +30,14 @@ import android.view.inputmethod.InputMethodManager import androidx.appcompat.app.AppCompatActivity import androidx.appcompat.view.ActionMode import androidx.appcompat.widget.PopupMenu +import androidx.appcompat.widget.SearchView import androidx.core.content.pm.ShortcutInfoCompat import androidx.core.content.pm.ShortcutManagerCompat import androidx.core.graphics.ColorUtils import androidx.core.graphics.drawable.IconCompat import androidx.palette.graphics.Palette import androidx.recyclerview.widget.DividerItemDecoration +import androidx.recyclerview.widget.ItemTouchHelper import androidx.recyclerview.widget.LinearLayoutManager import androidx.recyclerview.widget.RecyclerView import androidx.transition.ChangeBounds @@ -95,6 +96,7 @@ import eu.kanade.tachiyomi.util.system.launchUI import eu.kanade.tachiyomi.util.system.toast import eu.kanade.tachiyomi.util.view.doOnApplyWindowInsets import eu.kanade.tachiyomi.util.view.getText +import eu.kanade.tachiyomi.util.view.setOnQueryTextChangeListener import eu.kanade.tachiyomi.util.view.snack import eu.kanade.tachiyomi.util.view.updateLayoutParams import eu.kanade.tachiyomi.util.view.updatePaddingRelative @@ -114,6 +116,7 @@ class MangaDetailsController : BaseController, FlexibleAdapter.OnItemLongClickListener, ActionMode.Callback, ChaptersAdapter.MangaHeaderInterface, + FlexibleAdapter.OnItemMoveListener, ChangeMangaCategoriesDialog.Listener { constructor( @@ -159,6 +162,11 @@ class MangaDetailsController : BaseController, private var editMangaDialog: EditMangaDialog? = null var refreshTracker: Int? = null + /** + * Library search query. + */ + private var query = "" + /** * Adapter containing a list of chapters. */ @@ -190,6 +198,7 @@ class MangaDetailsController : BaseController, adapter = ChaptersAdapter(this, view.context) recycler.adapter = adapter + adapter?.isSwipeEnabled = true recycler.layoutManager = LinearLayoutManager(view.context) recycler.addItemDecoration( DividerItemDecoration( @@ -369,6 +378,13 @@ class MangaDetailsController : BaseController, presenter.preferences.theme() ) ) { + if (forThis) + (activity as MainActivity).appbar.context.setTheme(R.style + .ThemeOverlay_AppCompat_DayNight_ActionBar) + else + (activity as MainActivity).appbar.context.setTheme(R.style + .Theme_ActionBar_Dark_DayNight) + val iconPrimary = view?.context?.getResourceColor( if (forThis) android.R.attr.textColorPrimary else R.attr.actionBarTintColor @@ -418,6 +434,8 @@ class MangaDetailsController : BaseController, adapter?.addSelection(position) (recycler.findViewHolderForAdapterPosition(position) as? BaseFlexibleViewHolder) ?.toggleActivation() + (recycler.findViewHolderForAdapterPosition(position) as? ChapterMatHolder) + ?.notifyStatus(Download.CHECKED, false, 0) startingDLChapterPos = position actionMode?.invalidate() } else { @@ -446,24 +464,24 @@ class MangaDetailsController : BaseController, val adapter = adapter ?: return val item = (adapter.getItem(position) as? ChapterItem) ?: return val itemView = getHolder(item)?.itemView ?: return - val popup = PopupMenu(itemView.context, itemView, Gravity.END) + val popup = PopupMenu(itemView.context, itemView) // Inflate our menu resource into the PopupMenu's Menu popup.menuInflater.inflate(R.menu.chapters_mat_single, popup.menu) // Hide bookmark if bookmark - popup.menu.findItem(R.id.action_bookmark).isVisible = !item.bookmark - popup.menu.findItem(R.id.action_remove_bookmark).isVisible = item.bookmark + popup.menu.findItem(R.id.action_bookmark).isVisible = false // !item.bookmark + popup.menu.findItem(R.id.action_remove_bookmark).isVisible = false // item.bookmark // Hide mark as unread when the chapter is unread - if (!item.read && item.last_page_read == 0) { +// if (!item.read && item.last_page_read == 0) { popup.menu.findItem(R.id.action_mark_as_unread).isVisible = false - } +// } // Hide mark as read when the chapter is read - if (item.read) { +// if (item.read) { popup.menu.findItem(R.id.action_mark_as_read).isVisible = false - } +// } // Set a listener so we are notified if a menu item is clicked popup.setOnMenuItemClickListener { menuItem -> @@ -491,19 +509,30 @@ class MangaDetailsController : BaseController, } } + fun bookmarkChapter(position: Int) { + val item = adapter?.getItem(position) as? ChapterItem ?: return + bookmarkChapters(listOf(item), !item.bookmark) + } + + fun toggleReadChapter(position: Int) { + val item = adapter?.getItem(position) as? ChapterItem ?: return + if (!item.read) markAsRead(listOf(item), false) + else markAsUnread(listOf(item), false) + } + private fun bookmarkChapters(chapters: List, bookmarked: Boolean) { presenter.bookmarkChapters(chapters, bookmarked) } - private fun markAsRead(chapters: List) { - presenter.markChaptersRead(chapters, true) + private fun markAsRead(chapters: List, refresh: Boolean = true) { + presenter.markChaptersRead(chapters, read = true) if (presenter.preferences.removeAfterMarkedAsRead()) { presenter.deleteChapters(chapters) } } - private fun markAsUnread(chapters: List) { - presenter.markChaptersRead(chapters, false) + private fun markAsUnread(chapters: List, refresh: Boolean = true) { + presenter.markChaptersRead(chapters, read = false) } private fun openChapter(chapter: Chapter) { @@ -535,6 +564,25 @@ class MangaDetailsController : BaseController, ?: Color.BLACK menu.findItem(R.id.action_download).icon?.mutate()?.setTint(iconPrimary) editItem.icon?.mutate()?.setTint(iconPrimary) + + val searchItem = menu.findItem(R.id.action_search) + val searchView = searchItem.actionView as SearchView + searchView.queryHint = resources?.getString(R.string.chapter_search_hint) + searchItem.icon?.mutate()?.setTint(iconPrimary) + searchItem.collapseActionView() + if (query.isNotEmpty()) { + searchItem.expandActionView() + searchView.setQuery(query, true) + searchView.clearFocus() + } + + setOnQueryTextChangeListener(searchView) { + query = it ?: "" + adapter?.setFilter(query) + adapter?.performFilter() + true + } + searchItem.fixExpand(onExpand = { invalidateMenuOnExpand() }) } override fun onOptionsItemSelected(item: MenuItem): Boolean { @@ -1033,6 +1081,12 @@ class MangaDetailsController : BaseController, override fun onDestroyActionMode(mode: ActionMode?) { actionMode = null setStatusBarAndToolbar() + if (startingDLChapterPos != null) { + val item = adapter?.getItem(startingDLChapterPos!!) as? ChapterItem + (recycler.findViewHolderForAdapterPosition(startingDLChapterPos!!) as? ChapterMatHolder)?.notifyStatus( + item?.status ?: Download.NOT_DOWNLOADED, false, 0 + ) + } startingDLChapterPos = null adapter?.mode = SelectableAdapter.Mode.IDLE adapter?.clearSelection() @@ -1096,6 +1150,17 @@ class MangaDetailsController : BaseController, } } + override fun onActionStateChanged(viewHolder: RecyclerView.ViewHolder?, actionState: Int) { + swipe_refresh.isEnabled = actionState != ItemTouchHelper.ACTION_STATE_SWIPE + } + + override fun onItemMove(fromPosition: Int, toPosition: Int) { + } + + override fun shouldMoveItem(fromPosition: Int, toPosition: Int): Boolean { + return true + } + override fun zoomImageFromThumb(thumbView: View) { // If there's an animation in progress, cancel it immediately and proceed with this one. currentAnimator?.cancel() diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/manga/MangaHeaderItem.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/manga/MangaHeaderItem.kt index 083c5b51ce..de5aac94c5 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/manga/MangaHeaderItem.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/manga/MangaHeaderItem.kt @@ -22,6 +22,10 @@ class MangaHeaderItem(val manga: Manga, private val startExpanded: Boolean) : return false } + override fun isSwipeable(): Boolean { + return false + } + override fun createViewHolder(view: View, adapter: FlexibleAdapter>): MangaHeaderHolder { return MangaHeaderHolder(view, adapter as ChaptersAdapter, startExpanded) } diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/manga/chapter/ChapterItem.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/manga/chapter/ChapterItem.kt index 863b4be078..9afb400d12 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/manga/chapter/ChapterItem.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/manga/chapter/ChapterItem.kt @@ -41,6 +41,10 @@ class ChapterItem(val chapter: Chapter, val manga: Manga) : return true } + override fun isSwipeable(): Boolean { + return !isLocked + } + override fun createViewHolder(view: View, adapter: FlexibleAdapter>): ChapterMatHolder { return ChapterMatHolder(view, adapter as ChaptersAdapter) } diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/manga/chapter/ChapterMatHolder.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/manga/chapter/ChapterMatHolder.kt index d32c2f301d..7cab25e2af 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/manga/chapter/ChapterMatHolder.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/manga/chapter/ChapterMatHolder.kt @@ -1,8 +1,10 @@ package eu.kanade.tachiyomi.ui.manga.chapter +import android.animation.Animator import android.text.format.DateUtils import android.view.View import androidx.appcompat.widget.PopupMenu +import androidx.core.content.ContextCompat import eu.kanade.tachiyomi.R import eu.kanade.tachiyomi.data.database.models.Manga import eu.kanade.tachiyomi.data.download.model.Download @@ -10,9 +12,9 @@ import eu.kanade.tachiyomi.source.LocalSource import eu.kanade.tachiyomi.ui.base.holder.BaseFlexibleViewHolder import eu.kanade.tachiyomi.util.view.gone import eu.kanade.tachiyomi.util.view.visibleIf -import java.util.Date import kotlinx.android.synthetic.main.chapters_mat_item.* import kotlinx.android.synthetic.main.download_button.* +import java.util.Date class ChapterMatHolder( private val view: View, @@ -74,32 +76,93 @@ class ChapterMatHolder( if (isLocked) download_button.gone() // Set correct text color - chapter_title.setTextColor(if (chapter.read && !isLocked) - adapter.readColor else adapter.unreadColor) + chapter_title.setTextColor( + if (chapter.read && !isLocked) adapter.readColor else adapter.unreadColor + ) if (chapter.bookmark && !isLocked) chapter_title.setTextColor(adapter.bookmarkedColor) val statuses = mutableListOf() if (chapter.date_upload > 0) { - statuses.add(DateUtils.getRelativeTimeSpanString(chapter.date_upload, - Date().time, DateUtils.HOUR_IN_MILLIS).toString()) + statuses.add( + DateUtils.getRelativeTimeSpanString( + chapter.date_upload, Date().time, DateUtils.HOUR_IN_MILLIS + ).toString() + ) } if (!chapter.read && chapter.last_page_read > 0 && chapter.pages_left > 0 && !isLocked) { - statuses.add(itemView.resources.getQuantityString(R.plurals.pages_left, chapter - .pages_left, chapter.pages_left)) + statuses.add( + itemView.resources.getQuantityString( + R.plurals.pages_left, chapter.pages_left, chapter.pages_left + ) + ) } else if (!chapter.read && chapter.last_page_read > 0 && !isLocked) { - statuses.add(itemView.context.getString(R.string.chapter_progress, chapter - .last_page_read + 1)) + statuses.add( + itemView.context.getString( + R.string.chapter_progress, chapter.last_page_read + 1 + ) + ) } if (!chapter.scanlator.isNullOrBlank()) { statuses.add(chapter.scanlator!!) } + read.setImageDrawable( + ContextCompat.getDrawable( + read.context, if (item.read) R.drawable.eye_off + else R.drawable.eye + ) + ) + bookmark.setImageDrawable( + ContextCompat.getDrawable( + read.context, if (item.bookmark) R.drawable.star_off + else R.drawable.star + ) + ) + chapter_scanlator.setTextColor(if (chapter.read) adapter.readColor else adapter.unreadColor) chapter_scanlator.text = statuses.joinToString(" • ") - notifyStatus(item.status, item.isLocked, item.progress) + notifyStatus( + if (adapter.isSelected(adapterPosition)) Download.CHECKED else item.status, + item.isLocked, + item.progress + ) + resetFrontView() + } + + override fun getFrontView(): View { + return front_view + } + + override fun getRearRightView(): View { + return right_view + } + + override fun getRearLeftView(): View { + return left_view + } + + private fun resetFrontView() { + if (front_view.translationX == 0f) return + itemView.post { + adapter.recyclerView.itemAnimator?.changeDuration = 0 + val anim = front_view.animate().translationX(0f).setDuration(250) + anim.setListener(object : Animator.AnimatorListener { + override fun onAnimationEnd(animation: Animator?) { + adapter.itemTouchHelper.startSwipe(this@ChapterMatHolder) + adapter.notifyItemChanged(adapterPosition) + } + + override fun onAnimationCancel(animation: Animator?) {} + + override fun onAnimationRepeat(animation: Animator?) {} + + override fun onAnimationStart(animation: Animator?) {} + }) + anim.start() + } } fun notifyStatus(status: Int, locked: Boolean, progress: Int) = with(download_button) { diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/manga/chapter/ChaptersAdapter.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/manga/chapter/ChaptersAdapter.kt index 04049ca204..57b07891df 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/manga/chapter/ChaptersAdapter.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/manga/chapter/ChaptersAdapter.kt @@ -3,6 +3,7 @@ package eu.kanade.tachiyomi.ui.manga.chapter import android.content.Context import android.view.View import androidx.fragment.app.FragmentActivity +import androidx.recyclerview.widget.ItemTouchHelper import eu.davidea.flexibleadapter.FlexibleAdapter import eu.davidea.flexibleadapter.items.IFlexible import eu.kanade.tachiyomi.R @@ -37,7 +38,7 @@ class ChaptersAdapter( fun setChapters(items: List?) { this.items = items ?: emptyList() - super.updateDataSet(items) + performFilter() } fun indexOf(item: ChapterItem): Int { @@ -49,6 +50,24 @@ class ChaptersAdapter( SecureActivityDelegate.promptLockIfNeeded(activity) } + fun performFilter() { + val s = getFilter(String::class.java) + if (s.isNullOrBlank()) { + updateDataSet(items) + } else { + updateDataSet(items.filter { it.name.contains(s, true) || + it.scanlator?.contains(s, true) == true }) + } + } + + override fun onItemSwiped(position: Int, direction: Int) { + super.onItemSwiped(position, direction) + when (direction) { + ItemTouchHelper.RIGHT -> controller.bookmarkChapter(position) + ItemTouchHelper.LEFT -> controller.toggleReadChapter(position) + } + } + interface MangaHeaderInterface { fun coverColor(): Int? fun mangaPresenter(): MangaDetailsPresenter diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/manga/track/TrackHolder.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/manga/track/TrackHolder.kt index 3d69ccaab3..ca7bb1453f 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/manga/track/TrackHolder.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/manga/track/TrackHolder.kt @@ -36,6 +36,8 @@ class TrackHolder(view: View, adapter: TrackAdapter) : BaseViewHolder(view) { track_title.text = track.title with(track_chapters) { text = when { + track.total_chapters > 0 && track.last_chapter_read == track.total_chapters -> + context.getString(R.string.all_chapters_read) track.total_chapters > 0 -> context.getString( R.string.chapter_x_of_y, track.last_chapter_read, track.total_chapters ) diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/setting/SettingsMainController.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/setting/SettingsMainController.kt index 7ee77e891f..bb0e1f9d12 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/setting/SettingsMainController.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/setting/SettingsMainController.kt @@ -36,7 +36,7 @@ class SettingsMainController : SettingsController() { onClick { navigateTo(SettingsLibraryController()) } } preference { - iconRes = R.drawable.ic_chrome_reader_mode_black_24dp + iconRes = R.drawable.ic_read_24dp iconTint = tintColor titleRes = R.string.pref_category_reader onClick { navigateTo(SettingsReaderController()) } diff --git a/app/src/main/java/eu/kanade/tachiyomi/util/view/ViewExtensions.kt b/app/src/main/java/eu/kanade/tachiyomi/util/view/ViewExtensions.kt index 0bd4988699..3126e82bbb 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/util/view/ViewExtensions.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/util/view/ViewExtensions.kt @@ -14,6 +14,7 @@ import android.view.View import android.view.ViewGroup import android.view.ViewTreeObserver import android.view.WindowInsets +import android.view.inputmethod.InputMethodManager import android.widget.Button import android.widget.FrameLayout import android.widget.ImageView @@ -310,6 +311,10 @@ fun Controller.setOnQueryTextChangeListener( override fun onQueryTextSubmit(query: String?): Boolean { if (router.backstack.lastOrNull()?.controller() == this@setOnQueryTextChangeListener) { + val imm = + activity?.getSystemService(Context.INPUT_METHOD_SERVICE) as? InputMethodManager + ?: return f(query) + imm.hideSoftInputFromWindow(searchView.windowToken, 0) return f(query) } return true @@ -320,6 +325,7 @@ fun Controller.setOnQueryTextChangeListener( fun Controller.scrollViewWith( recycler: RecyclerView, padBottom: Boolean = false, + customPadding: Boolean = false, swipeRefreshLayout: SwipeRefreshLayout? = null, afterInsets: ((WindowInsets) -> Unit)? = null ) { @@ -331,7 +337,7 @@ fun Controller.scrollViewWith( array.recycle() recycler.doOnApplyWindowInsets { view, insets, _ -> val headerHeight = insets.systemWindowInsetTop + appBarHeight - view.updatePaddingRelative( + if (!customPadding) view.updatePaddingRelative( top = headerHeight, bottom = if (padBottom) insets.systemWindowInsetBottom else view.paddingBottom ) @@ -365,8 +371,10 @@ fun Controller.scrollViewWith( android.R.integer.config_shortAnimTime ) ?: 0 val closerToTop = abs(activity!!.appbar.y) - halfWay > 0 - val atTop = - (recycler.layoutManager as LinearLayoutManager).findFirstVisibleItemPosition() < 2 + val atTop = (!customPadding && + (recycler.layoutManager as LinearLayoutManager) + .findFirstVisibleItemPosition() < 2) || + !recycler.canScrollVertically(-1) activity!!.appbar.animate().y( if (closerToTop && !atTop) (-activity!!.appbar.height.toFloat()) else 0f diff --git a/app/src/main/res/drawable/eye.xml b/app/src/main/res/drawable/eye.xml new file mode 100644 index 0000000000..2d40aefe5f --- /dev/null +++ b/app/src/main/res/drawable/eye.xml @@ -0,0 +1,8 @@ + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/eye_off.xml b/app/src/main/res/drawable/eye_off.xml new file mode 100644 index 0000000000..097850547f --- /dev/null +++ b/app/src/main/res/drawable/eye_off.xml @@ -0,0 +1,8 @@ + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/ic_chrome_reader_mode_black_24dp.xml b/app/src/main/res/drawable/ic_read_24dp.xml similarity index 100% rename from app/src/main/res/drawable/ic_chrome_reader_mode_black_24dp.xml rename to app/src/main/res/drawable/ic_read_24dp.xml diff --git a/app/src/main/res/drawable/star.xml b/app/src/main/res/drawable/star.xml new file mode 100644 index 0000000000..eacf681ceb --- /dev/null +++ b/app/src/main/res/drawable/star.xml @@ -0,0 +1,8 @@ + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/star_off.xml b/app/src/main/res/drawable/star_off.xml new file mode 100644 index 0000000000..6636bf6251 --- /dev/null +++ b/app/src/main/res/drawable/star_off.xml @@ -0,0 +1,8 @@ + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/chapters_mat_item.xml b/app/src/main/res/layout/chapters_mat_item.xml index f5a19bab93..55c89824e6 100644 --- a/app/src/main/res/layout/chapters_mat_item.xml +++ b/app/src/main/res/layout/chapters_mat_item.xml @@ -1,48 +1,103 @@ - + android:background="?android:attr/colorBackground"> - - - - - - \ No newline at end of file + app:layout_constraintStart_toStartOf="parent" + app:layout_constraintTop_toTopOf="parent"> + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/menu/manga_details.xml b/app/src/main/res/menu/manga_details.xml index 735919d7a7..350fff59e9 100644 --- a/app/src/main/res/menu/manga_details.xml +++ b/app/src/main/res/menu/manga_details.xml @@ -3,10 +3,11 @@ xmlns:app="http://schemas.android.com/apk/res-auto"> + android:id="@+id/action_search" + android:icon="@drawable/ic_search_white_24dp" + android:title="@string/action_search" + app:actionViewClass="androidx.appcompat.widget.SearchView" + app:showAsAction="collapseActionView|ifRoom" /> + + \ No newline at end of file diff --git a/app/src/main/res/values-pl/strings.xml b/app/src/main/res/values-pl/strings.xml index f7146569ab..7a968cf5ad 100644 --- a/app/src/main/res/values-pl/strings.xml +++ b/app/src/main/res/values-pl/strings.xml @@ -183,7 +183,7 @@ Po %1$s minutach Po %1$s minutach - Szukaj tytułu, tagów, źródła… + Szukaj tytułu, tagów, źródła… Automatycznie odśwież okładki Odśwież okładki w bibliotece podczas odświeżania biblioteki (nadpisuje lokalne okładki) diff --git a/app/src/main/res/values-ru/strings.xml b/app/src/main/res/values-ru/strings.xml index fd3f14d87f..dbfa3abcd2 100644 --- a/app/src/main/res/values-ru/strings.xml +++ b/app/src/main/res/values-ru/strings.xml @@ -520,7 +520,7 @@ Оценка - Название, теги, источник + Название, теги, источник Параметр поиска (например: language:english) Предпоследняя diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 2f8bbc0778..161ac73057 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -244,7 +244,7 @@ After %1$s minute After %1$s minutes - Search title, tags, source + Search title, tags, source Automatically refresh covers Refresh covers in library as well when updating library (overwrites local covers) @@ -531,6 +531,7 @@ Remove from library Select starting chapter Select ending chapter + Search chapters Start reading