diff --git a/android/app-newm/build.gradle.kts b/android/app-newm/build.gradle.kts index 7ceb1261..f710eced 100644 --- a/android/app-newm/build.gradle.kts +++ b/android/app-newm/build.gradle.kts @@ -154,19 +154,22 @@ fun getCurrentDateTimeVersionCode(): Int { /** * Generates a custom version name based on the provided major version and the current date and time. * - * The version name follows the format: `major.YYYY.MMDDHHmm`, where: + * The version name follows the format: `major.yyMMdd.HHmm`, where: * - `major`: The major version number passed as a parameter. - * - `YYYY`: The current year. - * - `MMDD`: The current month and day. - * - `HHmm`: The current hour and minute. + * - `yy`: The current two-digit year. + * - `MMdd`: The current month and day. + * - `HH`: The current hour in 24-hour format. + * - `mm`: The current minute. * * The function retrieves the current date and time using `SimpleDateFormat` to format each component. * + * Example output for `major = 1` on October 1st, 2024 at 13:45 would be: `1.241001.1345`. + * * @param major The major version number to be used as the first part of the version name. - * @return A custom version name string in the format: `major.YYYY.MMDDHHmm`. + * @return A custom version name string in the format: `major.yyMMdd.HHmm`. */ fun getCustomVersionName(major: Int): String { - val yearFormat = SimpleDateFormat("yyyy") + val yearFormat = SimpleDateFormat("yy") val monthDayFormat = SimpleDateFormat("MMdd") val hourFormat = SimpleDateFormat("HH") val minuteFormat = SimpleDateFormat("mm") @@ -176,5 +179,5 @@ fun getCustomVersionName(major: Int): String { val hour = hourFormat.format(Date()) val minute = minuteFormat.format(Date()) - return "$major.$year.$monthDay$hour$minute" + return "$major.$year$monthDay.$hour$minute" } \ No newline at end of file diff --git a/android/app-newm/src/main/java/io/newm/screens/Screen.kt b/android/app-newm/src/main/java/io/newm/screens/Screen.kt index 3830ff30..f9a9cb89 100644 --- a/android/app-newm/src/main/java/io/newm/screens/Screen.kt +++ b/android/app-newm/src/main/java/io/newm/screens/Screen.kt @@ -20,14 +20,14 @@ sealed class Screen(val screenName: String) : CircuitScreen { data object ForceAppUpdate : Screen(screenName = AppScreens.ForceUpdateScreen.name) - data object TermsAndConditions : Screen(screenName = AppScreens.TermsAndConditionsScreen.name), WebBrowserScreen { + data object TermsOfService : Screen(screenName = AppScreens.TermsOfServiceScreen.name), WebBrowserScreen { @IgnoredOnParcel - override val url: String = "https://newm.io/terms-and-conditions" + override val url: String = "https://newm.io/app-tos" } data object PrivacyPolicy : Screen(screenName = AppScreens.PrivacyPolicyScreen.name), WebBrowserScreen { @IgnoredOnParcel - override val url: String = "https://newm.io/privacy-policy" + override val url: String = "https://newm.io/app-privacy" } } diff --git a/android/app-newm/src/main/java/io/newm/screens/library/NFTLibraryPresenter.kt b/android/app-newm/src/main/java/io/newm/screens/library/NFTLibraryPresenter.kt index 1e0f3854..ccf6cd70 100644 --- a/android/app-newm/src/main/java/io/newm/screens/library/NFTLibraryPresenter.kt +++ b/android/app-newm/src/main/java/io/newm/screens/library/NFTLibraryPresenter.kt @@ -63,13 +63,8 @@ class NFTLibraryPresenter( } }.collectAsRetainedState(initial = emptyList()) - val streamTracks by remember(isWalletConnected) { - if (isWalletConnected == true) { - walletNFTTracksUseCase.getAllStreamTokensFlow() - } else { - flowOf() - } - }.collectAsRetainedState(initial = emptyList()) + // Do not show stream tokens in the library + val streamTracks = emptyList() var filters: NFTLibraryFilters by rememberRetained { mutableStateOf( diff --git a/android/app-newm/src/main/java/io/newm/screens/library/screens/LinkWalletScreen.kt b/android/app-newm/src/main/java/io/newm/screens/library/screens/LinkWalletScreen.kt index 184b7dbd..7821bc05 100644 --- a/android/app-newm/src/main/java/io/newm/screens/library/screens/LinkWalletScreen.kt +++ b/android/app-newm/src/main/java/io/newm/screens/library/screens/LinkWalletScreen.kt @@ -8,16 +8,31 @@ import android.widget.Toast import androidx.activity.compose.rememberLauncherForActivityResult import androidx.activity.result.ActivityResult import androidx.activity.result.contract.ActivityResultContracts +import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.Box +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.Spacer import androidx.compose.foundation.layout.defaultMinSize +import androidx.compose.foundation.layout.fillMaxSize +import androidx.compose.foundation.layout.height import androidx.compose.foundation.layout.padding +import androidx.compose.material.MaterialTheme +import androidx.compose.material.Text import androidx.compose.runtime.Composable import androidx.compose.runtime.LaunchedEffect import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.platform.testTag +import androidx.compose.ui.res.stringResource +import androidx.compose.ui.text.font.FontWeight +import androidx.compose.ui.text.style.TextAlign import androidx.compose.ui.unit.dp +import androidx.compose.ui.unit.sp +import io.newm.core.resources.R +import io.newm.core.theme.GraySuit +import io.newm.core.theme.White +import io.newm.core.theme.inter import io.newm.core.ui.permissions.AppPermission import io.newm.core.ui.permissions.doWithPermission import io.newm.core.ui.permissions.rememberRequestPermissionIntent @@ -39,8 +54,10 @@ fun LinkWalletScreen( // Handle the returned result here val data = result.data // Do something with the data - val newmWalletConnectionId = data?.getStringExtra(BarcodeScannerActivity.NEWM_WALLET_CONNECTION_ID).orEmpty() - Toast.makeText(context, "Wallet connected $newmWalletConnectionId", Toast.LENGTH_SHORT).show() + val newmWalletConnectionId = + data?.getStringExtra(BarcodeScannerActivity.NEWM_WALLET_CONNECTION_ID).orEmpty() + Toast.makeText(context, "Wallet connected $newmWalletConnectionId", Toast.LENGTH_SHORT) + .show() onConnectWallet(newmWalletConnectionId) } } @@ -70,17 +87,43 @@ fun LinkWalletScreen( .padding(vertical = 16.dp) .defaultMinSize(minHeight = 200.dp) .testTag(TAG_NFT_LIBRARY_SCREEN), - contentAlignment = Alignment.BottomCenter + contentAlignment = Alignment.Center ) { - ConnectWalletPanel(onButtonClick = { - context.run { - doWithPermission( - onGranted = { onRequestPermissionGranted.invoke() }, - requestPermissionLauncher = requestPermission, - appPermission = AppPermission.CAMERA - ) - } - }) + Column( + modifier = modifier.fillMaxSize(), + verticalArrangement = Arrangement.Center, + horizontalAlignment = Alignment.CenterHorizontally + ) { + Spacer(modifier = Modifier.weight(1f)) + Text( + text = stringResource(id = R.string.welcome_to_newm), + textAlign = TextAlign.Center, + fontFamily = inter, + fontWeight = FontWeight.Bold, + fontSize = 24.sp, + color = White + ) + Spacer(modifier = Modifier.height(8.dp)) + Text( + text = stringResource(id = R.string.library_no_wallet_connected_subtitle), + textAlign = TextAlign.Center, + fontFamily = inter, + fontWeight = FontWeight.Normal, + fontSize = 14.sp, + color = GraySuit + ) + Spacer(modifier = Modifier.weight(1f)) + + ConnectWalletPanel(onButtonClick = { + context.run { + doWithPermission( + onGranted = { onRequestPermissionGranted.invoke() }, + requestPermissionLauncher = requestPermission, + appPermission = AppPermission.CAMERA + ) + } + }) + } } } diff --git a/android/app-newm/src/main/java/io/newm/screens/profile/edit/ProfileEditPresenter.kt b/android/app-newm/src/main/java/io/newm/screens/profile/edit/ProfileEditPresenter.kt index 5099a3df..b083822f 100644 --- a/android/app-newm/src/main/java/io/newm/screens/profile/edit/ProfileEditPresenter.kt +++ b/android/app-newm/src/main/java/io/newm/screens/profile/edit/ProfileEditPresenter.kt @@ -14,7 +14,7 @@ import io.newm.feature.login.screen.TextFieldState import io.newm.feature.login.screen.password.isPasswordValid import io.newm.feature.login.screen.password.passwordValidationError import io.newm.screens.Screen.PrivacyPolicy -import io.newm.screens.Screen.TermsAndConditions +import io.newm.screens.Screen.TermsOfService import io.newm.screens.profile.OnBack import io.newm.screens.profile.OnConnectWallet import io.newm.screens.profile.OnLogout @@ -169,7 +169,7 @@ class ProfileEditPresenter( } OnShowTermsAndConditions -> { eventLogger.logClickEvent(AppScreens.AccountScreen.TERMS_AND_CONDITIONS_BUTTON) - navigator.goTo(TermsAndConditions) + navigator.goTo(TermsOfService) } OnShowPrivacyPolicy -> { eventLogger.logClickEvent(AppScreens.AccountScreen.PRIVACY_POLICY_BUTTON) diff --git a/android/app-newm/src/main/java/io/newm/screens/profile/view/ProfilePresenter.kt b/android/app-newm/src/main/java/io/newm/screens/profile/view/ProfilePresenter.kt index b740e273..263a5124 100644 --- a/android/app-newm/src/main/java/io/newm/screens/profile/view/ProfilePresenter.kt +++ b/android/app-newm/src/main/java/io/newm/screens/profile/view/ProfilePresenter.kt @@ -11,7 +11,7 @@ import com.slack.circuit.runtime.presenter.Presenter import io.newm.Logout import io.newm.screens.Screen.EditProfile import io.newm.screens.Screen.PrivacyPolicy -import io.newm.screens.Screen.TermsAndConditions +import io.newm.screens.Screen.TermsOfService import io.newm.screens.profile.OnConnectWallet import io.newm.screens.profile.OnDisconnectWallet import io.newm.screens.profile.OnEditProfile @@ -82,7 +82,7 @@ class ProfilePresenter( } OnShowTermsAndConditions -> { eventLogger.logClickEvent(AppScreens.AccountScreen.TERMS_AND_CONDITIONS_BUTTON) - navigator.goTo(TermsAndConditions) + navigator.goTo(TermsOfService) } OnShowPrivacyPolicy -> { eventLogger.logClickEvent(AppScreens.AccountScreen.PRIVACY_POLICY_BUTTON) diff --git a/android/core/resources/src/main/res/values/strings.xml b/android/core/resources/src/main/res/values/strings.xml index 4e181b3d..aa599bcd 100644 --- a/android/core/resources/src/main/res/values/strings.xml +++ b/android/core/resources/src/main/res/values/strings.xml @@ -32,6 +32,7 @@ Your library is empty. Filter Songs Under 30 seconds + Get started by connecting your Cardano wallet to unlock your NFT music library! 🎶 Search Artist (A to Z) Length (Shortest to Longest) diff --git a/android/core/ui-utils/src/main/java/io/newm/core/ui/PrivacyPolicyAndTermsSection.kt b/android/core/ui-utils/src/main/java/io/newm/core/ui/PrivacyPolicyAndTermsSection.kt new file mode 100644 index 00000000..45cc2f66 --- /dev/null +++ b/android/core/ui-utils/src/main/java/io/newm/core/ui/PrivacyPolicyAndTermsSection.kt @@ -0,0 +1,66 @@ +package io.newm.core.ui + +import androidx.compose.foundation.text.ClickableText +import androidx.compose.material.MaterialTheme +import androidx.compose.runtime.Composable +import androidx.compose.ui.Modifier +import androidx.compose.ui.text.SpanStyle +import androidx.compose.ui.text.buildAnnotatedString +import androidx.compose.ui.text.style.TextDecoration +import androidx.compose.ui.text.withStyle +import androidx.compose.ui.unit.sp + +@Composable +fun PrivacyPolicyAndTermsSection( + modifier: Modifier = Modifier, + onPrivacyPolicyClicked: () -> Unit, + onTermsOfServiceClicked: () -> Unit +) { + val annotatedText = buildAnnotatedString { + append("By continuing, I agree to NEWM's\n") + + pushStringAnnotation(tag = "privacy", annotation = "privacy_policy") + withStyle( + style = SpanStyle( + color = MaterialTheme.colors.primary, + textDecoration = TextDecoration.Underline + ) + ) { + append("Privacy Policy") + } + pop() + + append(" and ") + + pushStringAnnotation(tag = "terms", annotation = "terms_of_service") + withStyle( + style = SpanStyle( + color = MaterialTheme.colors.primary, + textDecoration = TextDecoration.Underline + ) + ) { + append("Terms of Service") + } + pop() + } + + ClickableText( + text = annotatedText, + style = MaterialTheme.typography.body2.copy( + fontSize = 12.sp, + color = MaterialTheme.colors.onBackground + ), + modifier = modifier, + onClick = { offset -> + annotatedText.getStringAnnotations(tag = "privacy", start = offset, end = offset) + .firstOrNull()?.let { + onPrivacyPolicyClicked() + } + + annotatedText.getStringAnnotations(tag = "terms", start = offset, end = offset) + .firstOrNull()?.let { + onTermsOfServiceClicked() + } + } + ) +} diff --git a/android/features/login/src/main/java/io/newm/feature/login/screen/welcome/WelcomeScreenPresenter.kt b/android/features/login/src/main/java/io/newm/feature/login/screen/welcome/WelcomeScreenPresenter.kt index 941af4c5..c38d382d 100644 --- a/android/features/login/src/main/java/io/newm/feature/login/screen/welcome/WelcomeScreenPresenter.kt +++ b/android/features/login/src/main/java/io/newm/feature/login/screen/welcome/WelcomeScreenPresenter.kt @@ -1,6 +1,8 @@ package io.newm.feature.login.screen.welcome +import android.content.Context import android.content.Intent +import android.net.Uri import android.util.Log import androidx.activity.compose.rememberLauncherForActivityResult import androidx.activity.result.ActivityResult @@ -11,6 +13,7 @@ import androidx.compose.runtime.getValue import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.remember import androidx.compose.runtime.setValue +import androidx.compose.ui.platform.LocalContext import com.google.android.gms.auth.api.signin.GoogleSignIn import com.google.android.gms.auth.api.signin.GoogleSignInAccount import com.google.android.gms.common.api.ApiException @@ -44,25 +47,42 @@ class WelcomeScreenPresenter( @Composable override fun present(): WelcomeScreenUiState { val launchGoogleSignIn = rememberGoogleSignInLauncher() - + val context = LocalContext.current return WelcomeScreenUiState { event -> when (event) { WelcomeScreenUiEvent.CreateAccountClicked -> { analyticsTracker.logClickEvent(AppScreens.WelcomeScreen.CREATE_ACCOUNT_BUTTON) navigator.goTo(CreateAccountScreen) } + WelcomeScreenUiEvent.LoginClicked -> { analyticsTracker.logClickEvent(AppScreens.WelcomeScreen.LOGIN_WITH_EMAIL_BUTTON) navigator.goTo(LoginScreen) } + WelcomeScreenUiEvent.OnGoogleSignInClicked -> { analyticsTracker.logClickEvent(AppScreens.WelcomeScreen.LOGIN_WITH_GOOGLE_BUTTON) launchGoogleSignIn() } + + WelcomeScreenUiEvent.OnTermsOfServiceClicked -> { + analyticsTracker.logClickEvent(AppScreens.AccountScreen.TERMS_AND_CONDITIONS_BUTTON) + context.launchUrl("https://newm.io/app-tos") + } + + WelcomeScreenUiEvent.OnPrivacyPolicyClicked -> { + analyticsTracker.logClickEvent(AppScreens.AccountScreen.PRIVACY_POLICY_BUTTON) + context.launchUrl("https://newm.io/app-privacy") + } } } } + private fun Context.launchUrl(url: String) { + val intent = Intent(Intent.ACTION_VIEW, Uri.parse(url)) + startActivity(intent) + } + @Composable private fun rememberGoogleSignInLauncher(): () -> Unit { var result by remember { mutableStateOf?>(null) } @@ -82,8 +102,8 @@ class WelcomeScreenPresenter( ) navigator.goTo(HomeScreen) }.onFailure { - Log.e("WelcomeScreenPresenter", "Recaptcha failed", it) - } + Log.e("WelcomeScreenPresenter", "Recaptcha failed", it) + } } catch (e: ApiException) { // The ApiException status code indicates the detailed failure reason. // Please refer to the GoogleSignInStatusCodes class reference for more information. diff --git a/android/features/login/src/main/java/io/newm/feature/login/screen/welcome/WelcomeScreenUi.kt b/android/features/login/src/main/java/io/newm/feature/login/screen/welcome/WelcomeScreenUi.kt index 31539c90..6601e795 100644 --- a/android/features/login/src/main/java/io/newm/feature/login/screen/welcome/WelcomeScreenUi.kt +++ b/android/features/login/src/main/java/io/newm/feature/login/screen/welcome/WelcomeScreenUi.kt @@ -2,6 +2,7 @@ package io.newm.feature.login.screen.welcome import androidx.compose.foundation.* import androidx.compose.foundation.layout.* +import androidx.compose.foundation.text.ClickableText import androidx.compose.material.MaterialTheme import androidx.compose.material.Text import androidx.compose.runtime.Composable @@ -9,13 +10,18 @@ import androidx.compose.runtime.LaunchedEffect import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.res.stringResource +import androidx.compose.ui.text.SpanStyle +import androidx.compose.ui.text.buildAnnotatedString import androidx.compose.ui.text.font.FontWeight +import androidx.compose.ui.text.style.TextDecoration +import androidx.compose.ui.text.withStyle import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.sp import io.newm.core.resources.R import io.newm.core.theme.NewmTheme import io.newm.core.theme.inter +import io.newm.core.ui.PrivacyPolicyAndTermsSection import io.newm.core.ui.buttons.PrimaryButton import io.newm.core.ui.buttons.SecondaryButton import io.newm.feature.login.screen.LoginPageMainImage @@ -81,10 +87,18 @@ fun WelcomeScreenUi( iconResId = R.drawable.ic_google_g ) } + + PrivacyPolicyAndTermsSection( + modifier = Modifier + .padding(vertical = 32.dp, horizontal = 16.dp), + onPrivacyPolicyClicked = { onEvent(WelcomeScreenUiEvent.OnPrivacyPolicyClicked) }, + onTermsOfServiceClicked = { onEvent(WelcomeScreenUiEvent.OnTermsOfServiceClicked) } + ) } } } + @Preview @Composable private fun DefaultLightWelcomePreview() { diff --git a/android/features/login/src/main/java/io/newm/feature/login/screen/welcome/WelcomeScreenUiEvent.kt b/android/features/login/src/main/java/io/newm/feature/login/screen/welcome/WelcomeScreenUiEvent.kt index b6038ce4..d49c2027 100644 --- a/android/features/login/src/main/java/io/newm/feature/login/screen/welcome/WelcomeScreenUiEvent.kt +++ b/android/features/login/src/main/java/io/newm/feature/login/screen/welcome/WelcomeScreenUiEvent.kt @@ -6,4 +6,6 @@ sealed interface WelcomeScreenUiEvent : CircuitUiEvent{ data object CreateAccountClicked : WelcomeScreenUiEvent data object LoginClicked : WelcomeScreenUiEvent data object OnGoogleSignInClicked : WelcomeScreenUiEvent + data object OnPrivacyPolicyClicked : WelcomeScreenUiEvent + data object OnTermsOfServiceClicked : WelcomeScreenUiEvent } diff --git a/android/features/login/src/test/snapshots/images/io.newm.feature.login.screen_WelcomeScreenTest_default[AccessibilityLight].png b/android/features/login/src/test/snapshots/images/io.newm.feature.login.screen_WelcomeScreenTest_default[AccessibilityLight].png index a9613126..dc1f2d23 100644 --- a/android/features/login/src/test/snapshots/images/io.newm.feature.login.screen_WelcomeScreenTest_default[AccessibilityLight].png +++ b/android/features/login/src/test/snapshots/images/io.newm.feature.login.screen_WelcomeScreenTest_default[AccessibilityLight].png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:8852fc35b411b41a2924f9d111697be856c3cf25cf7c1b7e5ac838e20a7ff982 -size 85017 +oid sha256:4e4b7fe84ed32bf8ae091f145d19084e5fb2f9e2a231d7f75a2758a8bede8f65 +size 93335 diff --git a/android/features/login/src/test/snapshots/images/io.newm.feature.login.screen_WelcomeScreenTest_default[NormalDark].png b/android/features/login/src/test/snapshots/images/io.newm.feature.login.screen_WelcomeScreenTest_default[NormalDark].png index f302046f..a6dceecd 100644 --- a/android/features/login/src/test/snapshots/images/io.newm.feature.login.screen_WelcomeScreenTest_default[NormalDark].png +++ b/android/features/login/src/test/snapshots/images/io.newm.feature.login.screen_WelcomeScreenTest_default[NormalDark].png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:7fad9dab62404329b73f5c5b00be8fc06c8592150f5db764ca6a9244f1047ad5 -size 40702 +oid sha256:94abdef4500d30990d36641af56a7dff137ff1566e0abcb59e5256596e0314d0 +size 47492 diff --git a/android/features/login/src/test/snapshots/images/io.newm.feature.login.screen_WelcomeScreenTest_default[NormalLight].png b/android/features/login/src/test/snapshots/images/io.newm.feature.login.screen_WelcomeScreenTest_default[NormalLight].png index 92c7c646..463c96aa 100644 --- a/android/features/login/src/test/snapshots/images/io.newm.feature.login.screen_WelcomeScreenTest_default[NormalLight].png +++ b/android/features/login/src/test/snapshots/images/io.newm.feature.login.screen_WelcomeScreenTest_default[NormalLight].png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:d3927bf9f03a1e1818c5b11327d49085639bda17b5207176e45e0e0c726cb3a2 -size 40166 +oid sha256:860454c3e11957af95d94b4654200b4f1ce1775c7e3a8d4002ba8433020d36ca +size 46662 diff --git a/shared/src/commonMain/kotlin/io.newm.shared/internal/implementations/ForceAppUpdateUseCaseImpl.kt b/shared/src/commonMain/kotlin/io.newm.shared/internal/implementations/ForceAppUpdateUseCaseImpl.kt index c966fe9f..4858f1a6 100644 --- a/shared/src/commonMain/kotlin/io.newm.shared/internal/implementations/ForceAppUpdateUseCaseImpl.kt +++ b/shared/src/commonMain/kotlin/io.newm.shared/internal/implementations/ForceAppUpdateUseCaseImpl.kt @@ -29,7 +29,7 @@ internal class ForceAppUpdateUseCaseImpl( ): Boolean { val mobileConfig = remoteConfigRepository.getMobileConfig(humanVerificationCode) return mobileConfig?.let { - VersionUtils.isVersionGreaterThan(minSupportedVersion(it), currentAppVersion) + VersionUtils.isUpgradeRequired(minSupportedVersion(it), currentAppVersion) } ?: false } diff --git a/shared/src/commonMain/kotlin/io.newm.shared/public/analytics/events/AppScreens.kt b/shared/src/commonMain/kotlin/io.newm.shared/public/analytics/events/AppScreens.kt index 5b71dc61..bb837c8f 100644 --- a/shared/src/commonMain/kotlin/io.newm.shared/public/analytics/events/AppScreens.kt +++ b/shared/src/commonMain/kotlin/io.newm.shared/public/analytics/events/AppScreens.kt @@ -111,8 +111,8 @@ object AppScreens { const val CONTINUE_BUTTON: String = "Continue" } - object TermsAndConditionsScreen : ScreenEvents { - override val name = "Terms And Conditions" + object TermsOfServiceScreen : ScreenEvents { + override val name = "Terms of Service" } object WalletInstructionsScreen : ScreenEvents { diff --git a/shared/src/commonMain/kotlin/io.newm.shared/utils/VersionUtils.kt b/shared/src/commonMain/kotlin/io.newm.shared/utils/VersionUtils.kt index 644e4845..a972845e 100644 --- a/shared/src/commonMain/kotlin/io.newm.shared/utils/VersionUtils.kt +++ b/shared/src/commonMain/kotlin/io.newm.shared/utils/VersionUtils.kt @@ -17,14 +17,14 @@ object VersionUtils { * - "1.0.0-alpha" < "1.0.0" * - "1.0.0-alpha" < "1.0.0-beta" * - * @param version1 The first semantic version string. - * @param version2 The second semantic version string. + * @param minSupportedAppVersion The first semantic version string. + * @param currentAppVersion The second semantic version string. * @return True if version1 is greater than version2, otherwise false. */ - fun isVersionGreaterThan(version1: String, version2: String): Boolean { + fun isUpgradeRequired(minSupportedAppVersion: String, currentAppVersion: String): Boolean { // Parse versions into main and pre-release parts - val mainAndPre1 = version1.split("-", limit = 2) - val mainAndPre2 = version2.split("-", limit = 2) + val mainAndPre1 = minSupportedAppVersion.split("-", limit = 2) + val mainAndPre2 = currentAppVersion.split("-", limit = 2) val mainParts1 = mainAndPre1[0].split(".").map { it.toInt() } val mainParts2 = mainAndPre2[0].split(".").map { it.toInt() } @@ -35,10 +35,10 @@ object VersionUtils { val extendedParts2 = mainParts2 + List(maxParts - mainParts2.size) { 0 } // Compare major, minor, and patch versions - extendedParts1.zip(extendedParts2).forEach { (v1, v2) -> + extendedParts1.zip(extendedParts2).forEach { (minVersion, currentVersion) -> when { - v1 > v2 -> return true - v1 < v2 -> return false + minVersion > currentVersion -> return true + minVersion < currentVersion -> return false } } diff --git a/shared/src/commonTest/kotlin/VersionUtilsTest.kt b/shared/src/commonTest/kotlin/VersionUtilsTest.kt index c69ca99e..9c6944fe 100644 --- a/shared/src/commonTest/kotlin/VersionUtilsTest.kt +++ b/shared/src/commonTest/kotlin/VersionUtilsTest.kt @@ -7,19 +7,19 @@ class VersionUtilsTest { @Test fun `test version comparison with pre-release versions`() { - assertFalse(VersionUtils.isVersionGreaterThan("1.0.0-alpha", "1.0.0-beta"), "1.0.0-alpha should not be greater than 1.0.0-beta") - assertTrue(VersionUtils.isVersionGreaterThan("1.0.0-beta", "1.0.0-alpha"), "1.0.0-beta should be greater than 1.0.0-alpha") - assertTrue(VersionUtils.isVersionGreaterThan("1.0.0", "1.0.0-alpha"), "1.0.0 should be greater than 1.0.0-alpha") - assertTrue(VersionUtils.isVersionGreaterThan("1.0.1", "1.0.0"), "1.0.1 should be greater than 1.0.0") + assertFalse(VersionUtils.isUpgradeRequired("1.0.0-alpha", "1.0.0-beta"), "1.0.0-alpha should not be greater than 1.0.0-beta") + assertTrue(VersionUtils.isUpgradeRequired("1.0.0-beta", "1.0.0-alpha"), "1.0.0-beta should be greater than 1.0.0-alpha") + assertTrue(VersionUtils.isUpgradeRequired("1.0.0", "1.0.0-alpha"), "1.0.0 should be greater than 1.0.0-alpha") + assertTrue(VersionUtils.isUpgradeRequired("1.0.1", "1.0.0"), "1.0.1 should be greater than 1.0.0") } @Test fun `test version comparison with same versions`() { - assertFalse(VersionUtils.isVersionGreaterThan("1.0.0", "1.0.0")) + assertFalse(VersionUtils.isUpgradeRequired("1.0.0", "1.0.0")) } @Test fun `test version comparison with major differences`() { - assertTrue(VersionUtils.isVersionGreaterThan("2.0.0", "1.9.9")) + assertTrue(VersionUtils.isUpgradeRequired("2.0.0", "1.9.9")) } } \ No newline at end of file