Skip to content

Commit d95268b

Browse files
authored
Merge pull request #494 from code-payments/feat/kado-webview-beta-flag
chore: move internal buy kin flow behind a beta flag
2 parents d240be7 + 72ff125 commit d95268b

6 files changed

Lines changed: 52 additions & 96 deletions

File tree

api/src/main/java/com/getcode/model/PrefBool.kt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,7 @@ sealed class PrefsBool(val value: String) {
5050
data object TIPS_CHAT_ENABLED: PrefsBool("tips_chat_enabled"), BetaFlag
5151
data object TIPS_CHAT_CASH_ENABLED: PrefsBool("tips_chat_cash_enabled"), BetaFlag
5252
data object BALANCE_CURRENCY_SELECTION_ENABLED: PrefsBool("balance_currency_enabled"), BetaFlag
53+
data object KADO_WEBVIEW_ENABLED : PrefsBool("kado_inapp_enabled"), BetaFlag
5354
}
5455

5556
val APP_SETTINGS: List<AppSetting> = listOf(PrefsBool.CAMERA_START_BY_DEFAULT, PrefsBool.REQUIRE_BIOMETRICS)

api/src/main/java/com/getcode/network/repository/BetaFlagsRepository.kt

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ data class BetaOptions(
1818
val tipsChatEnabled: Boolean,
1919
val tipsChatCashEnabled: Boolean,
2020
val balanceCurrencySelectionEnabled: Boolean,
21+
val kadoWebViewEnabled: Boolean,
2122
) {
2223
companion object {
2324
// Default states for various beta flags in app.
@@ -33,7 +34,8 @@ data class BetaOptions(
3334
tipsEnabled = false,
3435
tipsChatEnabled = false,
3536
tipsChatCashEnabled = false,
36-
balanceCurrencySelectionEnabled = true
37+
balanceCurrencySelectionEnabled = true,
38+
kadoWebViewEnabled = false,
3739
)
3840
}
3941
}
@@ -68,6 +70,7 @@ class BetaFlagsRepository @Inject constructor(
6870
observeBetaFlag(PrefsBool.TIPS_CHAT_CASH_ENABLED, default = defaults.tipsChatCashEnabled),
6971
observeBetaFlag(PrefsBool.BALANCE_CURRENCY_SELECTION_ENABLED, defaults.balanceCurrencySelectionEnabled),
7072
observeBetaFlag(PrefsBool.DISPLAY_ERRORS, default = defaults.displayErrors),
73+
observeBetaFlag(PrefsBool.KADO_WEBVIEW_ENABLED, default = defaults.kadoWebViewEnabled)
7174
) {
7275
BetaOptions(
7376
showNetworkDropOff = it[0],
@@ -82,6 +85,7 @@ class BetaFlagsRepository @Inject constructor(
8285
tipsChatCashEnabled = it[9],
8386
balanceCurrencySelectionEnabled = it[10],
8487
displayErrors = it[11],
88+
kadoWebViewEnabled = it[12],
8589
)
8690
}
8791
}

app/src/main/java/com/getcode/view/main/account/BetaFlagsScreen.kt

Lines changed: 20 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,9 @@ fun BetaFlagsScreen(
3030
val titleResId: Int,
3131
val subtitleText: String,
3232
val dataState: Boolean,
33-
val onChange: (Boolean) -> Unit
33+
val onChange: (Boolean) -> Unit = { value ->
34+
viewModel.dispatchEvent(BetaFlagsViewModel.Event.Toggle(flag, value))
35+
}
3436
)
3537

