Skip to content

Commit 2f86eaa

Browse files
authored
Merge branch 'code/cash' into dependabot/gradle/code/cash/com.bugsnag.gradle-1.1.0
2 parents 7c1a0af + 141c4c6 commit 2f86eaa

116 files changed

Lines changed: 3650 additions & 886 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.

apps/flipcash/app/build.gradle.kts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -187,6 +187,7 @@ dependencies {
187187
implementation(project(":apps:flipcash:features:tokens"))
188188
implementation(project(":apps:flipcash:features:transactions"))
189189
implementation(project(":apps:flipcash:features:bill-customization"))
190+
implementation(project(":apps:flipcash:features:discovery"))
190191

191192
implementation(project(":libs:crypto:solana"))
192193
implementation(project(":libs:datetime"))

apps/flipcash/app/src/main/kotlin/com/flipcash/app/MainActivity.kt

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,6 @@ import com.getcode.opencode.controllers.TransactionController
4343
import com.getcode.opencode.exchange.Exchange
4444
import com.getcode.solana.rpc.RpcConfig
4545
import com.getcode.ui.testing.LocalUiTesting
46-
import com.getcode.util.permissions.LocalPermissionChecker
4746
import com.getcode.util.permissions.PermissionChecker
4847
import com.getcode.util.resources.LocalResources
4948
import com.getcode.util.resources.LocalSystemSettings
@@ -153,7 +152,6 @@ class MainActivity : FragmentActivity() {
153152
LocalUserManager provides userManager,
154153
LocalSessionController provides sessionController,
155154
LocalBillingClient provides billing,
156-
LocalPermissionChecker provides permissionChecker,
157155
LocalShareController provides shareController,
158156
LocalAppSettings provides appSettingsCoordinator,
159157
LocalFeatureFlags provides featureFlagController,

apps/flipcash/app/src/main/kotlin/com/flipcash/app/internal/ui/navigation/AppScreenContent.kt

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -22,12 +22,12 @@ import com.flipcash.app.advanced.AdvancedFeaturesScreen
2222
import com.flipcash.app.appsettings.AppSettingsScreen
2323
import com.flipcash.app.backupkey.BackupKeyScreen
2424
import com.flipcash.app.balance.BalanceScreen
25-
import com.flipcash.app.balance.PreloadBalance
2625
import com.flipcash.app.cash.CashScreen
2726
import com.flipcash.app.contact.verification.VerificationFlowScreen
2827
import com.flipcash.app.core.AppRoute
2928
import com.flipcash.app.currency.RegionSelectionScreen
3029
import com.flipcash.app.deposit.DepositScreen
30+
import com.flipcash.app.discovery.TokenDiscoveryScreen
3131
import com.flipcash.app.internal.ui.navigation.decorators.rememberNavMessagingEntryDecorator
3232
import com.flipcash.app.lab.LabsScreen
3333
import com.flipcash.app.lab.PreloadLabs
@@ -41,6 +41,8 @@ import com.flipcash.app.myaccount.MyAccountScreen
4141
import com.flipcash.app.onramp.OnRampCustomAmountScreen
4242
import com.flipcash.app.onramp.OnRampFlowTracker
4343
import com.flipcash.app.onramp.OnRampProviderListScreen
44+
import com.flipcash.app.permissions.NotificationPermissionRationaleScreen
45+
import com.flipcash.app.permissions.NotificationPermissionScreen
4446
import com.flipcash.app.purchase.PurchaseAccountScreen
4547
import com.flipcash.app.scanner.ScannerScreen
4648
import com.flipcash.app.shareapp.ShareAppScreen
@@ -70,7 +72,6 @@ import dev.theolm.rinku.DeepLink
7072

7173
@Composable
7274
fun AppPreloads() {
73-
PreloadBalance()
7475
PreloadLabs()
7576
}
7677

@@ -89,7 +90,8 @@ fun appEntryProvider(
8990
annotatedEntry<AppRoute.Onboarding.AccessKey> { AccessKeyScreen() }
9091
annotatedEntry<AppRoute.Onboarding.AccessKeySavedLocation> { PhotoAccessKeyScreen() }
9192
annotatedEntry<AppRoute.Onboarding.Purchase> { key -> PurchaseAccountScreen(key.fromLogin) }
92-
annotatedEntry<AppRoute.Onboarding.NotificationPermission> { }
93+
annotatedEntry<AppRoute.Onboarding.NotificationPermission> { key -> NotificationPermissionScreen(key.postCreate) }
94+
annotatedEntry<AppRoute.Onboarding.NotificationPermissionRationale> { key -> NotificationPermissionRationaleScreen(key.permanentlyDenied) }
9395
annotatedEntry<AppRoute.Onboarding.CameraPermission> { }
9496

9597
// Main
@@ -121,6 +123,7 @@ fun appEntryProvider(
121123
TokenTxProcessingScreen(key.swapId, key.awaitExternalWallet)
122124
}
123125
annotatedEntry<AppRoute.Token.SellReceipt> { TokenSellReceiptScreen() }
126+
annotatedEntry<AppRoute.Token.Discovery> { TokenDiscoveryScreen() }
124127

125128
// Verification
126129
annotatedEntry<AppRoute.Verification> { key ->

apps/flipcash/core/build.gradle.kts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ dependencies {
2020
implementation(libs.androidx.credentials)
2121
implementation(libs.androidx.credentials.play.auth)
2222
implementation(libs.androidx.datastore)
23+
implementation(libs.compose.material3)
2324

2425
api(libs.coil3)
2526
api(libs.coil3.network)

apps/flipcash/core/src/main/kotlin/com/flipcash/app/core/AppRoute.kt

Lines changed: 91 additions & 42 deletions
Original file line numberDiff line numberDiff line change
@@ -19,32 +19,47 @@ import kotlinx.serialization.Serializable
1919
sealed interface AppRoute : NavKey, Parcelable {
2020

2121
/** Initial loading/splash route shown while auth state resolves. */
22-
@Serializable @Parcelize data object Loading : AppRoute
22+
@Serializable
23+
@Parcelize
24+
data object Loading : AppRoute
2325

2426
@Serializable
2527
@Parcelize
2628
// TODO: turn into a Flow
27-
sealed interface Onboarding: AppRoute {
28-
@Serializable data class Login(val seed: String? = null, val fromDeeplink: Boolean = false) : Onboarding
29-
@Serializable data object SeedInput : Onboarding
30-
@Serializable data object AccessKey : Onboarding
31-
@Serializable data object AccessKeySavedLocation: Onboarding
32-
@Serializable data class Purchase(val fromLogin: Boolean = false) : Onboarding
33-
@Deprecated("Onboarding streamlined; permissions now requested at time of use")
34-
@Serializable data class NotificationPermission(val postCreate: Boolean = false) : Onboarding
29+
sealed interface Onboarding : AppRoute {
30+
@Serializable
31+
data class Login(val seed: String? = null, val fromDeeplink: Boolean = false) : Onboarding
32+
@Serializable
33+
data object SeedInput : Onboarding
34+
@Serializable
35+
data object AccessKey : Onboarding
36+
@Serializable
37+
data object AccessKeySavedLocation : Onboarding
38+
@Serializable
39+
data class Purchase(val fromLogin: Boolean = false) : Onboarding
40+
41+
@Serializable
42+
data class NotificationPermission(val postCreate: Boolean = false) : Onboarding
43+
@Serializable
44+
data class NotificationPermissionRationale(val permanentlyDenied: Boolean = false) : Onboarding
45+
3546
@Deprecated("Onboarding streamlined; permissions now requested at time of use")
36-
@Serializable data class CameraPermission(val postCreate: Boolean = false) : Onboarding
47+
@Serializable
48+
data class CameraPermission(val postCreate: Boolean = false) : Onboarding
3749
}
3850

3951

4052
@Serializable
4153
@Parcelize
42-
sealed interface Main: AppRoute {
43-
@Serializable data class AppRestricted(val restrictionType: RestrictionType) : Main
44-
@Serializable data object Scanner : Main
54+
sealed interface Main : AppRoute {
55+
@Serializable
56+
data class AppRestricted(val restrictionType: RestrictionType) : Main
57+
@Serializable
58+
data object Scanner : Main
4559

4660
// TODO: is there a better place for this to live?
47-
@Serializable data class RegionSelection(val kind: RegionSelectionKind) : Main
61+
@Serializable
62+
data class RegionSelection(val kind: RegionSelectionKind) : Main
4863

4964
@Serializable
5065
@Parcelize
@@ -63,32 +78,57 @@ sealed interface AppRoute : NavKey, Parcelable {
6378
val includeEmail: Boolean = true,
6479
val email: String? = null,
6580
val emailVerificationCode: String? = null,
66-
): AppRoute
81+
) : AppRoute
6782

6883
@Serializable
6984
@Parcelize
70-
sealed interface Sheets: AppRoute {
71-
@Serializable data class TokenSelection(val purpose: TokenPurpose): Sheets
72-
@Serializable data class Give(val mint: Mint? = null, val fromTokenInfo: Boolean = false) : Sheets
73-
@Serializable data object Wallet : Sheets
74-
@Serializable data object Menu : Sheets
75-
@Serializable data object Lab: Sheets
76-
@Serializable data object ShareApp : Sheets
85+
sealed interface Sheets : AppRoute {
86+
@Serializable
87+
data class TokenSelection(val purpose: TokenPurpose) : Sheets
88+
@Serializable
89+
data class Give(val mint: Mint? = null, val fromTokenInfo: Boolean = false) : Sheets
90+
@Serializable
91+
data object Wallet : Sheets
92+
@Serializable
93+
data object Menu : Sheets
94+
@Serializable
95+
data object Lab : Sheets
96+
@Serializable
97+
data object ShareApp : Sheets
7798
}
7899

79100
@Serializable
80101
@Parcelize
81-
sealed interface Token: AppRoute {
82-
@Serializable data class Info(val mint: Mint, val forNeededFunds: Boolean = false, val fromDeeplink: Boolean = false): Token
83-
@Serializable data class Transactions(val mint: Mint): Token
84-
@Serializable data class SwapTransact(val purpose: TokenSwapPurpose, val forNeededFunds: Boolean = false): Token
85-
@Serializable data class TxProcessing(val swapId: SwapId, val awaitExternalWallet: Boolean = false): Token, NonDismissableRoute, NonDraggableRoute
86-
@Serializable data object SellReceipt: Token
87-
}
102+
sealed interface Token : AppRoute {
103+
@Serializable
104+
data class Info(
105+
val mint: Mint,
106+
val forNeededFunds: Boolean = false,
107+
val fromDeeplink: Boolean = false
108+
) : Token
109+
110+
@Serializable
111+
data class Transactions(val mint: Mint) : Token
112+
@Serializable
113+
data class SwapTransact(
114+
val purpose: TokenSwapPurpose,
115+
val forNeededFunds: Boolean = false
116+
) : Token
117+
118+
@Serializable
119+
data class TxProcessing(val swapId: SwapId, val awaitExternalWallet: Boolean = false) :
120+
Token, NonDismissableRoute, NonDraggableRoute
121+
122+
@Serializable
123+
data object SellReceipt : Token
124+
125+
@Serializable
126+
data object Discovery: AppRoute
88127

128+
}
89129
@Serializable
90130
@Parcelize
91-
sealed interface OnRamp: AppRoute {
131+
sealed interface OnRamp : AppRoute {
92132
@Serializable
93133
data class ProviderList(
94134
val from: AppRoute? = null,
@@ -101,27 +141,36 @@ sealed interface AppRoute : NavKey, Parcelable {
101141

102142
@Serializable
103143
@Parcelize
104-
sealed interface Transfers: AppRoute {
144+
sealed interface Transfers : AppRoute {
105145

106146
sealed interface Withdrawal {
107-
@Serializable data class Amount(val mint: Mint) : Transfers
108-
@Serializable data object Destination : Transfers
109-
@Serializable data object Confirmation : Transfers
147+
@Serializable
148+
data class Amount(val mint: Mint) : Transfers
149+
@Serializable
150+
data object Destination : Transfers
151+
@Serializable
152+
data object Confirmation : Transfers
110153
}
111154
}
112155

113156
@Serializable
114157
@Parcelize
115-
sealed interface Menu: AppRoute {
116-
@Serializable data object MyAccount : Menu
117-
@Serializable data class Deposit(val mint: Mint) : Menu
118-
@Serializable data object BackupKey : Menu
119-
@Serializable data object AppSettings : Menu
120-
@Serializable data object AdvancedFeatures : Menu
121-
@Serializable data object Lab : Menu
158+
sealed interface Menu : AppRoute {
159+
@Serializable
160+
data object MyAccount : Menu
161+
@Serializable
162+
data class Deposit(val mint: Mint) : Menu
163+
@Serializable
164+
data object BackupKey : Menu
165+
@Serializable
166+
data object AppSettings : Menu
167+
@Serializable
168+
data object AdvancedFeatures : Menu
169+
@Serializable
170+
data object Lab : Menu
122171
}
123172

124173
@Serializable
125174
@Parcelize
126-
sealed interface Advanced: AppRoute
175+
sealed interface Advanced : AppRoute
127176
}

apps/flipcash/core/src/main/kotlin/com/flipcash/app/core/feed/ActivityFeedMessage.kt

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -52,9 +52,6 @@ sealed interface MessageMetadata {
5252
@Serializable
5353
data object Unknown : MessageMetadata
5454

55-
@Serializable
56-
data object WelcomeBonus : MessageMetadata
57-
5855
@Serializable
5956
data object GaveCrypto : MessageMetadata
6057

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
package com.flipcash.app.core.ui
2+
3+
import androidx.compose.foundation.Image
4+
import androidx.compose.foundation.layout.Box
5+
import androidx.compose.foundation.layout.padding
6+
import androidx.compose.foundation.shape.RoundedCornerShape
7+
import androidx.compose.runtime.Composable
8+
import androidx.compose.ui.Alignment
9+
import androidx.compose.ui.Modifier
10+
import androidx.compose.ui.draw.clip
11+
import androidx.compose.ui.res.painterResource
12+
import androidx.compose.ui.unit.dp
13+
import com.flipcash.core.R
14+
15+
@Composable
16+
fun DeviceFrame(
17+
modifier: Modifier = Modifier,
18+
clipToFrame: Boolean = true,
19+
contentAlignment: Alignment = Alignment.TopCenter,
20+
contents: @Composable () -> Unit,
21+
) {
22+
Box(modifier = modifier, contentAlignment = Alignment.TopCenter) {
23+
Image(
24+
painter = painterResource(id = R.drawable.ic_device_frame),
25+
contentDescription = "",
26+
)
27+
// Inner viewport clipped to frame edge
28+
Box(
29+
modifier = Modifier
30+
.matchParentSize()
31+
.padding(top = 10.dp)
32+
.then(
33+
if (clipToFrame) Modifier.clip(RoundedCornerShape(42.dp)) else Modifier
34+
),
35+
contentAlignment = contentAlignment,
36+
) {
37+
contents()
38+
}
39+
}
40+
}

0 commit comments

Comments
 (0)