Skip to content

Commit 6fbc0bc

Browse files
committed
Merge branch 'develop'
2 parents fe2fd39 + c6d6f2e commit 6fbc0bc

File tree

48 files changed

+197
-72
lines changed

Some content is hidden

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

48 files changed

+197
-72
lines changed

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

Lines changed: 0 additions & 4 deletions
This file was deleted.

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

Lines changed: 46 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ import com.codeinc.gen.common.v1.Model
66
import com.codeinc.gen.transaction.v2.TransactionService
77
import com.codeinc.gen.transaction.v2.TransactionService.DeclareFiatOnrampPurchaseAttemptResponse
88
import com.codeinc.gen.transaction.v2.TransactionService.ExchangeDataWithoutRate
9+
import com.codeinc.gen.transaction.v2.TransactionService.SubmitIntentResponse
910
import com.codeinc.gen.transaction.v2.TransactionService.SubmitIntentResponse.ResponseCase.ERROR
1011
import com.codeinc.gen.transaction.v2.TransactionService.SubmitIntentResponse.ResponseCase.SERVER_PARAMETERS
1112
import com.codeinc.gen.transaction.v2.TransactionService.SubmitIntentResponse.ResponseCase.SUCCESS
@@ -366,6 +367,9 @@ class TransactionRepository @Inject constructor(
366367

367368
expected?.diff(produced)
368369
}
370+
TransactionService.ErrorDetails.TypeCase.INTENT_DENIED -> {
371+
errors.add("Denied: ${error.intentDenied.reason.name}")
372+
}
369373
else -> Unit
370374
}
371375

@@ -699,18 +703,53 @@ class TransactionRepository @Inject constructor(
699703
val messageString: String = ""
700704
) : Exception(cause) {
701705
override val message: String
702-
get() = "${errorSubmitIntent.name} $messageString"
706+
get() = "${errorSubmitIntent.javaClass.simpleName} $messageString"
707+
}
708+
709+
enum class DeniedReason {
710+
Unspecified,
711+
TooManyFreeAccountsForPhoneNumber,
712+
TooManyFreeAccountsForDevice,
713+
UnsupportedCountry,
714+
UnsupportedDevice;
715+
716+
companion object {
717+
fun fromValue(value: Int): DeniedReason {
718+
return entries.firstOrNull { it.ordinal == value } ?: Unspecified
719+
}
720+
}
703721
}
704722

705-
enum class ErrorSubmitIntent(val value: Int) {
706-
Denied(0),
707-
InvalidIntent(1),
708-
SignatureError(2),
709-
Unknown(-1);
723+
sealed class ErrorSubmitIntent(val value: Int) {
724+
data class Denied(val reasons: List<DeniedReason> = emptyList()): ErrorSubmitIntent(0)
725+
data object InvalidIntent: ErrorSubmitIntent(1)
726+
data object SignatureError: ErrorSubmitIntent(2)
727+
data object StaleState: ErrorSubmitIntent(3)
728+
data object Unknown: ErrorSubmitIntent(-1)
729+
data object DeviceTokenUnavailable: ErrorSubmitIntent(-2)
710730

711731
companion object {
732+
operator fun invoke(proto: SubmitIntentResponse.Error): ErrorSubmitIntent? {
733+
return when (proto.code) {
734+
SubmitIntentResponse.Error.Code.DENIED -> {
735+
val reasons = proto.errorDetailsList.mapNotNull {
736+
if (!it.hasIntentDenied()) return null
737+
DeniedReason.fromValue(it.intentDenied.reasonValue)
738+
}
739+
740+
Denied(reasons)
741+
}
742+
SubmitIntentResponse.Error.Code.INVALID_INTENT -> InvalidIntent
743+
SubmitIntentResponse.Error.Code.SIGNATURE_ERROR -> SignatureError
744+
SubmitIntentResponse.Error.Code.STALE_STATE -> StaleState
745+
SubmitIntentResponse.Error.Code.UNRECOGNIZED -> Unknown
746+
else -> return null
747+
}
748+
}
749+
712750
fun fromValue(value: Int): ErrorSubmitIntent {
713-
return values().firstOrNull { it.value == value } ?: Unknown
751+
return listOf(Denied(), InvalidIntent, SignatureError, StaleState)
752+
.firstOrNull { it.value == value } ?: Unknown
714753
}
715754
}
716755
}

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

Lines changed: 32 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ import com.getcode.model.intents.SwapConfigParameters
88
import com.getcode.model.intents.SwapIntent
99
import com.getcode.model.intents.requestToSubmitSignatures
1010
import com.getcode.network.core.BidirectionalStreamReference
11+
import com.getcode.network.repository.TransactionRepository.ErrorSubmitIntent
1112
import com.getcode.solana.SolanaTransaction
1213
import com.getcode.solana.diff
1314
import com.getcode.solana.keys.Signature
@@ -92,6 +93,9 @@ private suspend fun TransactionRepository.submit(intent: SwapIntent): Result<Swa
9293

9394
expected?.diff(produced)
9495
}
96+
TransactionService.ErrorDetails.TypeCase.INTENT_DENIED -> {
97+
errors.add("Denied: ${error.intentDenied.reason.name}")
98+
}
9599
else -> Unit
96100
}
97101

