diff --git a/CHANGELOG.md b/CHANGELOG.md index b0cb9cd5..780274ea 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,7 @@ +### Changes +- Fix: issue with no size found text +- Fix: Virtusize button state when loading a new product + ### 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..2963b990 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 not explicitly false and we have a recommended size, show the will fit message + if (bodyProfileWillFit != false) { + 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 not explicitly false and we have a recommended size, show it + if (bodyProfileWillFit != false && 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-ja/strings.xml b/virtusize-core/src/main/res/values-ja/strings.xml index 708c4f88..748fea2d 100644 --- a/virtusize-core/src/main/res/values-ja/strings.xml +++ b/virtusize-core/src/main/res/values-ja/strings.xml @@ -12,5 +12,6 @@ あなたの服に近いサイズ あなたにフィットするサイズ 試着をおすすめします + 試着をおすすめします 簡単サイズチェック \ No newline at end of file diff --git a/virtusize-core/src/main/res/values-ko/strings.xml b/virtusize-core/src/main/res/values-ko/strings.xml index f54f0fe8..fdcee4a8 100644 --- a/virtusize-core/src/main/res/values-ko/strings.xml +++ b/virtusize-core/src/main/res/values-ko/strings.xml @@ -12,5 +12,6 @@ 가장 유사한 상품은 추천하는 사이즈는 당신에게 잘 맞는지 확인해 보세요 + 당신에게 잘 맞는지 확인해 보세요 당신에게 맞는 사이즈를 찾아보세요 \ No newline at end of file diff --git a/virtusize-core/src/main/res/values/strings.xml b/virtusize-core/src/main/res/values/strings.xml index 7dcc9b81..aefb11fc 100644 --- a/virtusize-core/src/main/res/values/strings.xml +++ b/virtusize-core/src/main/res/values/strings.xml @@ -11,6 +11,7 @@ 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 + Your size not found Find your right size \ No newline at end of file diff --git a/virtusize-core/src/test/java/com/virtusize/android/data/remote/ProductTest.kt b/virtusize-core/src/test/java/com/virtusize/android/data/remote/ProductTest.kt index 9871a9ea..3708bc4c 100644 --- a/virtusize-core/src/test/java/com/virtusize/android/data/remote/ProductTest.kt +++ b/virtusize-core/src/test/java/com/virtusize/android/data/remote/ProductTest.kt @@ -41,6 +41,7 @@ class ProductTest { sizeComparisonMultiSizeText = context.getString(R.string.inpage_multi_size_comparison_text), willFitResultText = context.getString(R.string.inpage_will_fit_result_text), willNotFitResultText = context.getString(R.string.inpage_will_not_fit_result_text), + willNotFitResultDefaultText = context.getString(R.string.inpage_will_not_fit_result_default_text), bodyDataEmptyText = context.getString(R.string.inpage_body_data_empty_text), ) } 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..dac01bd3 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,11 @@ 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 +151,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/main/java/com/virtusize/android/ui/VirtusizeInPageMini.kt b/virtusize/src/main/java/com/virtusize/android/ui/VirtusizeInPageMini.kt index f001887a..f7ac4114 100644 --- a/virtusize/src/main/java/com/virtusize/android/ui/VirtusizeInPageMini.kt +++ b/virtusize/src/main/java/com/virtusize/android/ui/VirtusizeInPageMini.kt @@ -114,6 +114,21 @@ class VirtusizeInPageMini imageLoader.enqueue(request) } + /** + * @see VirtusizeView.initialSetup + */ + override fun initialSetup( + product: VirtusizeProduct, + params: VirtusizeParams, + messageHandler: VirtusizeMessageHandler, + ) { + super.initialSetup(product, params, messageHandler) + + // Reset root visibility when setting up a new product + // This ensures the view shows properly after switching from an invalid product + binding.root.visibility = View.VISIBLE + } + /** * @see VirtusizeView.setProductWithProductCheckData * @throws VirtusizeErrorType.NullProduct error diff --git a/virtusize/src/main/java/com/virtusize/android/ui/VirtusizeInPageStandard.kt b/virtusize/src/main/java/com/virtusize/android/ui/VirtusizeInPageStandard.kt index 2045bf3a..ef91042c 100644 --- a/virtusize/src/main/java/com/virtusize/android/ui/VirtusizeInPageStandard.kt +++ b/virtusize/src/main/java/com/virtusize/android/ui/VirtusizeInPageStandard.kt @@ -218,6 +218,10 @@ class VirtusizeInPageStandard }) } binding.privacyPolicyText.visibility = showPrivacyPolicy() + + // Reset root visibility when setting up a new product + // This ensures the view shows properly after switching from an invalid product + binding.root.visibility = View.VISIBLE } /** 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..3aa337a1 100644 --- a/virtusize/src/test/java/com/virtusize/android/parsers/I18nLocalizationJsonParserTest.kt +++ b/virtusize/src/test/java/com/virtusize/android/parsers/I18nLocalizationJsonParserTest.kt @@ -8,7 +8,6 @@ import com.google.common.truth.Truth.assertThat import com.virtusize.android.TestUtils import com.virtusize.android.data.local.VirtusizeLanguage import com.virtusize.android.data.remote.I18nLocalization -import com.virtusize.android.fixtures.TestFixtures import org.junit.Test import org.junit.runner.RunWith import org.robolectric.RobolectricTestRunner @@ -36,35 +35,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 +96,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}",