From 057a36b2a4cbe6ed4c084464b27293a604cce54b Mon Sep 17 00:00:00 2001 From: OleS Date: Tue, 23 Dec 2025 12:43:47 +0200 Subject: [PATCH 1/4] Fix: issue with no size found text fixed --- .../virtusize/android/data/remote/Product.kt | 43 ++++++++++++++++--- .../com/virtusize/android/VirtusizeImpl.kt | 2 + .../virtusize/android/VirtusizePresenter.kt | 1 + .../virtusize/android/VirtusizeRepository.kt | 9 ++++ .../android/flutter/VirtusizeFlutterImpl.kt | 3 ++ .../flutter/VirtusizeFlutterPresenter.kt | 1 + 6 files changed, 53 insertions(+), 6 deletions(-) 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..9e63a4ff 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.willNotFitResultText } + + // 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.willNotFitResultText } + + // 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/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/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) From f0b4a49e830fae085e9e566302f12ed0d0b0c9a1 Mon Sep 17 00:00:00 2001 From: OleS Date: Tue, 23 Dec 2025 14:49:51 +0200 Subject: [PATCH 2/4] Fixed recomended text on size update --- virtusize-core/src/main/res/values/strings.xml | 2 +- .../android/data/parsers/I18nLocalizationJsonParser.kt | 10 +++------- virtusize/src/test/resources/i18n_en.json | 2 +- 3 files changed, 5 insertions(+), 9 deletions(-) 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/data/parsers/I18nLocalizationJsonParser.kt b/virtusize/src/main/java/com/virtusize/android/data/parsers/I18nLocalizationJsonParser.kt index a854bb30..d3519358 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 @@ -115,13 +115,9 @@ internal class I18nLocalizationJsonParser( ), )?.trim().orEmpty() - val willNotFitResultText = - inpageJSONObject?.optString( - FIELD_WILL_NOT_FIT_RESULT, - configuredContext.getString( - com.virtusize.android.core.R.string.inpage_will_not_fit_result_text, - ), - )?.trim().orEmpty() + val willNotFitResultText = configuredContext.getString( + com.virtusize.android.core.R.string.inpage_will_not_fit_result_text, + ) val bodyDataEmptyText = inpageJSONObject?.optString( 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}", From 4ee8bee4e40750808502adc600c4494943bd8bcc Mon Sep 17 00:00:00 2001 From: OleS Date: Tue, 23 Dec 2025 15:16:59 +0200 Subject: [PATCH 3/4] Update changelog --- CHANGELOG.md | 3 +++ 1 file changed, 3 insertions(+) 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 From 293ee266866d42d3f397c171137b182cd10f4617 Mon Sep 17 00:00:00 2001 From: OleS Date: Wed, 31 Dec 2025 01:39:29 +0200 Subject: [PATCH 4/4] Fixed unit tests --- .../android/data/remote/I18nLocalization.kt | 1 + .../virtusize/android/data/remote/Product.kt | 4 +-- .../parsers/I18nLocalizationJsonParser.kt | 11 ++++++- .../parsers/I18nLocalizationJsonParserTest.kt | 30 +------------------ 4 files changed, 14 insertions(+), 32 deletions(-) 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 9e63a4ff..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 @@ -103,7 +103,7 @@ data class Product( return i18nLocalization.oneSizeWillFitResultText } // If willFit is false or no recommended size, show "Your size not found" - return i18nLocalization.willNotFitResultText + return i18nLocalization.willNotFitResultDefaultText } // No body data provided, check for product comparison @@ -136,7 +136,7 @@ data class Product( ) } // If willFit is false or no recommended size, show "Your size not found" - return i18nLocalization.willNotFitResultText + return i18nLocalization.willNotFitResultDefaultText } // No body data provided, check for product comparison 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 d3519358..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 @@ -115,7 +115,15 @@ internal class I18nLocalizationJsonParser( ), )?.trim().orEmpty() - val willNotFitResultText = configuredContext.getString( + val willNotFitResultText = + inpageJSONObject?.optString( + FIELD_WILL_NOT_FIT_RESULT, + configuredContext.getString( + com.virtusize.android.core.R.string.inpage_will_not_fit_result_text, + ), + )?.trim().orEmpty() + + val willNotFitResultDefaultText = configuredContext.getString( com.virtusize.android.core.R.string.inpage_will_not_fit_result_text, ) @@ -142,6 +150,7 @@ internal class I18nLocalizationJsonParser( sizeComparisonMultiSizeText = sizeComparisonMultiSizeText, willFitResultText = willFitResultText, willNotFitResultText = willNotFitResultText, + willNotFitResultDefaultText = willNotFitResultDefaultText, bodyDataEmptyText = bodyDataEmptyText, ) } 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), ) }