From e774a3c389d564f51547fa9a6c23e093fe376659 Mon Sep 17 00:00:00 2001 From: Srushti Date: Thu, 11 Apr 2024 12:43:10 +0200 Subject: [PATCH 1/2] MainScreen search tags composable + tests --- .../compose/components/MainScreenTagsTest.kt | 40 ++++++++ .../echo/ExcludeFromJacocoGeneratedReport.kt | 5 + .../components/MainscreenTagsFilter.kt | 99 +++++++++++++++++++ 3 files changed, 144 insertions(+) create mode 100644 app/src/androidTest/java/com/github/swent/echo/compose/components/MainScreenTagsTest.kt create mode 100644 app/src/main/java/com/github/swent/echo/ExcludeFromJacocoGeneratedReport.kt create mode 100644 app/src/main/java/com/github/swent/echo/compose/components/MainscreenTagsFilter.kt diff --git a/app/src/androidTest/java/com/github/swent/echo/compose/components/MainScreenTagsTest.kt b/app/src/androidTest/java/com/github/swent/echo/compose/components/MainScreenTagsTest.kt new file mode 100644 index 000000000..cffbf0d6b --- /dev/null +++ b/app/src/androidTest/java/com/github/swent/echo/compose/components/MainScreenTagsTest.kt @@ -0,0 +1,40 @@ +package com.github.swent.echo.compose.components + +import androidx.compose.ui.test.junit4.createComposeRule +import androidx.compose.ui.test.onNodeWithText +import androidx.compose.ui.test.performClick +import androidx.test.ext.junit.runners.AndroidJUnit4 +import com.github.swent.echo.data.model.Tag +import org.junit.Before +import org.junit.Rule +import org.junit.Test +import org.junit.runner.RunWith + +@RunWith(AndroidJUnit4::class) +class MainScreenTagsTest { + @get:Rule val composeTestRule = createComposeRule() + private var tagClicked: Tag? = null + + @Before + fun setUp() { + tagClicked = null + } + + @Test + fun showTagText() { + val tagList = listOf(Tag("Tag1", "Sports"), Tag("Tag2", "Music")) + composeTestRule.setContent { TagUI(tags = tagList, null) {} } + composeTestRule.onNodeWithText("Sports").assertExists() + composeTestRule.onNodeWithText("Music").assertExists() + } + + @Test + fun clickTag() { + val tagList = listOf(Tag("Tag1", "Sports"), Tag("Tag2", "Music")) + composeTestRule.setContent { TagUI(tags = tagList, null) { tagClicked = it } } + composeTestRule.onNodeWithText("Sports").performClick() + assert(tagClicked != null && tagClicked!!.name == "Sports") + composeTestRule.onNodeWithText("Music").performClick() + assert(tagClicked != null && tagClicked!!.name == "Music") + } +} diff --git a/app/src/main/java/com/github/swent/echo/ExcludeFromJacocoGeneratedReport.kt b/app/src/main/java/com/github/swent/echo/ExcludeFromJacocoGeneratedReport.kt new file mode 100644 index 000000000..e351cade0 --- /dev/null +++ b/app/src/main/java/com/github/swent/echo/ExcludeFromJacocoGeneratedReport.kt @@ -0,0 +1,5 @@ +package com.github.swent.echo + +@Retention(AnnotationRetention.RUNTIME) +@Target(AnnotationTarget.FUNCTION) +internal annotation class ExcludeFromJacocoGeneratedReport diff --git a/app/src/main/java/com/github/swent/echo/compose/components/MainscreenTagsFilter.kt b/app/src/main/java/com/github/swent/echo/compose/components/MainscreenTagsFilter.kt new file mode 100644 index 000000000..5d7c7470f --- /dev/null +++ b/app/src/main/java/com/github/swent/echo/compose/components/MainscreenTagsFilter.kt @@ -0,0 +1,99 @@ +@file:JvmName("MainScreenTagsFilterKt") + +package com.github.swent.echo.compose.components + +import androidx.compose.foundation.layout.Arrangement +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.PaddingValues +import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.lazy.LazyRow +import androidx.compose.foundation.lazy.items +import androidx.compose.foundation.lazy.rememberLazyListState +import androidx.compose.material3.ButtonDefaults +import androidx.compose.material3.FilledTonalButton +import androidx.compose.material3.MaterialTheme +import androidx.compose.material3.Text +import androidx.compose.runtime.Composable +import androidx.compose.runtime.getValue +import androidx.compose.runtime.mutableStateOf +import androidx.compose.runtime.remember +import androidx.compose.runtime.setValue +import androidx.compose.ui.Modifier +import androidx.compose.ui.tooling.preview.Preview +import androidx.compose.ui.unit.dp +import androidx.compose.ui.unit.sp +import com.github.swent.echo.ExcludeFromJacocoGeneratedReport +import com.github.swent.echo.data.model.Tag + +/* + * TagUI is a composable that displays a tag. + * tags: List of tags to display, fetch the most recent or the most common tags from the repository. + */ + +@Composable +fun TagUI(tags: List, selectedTagId: String?, onTagClick: (Tag) -> Unit) { + val lazyListState = rememberLazyListState() + var selectTag by remember { mutableStateOf(selectedTagId) } + + Column(modifier = Modifier.padding(top = 65.dp)) { + LazyRow( + modifier = Modifier.padding(8.dp), + state = lazyListState, + horizontalArrangement = Arrangement.spacedBy(8.dp) + ) { + items(tags) { tag -> + TagItem( + tag = tag, + isSelected = tag.tagId == selectTag, + onClick = { + selectTag = tag.tagId + onTagClick(tag) + } + ) + } + } + } +} + +/* + * TagItem is a composable that highlights the selected tag. + */ +@Composable +fun TagItem(tag: Tag, isSelected: Boolean, onClick: () -> Unit) { + val colors = MaterialTheme.colorScheme + val backgroundColor = if (isSelected) colors.primary else colors.inverseOnSurface + val contentColor = if (isSelected) colors.onPrimary else colors.onSurface + + FilledTonalButton( + onClick = onClick, + contentPadding = PaddingValues(0.dp), + colors = + ButtonDefaults.buttonColors( + containerColor = backgroundColor, + contentColor = contentColor, + ) + ) { + Text( + text = tag.name, + color = contentColor, + fontSize = 16.sp, + ) + } +} +// excluding this preview function +@ExcludeFromJacocoGeneratedReport +@Preview +@Composable +fun PreviewTagUI() { + val tags = + listOf( + Tag("SP", "Sports"), + Tag("MU", "Music"), + Tag("SO", "Social"), + Tag("AR", "Arts"), + Tag("GA", "Games"), + Tag("PO", "Politics"), + Tag("TE", "Tech") + ) + MaterialTheme { TagUI(tags = tags, null) {} } +} From 688f62cf02c6306be62087a6353c0d3603134ad6 Mon Sep 17 00:00:00 2001 From: Srushti Date: Fri, 12 Apr 2024 11:41:10 +0200 Subject: [PATCH 2/2] padding removed --- .../swent/echo/compose/components/MainscreenTagsFilter.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/java/com/github/swent/echo/compose/components/MainscreenTagsFilter.kt b/app/src/main/java/com/github/swent/echo/compose/components/MainscreenTagsFilter.kt index 5d7c7470f..80a7c5b15 100644 --- a/app/src/main/java/com/github/swent/echo/compose/components/MainscreenTagsFilter.kt +++ b/app/src/main/java/com/github/swent/echo/compose/components/MainscreenTagsFilter.kt @@ -35,7 +35,7 @@ fun TagUI(tags: List, selectedTagId: String?, onTagClick: (Tag) -> Unit) { val lazyListState = rememberLazyListState() var selectTag by remember { mutableStateOf(selectedTagId) } - Column(modifier = Modifier.padding(top = 65.dp)) { + Column(modifier = Modifier) { LazyRow( modifier = Modifier.padding(8.dp), state = lazyListState,