Adjust reader info bar insets
This commit is contained in:
@@ -8,18 +8,19 @@ import android.graphics.Canvas
|
|||||||
import android.graphics.Color
|
import android.graphics.Color
|
||||||
import android.graphics.Paint
|
import android.graphics.Paint
|
||||||
import android.graphics.Rect
|
import android.graphics.Rect
|
||||||
import android.icu.text.SimpleDateFormat
|
|
||||||
import android.util.AttributeSet
|
import android.util.AttributeSet
|
||||||
import android.view.View
|
import android.view.View
|
||||||
import androidx.annotation.AttrRes
|
import androidx.annotation.AttrRes
|
||||||
import androidx.core.graphics.ColorUtils
|
import androidx.core.graphics.ColorUtils
|
||||||
import com.google.android.material.R as materialR
|
import com.google.android.material.R as materialR
|
||||||
|
import java.text.SimpleDateFormat
|
||||||
import java.util.*
|
import java.util.*
|
||||||
import org.koitharu.kotatsu.R
|
import org.koitharu.kotatsu.R
|
||||||
import org.koitharu.kotatsu.parsers.util.format
|
import org.koitharu.kotatsu.parsers.util.format
|
||||||
import org.koitharu.kotatsu.reader.ui.pager.ReaderUiState
|
import org.koitharu.kotatsu.reader.ui.pager.ReaderUiState
|
||||||
import org.koitharu.kotatsu.utils.ext.getThemeColor
|
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(
|
class ReaderInfoBarView @JvmOverloads constructor(
|
||||||
context: Context,
|
context: Context,
|
||||||
@@ -29,33 +30,51 @@ class ReaderInfoBarView @JvmOverloads constructor(
|
|||||||
|
|
||||||
private val paint = Paint(Paint.ANTI_ALIAS_FLAG)
|
private val paint = Paint(Paint.ANTI_ALIAS_FLAG)
|
||||||
private val textBounds = Rect()
|
private val textBounds = Rect()
|
||||||
private val inset = context.resources.resolveDp(2f)
|
|
||||||
private val timeFormat = SimpleDateFormat.getTimeInstance(SimpleDateFormat.SHORT)
|
private val timeFormat = SimpleDateFormat.getTimeInstance(SimpleDateFormat.SHORT)
|
||||||
private val timeReceiver = TimeReceiver()
|
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 timeText = timeFormat.format(Date())
|
||||||
private var text: String = ""
|
private var text: String = ""
|
||||||
|
|
||||||
private val innerHeight
|
private val innerHeight
|
||||||
get() = height - inset - inset - paddingTop - paddingBottom
|
get() = height - paddingTop - paddingBottom - insetTop
|
||||||
|
|
||||||
private val innerWidth
|
private val innerWidth
|
||||||
get() = width - inset - inset - paddingLeft - paddingRight
|
get() = width - paddingLeft - paddingRight - insetLeft - insetRight
|
||||||
|
|
||||||
init {
|
init {
|
||||||
paint.color = ColorUtils.setAlphaComponent(
|
paint.color = ColorUtils.setAlphaComponent(
|
||||||
context.getThemeColor(materialR.attr.colorOnSurface, Color.BLACK),
|
context.getThemeColor(materialR.attr.colorOnSurface, Color.BLACK),
|
||||||
160,
|
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) {
|
override fun onDraw(canvas: Canvas) {
|
||||||
super.onDraw(canvas)
|
super.onDraw(canvas)
|
||||||
val ty = innerHeight / 2f + textBounds.height() / 2f - textBounds.bottom
|
val ty = innerHeight / 2f + textBounds.height() / 2f - textBounds.bottom
|
||||||
paint.textAlign = Paint.Align.LEFT
|
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
|
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) {
|
override fun onSizeChanged(w: Int, h: Int, oldw: Int, oldh: Int) {
|
||||||
@@ -110,4 +129,13 @@ class ReaderInfoBarView @JvmOverloads constructor(
|
|||||||
invalidate()
|
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)
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -3,6 +3,7 @@ package org.koitharu.kotatsu.utils.ext
|
|||||||
import android.app.Activity
|
import android.app.Activity
|
||||||
import android.graphics.Rect
|
import android.graphics.Rect
|
||||||
import android.view.View
|
import android.view.View
|
||||||
|
import android.view.View.MeasureSpec
|
||||||
import android.view.ViewGroup
|
import android.view.ViewGroup
|
||||||
import android.view.ViewParent
|
import android.view.ViewParent
|
||||||
import android.view.inputmethod.InputMethodManager
|
import android.view.inputmethod.InputMethodManager
|
||||||
@@ -167,3 +168,19 @@ val View.parents: Sequence<ViewParent>
|
|||||||
p = p.parent
|
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
|
||||||
|
}
|
||||||
|
|||||||
@@ -28,9 +28,9 @@
|
|||||||
<org.koitharu.kotatsu.reader.ui.ReaderInfoBarView
|
<org.koitharu.kotatsu.reader.ui.ReaderInfoBarView
|
||||||
android:id="@+id/infoBar"
|
android:id="@+id/infoBar"
|
||||||
android:layout_width="match_parent"
|
android:layout_width="match_parent"
|
||||||
android:layout_height="16dp"
|
android:layout_height="wrap_content"
|
||||||
android:layout_gravity="top"
|
android:layout_gravity="top"
|
||||||
android:paddingHorizontal="4dp"
|
android:minHeight="12sp"
|
||||||
android:visibility="gone"
|
android:visibility="gone"
|
||||||
tools:visibility="visible" />
|
tools:visibility="visible" />
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user