Skip to content

Commit 12ccef8

Browse files
author
Jeff Yanta
committed
Merge branch 'develop'
2 parents 7811ae1 + 364cee2 commit 12ccef8

26 files changed

Lines changed: 241 additions & 110 deletions

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

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,14 +22,17 @@ sealed class PrefsBool(val value: String) {
2222
data object HAS_REMOVED_LOCAL_CURRENCY: PrefsBool("removed_local_currency")
2323
data object SEEN_TIP_CARD : PrefsBool("seen_tip_card")
2424

25+
data object BUY_MODULE_AVAILABLE : PrefsBool("buy_module_available")
26+
2527
// beta flags
2628
data object BUCKET_DEBUGGER_ENABLED: PrefsBool("debug_buckets"), BetaFlag
2729
data object VIBRATE_ON_SCAN: PrefsBool("vibrate_on_scan"), BetaFlag
2830
data object LOG_SCAN_TIMES: PrefsBool("debug_scan_times"), BetaFlag
2931
data object DISPLAY_ERRORS: PrefsBool("debug_display_errors"), BetaFlag
3032
data object SHOW_CONNECTIVITY_STATUS: PrefsBool("debug_no_network"), BetaFlag
3133
data object GIVE_REQUESTS_ENABLED: PrefsBool("give_requests_enabled"), BetaFlag
32-
data object BUY_KIN_ENABLED : PrefsBool("buy_kin_enabled"), BetaFlag
34+
data object BUY_MODULE_ENABLED : PrefsBool("buy_kin_enabled"), BetaFlag
35+
3336
data object ESTABLISH_CODE_RELATIONSHIP : PrefsBool("establish_code_relationship_enabled"), BetaFlag
3437
data object CHAT_UNSUB_ENABLED: PrefsBool("chat_unsub_enabled"), BetaFlag
3538
data object TIPS_ENABLED : PrefsBool("tips_enabled"), BetaFlag

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,7 @@ data class TwitterUser(
3737
}
3838

3939
enum class VerificationStatus {
40-
none, blue, government, unknown
40+
none, blue, business, government, unknown
4141
}
4242

4343
companion object {

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

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ data class BetaOptions(
1313
val debugScanTimesEnabled: Boolean,
1414
val displayErrors: Boolean,
1515
val giveRequestsEnabled: Boolean,
16-
val buyKinEnabled: Boolean,
16+
val buyModuleEnabled: Boolean,
1717
val establishCodeRelationship: Boolean,
1818
val chatUnsubEnabled: Boolean,
1919
val tipsEnabled: Boolean,
@@ -29,7 +29,7 @@ data class BetaOptions(
2929
debugScanTimesEnabled = false,
3030
displayErrors = false,
3131
giveRequestsEnabled = false,
32-
buyKinEnabled = false,
32+
buyModuleEnabled = false,
3333
establishCodeRelationship = false,
3434
chatUnsubEnabled = false,
3535
tipsEnabled = false,
@@ -60,7 +60,7 @@ class BetaFlagsRepository @Inject constructor(
6060
observeBetaFlag(PrefsBool.VIBRATE_ON_SCAN, default = defaults.tickOnScan),
6161
observeBetaFlag(PrefsBool.LOG_SCAN_TIMES, default = defaults.debugScanTimesEnabled),
6262
observeBetaFlag(PrefsBool.GIVE_REQUESTS_ENABLED, default = defaults.giveRequestsEnabled),
63-
observeBetaFlag(PrefsBool.BUY_KIN_ENABLED, default = defaults.buyKinEnabled),
63+
observeBetaFlag(PrefsBool.BUY_MODULE_ENABLED, default = defaults.buyModuleEnabled),
6464
observeBetaFlag(PrefsBool.ESTABLISH_CODE_RELATIONSHIP, default = defaults.establishCodeRelationship),
6565
observeBetaFlag(PrefsBool.CHAT_UNSUB_ENABLED, default = defaults.chatUnsubEnabled),
6666
observeBetaFlag(PrefsBool.TIPS_ENABLED, default = defaults.tipsEnabled),
@@ -74,7 +74,7 @@ class BetaFlagsRepository @Inject constructor(
7474
tickOnScan = vibez,
7575
debugScanTimesEnabled = times,
7676
giveRequestsEnabled = giveRequests,
77-
buyKinEnabled = buyKin,
77+
buyModuleEnabled = buyKin,
7878
establishCodeRelationship = relationship,
7979
chatUnsubEnabled = chatUnsub,
8080
tipsEnabled = tips,

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

Lines changed: 12 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -40,11 +40,11 @@ class IdentityRepository @Inject constructor(
4040
val enableDebugOptions: Boolean,
4141
val eligibleAirdrops: Set<AirdropType>,
4242
val isPhoneNumberLinked: Boolean,
43-
val buyModuleEnabled: Boolean,
43+
val buyModuleAvailable: Boolean,
4444
)
4545

4646
fun getUser(
47-
keyPair: Ed25519.KeyPair,
47+
keyPair: KeyPair,
4848
phoneValue: String
4949
): Flowable<GetUserResponse> {
5050
if (isMock()) return Flowable.just(
@@ -54,7 +54,7 @@ class IdentityRepository @Inject constructor(
5454
enableDebugOptions = false,
5555
eligibleAirdrops = setOf(),
5656
isPhoneNumberLinked = true,
57-
buyModuleEnabled = false,
57+
buyModuleAvailable = false
5858
)
5959
)
6060

@@ -78,7 +78,7 @@ class IdentityRepository @Inject constructor(
7878
)
7979
}?.toSet() ?: throw Exception("Error: Null data"),
8080
isPhoneNumberLinked = it.phone?.isLinked ?: throw Exception("Error: Null data"),
81-
buyModuleEnabled = it.enableBuyModule
81+
buyModuleAvailable = false,
8282
)
8383
}
8484
.let { networkOracle.managedRequest(it) }
@@ -102,8 +102,8 @@ class IdentityRepository @Inject constructor(
102102
user.enableDebugOptions
103103
)
104104
prefRepository.set(
105-
PrefsBool.BUY_KIN_ENABLED,
106-
user.buyModuleEnabled
105+
PrefsBool.BUY_MODULE_AVAILABLE,
106+
user.buyModuleAvailable
107107
)
108108
prefRepository.set(
109109
PrefsBool.IS_ELIGIBLE_GET_FIRST_KIN_AIRDROP,
@@ -130,9 +130,9 @@ class IdentityRepository @Inject constructor(
130130
prefRepository.getFlowable(PrefsBool.IS_ELIGIBLE_GET_FIRST_KIN_AIRDROP),
131131
prefRepository.getFlowable(PrefsBool.IS_ELIGIBLE_GIVE_FIRST_KIN_AIRDROP),
132132
Flowable.just(phoneRepository.phoneLinked),
133-
prefRepository.getFlowable(PrefsBool.BUY_KIN_ENABLED),
134-
) { userId, dataContainerId, isDebugAllowed, isEligibleGetFirstKinAirdrop, isEligibleGiveFirstKinAirdrop, isPhoneNumberLinked, buyModuleEnabled ->
135-
var eligibleAirdrops = Sets.newHashSet<AirdropType>()
133+
prefRepository.getFlowable(PrefsBool.BUY_MODULE_AVAILABLE),
134+
) { userId, dataContainerId, isDebugAllowed, isEligibleGetFirstKinAirdrop, isEligibleGiveFirstKinAirdrop, isPhoneNumberLinked, buyModuleAvailable ->
135+
val eligibleAirdrops = Sets.newHashSet<AirdropType>()
136136
if (isEligibleGetFirstKinAirdrop) {
137137
eligibleAirdrops.add(AirdropType.GetFirstKin)
138138
}
@@ -145,7 +145,7 @@ class IdentityRepository @Inject constructor(
145145
enableDebugOptions = isDebugAllowed,
146146
eligibleAirdrops = eligibleAirdrops,
147147
isPhoneNumberLinked = isPhoneNumberLinked.value,
148-
buyModuleEnabled = buyModuleEnabled
148+
buyModuleAvailable = buyModuleAvailable,
149149
)
150150
}
151151
.filter { it.userId.isNotEmpty() && it.dataContainerId.isNotEmpty() }
@@ -154,7 +154,7 @@ class IdentityRepository @Inject constructor(
154154

155155

156156
fun linkAccount(
157-
keyPair: Ed25519.KeyPair,
157+
keyPair: KeyPair,
158158
phoneValue: String,
159159
code: String
160160
): Single<IdentityService.LinkAccountResponse.Result> {
@@ -183,7 +183,7 @@ class IdentityRepository @Inject constructor(
183183
}
184184

185185
fun unlinkAccount(
186-
keyPair: Ed25519.KeyPair,
186+
keyPair: KeyPair,
187187
phoneValue: String
188188
): Single<IdentityService.UnlinkAccountResponse.Result> {
189189
if (isMock()) return Single.just(IdentityService.UnlinkAccountResponse.Result.OK)

app/src/main/java/com/getcode/CodeApp.kt

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -53,7 +53,6 @@ fun CodeApp() {
5353
AppNavHost {
5454
val codeNavigator = LocalCodeNavigator.current
5555

56-
5756
CodeScaffold(
5857
scaffoldState = appState.scaffoldState
5958
) { innerPaddingModifier ->

app/src/main/java/com/getcode/TopLevelViewModel.kt

Lines changed: 21 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -3,32 +3,49 @@ package com.getcode
33
import android.app.Activity
44
import androidx.lifecycle.viewModelScope
55
import com.getcode.manager.AuthManager
6+
import com.getcode.model.PrefsBool
67
import com.getcode.network.repository.BetaFlagsRepository
78
import com.getcode.network.repository.BetaOptions
9+
import com.getcode.network.repository.PrefRepository
810
import com.getcode.util.resources.ResourceHelper
911
import com.getcode.view.BaseViewModel
10-
import com.getcode.view.BaseViewModel2
1112
import dagger.hilt.android.lifecycle.HiltViewModel
1213
import kotlinx.coroutines.flow.MutableSharedFlow
1314
import kotlinx.coroutines.flow.SharedFlow
1415
import kotlinx.coroutines.flow.SharingStarted
1516
import kotlinx.coroutines.flow.asSharedFlow
16-
import kotlinx.coroutines.flow.map
17+
import kotlinx.coroutines.flow.combine
1718
import kotlinx.coroutines.flow.stateIn
1819
import javax.inject.Inject
1920

2021
@HiltViewModel
2122
class TopLevelViewModel @Inject constructor(
2223
private val authManager: AuthManager,
2324
betaFlagsRepository: BetaFlagsRepository,
25+
prefRepository: PrefRepository,
2426
resources: ResourceHelper,
2527
) : BaseViewModel(resources) {
2628

2729
private val _eventFlow: MutableSharedFlow<Event> = MutableSharedFlow()
2830
val eventFlow: SharedFlow<Event> = _eventFlow.asSharedFlow()
2931

30-
val betaFlags = betaFlagsRepository.observe()
31-
.stateIn(viewModelScope, started = SharingStarted.Eagerly, BetaOptions.Defaults)
32+
private val betaFlags = betaFlagsRepository.observe()
33+
34+
val state = combine(
35+
betaFlags,
36+
prefRepository.observeOrDefault(PrefsBool.BUY_MODULE_AVAILABLE, false)
37+
) { beta, buykinAvailable ->
38+
State(beta, buykinAvailable)
39+
} .stateIn(viewModelScope, started = SharingStarted.Eagerly, State.Empty)
40+
41+
data class State(
42+
val betaFlags: BetaOptions,
43+
val buyModuleAvailable: Boolean,
44+
) {
45+
companion object {
46+
val Empty = State(BetaOptions.Defaults, false)
47+
}
48+
}
3249

3350
sealed interface Event {
3451
data object LogoutRequested: Event

app/src/main/java/com/getcode/navigation/screens/ModalScreens.kt

Lines changed: 13 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -285,7 +285,7 @@ data object ReferFriendScreen : MainGraph, ModalContent {
285285
}
286286

287287
@Parcelize
288-
data object CurrencySelectionModal: MainGraph, ModalContent {
288+
data object CurrencySelectionModal : MainGraph, ModalContent {
289289
@IgnoredOnParcel
290290
override val key: ScreenKey = uniqueScreenKey
291291

@@ -313,7 +313,7 @@ data object CurrencySelectionModal: MainGraph, ModalContent {
313313
@Parcelize
314314
data class BuyMoreKinModal(
315315
val showClose: Boolean = false,
316-
): MainGraph, ModalRoot {
316+
) : MainGraph, ModalRoot {
317317

318318
@IgnoredOnParcel
319319
override val key: ScreenKey = uniqueScreenKey
@@ -325,13 +325,16 @@ data class BuyMoreKinModal(
325325
override fun Content() {
326326
val navigator = LocalCodeNavigator.current
327327
val content = @Composable {
328-
BuyKinScreen(getViewModel()) {
329-
if (showClose) {
330-
navigator.hide()
331-
} else {
332-
navigator.popAll()
328+
BuyKinScreen(
329+
viewModel = getViewModel(),
330+
onRedirected = {
331+
if (showClose) {
332+
navigator.hide()
333+
} else {
334+
navigator.popAll()
335+
}
333336
}
334-
}
337+
)
335338
}
336339

337340
if (showClose) {
@@ -368,7 +371,7 @@ data class BuyMoreKinModal(
368371
}
369372

370373
@Parcelize
371-
data object EnterTipModal: MainGraph, ModalRoot {
374+
data object EnterTipModal : MainGraph, ModalRoot {
372375

373376
@IgnoredOnParcel
374377
override val key: ScreenKey = uniqueScreenKey
@@ -396,7 +399,7 @@ data object EnterTipModal: MainGraph, ModalRoot {
396399
}
397400

398401
@Parcelize
399-
data object RequestTip: MainGraph, ModalContent {
402+
data object RequestTip : MainGraph, ModalContent {
400403
@IgnoredOnParcel
401404
override val key: ScreenKey = uniqueScreenKey
402405

app/src/main/java/com/getcode/navigation/screens/Modals.kt

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,6 @@ import com.getcode.ui.components.keyboardAsState
3333
import com.getcode.ui.utils.getActivityScopedViewModel
3434
import kotlinx.coroutines.delay
3535
import kotlinx.coroutines.launch
36-
import timber.log.Timber
3736

3837

3938
@Composable
@@ -134,10 +133,10 @@ internal fun Screen.ModalContainer(
134133
.windowInsetsPadding(WindowInsets.navigationBars)
135134
) {
136135
val tlvm = MainRoot.getActivityScopedViewModel<TopLevelViewModel>()
137-
val betaOptions by tlvm.betaFlags.collectAsState()
136+
val state by tlvm.state.collectAsState()
138137
CompositionLocalProvider(
139138
LocalOverscrollConfiguration provides null,
140-
LocalBetaFlags provides betaOptions
139+
LocalBetaFlags provides state.betaFlags,
141140
) {
142141
screenContent()
143142
}

app/src/main/java/com/getcode/ui/components/TwitterUsernameDisplay.kt

Lines changed: 5 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -34,23 +34,22 @@ fun TwitterUsernameDisplay(
3434
)
3535
Text(text = username, style = CodeTheme.typography.subtitle1)
3636
verificationStatus?.let { status ->
37-
if (status.hasCheckmark()) {
37+
status.checkmark()?.let { asset ->
3838
Image(
39-
painter = rememberVectorPainter(image = status.checkmark()),
39+
painter = rememberVectorPainter(image = asset),
4040
contentDescription = null
4141
)
4242
}
4343
}
4444
}
4545
}
4646

47-
fun TwitterUser.VerificationStatus.hasCheckmark(): Boolean = this == TwitterUser.VerificationStatus.blue || this == TwitterUser.VerificationStatus.government
48-
4947
@Composable
50-
fun TwitterUser.VerificationStatus.checkmark(): ImageVector {
48+
fun TwitterUser.VerificationStatus.checkmark(): ImageVector? {
5149
return when (this) {
5250
TwitterUser.VerificationStatus.blue -> ImageVector.vectorResource(id = R.drawable.ic_twitter_verified_badge)
51+
TwitterUser.VerificationStatus.business -> ImageVector.vectorResource(id = R.drawable.ic_twitter_verified_badge_gold)
5352
TwitterUser.VerificationStatus.government -> ImageVector.vectorResource(id = R.drawable.ic_twitter_verified_badge_gray)
54-
else -> throw NotImplementedError()
53+
else -> null
5554
}
5655
}

app/src/main/java/com/getcode/ui/components/chat/utils/LocalizedText.kt

Lines changed: 32 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -152,15 +152,27 @@ fun Verb.localizedText(resources: ResourceHelper): String {
152152
Verb.Received,
153153
Verb.Sent,
154154
Verb.Spent,
155-
Verb.Withdrew,
156-
Verb.ReceivedTip,
157-
Verb.SentTip -> {
155+
Verb.Withdrew -> {
158156
resources.getIdentifier(
159157
"subtitle_you${this@localizedText.toString().capitalize(Locale.ENGLISH)}",
160158
ResourceType.String,
161159
).let { if (it == 0) null else it }
162160
}
163161

162+
Verb.ReceivedTip -> {
163+
resources.getIdentifier(
164+
"subtitle_someoneTippedYou",
165+
ResourceType.String,
166+
).let { if (it == 0) null else it }
167+
}
168+
169+
Verb.SentTip -> {
170+
resources.getIdentifier(
171+
"subtitle_youTipped",
172+
ResourceType.String,
173+
).let { if (it == 0) null else it }
174+
}
175+
164176
Verb.Returned -> {
165177
resources.getIdentifier(
166178
"subtitle_was${this@localizedText.toString().capitalize(Locale.ENGLISH)}ToYou",
@@ -187,16 +199,30 @@ val Verb.localizedText: String
187199
Verb.Received,
188200
Verb.Sent,
189201
Verb.Spent,
190-
Verb.Withdrew,
191-
Verb.ReceivedTip,
192-
Verb.SentTip -> {
202+
Verb.Withdrew -> {
193203
resources.getIdentifier(
194204
"subtitle_you${this@localizedText.toString().capitalize(Locale.ENGLISH)}",
195205
"string",
196206
BuildConfig.APPLICATION_ID
197207
).let { if (it == 0) null else it }
198208
}
199209

210+
Verb.ReceivedTip -> {
211+
resources.getIdentifier(
212+
"subtitle_someoneTippedYou",
213+
"string",
214+
BuildConfig.APPLICATION_ID
215+
).let { if (it == 0) null else it }
216+
}
217+
218+
Verb.SentTip -> {
219+
resources.getIdentifier(
220+
"subtitle_youTipped",
221+
"string",
222+
BuildConfig.APPLICATION_ID
223+
).let { if (it == 0) null else it }
224+
}
225+
200226
Verb.Returned -> {
201227
resources.getIdentifier(
202228
"subtitle_was${this@localizedText.toString().capitalize(Locale.ENGLISH)}ToYou",

0 commit comments

Comments
 (0)