Skip to content

Commit 92f8466

Browse files
author
Jeff Yanta
committed
Merge branch 'develop'
2 parents 38465b2 + 0f2333b commit 92f8466

55 files changed

Lines changed: 638 additions & 462 deletions

Some content is hidden

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

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

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -59,13 +59,14 @@ class PaymentRepository @Inject constructor(
5959
messagingRepository.rejectLogin(rendezvousKey)
6060
}
6161

62-
fun attemptRequest(payload: CodePayload): Pair<KinAmount, CodePayload>? {
62+
suspend fun attemptRequest(payload: CodePayload): Pair<KinAmount, CodePayload>? {
6363
val fiat = payload.fiat
6464
if (fiat == null) {
6565
Timber.d("payload does not contain Fiat value")
6666
return null
6767
}
6868

69+
exchange.fetchRatesIfNeeded()
6970
val rate = exchange.rateFor(fiat.currency)
7071
if (rate == null) {
7172
Timber.d("Unable to determine rate")

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

Lines changed: 18 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,6 @@ import androidx.compose.runtime.remember
1616
import androidx.compose.runtime.setValue
1717
import androidx.compose.ui.Modifier
1818
import androidx.compose.ui.platform.LocalContext
19-
import cafe.adriel.voyager.core.screen.Screen
2019
import cafe.adriel.voyager.navigator.CurrentScreen
2120
import cafe.adriel.voyager.navigator.Navigator
2221
import cafe.adriel.voyager.transitions.ScreenTransition
@@ -25,11 +24,8 @@ import cafe.adriel.voyager.transitions.SlideTransition
2524
import com.getcode.navigation.core.BottomSheetNavigator
2625
import com.getcode.navigation.core.CombinedNavigator
2726
import com.getcode.navigation.core.LocalCodeNavigator
28-
import com.getcode.navigation.screens.AccessKeyLoginScreen
29-
import com.getcode.navigation.screens.HomeScreen
3027
import com.getcode.navigation.screens.LoginScreen
3128
import com.getcode.navigation.screens.MainRoot
32-
import com.getcode.navigation.screens.PermissionRequestScreen
3329
import com.getcode.navigation.transitions.SheetSlideTransition
3430
import com.getcode.theme.Brand
3531
import com.getcode.theme.CodeTheme
@@ -49,14 +45,11 @@ fun CodeApp() {
4945
CodeTheme {
5046
val appState = rememberCodeAppState()
5147
AppNavHost {
48+
val codeNavigator = LocalCodeNavigator.current
49+
5250
CodeScaffold(
53-
backgroundColor = Brand,
5451
scaffoldState = appState.scaffoldState
5552
) { innerPaddingModifier ->
56-
val codeNavigator = LocalCodeNavigator.current
57-
var replacingStackFromDeepLink by remember {
58-
mutableStateOf(false)
59-
}
6053

6154
Navigator(
6255
screen = MainRoot,
@@ -82,39 +75,28 @@ fun CodeApp() {
8275
modifier = Modifier
8376
.padding(innerPaddingModifier)
8477
) {
85-
if (replacingStackFromDeepLink) {
86-
CurrentScreen()
87-
replacingStackFromDeepLink = false
88-
} else {
89-
when (navigator.lastItem) {
90-
is LoginScreen, is MainRoot -> {
91-
CrossfadeTransition(navigator = navigator)
92-
}
93-
94-
else -> {
95-
SlideTransition(navigator = navigator)
96-
}
97-
}
78+
when (navigator.lastItem) {
79+
is LoginScreen, is MainRoot -> CrossfadeTransition(navigator = navigator)
80+
else -> SlideTransition(navigator = navigator)
9881
}
9982
}
10083
}
84+
}
10185

102-
//Listen for authentication changes here
103-
AuthCheck(
104-
navigator = codeNavigator,
105-
onNavigate = { screens, fromDeeplink ->
106-
replacingStackFromDeepLink = fromDeeplink
107-
codeNavigator.replaceAll(screens, inSheet = false)
108-
},
109-
onSwitchAccounts = { seed ->
110-
activity?.let {
111-
tlvm.logout(it) {
112-
appState.navigator.replaceAll(LoginScreen(seed))
113-
}
86+
//Listen for authentication changes here
87+
AuthCheck(
88+
navigator = codeNavigator,
89+
onNavigate = { screens ->
90+
codeNavigator.replaceAll(screens, inSheet = false)
91+
},
92+
onSwitchAccounts = { seed ->
93+
activity?.let {
94+
tlvm.logout(it) {
95+
appState.navigator.replaceAll(LoginScreen(seed))
11496
}
11597
}
116-
)
117-
}
98+
}
99+
)
118100
}
119101

120102
TopBarContainer(appState)

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

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ import com.getcode.model.KinAmount
1818
import com.getcode.navigation.core.LocalCodeNavigator
1919
import com.getcode.util.RepeatOnLifecycle
2020
import com.getcode.util.getActivityScopedViewModel
21+
import com.getcode.view.components.startupLog
2122
import com.getcode.view.main.account.AccountHome
2223
import com.getcode.view.main.account.AccountSheetViewModel
2324
import com.getcode.view.main.balance.BalanceSheet
@@ -41,6 +42,7 @@ sealed interface HomeResult {
4142

4243
@Parcelize
4344
data class HomeScreen(
45+
val seed: String? = null,
4446
val cashLink: String? = null,
4547
val requestPayload: String? = null,
4648
) : AppScreen(), MainGraph {
@@ -50,6 +52,7 @@ data class HomeScreen(
5052
@Composable
5153
override fun Content() {
5254
val vm = getActivityScopedViewModel<HomeViewModel>()
55+
startupLog("home rendered")
5356
HomeScreen(vm, cashLink, requestPayload)
5457

5558
OnScreenResult<HomeResult> { result ->

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

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -7,20 +7,20 @@ import cafe.adriel.voyager.core.screen.ScreenKey
77
import cafe.adriel.voyager.core.screen.uniqueScreenKey
88
import cafe.adriel.voyager.hilt.getViewModel
99
import com.getcode.R
10-
import com.getcode.analytics.AnalyticsScreenWatcher
1110
import com.getcode.analytics.AnalyticsManager
11+
import com.getcode.analytics.AnalyticsScreenWatcher
1212
import com.getcode.navigation.core.LocalCodeNavigator
1313
import com.getcode.util.getActivityScopedViewModel
1414
import com.getcode.util.getStackScopedViewModel
1515
import com.getcode.view.login.PhoneConfirm
1616
import com.getcode.view.login.PhoneVerify
1717
import com.getcode.view.login.PhoneVerifyViewModel
18-
import com.getcode.view.main.account.BackupKey
19-
import com.getcode.view.main.account.BetaFlagsScreen
2018
import com.getcode.view.main.account.AccountDeposit
2119
import com.getcode.view.main.account.AccountDetails
2220
import com.getcode.view.main.account.AccountFaq
2321
import com.getcode.view.main.account.AccountPhone
22+
import com.getcode.view.main.account.BackupKey
23+
import com.getcode.view.main.account.BetaFlagsScreen
2424
import com.getcode.view.main.account.ConfirmDeleteAccount
2525
import com.getcode.view.main.account.DeleteCodeAccount
2626
import com.getcode.view.main.currency.CurrencySelectionSheet

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

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,9 @@ import androidx.compose.runtime.CompositionLocalProvider
1616
import androidx.compose.runtime.derivedStateOf
1717
import androidx.compose.runtime.getValue
1818
import androidx.compose.runtime.remember
19+
import androidx.compose.runtime.rememberCoroutineScope
1920
import androidx.compose.ui.Modifier
21+
import androidx.compose.ui.platform.LocalSoftwareKeyboardController
2022
import cafe.adriel.voyager.core.screen.Screen
2123
import cafe.adriel.voyager.core.screen.ScreenKey
2224
import cafe.adriel.voyager.core.screen.uniqueScreenKey
@@ -26,6 +28,8 @@ import com.getcode.theme.CodeTheme
2628
import com.getcode.theme.sheetHeight
2729
import com.getcode.util.recomposeHighlighter
2830
import com.getcode.view.components.SheetTitle
31+
import kotlinx.coroutines.delay
32+
import kotlinx.coroutines.launch
2933
import timber.log.Timber
3034

3135
internal interface ModalContent {
@@ -91,6 +95,16 @@ internal interface ModalContent {
9195
derivedStateOf { closeButton(lastItem) }
9296
}
9397

98+
val keyboardController = LocalSoftwareKeyboardController.current
99+
val composeScope = rememberCoroutineScope()
100+
101+
val hideSheet = {
102+
composeScope.launch {
103+
keyboardController?.hide()
104+
delay(500)
105+
navigator.hide()
106+
}
107+
}
94108
SheetTitle(
95109
modifier = Modifier,
96110
title = {
@@ -106,7 +120,7 @@ internal interface ModalContent {
106120
backButton = isBackEnabled,
107121
closeButton = isCloseEnabled,
108122
onBackIconClicked = onBackClicked?.let { { it() } } ?: { navigator.pop() },
109-
onCloseIconClicked = onCloseClicked?.let { { it() } } ?: { navigator.hide() }
123+
onCloseIconClicked = onCloseClicked?.let { { it() } } ?: { hideSheet() }
110124
)
111125
Box(
112126
modifier = Modifier

app/src/main/java/com/getcode/theme/Dimens.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ import androidx.compose.ui.unit.dp
1010
import com.getcode.BuildConfig
1111

1212
val topBarHeight = 56.dp
13-
const val sheetHeight = 0.93f
13+
const val sheetHeight = 0.9f
1414

1515
internal val LocalDimens = staticCompositionLocalOf<Dimensions> {
1616
error("No Dimensions provided")

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

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -36,8 +36,13 @@ class DeeplinkHandler @Inject constructor() {
3636

3737
fun checkIntent(intent: Intent): Intent? {
3838
Timber.d("checking intent=${intent.data}")
39-
handle(intent) ?: return null
40-
return intent
39+
val uri = intent.data ?: return null
40+
return when (uri.deeplinkType) {
41+
is Type.Cash,
42+
is Type.Login,
43+
is Type.Sdk -> intent
44+
is Type.Unknown -> null
45+
}
4146
}
4247

4348
fun handle(intent: Intent? = debounceIntent): Pair<Type, List<Screen>>? {
@@ -48,6 +53,7 @@ class DeeplinkHandler @Inject constructor() {
4853
}
4954

5055
is Type.Cash -> {
56+
Timber.d("cash=${type.link}")
5157
type to listOf(HomeScreen(cashLink = type.link))
5258
}
5359

Lines changed: 58 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,58 @@
1+
package com.getcode.util
2+
3+
import androidx.compose.foundation.layout.PaddingValues
4+
import androidx.compose.foundation.layout.calculateStartPadding
5+
import androidx.compose.runtime.Composable
6+
import androidx.compose.ui.platform.LocalLayoutDirection
7+
import androidx.compose.ui.unit.Dp
8+
import androidx.compose.ui.unit.dp
9+
10+
fun PaddingValues.calculateVerticalPadding() = calculateTopPadding() + calculateBottomPadding()
11+
12+
@Composable
13+
fun PaddingValues.calculateStartPadding(): Dp {
14+
val ldr = LocalLayoutDirection.current
15+
return calculateLeftPadding(ldr)
16+
}
17+
18+
@Composable
19+
fun PaddingValues.calculateEndPadding(): Dp {
20+
val ldr = LocalLayoutDirection.current
21+
return calculateRightPadding(ldr)
22+
}
23+
24+
@Composable
25+
fun PaddingValues.calculateHorizontalPadding(): Dp {
26+
val ldr = LocalLayoutDirection.current
27+
return calculateLeftPadding(ldr) + calculateRightPadding(ldr)
28+
}
29+
30+
@Composable
31+
fun PaddingValues.minus(
32+
start: Dp = 0.dp,
33+
top: Dp = 0.dp,
34+
end: Dp = 0.dp,
35+
bottom: Dp = 0.dp,
36+
): PaddingValues {
37+
return PaddingValues(
38+
start = calculateStartPadding() - start,
39+
top = calculateTopPadding() - top,
40+
end = calculateEndPadding() - end,
41+
bottom = calculateBottomPadding() - bottom,
42+
)
43+
}
44+
45+
@Composable
46+
fun PaddingValues.plus(
47+
start: Dp = 0.dp,
48+
top: Dp = 0.dp,
49+
end: Dp = 0.dp,
50+
bottom: Dp = 0.dp,
51+
): PaddingValues {
52+
return PaddingValues(
53+
start = calculateStartPadding() + start,
54+
top = calculateTopPadding() + top,
55+
end = calculateEndPadding() + end,
56+
bottom = calculateBottomPadding() + bottom,
57+
)
58+
}

app/src/main/java/com/getcode/view/MainActivity.kt

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -84,7 +84,6 @@ class MainActivity : FragmentActivity() {
8484
handleUncaughtException()
8585
authManager.init(this)
8686
setFullscreen()
87-
deeplinkHandler.debounceIntent = deeplinkHandler.checkIntent(intent)
8887

8988
setContent {
9089
CompositionLocalProvider(
@@ -98,6 +97,8 @@ class MainActivity : FragmentActivity() {
9897
CodeApp()
9998
}
10099
}
100+
101+
deeplinkHandler.debounceIntent = intent
101102
}
102103

103104
override fun onResume() {

app/src/main/java/com/getcode/view/camera/KikCodeScannerView.kt

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ import io.reactivex.rxjava3.core.Flowable
88
import io.reactivex.rxjava3.disposables.Disposable
99
import io.reactivex.rxjava3.functions.BiFunction
1010
import io.reactivex.rxjava3.processors.BehaviorProcessor
11+
import kotlinx.coroutines.flow.Flow
1112
import org.kin.sdk.base.tools.Optional
1213

1314
class KikCodeScannerView @JvmOverloads constructor(
@@ -16,7 +17,7 @@ class KikCodeScannerView @JvmOverloads constructor(
1617
defStyleAttr: Int = 0
1718
) : FrameLayout(context, attrs, defStyleAttr) {
1819

19-
private var previewing = false
20+
var previewing = false
2021

2122
private val cameraController: CameraController = LegacyCameraController(context)
2223

@@ -44,9 +45,10 @@ class KikCodeScannerView @JvmOverloads constructor(
4445
cameraController.startPreview()
4546

4647
previewSizeSubscription = Flowable
47-
.combineLatest(cameraController.previewSize(), onLayoutChangeSubject.distinctUntilChanged(), BiFunction { previewSize: Optional<CameraController.PreviewSize>, _: Pair<Int, Int> ->
48-
previewSize
49-
})
48+
.combineLatest(
49+
cameraController.previewSize(),
50+
onLayoutChangeSubject.distinctUntilChanged()
51+
) { previewSize: Optional<CameraController.PreviewSize>, _: Pair<Int, Int> -> previewSize }
5052
.filter { it.isPresent }
5153
.observeOn(UiThreadScheduler.uiThread())
5254
.subscribe {

0 commit comments

Comments
 (0)