@@ -103,8 +107,8 @@ private suspend fun TransactionRepository.submit(intent: SwapIntent): Result<Swa
103107
reference.stream?.onCompleted()
104108
cont.resume(
105109
Result.failure(
106-
TransactionRepository.ErrorSubmitIntentException(
107-
TransactionRepository.ErrorSubmitIntent.fromValue(value.error.codeValue),
110+
ErrorSubmitSwapIntentException(
111+
ErrorSubmitSwapIntent.valueOf(value.error.codeValue),
108112
)
109113
)
110114
)
@@ -122,9 +126,7 @@ private suspend fun TransactionRepository.submit(intent: SwapIntent): Result<Swa
122126
}
123127
cont.resume(
124128
Result.failure(
125-
TransactionRepository.ErrorSubmitIntentException(
126-
TransactionRepository.ErrorSubmitIntent.Unknown, t
127-
)
129+
ErrorSubmitSwapIntentException(ErrorSubmitSwapIntent.Unknown, t)
128130
)
129131
)
130132
}
@@ -143,4 +145,28 @@ private suspend fun TransactionRepository.submit(intent: SwapIntent): Result<Swa
143145
).build()
144146

145147
reference.stream?.onNext(initiateSwap)
146-
}
148+
}
149+
150+
class ErrorSubmitSwapIntentException(
151+
val errorSubmitSwapIntent: ErrorSubmitSwapIntent,
152+
cause: Throwable? = null,
153+
val messageString: String = ""
154+
) : Exception(cause) {
155+
override val message: String
156+
get() = "${errorSubmitSwapIntent.name} $messageString"
157+
}
158+
159+
enum class ErrorSubmitSwapIntent(val value: Int) {
160+
Denied(0),
161+
InvalidIntent(1),
162+
SignatureError(2),
163+
StaleState(3),
164+
Unknown(-1),
165+
DeviceTokenUnavailable(-2);
166+
167+
companion object {
168+
fun valueOf(value: Int): ErrorSubmitSwapIntent {
169+
return entries.firstOrNull { it.value == value } ?: Unknown
170+
}
171+
}
172+
}

app/src/main/java/com/getcode/util/ErrorUtils.kt

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,4 +18,5 @@ fun ErrorUtils.showNetworkError(resources: ResourceHelper) = TopBarManager.TopBa
1818
title = resources.getString(R.string.error_title_noInternet),
1919
message =resources.getString(R.string.error_description_noInternet),
2020
type = TopBarManager.TopBarMessageType.ERROR_NETWORK
21-
).let { TopBarManager.showMessage(it) }
21+
).let { TopBarManager.showMessage(it) }
22+

app/src/main/java/com/getcode/view/login/BaseAccessKeyViewModel.kt