3638
val state by viewModel.stateFlow.collectAsState()
@@ -43,67 +45,73 @@ fun BetaFlagsScreen(
4345
R.string.beta_vibrate_on_scan,
4446
stringResource(R.string.beta_vibrate_on_scan_description),
4547
state.isVibrateOnScan
46-
) { viewModel.dispatchEvent(BetaFlagsViewModel.Event.SetVibrateOnScan(it)) },
48+
),
4749
BetaFeature(
4850
PrefsBool.SHOW_CONNECTIVITY_STATUS,
4951
R.string.beta_network_dropoff,
5052
stringResource(R.string.beta_network_connectivity_description),
5153
state.showNetworkDropOff
52-
) { viewModel.dispatchEvent(BetaFlagsViewModel.Event.ShowNetworkDropOff(it)) },
54+
),
5355
BetaFeature(
5456
PrefsBool.BUCKET_DEBUGGER_ENABLED,
5557
R.string.beta_bucket_debugger,
5658
stringResource(R.string.beta_bucket_debugger_description),
5759
state.canViewBuckets
58-
) { viewModel.dispatchEvent(BetaFlagsViewModel.Event.UseDebugBuckets(it)) },
60+
),
5961
BetaFeature(
6062
PrefsBool.BALANCE_CURRENCY_SELECTION_ENABLED,
6163
R.string.beta_balance_currency,
6264
stringResource(R.string.beta_balance_currency_description),
6365
state.currencySelectionBalanceEnabled
64-
) { viewModel.dispatchEvent(BetaFlagsViewModel.Event.EnableCurrencySelectionInBalance(it)) },
66+
),
6567
BetaFeature(
6668
PrefsBool.GIVE_REQUESTS_ENABLED,
6769
R.string.beta_give_requests_mode,
6870
stringResource(id = R.string.beta_give_requests_description),
6971
state.giveRequestsEnabled
70-
) { viewModel.dispatchEvent(BetaFlagsViewModel.Event.EnableGiveRequests(it)) },
72+
),
7173
BetaFeature(
7274
PrefsBool.BUY_MODULE_ENABLED,
7375
R.string.beta_buy_kin,
7476
stringResource(id = R.string.beta_buy_kin_description),
7577
state.buyKinEnabled
76-
) { viewModel.dispatchEvent(BetaFlagsViewModel.Event.EnableBuyKin(it)) },
78+
),
7779
BetaFeature(
7880
PrefsBool.CHAT_UNSUB_ENABLED,
7981
R.string.beta_chat_unsub,
8082
stringResource(id = R.string.beta_chat_unsub_description),
8183
state.chatUnsubEnabled,
82-
) { viewModel.dispatchEvent(BetaFlagsViewModel.Event.EnableChatUnsubscribe(it)) },
84+
),
8385
BetaFeature(
8486
PrefsBool.TIPS_ENABLED,
8587
R.string.beta_tipcard,
8688
stringResource(id = R.string.beta_tipcard_description),
8789
state.tipsEnabled,
88-
) { viewModel.dispatchEvent(BetaFlagsViewModel.Event.EnableTipCard(it)) },
90+
),
8991
BetaFeature(
9092
PrefsBool.TIPS_CHAT_ENABLED,
9193
R.string.beta_tipchats,
9294
stringResource(id = R.string.beta_tipchats_description),
9395
state.tipsChatEnabled,
94-
) { viewModel.dispatchEvent(BetaFlagsViewModel.Event.EnableTipChats(it)) },
96+
),
9597
BetaFeature(
9698
PrefsBool.TIPS_CHAT_CASH_ENABLED,
9799
R.string.beta_tipchats_cash,
98100
stringResource(id = R.string.beta_tipchats_cash_description),
99101
state.tipsChatCashEnabled,
100-
) { viewModel.dispatchEvent(BetaFlagsViewModel.Event.EnableTipsChatCash(it)) },
102+
),
103+
BetaFeature(
104+
PrefsBool.KADO_WEBVIEW_ENABLED,
105+
R.string.beta_kado_webview,
106+
stringResource(id = R.string.beta_kado_webview_description),
107+
state.kadoWebViewEnabled,
108+
),
101109
BetaFeature(
102110
PrefsBool.DISPLAY_ERRORS,
103111
R.string.beta_display_errors,
104112
"",
105113
state.displayErrors,
106-
) { viewModel.dispatchEvent(BetaFlagsViewModel.Event.ShowErrors(it)) }
114+
)
107115
).filter { state.canMutate(it.flag) }
108116

