1
0
Fork 0
mirror of https://github.com/anyproto/anytype-kotlin.git synced 2025-06-07 21:37:02 +09:00

DROID-3656 Membership | Support new tiers (#2426)

This commit is contained in:
Konstantin Ivanov 2025-05-22 09:21:09 +02:00 committed by GitHub
parent 6ff5b57790
commit d2219e9a96
Signed by: github
GPG key ID: B5690EEEBB952194
24 changed files with 222 additions and 89 deletions

View file

@ -7,7 +7,9 @@ sealed class UserProperty {
val tier: String
get() = when (tierId) {
0 -> "None"
1 -> "Explorer"
20 -> "Explorer"
21 -> "Starter"
22 -> "Pioneer"
4 -> "Builder"
5 -> "Co-Creator"
else -> "Custom"

View file

@ -20,7 +20,9 @@ fun TierId.isPossibleToUpgrade(
fun TierId.isPossibleToUpgradeNumberOfSpaceMembers(): Boolean {
return when (this.value) {
MembershipConstants.NONE_ID -> true
MembershipConstants.EXPLORER_ID -> true
MembershipConstants.STARTER_ID -> true
MembershipConstants.PIONEER_ID -> true
MembershipConstants.NEW_EXPLORER_ID -> true
MembershipConstants.BUILDER_ID -> false
MembershipConstants.CO_CREATOR_ID -> false
MembershipConstants.ANY_TEAM_ID -> false
@ -31,7 +33,9 @@ fun TierId.isPossibleToUpgradeNumberOfSpaceMembers(): Boolean {
fun TierId.isPossibleToUpgradeStorageSpace(): Boolean {
return when (this.value) {
MembershipConstants.NONE_ID -> true
MembershipConstants.EXPLORER_ID -> true
MembershipConstants.STARTER_ID -> true
MembershipConstants.PIONEER_ID -> true
MembershipConstants.NEW_EXPLORER_ID -> true
MembershipConstants.BUILDER_ID -> true
MembershipConstants.CO_CREATOR_ID -> false
MembershipConstants.ANY_TEAM_ID -> false

View file

@ -3,7 +3,9 @@ package com.anytypeio.anytype.core_models.membership
object MembershipConstants {
const val NONE_ID = 0
const val EXPLORER_ID = 1
const val STARTER_ID = 21
const val PIONEER_ID = 22
const val NEW_EXPLORER_ID = 20
const val BUILDER_ID = 4
const val CO_CREATOR_ID = 5
const val ANY_TEAM_ID = 7
@ -13,7 +15,7 @@ object MembershipConstants {
const val TERMS_OF_SERVICE = "https://anytype.io/terms_of_use"
const val MEMBERSHIP_CONTACT_EMAIL = "membership-upgrade@anytype.io"
val ACTIVE_TIERS_WITH_BANNERS = listOf(NONE_ID, EXPLORER_ID)
val ACTIVE_TIERS_WITH_BANNERS = listOf(NONE_ID, STARTER_ID, PIONEER_ID)
const val ERROR_PRODUCT_NOT_FOUND = "Product not found"
const val ERROR_PRODUCT_PRICE = "Price of the product is not available"

View file

@ -0,0 +1,46 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:aapt="http://schemas.android.com/aapt"
android:width="64dp"
android:height="64dp"
android:viewportWidth="64"
android:viewportHeight="64">
<path
android:pathData="M23.5,23.5m0,-23.5a23.5,23.5 0,1 0,0 47a23.5,23.5 0,1 0,0 -47">
<aapt:attr name="android:fillColor">
<gradient
android:centerX="23.5"
android:centerY="23.5"
android:gradientRadius="23.5"
android:type="radial">
<item android:offset="0.41" android:color="@color/tier_gradient_ice_start"/>
<item android:offset="1" android:color="@color/tier_gradient_ice_end"/>
</gradient>
</aapt:attr>
</path>
<path
android:pathData="M50,50m0,-14a14,14 0,1 0,0 28a14,14 0,1 0,0 -28">
<aapt:attr name="android:fillColor">
<gradient
android:centerX="50"
android:centerY="50"
android:gradientRadius="14"
android:type="radial">
<item android:offset="0.41" android:color="@color/tier_gradient_ice_start"/>
<item android:offset="1" android:color="@color/tier_gradient_ice_end"/>
</gradient>
</aapt:attr>
</path>
<path
android:pathData="M37,37m0,-19a19,19 0,1 0,0 38a19,19 0,1 0,0 -38">
<aapt:attr name="android:fillColor">
<gradient
android:centerX="37"
android:centerY="37"
android:gradientRadius="19"
android:type="radial">
<item android:offset="0.41" android:color="@color/tier_gradient_ice_start"/>
<item android:offset="1" android:color="@color/tier_gradient_ice_end"/>
</gradient>
</aapt:attr>
</path>
</vector>

View file

@ -0,0 +1,46 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:aapt="http://schemas.android.com/aapt"
android:width="97dp"
android:height="97dp"
android:viewportWidth="97"
android:viewportHeight="97">
<path
android:pathData="M35.95,36.142m0,-35.25a35.25,35.25 0,1 0,0 70.5a35.25,35.25 0,1 0,0 -70.5">
<aapt:attr name="android:fillColor">
<gradient
android:centerX="35.95"
android:centerY="36.142"
android:gradientRadius="35.25"
android:type="radial">
<item android:offset="0.41" android:color="@color/tier_gradient_ice_start"/>
<item android:offset="1" android:color="@color/tier_gradient_ice_end"/>
</gradient>
</aapt:attr>
</path>
<path
android:pathData="M75.7,75.892m0,-21a21,21 0,1 0,0 42a21,21 0,1 0,0 -42">
<aapt:attr name="android:fillColor">
<gradient
android:centerX="75.7"
android:centerY="75.892"
android:gradientRadius="21"
android:type="radial">
<item android:offset="0.41" android:color="@color/tier_gradient_ice_start"/>
<item android:offset="1" android:color="@color/tier_gradient_ice_end"/>
</gradient>
</aapt:attr>
</path>
<path
android:pathData="M56.2,56.392m0,-28.5a28.5,28.5 0,1 0,0 57a28.5,28.5 0,1 0,0 -57">
<aapt:attr name="android:fillColor">
<gradient
android:centerX="56.2"
android:centerY="56.392"
android:gradientRadius="28.5"
android:type="radial">
<item android:offset="0.41" android:color="@color/tier_gradient_ice_start"/>
<item android:offset="1" android:color="@color/tier_gradient_ice_end"/>
</gradient>
</aapt:attr>
</path>
</vector>

View file

@ -129,6 +129,9 @@
<color name="tier_gradient_purple_start">#00000000</color>
<color name="tier_gradient_purple_end">#E86DE3</color>
<color name="tier_gradient_ice_start">#00000000</color>
<color name="tier_gradient_ice_end">#FF91D3FF</color>
<color name="object_number_background">#393835</color>
<color name="home_screen_toolbar_button">#F2222222</color>

View file

@ -173,6 +173,9 @@
<color name="tier_gradient_purple_start">#FBEAFF</color>
<color name="tier_gradient_purple_end">#E86DE3</color>
<color name="tier_gradient_ice_start">#1A0091D3</color>
<color name="tier_gradient_ice_end">#FF91D3FF</color>
<color name="membership_info_gradient_green">#CFF6CF</color>
<color name="membership_info_gradient_yellow">#FEF2C6</color>
<color name="membership_info_gradient_pink">#FFEBEB</color>

View file

@ -184,10 +184,10 @@ private fun MembershipTierData.mapActiveTierButtonAndNameStates(
val wasPurchasedOnAndroid = isActiveTierPurchasedOnAndroid(paymentMethod)
if (!wasPurchasedOnAndroid) {
return when {
id == MembershipConstants.EXPLORER_ID && userEmail.isBlank() -> {
id == MembershipConstants.STARTER_ID && userEmail.isBlank() -> {
TierButton.Submit.Enabled to TierAnyName.Hidden
}
id == MembershipConstants.EXPLORER_ID -> {
id == MembershipConstants.STARTER_ID -> {
TierButton.ChangeEmail to TierAnyName.Hidden
}
paymentMethod == METHOD_NONE -> {
@ -448,7 +448,7 @@ private fun convertToTierViewPeriod(tier: MembershipTierData): TierPeriod {
private fun MembershipTierData.getTierEmail(isActive: Boolean, membershipEmail: String): TierEmail {
if (isActive) {
if (id == MembershipConstants.EXPLORER_ID && membershipEmail.isBlank()) {
if (id == MembershipConstants.STARTER_ID && membershipEmail.isBlank()) {
return TierEmail.Visible.Enter
}
}

View file

@ -40,7 +40,9 @@ import com.anytypeio.anytype.core_ui.views.Relations3
import com.anytypeio.anytype.core_ui.views.fontInterSemibold
import com.anytypeio.anytype.core_models.membership.MembershipConstants.BUILDER_ID
import com.anytypeio.anytype.core_models.membership.MembershipConstants.CO_CREATOR_ID
import com.anytypeio.anytype.core_models.membership.MembershipConstants.EXPLORER_ID
import com.anytypeio.anytype.core_models.membership.MembershipConstants.NEW_EXPLORER_ID
import com.anytypeio.anytype.core_models.membership.MembershipConstants.STARTER_ID
import com.anytypeio.anytype.core_models.membership.MembershipConstants.PIONEER_ID
import com.anytypeio.anytype.payments.models.TierPreview
import com.anytypeio.anytype.payments.models.Tier
import com.anytypeio.anytype.payments.models.TierConditionInfo
@ -157,12 +159,24 @@ fun mapTierToResources(tier: Tier): TierResources {
colors = toValue(tier.color),
features = tier.features,
)
EXPLORER_ID -> TierResources(
STARTER_ID -> TierResources(
mediumIcon = R.drawable.logo_explorer_96,
smallIcon = R.drawable.logo_explorer_64,
colors = toValue(tier.color),
features = tier.features,
)
PIONEER_ID -> TierResources(
mediumIcon = R.drawable.logo_custom_64,
smallIcon = R.drawable.logo_custom_64,
colors = toValue(tier.color),
features = tier.features,
)
NEW_EXPLORER_ID -> TierResources(
mediumIcon = R.drawable.logo_new_explorer_96,
smallIcon = R.drawable.logo_new_explorer_64,
colors = toValue(tier.color),
features = tier.features,
)
else -> TierResources(
smallIcon = R.drawable.logo_custom_64,
mediumIcon = R.drawable.logo_custom_64,
@ -186,11 +200,21 @@ fun mapTierPreviewToResources(tier: TierPreview): TierResources {
smallIcon = R.drawable.logo_co_creator_64,
colors = toValue(tier.color)
)
EXPLORER_ID -> TierResources(
STARTER_ID -> TierResources(
mediumIcon = R.drawable.logo_explorer_96,
smallIcon = R.drawable.logo_explorer_64,
colors = toValue(tier.color)
)
PIONEER_ID -> TierResources(
mediumIcon = R.drawable.logo_custom_64,
smallIcon = R.drawable.logo_custom_64,
colors = toValue(tier.color)
)
NEW_EXPLORER_ID -> TierResources(
mediumIcon = R.drawable.logo_new_explorer_96,
smallIcon = R.drawable.logo_new_explorer_64,
colors = toValue(tier.color)
)
else -> TierResources(
smallIcon = R.drawable.logo_custom_64,
mediumIcon = R.drawable.logo_custom_64,
@ -213,6 +237,7 @@ fun String.gradientStart(): Color = when (this) {
CoverColor.BLUE.code -> colorResource(id = R.color.tier_gradient_blue_start)
CoverColor.GREEN.code -> colorResource(id = R.color.tier_gradient_teal_start)
CoverColor.PURPLE.code -> colorResource(id = R.color.tier_gradient_purple_start)
CoverColor.ICE.code -> colorResource(id = R.color.tier_gradient_ice_start)
else -> colorResource(id = R.color.tier_gradient_blue_start)
}
@ -222,6 +247,7 @@ private fun String.gradientEnd(): Color = when (this) {
CoverColor.BLUE.code -> colorResource(id = R.color.tier_gradient_blue_end)
CoverColor.GREEN.code -> colorResource(id = R.color.tier_gradient_teal_end)
CoverColor.PURPLE.code -> colorResource(id = R.color.tier_gradient_purple_end)
CoverColor.ICE.code -> colorResource(id = R.color.tier_gradient_ice_end)
else -> colorResource(id = R.color.tier_gradient_blue_end)
}
@ -252,11 +278,12 @@ data class TierColors(
fun TierPreviewViewPreview() {
TierPreviewView(
tier = TierPreview(
id = TierId(BUILDER_ID),
title = "Builder",
id = TierId(NEW_EXPLORER_ID),
title = "Explorer",
subtitle = "For those who want to build and create",
conditionInfo = TierConditionInfo.Visible.Price("99.99", TierPeriod.Year(1)),
isActive = true
isActive = true,
color = "ice"
)
) {}
}

View file

@ -36,7 +36,7 @@ import androidx.compose.ui.text.style.TextAlign
import androidx.compose.ui.text.withStyle
import androidx.compose.ui.tooling.preview.Preview
import androidx.compose.ui.unit.dp
import com.anytypeio.anytype.core_models.membership.MembershipConstants.EXPLORER_ID
import com.anytypeio.anytype.core_models.membership.MembershipConstants.STARTER_ID
import com.anytypeio.anytype.core_models.membership.MembershipConstants.PRIVACY_POLICY
import com.anytypeio.anytype.core_models.membership.MembershipConstants.TERMS_OF_SERVICE
import com.anytypeio.anytype.core_models.membership.MembershipPaymentMethod
@ -466,7 +466,7 @@ fun TierViewScreenPreview() {
payedBy = MembershipPaymentMethod.METHOD_INAPP_GOOGLE
),
buttonState = TierButton.HiddenWithText.ManageOnIOS,
id = TierId(value = EXPLORER_ID),
id = TierId(value = STARTER_ID),
membershipAnyName = TierAnyName.Visible.Purchased("someanyname111"),
email = TierEmail.Visible.Enter,
color = "teal",

View file

@ -11,7 +11,7 @@ import com.android.billingclient.api.ProductDetails
import com.anytypeio.anytype.analytics.base.Analytics
import com.anytypeio.anytype.analytics.base.EventsDictionary
import com.anytypeio.anytype.core_models.membership.EmailVerificationStatus
import com.anytypeio.anytype.core_models.membership.MembershipConstants.EXPLORER_ID
import com.anytypeio.anytype.core_models.membership.MembershipConstants.STARTER_ID
import com.anytypeio.anytype.core_models.membership.MembershipConstants.MEMBERSHIP_NAME_MIN_LENGTH
import com.anytypeio.anytype.core_models.membership.MembershipConstants.NONE_ID
import com.anytypeio.anytype.core_models.membership.MembershipErrors
@ -458,7 +458,7 @@ class MembershipViewModel(
(tierState.value as? MembershipTierState.Visible)?.tier ?: return@fold
when (status) {
EmailVerificationStatus.STATUS_VERIFIED -> {
if (tierView.id.value == EXPLORER_ID) {
if (tierView.id.value == STARTER_ID) {
anyEmailState.clearText()
val updatedState = tierView.copy(
email = TierEmail.Hidden,

View file

@ -38,7 +38,7 @@ class CocreatorActiveTest : MembershipTestsSetup() {
private fun setupTierData(features: List<String>): List<MembershipTierData> {
return listOf(
StubMembershipTierData(
id = MembershipConstants.EXPLORER_ID,
id = MembershipConstants.STARTER_ID,
androidProductId = null,
features = features,
periodType = MembershipPeriodType.PERIOD_TYPE_UNLIMITED,

View file

@ -90,7 +90,7 @@ open class MembershipTestsSetup {
protected val accountId = "accountId-${RandomString.make()}"
fun membershipStatus(tiers: List<MembershipTierData>) = MembershipStatus(
activeTier = TierId(MembershipConstants.EXPLORER_ID),
activeTier = TierId(MembershipConstants.STARTER_ID),
status = Membership.Status.STATUS_ACTIVE,
dateEnds = 1714199910,
paymentMethod = MembershipPaymentMethod.METHOD_NONE,

View file

@ -6,7 +6,7 @@ import com.anytypeio.anytype.core_models.membership.MembershipPaymentMethod
import com.anytypeio.anytype.core_models.membership.MembershipConstants.ACTIVE_TIERS_WITH_BANNERS
import com.anytypeio.anytype.core_models.membership.MembershipConstants.BUILDER_ID
import com.anytypeio.anytype.core_models.membership.MembershipConstants.CO_CREATOR_ID
import com.anytypeio.anytype.core_models.membership.MembershipConstants.EXPLORER_ID
import com.anytypeio.anytype.core_models.membership.MembershipConstants.STARTER_ID
import com.anytypeio.anytype.payments.viewmodel.MembershipMainState
import com.anytypeio.anytype.payments.viewmodel.MembershipTierState
import com.anytypeio.anytype.payments.viewmodel.MembershipEmailCodeState
@ -27,7 +27,7 @@ class MembershipViewModelTest : MembershipTestsSetup() {
private val mTiers = listOf(
StubMembershipTierData(
id = EXPLORER_ID,
id = STARTER_ID,
),
StubMembershipTierData(
id = BUILDER_ID,
@ -92,7 +92,7 @@ class MembershipViewModelTest : MembershipTestsSetup() {
membershipStatus(
listOf(
StubMembershipTierData(
id = EXPLORER_ID,
id = STARTER_ID,
),
StubMembershipTierData(
id = BUILDER_ID,

View file

@ -39,7 +39,7 @@ class TierActiveAndFreeTests : MembershipTestsSetup() {
private fun setupTierData(features: List<String>): List<MembershipTierData> {
return listOf(
StubMembershipTierData(
id = MembershipConstants.EXPLORER_ID,
id = MembershipConstants.STARTER_ID,
androidProductId = null,
features = features,
periodType = MembershipPeriodType.PERIOD_TYPE_UNLIMITED,
@ -53,7 +53,7 @@ class TierActiveAndFreeTests : MembershipTestsSetup() {
email: String
): MembershipStatus {
return MembershipStatus(
activeTier = TierId(MembershipConstants.EXPLORER_ID),
activeTier = TierId(MembershipConstants.STARTER_ID),
status = Membership.Status.STATUS_ACTIVE,
dateEnds = 0,
paymentMethod = MembershipPaymentMethod.METHOD_NONE,
@ -83,8 +83,8 @@ class TierActiveAndFreeTests : MembershipTestsSetup() {
viewStateFlow.awaitItem().let { result ->
assertIs<MembershipMainState.Default>(result)
val tier: TierPreview =
result.tiersPreview.find { it.id.value == MembershipConstants.EXPLORER_ID }!!
TestCase.assertEquals(MembershipConstants.EXPLORER_ID, tier.id.value)
result.tiersPreview.find { it.id.value == MembershipConstants.STARTER_ID }!!
TestCase.assertEquals(MembershipConstants.STARTER_ID, tier.id.value)
TestCase.assertEquals(true, tier.isActive)
TestCase.assertEquals(
TierConditionInfo.Visible.Valid(
@ -96,7 +96,7 @@ class TierActiveAndFreeTests : MembershipTestsSetup() {
)
}
viewModel.onTierClicked(TierId(MembershipConstants.EXPLORER_ID))
viewModel.onTierClicked(TierId(MembershipConstants.STARTER_ID))
//STATE : EXPLORER, CURRENT, WITHOUT EMAIL
tierStateFlow.awaitItem().let { result ->
@ -111,7 +111,7 @@ class TierActiveAndFreeTests : MembershipTestsSetup() {
),
expectedAnyName = TierAnyName.Hidden,
expectedButtonState = TierButton.Submit.Enabled,
expectedId = MembershipConstants.EXPLORER_ID,
expectedId = MembershipConstants.STARTER_ID,
expectedActive = true,
expectedEmailState = TierEmail.Visible.Enter
)
@ -138,8 +138,8 @@ class TierActiveAndFreeTests : MembershipTestsSetup() {
viewStateFlow.awaitItem().let { result ->
assertIs<MembershipMainState.Default>(result)
val tier: TierPreview =
result.tiersPreview.find { it.id.value == MembershipConstants.EXPLORER_ID }!!
TestCase.assertEquals(MembershipConstants.EXPLORER_ID, tier.id.value)
result.tiersPreview.find { it.id.value == MembershipConstants.STARTER_ID }!!
TestCase.assertEquals(MembershipConstants.STARTER_ID, tier.id.value)
TestCase.assertEquals(true, tier.isActive)
TestCase.assertEquals(
TierConditionInfo.Visible.Valid(
@ -151,7 +151,7 @@ class TierActiveAndFreeTests : MembershipTestsSetup() {
)
}
viewModel.onTierClicked(TierId(MembershipConstants.EXPLORER_ID))
viewModel.onTierClicked(TierId(MembershipConstants.STARTER_ID))
//STATE : EXPLORER, CURRENT, WITHOUT EMAIL
tierStateFlow.awaitItem().let { result ->
@ -166,7 +166,7 @@ class TierActiveAndFreeTests : MembershipTestsSetup() {
),
expectedAnyName = TierAnyName.Hidden,
expectedButtonState = TierButton.ChangeEmail,
expectedId = MembershipConstants.EXPLORER_ID,
expectedId = MembershipConstants.STARTER_ID,
expectedActive = true,
expectedEmailState = TierEmail.Hidden
)

View file

@ -44,7 +44,7 @@ class TierActivePurchasedOniOSTests : MembershipTestsSetup() {
private fun setupTierData(features: List<String>): List<MembershipTierData> {
return listOf(
StubMembershipTierData(
id = MembershipConstants.EXPLORER_ID,
id = MembershipConstants.STARTER_ID,
androidProductId = null,
features = features,
periodType = MembershipPeriodType.PERIOD_TYPE_UNLIMITED,

View file

@ -49,7 +49,7 @@ class TierActiveWithDifferentSubIdTest : MembershipTestsSetup() {
private fun setupTierData(features: List<String>): List<MembershipTierData> {
return listOf(
StubMembershipTierData(
id = MembershipConstants.EXPLORER_ID,
id = MembershipConstants.STARTER_ID,
androidProductId = null,
features = features,
periodType = MembershipPeriodType.PERIOD_TYPE_UNLIMITED,
@ -105,7 +105,7 @@ class TierActiveWithDifferentSubIdTest : MembershipTestsSetup() {
val flow = flow {
emit(
MembershipStatus(
activeTier = TierId(MembershipConstants.EXPLORER_ID),
activeTier = TierId(MembershipConstants.STARTER_ID),
status = Membership.Status.STATUS_ACTIVE,
dateEnds = 0L,
paymentMethod = MembershipPaymentMethod.METHOD_NONE,
@ -225,7 +225,7 @@ class TierActiveWithDifferentSubIdTest : MembershipTestsSetup() {
val flow = flow {
emit(
MembershipStatus(
activeTier = TierId(MembershipConstants.EXPLORER_ID),
activeTier = TierId(MembershipConstants.STARTER_ID),
status = Membership.Status.STATUS_ACTIVE,
dateEnds = 0L,
paymentMethod = MembershipPaymentMethod.METHOD_NONE,
@ -313,7 +313,7 @@ class TierActiveWithDifferentSubIdTest : MembershipTestsSetup() {
val flow = flow {
emit(
MembershipStatus(
activeTier = TierId(MembershipConstants.EXPLORER_ID),
activeTier = TierId(MembershipConstants.STARTER_ID),
status = Membership.Status.STATUS_ACTIVE,
dateEnds = 0L,
paymentMethod = MembershipPaymentMethod.METHOD_NONE,
@ -428,7 +428,7 @@ class TierActiveWithDifferentSubIdTest : MembershipTestsSetup() {
val flow = flow {
emit(
MembershipStatus(
activeTier = TierId(MembershipConstants.EXPLORER_ID),
activeTier = TierId(MembershipConstants.STARTER_ID),
status = Membership.Status.STATUS_ACTIVE,
dateEnds = 0L,
paymentMethod = MembershipPaymentMethod.METHOD_NONE,

View file

@ -45,7 +45,7 @@ class TierAndroidActivePurchasedOniOS : MembershipTestsSetup() {
private fun setupTierData(features: List<String>): List<MembershipTierData> {
return listOf(
StubMembershipTierData(
id = MembershipConstants.EXPLORER_ID,
id = MembershipConstants.STARTER_ID,
androidProductId = null,
features = features,
periodType = MembershipPeriodType.PERIOD_TYPE_UNLIMITED,

View file

@ -42,7 +42,7 @@ class TierAndroidActiveTests : MembershipTestsSetup() {
private fun setupTierData(features: List<String>): List<MembershipTierData> {
return listOf(
StubMembershipTierData(
id = MembershipConstants.EXPLORER_ID,
id = MembershipConstants.STARTER_ID,
androidProductId = null,
features = features,
periodType = MembershipPeriodType.PERIOD_TYPE_UNLIMITED,

View file

@ -36,7 +36,7 @@ class TierAndroidBillingUnavailableTest : MembershipTestsSetup() {
private fun setupTierData(features: List<String>): List<MembershipTierData> {
return listOf(
StubMembershipTierData(
id = MembershipConstants.EXPLORER_ID,
id = MembershipConstants.STARTER_ID,
androidProductId = null,
features = features,
periodType = MembershipPeriodType.PERIOD_TYPE_UNLIMITED,
@ -64,7 +64,7 @@ class TierAndroidBillingUnavailableTest : MembershipTestsSetup() {
private fun setupMembershipStatus(tiers: List<MembershipTierData>): MembershipStatus {
return MembershipStatus(
activeTier = TierId(MembershipConstants.EXPLORER_ID),
activeTier = TierId(MembershipConstants.STARTER_ID),
status = Membership.Status.STATUS_ACTIVE,
dateEnds = 0,
paymentMethod = MembershipPaymentMethod.METHOD_NONE,

View file

@ -46,7 +46,7 @@ class TierAndroidNotActiveTests : MembershipTestsSetup() {
private fun setupTierData(features: List<String>): List<MembershipTierData> {
return listOf(
StubMembershipTierData(
id = MembershipConstants.EXPLORER_ID,
id = MembershipConstants.STARTER_ID,
androidProductId = null,
features = features,
periodType = MembershipPeriodType.PERIOD_TYPE_UNLIMITED,
@ -85,7 +85,7 @@ class TierAndroidNotActiveTests : MembershipTestsSetup() {
status : Membership.Status = Membership.Status.STATUS_ACTIVE
): MembershipStatus {
return MembershipStatus(
activeTier = TierId(MembershipConstants.EXPLORER_ID),
activeTier = TierId(MembershipConstants.STARTER_ID),
status = status,
dateEnds = 1714199910,
paymentMethod = MembershipPaymentMethod.METHOD_NONE,

View file

@ -7,7 +7,7 @@ import com.anytypeio.anytype.core_models.membership.MembershipPaymentMethod
import com.anytypeio.anytype.core_models.membership.MembershipPeriodType
import com.anytypeio.anytype.core_models.membership.MembershipTierData
import com.anytypeio.anytype.core_models.membership.MembershipConstants.BUILDER_ID
import com.anytypeio.anytype.core_models.membership.MembershipConstants.EXPLORER_ID
import com.anytypeio.anytype.core_models.membership.MembershipConstants.STARTER_ID
import com.anytypeio.anytype.payments.models.BillingPriceInfo
import com.anytypeio.anytype.payments.models.MembershipPurchase
import com.anytypeio.anytype.payments.models.PeriodDescription
@ -47,7 +47,7 @@ class TierBuilderFallbackOnExplorerTest : MembershipTestsSetup() {
private fun setupTierData(features: List<String>): List<MembershipTierData> {
return listOf(
StubMembershipTierData(
id = EXPLORER_ID,
id = STARTER_ID,
androidProductId = null,
features = features,
periodType = MembershipPeriodType.PERIOD_TYPE_UNLIMITED,
@ -102,7 +102,7 @@ class TierBuilderFallbackOnExplorerTest : MembershipTestsSetup() {
delay(300)
emit(
MembershipStatus(
activeTier = TierId(EXPLORER_ID),
activeTier = TierId(STARTER_ID),
status = Membership.Status.STATUS_ACTIVE,
dateEnds = 0L,
paymentMethod = MembershipPaymentMethod.METHOD_NONE,
@ -136,7 +136,7 @@ class TierBuilderFallbackOnExplorerTest : MembershipTestsSetup() {
secondMainItem.let {
assertIs<MembershipMainState.Default>(secondMainItem)
val builderTier2 = secondMainItem.tiers.find { it.id == TierId(BUILDER_ID) }
val explorerTier2 = secondMainItem.tiers.find { it.id == TierId(EXPLORER_ID) }
val explorerTier2 = secondMainItem.tiers.find { it.id == TierId(STARTER_ID) }
assertEquals(true, builderTier2?.isActive)
assertEquals(false, explorerTier2?.isActive)
}
@ -145,7 +145,7 @@ class TierBuilderFallbackOnExplorerTest : MembershipTestsSetup() {
thirdMainItem.let {
assertIs<MembershipMainState.Default>(thirdMainItem)
val builderTier3 = thirdMainItem.tiers.find { it.id == TierId(BUILDER_ID) }
val explorerTier3 = thirdMainItem.tiers.find { it.id == TierId(EXPLORER_ID) }
val explorerTier3 = thirdMainItem.tiers.find { it.id == TierId(STARTER_ID) }
assertEquals(false, builderTier3?.isActive)
assertEquals(true, explorerTier3?.isActive)
}

View file

@ -24,7 +24,7 @@ class TierConditionInfoTests : MembershipTestsSetup() {
turbineScope {
val tiers = listOf(
StubMembershipTierData(
id = MembershipConstants.EXPLORER_ID,
id = MembershipConstants.STARTER_ID,
name = "Explorer",
periodType = MembershipPeriodType.PERIOD_TYPE_UNLIMITED,
priceStripeUsdCents = 0,
@ -54,7 +54,7 @@ class TierConditionInfoTests : MembershipTestsSetup() {
val tier = result.tiersPreview[0]
//Asserts
assertEquals(MembershipConstants.EXPLORER_ID, tier.id.value)
assertEquals(MembershipConstants.STARTER_ID, tier.id.value)
assertEquals(
TierConditionInfo.Visible.Free(
period = TierPeriod.Unlimited
@ -68,7 +68,7 @@ class TierConditionInfoTests : MembershipTestsSetup() {
turbineScope {
val tiers = listOf(
StubMembershipTierData(
id = MembershipConstants.EXPLORER_ID,
id = MembershipConstants.STARTER_ID,
name = "Explorer",
periodType = MembershipPeriodType.PERIOD_TYPE_UNKNOWN,
priceStripeUsdCents = 0,
@ -98,7 +98,7 @@ class TierConditionInfoTests : MembershipTestsSetup() {
val tier = result.tiersPreview[0]
//Asserts
assertEquals(MembershipConstants.EXPLORER_ID, tier.id.value)
assertEquals(MembershipConstants.STARTER_ID, tier.id.value)
assertEquals(
TierConditionInfo.Visible.Free(
period = TierPeriod.Unknown
@ -112,7 +112,7 @@ class TierConditionInfoTests : MembershipTestsSetup() {
turbineScope {
val tiers = listOf(
StubMembershipTierData(
id = MembershipConstants.EXPLORER_ID,
id = MembershipConstants.STARTER_ID,
name = "Explorer",
periodType = MembershipPeriodType.PERIOD_TYPE_YEARS,
priceStripeUsdCents = 0,
@ -142,7 +142,7 @@ class TierConditionInfoTests : MembershipTestsSetup() {
val tier = result.tiersPreview[0]
//Asserts
assertEquals(MembershipConstants.EXPLORER_ID, tier.id.value)
assertEquals(MembershipConstants.STARTER_ID, tier.id.value)
assertEquals(
TierConditionInfo.Visible.Free(
period = TierPeriod.Year(3)
@ -156,7 +156,7 @@ class TierConditionInfoTests : MembershipTestsSetup() {
turbineScope {
val tiers = listOf(
StubMembershipTierData(
id = MembershipConstants.EXPLORER_ID,
id = MembershipConstants.STARTER_ID,
name = "Explorer",
periodType = MembershipPeriodType.PERIOD_TYPE_UNLIMITED,
priceStripeUsdCents = 9999,
@ -186,7 +186,7 @@ class TierConditionInfoTests : MembershipTestsSetup() {
val tier = result.tiersPreview[0]
//Asserts
assertEquals(MembershipConstants.EXPLORER_ID, tier.id.value)
assertEquals(MembershipConstants.STARTER_ID, tier.id.value)
assertEquals(
TierConditionInfo.Visible.Price(
price = "$99.99",
@ -201,7 +201,7 @@ class TierConditionInfoTests : MembershipTestsSetup() {
turbineScope {
val tiers = listOf(
StubMembershipTierData(
id = MembershipConstants.EXPLORER_ID,
id = MembershipConstants.STARTER_ID,
name = "Explorer",
periodType = MembershipPeriodType.PERIOD_TYPE_UNKNOWN,
priceStripeUsdCents = 9999,
@ -231,7 +231,7 @@ class TierConditionInfoTests : MembershipTestsSetup() {
val tier = result.tiersPreview[0]
//Asserts
assertEquals(MembershipConstants.EXPLORER_ID, tier.id.value)
assertEquals(MembershipConstants.STARTER_ID, tier.id.value)
assertEquals(
TierConditionInfo.Visible.Price(
price = "$99.99",
@ -246,7 +246,7 @@ class TierConditionInfoTests : MembershipTestsSetup() {
turbineScope {
val tiers = listOf(
StubMembershipTierData(
id = MembershipConstants.EXPLORER_ID,
id = MembershipConstants.STARTER_ID,
name = "Explorer",
periodType = MembershipPeriodType.PERIOD_TYPE_YEARS,
priceStripeUsdCents = 9999,
@ -276,7 +276,7 @@ class TierConditionInfoTests : MembershipTestsSetup() {
val tier = result.tiersPreview[0]
//Asserts
assertEquals(MembershipConstants.EXPLORER_ID, tier.id.value)
assertEquals(MembershipConstants.STARTER_ID, tier.id.value)
assertEquals(
TierConditionInfo.Visible.Price(
price = "$99.99",
@ -291,7 +291,7 @@ class TierConditionInfoTests : MembershipTestsSetup() {
turbineScope {
val tiers = listOf(
StubMembershipTierData(
id = MembershipConstants.EXPLORER_ID,
id = MembershipConstants.STARTER_ID,
name = "Explorer",
periodType = MembershipPeriodType.PERIOD_TYPE_UNLIMITED,
priceStripeUsdCents = 0,
@ -300,7 +300,7 @@ class TierConditionInfoTests : MembershipTestsSetup() {
)
stubMembershipProvider(
MembershipStatus(
activeTier = TierId(MembershipConstants.EXPLORER_ID),
activeTier = TierId(MembershipConstants.STARTER_ID),
status = Membership.Status.STATUS_ACTIVE,
dateEnds = 1714199910,
paymentMethod = MembershipPaymentMethod.METHOD_CRYPTO,
@ -321,7 +321,7 @@ class TierConditionInfoTests : MembershipTestsSetup() {
val tier = result.tiersPreview[0]
//Asserts
assertEquals(MembershipConstants.EXPLORER_ID, tier.id.value)
assertEquals(MembershipConstants.STARTER_ID, tier.id.value)
assertEquals(
TierConditionInfo.Visible.Valid(
period = TierPeriod.Unlimited,
@ -337,7 +337,7 @@ class TierConditionInfoTests : MembershipTestsSetup() {
turbineScope {
val tiers = listOf(
StubMembershipTierData(
id = MembershipConstants.EXPLORER_ID,
id = MembershipConstants.STARTER_ID,
name = "Explorer",
periodType = MembershipPeriodType.PERIOD_TYPE_UNKNOWN,
priceStripeUsdCents = 0,
@ -346,7 +346,7 @@ class TierConditionInfoTests : MembershipTestsSetup() {
)
stubMembershipProvider(
MembershipStatus(
activeTier = TierId(MembershipConstants.EXPLORER_ID),
activeTier = TierId(MembershipConstants.STARTER_ID),
status = Membership.Status.STATUS_ACTIVE,
dateEnds = 1714199910,
paymentMethod = MembershipPaymentMethod.METHOD_CRYPTO,
@ -367,7 +367,7 @@ class TierConditionInfoTests : MembershipTestsSetup() {
val tier = result.tiersPreview[0]
//Asserts
assertEquals(MembershipConstants.EXPLORER_ID, tier.id.value)
assertEquals(MembershipConstants.STARTER_ID, tier.id.value)
assertEquals(
TierConditionInfo.Visible.Valid(
period = TierPeriod.Unknown,
@ -383,7 +383,7 @@ class TierConditionInfoTests : MembershipTestsSetup() {
turbineScope {
val tiers = listOf(
StubMembershipTierData(
id = MembershipConstants.EXPLORER_ID,
id = MembershipConstants.STARTER_ID,
name = "Explorer",
periodType = MembershipPeriodType.PERIOD_TYPE_YEARS,
priceStripeUsdCents = 0,
@ -392,7 +392,7 @@ class TierConditionInfoTests : MembershipTestsSetup() {
)
stubMembershipProvider(
MembershipStatus(
activeTier = TierId(MembershipConstants.EXPLORER_ID),
activeTier = TierId(MembershipConstants.STARTER_ID),
status = Membership.Status.STATUS_ACTIVE,
dateEnds = 1714199910,
paymentMethod = MembershipPaymentMethod.METHOD_CRYPTO,
@ -413,7 +413,7 @@ class TierConditionInfoTests : MembershipTestsSetup() {
val tier = result.tiersPreview[0]
//Asserts
assertEquals(MembershipConstants.EXPLORER_ID, tier.id.value)
assertEquals(MembershipConstants.STARTER_ID, tier.id.value)
assertEquals(
TierConditionInfo.Visible.Valid(
period = TierPeriod.Year(2),
@ -475,7 +475,7 @@ class TierConditionInfoTests : MembershipTestsSetup() {
turbineScope {
val tiers = listOf(
StubMembershipTierData(
id = MembershipConstants.EXPLORER_ID,
id = MembershipConstants.STARTER_ID,
name = "Explorer",
colorStr = "#000000",
features = listOf("feature1", "feature2"),
@ -507,7 +507,7 @@ class TierConditionInfoTests : MembershipTestsSetup() {
val tier = result.tiersPreview[0]
//Asserts
assertEquals(MembershipConstants.EXPLORER_ID, tier.id.value)
assertEquals(MembershipConstants.STARTER_ID, tier.id.value)
assertEquals(
TierConditionInfo.Visible.Free(
period = TierPeriod.Year(4)
@ -521,7 +521,7 @@ class TierConditionInfoTests : MembershipTestsSetup() {
turbineScope {
val tiers = listOf(
StubMembershipTierData(
id = MembershipConstants.EXPLORER_ID,
id = MembershipConstants.STARTER_ID,
name = "Explorer",
colorStr = "#000000",
features = listOf("feature1", "feature2"),
@ -553,7 +553,7 @@ class TierConditionInfoTests : MembershipTestsSetup() {
val tier = result.tiersPreview[0]
//Asserts
assertEquals(MembershipConstants.EXPLORER_ID, tier.id.value)
assertEquals(MembershipConstants.STARTER_ID, tier.id.value)
assertEquals(
TierConditionInfo.Visible.Free(
period = TierPeriod.Month(3)
@ -567,7 +567,7 @@ class TierConditionInfoTests : MembershipTestsSetup() {
turbineScope {
val tiers = listOf(
StubMembershipTierData(
id = MembershipConstants.EXPLORER_ID,
id = MembershipConstants.STARTER_ID,
name = "Explorer",
colorStr = "#000000",
features = listOf("feature1", "feature2"),
@ -599,7 +599,7 @@ class TierConditionInfoTests : MembershipTestsSetup() {
val tier = result.tiersPreview[0]
//Asserts
assertEquals(MembershipConstants.EXPLORER_ID, tier.id.value)
assertEquals(MembershipConstants.STARTER_ID, tier.id.value)
assertEquals(false, tier.isActive)
assertEquals(
TierConditionInfo.Visible.Free(
@ -614,7 +614,7 @@ class TierConditionInfoTests : MembershipTestsSetup() {
turbineScope {
val tiers = listOf(
StubMembershipTierData(
id = MembershipConstants.EXPLORER_ID,
id = MembershipConstants.STARTER_ID,
name = "Explorer",
colorStr = "#000000",
features = listOf("feature1", "feature2"),
@ -646,7 +646,7 @@ class TierConditionInfoTests : MembershipTestsSetup() {
val tier = result.tiersPreview[0]
//Asserts
assertEquals(MembershipConstants.EXPLORER_ID, tier.id.value)
assertEquals(MembershipConstants.STARTER_ID, tier.id.value)
assertEquals(false, tier.isActive)
assertEquals(
TierConditionInfo.Visible.Free(
@ -661,7 +661,7 @@ class TierConditionInfoTests : MembershipTestsSetup() {
turbineScope {
val tiers = listOf(
StubMembershipTierData(
id = MembershipConstants.EXPLORER_ID,
id = MembershipConstants.STARTER_ID,
name = "Explorer",
colorStr = "#000000",
features = listOf("feature1", "feature2"),
@ -693,7 +693,7 @@ class TierConditionInfoTests : MembershipTestsSetup() {
val tier = result.tiersPreview[0]
//Asserts
assertEquals(MembershipConstants.EXPLORER_ID, tier.id.value)
assertEquals(MembershipConstants.STARTER_ID, tier.id.value)
assertEquals(false, tier.isActive)
assertEquals(
TierConditionInfo.Visible.Free(period = TierPeriod.Unknown),
@ -710,7 +710,7 @@ class TierConditionInfoTests : MembershipTestsSetup() {
turbineScope {
val tiers = listOf(
StubMembershipTierData(
id = MembershipConstants.EXPLORER_ID,
id = MembershipConstants.STARTER_ID,
name = "Explorer",
colorStr = "#000000",
features = listOf("feature1", "feature2"),
@ -742,7 +742,7 @@ class TierConditionInfoTests : MembershipTestsSetup() {
val tier = result.tiersPreview[0]
//Asserts
assertEquals(MembershipConstants.EXPLORER_ID, tier.id.value)
assertEquals(MembershipConstants.STARTER_ID, tier.id.value)
assertEquals(false, tier.isActive)
assertEquals(
TierConditionInfo.Visible.Free(period = TierPeriod.Unknown),
@ -756,7 +756,7 @@ class TierConditionInfoTests : MembershipTestsSetup() {
turbineScope {
val tiers = listOf(
StubMembershipTierData(
id = MembershipConstants.EXPLORER_ID,
id = MembershipConstants.STARTER_ID,
name = "Explorer",
colorStr = "#000000",
features = listOf("feature1", "feature2"),
@ -788,7 +788,7 @@ class TierConditionInfoTests : MembershipTestsSetup() {
val tier = result.tiersPreview[0]
//Asserts
assertEquals(MembershipConstants.EXPLORER_ID, tier.id.value)
assertEquals(MembershipConstants.STARTER_ID, tier.id.value)
assertEquals(false, tier.isActive)
assertEquals(
TierConditionInfo.Visible.Price(
@ -804,7 +804,7 @@ class TierConditionInfoTests : MembershipTestsSetup() {
turbineScope {
val tiers = listOf(
StubMembershipTierData(
id = MembershipConstants.EXPLORER_ID,
id = MembershipConstants.STARTER_ID,
name = "Explorer",
colorStr = "#000000",
features = listOf("feature1", "feature2"),
@ -836,7 +836,7 @@ class TierConditionInfoTests : MembershipTestsSetup() {
val tier = result.tiersPreview[0]
//Asserts
assertEquals(MembershipConstants.EXPLORER_ID, tier.id.value)
assertEquals(MembershipConstants.STARTER_ID, tier.id.value)
assertEquals(false, tier.isActive)
assertEquals(
TierConditionInfo.Visible.Price(

View file

@ -13,7 +13,7 @@ import com.anytypeio.anytype.core_models.Id
import com.anytypeio.anytype.core_models.ObjectWrapper
import com.anytypeio.anytype.core_models.ext.isPossibleToUpgradeNumberOfSpaceMembers
import com.anytypeio.anytype.core_models.membership.MembershipConstants.BUILDER_ID
import com.anytypeio.anytype.core_models.membership.MembershipConstants.EXPLORER_ID
import com.anytypeio.anytype.core_models.membership.MembershipConstants.STARTER_ID
import com.anytypeio.anytype.core_models.membership.TierId
import com.anytypeio.anytype.core_models.multiplayer.MultiplayerError
import com.anytypeio.anytype.core_models.multiplayer.SpaceMemberPermissions
@ -137,7 +137,7 @@ class SpaceJoinRequestViewModel(
Timber.d("proceedWithState, tierId: $tierId, spaceView: $spaceView, spaceMembers: $spaceMembers, newMember: $newMember, isCurrentUserOwner: $isCurrentUserOwner")
val state = when (tierId.value) {
EXPLORER_ID -> createExplorerState(
STARTER_ID -> createExplorerState(
spaceView = spaceView,
spaceMembers = spaceMembers,
newMember = newMember,