Skip to content

Commit 49ba2f5

Browse files
authored
Add RTL support (#59)
* [lib] add rtl support for vertical events * [lib] add rtl support for horizontal events * [lib] spotless fixes * [lib] add rtl support for extended vertical timeline * [sample] add previews for layout direction * [sample] add tests for rtl * [sample] add extended event tests for rtl * [sample] refactor * [ci] fix gradle cache key to avoid hashFiles failures in CI * [ci] bump checkout and java versions * [ci] bump java versions * [ci] code refactor * [gradle] add stability analyzer plugin * [ci] bump checkout to v6 * [ci] temp workaround for fail to hash files * Revert "[gradle] add stability analyzer plugin" This reverts commit 1280ff7.
1 parent ee7b41c commit 49ba2f5

File tree

7 files changed

+439
-58
lines changed

7 files changed

+439
-58
lines changed

.github/workflows/build.yml

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -17,12 +17,12 @@ jobs:
1717
runs-on: macos-latest
1818
steps:
1919
- name: Check out code
20-
uses: actions/checkout@v4.1.7
20+
uses: actions/checkout@v6
2121
- name: Set up JDK
22-
uses: actions/setup-java@v4.3.0
22+
uses: actions/setup-java@v5.0.0
2323
with:
24-
distribution: 'corretto'
25-
java-version: 17
24+
distribution: 'zulu'
25+
java-version: 21
2626
- name: spotless
2727
run: ./gradlew spotlessCheck
2828

@@ -46,7 +46,7 @@ jobs:
4646

4747
steps:
4848
- name: Checkout code
49-
uses: actions/checkout@v4.1.7
49+
uses: actions/checkout@v6
5050

5151
- name: Java and Gradle set up
5252
if: matrix.platform != 'ios'

.github/workflows/setup/java-setup/action.yml

Lines changed: 10 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -4,12 +4,12 @@ runs:
44
using: "composite"
55
steps:
66
# Setup java
7-
- name: Setup JDK 17
7+
- name: Setup JDK 21
88
id: setup_jdk
9-
uses: actions/setup-java@v4.3.0
9+
uses: actions/setup-java@v5.0.0
1010
with:
11-
distribution: "corretto"
12-
java-version: 17
11+
distribution: 'zulu'
12+
java-version: 21
1313

1414
# Grant execute permission for gradlew
1515
- name: Grant execute permission for gradlew
@@ -18,14 +18,18 @@ runs:
1818
run: chmod +x gradlew
1919

2020
# Caching gradle packages
21-
- uses: actions/cache@v3
21+
# TODO: remove temporary workaround after fixed
22+
# temporarily work around https://github.com/actions/runner-images/issues/13341
23+
# by disabling caching for macOS
24+
- if: ${{ runner.os != 'macOS' }}
25+
uses: actions/cache@v4
2226
name: Cache Gradle for quicker builds
2327
id: caching_gradle
2428
with:
2529
path: |
2630
~/.gradle/caches
2731
~/.gradle/wrapper
28-
key: ${{ runner.os }}-${{ hashFiles('**/*.gradle*') }}-${{ hashFiles('**/gradle/wrapper/gradle-wrapper.properties') }}-${{ hashFiles('**/buildSrc/**/*.kt') }}
32+
key: ${{ runner.os }}-gradle-${{ hashFiles('**/*.gradle*') }}
2933
restore-keys: |
3034
${{ runner.os }}-gradle-
3135

jetlime/src/androidTest/java/com/pushpal/jetlime/JetLimeColumnTest.kt

Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,10 +28,13 @@ import android.annotation.SuppressLint
2828
import androidx.compose.foundation.clickable
2929
import androidx.compose.foundation.layout.padding
3030
import androidx.compose.material3.Text
31+
import androidx.compose.runtime.CompositionLocalProvider
32+
import androidx.compose.runtime.ExperimentalComposeApi
3133
import androidx.compose.runtime.mutableStateListOf
3234
import androidx.compose.ui.Modifier
3335
import androidx.compose.ui.graphics.Color
3436
import androidx.compose.ui.graphics.SolidColor
37+
import androidx.compose.ui.platform.LocalLayoutDirection
3538
import androidx.compose.ui.platform.testTag
3639
import androidx.compose.ui.test.assertIsDisplayed
3740
import androidx.compose.ui.test.assertPositionInRootIsEqualTo
@@ -41,6 +44,7 @@ import androidx.compose.ui.test.onNodeWithTag
4144
import androidx.compose.ui.test.onNodeWithText
4245
import androidx.compose.ui.test.performClick
4346
import androidx.compose.ui.test.performScrollToNode
47+
import androidx.compose.ui.unit.LayoutDirection
4448
import androidx.compose.ui.unit.dp
4549
import androidx.test.ext.junit.runners.AndroidJUnit4
4650
import com.google.common.truth.Truth.assertThat
@@ -244,4 +248,54 @@ class JetLimeColumnTest {
244248
items.add("Another Item")
245249
composeTestRule.onNodeWithText("Another Item").assertIsDisplayed()
246250
}
251+
252+
@Test
253+
fun jetLimeColumn_ltr_contentIsVisible() {
254+
val itemsList = ItemsList(persistentListOf("Item 1", "Item 2", "Item 3"))
255+
256+
composeTestRule.setContent {
257+
CompositionLocalProvider(LocalLayoutDirection provides LayoutDirection.Ltr) {
258+
JetLimeColumn(
259+
itemsList = itemsList,
260+
itemContent = { _, item, pos ->
261+
JetLimeEvent(
262+
style = JetLimeEventDefaults.eventStyle(position = pos),
263+
) {
264+
Text(text = item, modifier = Modifier.testTag("ColumnItem_$item"))
265+
}
266+
},
267+
)
268+
}
269+
}
270+
271+
composeTestRule.onNodeWithTag("ColumnItem_Item 1").assertIsDisplayed()
272+
composeTestRule.onNodeWithTag("ColumnItem_Item 3").assertIsDisplayed()
273+
}
274+
275+
@OptIn(ExperimentalComposeApi::class)
276+
@Test
277+
fun jetLimeColumn_extendedEvent_rtl_contentsAreVisible() {
278+
val itemsList = ItemsList(persistentListOf("Item 1"))
279+
280+
composeTestRule.setContent {
281+
CompositionLocalProvider(LocalLayoutDirection provides LayoutDirection.Rtl) {
282+
JetLimeColumn(
283+
itemsList = itemsList,
284+
itemContent = { _, item, pos ->
285+
JetLimeExtendedEvent(
286+
style = JetLimeEventDefaults.eventStyle(position = pos),
287+
additionalContent = {
288+
Text(text = "Additional", modifier = Modifier.testTag("ExtendedAdditional"))
289+
},
290+
) {
291+
Text(text = item, modifier = Modifier.testTag("ExtendedMain"))
292+
}
293+
},
294+
)
295+
}
296+
}
297+
298+
composeTestRule.onNodeWithTag("ExtendedAdditional").assertIsDisplayed()
299+
composeTestRule.onNodeWithTag("ExtendedMain").assertIsDisplayed()
300+
}
247301
}