Lines changed: 43 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ import com.getcode.media.MediaScanner
1515
import com.getcode.manager.MnemonicManager
1616
import com.getcode.manager.SessionManager
1717
import com.getcode.manager.TopBarManager
18-
import com.getcode.network.repository.ApiDeniedException
18+
import com.getcode.network.repository.TransactionRepository
1919
import com.getcode.network.repository.decodeBase64
2020
import com.getcode.theme.Brand
2121
import com.getcode.theme.Transparent
@@ -257,21 +257,55 @@ abstract class BaseAccessKeyViewModel(
257257
resources.getString(R.string.error_description_failedToSave),
258258
)
259259

260-
private fun getDeniedError() = TopBarManager.TopBarMessage(
261-
resources.getString(R.string.error_title_tooManyAccounts),
262-
resources.getString(R.string.error_description_tooManyAccounts)
260+
private fun getSomethingWentWrongError() = TopBarManager.TopBarMessage(
261+
resources.getString(R.string.error_title_failedToCreateAccount),
262+
resources.getString(R.string.error_description_failedToCreateAccount),
263263
)
264264

265-
private fun getGenericError() = TopBarManager.TopBarMessage(
266-
resources.getString(R.string.error_title_failedToVerifyPhone),
267-
resources.getString(R.string.error_description_failedToVerifyPhone),
265+
private fun getTooManyAccountsPerPhoneError() = TopBarManager.TopBarMessage(
266+
resources.getString(R.string.error_title_tooManyAccountsPerPhone),
267+
resources.getString(R.string.error_description_tooManyAccountsPerPhone)
268+
)
269+
270+
private fun getTooManyAccountsPerDeviceError() = TopBarManager.TopBarMessage(
271+
resources.getString(R.string.error_title_tooManyAccountsPerDevice),
272+
resources.getString(R.string.error_description_tooManyAccountsPerDevice)
273+
)
274+
275+
private fun getUnsupportedCountryError() = TopBarManager.TopBarMessage(
276+
resources.getString(R.string.error_title_countryNotSupported),
277+
resources.getString(R.string.error_description_countryNotSupported)
278+
)
279+
280+
private fun getUnsupportedDeviceError() = TopBarManager.TopBarMessage(
281+
resources.getString(R.string.error_title_deviceNotSupported),
282+
resources.getString(R.string.error_description_deviceNotSupported)
268283
)
269284

270285
internal fun onSubmitError(e: Throwable) {
271286
when (e) {
272-
is ApiDeniedException -> getDeniedError()
287+
is TransactionRepository.ErrorSubmitIntentException -> {
288+
when (val intent = e.errorSubmitIntent) {
289+
is TransactionRepository.ErrorSubmitIntent.Denied -> {
290+
if (intent.reasons.isEmpty()) {
291+
getSomethingWentWrongError()
292+
} else {
293+
val reason = intent.reasons.first()
294+
when (reason) {
295+
TransactionRepository.DeniedReason.Unspecified -> getSomethingWentWrongError()
296+
TransactionRepository.DeniedReason.TooManyFreeAccountsForPhoneNumber -> getTooManyAccountsPerPhoneError()
297+
TransactionRepository.DeniedReason.TooManyFreeAccountsForDevice -> getTooManyAccountsPerDeviceError()
298+
TransactionRepository.DeniedReason.UnsupportedCountry -> getUnsupportedCountryError()
299+
TransactionRepository.DeniedReason.UnsupportedDevice -> getUnsupportedDeviceError()
300+
}
301+
}
302+
getSomethingWentWrongError()
303+
}
304+
else -> getSomethingWentWrongError()
305+
}
306+
}
273307
is IllegalStateException -> getAccessKeySaveError()
274-
else -> getGenericError()
308+
else -> getSomethingWentWrongError()
275309
}.let { m -> TopBarManager.showMessage(m) }
276310
}
277311
}

app/src/main/java/com/getcode/view/login/PhoneVerifyViewModel.kt

Lines changed: 27 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -176,6 +176,17 @@ class PhoneVerifyViewModel @Inject constructor(
176176
navigator.push(InviteCodeScreen(phoneNumber.urlEncode()))
177177
null
178178
}
179+
180+
PhoneVerificationService.SendVerificationCodeResponse.Result.INVALID_PHONE_NUMBER,
181+
PhoneVerificationService.SendVerificationCodeResponse.Result.UNSUPPORTED_PHONE_TYPE -> {
182+
getUnsupportedPhoneError()
183+
}
184+
PhoneVerificationService.SendVerificationCodeResponse.Result.UNSUPPORTED_COUNTRY -> {
185+
getUnsupportedCountryError()
186+
}
187+
PhoneVerificationService.SendVerificationCodeResponse.Result.UNRECOGNIZED -> {
188+
getUnsupportedDeviceError()
189+
}
179190
else -> getGenericError()
180191
}?.let { message -> TopBarManager.showMessage(message) }
181192
res == PhoneVerificationService.SendVerificationCodeResponse.Result.OK
@@ -223,12 +234,23 @@ class PhoneVerifyViewModel @Inject constructor(
223234
)
224235
}
225236