109117
LazyColumn {

app/src/main/java/com/getcode/view/main/account/BetaFlagsViewModel.kt

Lines changed: 11 additions & 82 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ import com.getcode.utils.ErrorUtils
99
import com.getcode.view.BaseViewModel2
1010
import dagger.hilt.android.lifecycle.HiltViewModel
1111
import kotlinx.coroutines.flow.distinctUntilChanged
12+
import kotlinx.coroutines.flow.filterIsInstance
1213
import kotlinx.coroutines.flow.launchIn
1314
import kotlinx.coroutines.flow.onEach
1415
import javax.inject.Inject
@@ -34,22 +35,12 @@ class BetaFlagsViewModel @Inject constructor(
3435
val tipsEnabled: Boolean = false,
3536
val tipsChatEnabled: Boolean = false,
3637
val tipsChatCashEnabled: Boolean = false,
38+
val kadoWebViewEnabled: Boolean = false,
3739
)
3840

3941
sealed interface Event {
4042
data class UpdateSettings(val settings: BetaOptions) : Event
41-
42-
data class ShowErrors(val display: Boolean) : Event
43-
data class EnableCurrencySelectionInBalance(val enabled: Boolean): Event
44-
data class ShowNetworkDropOff(val show: Boolean) : Event
45-
data class SetVibrateOnScan(val vibrate: Boolean) : Event
46-
data class UseDebugBuckets(val enabled: Boolean) : Event
47-
data class EnableGiveRequests(val enabled: Boolean) : Event
48-
data class EnableBuyKin(val enabled: Boolean) : Event
49-
data class EnableTipCard(val enabled: Boolean) : Event
50-
data class EnableChatUnsubscribe(val enabled: Boolean) : Event
51-
data class EnableTipChats(val enabled: Boolean) : Event
52-
data class EnableTipsChatCash(val enabled: Boolean) : Event
43+
data class Toggle(val setting: PrefsBool, val state: Boolean): Event
5344
}
5445

5546
init {
@@ -61,65 +52,12 @@ class BetaFlagsViewModel @Inject constructor(
6152

6253

6354
eventFlow
64-
.onEach { event ->
65-
when (event) {
66-
is Event.EnableBuyKin -> prefRepository.set(
67-
PrefsBool.BUY_MODULE_ENABLED,
68-
event.enabled
69-
)
70-
71-
is Event.EnableChatUnsubscribe -> prefRepository.set(
72-
PrefsBool.CHAT_UNSUB_ENABLED,
73-
event.enabled
74-
)
75-
76-
is Event.EnableGiveRequests -> prefRepository.set(
77-
PrefsBool.GIVE_REQUESTS_ENABLED,
78-
event.enabled
79-
)
80-
81-
is Event.EnableTipCard -> prefRepository.set(
82-
PrefsBool.TIPS_ENABLED,
83-
event.enabled
84-
)
85-
86-
is Event.EnableTipChats -> prefRepository.set(
87-
PrefsBool.TIPS_CHAT_ENABLED,
88-
event.enabled
89-
)
90-
91-
is Event.EnableTipsChatCash -> prefRepository.set(
92-
PrefsBool.TIPS_CHAT_CASH_ENABLED,
93-
event.enabled
94-
)
95-
96-
is Event.EnableCurrencySelectionInBalance -> prefRepository.set(
97-
PrefsBool.BALANCE_CURRENCY_SELECTION_ENABLED,
98-
event.enabled
99-
)
100-
101-
is Event.SetVibrateOnScan -> prefRepository.set(
102-
PrefsBool.VIBRATE_ON_SCAN,
103-
event.vibrate
104-
)
105-
106-
is Event.ShowErrors -> {
107-
prefRepository.set(PrefsBool.DISPLAY_ERRORS, event.display)
108-
ErrorUtils.setDisplayErrors(event.display)
109-
}
110-
111-
is Event.ShowNetworkDropOff -> prefRepository.set(
112-
PrefsBool.SHOW_CONNECTIVITY_STATUS,
113-
event.show
114-
)
115-
116-
is Event.UseDebugBuckets -> prefRepository.set(
117-
PrefsBool.BUCKET_DEBUGGER_ENABLED,
118-
event.enabled
119-
)
120-
121-
is Event.UpdateSettings -> Unit
122-
}
55+
.filterIsInstance<Event.Toggle>()
56+
.onEach {
57+
prefRepository.set(
58+
it.setting,
59+
it.state
60+
)
12361
}.launchIn(viewModelScope)
12462
}
12563

@@ -140,21 +78,12 @@ class BetaFlagsViewModel @Inject constructor(
14078
tipsEnabled = tipsEnabled,
14179
tipsChatEnabled = tipsChatEnabled,
14280
tipsChatCashEnabled = tipsChatCashEnabled,
81+
kadoWebViewEnabled = kadoWebViewEnabled,
14382
)
14483
}
14584
}
14685

147-
is Event.EnableBuyKin,
148-
is Event.EnableTipCard,
149-
is Event.EnableGiveRequests,
150-
is Event.ShowNetworkDropOff,
151-
is Event.UseDebugBuckets,
152-
is Event.EnableCurrencySelectionInBalance,
153-
is Event.SetVibrateOnScan,
154-
is Event.EnableChatUnsubscribe,
155-
is Event.EnableTipChats,
156-
is Event.EnableTipsChatCash,
157-
is Event.ShowErrors -> { state -> state }
86+
is Event.Toggle -> { state -> state }
15887
}
15988
}
16089
}

