From 457cbdcb8b8c16a17347cec71140fefdd2d8d8b4 Mon Sep 17 00:00:00 2001 From: Antonio Corrales Date: Tue, 21 May 2024 16:31:21 +0200 Subject: [PATCH] - Repair bug in RTL text - Repair bug related session expired --- .idea/other.xml | 261 ++++++++++++++++++ presentation/build.gradle.kts | 10 + .../pagekeeper/extensions/StringExtensions.kt | 2 +- .../pagekeeper/ui/feed/FeedScreen.kt | 6 +- .../pagekeeper/ui/feed/FeedViewModel.kt | 5 +- .../ui/feed/item/FullBookmarkView.kt | 9 +- .../ui/feed/item/SmallBookmarkView.kt | 5 +- .../pagekeeper/ui/login/LoginViewModel.kt | 12 +- .../extensions/StringExtensionsKtTest.kt | 36 +++ 9 files changed, 327 insertions(+), 19 deletions(-) create mode 100644 presentation/src/test/java/com/desarrollodroide/pagekeeper/extensions/StringExtensionsKtTest.kt diff --git a/.idea/other.xml b/.idea/other.xml index f3d4a2e..be759a0 100644 --- a/.idea/other.xml +++ b/.idea/other.xml @@ -3,4 +3,265 @@ + + + \ No newline at end of file diff --git a/presentation/build.gradle.kts b/presentation/build.gradle.kts index 0d938dd..1acda55 100644 --- a/presentation/build.gradle.kts +++ b/presentation/build.gradle.kts @@ -1,6 +1,7 @@ plugins { id("com.android.application") id("org.jetbrains.kotlin.android") + id ("de.mannodermaus.android-junit5") } android { @@ -100,6 +101,15 @@ dependencies { implementation (libs.androidx.datastore.preferences) implementation (libs.coil.compose) + // Testing libraries + testImplementation(libs.junit.jupiter) // JUnit Jupiter for unit testing with JUnit 5. + testRuntimeOnly(libs.junit.jupiter.engine) // JUnit Jupiter Engine for running JUnit 5 tests. + testImplementation(libs.junit.jupiter.api) // JUnit Jupiter API for writing tests and extensions in JUnit 5. + testImplementation(libs.mockito.core) // Mockito for mocking objects in tests. + testImplementation(libs.mockito.kotlin) // Kotlin extension for Mockito to better support Kotlin features. + testImplementation(libs.kotlin.coroutines.test) // Coroutines Test library for testing Kotlin coroutines. + testImplementation(libs.kotlin.test.junit5) // Kotlin Test library for JUnit 5 support. + } java { diff --git a/presentation/src/main/java/com/desarrollodroide/pagekeeper/extensions/StringExtensions.kt b/presentation/src/main/java/com/desarrollodroide/pagekeeper/extensions/StringExtensions.kt index eb6ddd0..41a6f57 100644 --- a/presentation/src/main/java/com/desarrollodroide/pagekeeper/extensions/StringExtensions.kt +++ b/presentation/src/main/java/com/desarrollodroide/pagekeeper/extensions/StringExtensions.kt @@ -5,7 +5,7 @@ package com.desarrollodroide.pagekeeper.extensions * * @return True if the string contains more than half Arabic characters, false otherwise. */ -fun String.isArabicText(): Boolean { +fun String.isRTLText(): Boolean { // Take the first 20 characters of the string val textSample = this.take(20) diff --git a/presentation/src/main/java/com/desarrollodroide/pagekeeper/ui/feed/FeedScreen.kt b/presentation/src/main/java/com/desarrollodroide/pagekeeper/ui/feed/FeedScreen.kt index 8164a88..cf566f4 100644 --- a/presentation/src/main/java/com/desarrollodroide/pagekeeper/ui/feed/FeedScreen.kt +++ b/presentation/src/main/java/com/desarrollodroide/pagekeeper/ui/feed/FeedScreen.kt @@ -194,8 +194,10 @@ fun FeedScreen( content = bookmarksUiState.error, openDialog = remember { mutableStateOf(true) }, onConfirm = { - actions.onClearError() - actions.goToLogin.invoke() + if (bookmarksUiState.error == SESSION_HAS_BEEN_EXPIRED){ + actions.onClearError() + actions.goToLogin.invoke() + } }, properties = DialogProperties( dismissOnClickOutside = false, diff --git a/presentation/src/main/java/com/desarrollodroide/pagekeeper/ui/feed/FeedViewModel.kt b/presentation/src/main/java/com/desarrollodroide/pagekeeper/ui/feed/FeedViewModel.kt index f1f623e..0c5c1de 100644 --- a/presentation/src/main/java/com/desarrollodroide/pagekeeper/ui/feed/FeedViewModel.kt +++ b/presentation/src/main/java/com/desarrollodroide/pagekeeper/ui/feed/FeedViewModel.kt @@ -134,13 +134,10 @@ class FeedViewModel( when (result) { is Result.Error -> { Log.v("FeedViewModel", "Error getting tags: ${result.error?.message}") - _tagsState.error( - errorMessage = result.error?.message ?: "" - ) } is Result.Loading -> { - Log.v("FeedViewModel", "updating tags...") + Log.v("FeedViewModel", "Loading, updating tags from cache...") _tagsState.success(result.data) } diff --git a/presentation/src/main/java/com/desarrollodroide/pagekeeper/ui/feed/item/FullBookmarkView.kt b/presentation/src/main/java/com/desarrollodroide/pagekeeper/ui/feed/item/FullBookmarkView.kt index 740b04e..8fdbbde 100644 --- a/presentation/src/main/java/com/desarrollodroide/pagekeeper/ui/feed/item/FullBookmarkView.kt +++ b/presentation/src/main/java/com/desarrollodroide/pagekeeper/ui/feed/item/FullBookmarkView.kt @@ -21,7 +21,7 @@ import androidx.compose.ui.unit.LayoutDirection import androidx.compose.ui.unit.dp import com.desarrollodroide.data.extensions.removeTrailingSlash import com.desarrollodroide.model.Bookmark -import com.desarrollodroide.pagekeeper.extensions.isArabicText +import com.desarrollodroide.pagekeeper.extensions.isRTLText @Composable fun FullBookmarkView( @@ -32,7 +32,7 @@ fun FullBookmarkView( token: String, actions: BookmarkActions ) { - val isArabic = bookmark.title.isArabicText() || bookmark.excerpt.isArabicText() + val isArabic = bookmark.title.isRTLText() || bookmark.excerpt.isRTLText() val imageUrl = "${serverURL.removeTrailingSlash()}${bookmark.imageURL}?lastUpdated=${bookmark.modified}" Column { @@ -57,13 +57,16 @@ fun FullBookmarkView( ) { CompositionLocalProvider(LocalLayoutDirection provides if (isArabic) LayoutDirection.Rtl else LayoutDirection.Ltr) { Text( + modifier = Modifier.fillMaxWidth(), text = bookmark.title, style = MaterialTheme.typography.titleLarge, overflow = TextOverflow.Ellipsis, maxLines = 2 ) Text( - modifier = Modifier.padding(top = 5.dp), + modifier = Modifier + .fillMaxWidth() + .padding(top = 5.dp), text = bookmark.excerpt, style = MaterialTheme.typography.bodyMedium, color = MaterialTheme.colorScheme.secondary, diff --git a/presentation/src/main/java/com/desarrollodroide/pagekeeper/ui/feed/item/SmallBookmarkView.kt b/presentation/src/main/java/com/desarrollodroide/pagekeeper/ui/feed/item/SmallBookmarkView.kt index a1a1ede..cfc3735 100644 --- a/presentation/src/main/java/com/desarrollodroide/pagekeeper/ui/feed/item/SmallBookmarkView.kt +++ b/presentation/src/main/java/com/desarrollodroide/pagekeeper/ui/feed/item/SmallBookmarkView.kt @@ -12,7 +12,6 @@ import androidx.compose.foundation.layout.width import androidx.compose.foundation.layout.wrapContentHeight import androidx.compose.foundation.shape.RoundedCornerShape import androidx.compose.material.icons.Icons -import androidx.compose.material.icons.filled.CloudUpload import androidx.compose.material.icons.filled.MoreVert import androidx.compose.material.icons.outlined.CloudUpload import androidx.compose.material.icons.outlined.Delete @@ -41,7 +40,7 @@ import androidx.compose.ui.unit.dp import com.desarrollodroide.data.extensions.removeTrailingSlash import com.desarrollodroide.model.Bookmark import com.desarrollodroide.pagekeeper.R -import com.desarrollodroide.pagekeeper.extensions.isArabicText +import com.desarrollodroide.pagekeeper.extensions.isRTLText @Composable fun SmallBookmarkView( @@ -56,7 +55,7 @@ fun SmallBookmarkView( "${serverURL.removeTrailingSlash()}${bookmark.imageURL}?lastUpdated=${bookmark.modified}" val modifier = if (bookmark.imageURL.isNotEmpty()) Modifier.height(90.dp) else Modifier.wrapContentHeight() - val isArabic = bookmark.title.isArabicText() || bookmark.excerpt.isArabicText() + val isArabic = bookmark.title.isRTLText() || bookmark.excerpt.isRTLText() Row( modifier = modifier .padding(vertical = 8.dp) diff --git a/presentation/src/main/java/com/desarrollodroide/pagekeeper/ui/login/LoginViewModel.kt b/presentation/src/main/java/com/desarrollodroide/pagekeeper/ui/login/LoginViewModel.kt index 1c36300..9a120fb 100644 --- a/presentation/src/main/java/com/desarrollodroide/pagekeeper/ui/login/LoginViewModel.kt +++ b/presentation/src/main/java/com/desarrollodroide/pagekeeper/ui/login/LoginViewModel.kt @@ -35,13 +35,13 @@ class LoginViewModel( // var serverUrl = mutableStateOf("http://192.168.1.12:8080/") // Synology -// var userName = mutableStateOf("Test") -// var password = mutableStateOf("Test") -// var serverUrl = mutableStateOf("http://192.168.1.26:18080/") + var userName = mutableStateOf("Test") + var password = mutableStateOf("Test") + var serverUrl = mutableStateOf("http://192.168.1.68:18080/") - var serverUrl = mutableStateOf("") - var userName = mutableStateOf("") - var password = mutableStateOf("") +// var serverUrl = mutableStateOf("") +// var userName = mutableStateOf("") +// var password = mutableStateOf("") val userNameError = mutableStateOf(false) val passwordError = mutableStateOf(false) diff --git a/presentation/src/test/java/com/desarrollodroide/pagekeeper/extensions/StringExtensionsKtTest.kt b/presentation/src/test/java/com/desarrollodroide/pagekeeper/extensions/StringExtensionsKtTest.kt new file mode 100644 index 0000000..f61caf3 --- /dev/null +++ b/presentation/src/test/java/com/desarrollodroide/pagekeeper/extensions/StringExtensionsKtTest.kt @@ -0,0 +1,36 @@ +package com.desarrollodroide.pagekeeper.extensions + +import org.junit.jupiter.api.Assertions.* +import org.junit.jupiter.api.Test + +class StringExtensionsKtTest { + @Test + fun `isRTLText should return true for Arabic text`() { + val arabicText = "گروه هافلپاف" + assertTrue(arabicText.isRTLText()) + } + + @Test + fun `isRTLText should return false for non-Arabic text`() { + val nonArabicText = "Hello, World!" + assertFalse(nonArabicText.isRTLText()) + } + + @Test + fun `isRTLText should return true for mixed text with more than half Arabic characters`() { + val mixedText = "هذا نص عربي مع some English" + assertTrue(mixedText.isRTLText()) + } + + @Test + fun `isRTLText should return false for mixed text with less than half Arabic characters`() { + val mixedText = "This is some English with عربي قليل" + assertFalse(mixedText.isRTLText()) + } + + @Test + fun `isRTLText should work with empty string`() { + val emptyString = "" + assertFalse(emptyString.isRTLText()) + } +} \ No newline at end of file