Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 3 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,3 +1,6 @@
### Next release
- Feature: Add event listener to handle language change on web in Virtusize widgets

### 2.12.3
- Fix: Align mobile SDK size recommendation API requests with web implementation

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,8 @@ enum class EventName(val value: String) {
UserLoggedOut("user-logged-out"),
UserDeletedData("user-deleted-data"),
UserClosedWidget("user-closed-widget"),
UssrClickedStart("user-clicked-start"),
UserClickedStart("user-clicked-start"),
UserClickedLanguageSelector("user-clicked-language"),
;

companion object {
Expand Down Expand Up @@ -93,8 +94,12 @@ sealed interface VirtusizeEvent {
override val name: String = EventName.UserClosedWidget.value
}

data class UssrClickedStart(override val data: JSONObject? = null) : VirtusizeEvent {
override val name: String = EventName.UssrClickedStart.value
data class UserClickedStart(override val data: JSONObject? = null) : VirtusizeEvent {
override val name: String = EventName.UserClickedStart.value
}

data class UserClickedLanguageSelector(override val data: JSONObject? = null) : VirtusizeEvent {
override val name: String = EventName.UserClickedLanguageSelector.value
}

data class Undefined(override val name: String, override val data: JSONObject? = null) : VirtusizeEvent
Expand Down
6 changes: 6 additions & 0 deletions virtusize/src/main/java/com/virtusize/android/Virtusize.kt
Original file line number Diff line number Diff line change
Expand Up @@ -152,4 +152,10 @@ interface Virtusize {
onSuccess: SuccessResponseHandler? = null,
onError: ErrorResponseHandler? = null,
)

/**
* Sets the display language for the Virtusize widgets
* @param language the [VirtusizeLanguage] to be set
*/
fun setVsWidgetLanguage(language: VirtusizeLanguage)
}
38 changes: 37 additions & 1 deletion virtusize/src/main/java/com/virtusize/android/VirtusizeImpl.kt
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@ import com.virtusize.android.data.local.throwError
import com.virtusize.android.data.remote.I18nLocalization
import com.virtusize.android.network.VirtusizeAPIService
import com.virtusize.android.network.VirtusizeApi
import com.virtusize.android.ui.VirtusizeButton
import com.virtusize.android.ui.VirtusizeInPageStandard
import com.virtusize.android.ui.VirtusizeInPageView
import com.virtusize.android.ui.VirtusizeView
Expand Down Expand Up @@ -163,10 +164,19 @@ internal class VirtusizeImpl(
virtusizeRepository.updateUserSession()
}

is VirtusizeEvent.UserClickedLanguageSelector -> {
event.data?.optString("language")?.let { language ->
val virtusizeLanguage = VirtusizeLanguage.entries.firstOrNull { it.value == language }
if (virtusizeLanguage != null) {
setVsWidgetLanguage(virtusizeLanguage)
}
}
}

is VirtusizeEvent.UserCreatedSilhouette,
is VirtusizeEvent.UserSawProduct,
is VirtusizeEvent.UserSawWidgetButton,
is VirtusizeEvent.UssrClickedStart,
is VirtusizeEvent.UserClickedStart,
is VirtusizeEvent.Undefined,
-> Unit
}
Expand Down Expand Up @@ -392,6 +402,32 @@ internal class VirtusizeImpl(
}
}

/**
* @see Virtusize.setVsWidgetLanguage
*/
override fun setVsWidgetLanguage(language: VirtusizeLanguage) {
virtusizeViews
.filterIsInstance<VirtusizeButton>()
.forEach { virtusizeView ->
virtusizeView.setLanguage(language)
}

virtusizeViews
.filterIsInstance<VirtusizeInPageView>()
.forEach { virtusizeView ->
virtusizeView.setLanguage(language)
}

scope.launch {
virtusizeRepository.setVsWidgetLanguage(language)
virtusizeRepository.fetchDataForInPageRecommendation(
shouldUpdateUserProducts = false,
shouldUpdateBodyProfile = true,
)
virtusizeRepository.updateInPageRecommendation()
}
}

/**
* Returns a boolean value to tell whether the VirtusizeView array contains at least one VirtusizeInPageView
*/
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -239,6 +239,17 @@ class VirtusizeRepository internal constructor(
i18nLocalization = i18n
}

/**
* Sets the display language for the Virtusize widgets
* @param language the display language set by a client
*/
internal suspend fun setVsWidgetLanguage(language: VirtusizeLanguage) =
coroutineScope {
val languageDeferred = async { fetchLanguage(language) }
val i18n = languageDeferred.await() ?: return@coroutineScope
i18nLocalization = i18n
}

