Skip to content

Commit 225a129

Browse files
author
Jeff Yanta
committed
Merge branch 'develop'
2 parents 05da821 + cf1c99e commit 225a129

29 files changed

Lines changed: 601 additions & 159 deletions

File tree

api/src/main/java/com/getcode/analytics/AnalyticsManager.kt

Lines changed: 23 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,11 @@
11
package com.getcode.analytics
22

33
import com.getcode.api.BuildConfig
4+
import com.getcode.model.AppSetting
45
import com.getcode.model.CurrencyCode
56
import com.getcode.model.Kin
67
import com.getcode.model.KinAmount
8+
import com.getcode.model.PrefsBool
79
import com.getcode.solana.keys.PublicKey
810
import com.getcode.solana.keys.base58
911
import com.google.firebase.ktx.Firebase
@@ -92,7 +94,11 @@ class AnalyticsManager @Inject constructor(
9294
)
9395
}
9496

95-
override fun billHidden(kin: Kin, currencyCode: CurrencyCode, animation: BillPresentationStyle) {
97+
override fun billHidden(
98+
kin: Kin,
99+
currencyCode: CurrencyCode,
100+
animation: BillPresentationStyle
101+
) {
96102
track(
97103
Name.Bill,
98104
Pair(Property.State, StringValue.Hidden.value),
@@ -247,6 +253,17 @@ class AnalyticsManager @Inject constructor(
247253
track(Name.BackgroundSwap)
248254
}
249255

256+
override fun appSettingToggled(setting: AppSetting, value: Boolean) {
257+
val name = when (setting) {
258+
PrefsBool.CAMERA_START_BY_DEFAULT -> Name.AutoStartCamera
259+
}
260+
261+
track(
262+
name,
263+
Property.State to if (value) StringValue.Yes.value else StringValue.No.value,
264+
)
265+
}
266+
250267
private fun track(event: Name, vararg properties: Pair<Property, String>) {
251268
if (BuildConfig.DEBUG) {
252269
Timber.d("debug track $event, ${properties.map { "${it.first.name}, ${it.second}" }}")
@@ -292,6 +309,9 @@ class AnalyticsManager @Inject constructor(
292309
ErrorRequest("Error Request"),
293310

294311
Recompute("Recompute"),
312+
313+
// App Settings
314+
AutoStartCamera("Auto Start Camera")
295315
}
296316

297317
enum class Property(val value: String) {
@@ -343,6 +363,8 @@ class AnalyticsManager @Inject constructor(
343363
Backup("Backup Screen"),
344364
Withdraw("Withdraw Screen"),
345365
Debug("Debug Screen"),
366+
Share("Share Screen"),
367+
AppSettings("App Settings"),
346368
ForceUpgrade("Force Upgrade"),
347369
BuyMoreKin("Buy More Kin Screen"),
348370
SendKin("Send Kin Screen"),

api/src/main/java/com/getcode/analytics/AnalyticsService.kt

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
package com.getcode.analytics
22

3+
import com.getcode.model.AppSetting
34
import com.getcode.model.CurrencyCode
45
import com.getcode.model.Kin
56
import com.getcode.model.KinAmount
@@ -47,6 +48,8 @@ interface AnalyticsService {
4748

4849
fun backgroundSwapInitiated()
4950
fun unintentionalLogout()
51+
52+
fun appSettingToggled(setting: AppSetting, value: Boolean)
5053
}
5154

5255
class AnalyticsServiceNull : AnalyticsService {
@@ -90,4 +93,5 @@ class AnalyticsServiceNull : AnalyticsService {
9093
override fun tipCardShown(username: String) = Unit
9194
override fun backgroundSwapInitiated() = Unit
9295
override fun unintentionalLogout() = Unit
96+
override fun appSettingToggled(setting: AppSetting, value: Boolean) = Unit
9397
}

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

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

14-
14+
sealed interface InternalRouting
15+
sealed interface AppSetting
1516
sealed interface BetaFlag
17+
18+
1619
sealed class PrefsBool(val value: String) {
1720
// internal routing
18-
data object IS_DEBUG_ACTIVE: PrefsBool("debug_menu_active")
19-
data object IS_DEBUG_ALLOWED: PrefsBool("debug_menu_allowed")
20-
data object IS_ELIGIBLE_GET_FIRST_KIN_AIRDROP: PrefsBool("is_eligible_get_first_kin_airdrop")
21-
data object IS_ELIGIBLE_GIVE_FIRST_KIN_AIRDROP: PrefsBool("is_eligible_give_first_kin_airdrop")
22-
data object HAS_REMOVED_LOCAL_CURRENCY: PrefsBool("removed_local_currency")
23-
data object SEEN_TIP_CARD : PrefsBool("seen_tip_card")
21+
data object IS_DEBUG_ACTIVE: PrefsBool("debug_menu_active"), InternalRouting
22+
data object IS_DEBUG_ALLOWED: PrefsBool("debug_menu_allowed"), InternalRouting
23+
data object IS_ELIGIBLE_GET_FIRST_KIN_AIRDROP: PrefsBool("is_eligible_get_first_kin_airdrop"), InternalRouting
24+
data object IS_ELIGIBLE_GIVE_FIRST_KIN_AIRDROP: PrefsBool("is_eligible_give_first_kin_airdrop"), InternalRouting
25+
data object HAS_REMOVED_LOCAL_CURRENCY: PrefsBool("removed_local_currency"), InternalRouting
26+
data object SEEN_TIP_CARD : PrefsBool("seen_tip_card"), InternalRouting
2427

25-
data object BUY_MODULE_AVAILABLE : PrefsBool("buy_module_available")
28+
data object BUY_MODULE_AVAILABLE : PrefsBool("buy_module_available"), InternalRouting
29+
30+
// app settings
31+
data object CAMERA_START_BY_DEFAULT: PrefsBool("camera_start_default"), AppSetting
2632

2733
// beta flags
2834
data object BUCKET_DEBUGGER_ENABLED: PrefsBool("debug_buckets"), BetaFlag
@@ -39,4 +45,6 @@ sealed class PrefsBool(val value: String) {
3945
data object TIPS_CHAT_ENABLED: PrefsBool("tips_chat_enabled"), BetaFlag
4046
data object TIPS_CHAT_CASH_ENABLED: PrefsBool("tips_chat_cash_enabled"), BetaFlag
4147
data object BALANCE_CURRENCY_SELECTION_ENABLED: PrefsBool("balance_currency_enabled"), BetaFlag
42-
}
48+
}
49+
50+
val APP_SETTINGS: List<AppSetting> = listOf(PrefsBool.CAMERA_START_BY_DEFAULT)
Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
package com.getcode.network.repository
2+
3+
import com.getcode.analytics.AnalyticsService
4+
import com.getcode.model.AppSetting
5+
import com.getcode.model.PrefsBool
6+
import kotlinx.coroutines.flow.Flow
7+
import kotlinx.coroutines.flow.map
8+
import javax.inject.Inject
9+
10+
data class AppSettings(
11+
val cameraStartByDefault: Boolean
12+
) {
13+
companion object {
14+
val Defaults = AppSettings(
15+
cameraStartByDefault = true
16+
)
17+
}
18+
}
19+
class AppSettingsRepository @Inject constructor(
20+
private val prefRepository: PrefRepository,
21+
private val analytics: AnalyticsService,
22+
) {
23+
24+
fun observe(): Flow<AppSettings> = AppSettings.Defaults.let { defaults ->
25+
prefRepository.observeOrDefault(PrefsBool.CAMERA_START_BY_DEFAULT, defaults.cameraStartByDefault)
26+
.map { AppSettings(it) }
27+
}
28+
29+
suspend fun get(setting: AppSetting): Boolean {
30+
return when (setting) {
31+
PrefsBool.CAMERA_START_BY_DEFAULT -> prefRepository.get(
32+
PrefsBool.CAMERA_START_BY_DEFAULT,
33+
AppSettings.Defaults.cameraStartByDefault
34+
)
35+
}
36+
}
37+
38+
fun update(setting: AppSetting, value: Boolean) {
39+
analytics.appSettingToggled(setting, value)
40+
when (setting) {
41+
PrefsBool.CAMERA_START_BY_DEFAULT -> {
42+
prefRepository.set(PrefsBool.CAMERA_START_BY_DEFAULT, value)
43+
}
44+
}
45+
}
46+
}

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

Lines changed: 4 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -381,7 +381,7 @@ class TransactionRepository @Inject constructor(
381381
serverMessageStream?.onCompleted()
382382
subject.onError(
383383
ErrorSubmitIntentException(
384-
ErrorSubmitIntent.fromValue(value.error.codeValue),
384+
ErrorSubmitIntent.invoke(value.error),
385385
)
386386
)
387387
}
@@ -729,11 +729,11 @@ class TransactionRepository @Inject constructor(
729729
data object DeviceTokenUnavailable: ErrorSubmitIntent(-2)
730730

731731
companion object {
732-
operator fun invoke(proto: SubmitIntentResponse.Error): ErrorSubmitIntent? {
732+
operator fun invoke(proto: SubmitIntentResponse.Error): ErrorSubmitIntent {
733733
return when (proto.code) {
734734
SubmitIntentResponse.Error.Code.DENIED -> {
735735
val reasons = proto.errorDetailsList.mapNotNull {
736-
if (!it.hasIntentDenied()) return null
736+
if (!it.hasIntentDenied()) return@mapNotNull null
737737
DeniedReason.fromValue(it.intentDenied.reasonValue)
738738
}
739739

@@ -743,14 +743,9 @@ class TransactionRepository @Inject constructor(
743743
SubmitIntentResponse.Error.Code.SIGNATURE_ERROR -> SignatureError
744744
SubmitIntentResponse.Error.Code.STALE_STATE -> StaleState
745745
SubmitIntentResponse.Error.Code.UNRECOGNIZED -> Unknown
746-
else -> return null
746+
else -> return Unknown
747747
}
748748
}
749-
750-
fun fromValue(value: Int): ErrorSubmitIntent {
751-
return listOf(Denied(), InvalidIntent, SignatureError, StaleState)
752-
.firstOrNull { it.value == value } ?: Unknown
753-
}
754749
}
755750
}
756751

app/src/main/java/com/getcode/manager/AuthManager.kt

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -236,14 +236,14 @@ class AuthManager @Inject constructor(
236236
}
237237
.doOnSuccess {
238238
taggedTrace("account data fetched successfully")
239-
launch { savePrefs(phone!!, user!!) }
240-
launch { exchange.fetchRatesIfNeeded() }
241-
launch { historyController.fetchChats() }
242239
if (!BuildConfig.DEBUG) {
243240
if (Bugsnag.isStarted()) {
244241
Bugsnag.setUser(null, phone?.phoneNumber, null)
245242
}
246243
}
244+
launch { savePrefs(phone!!, user!!) }
245+
launch { exchange.fetchRatesIfNeeded() }
246+
launch { historyController.fetchChats() }
247247
}
248248
}
249249

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

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -240,6 +240,11 @@ data object ShareDownloadLinkModal : MainGraph, ModalRoot {
240240
) {
241241
ShareDownloadScreen()
242242
}
243+
244+
AnalyticsScreenWatcher(
245+
lifecycleOwner = LocalLifecycleOwner.current,
246+
event = AnalyticsManager.Screen.Share
247+
)
243248
}
244249
}
245250

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

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ import com.getcode.view.main.account.AccountDeposit
2020
import com.getcode.view.main.account.AccountDetails
2121
import com.getcode.view.main.account.AccountFaq
2222
import com.getcode.view.main.account.AccountPhone
23+
import com.getcode.view.main.account.AppSettingsScreen
2324
import com.getcode.view.main.account.BackupKey
2425
import com.getcode.view.main.account.BetaFlagsScreen
2526
import com.getcode.view.main.account.ConfirmDeleteAccount
@@ -101,6 +102,27 @@ data object AccountDebugOptionsScreen : MainGraph, ModalContent {
101102
}
102103
}
103104

105+
@Parcelize
106+
data object AppSettingsScreen : MainGraph, ModalContent {
107+
@IgnoredOnParcel
108+
override val key: ScreenKey = uniqueScreenKey
109+
110+
override val name: String
111+
@Composable get() = stringResource(id = R.string.title_appSettings)
112+
113+
@Composable
114+
override fun Content() {
115+
ModalContainer(backButtonEnabled = { it is AppSettingsScreen }) {
116+
AppSettingsScreen(getViewModel())
117+
}
118+
119+
AnalyticsScreenWatcher(
120+
lifecycleOwner = LocalLifecycleOwner.current,
121+
event = AnalyticsManager.Screen.AppSettings
122+
)
123+
}
124+
}
125+
104126
@Parcelize
105127
data object AccountDetailsScreen : MainGraph, ModalContent {
106128
@IgnoredOnParcel

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

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,10 @@ fun CodeButton(
4444
isLoading: Boolean = false,
4545
isSuccess: Boolean = false,
4646
enabled: Boolean = true,
47+
contentPadding: PaddingValues = PaddingValues(
48+
top = CodeTheme.dimens.grid.x3,
49+
bottom = CodeTheme.dimens.grid.x3,
50+
),
4751
buttonState: ButtonState = ButtonState.Bordered,
4852
textColor: Color = Color.Unspecified,
4953
shape: Shape = CodeTheme.shapes.small,
@@ -55,6 +59,7 @@ fun CodeButton(
5559
isSuccess = isSuccess,
5660
enabled = enabled,
5761
buttonState = buttonState,
62+
contentPadding = contentPadding,
5863
shape = shape,
5964
contentColor = textColor,
6065
) {
@@ -72,6 +77,10 @@ fun CodeButton(
7277
enabled: Boolean = true,
7378
buttonState: ButtonState = ButtonState.Bordered,
7479
shape: Shape = CodeTheme.shapes.small,
80+
contentPadding: PaddingValues = PaddingValues(
81+
top = CodeTheme.dimens.grid.x3,
82+
bottom = CodeTheme.dimens.grid.x3,
83+
),
7584
contentColor: Color = Color.Unspecified,
7685
content: @Composable RowScope.() -> Unit,
7786
) {
@@ -111,10 +120,7 @@ fun CodeButton(
111120
pressedElevation = 0.dp
112121
),
113122
shape = shape,
114-
contentPadding = ButtonDefaults.ContentPadding.plus(
115-
top = CodeTheme.dimens.grid.x3,
116-
bottom = CodeTheme.dimens.grid.x3,
117-
)
123+
contentPadding = ButtonDefaults.ContentPadding.plus(contentPadding)
118124
) {
119125
when {
120126
isLoading -> {

0 commit comments

Comments
 (0)