Respect rounded corners for page numbers (#1360)

This commit is contained in:
Koitharu
2025-04-08 09:00:07 +03:00
parent fe5d37f45e
commit 313c2ab2bf
6 changed files with 66 additions and 5 deletions

View File

@@ -19,8 +19,8 @@ android {
applicationId 'org.koitharu.kotatsu'
minSdk = 21
targetSdk = 35
versionCode = 1007
versionName = '8.1.1'
versionCode = 1008
versionName = '8.1.2'
generatedDensities = []
testInstrumentationRunner 'org.koitharu.kotatsu.HiltTestRunner'
ksp {

View File

@@ -26,6 +26,7 @@ class DetailsErrorObserver(
override suspend fun emit(value: Throwable) {
val snackbar = Snackbar.make(host, value.getDisplayMessage(host.context.resources), Snackbar.LENGTH_SHORT)
snackbar.setAnchorView(activity.viewBinding.containerBottomSheet)
if (value is NotFoundException || value is UnsupportedSourceException) {
snackbar.duration = Snackbar.LENGTH_INDEFINITE
}

View File

@@ -1,13 +1,21 @@
package org.koitharu.kotatsu.reader.ui.pager.reversed
import android.graphics.PointF
import android.os.Build
import android.view.Gravity
import android.view.RoundedCorner
import android.view.ViewGroup
import android.view.WindowInsets
import android.widget.FrameLayout
import androidx.annotation.RequiresApi
import androidx.core.view.updateLayoutParams
import androidx.lifecycle.LifecycleOwner
import com.davemorrissey.labs.subscaleview.SubsamplingScaleImageView
import org.koitharu.kotatsu.R
import org.koitharu.kotatsu.core.exceptions.resolve.ExceptionResolver
import org.koitharu.kotatsu.core.model.ZoomMode
import org.koitharu.kotatsu.core.os.NetworkState
import org.koitharu.kotatsu.core.util.ext.isRtl
import org.koitharu.kotatsu.databinding.ItemPageBinding
import org.koitharu.kotatsu.reader.domain.PageLoader
import org.koitharu.kotatsu.reader.ui.config.ReaderSettings

View File

@@ -2,10 +2,23 @@ package org.koitharu.kotatsu.reader.ui.pager.standard
import android.annotation.SuppressLint
import android.graphics.PointF
import android.os.Build
import android.view.Gravity
import android.view.RoundedCorner
import android.view.View
import android.view.WindowInsets
import android.view.animation.DecelerateInterpolator
import android.widget.FrameLayout
import androidx.annotation.RequiresApi
import androidx.core.view.OnApplyWindowInsetsListener
import androidx.core.view.ViewCompat
import androidx.core.view.WindowInsetsCompat
import androidx.core.view.isVisible
import androidx.core.view.setMargins
import androidx.core.view.updateLayoutParams
import androidx.lifecycle.LifecycleOwner
import com.davemorrissey.labs.subscaleview.SubsamplingScaleImageView
import org.koitharu.kotatsu.R
import org.koitharu.kotatsu.core.exceptions.resolve.ExceptionResolver
import org.koitharu.kotatsu.core.model.ZoomMode
import org.koitharu.kotatsu.core.os.NetworkState
@@ -30,10 +43,26 @@ open class PageHolder(
networkState = networkState,
exceptionResolver = exceptionResolver,
lifecycleOwner = owner,
), ZoomControl.ZoomControlListener {
), ZoomControl.ZoomControlListener, OnApplyWindowInsetsListener {
override val ssiv = binding.ssiv
init {
ViewCompat.setOnApplyWindowInsetsListener(binding.root, this)
}
override fun onApplyWindowInsets(
v: View,
insets: WindowInsetsCompat
): WindowInsetsCompat {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) {
insets.toWindowInsets()?.let {
applyRoundedCorners(it)
}
}
return insets
}
override fun onConfigChanged(settings: ReaderSettings) {
super.onConfigChanged(settings)
binding.textViewNumber.isVisible = settings.isPagesNumbersEnabled
@@ -93,6 +122,29 @@ open class PageHolder(
scaleBy(0.8f)
}
@SuppressLint("RtlHardcoded")
@RequiresApi(Build.VERSION_CODES.S)
protected open fun applyRoundedCorners(insets: WindowInsets) {
binding.textViewNumber.updateLayoutParams<FrameLayout.LayoutParams> {
val baseMargin = context.resources.getDimensionPixelOffset(R.dimen.margin_small)
val absoluteGravity = Gravity.getAbsoluteGravity(gravity, layoutDirection)
val corner = when {
absoluteGravity and Gravity.LEFT == Gravity.LEFT -> {
insets.getRoundedCorner(RoundedCorner.POSITION_BOTTOM_LEFT)
}
absoluteGravity and Gravity.RIGHT == Gravity.RIGHT -> {
insets.getRoundedCorner(RoundedCorner.POSITION_BOTTOM_RIGHT)
}
else -> {
null
}
}
setMargins(baseMargin + (corner?.radius ?: 0))
}
}
private fun scaleBy(factor: Float) {
val ssiv = binding.ssiv
val center = ssiv.getCenter() ?: return

View File

@@ -20,7 +20,7 @@
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="end|bottom"
android:layout_margin="8dp"
android:layout_margin="@dimen/margin_small"
android:singleLine="true"
android:textAppearance="?attr/textAppearanceBodyMedium"
android:textColor="?android:textColorTertiary"

View File

@@ -31,7 +31,7 @@ material = "1.13.0-alpha12"
moshi = "1.15.2"
okhttp = "4.12.0"
okio = "3.10.2"
parsers = "b8376594"
parsers = "20a24db949"
preference = "1.2.1"
recyclerview = "1.4.0"
room = "2.6.1"