Respect rounded corners in reader bar #900

master
Koitharu 2 years ago
parent e642d54929
commit 87beb9442f
Signed by: Koitharu
GPG Key ID: 676DEE768C17A9D7

@ -11,7 +11,9 @@ import android.graphics.Paint
import android.graphics.Rect import android.graphics.Rect
import android.graphics.drawable.Drawable import android.graphics.drawable.Drawable
import android.os.BatteryManager import android.os.BatteryManager
import android.os.Build
import android.util.AttributeSet import android.util.AttributeSet
import android.view.RoundedCorner
import android.view.View import android.view.View
import android.view.WindowInsets import android.view.WindowInsets
import androidx.annotation.AttrRes import androidx.annotation.AttrRes
@ -46,8 +48,10 @@ class ReaderInfoBarView @JvmOverloads constructor(
private var insetLeft: Int = 0 private var insetLeft: Int = 0
private var insetRight: Int = 0 private var insetRight: Int = 0
private var insetTop: Int = 0 private var insetTop: Int = 0
private var cutoutInsetLeft = 0 private val insetLeftFallback: Int
private var cutoutInsetRight = 0 private val insetRightFallback: Int
private val insetTopFallback: Int
private val insetCornerFallback = getSystemUiDimensionOffset("rounded_corner_content_padding")
private val colorText = ColorUtils.setAlphaComponent( private val colorText = ColorUtils.setAlphaComponent(
context.getThemeColor(materialR.attr.colorOnSurface, Color.BLACK), context.getThemeColor(materialR.attr.colorOnSurface, Color.BLACK),
200, 200,
@ -80,14 +84,12 @@ class ReaderInfoBarView @JvmOverloads constructor(
paint.strokeWidth = getDimension(R.styleable.ReaderInfoBarView_android_strokeWidth, 2f) paint.strokeWidth = getDimension(R.styleable.ReaderInfoBarView_android_strokeWidth, 2f)
paint.textSize = getDimension(R.styleable.ReaderInfoBarView_android_textSize, 16f) paint.textSize = getDimension(R.styleable.ReaderInfoBarView_android_textSize, 16f)
} }
val insetCorner = getSystemUiDimensionOffset("rounded_corner_content_padding") val insetStart = getSystemUiDimensionOffset("status_bar_padding_start")
val fallbackInset = resources.getDimensionPixelOffset(R.dimen.reader_bar_inset_fallback) val insetEnd = getSystemUiDimensionOffset("status_bar_padding_end")
val insetStart = getSystemUiDimensionOffset("status_bar_padding_start", fallbackInset) + insetCorner
val insetEnd = getSystemUiDimensionOffset("status_bar_padding_end", fallbackInset) + insetCorner
val isRtl = layoutDirection == LAYOUT_DIRECTION_RTL val isRtl = layoutDirection == LAYOUT_DIRECTION_RTL
insetLeft = if (isRtl) insetEnd else insetStart insetLeftFallback = if (isRtl) insetEnd else insetStart
insetRight = if (isRtl) insetStart else insetEnd insetRightFallback = if (isRtl) insetStart else insetEnd
insetTop = minOf(insetLeft, insetRight) insetTopFallback = minOf(insetLeftFallback, insetRightFallback)
} }
override fun onMeasure(widthMeasureSpec: Int, heightMeasureSpec: Int) { override fun onMeasure(widthMeasureSpec: Int, heightMeasureSpec: Int) {
@ -110,12 +112,12 @@ class ReaderInfoBarView @JvmOverloads constructor(
paint.textAlign = Paint.Align.LEFT paint.textAlign = Paint.Align.LEFT
canvas.drawTextOutline( canvas.drawTextOutline(
text, text,
(paddingLeft + insetLeft + cutoutInsetLeft).toFloat(), (paddingLeft + insetLeft).toFloat(),
paddingTop + insetTop + ty, paddingTop + insetTop + ty,
) )
if (isTimeVisible) { if (isTimeVisible) {
paint.textAlign = Paint.Align.RIGHT paint.textAlign = Paint.Align.RIGHT
var endX = (width - paddingRight - insetRight - cutoutInsetRight).toFloat() var endX = (width - paddingRight - insetRight).toFloat()
canvas.drawTextOutline(timeText, endX, paddingTop + insetTop + ty) canvas.drawTextOutline(timeText, endX, paddingTop + insetTop + ty)
if (batteryText.isNotEmpty()) { if (batteryText.isNotEmpty()) {
paint.getTextBounds(timeText, 0, timeText.length, textBounds) paint.getTextBounds(timeText, 0, timeText.length, textBounds)
@ -221,15 +223,29 @@ class ReaderInfoBarView @JvmOverloads constructor(
} }
private fun updateCutoutInsets(insetsCompat: WindowInsetsCompat?) { private fun updateCutoutInsets(insetsCompat: WindowInsetsCompat?) {
val cutouts = (insetsCompat ?: return).displayCutout?.boundingRects.orEmpty() insetLeft = insetLeftFallback
cutoutInsetLeft = 0 insetRight = insetRightFallback
cutoutInsetRight = 0 insetTop = insetTopFallback
for (rect in cutouts) { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S && insetsCompat != null) {
if (rect.left <= paddingLeft) { val nativeInsets = insetsCompat.toWindowInsets()
cutoutInsetLeft += rect.width() nativeInsets?.getRoundedCorner(RoundedCorner.POSITION_TOP_LEFT)?.let { corner ->
insetLeft += corner.radius
} }
if (rect.right >= width - paddingRight) { nativeInsets?.getRoundedCorner(RoundedCorner.POSITION_TOP_RIGHT)?.let { corner ->
cutoutInsetRight += rect.width() insetRight += corner.radius
}
} else {
insetLeft += insetCornerFallback
insetRight += insetCornerFallback
}
insetsCompat?.displayCutout?.let { cutout ->
for (rect in cutout.boundingRects) {
if (rect.left <= paddingLeft) {
insetLeft += rect.width()
}
if (rect.right >= width - paddingRight) {
insetRight += rect.width()
}
} }
} }
} }

@ -18,6 +18,7 @@
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_gravity="top" android:layout_gravity="top"
android:paddingHorizontal="6dp" android:paddingHorizontal="6dp"
android:paddingTop="8dp"
android:textSize="12sp" android:textSize="12sp"
android:visibility="gone" android:visibility="gone"
tools:visibility="visible" /> tools:visibility="visible" />

@ -28,6 +28,7 @@
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_gravity="top" android:layout_gravity="top"
android:padding="6dp"
android:textSize="12sp" android:textSize="12sp"
android:visibility="gone" android:visibility="gone"
tools:visibility="visible" /> tools:visibility="visible" />

@ -29,7 +29,6 @@
<dimen name="toolbar_button_margin">10dp</dimen> <dimen name="toolbar_button_margin">10dp</dimen>
<dimen name="widget_cover_height">116dp</dimen> <dimen name="widget_cover_height">116dp</dimen>
<dimen name="widget_cover_width">84dp</dimen> <dimen name="widget_cover_width">84dp</dimen>
<dimen name="reader_bar_inset_fallback">8dp</dimen>
<dimen name="scrobbling_list_spacing">12dp</dimen> <dimen name="scrobbling_list_spacing">12dp</dimen>
<dimen name="explore_grid_width">120dp</dimen> <dimen name="explore_grid_width">120dp</dimen>
<dimen name="chapter_grid_width">80dp</dimen> <dimen name="chapter_grid_width">80dp</dimen>

Loading…
Cancel
Save