From 5b7711e69c1a31a3eb1cb8138e0a836060e76863 Mon Sep 17 00:00:00 2001 From: "r.zarchi" Date: Sat, 4 Dec 2021 10:42:36 +0330 Subject: [PATCH 1/3] Set alignment for texts that contain RTL characters in TimeColumnRenderer --- .../main/java/com/alamkanak/weekview/TextExtensions.kt | 10 ++++++++++ .../java/com/alamkanak/weekview/TimeColumnRenderer.kt | 4 +++- 2 files changed, 13 insertions(+), 1 deletion(-) diff --git a/core/src/main/java/com/alamkanak/weekview/TextExtensions.kt b/core/src/main/java/com/alamkanak/weekview/TextExtensions.kt index 23f460d82..251613c9d 100644 --- a/core/src/main/java/com/alamkanak/weekview/TextExtensions.kt +++ b/core/src/main/java/com/alamkanak/weekview/TextExtensions.kt @@ -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 d7b2cc253..2e76611ac 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) } From 3911a49d81b68b09d18fb0e4cf3f7a9a9a6452ab Mon Sep 17 00:00:00 2001 From: "r.zarchi" Date: Wed, 19 Jan 2022 12:07:25 +0330 Subject: [PATCH 2/3] Text alignment fixed in RTL for Events (still we have problem with all-day events) --- .../src/main/java/com/alamkanak/weekview/EventChipDrawer.kt | 6 +----- core/src/main/java/com/alamkanak/weekview/TextExtensions.kt | 2 +- 2 files changed, 2 insertions(+), 6 deletions(-) diff --git a/core/src/main/java/com/alamkanak/weekview/EventChipDrawer.kt b/core/src/main/java/com/alamkanak/weekview/EventChipDrawer.kt index af0bf1564..62c16c2b7 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/TextExtensions.kt b/core/src/main/java/com/alamkanak/weekview/TextExtensions.kt index 251613c9d..bd2c4710a 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) { From d6be5dda094d7f7606ba067f4bd3ba7585e52897 Mon Sep 17 00:00:00 2001 From: "r.zarchi" Date: Wed, 19 Jan 2022 12:22:17 +0330 Subject: [PATCH 3/3] Alignment fixed for texts that contain RTL characters in HeaderRenderer --- .../java/com/alamkanak/weekview/CanvasExtensions.kt | 13 +++++++++++++ .../java/com/alamkanak/weekview/HeaderRenderer.kt | 9 +++++++-- 2 files changed, 20 insertions(+), 2 deletions(-) diff --git a/core/src/main/java/com/alamkanak/weekview/CanvasExtensions.kt b/core/src/main/java/com/alamkanak/weekview/CanvasExtensions.kt index aa976c3ba..4e2ded51b 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/HeaderRenderer.kt b/core/src/main/java/com/alamkanak/weekview/HeaderRenderer.kt index 211aebe14..cf4ddbfda 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) + } } } }