app/src/main/java/com/getcode/view/main/getKin/BuyKinScreen.kt

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,9 +15,11 @@ import androidx.compose.runtime.rememberCoroutineScope
1515
import androidx.compose.ui.Alignment
1616
import androidx.compose.ui.Modifier
1717
import androidx.compose.ui.platform.LocalContext
18+
import androidx.compose.ui.platform.LocalUriHandler
1819
import androidx.compose.ui.res.painterResource
1920
import androidx.compose.ui.res.stringResource
2021
import androidx.hilt.navigation.compose.hiltViewModel
22+
import com.getcode.LocalBetaFlags
2123
import com.getcode.LocalNetworkObserver
2224
import com.getcode.R
2325
import com.getcode.navigation.core.LocalCodeNavigator
@@ -30,7 +32,9 @@ import com.getcode.ui.components.Row
3032
import com.getcode.util.showNetworkError
3133
import com.getcode.utils.ErrorUtils
3234
import com.getcode.view.main.giveKin.AmountArea
35+
import kotlinx.coroutines.delay
3336
import kotlinx.coroutines.launch
37+
import kotlin.time.Duration.Companion.seconds
3438

3539
@Composable
3640
fun BuyKinScreen(
@@ -43,6 +47,8 @@ fun BuyKinScreen(
4347
val dataState by viewModel.state.collectAsState()
4448
val networkObserver = LocalNetworkObserver.current
4549
val networkState by networkObserver.state.collectAsState()
50+
val betaFlags = LocalBetaFlags.current
51+
val uriHandler = LocalUriHandler.current
4652

4753
Column(
4854
modifier = Modifier
@@ -118,7 +124,13 @@ fun BuyKinScreen(
118124

119125
composeScope.launch {
120126
viewModel.initiatePurchase()?.let {
121-
navigator.push(KadoWebScreen(it))
127+
if (betaFlags.kadoWebViewEnabled) {
128+
navigator.push(KadoWebScreen(it))
129+
} else {
130+
uriHandler.openUri(it)
131+
delay(1.seconds)
132+
onRedirected()
133+
}
122134
}
123135
}
124136
},

app/src/main/res/values/strings-universal.xml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@
2323
<string translatable="false" name="beta_tipchats">Tip Chats</string>
2424
<string translatable="false" name="beta_tipchats_cash">Tip Chats Cash</string>
2525
<string translatable="false" name="beta_balance_currency">Currency Selection in Balance</string>
26+
<string translatable="false" name="beta_kado_webview">Buy Kin Internally</string>
2627
<string translatable="false" name="beta_display_errors">Show Errors</string>
2728
<string name="beta_bucket_debugger_description" translatable="false">If enabled, you\'ll gain the ability to tap the balance on the Balance screen to inspect individual bucket balances.</string>
2829
<string name="beta_network_connectivity_description" translatable="false">If enabled, a \"No Connection\" badge will show on the scan screen when no internet is detected.</string>
@@ -35,6 +36,7 @@
3536
<string name="beta_tipcard_description" translatable="false">If enabled, you\'ll gain the ability to share a tip card.</string>
3637
<string name="beta_tipchats_description" translatable="false">If enabled, you\'ll gain the ability to chat with tippers.</string>
3738
<string name="beta_tipchats_cash_description" translatable="false">If enabled, you\'ll gain the ability to send Kin in Tip Chats.</string>
39+
<string name="beta_kado_webview_description" translatable="false">If enabled, the Buy Kin flow will open in an internal WebView.</string>
3840
<string name="subtitle_remoteSendText" translatable="false">%1$s %2$s</string>
3941
<string name="beta_resetTooltips" translatable="false">Reset Tooltips</string>
4042

0 commit comments

Comments
 (0)