diff --git a/core/src/main/java/com/alamkanak/weekview/CanvasExtensions.kt b/core/src/main/java/com/alamkanak/weekview/CanvasExtensions.kt index aa976c3b..4e2ded51 100644 --- a/core/src/main/java/com/alamkanak/weekview/CanvasExtensions.kt +++ b/core/src/main/java/com/alamkanak/weekview/CanvasExtensions.kt @@ -16,6 +16,19 @@ internal fun Canvas.draw(staticLayout: StaticLayout) { staticLayout.draw(this) } +internal fun Canvas.drawRtl(staticLayout: StaticLayout) { + staticLayout.text.split("\n").forEachIndexed { index, text -> + val textPaint = staticLayout.paint + val xPos: Int = staticLayout.width / 2 + drawText( + text, + xPos.toFloat(), + ((staticLayout.height / 2) * (index + 1) - (textPaint.descent() + textPaint.ascent()) / 2), + textPaint + ) + } +} + internal fun Canvas.drawVerticalLine( horizontalOffset: Float, startY: Float, diff --git a/core/src/main/java/com/alamkanak/weekview/EventChipDrawer.kt b/core/src/main/java/com/alamkanak/weekview/EventChipDrawer.kt index af0bf156..62c16c2b 100644 --- a/core/src/main/java/com/alamkanak/weekview/EventChipDrawer.kt +++ b/core/src/main/java/com/alamkanak/weekview/EventChipDrawer.kt @@ -137,11 +137,7 @@ internal class EventChipDrawer( ) { val bounds = eventChip.bounds - val horizontalOffset = if (viewState.isLtr) { - bounds.left + viewState.eventPaddingHorizontal - } else { - bounds.right - viewState.eventPaddingHorizontal - } + val horizontalOffset = bounds.left + viewState.eventPaddingHorizontal val verticalOffset = if (eventChip.event.isAllDay) { (bounds.height() - textLayout.height) / 2f diff --git a/core/src/main/java/com/alamkanak/weekview/HeaderRenderer.kt b/core/src/main/java/com/alamkanak/weekview/HeaderRenderer.kt index 211aebe1..cf4ddbfd 100644 --- a/core/src/main/java/com/alamkanak/weekview/HeaderRenderer.kt +++ b/core/src/main/java/com/alamkanak/weekview/HeaderRenderer.kt @@ -173,11 +173,16 @@ private class DateLabelsDrawer( val key = date.toEpochDays() val textLayout = dateLabelLayouts[key] + val offset = if (textLayout.text.toString().isArabic()) 0f else viewState.dayWidth / 2f withTranslation( - x = startPixel + viewState.dayWidth / 2f, + x = startPixel + offset, y = viewState.headerPadding, ) { - draw(textLayout) + if (textLayout.text.toString().isArabic()) { + drawRtl(textLayout) + } else { + draw(textLayout) + } } } } diff --git a/core/src/main/java/com/alamkanak/weekview/TextExtensions.kt b/core/src/main/java/com/alamkanak/weekview/TextExtensions.kt index 23f460d8..bd2c4710 100644 --- a/core/src/main/java/com/alamkanak/weekview/TextExtensions.kt +++ b/core/src/main/java/com/alamkanak/weekview/TextExtensions.kt @@ -43,7 +43,7 @@ internal fun CharSequence.semibold() = SpannableString(this).apply { internal fun ViewState.getTextPaint(event: ResolvedWeekViewEntity): TextPaint { val textPaint = TextPaint(if (event.isAllDay) allDayEventTextPaint else eventTextPaint) - textPaint.textAlign = if (isLtr) Paint.Align.LEFT else Paint.Align.RIGHT + textPaint.textAlign = Paint.Align.LEFT val textColor = event.style.textColor if (textColor != null) { @@ -51,3 +51,13 @@ internal fun ViewState.getTextPaint(event: ResolvedWeekViewEntity): TextPaint { } return textPaint } + +internal fun String.isArabic(): Boolean { + var i = 0 + while (i < this.length) { + val c = this.codePointAt(i) + if (c in 0x0600..0x06E0) return true + i += Character.charCount(c) + } + return false +} diff --git a/core/src/main/java/com/alamkanak/weekview/TimeColumnRenderer.kt b/core/src/main/java/com/alamkanak/weekview/TimeColumnRenderer.kt index d7b2cc25..2e76611a 100644 --- a/core/src/main/java/com/alamkanak/weekview/TimeColumnRenderer.kt +++ b/core/src/main/java/com/alamkanak/weekview/TimeColumnRenderer.kt @@ -1,6 +1,7 @@ package com.alamkanak.weekview import android.graphics.Canvas +import android.text.Layout import android.text.StaticLayout import android.util.SparseArray @@ -89,7 +90,8 @@ internal class TimeColumnRenderer( val textLayouts = mutableListOf() for (hour in displayedHours) { - val textLayout = timeFormatter(hour).toTextLayout(timeColumnTextPaint, width = Int.MAX_VALUE) + val alignment = if (timeFormatter(hour).isArabic()) Layout.Alignment.ALIGN_OPPOSITE else Layout.Alignment.ALIGN_NORMAL + val textLayout = timeFormatter(hour).toTextLayout(timeColumnTextPaint, width = Int.MAX_VALUE, alignment = alignment) textLayouts += textLayout timeLabelLayouts.put(hour, textLayout) }