Skip to content

Commit a108abe

Browse files
authored
Merge pull request #539 from code-payments/release/2.1.9
release 2.1.9
2 parents cdfa14f + e2ea85d commit a108abe

134 files changed

Lines changed: 1735 additions & 570 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

api/src/androidTest/java/com/getcode/models/intents/IntentDepositTest.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -53,7 +53,7 @@ class IntentDepositTest {
5353

5454
// Ensure the funds have been moved out of the
5555
// primary accounts and into the tray slots
56-
Assert.assertEquals(0.0, resultTray.owner.partialBalance.toKinValueDouble(), 0.0)
56+
assertEquals(0.0, resultTray.owner.partialBalance.toKinValueDouble(), 0.0)
5757

5858
assertEquals(1_000_000.0, resultTray.availableBalance.toKinValueDouble(), 0.0)
5959

Lines changed: 59 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,59 @@
1+
package com.getcode.manager
2+
3+
import androidx.annotation.DrawableRes
4+
import kotlinx.coroutines.flow.MutableStateFlow
5+
import kotlinx.coroutines.flow.StateFlow
6+
import kotlinx.coroutines.flow.asStateFlow
7+
import kotlinx.coroutines.flow.update
8+
import java.util.UUID
9+
10+
object ModalManager {
11+
data class Message(
12+
@DrawableRes
13+
val icon: Int? = null,
14+
val title: String,
15+
val subtitle: String = "",
16+
val positiveText: String,
17+
val negativeText: String? = null,
18+
val tertiaryText: String? = null,
19+
val onPositive: () -> Unit,
20+
val onNegative: () -> Unit = {},
21+
val onTertiary: () -> Unit = {},
22+
val onClose: (actionType: ActionType?) -> Unit = {},
23+
val type: MessageType = MessageType.DEFAULT,
24+
// val isDismissibleByTouchOutside: Boolean = true,
25+
val isDismissibleByBackButton: Boolean = true,
26+
val timeoutSeconds: Int? = null,
27+
val id: Long = UUID.randomUUID().mostSignificantBits,
28+
)
29+
30+
private val _messages: MutableStateFlow<List<Message>> = MutableStateFlow(
31+
listOf()
32+
)
33+
val messages: StateFlow<List<Message>> get() = _messages.asStateFlow()
34+
35+
fun showMessage(message: Message) {
36+
_messages.update { currentMessages ->
37+
currentMessages + message
38+
}
39+
}
40+
41+
fun setMessageShown(messageId: Long) {
42+
_messages.update { currentMessages ->
43+
currentMessages.filterNot { it.id == messageId }
44+
}
45+
}
46+
47+
fun clear() = _messages.update { listOf() }
48+
49+
fun clearByType(type: MessageType) = _messages.update { it.filterNot { m -> m.type == type } }
50+
51+
enum class MessageType { DEFAULT }
52+
53+
enum class ActionType {
54+
Positive,
55+
Negative,
56+
Tertiary
57+
}
58+
59+
}

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

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,4 +41,14 @@ data class RequestKinFeature(
4141
data class BalanceCurrencyFeature(
4242
override val enabled: Boolean = BetaOptions.Defaults.balanceCurrencySelectionEnabled,
4343
override val available: Boolean = true, // always available
44+
): Feature
45+
46+
data class CameraGesturesFeature(
47+
override val enabled: Boolean = BetaOptions.Defaults.cameraGesturesEnabled,
48+
override val available: Boolean = true, // always available
49+
): Feature
50+
51+
data class FlippableTipCardFeature(
52+
override val enabled: Boolean = BetaOptions.Defaults.canFlipTipCard,
53+
override val available: Boolean = true, // always available
4454
): Feature

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

Lines changed: 15 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -11,10 +11,17 @@ data class PrefBool(
1111
val value: Boolean
1212
)
1313

14+
// Used internally to control logic and UI
1415
sealed interface InternalRouting
16+
// User setting exposed in Settings -> App Settings
1517
sealed interface AppSetting
18+
// Beta flag exposed in Settings -> Beta Flags to enable bleeding edge features
1619
sealed interface BetaFlag
20+
// Dev settings
1721
sealed interface DevSetting
22+
// Once a feature behind a beta flag is made public, it becomes immutable
23+
// This removes it from the UI in Settings -> Beta Flags
24+
sealed interface Immutable
1825

1926

2027
sealed class PrefsBool(val value: String) {
@@ -24,6 +31,7 @@ sealed class PrefsBool(val value: String) {
2431
data object IS_ELIGIBLE_GET_FIRST_KIN_AIRDROP: PrefsBool("is_eligible_get_first_kin_airdrop"), InternalRouting
2532
data object IS_ELIGIBLE_GIVE_FIRST_KIN_AIRDROP: PrefsBool("is_eligible_give_first_kin_airdrop"), InternalRouting
2633
data object HAS_REMOVED_LOCAL_CURRENCY: PrefsBool("removed_local_currency"), InternalRouting
34+
data object DISMISSED_TIP_CARD_BANNER : PrefsBool("dismissed_tip_card_banner"), InternalRouting
2735
data object SEEN_TIP_CARD : PrefsBool("seen_tip_card"), InternalRouting
2836
data object STARTED_TIP_CONNECT: PrefsBool("started_tip_connect"), InternalRouting
2937

@@ -43,15 +51,17 @@ sealed class PrefsBool(val value: String) {
4351
data object DISPLAY_ERRORS: PrefsBool("debug_display_errors"), BetaFlag
4452
data object SHOW_CONNECTIVITY_STATUS: PrefsBool("debug_no_network"), BetaFlag
4553
data object GIVE_REQUESTS_ENABLED: PrefsBool("give_requests_enabled"), BetaFlag
46-
data object BUY_MODULE_ENABLED : PrefsBool("buy_kin_enabled"), BetaFlag
54+
data object BUY_MODULE_ENABLED : PrefsBool("buy_kin_enabled"), BetaFlag, Immutable
4755
data object CHAT_UNSUB_ENABLED: PrefsBool("chat_unsub_enabled"), BetaFlag
48-
data object TIPS_ENABLED : PrefsBool("tips_enabled"), BetaFlag
56+
data object TIPS_ENABLED : PrefsBool("tips_enabled"), BetaFlag, Immutable
4957
data object CONVERSATIONS_ENABLED: PrefsBool("conversations_enabled"), BetaFlag
5058
data object CONVERSATION_CASH_ENABLED: PrefsBool("convo_cash_enabled"), BetaFlag
51-
data object BALANCE_CURRENCY_SELECTION_ENABLED: PrefsBool("balance_currency_enabled"), BetaFlag
59+
data object BALANCE_CURRENCY_SELECTION_ENABLED: PrefsBool("balance_currency_enabled"), BetaFlag, Immutable
5260
data object KADO_WEBVIEW_ENABLED : PrefsBool("kado_inapp_enabled"), BetaFlag
53-
data object SHARE_TWEET_TO_TIP : PrefsBool("share_tweet_to_tip"), BetaFlag
54-
data object TIP_CARD_ON_HOMESCREEN: PrefsBool("tip_card_on_home_screen"), BetaFlag
61+
data object SHARE_TWEET_TO_TIP : PrefsBool("share_tweet_to_tip"), BetaFlag, Immutable
62+
data object TIP_CARD_ON_HOMESCREEN: PrefsBool("tip_card_on_home_screen"), BetaFlag, Immutable
63+
data object TIP_CARD_FLIPPABLE: PrefsBool("tipcard_flippable"), BetaFlag
64+
data object CAMERA_GESTURES_ENABLED: PrefsBool("camera_gestures_enabled"), BetaFlag
5565
}
5666

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

api/src/main/java/com/getcode/model/chat/ChatMessage.kt

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,6 @@ package com.getcode.model.chat
33
import com.getcode.ed25519.Ed25519.KeyPair
44
import com.getcode.model.Cursor
55
import com.getcode.model.ID
6-
import com.getcode.model.MessageStatus
76
import com.getcode.utils.serializer.UUIDSerializer
87
import kotlinx.serialization.Serializable
98
import java.util.UUID
@@ -18,7 +17,6 @@ import java.util.UUID
1817
* @param cursor Cursor value for this message for reference in a paged GetMessagesRequest
1918
* @param dateMillis Timestamp this message was generated at
2019
* @param contents Ordered message content. A message may have more than one piece of content.
21-
* @param status Derived [MessageStatus] from [Pointer]'s in [ChatMember].
2220
*/
2321
@Serializable
2422
data class ChatMessage(
@@ -29,7 +27,6 @@ data class ChatMessage(
2927
val cursor: Cursor,
3028
val dateMillis: Long,
3129
val contents: List<MessageContent>,
32-
// val status: MessageStatus,
3330
) {
3431
val hasEncryptedContent: Boolean
3532
get() {
@@ -40,7 +37,6 @@ data class ChatMessage(
4037
return ChatMessage(
4138
id = id,
4239
senderId = senderId,
43-
// status = status,
4440
isFromSelf = isFromSelf,
4541
dateMillis = dateMillis,
4642
cursor = cursor,

api/src/main/java/com/getcode/network/ChatHistoryController.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -116,7 +116,7 @@ class ChatHistoryController @Inject constructor(
116116
chatFlows[chatId] = it
117117
}
118118

119-
val unreadCount = notifications
119+
val notificationsUnreadCount = notifications
120120
.filterNotNull()
121121
// Ignore muted chats and unsubscribed chats
122122
.map { it.filter { c -> !c.isMuted && c.isSubscribed } }

api/src/main/java/com/getcode/network/TipController.kt

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -164,9 +164,17 @@ class TipController @Inject constructor(
164164
userMetadata = null
165165
}
166166

167+
fun onSeenTipCardBanner() {
168+
prefRepository.set(PrefsBool.DISMISSED_TIP_CARD_BANNER, true)
169+
endVerification()
170+
}
171+
172+
suspend fun hasSeenTipCard(): Boolean {
173+
return prefRepository.get(PrefsBool.SEEN_TIP_CARD, false)
174+
}
175+
167176
fun clearTwitterSplat() {
168177
prefRepository.set(PrefsBool.SEEN_TIP_CARD, true)
169-
endVerification()
170178
}
171179

172180
fun generateTipVerification(): String? {

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

Lines changed: 35 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,8 @@ data class BetaOptions(
2121
val kadoWebViewEnabled: Boolean,
2222
val shareTweetToTip: Boolean,
2323
val tipCardOnHomeScreen: Boolean,
24+
val cameraGesturesEnabled: Boolean,
25+
val canFlipTipCard: Boolean,
2426
) {
2527
companion object {
2628
// Default states for various beta flags in app.
@@ -38,8 +40,10 @@ data class BetaOptions(
3840
conversationCashEnabled = false,
3941
balanceCurrencySelectionEnabled = true,
4042
kadoWebViewEnabled = false,
41-
shareTweetToTip = false,
43+
shareTweetToTip = true,
4244
tipCardOnHomeScreen = true,
45+
cameraGesturesEnabled = true,
46+
canFlipTipCard = false
4347
)
4448
}
4549
}
@@ -76,7 +80,9 @@ class BetaFlagsRepository @Inject constructor(
7680
observeBetaFlag(PrefsBool.DISPLAY_ERRORS, default = defaults.displayErrors),
7781
observeBetaFlag(PrefsBool.KADO_WEBVIEW_ENABLED, default = defaults.kadoWebViewEnabled),
7882
observeBetaFlag(PrefsBool.SHARE_TWEET_TO_TIP, default = defaults.shareTweetToTip),
79-
observeBetaFlag(PrefsBool.TIP_CARD_ON_HOMESCREEN, defaults.tipCardOnHomeScreen)
83+
observeBetaFlag(PrefsBool.TIP_CARD_ON_HOMESCREEN, defaults.tipCardOnHomeScreen),
84+
observeBetaFlag(PrefsBool.CAMERA_GESTURES_ENABLED, defaults.cameraGesturesEnabled),
85+
observeBetaFlag(PrefsBool.TIP_CARD_FLIPPABLE, defaults.canFlipTipCard)
8086
) {
8187
BetaOptions(
8288
showNetworkDropOff = it[0],
@@ -93,7 +99,9 @@ class BetaFlagsRepository @Inject constructor(
9399
displayErrors = it[11],
94100
kadoWebViewEnabled = it[12],
95101
shareTweetToTip = it[13],
96-
tipCardOnHomeScreen = it[14]
102+
tipCardOnHomeScreen = it[14],
103+
cameraGesturesEnabled = it[15],
104+
canFlipTipCard = it[16],
97105
)
98106
}
99107
}
@@ -108,6 +116,29 @@ class BetaFlagsRepository @Inject constructor(
108116
}
109117

110118
suspend fun isEnabled(flag: PrefsBool): Boolean {
111-
return prefRepository.get(flag, false)
119+
return prefRepository.get(flag, default(flag))
120+
}
121+
122+
private fun default(flag: PrefsBool): Boolean {
123+
return with(BetaOptions.Defaults) {
124+
when (flag) {
125+
PrefsBool.BALANCE_CURRENCY_SELECTION_ENABLED -> balanceCurrencySelectionEnabled
126+
PrefsBool.BUCKET_DEBUGGER_ENABLED -> canViewBuckets
127+
PrefsBool.BUY_MODULE_ENABLED -> buyModuleEnabled
128+
PrefsBool.CHAT_UNSUB_ENABLED -> chatUnsubEnabled
129+
PrefsBool.CONVERSATIONS_ENABLED -> conversationsEnabled
130+
PrefsBool.CONVERSATION_CASH_ENABLED -> conversationCashEnabled
131+
PrefsBool.DISPLAY_ERRORS -> displayErrors
132+
PrefsBool.GIVE_REQUESTS_ENABLED -> giveRequestsEnabled
133+
PrefsBool.KADO_WEBVIEW_ENABLED -> kadoWebViewEnabled
134+
PrefsBool.LOG_SCAN_TIMES -> debugScanTimesEnabled
135+
PrefsBool.SHARE_TWEET_TO_TIP -> shareTweetToTip
136+
PrefsBool.SHOW_CONNECTIVITY_STATUS -> showNetworkDropOff
137+
PrefsBool.TIPS_ENABLED -> tipsEnabled
138+
PrefsBool.TIP_CARD_ON_HOMESCREEN -> tipCardOnHomeScreen
139+
PrefsBool.VIBRATE_ON_SCAN -> tickOnScan
140+
else -> false
141+
}
142+
}
112143
}
113144
}

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

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,12 +2,14 @@ package com.getcode.network.repository
22

33
import com.getcode.model.BalanceCurrencyFeature
44
import com.getcode.model.BuyModuleFeature
5+
import com.getcode.model.CameraGesturesFeature
56
import com.getcode.model.PrefsBool
67
import com.getcode.model.RequestKinFeature
78
import com.getcode.model.TipCardFeature
89
import com.getcode.model.TipCardOnHomeScreenFeature
910
import com.getcode.model.ConversationCashFeature
1011
import com.getcode.model.ConversationsFeature
12+
import com.getcode.model.FlippableTipCardFeature
1113
import kotlinx.coroutines.flow.combine
1214
import kotlinx.coroutines.flow.map
1315
import javax.inject.Inject
@@ -26,9 +28,12 @@ class FeatureRepository @Inject constructor(
2628

2729
val tipCards = betaFlags.observe().map { TipCardFeature(it.tipsEnabled) }
2830
val tipCardOnHomeScreen = betaFlags.observe().map { TipCardOnHomeScreenFeature(it.tipCardOnHomeScreen) }
31+
val tipCardFlippable = betaFlags.observe().map { FlippableTipCardFeature(it.canFlipTipCard) }
2932
val conversations = betaFlags.observe().map { ConversationsFeature(it.conversationsEnabled) }
3033
val conversationsCash = betaFlags.observe().map { ConversationCashFeature(it.conversationCashEnabled) }
3134

35+
val cameraGestures = betaFlags.observe().map { CameraGesturesFeature(it.cameraGesturesEnabled) }
36+
3237
val requestKin = betaFlags.observe().map { RequestKinFeature(it.giveRequestsEnabled) }
3338

3439
val balanceCurrencySelection = betaFlags.observe().map { BalanceCurrencyFeature(it.balanceCurrencySelectionEnabled) }

app/build.gradle.kts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -117,6 +117,7 @@ dependencies {
117117
implementation(project(":api"))
118118
implementation(project(":crypto:ed25519"))
119119
implementation(project(":crypto:kin"))
120+
implementation(project(":common:components"))
120121
implementation(project(":common:resources"))
121122
implementation(project(":common:theme"))
122123
implementation(project(":vendor:tipkit:tipkit-m2"))

0 commit comments

Comments
 (0)