/**
* Updates the user session by calling the session API
* @param externalProductId the external product ID set by a client
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -37,6 +37,7 @@ private fun getVirtusizeEvent(
EventName.UserLoggedOut -> VirtusizeEvent.UserLoggedOut(data = json)
EventName.UserDeletedData -> VirtusizeEvent.UserDeletedData(data = json)
EventName.UserClosedWidget -> VirtusizeEvent.UserClosedWidget(data = json)
EventName.UssrClickedStart -> VirtusizeEvent.UssrClickedStart(data = json)
EventName.UserClickedStart -> VirtusizeEvent.UserClickedStart(data = json)
EventName.UserClickedLanguageSelector -> VirtusizeEvent.UserClickedLanguageSelector(data = json)
null -> VirtusizeEvent.Undefined(name = name, data = json)
}
Original file line number Diff line number Diff line change
Expand Up @@ -175,8 +175,9 @@ internal class VirtusizeFlutterImpl(
is VirtusizeEvent.UserCreatedSilhouette,
is VirtusizeEvent.UserSawProduct,
is VirtusizeEvent.UserSawWidgetButton,
is VirtusizeEvent.UssrClickedStart,
is VirtusizeEvent.UserClickedStart,
is VirtusizeEvent.Undefined,
is VirtusizeEvent.UserClickedLanguageSelector,
-> Unit
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@ import android.view.View
import androidx.appcompat.widget.AppCompatButton
import androidx.core.content.ContextCompat
import com.virtusize.android.R
import com.virtusize.android.data.local.VirtusizeLanguage
import com.virtusize.android.data.local.VirtusizeMessageHandler
import com.virtusize.android.data.local.VirtusizeParams
import com.virtusize.android.data.local.VirtusizeProduct
Expand Down Expand Up @@ -126,24 +127,30 @@ class VirtusizeButton
if (clientProduct!!.externalId == productWithPDC.externalId) {
clientProduct!!.productCheckData = productWithPDC.productCheckData
visibility = View.VISIBLE
setupButtonTextConfiguredLocalization()
setupButtonTextConfiguredLocalization(virtusizeParams.language)
setOnClickListener {
openVirtusizeWebView(context, clientProduct!!)
}
}
}

/**
* Sets the language for the view and updates all texts accordingly
* @param language the selected VirtusizeLanguage
*/
internal fun setLanguage(language: VirtusizeLanguage) {
setupButtonTextConfiguredLocalization(language)
}

/**
* Sets up the button text style based on the language that clients set using the [VirtusizeBuilder] in the application
*/
private fun setupButtonTextConfiguredLocalization() {
private fun setupButtonTextConfiguredLocalization(language: VirtusizeLanguage) {
val configuredContext =
ConfigurationUtils.getConfiguredContext(context, virtusizeParams.language)
if (text.isNullOrEmpty()) {
text = configuredContext.getText(R.string.virtusize_button_text)
configuredContext.resources?.getDimension(R.dimen.virtusize_button_textSize)?.let {
setTextSize(TypedValue.COMPLEX_UNIT_PX, it)
}
ConfigurationUtils.getConfiguredContext(context, language)
text = configuredContext.getText(R.string.virtusize_button_text)
configuredContext.resources?.getDimension(R.dimen.virtusize_button_textSize)?.let {
setTextSize(TypedValue.COMPLEX_UNIT_PX, it)
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -134,6 +134,24 @@ class VirtusizeInPageMini
}
}

/**
* @see VirtusizeInPageView.setLanguage
*/
override fun setLanguage(language: VirtusizeLanguage) {
configuredContext = ConfigurationUtils.getConfiguredContext(context, language)
binding.inpageMiniButton.text = configuredContext?.getText(R.string.virtusize_button_text)
binding.inpageMiniLoadingText.text = configuredContext?.getText(R.string.inpage_loading_text)
setConfiguredDimensions()
binding.inpageMiniText.includeFontPadding = language == VirtusizeLanguage.JP
// Optionally update error text if visible
if (
binding.inpageMiniText.visibility == View.VISIBLE &&
binding.inpageMiniText.text == configuredContext?.getText(R.string.inpage_short_error_text)
) {
binding.inpageMiniText.text = configuredContext?.getText(R.string.inpage_short_error_text)
}
}

/**
* @see VirtusizeInPageView.setRecommendationText
*/
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -218,6 +218,23 @@ class VirtusizeInPageStandard
}
}

/**
* @see VirtusizeInPageView.setLanguage
*/
override fun setLanguage(language: VirtusizeLanguage) {
val configuredContext = ConfigurationUtils.getConfiguredContext(context, language)
binding.inpageButton.text =
configuredContext.getText(R.string.virtusize_button_text)
binding.privacyPolicyText.text =
configuredContext.getText(R.string.virtusize_privacy_policy)
binding.inpageLoadingText.text =
configuredContext.getText(R.string.inpage_loading_text)
binding.inpageErrorText.text =
configuredContext.getText(R.string.inpage_long_error_text)
setConfiguredDimensions(configuredContext)
binding.inpageBottomText.includeFontPadding = language == VirtusizeLanguage.JP
}

/**
* @see VirtusizeView.setProductWithProductCheckData
* @throws VirtusizeErrorType.NullProduct error
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ package com.virtusize.android.ui
import android.content.Context
import android.util.AttributeSet
import android.widget.RelativeLayout
import com.virtusize.android.data.local.VirtusizeLanguage

/**
* An abstract class representing the VirtusizeView that is a RelativeLayout
Expand Down Expand Up @@ -42,4 +43,10 @@ abstract class VirtusizeInPageView
* An abstract function to show the InPage error screen with the associated external product ID
*/
internal abstract fun showInPageError(externalProductId: String?)

/**
* Sets the language for the view and updates all texts accordingly
* @param language the selected VirtusizeLanguage
*/
internal abstract fun setLanguage(language: VirtusizeLanguage)
}
Original file line number Diff line number Diff line change
Expand Up @@ -325,7 +325,7 @@ class VirtusizeWebViewFragment : DialogFragment() {
event?.let { virtusizeMessageHandler?.onEvent(clientProduct, it) }
when (event) {
is VirtusizeEvent.UserClosedWidget -> dismiss()
is VirtusizeEvent.UssrClickedStart -> userAcceptedPrivacyPolicy()
is VirtusizeEvent.UserClickedStart -> userAcceptedPrivacyPolicy()
else -> Unit
}
}
Expand Down