226-
private fun setValue(func: (PhoneVerifyUiModel) -> PhoneVerifyUiModel) {
227-
uiFlow.value = func(uiFlow.value)
228-
}
229-
230237
private fun getGenericError() = TopBarManager.TopBarMessage(
231238
resources.getString(R.string.error_title_failedToSendCode),
232239
resources.getString(R.string.error_description_failedToSendCode)
233240
)
234-
}
241+
242+
private fun getUnsupportedPhoneError() = TopBarManager.TopBarMessage(
243+
resources.getString(R.string.error_title_eSimNotSupported),
244+
resources.getString(R.string.error_description_eSimNotSupported)
245+
)
246+
247+
private fun getUnsupportedDeviceError() = TopBarManager.TopBarMessage(
248+
resources.getString(R.string.error_title_deviceNotSupported),
249+
resources.getString(R.string.error_description_deviceNotSupported)
250+
)
251+
252+
private fun getUnsupportedCountryError() = TopBarManager.TopBarMessage(
253+
resources.getString(R.string.error_title_countryNotSupported),
254+
resources.getString(R.string.error_description_countryNotSupported)
255+
)
256+
}

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

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -67,6 +67,8 @@ fun BuyKinScreen(
6767
verticalArrangement = Arrangement.spacedBy(CodeTheme.dimens.grid.x2)
6868
) {
6969
AmountArea(
70+
modifier = Modifier
71+
.padding(horizontal = CodeTheme.dimens.inset),
7072
amountPrefix = dataState.amountModel.amountPrefix,
7173
amountSuffix = dataState.amountModel.amountSuffix,
7274
amountText = dataState.amountModel.amountText,

app/src/main/java/com/getcode/view/main/giveKin/GiveKinScreen.kt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -78,6 +78,7 @@ fun GiveKinScreen(
7878
networkState = networkState,
7979
textStyle = CodeTheme.typography.displayLarge,
8080
modifier = Modifier
81+
.padding(horizontal = CodeTheme.dimens.inset)
8182
.align(Alignment.Center)
8283
) {
8384
navigator.push(CurrencySelectionModal())

app/src/main/java/com/getcode/view/main/requestKin/RequestKinScreen.kt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -70,6 +70,7 @@ fun RequestKinScreen(
7070
networkState = networkState,
7171
textStyle = CodeTheme.typography.displayLarge,
7272
modifier = Modifier
73+
.padding(horizontal = CodeTheme.dimens.inset)
7374
.align(Alignment.Center)
7475
) {
7576
navigator.push(CurrencySelectionModal())

app/src/main/java/com/getcode/view/main/tip/EnterTipScreen.kt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -78,6 +78,7 @@ fun EnterTipScreen(
7878
networkState = networkState,
7979
textStyle = CodeTheme.typography.displayLarge,
8080
modifier = Modifier
81+
.padding(horizontal = CodeTheme.dimens.inset)
8182
.align(Alignment.Center)
8283
) {
8384
navigator.push(CurrencySelectionModal())

0 commit comments

Comments
 (0)