jetlime/src/androidTest/java/com/pushpal/jetlime/JetLimeRowTest.kt

Lines changed: 110 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,10 +28,13 @@ import android.annotation.SuppressLint
2828
import androidx.compose.foundation.clickable
2929
import androidx.compose.foundation.layout.padding
3030
import androidx.compose.material3.Text
31+
import androidx.compose.runtime.CompositionLocalProvider
32+
import androidx.compose.runtime.ExperimentalComposeApi
3133
import androidx.compose.runtime.mutableStateListOf
3234
import androidx.compose.ui.Modifier
3335
import androidx.compose.ui.graphics.Color
3436
import androidx.compose.ui.graphics.SolidColor
37+
import androidx.compose.ui.platform.LocalLayoutDirection
3538
import androidx.compose.ui.platform.testTag
3639
import androidx.compose.ui.test.assertIsDisplayed
3740
import androidx.compose.ui.test.assertPositionInRootIsEqualTo
@@ -41,6 +44,7 @@ import androidx.compose.ui.test.onNodeWithTag
4144
import androidx.compose.ui.test.onNodeWithText
4245
import androidx.compose.ui.test.performClick
4346
import androidx.compose.ui.test.performScrollToNode
47+
import androidx.compose.ui.unit.LayoutDirection
4448
import androidx.compose.ui.unit.dp
4549
import androidx.test.ext.junit.runners.AndroidJUnit4
4650
import com.google.common.truth.Truth.assertThat
@@ -244,4 +248,110 @@ class JetLimeRowTest {
244248
items.add("Another Item")
245249
composeTestRule.onNodeWithText("Another Item").assertIsDisplayed()
246250
}
251+
252+
@Test
253+
fun jetLimeRow_horizontalEvent_ltr_contentIsVisible() {
254+
val itemsList = ItemsList(persistentListOf("Item 1", "Item 2", "Item 3"))
255+
256+
composeTestRule.setContent {
257+
CompositionLocalProvider(LocalLayoutDirection provides LayoutDirection.Ltr) {
258+
JetLimeRow(
259+
itemsList = itemsList,
260+
itemContent = { _, item, pos ->
261+
JetLimeEvent(
262+
style = JetLimeEventDefaults.eventStyle(
263+
position = pos,
264+
pointPlacement = PointPlacement.CENTER,
265+
),
266+
) {
267+
Text(text = item, modifier = Modifier.testTag("RowItem_$item"))
268+
}
269+
},
270+
)
271+
}
272+
}
273+
274+
composeTestRule.onNodeWithTag("RowItem_Item 1").assertIsDisplayed()
275+
composeTestRule.onNodeWithTag("RowItem_Item 3").assertIsDisplayed()
276+
}
277+
278+
@Test
279+
fun jetLimeRow_horizontalEvent_rtl_contentIsVisible() {
280+
val itemsList = ItemsList(persistentListOf("Item 1", "Item 2", "Item 3"))
281+
282+
composeTestRule.setContent {
283+
CompositionLocalProvider(LocalLayoutDirection provides LayoutDirection.Rtl) {
284+
JetLimeRow(
285+
itemsList = itemsList,
286+
itemContent = { _, item, pos ->
287+
JetLimeEvent(
288+
style = JetLimeEventDefaults.eventStyle(
289+
position = pos,
290+
pointPlacement = PointPlacement.CENTER,
291+
),
292+
) {
293+
Text(text = item, modifier = Modifier.testTag("RowItem_$item"))
294+
}
295+
},
296+
)
297+
}
298+
}
299+
300+
composeTestRule.onNodeWithTag("RowItem_Item 1").assertIsDisplayed()
301+
composeTestRule.onNodeWithTag("RowItem_Item 3").assertIsDisplayed()
302+
}
303+
304+
@OptIn(ExperimentalComposeApi::class)
305+
@Test
306+
fun jetLimeExtendedEvent_ltr_contentsAreVisible() {
307+
val itemsList = ItemsList(persistentListOf("Item 1"))
308+
309+
composeTestRule.setContent {
310+
CompositionLocalProvider(LocalLayoutDirection provides LayoutDirection.Ltr) {
311+
JetLimeColumn(
312+
itemsList = itemsList,
313+
itemContent = { _, item, pos ->
314+
JetLimeExtendedEvent(
315+
style = JetLimeEventDefaults.eventStyle(position = pos),
316+
additionalContent = {
317+
Text(text = "Additional", modifier = Modifier.testTag("ExtendedAdditional_LTR"))
318+
},
319+
) {
320+
Text(text = item, modifier = Modifier.testTag("ExtendedMain_LTR"))
321+
}
322+
},
323+
)
324+
}
325+
}
326+
327+
composeTestRule.onNodeWithTag("ExtendedAdditional_LTR").assertIsDisplayed()
328+
composeTestRule.onNodeWithTag("ExtendedMain_LTR").assertIsDisplayed()
329+
}
330+
331+
@OptIn(ExperimentalComposeApi::class)
332+
@Test
333+
fun jetLimeExtendedEvent_rtl_contentsAreVisible() {
334+
val itemsList = ItemsList(persistentListOf("Item 1"))
335+
336+
composeTestRule.setContent {
337+
CompositionLocalProvider(LocalLayoutDirection provides LayoutDirection.Rtl) {
338+
JetLimeColumn(
339+
itemsList = itemsList,
340+
itemContent = { _, item, pos ->
341+
JetLimeExtendedEvent(
342+
style = JetLimeEventDefaults.eventStyle(position = pos),
343+
additionalContent = {
344+
Text(text = "Additional", modifier = Modifier.testTag("ExtendedAdditional_RTL"))
345+
},
346+
) {
347+
Text(text = item, modifier = Modifier.testTag("ExtendedMain_RTL"))
348+
}
349+
},
350+
)
351+
}
352+
}
353+
354+
composeTestRule.onNodeWithTag("ExtendedAdditional_RTL").assertIsDisplayed()
355+
composeTestRule.onNodeWithTag("ExtendedMain_RTL").assertIsDisplayed()
356+
}
247357
}

0 commit comments

Comments
 (0)