Skip to content

Commit

Permalink
Paywalls: new {{ sub_relative_discount }} variable
Browse files Browse the repository at this point in the history
  • Loading branch information
NachoSoto committed Nov 1, 2023
1 parent f75790a commit e04acf1
Show file tree
Hide file tree
Showing 5 changed files with 67 additions and 11 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -52,14 +52,21 @@ internal object PackageConfigurationFactory {
PackageType.UNKNOWN -> false
}

val discountRelativeToMostExpensivePerMonth = productDiscount(
it.product.pricePerMonth(),
mostExpensivePricePerMonth,
)
TemplateConfiguration.PackageInfo(
rcPackage = it,
localization = ProcessedLocalizedConfiguration.create(variableDataProvider, localization, it, locale),
currentlySubscribed = currentlySubscribed,
discountRelativeToMostExpensivePerMonth = productDiscount(
it.product.pricePerMonth(),
mostExpensivePricePerMonth,
localization = ProcessedLocalizedConfiguration.create(
variableDataProvider,
VariableProcessor.Context(discountRelativeToMostExpensivePerMonth),
localization,
it,
locale,
),
currentlySubscribed = currentlySubscribed,
discountRelativeToMostExpensivePerMonth = discountRelativeToMostExpensivePerMonth,
)
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -19,13 +19,15 @@ internal data class ProcessedLocalizedConfiguration(
companion object {
fun create(
variableDataProvider: VariableDataProvider,
context: VariableProcessor.Context,
localizedConfiguration: PaywallData.LocalizedConfiguration,
rcPackage: Package,
locale: Locale,
): ProcessedLocalizedConfiguration {
fun String.processVariables(): String {
return VariableProcessor.processVariables(
variableDataProvider,
context,
this,
rcPackage,
locale,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -95,6 +95,11 @@ internal class VariableDataProvider(
return "$pricePerPeriod ($pricePerMonth/$unit)"
}

@SuppressWarnings("MagicNumber")
fun localizedRelativeDiscount(discountRelativeToMostExpensivePerMonth: Double?): String? {
return applicationContext.localizedDiscount(discountRelativeToMostExpensivePerMonth)
}

private fun getFirstIntroOfferToApply(rcPackage: Package): PricingPhase? {
val option = rcPackage.product.defaultOption
return option?.freePhase ?: option?.introPhase
Expand All @@ -109,12 +114,18 @@ internal class VariableDataProvider(
}
}

@SuppressWarnings("MagicNumber")
internal fun TemplateConfiguration.PackageInfo.localizedDiscount(
applicationContext: ApplicationContext,
): String? {
return applicationContext.localizedDiscount(discountRelativeToMostExpensivePerMonth)
}

@SuppressWarnings("MagicNumber")
private fun ApplicationContext.localizedDiscount(
discountRelativeToMostExpensivePerMonth: Double?,
): String? {
return (discountRelativeToMostExpensivePerMonth?.times(100.0))?.roundToInt()?.let {
applicationContext.getString(R.string.package_discount, it)
getString(R.string.package_discount, it)
}
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,11 @@ import java.util.Locale
internal object VariableProcessor {
private val REGEX = Regex("\\{\\{\\s[a-zA-Z0-9_]+\\s\\}\\}")

/**
* Information necessary for computing variables.
*/
data class Context(val discountRelativeToMostExpensivePerMonth: Double?)

/**
* Returns a set of invalid variables in the String
*/
Expand All @@ -21,12 +26,13 @@ internal object VariableProcessor {

fun processVariables(
variableDataProvider: VariableDataProvider,
context: Context,
originalString: String,
rcPackage: Package,
locale: Locale,
): String {
val resultString = handleVariablesAndReplace(originalString) { variable ->
variableValue(variableDataProvider, variable, rcPackage, locale)
variableValue(variableDataProvider, context, variable, rcPackage, locale)
}
return resultString
}
Expand All @@ -49,6 +55,7 @@ internal object VariableProcessor {

private fun variableValue(
variableDataProvider: VariableDataProvider,
context: Context,
variableNameString: String,
rcPackage: Package,
locale: Locale,
Expand All @@ -58,7 +65,7 @@ internal object VariableProcessor {
Logger.e("Unknown variable: $variableNameString")
null
} else {
return processVariable(variableName, variableDataProvider, rcPackage, locale) ?: run {
return processVariable(variableName, variableDataProvider, context, rcPackage, locale) ?: run {
Logger.w(
"Could not process value for variable '$variableNameString' for " +
"package '${rcPackage.identifier}'. Please check that the product for that package matches " +
Expand All @@ -72,9 +79,10 @@ internal object VariableProcessor {
private fun processVariable(
variableName: VariableName,
variableDataProvider: VariableDataProvider,
context: Context,
rcPackage: Package,
locale: Locale,
) = when (variableName) {
): String? = when (variableName) {
VariableName.APP_NAME -> variableDataProvider.applicationName
VariableName.PRICE -> variableDataProvider.localizedPrice(rcPackage)
VariableName.PRICE_PER_PERIOD -> variableDataProvider.localizedPricePerPeriod(rcPackage, locale)
Expand All @@ -96,6 +104,9 @@ internal object VariableProcessor {
VariableName.SUB_OFFER_DURATION_2 -> variableDataProvider.secondIntroductoryOfferDuration(rcPackage, locale)
VariableName.SUB_OFFER_PRICE -> variableDataProvider.localizedFirstIntroductoryOfferPrice(rcPackage)
VariableName.SUB_OFFER_PRICE_2 -> variableDataProvider.localizedSecondIntroductoryOfferPrice(rcPackage)
VariableName.SUB_RELATIVE_DISCOUNT -> variableDataProvider.localizedRelativeDiscount(
context.discountRelativeToMostExpensivePerMonth,
)
}

private enum class VariableName(val identifier: String) {
Expand All @@ -112,6 +123,7 @@ internal object VariableProcessor {
SUB_OFFER_DURATION_2("sub_offer_duration_2"),
SUB_OFFER_PRICE("sub_offer_price"),
SUB_OFFER_PRICE_2("sub_offer_price_2"),
SUB_RELATIVE_DISCOUNT("sub_relative_discount"),
;

companion object {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -24,12 +24,14 @@ class VariableProcessorTest {

private lateinit var applicationContext: ApplicationContext
private lateinit var variableDataProvider: VariableDataProvider
private lateinit var context: VariableProcessor.Context
private lateinit var rcPackage: Package

@Before
fun setUp() {
applicationContext = MockApplicationContext()
variableDataProvider = VariableDataProvider(applicationContext)
context = mockk()
rcPackage = TestData.Packages.annual
}

Expand Down Expand Up @@ -354,6 +356,22 @@ class VariableProcessorTest {

// endregion

// region sub_relative_discount

@Test
fun `process variables processes sub_relative_discount with no discount`() {
every { context.discountRelativeToMostExpensivePerMonth }.returns(null)
expectVariablesResult("{{ sub_relative_discount }}", "")
}

@Test
fun `process variables processes sub_relative_discount`() {
every { context.discountRelativeToMostExpensivePerMonth }.returns(0.1)
expectVariablesResult("{{ sub_relative_discount }}", "10% off")
}

// endregion

// endregion Variables

@Test
Expand All @@ -378,7 +396,13 @@ class VariableProcessorTest {
locale: Locale = usLocale,
rcPackage: Package = this.rcPackage,
) {
val resultText = VariableProcessor.processVariables(variableDataProvider, originalText, rcPackage, locale)
val resultText = VariableProcessor.processVariables(
variableDataProvider,
context,
originalText,
rcPackage,
locale
)
assertThat(resultText).isEqualTo(expectedText)
}
}

0 comments on commit e04acf1

Please sign in to comment.