More List scrolling work
less bugs + end of categories animation Always showing start reading button, it's just disabled when there's nothing to read
This commit is contained in:
parent
8379caa149
commit
1f91ad0a07
@ -53,6 +53,7 @@ import java.util.Locale
|
|||||||
import kotlin.math.abs
|
import kotlin.math.abs
|
||||||
import kotlin.math.max
|
import kotlin.math.max
|
||||||
import kotlin.math.min
|
import kotlin.math.min
|
||||||
|
import kotlin.math.pow
|
||||||
import kotlin.math.roundToInt
|
import kotlin.math.roundToInt
|
||||||
import kotlin.math.sign
|
import kotlin.math.sign
|
||||||
|
|
||||||
@ -152,10 +153,7 @@ class LibraryListController(bundle: Bundle? = null) : LibraryController(bundle),
|
|||||||
bottom_sheet.getGlobalVisibleRect(sheetRect)
|
bottom_sheet.getGlobalVisibleRect(sheetRect)
|
||||||
view?.getGlobalVisibleRect(recyclerRect)
|
view?.getGlobalVisibleRect(recyclerRect)
|
||||||
|
|
||||||
if (sheetRect.contains(event.x.toInt(), event.y.toInt()) ||
|
|
||||||
!recyclerRect.contains(event.x.toInt(), event.y.toInt())) {
|
|
||||||
return
|
|
||||||
}
|
|
||||||
if (startPosX == null) {
|
if (startPosX == null) {
|
||||||
startPosX = event.rawX
|
startPosX = event.rawX
|
||||||
startPosY = event.rawY
|
startPosY = event.rawY
|
||||||
@ -185,8 +183,14 @@ class LibraryListController(bundle: Bundle? = null) : LibraryController(bundle),
|
|||||||
prevCategory = newOffsetP
|
prevCategory = newOffsetP
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
return
|
||||||
}
|
}
|
||||||
else if (event.actionMasked != MotionEvent.ACTION_UP && startPosX != null) {
|
if (startPosX != null && startPosY != null &&
|
||||||
|
(sheetRect.contains(startPosX!!.toInt(), startPosY!!.toInt()) ||
|
||||||
|
!recyclerRect.contains(startPosX!!.toInt(), startPosY!!.toInt()))) {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
if (event.actionMasked != MotionEvent.ACTION_UP && startPosX != null) {
|
||||||
val distance = abs(event.rawX - startPosX!!)
|
val distance = abs(event.rawX - startPosX!!)
|
||||||
val sign = sign(event.rawX - startPosX!!)
|
val sign = sign(event.rawX - startPosX!!)
|
||||||
|
|
||||||
@ -196,26 +200,21 @@ class LibraryListController(bundle: Bundle? = null) : LibraryController(bundle),
|
|||||||
!lockedRecycler) {
|
!lockedRecycler) {
|
||||||
lockedRecycler = true
|
lockedRecycler = true
|
||||||
switchingCategories = true
|
switchingCategories = true
|
||||||
if ((prevCategory == null && sign > 0) || (nextCategory == null && sign < 0)) {
|
recycler.suppressLayout(true)
|
||||||
recycler_layout.x = 0f
|
|
||||||
recycler_layout.alpha = 1f
|
|
||||||
return
|
|
||||||
}
|
|
||||||
else
|
|
||||||
recycler.suppressLayout(true)
|
|
||||||
}
|
}
|
||||||
else if (!lockedRecycler && abs(event.rawY - startPosY!!) > 30) {
|
else if (!lockedRecycler && abs(event.rawY - startPosY!!) > 30) {
|
||||||
lockedY = true
|
lockedY = true
|
||||||
resetRecyclerY()
|
resetRecyclerY()
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
if ((prevCategory == null && sign > 0) || (nextCategory == null && sign < 0)) {
|
|
||||||
resetRecyclerY()
|
|
||||||
return
|
|
||||||
}
|
|
||||||
if (abs(event.rawY - startPosY!!) <= 30 || recycler.isLayoutSuppressed
|
if (abs(event.rawY - startPosY!!) <= 30 || recycler.isLayoutSuppressed
|
||||||
|| lockedRecycler) {
|
|| lockedRecycler) {
|
||||||
if (distance <= swipeDistance * 1.1f) {
|
|
||||||
|
if ((prevCategory == null && sign > 0) || (nextCategory == null && sign < 0)) {
|
||||||
|
recycler_layout.x = sign * distance.pow(0.6f)
|
||||||
|
recycler_layout.alpha = 1f
|
||||||
|
}
|
||||||
|
else if (distance <= swipeDistance * 1.1f) {
|
||||||
recycler_layout.x = (max(0f, distance - 50f) * sign) / 3
|
recycler_layout.x = (max(0f, distance - 50f) * sign) / 3
|
||||||
recycler_layout.alpha =
|
recycler_layout.alpha =
|
||||||
(1f - (distance - (swipeDistance * 0.1f)) / swipeDistance)
|
(1f - (distance - (swipeDistance * 0.1f)) / swipeDistance)
|
||||||
@ -454,6 +453,14 @@ class LibraryListController(bundle: Bundle? = null) : LibraryController(bundle),
|
|||||||
headerPosition, (if (headerPosition == 0) 0 else (-28).dpToPx)
|
headerPosition, (if (headerPosition == 0) 0 else (-28).dpToPx)
|
||||||
+ appbarOffset
|
+ appbarOffset
|
||||||
)
|
)
|
||||||
|
val isCurrentController = router?.backstack?.lastOrNull()?.controller() ==
|
||||||
|
this
|
||||||
|
|
||||||
|
val headerItem = adapter.getItem(headerPosition) as? LibraryHeaderItem
|
||||||
|
if (headerItem != null) {
|
||||||
|
customTitleSpinner.category_title.text = headerItem.category.name
|
||||||
|
if (isCurrentController) setTitle()
|
||||||
|
}
|
||||||
recycler.suppressLayout(false)
|
recycler.suppressLayout(false)
|
||||||
}
|
}
|
||||||
launchUI {
|
launchUI {
|
||||||
@ -790,6 +797,8 @@ class LibraryListController(bundle: Bundle? = null) : LibraryController(bundle),
|
|||||||
|
|
||||||
if (lockedRecycler && abs(x) > 1000f) {
|
if (lockedRecycler && abs(x) > 1000f) {
|
||||||
val sign = sign(x).roundToInt()
|
val sign = sign(x).roundToInt()
|
||||||
|
if ((sign < 0 && nextCategory == null) || (sign > 0) && prevCategory == null)
|
||||||
|
return
|
||||||
val distance = recycler_layout.alpha
|
val distance = recycler_layout.alpha
|
||||||
val speed = max(3000f / abs(x), 0.75f)
|
val speed = max(3000f / abs(x), 0.75f)
|
||||||
Timber.d("Flinged $distance, velo ${abs(x)}, speed $speed")
|
Timber.d("Flinged $distance, velo ${abs(x)}, speed $speed")
|
||||||
|
@ -47,6 +47,8 @@ class SearchActivity: MainActivity() {
|
|||||||
toolbar.navigationIcon = drawerArrow
|
toolbar.navigationIcon = drawerArrow
|
||||||
drawerArrow?.progress = 1f
|
drawerArrow?.progress = 1f
|
||||||
|
|
||||||
|
if (to !is SpinnerTitleInterface) toolbar.removeSpinner()
|
||||||
|
|
||||||
if (to is NoToolbarElevationController) {
|
if (to is NoToolbarElevationController) {
|
||||||
appbar.disableElevation()
|
appbar.disableElevation()
|
||||||
} else {
|
} else {
|
||||||
|
@ -98,6 +98,7 @@ class MangaDetailsPresenter(private val controller: MangaDetailsController,
|
|||||||
fun fetchChapters() {
|
fun fetchChapters() {
|
||||||
launch {
|
launch {
|
||||||
getChapters()
|
getChapters()
|
||||||
|
refreshTracking()
|
||||||
withContext(Dispatchers.Main) { controller.updateChapters(chapters) }
|
withContext(Dispatchers.Main) { controller.updateChapters(chapters) }
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -156,7 +156,8 @@ class MangaHeaderHolder(
|
|||||||
|
|
||||||
with(start_reading_button) {
|
with(start_reading_button) {
|
||||||
val nextChapter = presenter.getNextUnreadChapter()
|
val nextChapter = presenter.getNextUnreadChapter()
|
||||||
visibleIf(nextChapter != null && !item.isLocked)
|
visibleIf(presenter.chapters.isNotEmpty() && !item.isLocked)
|
||||||
|
isEnabled = (nextChapter != null)
|
||||||
if (nextChapter != null) {
|
if (nextChapter != null) {
|
||||||
val number = adapter.decimalFormat.format(nextChapter.chapter_number.toDouble())
|
val number = adapter.decimalFormat.format(nextChapter.chapter_number.toDouble())
|
||||||
text = if (nextChapter.chapter_number > 0) resources.getString(
|
text = if (nextChapter.chapter_number > 0) resources.getString(
|
||||||
@ -171,6 +172,9 @@ class MangaHeaderHolder(
|
|||||||
)
|
)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
else {
|
||||||
|
text = resources.getString(R.string.all_caught_up)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
val count = presenter.chapters.size
|
val count = presenter.chapters.size
|
||||||
|
6
app/src/main/res/color/mtrl_btn_bg_selector.xml
Normal file
6
app/src/main/res/color/mtrl_btn_bg_selector.xml
Normal file
@ -0,0 +1,6 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<selector xmlns:android="http://schemas.android.com/apk/res/android">
|
||||||
|
<item android:state_enabled="false"
|
||||||
|
android:alpha="0.12" android:color="?attr/colorOnSurface" />
|
||||||
|
<item android:color="?colorAccent" />
|
||||||
|
</selector>
|
@ -0,0 +1,5 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<selector xmlns:android="http://schemas.android.com/apk/res/android">
|
||||||
|
<item android:color="@android:color/white" android:state_enabled="true"/>
|
||||||
|
<item android:alpha="0.38" android:color="?attr/colorOnSurface"/>
|
||||||
|
</selector>
|
@ -514,6 +514,7 @@
|
|||||||
<string name="no_description">No description</string>
|
<string name="no_description">No description</string>
|
||||||
<string name="mark_all_as_read_message">Mark all chapters as read?</string>
|
<string name="mark_all_as_read_message">Mark all chapters as read?</string>
|
||||||
<string name="remove_from_library">Remove from library</string>
|
<string name="remove_from_library">Remove from library</string>
|
||||||
|
<string name="all_caught_up">All caught up</string>
|
||||||
|
|
||||||
<!-- Manga chapters fragment -->
|
<!-- Manga chapters fragment -->
|
||||||
<string name="start_reading">Start reading</string>
|
<string name="start_reading">Start reading</string>
|
||||||
|
@ -247,8 +247,8 @@
|
|||||||
|
|
||||||
<style name="Theme.Widget.Button.Primary" parent="Widget.MaterialComponents.Button">
|
<style name="Theme.Widget.Button.Primary" parent="Widget.MaterialComponents.Button">
|
||||||
<item name="android:textAllCaps">false</item>
|
<item name="android:textAllCaps">false</item>
|
||||||
<item name="backgroundTint">?colorAccent</item>
|
<item name="backgroundTint">@color/mtrl_btn_bg_selector</item>
|
||||||
<item name="android:textColor">@android:color/white</item>
|
<item name="android:textColor">@color/primary_button_text_color_selector</item>
|
||||||
<item name="android:letterSpacing">0.0</item>
|
<item name="android:letterSpacing">0.0</item>
|
||||||
</style>
|
</style>
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user