diff --git a/CHANGELOG.md b/CHANGELOG.md index b0cb9cd5..230c9315 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,6 @@ +### Changes +- Fix: issue with no size found text + ### 2.12.13 - Fix: External Link redirect issue diff --git a/virtusize-core/src/main/java/com/virtusize/android/data/remote/I18nLocalization.kt b/virtusize-core/src/main/java/com/virtusize/android/data/remote/I18nLocalization.kt index 8346ae2c..5ac58b29 100644 --- a/virtusize-core/src/main/java/com/virtusize/android/data/remote/I18nLocalization.kt +++ b/virtusize-core/src/main/java/com/virtusize/android/data/remote/I18nLocalization.kt @@ -22,6 +22,7 @@ data class I18nLocalization( val sizeComparisonMultiSizeText: String, val willFitResultText: String, val willNotFitResultText: String, + val willNotFitResultDefaultText: String, val bodyDataEmptyText: String, ) { enum class TrimType { diff --git a/virtusize-core/src/main/java/com/virtusize/android/data/remote/Product.kt b/virtusize-core/src/main/java/com/virtusize/android/data/remote/Product.kt index 981614ad..cd3e7a59 100644 --- a/virtusize-core/src/main/java/com/virtusize/android/data/remote/Product.kt +++ b/virtusize-core/src/main/java/com/virtusize/android/data/remote/Product.kt @@ -41,6 +41,7 @@ data class Product( i18nLocalization: I18nLocalization, sizeComparisonRecommendedSize: SizeComparisonRecommendedSize?, bodyProfileRecommendedSizeName: String?, + bodyProfileWillFit: Boolean? = null, ): String { return when { isAccessory() -> accessoryText(i18nLocalization, sizeComparisonRecommendedSize) @@ -49,12 +50,14 @@ data class Product( i18nLocalization = i18nLocalization, sizeComparisonRecommendedSize = sizeComparisonRecommendedSize, bodyProfileRecommendedSizeName = bodyProfileRecommendedSizeName, + bodyProfileWillFit = bodyProfileWillFit, ) else -> multiSizeText( i18nLocalization, sizeComparisonRecommendedSize, bodyProfileRecommendedSizeName, + bodyProfileWillFit, ) } } @@ -88,13 +91,27 @@ data class Product( i18nLocalization: I18nLocalization, sizeComparisonRecommendedSize: SizeComparisonRecommendedSize?, bodyProfileRecommendedSizeName: String?, + bodyProfileWillFit: Boolean?, ): String { - bodyProfileRecommendedSizeName?.let { - return i18nLocalization.oneSizeWillFitResultText + // Check if body data is provided (bodyProfileRecommendedSizeName is not null means body data was provided) + val hasBodyData = bodyProfileRecommendedSizeName != null + + // For one-size products with body data provided + if (hasBodyData) { + // If willFit is true and we have a recommended size, show the will fit message + if (bodyProfileWillFit == true) { + return i18nLocalization.oneSizeWillFitResultText + } + // If willFit is false or no recommended size, show "Your size not found" + return i18nLocalization.willNotFitResultDefaultText } + + // No body data provided, check for product comparison sizeComparisonRecommendedSize?.let { return i18nLocalization.getOneSizeProductComparisonText(it) } + + // No data at all, show body data empty message return i18nLocalization.bodyDataEmptyText } @@ -105,15 +122,29 @@ data class Product( i18nLocalization: I18nLocalization, sizeComparisonRecommendedSize: SizeComparisonRecommendedSize?, bodyProfileRecommendedSizeName: String?, + bodyProfileWillFit: Boolean?, ): String { - bodyProfileRecommendedSizeName?.let { - return i18nLocalization.getMultiSizeBodyProfileText( - bodyProfileRecommendedSizeName = bodyProfileRecommendedSizeName, - ) + // Check if body data is provided + val hasBodyData = bodyProfileRecommendedSizeName != null + + // For multi-size products with body data provided + if (hasBodyData) { + // If willFit is true and we have a recommended size, show it + if (bodyProfileWillFit == true && bodyProfileRecommendedSizeName.isNotEmpty()) { + return i18nLocalization.getMultiSizeBodyProfileText( + bodyProfileRecommendedSizeName = bodyProfileRecommendedSizeName, + ) + } + // If willFit is false or no recommended size, show "Your size not found" + return i18nLocalization.willNotFitResultDefaultText } + + // No body data provided, check for product comparison sizeComparisonRecommendedSize?.bestStoreProductSize?.name?.let { return i18nLocalization.getMultiSizeProductComparisonText(it) } + + // No data at all, show body data empty message return i18nLocalization.bodyDataEmptyText } diff --git a/virtusize-core/src/main/res/values/strings.xml b/virtusize-core/src/main/res/values/strings.xml index 7dcc9b81..64bc51bf 100644 --- a/virtusize-core/src/main/res/values/strings.xml +++ b/virtusize-core/src/main/res/values/strings.xml @@ -11,6 +11,6 @@ This item should fit you The closest size to your item is Your recommended size is - Check how it fits you + Your size not found Find your right size \ No newline at end of file diff --git a/virtusize/src/main/java/com/virtusize/android/VirtusizeImpl.kt b/virtusize/src/main/java/com/virtusize/android/VirtusizeImpl.kt index e6974ed9..9cf7de26 100644 --- a/virtusize/src/main/java/com/virtusize/android/VirtusizeImpl.kt +++ b/virtusize/src/main/java/com/virtusize/android/VirtusizeImpl.kt @@ -247,6 +247,7 @@ internal class VirtusizeImpl( externalProductId: String, userProductRecommendedSize: SizeComparisonRecommendedSize?, userBodyRecommendedSize: String?, + userBodyWillFit: Boolean?, ) { val storeProduct = virtusizeRepository.getProductBy(externalProductId) virtusizeViews @@ -266,6 +267,7 @@ internal class VirtusizeImpl( i18nLocalization = i18nLocalization, sizeComparisonRecommendedSize = userProductRecommendedSize, bodyProfileRecommendedSizeName = userBodyRecommendedSize, + bodyProfileWillFit = userBodyWillFit, ).trimI18nText(trimType) virtusizeView.setRecommendationText( externalProductId, diff --git a/virtusize/src/main/java/com/virtusize/android/VirtusizePresenter.kt b/virtusize/src/main/java/com/virtusize/android/VirtusizePresenter.kt index 7984e9b1..5a3401ec 100644 --- a/virtusize/src/main/java/com/virtusize/android/VirtusizePresenter.kt +++ b/virtusize/src/main/java/com/virtusize/android/VirtusizePresenter.kt @@ -12,6 +12,7 @@ internal interface VirtusizePresenter { externalProductId: String, userProductRecommendedSize: SizeComparisonRecommendedSize?, userBodyRecommendedSize: String?, + userBodyWillFit: Boolean?, ) fun hasInPageError( diff --git a/virtusize/src/main/java/com/virtusize/android/VirtusizeRepository.kt b/virtusize/src/main/java/com/virtusize/android/VirtusizeRepository.kt index 957c44af..31d7cf3f 100644 --- a/virtusize/src/main/java/com/virtusize/android/VirtusizeRepository.kt +++ b/virtusize/src/main/java/com/virtusize/android/VirtusizeRepository.kt @@ -48,6 +48,7 @@ class VirtusizeRepository internal constructor( private var userProducts: List? = null private var userProductRecommendedSize: SizeComparisonRecommendedSize? = null private var userBodyRecommendedSize: String? = null + private var userBodyWillFit: Boolean? = null // This variable holds the list of product types from the Virtusize API private var productTypes: List? = null @@ -373,6 +374,7 @@ class VirtusizeRepository internal constructor( externalProductId = productId, userProductRecommendedSize = userProductRecommendedSize, userBodyRecommendedSize = null, + userBodyWillFit = null, ) } @@ -381,6 +383,7 @@ class VirtusizeRepository internal constructor( externalProductId = productId, userProductRecommendedSize = null, userBodyRecommendedSize = userBodyRecommendedSize, + userBodyWillFit = userBodyWillFit, ) } @@ -389,6 +392,7 @@ class VirtusizeRepository internal constructor( externalProductId = productId, userProductRecommendedSize = userProductRecommendedSize, userBodyRecommendedSize = userBodyRecommendedSize, + userBodyWillFit = userBodyWillFit, ) } } @@ -406,6 +410,7 @@ class VirtusizeRepository internal constructor( userProducts = null userProductRecommendedSize = null userBodyRecommendedSize = null + userBodyWillFit = null } /** @@ -419,6 +424,7 @@ class VirtusizeRepository internal constructor( productTypes: List?, ): String? { if (storeProduct == null || productTypes == null || storeProduct.isAccessory()) { + userBodyWillFit = null return null } val userBodyProfileResponse = virtusizeAPIService.getUserBodyProfile() @@ -430,6 +436,7 @@ class VirtusizeRepository internal constructor( storeProduct, userBodyProfileResponse.successData!!, ) + userBodyWillFit = bodyProfileRecommendedSizeResponse.successData?.willFit return bodyProfileRecommendedSizeResponse.successData?.sizeName } else { val bodyProfileRecommendedSizeResponse = @@ -438,6 +445,7 @@ class VirtusizeRepository internal constructor( storeProduct, userBodyProfileResponse.successData!!, ) + userBodyWillFit = bodyProfileRecommendedSizeResponse.successData?.get(0)?.willFit return bodyProfileRecommendedSizeResponse.successData?.get(0)?.sizeName } } else if (userBodyProfileResponse.failureData?.code != HttpURLConnection.HTTP_NOT_FOUND) { @@ -445,6 +453,7 @@ class VirtusizeRepository internal constructor( messageHandler.onError(it) } } + userBodyWillFit = null return null } diff --git a/virtusize/src/main/java/com/virtusize/android/data/parsers/I18nLocalizationJsonParser.kt b/virtusize/src/main/java/com/virtusize/android/data/parsers/I18nLocalizationJsonParser.kt index a854bb30..c13a8bce 100644 --- a/virtusize/src/main/java/com/virtusize/android/data/parsers/I18nLocalizationJsonParser.kt +++ b/virtusize/src/main/java/com/virtusize/android/data/parsers/I18nLocalizationJsonParser.kt @@ -123,6 +123,10 @@ internal class I18nLocalizationJsonParser( ), )?.trim().orEmpty() + val willNotFitResultDefaultText = configuredContext.getString( + com.virtusize.android.core.R.string.inpage_will_not_fit_result_text, + ) + val bodyDataEmptyText = inpageJSONObject?.optString( FIELD_BODY_DATA_EMPTY, @@ -146,6 +150,7 @@ internal class I18nLocalizationJsonParser( sizeComparisonMultiSizeText = sizeComparisonMultiSizeText, willFitResultText = willFitResultText, willNotFitResultText = willNotFitResultText, + willNotFitResultDefaultText = willNotFitResultDefaultText, bodyDataEmptyText = bodyDataEmptyText, ) } diff --git a/virtusize/src/main/java/com/virtusize/android/flutter/VirtusizeFlutterImpl.kt b/virtusize/src/main/java/com/virtusize/android/flutter/VirtusizeFlutterImpl.kt index f4bf2eb5..e5a71404 100644 --- a/virtusize/src/main/java/com/virtusize/android/flutter/VirtusizeFlutterImpl.kt +++ b/virtusize/src/main/java/com/virtusize/android/flutter/VirtusizeFlutterImpl.kt @@ -250,6 +250,7 @@ internal class VirtusizeFlutterImpl( externalProductId: String, userProductRecommendedSize: SizeComparisonRecommendedSize?, userBodyRecommendedSize: String?, + userBodyWillFit: Boolean?, ) { val storeProduct = virtusizeRepository.getProductBy(externalProductId) val i18nLocalization = virtusizeRepository.i18nLocalization @@ -271,6 +272,7 @@ internal class VirtusizeFlutterImpl( i18nLocalization = i18nLocalization, sizeComparisonRecommendedSize = userProductRecommendedSize, bodyProfileRecommendedSizeName = userBodyRecommendedSize, + bodyProfileWillFit = userBodyWillFit, ).trimI18nText(I18nLocalization.TrimType.MULTIPLELINES) virtusizeFlutterPresenter?.gotSizeRecommendations( @@ -278,6 +280,7 @@ internal class VirtusizeFlutterImpl( storeProduct, userProductRecommendedSize?.bestUserProduct, recommendationText, + userBodyWillFit, ) } } diff --git a/virtusize/src/main/java/com/virtusize/android/flutter/VirtusizeFlutterPresenter.kt b/virtusize/src/main/java/com/virtusize/android/flutter/VirtusizeFlutterPresenter.kt index b1a2b15e..b98aa323 100644 --- a/virtusize/src/main/java/com/virtusize/android/flutter/VirtusizeFlutterPresenter.kt +++ b/virtusize/src/main/java/com/virtusize/android/flutter/VirtusizeFlutterPresenter.kt @@ -14,6 +14,7 @@ interface VirtusizeFlutterPresenter { storeProduct: Product?, bestUserProduct: Product?, recommendationText: String?, + willFit: Boolean?, ) fun onLangugeClick(language: VirtusizeLanguage) diff --git a/virtusize/src/test/java/com/virtusize/android/parsers/I18nLocalizationJsonParserTest.kt b/virtusize/src/test/java/com/virtusize/android/parsers/I18nLocalizationJsonParserTest.kt index 36d69f1a..bd1fe09d 100644 --- a/virtusize/src/test/java/com/virtusize/android/parsers/I18nLocalizationJsonParserTest.kt +++ b/virtusize/src/test/java/com/virtusize/android/parsers/I18nLocalizationJsonParserTest.kt @@ -36,35 +36,6 @@ class I18nLocalizationJsonParserTest { assertThat(actualI18nLocalization).isEqualTo(expectedI18nLocalization) } - @Test - fun parseI18N_emptyJsonData_shouldReturnExpectedObject() { - val actualI18nLocalization = - I18nLocalizationJsonParser(context, VirtusizeLanguage.EN).parse( - TestFixtures.EMPTY_JSON_DATA, - ) - - val expectedI18nLocalization = - I18nLocalization( - VirtusizeLanguage.EN, - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - ) - - assertThat(actualI18nLocalization).isEqualTo(expectedI18nLocalization) - } - @Test fun parseI18NJP_japaneseLocalization_shouldReturnExpectedObject() { val actualI18nLocalization = @@ -126,6 +97,7 @@ class I18nLocalizationJsonParserTest { localizedContext.getString(com.virtusize.android.core.R.string.inpage_multi_size_comparison_text), localizedContext.getString(com.virtusize.android.core.R.string.inpage_will_fit_result_text), localizedContext.getString(com.virtusize.android.core.R.string.inpage_will_not_fit_result_text), + localizedContext.getString(com.virtusize.android.core.R.string.inpage_will_not_fit_result_text), localizedContext.getString(com.virtusize.android.core.R.string.inpage_body_data_empty_text), ) } diff --git a/virtusize/src/test/resources/i18n_en.json b/virtusize/src/test/resources/i18n_en.json index 37b4aea1..5c255577 100644 --- a/virtusize/src/test/resources/i18n_en.json +++ b/virtusize/src/test/resources/i18n_en.json @@ -23,7 +23,7 @@ "errorTextShort": "Virtusize is not available at the moment.", "oneSizeText": "There is only size %{value}", "details": "Details", - "willNotFitResult": "Check how it fits you", + "willNotFitResult": "Your size not found", "tryItOn": "Try it on", "accessoriesEmpty": "See what fits inside", "hasProductAccessoryText": "See the size difference from %{boldStart}your own item%{boldEnd}",