From 6879d046f85e85f2a2b3edc876c29ba173dd434f Mon Sep 17 00:00:00 2001 From: Koitharu Date: Thu, 18 Aug 2022 17:00:59 +0300 Subject: [PATCH] Adjust reader info bar insets --- .../kotatsu/reader/ui/ReaderInfoBarView.kt | 42 +++++++++++++++---- .../org/koitharu/kotatsu/utils/ext/ViewExt.kt | 17 ++++++++ app/src/main/res/layout/activity_reader.xml | 4 +- 3 files changed, 54 insertions(+), 9 deletions(-) diff --git a/app/src/main/java/org/koitharu/kotatsu/reader/ui/ReaderInfoBarView.kt b/app/src/main/java/org/koitharu/kotatsu/reader/ui/ReaderInfoBarView.kt index 5f825fee6..7e59978d0 100644 --- a/app/src/main/java/org/koitharu/kotatsu/reader/ui/ReaderInfoBarView.kt +++ b/app/src/main/java/org/koitharu/kotatsu/reader/ui/ReaderInfoBarView.kt @@ -8,18 +8,19 @@ import android.graphics.Canvas import android.graphics.Color import android.graphics.Paint import android.graphics.Rect -import android.icu.text.SimpleDateFormat import android.util.AttributeSet import android.view.View import androidx.annotation.AttrRes import androidx.core.graphics.ColorUtils import com.google.android.material.R as materialR +import java.text.SimpleDateFormat import java.util.* import org.koitharu.kotatsu.R import org.koitharu.kotatsu.parsers.util.format import org.koitharu.kotatsu.reader.ui.pager.ReaderUiState import org.koitharu.kotatsu.utils.ext.getThemeColor -import org.koitharu.kotatsu.utils.ext.resolveDp +import org.koitharu.kotatsu.utils.ext.measureDimension +import org.koitharu.kotatsu.utils.ext.printStackTraceDebug class ReaderInfoBarView @JvmOverloads constructor( context: Context, @@ -29,33 +30,51 @@ class ReaderInfoBarView @JvmOverloads constructor( private val paint = Paint(Paint.ANTI_ALIAS_FLAG) private val textBounds = Rect() - private val inset = context.resources.resolveDp(2f) private val timeFormat = SimpleDateFormat.getTimeInstance(SimpleDateFormat.SHORT) private val timeReceiver = TimeReceiver() + private var insetLeft: Int = 0 + private var insetRight: Int = 0 + private var insetTop: Int = 0 private var timeText = timeFormat.format(Date()) private var text: String = "" private val innerHeight - get() = height - inset - inset - paddingTop - paddingBottom + get() = height - paddingTop - paddingBottom - insetTop private val innerWidth - get() = width - inset - inset - paddingLeft - paddingRight + get() = width - paddingLeft - paddingRight - insetLeft - insetRight init { paint.color = ColorUtils.setAlphaComponent( context.getThemeColor(materialR.attr.colorOnSurface, Color.BLACK), 160, ) + paint.setShadowLayer(20f, 0f, 0f, context.getThemeColor(materialR.attr.colorOnSurfaceInverse, Color.WHITE)) + val insetStart = getSystemUiDimensionOffset("status_bar_padding_start") + val insetEnd = getSystemUiDimensionOffset("status_bar_padding_end") + val isRtl = layoutDirection == LAYOUT_DIRECTION_RTL + insetLeft = if (isRtl) insetEnd else insetStart + insetRight = if (isRtl) insetStart else insetEnd + insetTop = minOf(insetLeft, insetRight) + } + + override fun onMeasure(widthMeasureSpec: Int, heightMeasureSpec: Int) { + val desiredWidth = suggestedMinimumWidth + paddingLeft + paddingRight + insetLeft + insetRight + val desiredHeight = suggestedMinimumHeight + paddingTop + paddingBottom + insetTop + setMeasuredDimension( + measureDimension(desiredWidth, widthMeasureSpec), + measureDimension(desiredHeight, heightMeasureSpec), + ) } override fun onDraw(canvas: Canvas) { super.onDraw(canvas) val ty = innerHeight / 2f + textBounds.height() / 2f - textBounds.bottom paint.textAlign = Paint.Align.LEFT - canvas.drawText(text, paddingLeft + inset, paddingTop + inset + ty, paint) + canvas.drawText(text, (paddingLeft + insetLeft).toFloat(), paddingTop + insetTop + ty, paint) paint.textAlign = Paint.Align.RIGHT - canvas.drawText(timeText, width - paddingRight - inset, paddingTop + inset + ty, paint) + canvas.drawText(timeText, (width - paddingRight - insetRight).toFloat(), paddingTop + insetTop + ty, paint) } override fun onSizeChanged(w: Int, h: Int, oldw: Int, oldh: Int) { @@ -110,4 +129,13 @@ class ReaderInfoBarView @JvmOverloads constructor( invalidate() } } + + private fun getSystemUiDimensionOffset(name: String): Int = runCatching { + val manager = context.packageManager + val resources = manager.getResourcesForApplication("com.android.systemui") + val resId = resources.getIdentifier(name, "dimen", "com.android.systemui") + resources.getDimensionPixelOffset(resId) + }.onFailure { + it.printStackTraceDebug() + }.getOrDefault(0) } diff --git a/app/src/main/java/org/koitharu/kotatsu/utils/ext/ViewExt.kt b/app/src/main/java/org/koitharu/kotatsu/utils/ext/ViewExt.kt index e6c4e11e1..12b2abe7b 100644 --- a/app/src/main/java/org/koitharu/kotatsu/utils/ext/ViewExt.kt +++ b/app/src/main/java/org/koitharu/kotatsu/utils/ext/ViewExt.kt @@ -3,6 +3,7 @@ package org.koitharu.kotatsu.utils.ext import android.app.Activity import android.graphics.Rect import android.view.View +import android.view.View.MeasureSpec import android.view.ViewGroup import android.view.ViewParent import android.view.inputmethod.InputMethodManager @@ -167,3 +168,19 @@ val View.parents: Sequence p = p.parent } } + +@Suppress("unused") +fun View.measureDimension(desiredSize: Int, measureSpec: Int): Int { + var result: Int + val specMode = MeasureSpec.getMode(measureSpec) + val specSize = MeasureSpec.getSize(measureSpec) + if (specMode == MeasureSpec.EXACTLY) { + result = specSize + } else { + result = desiredSize + if (specMode == MeasureSpec.AT_MOST) { + result = result.coerceAtMost(specSize) + } + } + return result +} diff --git a/app/src/main/res/layout/activity_reader.xml b/app/src/main/res/layout/activity_reader.xml index c166f683d..06ad562fe 100644 --- a/app/src/main/res/layout/activity_reader.xml +++ b/app/src/main/res/layout/activity_reader.xml @@ -28,9 +28,9 @@