From 2fa0c0417b410e19a038a26698f5398a6a038801 Mon Sep 17 00:00:00 2001 From: Brandon McAnsh Date: Sat, 24 Oct 2026 15:58:46 -0400 Subject: [PATCH 1/3] refactor(kmp): move platform-neutral sources from androidMain to commonMain Moves 90 files whose code compiles for jvm unchanged: ui:components 37, app:core 27, core-ui 9, shared:tokens 7, ui:core 5, ui:navigation 3, common-ui 1, theme 1. Six modules get the Compose (and, for app:core, libsodium) artifacts on commonMain so the moved files resolve. Each file was moved, compiled for jvm, and moved back if it failed, so no code changed. What stays in androidMain references R, Hilt, java.*, Android APIs, or a neighbour that does. --- apps/flipcash/core-ui/build.gradle.kts | 2 ++ .../kotlin/com/flipcash/app/core/ui/BrandedGradientIcon.kt | 0 .../kotlin/com/flipcash/app/core/ui/ConfirmationStyle.kt | 0 .../kotlin/com/flipcash/app/core/ui/CurrencyHolder.kt | 0 .../kotlin/com/flipcash/app/core/ui/ReceiptLineItem.kt | 0 .../kotlin/com/flipcash/app/core/ui/Skeleton.kt | 0 .../kotlin/com/flipcash/app/core/ui/flow/FlowProgress.kt | 0 .../com/flipcash/app/core/ui/flow/FlowStepBarController.kt | 0 .../kotlin/com/flipcash/app/core/ui/flow/FlowStepper.kt | 0 .../app/core/ui/transitions/CardExpandTransition.kt | 0 apps/flipcash/core/build.gradle.kts | 6 ++++++ .../kotlin/com/flipcash/app/core/Locals.kt | 0 .../kotlin/com/flipcash/app/core/android/VersionInfo.kt | 0 .../kotlin/com/flipcash/app/core/annotations/AccountType.kt | 0 .../kotlin/com/flipcash/app/core/cache/CacheEntry.kt | 0 .../kotlin/com/flipcash/app/core/cache/CachePolicy.kt | 0 .../com/flipcash/app/core/cache/CachePolicyHandler.kt | 0 .../kotlin/com/flipcash/app/core/data/Loadable.kt | 0 .../kotlin/com/flipcash/app/core/encryption/Sodium.kt | 0 .../kotlin/com/flipcash/app/core/extensions/Flow.kt | 0 .../kotlin/com/flipcash/app/core/extensions/List.kt | 0 .../kotlin/com/flipcash/app/core/extensions/Pair.kt | 0 .../kotlin/com/flipcash/app/core/extensions/Result.kt | 0 .../com/flipcash/app/core/internal/extensions/Result.kt | 0 .../flipcash/app/core/internal/updater/ProfileUpdater.kt | 0 .../kotlin/com/flipcash/app/core/links/TrustedWebsites.kt | 0 .../kotlin/com/flipcash/app/core/tipping/OwnTipCard.kt | 0 .../kotlin/com/flipcash/app/core/tipping/TipSelection.kt | 0 .../com/flipcash/app/core/toast/SystemToastController.kt | 0 .../kotlin/com/flipcash/app/core/toast/ToastController.kt | 0 .../kotlin/com/flipcash/app/core/util/AbbreviatedLink.kt | 0 .../kotlin/com/flipcash/app/core/util/Fiat.kt | 0 .../kotlin/com/flipcash/app/core/util/Linkify.kt | 0 .../kotlin/com/flipcash/app/core/util/MessagingPackages.kt | 0 .../kotlin/com/flipcash/app/core/util/Number.kt | 0 .../app/core/verification/email/EmailCodeChannel.kt | 0 .../app/core/verification/email/EmailDeeplinkOrigin.kt | 0 .../app/core/verification/email/LocalEmailCodeChannel.kt | 0 apps/flipcash/shared/common-ui/build.gradle.kts | 3 +++ .../com/flipcash/shared/common/ui/amount/AmountChip.kt | 0 apps/flipcash/shared/theme/build.gradle.kts | 3 +++ .../kotlin/com/flipcash/app/theme/FlipcashPreview.kt | 0 apps/flipcash/shared/tokens/build.gradle.kts | 6 ++++++ .../kotlin/com/flipcash/app/tokens/BalancePoller.kt | 0 .../kotlin/com/flipcash/app/tokens/FeeAffordableEntry.kt | 0 .../kotlin/com/flipcash/app/tokens/InlineCompletion.kt | 0 .../kotlin/com/flipcash/app/tokens/TokenUpdater.kt | 0 .../kotlin/com/flipcash/app/tokens/UsdcDepositSweep.kt | 0 .../kotlin/com/flipcash/app/tokens/data/MarketTrend.kt | 0 .../kotlin/com/flipcash/app/tokens/data/Period.kt | 0 .../kotlin/com/getcode/ui/Locals.kt | 0 .../kotlin/com/getcode/ui/components/BlurredContent.kt | 0 .../kotlin/com/getcode/ui/components/BottomScrollEdge.kt | 0 .../kotlin/com/getcode/ui/components/BulletRow.kt | 0 .../kotlin/com/getcode/ui/components/CapsuleProgressBar.kt | 0 .../kotlin/com/getcode/ui/components/Chip.kt | 0 .../kotlin/com/getcode/ui/components/FilterChip.kt | 0 .../kotlin/com/getcode/ui/components/Flippable.kt | 0 .../com/getcode/ui/components/FullWidthScrollableTabRow.kt | 0 .../kotlin/com/getcode/ui/components/Modal.kt | 0 .../kotlin/com/getcode/ui/components/NotificationDot.kt | 0 .../kotlin/com/getcode/ui/components/Pill.kt | 0 .../kotlin/com/getcode/ui/components/PullToReveal.kt | 0 .../kotlin/com/getcode/ui/components/SegmentedControl.kt | 0 .../kotlin/com/getcode/ui/components/TopScrollEdge.kt | 0 .../kotlin/com/getcode/ui/components/VerticalDivider.kt | 0 .../kotlin/com/getcode/ui/components/charts/ChartPoint.kt | 0 .../kotlin/com/getcode/ui/components/charts/Trends.kt | 0 .../kotlin/com/getcode/ui/components/chat/DateBubble.kt | 0 .../com/getcode/ui/components/chat/MessageNodeDefaults.kt | 0 .../com/getcode/ui/components/chat/TypingIndicator.kt | 0 .../kotlin/com/getcode/ui/components/text/SectionHeader.kt | 0 .../getcode/ui/components/text/animated/DigitContainer.kt | 0 .../kotlin/com/getcode/ui/theme/CodeBillSwipeToDismiss.kt | 0 .../kotlin/com/getcode/ui/theme/CodeCheckbox.kt | 0 .../kotlin/com/getcode/ui/theme/CodeRadioButton.kt | 0 .../kotlin/com/getcode/ui/theme/CodeScaffold.kt | 0 .../kotlin/com/getcode/ui/theme/CodeSeedView.kt | 0 .../kotlin/com/getcode/ui/theme/CodeSegmentedControl.kt | 0 .../kotlin/com/getcode/ui/theme/CodeSwitch.kt | 0 .../kotlin/com/getcode/ui/utils/AnimationUtils.kt | 0 .../kotlin/com/getcode/ui/utils/Geometry.kt | 0 .../kotlin/com/getcode/ui/utils/LazyList.kt | 0 .../kotlin/com/getcode/ui/utils/Maps.kt | 0 .../kotlin/com/getcode/ui/utils/MeasureScope.kt | 0 .../kotlin/com/getcode/ui/utils/PaddingValues.kt | 0 .../kotlin/com/getcode/ui/utils/TextStyle.kt | 0 .../kotlin/com/getcode/ui/core/ContextMenuAction.kt | 0 .../kotlin/com/getcode/ui/core/ExpandedTouchTarget.kt | 0 .../com/getcode/ui/core/StarMaskVisualTransformation.kt | 0 .../kotlin/com/getcode/ui/core/visibility/VisibilityInfo.kt | 0 .../com/getcode/ui/core/visibility/VisibilityTrackerNode.kt | 0 ui/navigation/build.gradle.kts | 4 ++++ .../kotlin/com/getcode/navigation/flow/FlowDismissStyle.kt | 0 .../kotlin/com/getcode/navigation/scrim/Scrim.kt | 0 .../kotlin/com/getcode/ui/utils/SheetExpansion.kt | 0 96 files changed, 24 insertions(+) rename apps/flipcash/core-ui/src/{androidMain => commonMain}/kotlin/com/flipcash/app/core/ui/BrandedGradientIcon.kt (100%) rename apps/flipcash/core-ui/src/{androidMain => commonMain}/kotlin/com/flipcash/app/core/ui/ConfirmationStyle.kt (100%) rename apps/flipcash/core-ui/src/{androidMain => commonMain}/kotlin/com/flipcash/app/core/ui/CurrencyHolder.kt (100%) rename apps/flipcash/core-ui/src/{androidMain => commonMain}/kotlin/com/flipcash/app/core/ui/ReceiptLineItem.kt (100%) rename apps/flipcash/core-ui/src/{androidMain => commonMain}/kotlin/com/flipcash/app/core/ui/Skeleton.kt (100%) rename apps/flipcash/core-ui/src/{androidMain => commonMain}/kotlin/com/flipcash/app/core/ui/flow/FlowProgress.kt (100%) rename apps/flipcash/core-ui/src/{androidMain => commonMain}/kotlin/com/flipcash/app/core/ui/flow/FlowStepBarController.kt (100%) rename apps/flipcash/core-ui/src/{androidMain => commonMain}/kotlin/com/flipcash/app/core/ui/flow/FlowStepper.kt (100%) rename apps/flipcash/core-ui/src/{androidMain => commonMain}/kotlin/com/flipcash/app/core/ui/transitions/CardExpandTransition.kt (100%) rename apps/flipcash/core/src/{androidMain => commonMain}/kotlin/com/flipcash/app/core/Locals.kt (100%) rename apps/flipcash/core/src/{androidMain => commonMain}/kotlin/com/flipcash/app/core/android/VersionInfo.kt (100%) rename apps/flipcash/core/src/{androidMain => commonMain}/kotlin/com/flipcash/app/core/annotations/AccountType.kt (100%) rename apps/flipcash/core/src/{androidMain => commonMain}/kotlin/com/flipcash/app/core/cache/CacheEntry.kt (100%) rename apps/flipcash/core/src/{androidMain => commonMain}/kotlin/com/flipcash/app/core/cache/CachePolicy.kt (100%) rename apps/flipcash/core/src/{androidMain => commonMain}/kotlin/com/flipcash/app/core/cache/CachePolicyHandler.kt (100%) rename apps/flipcash/core/src/{androidMain => commonMain}/kotlin/com/flipcash/app/core/data/Loadable.kt (100%) rename apps/flipcash/core/src/{androidMain => commonMain}/kotlin/com/flipcash/app/core/encryption/Sodium.kt (100%) rename apps/flipcash/core/src/{androidMain => commonMain}/kotlin/com/flipcash/app/core/extensions/Flow.kt (100%) rename apps/flipcash/core/src/{androidMain => commonMain}/kotlin/com/flipcash/app/core/extensions/List.kt (100%) rename apps/flipcash/core/src/{androidMain => commonMain}/kotlin/com/flipcash/app/core/extensions/Pair.kt (100%) rename apps/flipcash/core/src/{androidMain => commonMain}/kotlin/com/flipcash/app/core/extensions/Result.kt (100%) rename apps/flipcash/core/src/{androidMain => commonMain}/kotlin/com/flipcash/app/core/internal/extensions/Result.kt (100%) rename apps/flipcash/core/src/{androidMain => commonMain}/kotlin/com/flipcash/app/core/internal/updater/ProfileUpdater.kt (100%) rename apps/flipcash/core/src/{androidMain => commonMain}/kotlin/com/flipcash/app/core/links/TrustedWebsites.kt (100%) rename apps/flipcash/core/src/{androidMain => commonMain}/kotlin/com/flipcash/app/core/tipping/OwnTipCard.kt (100%) rename apps/flipcash/core/src/{androidMain => commonMain}/kotlin/com/flipcash/app/core/tipping/TipSelection.kt (100%) rename apps/flipcash/core/src/{androidMain => commonMain}/kotlin/com/flipcash/app/core/toast/SystemToastController.kt (100%) rename apps/flipcash/core/src/{androidMain => commonMain}/kotlin/com/flipcash/app/core/toast/ToastController.kt (100%) rename apps/flipcash/core/src/{androidMain => commonMain}/kotlin/com/flipcash/app/core/util/AbbreviatedLink.kt (100%) rename apps/flipcash/core/src/{androidMain => commonMain}/kotlin/com/flipcash/app/core/util/Fiat.kt (100%) rename apps/flipcash/core/src/{androidMain => commonMain}/kotlin/com/flipcash/app/core/util/Linkify.kt (100%) rename apps/flipcash/core/src/{androidMain => commonMain}/kotlin/com/flipcash/app/core/util/MessagingPackages.kt (100%) rename apps/flipcash/core/src/{androidMain => commonMain}/kotlin/com/flipcash/app/core/util/Number.kt (100%) rename apps/flipcash/core/src/{androidMain => commonMain}/kotlin/com/flipcash/app/core/verification/email/EmailCodeChannel.kt (100%) rename apps/flipcash/core/src/{androidMain => commonMain}/kotlin/com/flipcash/app/core/verification/email/EmailDeeplinkOrigin.kt (100%) rename apps/flipcash/core/src/{androidMain => commonMain}/kotlin/com/flipcash/app/core/verification/email/LocalEmailCodeChannel.kt (100%) rename apps/flipcash/shared/common-ui/src/{androidMain => commonMain}/kotlin/com/flipcash/shared/common/ui/amount/AmountChip.kt (100%) rename apps/flipcash/shared/theme/src/{androidMain => commonMain}/kotlin/com/flipcash/app/theme/FlipcashPreview.kt (100%) rename apps/flipcash/shared/tokens/src/{androidMain => commonMain}/kotlin/com/flipcash/app/tokens/BalancePoller.kt (100%) rename apps/flipcash/shared/tokens/src/{androidMain => commonMain}/kotlin/com/flipcash/app/tokens/FeeAffordableEntry.kt (100%) rename apps/flipcash/shared/tokens/src/{androidMain => commonMain}/kotlin/com/flipcash/app/tokens/InlineCompletion.kt (100%) rename apps/flipcash/shared/tokens/src/{androidMain => commonMain}/kotlin/com/flipcash/app/tokens/TokenUpdater.kt (100%) rename apps/flipcash/shared/tokens/src/{androidMain => commonMain}/kotlin/com/flipcash/app/tokens/UsdcDepositSweep.kt (100%) rename apps/flipcash/shared/tokens/src/{androidMain => commonMain}/kotlin/com/flipcash/app/tokens/data/MarketTrend.kt (100%) rename apps/flipcash/shared/tokens/src/{androidMain => commonMain}/kotlin/com/flipcash/app/tokens/data/Period.kt (100%) rename ui/components/src/{androidMain => commonMain}/kotlin/com/getcode/ui/Locals.kt (100%) rename ui/components/src/{androidMain => commonMain}/kotlin/com/getcode/ui/components/BlurredContent.kt (100%) rename ui/components/src/{androidMain => commonMain}/kotlin/com/getcode/ui/components/BottomScrollEdge.kt (100%) rename ui/components/src/{androidMain => commonMain}/kotlin/com/getcode/ui/components/BulletRow.kt (100%) rename ui/components/src/{androidMain => commonMain}/kotlin/com/getcode/ui/components/CapsuleProgressBar.kt (100%) rename ui/components/src/{androidMain => commonMain}/kotlin/com/getcode/ui/components/Chip.kt (100%) rename ui/components/src/{androidMain => commonMain}/kotlin/com/getcode/ui/components/FilterChip.kt (100%) rename ui/components/src/{androidMain => commonMain}/kotlin/com/getcode/ui/components/Flippable.kt (100%) rename ui/components/src/{androidMain => commonMain}/kotlin/com/getcode/ui/components/FullWidthScrollableTabRow.kt (100%) rename ui/components/src/{androidMain => commonMain}/kotlin/com/getcode/ui/components/Modal.kt (100%) rename ui/components/src/{androidMain => commonMain}/kotlin/com/getcode/ui/components/NotificationDot.kt (100%) rename ui/components/src/{androidMain => commonMain}/kotlin/com/getcode/ui/components/Pill.kt (100%) rename ui/components/src/{androidMain => commonMain}/kotlin/com/getcode/ui/components/PullToReveal.kt (100%) rename ui/components/src/{androidMain => commonMain}/kotlin/com/getcode/ui/components/SegmentedControl.kt (100%) rename ui/components/src/{androidMain => commonMain}/kotlin/com/getcode/ui/components/TopScrollEdge.kt (100%) rename ui/components/src/{androidMain => commonMain}/kotlin/com/getcode/ui/components/VerticalDivider.kt (100%) rename ui/components/src/{androidMain => commonMain}/kotlin/com/getcode/ui/components/charts/ChartPoint.kt (100%) rename ui/components/src/{androidMain => commonMain}/kotlin/com/getcode/ui/components/charts/Trends.kt (100%) rename ui/components/src/{androidMain => commonMain}/kotlin/com/getcode/ui/components/chat/DateBubble.kt (100%) rename ui/components/src/{androidMain => commonMain}/kotlin/com/getcode/ui/components/chat/MessageNodeDefaults.kt (100%) rename ui/components/src/{androidMain => commonMain}/kotlin/com/getcode/ui/components/chat/TypingIndicator.kt (100%) rename ui/components/src/{androidMain => commonMain}/kotlin/com/getcode/ui/components/text/SectionHeader.kt (100%) rename ui/components/src/{androidMain => commonMain}/kotlin/com/getcode/ui/components/text/animated/DigitContainer.kt (100%) rename ui/components/src/{androidMain => commonMain}/kotlin/com/getcode/ui/theme/CodeBillSwipeToDismiss.kt (100%) rename ui/components/src/{androidMain => commonMain}/kotlin/com/getcode/ui/theme/CodeCheckbox.kt (100%) rename ui/components/src/{androidMain => commonMain}/kotlin/com/getcode/ui/theme/CodeRadioButton.kt (100%) rename ui/components/src/{androidMain => commonMain}/kotlin/com/getcode/ui/theme/CodeScaffold.kt (100%) rename ui/components/src/{androidMain => commonMain}/kotlin/com/getcode/ui/theme/CodeSeedView.kt (100%) rename ui/components/src/{androidMain => commonMain}/kotlin/com/getcode/ui/theme/CodeSegmentedControl.kt (100%) rename ui/components/src/{androidMain => commonMain}/kotlin/com/getcode/ui/theme/CodeSwitch.kt (100%) rename ui/components/src/{androidMain => commonMain}/kotlin/com/getcode/ui/utils/AnimationUtils.kt (100%) rename ui/components/src/{androidMain => commonMain}/kotlin/com/getcode/ui/utils/Geometry.kt (100%) rename ui/components/src/{androidMain => commonMain}/kotlin/com/getcode/ui/utils/LazyList.kt (100%) rename ui/components/src/{androidMain => commonMain}/kotlin/com/getcode/ui/utils/Maps.kt (100%) rename ui/components/src/{androidMain => commonMain}/kotlin/com/getcode/ui/utils/MeasureScope.kt (100%) rename ui/components/src/{androidMain => commonMain}/kotlin/com/getcode/ui/utils/PaddingValues.kt (100%) rename ui/components/src/{androidMain => commonMain}/kotlin/com/getcode/ui/utils/TextStyle.kt (100%) rename ui/core/src/{androidMain => commonMain}/kotlin/com/getcode/ui/core/ContextMenuAction.kt (100%) rename ui/core/src/{androidMain => commonMain}/kotlin/com/getcode/ui/core/ExpandedTouchTarget.kt (100%) rename ui/core/src/{androidMain => commonMain}/kotlin/com/getcode/ui/core/StarMaskVisualTransformation.kt (100%) rename ui/core/src/{androidMain => commonMain}/kotlin/com/getcode/ui/core/visibility/VisibilityInfo.kt (100%) rename ui/core/src/{androidMain => commonMain}/kotlin/com/getcode/ui/core/visibility/VisibilityTrackerNode.kt (100%) rename ui/navigation/src/{androidMain => commonMain}/kotlin/com/getcode/navigation/flow/FlowDismissStyle.kt (100%) rename ui/navigation/src/{androidMain => commonMain}/kotlin/com/getcode/navigation/scrim/Scrim.kt (100%) rename ui/navigation/src/{androidMain => commonMain}/kotlin/com/getcode/ui/utils/SheetExpansion.kt (100%) diff --git a/apps/flipcash/core-ui/build.gradle.kts b/apps/flipcash/core-ui/build.gradle.kts index 5c27c4add1..48cdd70695 100644 --- a/apps/flipcash/core-ui/build.gradle.kts +++ b/apps/flipcash/core-ui/build.gradle.kts @@ -14,6 +14,8 @@ kotlin { sourceSets { commonMain.dependencies { + implementation(libs.jetbrains.compose.animation) + implementation(libs.jetbrains.compose.ui.tooling.preview) implementation(project(":apps:flipcash:core")) implementation(project(":services:opencode")) implementation(project(":services:opencode-compose")) diff --git a/apps/flipcash/core-ui/src/androidMain/kotlin/com/flipcash/app/core/ui/BrandedGradientIcon.kt b/apps/flipcash/core-ui/src/commonMain/kotlin/com/flipcash/app/core/ui/BrandedGradientIcon.kt similarity index 100% rename from apps/flipcash/core-ui/src/androidMain/kotlin/com/flipcash/app/core/ui/BrandedGradientIcon.kt rename to apps/flipcash/core-ui/src/commonMain/kotlin/com/flipcash/app/core/ui/BrandedGradientIcon.kt diff --git a/apps/flipcash/core-ui/src/androidMain/kotlin/com/flipcash/app/core/ui/ConfirmationStyle.kt b/apps/flipcash/core-ui/src/commonMain/kotlin/com/flipcash/app/core/ui/ConfirmationStyle.kt similarity index 100% rename from apps/flipcash/core-ui/src/androidMain/kotlin/com/flipcash/app/core/ui/ConfirmationStyle.kt rename to apps/flipcash/core-ui/src/commonMain/kotlin/com/flipcash/app/core/ui/ConfirmationStyle.kt diff --git a/apps/flipcash/core-ui/src/androidMain/kotlin/com/flipcash/app/core/ui/CurrencyHolder.kt b/apps/flipcash/core-ui/src/commonMain/kotlin/com/flipcash/app/core/ui/CurrencyHolder.kt similarity index 100% rename from apps/flipcash/core-ui/src/androidMain/kotlin/com/flipcash/app/core/ui/CurrencyHolder.kt rename to apps/flipcash/core-ui/src/commonMain/kotlin/com/flipcash/app/core/ui/CurrencyHolder.kt diff --git a/apps/flipcash/core-ui/src/androidMain/kotlin/com/flipcash/app/core/ui/ReceiptLineItem.kt b/apps/flipcash/core-ui/src/commonMain/kotlin/com/flipcash/app/core/ui/ReceiptLineItem.kt similarity index 100% rename from apps/flipcash/core-ui/src/androidMain/kotlin/com/flipcash/app/core/ui/ReceiptLineItem.kt rename to apps/flipcash/core-ui/src/commonMain/kotlin/com/flipcash/app/core/ui/ReceiptLineItem.kt diff --git a/apps/flipcash/core-ui/src/androidMain/kotlin/com/flipcash/app/core/ui/Skeleton.kt b/apps/flipcash/core-ui/src/commonMain/kotlin/com/flipcash/app/core/ui/Skeleton.kt similarity index 100% rename from apps/flipcash/core-ui/src/androidMain/kotlin/com/flipcash/app/core/ui/Skeleton.kt rename to apps/flipcash/core-ui/src/commonMain/kotlin/com/flipcash/app/core/ui/Skeleton.kt diff --git a/apps/flipcash/core-ui/src/androidMain/kotlin/com/flipcash/app/core/ui/flow/FlowProgress.kt b/apps/flipcash/core-ui/src/commonMain/kotlin/com/flipcash/app/core/ui/flow/FlowProgress.kt similarity index 100% rename from apps/flipcash/core-ui/src/androidMain/kotlin/com/flipcash/app/core/ui/flow/FlowProgress.kt rename to apps/flipcash/core-ui/src/commonMain/kotlin/com/flipcash/app/core/ui/flow/FlowProgress.kt diff --git a/apps/flipcash/core-ui/src/androidMain/kotlin/com/flipcash/app/core/ui/flow/FlowStepBarController.kt b/apps/flipcash/core-ui/src/commonMain/kotlin/com/flipcash/app/core/ui/flow/FlowStepBarController.kt similarity index 100% rename from apps/flipcash/core-ui/src/androidMain/kotlin/com/flipcash/app/core/ui/flow/FlowStepBarController.kt rename to apps/flipcash/core-ui/src/commonMain/kotlin/com/flipcash/app/core/ui/flow/FlowStepBarController.kt diff --git a/apps/flipcash/core-ui/src/androidMain/kotlin/com/flipcash/app/core/ui/flow/FlowStepper.kt b/apps/flipcash/core-ui/src/commonMain/kotlin/com/flipcash/app/core/ui/flow/FlowStepper.kt similarity index 100% rename from apps/flipcash/core-ui/src/androidMain/kotlin/com/flipcash/app/core/ui/flow/FlowStepper.kt rename to apps/flipcash/core-ui/src/commonMain/kotlin/com/flipcash/app/core/ui/flow/FlowStepper.kt diff --git a/apps/flipcash/core-ui/src/androidMain/kotlin/com/flipcash/app/core/ui/transitions/CardExpandTransition.kt b/apps/flipcash/core-ui/src/commonMain/kotlin/com/flipcash/app/core/ui/transitions/CardExpandTransition.kt similarity index 100% rename from apps/flipcash/core-ui/src/androidMain/kotlin/com/flipcash/app/core/ui/transitions/CardExpandTransition.kt rename to apps/flipcash/core-ui/src/commonMain/kotlin/com/flipcash/app/core/ui/transitions/CardExpandTransition.kt diff --git a/apps/flipcash/core/build.gradle.kts b/apps/flipcash/core/build.gradle.kts index 2fab73b963..6fac369089 100644 --- a/apps/flipcash/core/build.gradle.kts +++ b/apps/flipcash/core/build.gradle.kts @@ -17,6 +17,12 @@ kotlin { sourceSets { commonMain.dependencies { + implementation(libs.jetbrains.compose.ui) + implementation(libs.jetbrains.compose.animation) + implementation(libs.jetbrains.compose.material) + implementation(libs.jetbrains.compose.material3) + implementation(libs.jetbrains.compose.ui.tooling.preview) + implementation(libs.sodium.bindings.kmp) implementation(project(":libs:parcelable")) implementation(libs.javax.inject) api(libs.androidx.lifecycle.runtime.common) diff --git a/apps/flipcash/core/src/androidMain/kotlin/com/flipcash/app/core/Locals.kt b/apps/flipcash/core/src/commonMain/kotlin/com/flipcash/app/core/Locals.kt similarity index 100% rename from apps/flipcash/core/src/androidMain/kotlin/com/flipcash/app/core/Locals.kt rename to apps/flipcash/core/src/commonMain/kotlin/com/flipcash/app/core/Locals.kt diff --git a/apps/flipcash/core/src/androidMain/kotlin/com/flipcash/app/core/android/VersionInfo.kt b/apps/flipcash/core/src/commonMain/kotlin/com/flipcash/app/core/android/VersionInfo.kt similarity index 100% rename from apps/flipcash/core/src/androidMain/kotlin/com/flipcash/app/core/android/VersionInfo.kt rename to apps/flipcash/core/src/commonMain/kotlin/com/flipcash/app/core/android/VersionInfo.kt diff --git a/apps/flipcash/core/src/androidMain/kotlin/com/flipcash/app/core/annotations/AccountType.kt b/apps/flipcash/core/src/commonMain/kotlin/com/flipcash/app/core/annotations/AccountType.kt similarity index 100% rename from apps/flipcash/core/src/androidMain/kotlin/com/flipcash/app/core/annotations/AccountType.kt rename to apps/flipcash/core/src/commonMain/kotlin/com/flipcash/app/core/annotations/AccountType.kt diff --git a/apps/flipcash/core/src/androidMain/kotlin/com/flipcash/app/core/cache/CacheEntry.kt b/apps/flipcash/core/src/commonMain/kotlin/com/flipcash/app/core/cache/CacheEntry.kt similarity index 100% rename from apps/flipcash/core/src/androidMain/kotlin/com/flipcash/app/core/cache/CacheEntry.kt rename to apps/flipcash/core/src/commonMain/kotlin/com/flipcash/app/core/cache/CacheEntry.kt diff --git a/apps/flipcash/core/src/androidMain/kotlin/com/flipcash/app/core/cache/CachePolicy.kt b/apps/flipcash/core/src/commonMain/kotlin/com/flipcash/app/core/cache/CachePolicy.kt similarity index 100% rename from apps/flipcash/core/src/androidMain/kotlin/com/flipcash/app/core/cache/CachePolicy.kt rename to apps/flipcash/core/src/commonMain/kotlin/com/flipcash/app/core/cache/CachePolicy.kt diff --git a/apps/flipcash/core/src/androidMain/kotlin/com/flipcash/app/core/cache/CachePolicyHandler.kt b/apps/flipcash/core/src/commonMain/kotlin/com/flipcash/app/core/cache/CachePolicyHandler.kt similarity index 100% rename from apps/flipcash/core/src/androidMain/kotlin/com/flipcash/app/core/cache/CachePolicyHandler.kt rename to apps/flipcash/core/src/commonMain/kotlin/com/flipcash/app/core/cache/CachePolicyHandler.kt diff --git a/apps/flipcash/core/src/androidMain/kotlin/com/flipcash/app/core/data/Loadable.kt b/apps/flipcash/core/src/commonMain/kotlin/com/flipcash/app/core/data/Loadable.kt similarity index 100% rename from apps/flipcash/core/src/androidMain/kotlin/com/flipcash/app/core/data/Loadable.kt rename to apps/flipcash/core/src/commonMain/kotlin/com/flipcash/app/core/data/Loadable.kt diff --git a/apps/flipcash/core/src/androidMain/kotlin/com/flipcash/app/core/encryption/Sodium.kt b/apps/flipcash/core/src/commonMain/kotlin/com/flipcash/app/core/encryption/Sodium.kt similarity index 100% rename from apps/flipcash/core/src/androidMain/kotlin/com/flipcash/app/core/encryption/Sodium.kt rename to apps/flipcash/core/src/commonMain/kotlin/com/flipcash/app/core/encryption/Sodium.kt diff --git a/apps/flipcash/core/src/androidMain/kotlin/com/flipcash/app/core/extensions/Flow.kt b/apps/flipcash/core/src/commonMain/kotlin/com/flipcash/app/core/extensions/Flow.kt similarity index 100% rename from apps/flipcash/core/src/androidMain/kotlin/com/flipcash/app/core/extensions/Flow.kt rename to apps/flipcash/core/src/commonMain/kotlin/com/flipcash/app/core/extensions/Flow.kt diff --git a/apps/flipcash/core/src/androidMain/kotlin/com/flipcash/app/core/extensions/List.kt b/apps/flipcash/core/src/commonMain/kotlin/com/flipcash/app/core/extensions/List.kt similarity index 100% rename from apps/flipcash/core/src/androidMain/kotlin/com/flipcash/app/core/extensions/List.kt rename to apps/flipcash/core/src/commonMain/kotlin/com/flipcash/app/core/extensions/List.kt diff --git a/apps/flipcash/core/src/androidMain/kotlin/com/flipcash/app/core/extensions/Pair.kt b/apps/flipcash/core/src/commonMain/kotlin/com/flipcash/app/core/extensions/Pair.kt similarity index 100% rename from apps/flipcash/core/src/androidMain/kotlin/com/flipcash/app/core/extensions/Pair.kt rename to apps/flipcash/core/src/commonMain/kotlin/com/flipcash/app/core/extensions/Pair.kt diff --git a/apps/flipcash/core/src/androidMain/kotlin/com/flipcash/app/core/extensions/Result.kt b/apps/flipcash/core/src/commonMain/kotlin/com/flipcash/app/core/extensions/Result.kt similarity index 100% rename from apps/flipcash/core/src/androidMain/kotlin/com/flipcash/app/core/extensions/Result.kt rename to apps/flipcash/core/src/commonMain/kotlin/com/flipcash/app/core/extensions/Result.kt diff --git a/apps/flipcash/core/src/androidMain/kotlin/com/flipcash/app/core/internal/extensions/Result.kt b/apps/flipcash/core/src/commonMain/kotlin/com/flipcash/app/core/internal/extensions/Result.kt similarity index 100% rename from apps/flipcash/core/src/androidMain/kotlin/com/flipcash/app/core/internal/extensions/Result.kt rename to apps/flipcash/core/src/commonMain/kotlin/com/flipcash/app/core/internal/extensions/Result.kt diff --git a/apps/flipcash/core/src/androidMain/kotlin/com/flipcash/app/core/internal/updater/ProfileUpdater.kt b/apps/flipcash/core/src/commonMain/kotlin/com/flipcash/app/core/internal/updater/ProfileUpdater.kt similarity index 100% rename from apps/flipcash/core/src/androidMain/kotlin/com/flipcash/app/core/internal/updater/ProfileUpdater.kt rename to apps/flipcash/core/src/commonMain/kotlin/com/flipcash/app/core/internal/updater/ProfileUpdater.kt diff --git a/apps/flipcash/core/src/androidMain/kotlin/com/flipcash/app/core/links/TrustedWebsites.kt b/apps/flipcash/core/src/commonMain/kotlin/com/flipcash/app/core/links/TrustedWebsites.kt similarity index 100% rename from apps/flipcash/core/src/androidMain/kotlin/com/flipcash/app/core/links/TrustedWebsites.kt rename to apps/flipcash/core/src/commonMain/kotlin/com/flipcash/app/core/links/TrustedWebsites.kt diff --git a/apps/flipcash/core/src/androidMain/kotlin/com/flipcash/app/core/tipping/OwnTipCard.kt b/apps/flipcash/core/src/commonMain/kotlin/com/flipcash/app/core/tipping/OwnTipCard.kt similarity index 100% rename from apps/flipcash/core/src/androidMain/kotlin/com/flipcash/app/core/tipping/OwnTipCard.kt rename to apps/flipcash/core/src/commonMain/kotlin/com/flipcash/app/core/tipping/OwnTipCard.kt diff --git a/apps/flipcash/core/src/androidMain/kotlin/com/flipcash/app/core/tipping/TipSelection.kt b/apps/flipcash/core/src/commonMain/kotlin/com/flipcash/app/core/tipping/TipSelection.kt similarity index 100% rename from apps/flipcash/core/src/androidMain/kotlin/com/flipcash/app/core/tipping/TipSelection.kt rename to apps/flipcash/core/src/commonMain/kotlin/com/flipcash/app/core/tipping/TipSelection.kt diff --git a/apps/flipcash/core/src/androidMain/kotlin/com/flipcash/app/core/toast/SystemToastController.kt b/apps/flipcash/core/src/commonMain/kotlin/com/flipcash/app/core/toast/SystemToastController.kt similarity index 100% rename from apps/flipcash/core/src/androidMain/kotlin/com/flipcash/app/core/toast/SystemToastController.kt rename to apps/flipcash/core/src/commonMain/kotlin/com/flipcash/app/core/toast/SystemToastController.kt diff --git a/apps/flipcash/core/src/androidMain/kotlin/com/flipcash/app/core/toast/ToastController.kt b/apps/flipcash/core/src/commonMain/kotlin/com/flipcash/app/core/toast/ToastController.kt similarity index 100% rename from apps/flipcash/core/src/androidMain/kotlin/com/flipcash/app/core/toast/ToastController.kt rename to apps/flipcash/core/src/commonMain/kotlin/com/flipcash/app/core/toast/ToastController.kt diff --git a/apps/flipcash/core/src/androidMain/kotlin/com/flipcash/app/core/util/AbbreviatedLink.kt b/apps/flipcash/core/src/commonMain/kotlin/com/flipcash/app/core/util/AbbreviatedLink.kt similarity index 100% rename from apps/flipcash/core/src/androidMain/kotlin/com/flipcash/app/core/util/AbbreviatedLink.kt rename to apps/flipcash/core/src/commonMain/kotlin/com/flipcash/app/core/util/AbbreviatedLink.kt diff --git a/apps/flipcash/core/src/androidMain/kotlin/com/flipcash/app/core/util/Fiat.kt b/apps/flipcash/core/src/commonMain/kotlin/com/flipcash/app/core/util/Fiat.kt similarity index 100% rename from apps/flipcash/core/src/androidMain/kotlin/com/flipcash/app/core/util/Fiat.kt rename to apps/flipcash/core/src/commonMain/kotlin/com/flipcash/app/core/util/Fiat.kt diff --git a/apps/flipcash/core/src/androidMain/kotlin/com/flipcash/app/core/util/Linkify.kt b/apps/flipcash/core/src/commonMain/kotlin/com/flipcash/app/core/util/Linkify.kt similarity index 100% rename from apps/flipcash/core/src/androidMain/kotlin/com/flipcash/app/core/util/Linkify.kt rename to apps/flipcash/core/src/commonMain/kotlin/com/flipcash/app/core/util/Linkify.kt diff --git a/apps/flipcash/core/src/androidMain/kotlin/com/flipcash/app/core/util/MessagingPackages.kt b/apps/flipcash/core/src/commonMain/kotlin/com/flipcash/app/core/util/MessagingPackages.kt similarity index 100% rename from apps/flipcash/core/src/androidMain/kotlin/com/flipcash/app/core/util/MessagingPackages.kt rename to apps/flipcash/core/src/commonMain/kotlin/com/flipcash/app/core/util/MessagingPackages.kt diff --git a/apps/flipcash/core/src/androidMain/kotlin/com/flipcash/app/core/util/Number.kt b/apps/flipcash/core/src/commonMain/kotlin/com/flipcash/app/core/util/Number.kt similarity index 100% rename from apps/flipcash/core/src/androidMain/kotlin/com/flipcash/app/core/util/Number.kt rename to apps/flipcash/core/src/commonMain/kotlin/com/flipcash/app/core/util/Number.kt diff --git a/apps/flipcash/core/src/androidMain/kotlin/com/flipcash/app/core/verification/email/EmailCodeChannel.kt b/apps/flipcash/core/src/commonMain/kotlin/com/flipcash/app/core/verification/email/EmailCodeChannel.kt similarity index 100% rename from apps/flipcash/core/src/androidMain/kotlin/com/flipcash/app/core/verification/email/EmailCodeChannel.kt rename to apps/flipcash/core/src/commonMain/kotlin/com/flipcash/app/core/verification/email/EmailCodeChannel.kt diff --git a/apps/flipcash/core/src/androidMain/kotlin/com/flipcash/app/core/verification/email/EmailDeeplinkOrigin.kt b/apps/flipcash/core/src/commonMain/kotlin/com/flipcash/app/core/verification/email/EmailDeeplinkOrigin.kt similarity index 100% rename from apps/flipcash/core/src/androidMain/kotlin/com/flipcash/app/core/verification/email/EmailDeeplinkOrigin.kt rename to apps/flipcash/core/src/commonMain/kotlin/com/flipcash/app/core/verification/email/EmailDeeplinkOrigin.kt diff --git a/apps/flipcash/core/src/androidMain/kotlin/com/flipcash/app/core/verification/email/LocalEmailCodeChannel.kt b/apps/flipcash/core/src/commonMain/kotlin/com/flipcash/app/core/verification/email/LocalEmailCodeChannel.kt similarity index 100% rename from apps/flipcash/core/src/androidMain/kotlin/com/flipcash/app/core/verification/email/LocalEmailCodeChannel.kt rename to apps/flipcash/core/src/commonMain/kotlin/com/flipcash/app/core/verification/email/LocalEmailCodeChannel.kt diff --git a/apps/flipcash/shared/common-ui/build.gradle.kts b/apps/flipcash/shared/common-ui/build.gradle.kts index afa584a830..309e27b1db 100644 --- a/apps/flipcash/shared/common-ui/build.gradle.kts +++ b/apps/flipcash/shared/common-ui/build.gradle.kts @@ -13,6 +13,9 @@ kotlin { sourceSets { commonMain.dependencies { + implementation(libs.jetbrains.compose.animation) + implementation(libs.jetbrains.compose.material) + implementation(libs.jetbrains.compose.ui.tooling.preview) implementation(project(":apps:flipcash:core")) implementation(project(":ui:core")) implementation(project(":ui:theme")) diff --git a/apps/flipcash/shared/common-ui/src/androidMain/kotlin/com/flipcash/shared/common/ui/amount/AmountChip.kt b/apps/flipcash/shared/common-ui/src/commonMain/kotlin/com/flipcash/shared/common/ui/amount/AmountChip.kt similarity index 100% rename from apps/flipcash/shared/common-ui/src/androidMain/kotlin/com/flipcash/shared/common/ui/amount/AmountChip.kt rename to apps/flipcash/shared/common-ui/src/commonMain/kotlin/com/flipcash/shared/common/ui/amount/AmountChip.kt diff --git a/apps/flipcash/shared/theme/build.gradle.kts b/apps/flipcash/shared/theme/build.gradle.kts index cd19d34932..a543099804 100644 --- a/apps/flipcash/shared/theme/build.gradle.kts +++ b/apps/flipcash/shared/theme/build.gradle.kts @@ -10,6 +10,9 @@ kotlin { sourceSets { commonMain.dependencies { + implementation(libs.jetbrains.compose.material) + implementation(libs.jetbrains.compose.material3) + implementation(libs.jetbrains.compose.ui.tooling.preview) implementation(project(":ui:theme")) implementation(libs.jetbrains.compose.runtime) implementation(libs.jetbrains.compose.foundation) diff --git a/apps/flipcash/shared/theme/src/androidMain/kotlin/com/flipcash/app/theme/FlipcashPreview.kt b/apps/flipcash/shared/theme/src/commonMain/kotlin/com/flipcash/app/theme/FlipcashPreview.kt similarity index 100% rename from apps/flipcash/shared/theme/src/androidMain/kotlin/com/flipcash/app/theme/FlipcashPreview.kt rename to apps/flipcash/shared/theme/src/commonMain/kotlin/com/flipcash/app/theme/FlipcashPreview.kt diff --git a/apps/flipcash/shared/tokens/build.gradle.kts b/apps/flipcash/shared/tokens/build.gradle.kts index 34e4d3caf8..e717bd4947 100644 --- a/apps/flipcash/shared/tokens/build.gradle.kts +++ b/apps/flipcash/shared/tokens/build.gradle.kts @@ -15,6 +15,12 @@ kotlin { sourceSets { commonMain.dependencies { + implementation(libs.jetbrains.compose.foundation) + implementation(libs.jetbrains.compose.ui) + implementation(libs.jetbrains.compose.animation) + implementation(libs.jetbrains.compose.material) + implementation(libs.jetbrains.compose.material3) + implementation(libs.jetbrains.compose.ui.tooling.preview) api(project(":apps:flipcash:shared:tokens:core")) implementation(project(":apps:flipcash:core")) diff --git a/apps/flipcash/shared/tokens/src/androidMain/kotlin/com/flipcash/app/tokens/BalancePoller.kt b/apps/flipcash/shared/tokens/src/commonMain/kotlin/com/flipcash/app/tokens/BalancePoller.kt similarity index 100% rename from apps/flipcash/shared/tokens/src/androidMain/kotlin/com/flipcash/app/tokens/BalancePoller.kt rename to apps/flipcash/shared/tokens/src/commonMain/kotlin/com/flipcash/app/tokens/BalancePoller.kt diff --git a/apps/flipcash/shared/tokens/src/androidMain/kotlin/com/flipcash/app/tokens/FeeAffordableEntry.kt b/apps/flipcash/shared/tokens/src/commonMain/kotlin/com/flipcash/app/tokens/FeeAffordableEntry.kt similarity index 100% rename from apps/flipcash/shared/tokens/src/androidMain/kotlin/com/flipcash/app/tokens/FeeAffordableEntry.kt rename to apps/flipcash/shared/tokens/src/commonMain/kotlin/com/flipcash/app/tokens/FeeAffordableEntry.kt diff --git a/apps/flipcash/shared/tokens/src/androidMain/kotlin/com/flipcash/app/tokens/InlineCompletion.kt b/apps/flipcash/shared/tokens/src/commonMain/kotlin/com/flipcash/app/tokens/InlineCompletion.kt similarity index 100% rename from apps/flipcash/shared/tokens/src/androidMain/kotlin/com/flipcash/app/tokens/InlineCompletion.kt rename to apps/flipcash/shared/tokens/src/commonMain/kotlin/com/flipcash/app/tokens/InlineCompletion.kt diff --git a/apps/flipcash/shared/tokens/src/androidMain/kotlin/com/flipcash/app/tokens/TokenUpdater.kt b/apps/flipcash/shared/tokens/src/commonMain/kotlin/com/flipcash/app/tokens/TokenUpdater.kt similarity index 100% rename from apps/flipcash/shared/tokens/src/androidMain/kotlin/com/flipcash/app/tokens/TokenUpdater.kt rename to apps/flipcash/shared/tokens/src/commonMain/kotlin/com/flipcash/app/tokens/TokenUpdater.kt diff --git a/apps/flipcash/shared/tokens/src/androidMain/kotlin/com/flipcash/app/tokens/UsdcDepositSweep.kt b/apps/flipcash/shared/tokens/src/commonMain/kotlin/com/flipcash/app/tokens/UsdcDepositSweep.kt similarity index 100% rename from apps/flipcash/shared/tokens/src/androidMain/kotlin/com/flipcash/app/tokens/UsdcDepositSweep.kt rename to apps/flipcash/shared/tokens/src/commonMain/kotlin/com/flipcash/app/tokens/UsdcDepositSweep.kt diff --git a/apps/flipcash/shared/tokens/src/androidMain/kotlin/com/flipcash/app/tokens/data/MarketTrend.kt b/apps/flipcash/shared/tokens/src/commonMain/kotlin/com/flipcash/app/tokens/data/MarketTrend.kt similarity index 100% rename from apps/flipcash/shared/tokens/src/androidMain/kotlin/com/flipcash/app/tokens/data/MarketTrend.kt rename to apps/flipcash/shared/tokens/src/commonMain/kotlin/com/flipcash/app/tokens/data/MarketTrend.kt diff --git a/apps/flipcash/shared/tokens/src/androidMain/kotlin/com/flipcash/app/tokens/data/Period.kt b/apps/flipcash/shared/tokens/src/commonMain/kotlin/com/flipcash/app/tokens/data/Period.kt similarity index 100% rename from apps/flipcash/shared/tokens/src/androidMain/kotlin/com/flipcash/app/tokens/data/Period.kt rename to apps/flipcash/shared/tokens/src/commonMain/kotlin/com/flipcash/app/tokens/data/Period.kt diff --git a/ui/components/src/androidMain/kotlin/com/getcode/ui/Locals.kt b/ui/components/src/commonMain/kotlin/com/getcode/ui/Locals.kt similarity index 100% rename from ui/components/src/androidMain/kotlin/com/getcode/ui/Locals.kt rename to ui/components/src/commonMain/kotlin/com/getcode/ui/Locals.kt diff --git a/ui/components/src/androidMain/kotlin/com/getcode/ui/components/BlurredContent.kt b/ui/components/src/commonMain/kotlin/com/getcode/ui/components/BlurredContent.kt similarity index 100% rename from ui/components/src/androidMain/kotlin/com/getcode/ui/components/BlurredContent.kt rename to ui/components/src/commonMain/kotlin/com/getcode/ui/components/BlurredContent.kt diff --git a/ui/components/src/androidMain/kotlin/com/getcode/ui/components/BottomScrollEdge.kt b/ui/components/src/commonMain/kotlin/com/getcode/ui/components/BottomScrollEdge.kt similarity index 100% rename from ui/components/src/androidMain/kotlin/com/getcode/ui/components/BottomScrollEdge.kt rename to ui/components/src/commonMain/kotlin/com/getcode/ui/components/BottomScrollEdge.kt diff --git a/ui/components/src/androidMain/kotlin/com/getcode/ui/components/BulletRow.kt b/ui/components/src/commonMain/kotlin/com/getcode/ui/components/BulletRow.kt similarity index 100% rename from ui/components/src/androidMain/kotlin/com/getcode/ui/components/BulletRow.kt rename to ui/components/src/commonMain/kotlin/com/getcode/ui/components/BulletRow.kt diff --git a/ui/components/src/androidMain/kotlin/com/getcode/ui/components/CapsuleProgressBar.kt b/ui/components/src/commonMain/kotlin/com/getcode/ui/components/CapsuleProgressBar.kt similarity index 100% rename from ui/components/src/androidMain/kotlin/com/getcode/ui/components/CapsuleProgressBar.kt rename to ui/components/src/commonMain/kotlin/com/getcode/ui/components/CapsuleProgressBar.kt diff --git a/ui/components/src/androidMain/kotlin/com/getcode/ui/components/Chip.kt b/ui/components/src/commonMain/kotlin/com/getcode/ui/components/Chip.kt similarity index 100% rename from ui/components/src/androidMain/kotlin/com/getcode/ui/components/Chip.kt rename to ui/components/src/commonMain/kotlin/com/getcode/ui/components/Chip.kt diff --git a/ui/components/src/androidMain/kotlin/com/getcode/ui/components/FilterChip.kt b/ui/components/src/commonMain/kotlin/com/getcode/ui/components/FilterChip.kt similarity index 100% rename from ui/components/src/androidMain/kotlin/com/getcode/ui/components/FilterChip.kt rename to ui/components/src/commonMain/kotlin/com/getcode/ui/components/FilterChip.kt diff --git a/ui/components/src/androidMain/kotlin/com/getcode/ui/components/Flippable.kt b/ui/components/src/commonMain/kotlin/com/getcode/ui/components/Flippable.kt similarity index 100% rename from ui/components/src/androidMain/kotlin/com/getcode/ui/components/Flippable.kt rename to ui/components/src/commonMain/kotlin/com/getcode/ui/components/Flippable.kt diff --git a/ui/components/src/androidMain/kotlin/com/getcode/ui/components/FullWidthScrollableTabRow.kt b/ui/components/src/commonMain/kotlin/com/getcode/ui/components/FullWidthScrollableTabRow.kt similarity index 100% rename from ui/components/src/androidMain/kotlin/com/getcode/ui/components/FullWidthScrollableTabRow.kt rename to ui/components/src/commonMain/kotlin/com/getcode/ui/components/FullWidthScrollableTabRow.kt diff --git a/ui/components/src/androidMain/kotlin/com/getcode/ui/components/Modal.kt b/ui/components/src/commonMain/kotlin/com/getcode/ui/components/Modal.kt similarity index 100% rename from ui/components/src/androidMain/kotlin/com/getcode/ui/components/Modal.kt rename to ui/components/src/commonMain/kotlin/com/getcode/ui/components/Modal.kt diff --git a/ui/components/src/androidMain/kotlin/com/getcode/ui/components/NotificationDot.kt b/ui/components/src/commonMain/kotlin/com/getcode/ui/components/NotificationDot.kt similarity index 100% rename from ui/components/src/androidMain/kotlin/com/getcode/ui/components/NotificationDot.kt rename to ui/components/src/commonMain/kotlin/com/getcode/ui/components/NotificationDot.kt diff --git a/ui/components/src/androidMain/kotlin/com/getcode/ui/components/Pill.kt b/ui/components/src/commonMain/kotlin/com/getcode/ui/components/Pill.kt similarity index 100% rename from ui/components/src/androidMain/kotlin/com/getcode/ui/components/Pill.kt rename to ui/components/src/commonMain/kotlin/com/getcode/ui/components/Pill.kt diff --git a/ui/components/src/androidMain/kotlin/com/getcode/ui/components/PullToReveal.kt b/ui/components/src/commonMain/kotlin/com/getcode/ui/components/PullToReveal.kt similarity index 100% rename from ui/components/src/androidMain/kotlin/com/getcode/ui/components/PullToReveal.kt rename to ui/components/src/commonMain/kotlin/com/getcode/ui/components/PullToReveal.kt diff --git a/ui/components/src/androidMain/kotlin/com/getcode/ui/components/SegmentedControl.kt b/ui/components/src/commonMain/kotlin/com/getcode/ui/components/SegmentedControl.kt similarity index 100% rename from ui/components/src/androidMain/kotlin/com/getcode/ui/components/SegmentedControl.kt rename to ui/components/src/commonMain/kotlin/com/getcode/ui/components/SegmentedControl.kt diff --git a/ui/components/src/androidMain/kotlin/com/getcode/ui/components/TopScrollEdge.kt b/ui/components/src/commonMain/kotlin/com/getcode/ui/components/TopScrollEdge.kt similarity index 100% rename from ui/components/src/androidMain/kotlin/com/getcode/ui/components/TopScrollEdge.kt rename to ui/components/src/commonMain/kotlin/com/getcode/ui/components/TopScrollEdge.kt diff --git a/ui/components/src/androidMain/kotlin/com/getcode/ui/components/VerticalDivider.kt b/ui/components/src/commonMain/kotlin/com/getcode/ui/components/VerticalDivider.kt similarity index 100% rename from ui/components/src/androidMain/kotlin/com/getcode/ui/components/VerticalDivider.kt rename to ui/components/src/commonMain/kotlin/com/getcode/ui/components/VerticalDivider.kt diff --git a/ui/components/src/androidMain/kotlin/com/getcode/ui/components/charts/ChartPoint.kt b/ui/components/src/commonMain/kotlin/com/getcode/ui/components/charts/ChartPoint.kt similarity index 100% rename from ui/components/src/androidMain/kotlin/com/getcode/ui/components/charts/ChartPoint.kt rename to ui/components/src/commonMain/kotlin/com/getcode/ui/components/charts/ChartPoint.kt diff --git a/ui/components/src/androidMain/kotlin/com/getcode/ui/components/charts/Trends.kt b/ui/components/src/commonMain/kotlin/com/getcode/ui/components/charts/Trends.kt similarity index 100% rename from ui/components/src/androidMain/kotlin/com/getcode/ui/components/charts/Trends.kt rename to ui/components/src/commonMain/kotlin/com/getcode/ui/components/charts/Trends.kt diff --git a/ui/components/src/androidMain/kotlin/com/getcode/ui/components/chat/DateBubble.kt b/ui/components/src/commonMain/kotlin/com/getcode/ui/components/chat/DateBubble.kt similarity index 100% rename from ui/components/src/androidMain/kotlin/com/getcode/ui/components/chat/DateBubble.kt rename to ui/components/src/commonMain/kotlin/com/getcode/ui/components/chat/DateBubble.kt diff --git a/ui/components/src/androidMain/kotlin/com/getcode/ui/components/chat/MessageNodeDefaults.kt b/ui/components/src/commonMain/kotlin/com/getcode/ui/components/chat/MessageNodeDefaults.kt similarity index 100% rename from ui/components/src/androidMain/kotlin/com/getcode/ui/components/chat/MessageNodeDefaults.kt rename to ui/components/src/commonMain/kotlin/com/getcode/ui/components/chat/MessageNodeDefaults.kt diff --git a/ui/components/src/androidMain/kotlin/com/getcode/ui/components/chat/TypingIndicator.kt b/ui/components/src/commonMain/kotlin/com/getcode/ui/components/chat/TypingIndicator.kt similarity index 100% rename from ui/components/src/androidMain/kotlin/com/getcode/ui/components/chat/TypingIndicator.kt rename to ui/components/src/commonMain/kotlin/com/getcode/ui/components/chat/TypingIndicator.kt diff --git a/ui/components/src/androidMain/kotlin/com/getcode/ui/components/text/SectionHeader.kt b/ui/components/src/commonMain/kotlin/com/getcode/ui/components/text/SectionHeader.kt similarity index 100% rename from ui/components/src/androidMain/kotlin/com/getcode/ui/components/text/SectionHeader.kt rename to ui/components/src/commonMain/kotlin/com/getcode/ui/components/text/SectionHeader.kt diff --git a/ui/components/src/androidMain/kotlin/com/getcode/ui/components/text/animated/DigitContainer.kt b/ui/components/src/commonMain/kotlin/com/getcode/ui/components/text/animated/DigitContainer.kt similarity index 100% rename from ui/components/src/androidMain/kotlin/com/getcode/ui/components/text/animated/DigitContainer.kt rename to ui/components/src/commonMain/kotlin/com/getcode/ui/components/text/animated/DigitContainer.kt diff --git a/ui/components/src/androidMain/kotlin/com/getcode/ui/theme/CodeBillSwipeToDismiss.kt b/ui/components/src/commonMain/kotlin/com/getcode/ui/theme/CodeBillSwipeToDismiss.kt similarity index 100% rename from ui/components/src/androidMain/kotlin/com/getcode/ui/theme/CodeBillSwipeToDismiss.kt rename to ui/components/src/commonMain/kotlin/com/getcode/ui/theme/CodeBillSwipeToDismiss.kt diff --git a/ui/components/src/androidMain/kotlin/com/getcode/ui/theme/CodeCheckbox.kt b/ui/components/src/commonMain/kotlin/com/getcode/ui/theme/CodeCheckbox.kt similarity index 100% rename from ui/components/src/androidMain/kotlin/com/getcode/ui/theme/CodeCheckbox.kt rename to ui/components/src/commonMain/kotlin/com/getcode/ui/theme/CodeCheckbox.kt diff --git a/ui/components/src/androidMain/kotlin/com/getcode/ui/theme/CodeRadioButton.kt b/ui/components/src/commonMain/kotlin/com/getcode/ui/theme/CodeRadioButton.kt similarity index 100% rename from ui/components/src/androidMain/kotlin/com/getcode/ui/theme/CodeRadioButton.kt rename to ui/components/src/commonMain/kotlin/com/getcode/ui/theme/CodeRadioButton.kt diff --git a/ui/components/src/androidMain/kotlin/com/getcode/ui/theme/CodeScaffold.kt b/ui/components/src/commonMain/kotlin/com/getcode/ui/theme/CodeScaffold.kt similarity index 100% rename from ui/components/src/androidMain/kotlin/com/getcode/ui/theme/CodeScaffold.kt rename to ui/components/src/commonMain/kotlin/com/getcode/ui/theme/CodeScaffold.kt diff --git a/ui/components/src/androidMain/kotlin/com/getcode/ui/theme/CodeSeedView.kt b/ui/components/src/commonMain/kotlin/com/getcode/ui/theme/CodeSeedView.kt similarity index 100% rename from ui/components/src/androidMain/kotlin/com/getcode/ui/theme/CodeSeedView.kt rename to ui/components/src/commonMain/kotlin/com/getcode/ui/theme/CodeSeedView.kt diff --git a/ui/components/src/androidMain/kotlin/com/getcode/ui/theme/CodeSegmentedControl.kt b/ui/components/src/commonMain/kotlin/com/getcode/ui/theme/CodeSegmentedControl.kt similarity index 100% rename from ui/components/src/androidMain/kotlin/com/getcode/ui/theme/CodeSegmentedControl.kt rename to ui/components/src/commonMain/kotlin/com/getcode/ui/theme/CodeSegmentedControl.kt diff --git a/ui/components/src/androidMain/kotlin/com/getcode/ui/theme/CodeSwitch.kt b/ui/components/src/commonMain/kotlin/com/getcode/ui/theme/CodeSwitch.kt similarity index 100% rename from ui/components/src/androidMain/kotlin/com/getcode/ui/theme/CodeSwitch.kt rename to ui/components/src/commonMain/kotlin/com/getcode/ui/theme/CodeSwitch.kt diff --git a/ui/components/src/androidMain/kotlin/com/getcode/ui/utils/AnimationUtils.kt b/ui/components/src/commonMain/kotlin/com/getcode/ui/utils/AnimationUtils.kt similarity index 100% rename from ui/components/src/androidMain/kotlin/com/getcode/ui/utils/AnimationUtils.kt rename to ui/components/src/commonMain/kotlin/com/getcode/ui/utils/AnimationUtils.kt diff --git a/ui/components/src/androidMain/kotlin/com/getcode/ui/utils/Geometry.kt b/ui/components/src/commonMain/kotlin/com/getcode/ui/utils/Geometry.kt similarity index 100% rename from ui/components/src/androidMain/kotlin/com/getcode/ui/utils/Geometry.kt rename to ui/components/src/commonMain/kotlin/com/getcode/ui/utils/Geometry.kt diff --git a/ui/components/src/androidMain/kotlin/com/getcode/ui/utils/LazyList.kt b/ui/components/src/commonMain/kotlin/com/getcode/ui/utils/LazyList.kt similarity index 100% rename from ui/components/src/androidMain/kotlin/com/getcode/ui/utils/LazyList.kt rename to ui/components/src/commonMain/kotlin/com/getcode/ui/utils/LazyList.kt diff --git a/ui/components/src/androidMain/kotlin/com/getcode/ui/utils/Maps.kt b/ui/components/src/commonMain/kotlin/com/getcode/ui/utils/Maps.kt similarity index 100% rename from ui/components/src/androidMain/kotlin/com/getcode/ui/utils/Maps.kt rename to ui/components/src/commonMain/kotlin/com/getcode/ui/utils/Maps.kt diff --git a/ui/components/src/androidMain/kotlin/com/getcode/ui/utils/MeasureScope.kt b/ui/components/src/commonMain/kotlin/com/getcode/ui/utils/MeasureScope.kt similarity index 100% rename from ui/components/src/androidMain/kotlin/com/getcode/ui/utils/MeasureScope.kt rename to ui/components/src/commonMain/kotlin/com/getcode/ui/utils/MeasureScope.kt diff --git a/ui/components/src/androidMain/kotlin/com/getcode/ui/utils/PaddingValues.kt b/ui/components/src/commonMain/kotlin/com/getcode/ui/utils/PaddingValues.kt similarity index 100% rename from ui/components/src/androidMain/kotlin/com/getcode/ui/utils/PaddingValues.kt rename to ui/components/src/commonMain/kotlin/com/getcode/ui/utils/PaddingValues.kt diff --git a/ui/components/src/androidMain/kotlin/com/getcode/ui/utils/TextStyle.kt b/ui/components/src/commonMain/kotlin/com/getcode/ui/utils/TextStyle.kt similarity index 100% rename from ui/components/src/androidMain/kotlin/com/getcode/ui/utils/TextStyle.kt rename to ui/components/src/commonMain/kotlin/com/getcode/ui/utils/TextStyle.kt diff --git a/ui/core/src/androidMain/kotlin/com/getcode/ui/core/ContextMenuAction.kt b/ui/core/src/commonMain/kotlin/com/getcode/ui/core/ContextMenuAction.kt similarity index 100% rename from ui/core/src/androidMain/kotlin/com/getcode/ui/core/ContextMenuAction.kt rename to ui/core/src/commonMain/kotlin/com/getcode/ui/core/ContextMenuAction.kt diff --git a/ui/core/src/androidMain/kotlin/com/getcode/ui/core/ExpandedTouchTarget.kt b/ui/core/src/commonMain/kotlin/com/getcode/ui/core/ExpandedTouchTarget.kt similarity index 100% rename from ui/core/src/androidMain/kotlin/com/getcode/ui/core/ExpandedTouchTarget.kt rename to ui/core/src/commonMain/kotlin/com/getcode/ui/core/ExpandedTouchTarget.kt diff --git a/ui/core/src/androidMain/kotlin/com/getcode/ui/core/StarMaskVisualTransformation.kt b/ui/core/src/commonMain/kotlin/com/getcode/ui/core/StarMaskVisualTransformation.kt similarity index 100% rename from ui/core/src/androidMain/kotlin/com/getcode/ui/core/StarMaskVisualTransformation.kt rename to ui/core/src/commonMain/kotlin/com/getcode/ui/core/StarMaskVisualTransformation.kt diff --git a/ui/core/src/androidMain/kotlin/com/getcode/ui/core/visibility/VisibilityInfo.kt b/ui/core/src/commonMain/kotlin/com/getcode/ui/core/visibility/VisibilityInfo.kt similarity index 100% rename from ui/core/src/androidMain/kotlin/com/getcode/ui/core/visibility/VisibilityInfo.kt rename to ui/core/src/commonMain/kotlin/com/getcode/ui/core/visibility/VisibilityInfo.kt diff --git a/ui/core/src/androidMain/kotlin/com/getcode/ui/core/visibility/VisibilityTrackerNode.kt b/ui/core/src/commonMain/kotlin/com/getcode/ui/core/visibility/VisibilityTrackerNode.kt similarity index 100% rename from ui/core/src/androidMain/kotlin/com/getcode/ui/core/visibility/VisibilityTrackerNode.kt rename to ui/core/src/commonMain/kotlin/com/getcode/ui/core/visibility/VisibilityTrackerNode.kt diff --git a/ui/navigation/build.gradle.kts b/ui/navigation/build.gradle.kts index c658b24e56..27266d9bf8 100644 --- a/ui/navigation/build.gradle.kts +++ b/ui/navigation/build.gradle.kts @@ -12,6 +12,10 @@ kotlin { sourceSets { commonMain.dependencies { + implementation(libs.jetbrains.compose.animation) + implementation(libs.jetbrains.compose.material) + implementation(libs.jetbrains.compose.material3) + implementation(libs.jetbrains.compose.ui.tooling.preview) api(project(":libs:coroutines")) implementation(project(":libs:logging")) implementation(project(":libs:parcelable")) diff --git a/ui/navigation/src/androidMain/kotlin/com/getcode/navigation/flow/FlowDismissStyle.kt b/ui/navigation/src/commonMain/kotlin/com/getcode/navigation/flow/FlowDismissStyle.kt similarity index 100% rename from ui/navigation/src/androidMain/kotlin/com/getcode/navigation/flow/FlowDismissStyle.kt rename to ui/navigation/src/commonMain/kotlin/com/getcode/navigation/flow/FlowDismissStyle.kt diff --git a/ui/navigation/src/androidMain/kotlin/com/getcode/navigation/scrim/Scrim.kt b/ui/navigation/src/commonMain/kotlin/com/getcode/navigation/scrim/Scrim.kt similarity index 100% rename from ui/navigation/src/androidMain/kotlin/com/getcode/navigation/scrim/Scrim.kt rename to ui/navigation/src/commonMain/kotlin/com/getcode/navigation/scrim/Scrim.kt diff --git a/ui/navigation/src/androidMain/kotlin/com/getcode/ui/utils/SheetExpansion.kt b/ui/navigation/src/commonMain/kotlin/com/getcode/ui/utils/SheetExpansion.kt similarity index 100% rename from ui/navigation/src/androidMain/kotlin/com/getcode/ui/utils/SheetExpansion.kt rename to ui/navigation/src/commonMain/kotlin/com/getcode/ui/utils/SheetExpansion.kt From 1d77df4756c76ccb4ae09dfe8c76752b559ca1c2 Mon Sep 17 00:00:00 2001 From: Brandon McAnsh Date: Sat, 24 Oct 2026 16:12:02 -0400 Subject: [PATCH 2/3] refactor(kmp): read Compose resources in common code and lift R-only files 13 files that were held in androidMain only by `R` move to commonMain (core-ui 6, ui:components 4, common-ui 2, app:core 1). They read strings and drawables through the generated `Res` with org.jetbrains.compose.resources, on Android as well as desktop, so no Int-id seam is added. ui:components and common-ui gain the Compose resources plugin with the same res-sync block app:core uses. ui:components gets the multiplatform material icons on commonMain and core-ui gets shared:theme there. UnreadSeparator stays in androidMain: its plural items point at other strings with @string/, which Compose resources does not resolve. ComposeResourcesOnAndroidTest renders a converted string and vector under Robolectric, since a missing Compose resource throws at runtime rather than failing the build. --- apps/flipcash/core-ui/build.gradle.kts | 1 + .../flipcash/app/core/ui/ConversionGraphic.kt | 13 ++++-- .../com/flipcash/app/core/ui/DeviceFrame.kt | 10 ++-- .../app/core/ui/NotificationPreview.kt | 15 +++--- .../com/flipcash/app/core/ui/SwitchPreview.kt | 7 +-- .../app/core/ui/TokenSelectionPill.kt | 9 ++-- .../processing/ProcessingLoadingIndicator.kt | 10 ++-- .../flipcash/app/core/extensions/Boolean.kt | 8 ---- .../flipcash/app/core/extensions/Boolean.kt | 10 ++++ .../shared/common-ui/build.gradle.kts | 15 +++++- .../ui/profile/BalanceRequirementsCard.kt | 30 +++++++----- .../common/ui/profile/ProfileStatsCard.kt | 13 ++++-- ui/components/build.gradle.kts | 13 ++++++ .../ComposeResourcesOnAndroidTest.kt | 46 +++++++++++++++++++ .../getcode/ui/components/BetaIndicator.kt | 6 ++- .../com/getcode/ui/components/ListItem.kt | 6 ++- .../getcode/ui/components/SwipeActionRow.kt | 7 +-- .../ui/components/text/ExpandableText.kt | 8 ++-- 18 files changed, 166 insertions(+), 61 deletions(-) rename apps/flipcash/core-ui/src/{androidMain => commonMain}/kotlin/com/flipcash/app/core/ui/ConversionGraphic.kt (84%) rename apps/flipcash/core-ui/src/{androidMain => commonMain}/kotlin/com/flipcash/app/core/ui/DeviceFrame.kt (83%) rename apps/flipcash/core-ui/src/{androidMain => commonMain}/kotlin/com/flipcash/app/core/ui/NotificationPreview.kt (85%) rename apps/flipcash/core-ui/src/{androidMain => commonMain}/kotlin/com/flipcash/app/core/ui/SwitchPreview.kt (93%) rename apps/flipcash/core-ui/src/{androidMain => commonMain}/kotlin/com/flipcash/app/core/ui/TokenSelectionPill.kt (93%) rename apps/flipcash/core-ui/src/{androidMain => commonMain}/kotlin/com/flipcash/app/core/ui/processing/ProcessingLoadingIndicator.kt (91%) delete mode 100644 apps/flipcash/core/src/androidMain/kotlin/com/flipcash/app/core/extensions/Boolean.kt create mode 100644 apps/flipcash/core/src/commonMain/kotlin/com/flipcash/app/core/extensions/Boolean.kt rename apps/flipcash/shared/common-ui/src/{androidMain => commonMain}/kotlin/com/flipcash/shared/common/ui/profile/BalanceRequirementsCard.kt (83%) rename apps/flipcash/shared/common-ui/src/{androidMain => commonMain}/kotlin/com/flipcash/shared/common/ui/profile/ProfileStatsCard.kt (85%) create mode 100644 ui/components/src/androidHostTest/kotlin/com/getcode/ui/components/ComposeResourcesOnAndroidTest.kt rename ui/components/src/{androidMain => commonMain}/kotlin/com/getcode/ui/components/BetaIndicator.kt (84%) rename ui/components/src/{androidMain => commonMain}/kotlin/com/getcode/ui/components/ListItem.kt (96%) rename ui/components/src/{androidMain => commonMain}/kotlin/com/getcode/ui/components/SwipeActionRow.kt (98%) rename ui/components/src/{androidMain => commonMain}/kotlin/com/getcode/ui/components/text/ExpandableText.kt (93%) diff --git a/apps/flipcash/core-ui/build.gradle.kts b/apps/flipcash/core-ui/build.gradle.kts index 48cdd70695..28e7f1a441 100644 --- a/apps/flipcash/core-ui/build.gradle.kts +++ b/apps/flipcash/core-ui/build.gradle.kts @@ -23,6 +23,7 @@ kotlin { implementation(project(":ui:components")) implementation(project(":ui:resources")) implementation(project(":ui:theme")) + implementation(project(":apps:flipcash:shared:theme")) implementation(libs.jetbrains.compose.runtime) implementation(libs.jetbrains.compose.foundation) diff --git a/apps/flipcash/core-ui/src/androidMain/kotlin/com/flipcash/app/core/ui/ConversionGraphic.kt b/apps/flipcash/core-ui/src/commonMain/kotlin/com/flipcash/app/core/ui/ConversionGraphic.kt similarity index 84% rename from apps/flipcash/core-ui/src/androidMain/kotlin/com/flipcash/app/core/ui/ConversionGraphic.kt rename to apps/flipcash/core-ui/src/commonMain/kotlin/com/flipcash/app/core/ui/ConversionGraphic.kt index a4c2713e51..fd3dae6d9e 100644 --- a/apps/flipcash/core-ui/src/androidMain/kotlin/com/flipcash/app/core/ui/ConversionGraphic.kt +++ b/apps/flipcash/core-ui/src/commonMain/kotlin/com/flipcash/app/core/ui/ConversionGraphic.kt @@ -8,9 +8,12 @@ import androidx.compose.foundation.layout.size import androidx.compose.runtime.Composable import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier -import androidx.compose.ui.res.painterResource +import org.jetbrains.compose.resources.painterResource import androidx.compose.ui.unit.dp -import com.flipcash.core.R +import com.flipcash.core.resources.Res +import com.flipcash.core.resources.ic_arrow_right +import com.flipcash.core.resources.ic_coin_dollars +import com.flipcash.core.resources.ic_usdc_on_solana /** * A coin face the [ConversionGraphic] can show on either side of the arrow. @@ -50,7 +53,7 @@ fun ConversionGraphic( // Nudged onto the coin faces' centre line, which the top alignment above leaves at // 50 dp: (100 - 28) / 2. modifier = Modifier.padding(top = 36.dp).size(28.dp), - painter = painterResource(R.drawable.ic_arrow_right), + painter = painterResource(Res.drawable.ic_arrow_right), contentDescription = null, ) Coin(to) @@ -62,13 +65,13 @@ private fun Coin(coin: ConversionCoin) { when (coin) { ConversionCoin.Dollars -> Image( modifier = Modifier.size(100.dp), - painter = painterResource(R.drawable.ic_coin_dollars), + painter = painterResource(Res.drawable.ic_coin_dollars), contentDescription = null, ) // Natural size (111x112): the 100 dp coin plus the badge overhanging its corner. ConversionCoin.UsdcOnSolana -> Image( - painter = painterResource(R.drawable.ic_usdc_on_solana), + painter = painterResource(Res.drawable.ic_usdc_on_solana), contentDescription = null, ) } diff --git a/apps/flipcash/core-ui/src/androidMain/kotlin/com/flipcash/app/core/ui/DeviceFrame.kt b/apps/flipcash/core-ui/src/commonMain/kotlin/com/flipcash/app/core/ui/DeviceFrame.kt similarity index 83% rename from apps/flipcash/core-ui/src/androidMain/kotlin/com/flipcash/app/core/ui/DeviceFrame.kt rename to apps/flipcash/core-ui/src/commonMain/kotlin/com/flipcash/app/core/ui/DeviceFrame.kt index 7dcc411002..f32900a3cc 100644 --- a/apps/flipcash/core-ui/src/androidMain/kotlin/com/flipcash/app/core/ui/DeviceFrame.kt +++ b/apps/flipcash/core-ui/src/commonMain/kotlin/com/flipcash/app/core/ui/DeviceFrame.kt @@ -8,9 +8,11 @@ import androidx.compose.runtime.Composable import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.draw.clip -import androidx.compose.ui.res.painterResource +import org.jetbrains.compose.resources.painterResource import androidx.compose.ui.unit.dp -import com.flipcash.core.R +import com.flipcash.core.resources.Res +import com.flipcash.core.resources.ic_device_frame +import com.flipcash.core.resources.ic_screen_frame @Composable fun ScreenFrame( @@ -20,7 +22,7 @@ fun ScreenFrame( ) { Box(modifier = modifier, contentAlignment = Alignment.TopCenter) { Image( - painter = painterResource(id = R.drawable.ic_screen_frame), + painter = painterResource(Res.drawable.ic_screen_frame), contentDescription = "", ) Box( @@ -43,7 +45,7 @@ fun DeviceFrame( ) { Box(modifier = modifier, contentAlignment = Alignment.TopCenter) { Image( - painter = painterResource(id = R.drawable.ic_device_frame), + painter = painterResource(Res.drawable.ic_device_frame), contentDescription = "", ) // Inner viewport clipped to frame edge diff --git a/apps/flipcash/core-ui/src/androidMain/kotlin/com/flipcash/app/core/ui/NotificationPreview.kt b/apps/flipcash/core-ui/src/commonMain/kotlin/com/flipcash/app/core/ui/NotificationPreview.kt similarity index 85% rename from apps/flipcash/core-ui/src/androidMain/kotlin/com/flipcash/app/core/ui/NotificationPreview.kt rename to apps/flipcash/core-ui/src/commonMain/kotlin/com/flipcash/app/core/ui/NotificationPreview.kt index 5deabe0aad..95b26f7160 100644 --- a/apps/flipcash/core-ui/src/androidMain/kotlin/com/flipcash/app/core/ui/NotificationPreview.kt +++ b/apps/flipcash/core-ui/src/commonMain/kotlin/com/flipcash/app/core/ui/NotificationPreview.kt @@ -19,16 +19,19 @@ import androidx.compose.runtime.Composable import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.graphics.Color -import androidx.compose.ui.res.painterResource -import androidx.compose.ui.res.stringResource +import org.jetbrains.compose.resources.painterResource +import org.jetbrains.compose.resources.stringResource import androidx.compose.ui.text.font.FontFamily import androidx.compose.ui.text.font.FontWeight import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.sp import com.flipcash.app.theme.FlipcashPreview -import com.flipcash.core.R import com.getcode.theme.CodeTheme +import com.flipcash.core.resources.Res +import com.flipcash.core.resources.ic_notification_preview_icon +import com.flipcash.core.resources.notification_preview_body +import com.flipcash.core.resources.notification_preview_title @Composable fun NotificationPreview( @@ -53,7 +56,7 @@ fun NotificationPreview( .fillMaxHeight() .requiredSize(32.dp) .aspectRatio(1f), - painter = painterResource(R.drawable.ic_notification_preview_icon), + painter = painterResource(Res.drawable.ic_notification_preview_icon), contentDescription = null, ) Spacer(modifier = Modifier.width(8.dp)) @@ -96,8 +99,8 @@ fun NotificationPreview( fun Preview_Notification() { FlipcashPreview { NotificationPreview( - title = stringResource(R.string.notification_preview_title), - body = stringResource(R.string.notification_preview_body), + title = stringResource(Res.string.notification_preview_title), + body = stringResource(Res.string.notification_preview_body), ) } } \ No newline at end of file diff --git a/apps/flipcash/core-ui/src/androidMain/kotlin/com/flipcash/app/core/ui/SwitchPreview.kt b/apps/flipcash/core-ui/src/commonMain/kotlin/com/flipcash/app/core/ui/SwitchPreview.kt similarity index 93% rename from apps/flipcash/core-ui/src/androidMain/kotlin/com/flipcash/app/core/ui/SwitchPreview.kt rename to apps/flipcash/core-ui/src/commonMain/kotlin/com/flipcash/app/core/ui/SwitchPreview.kt index 5ed02e05eb..00b915a662 100644 --- a/apps/flipcash/core-ui/src/androidMain/kotlin/com/flipcash/app/core/ui/SwitchPreview.kt +++ b/apps/flipcash/core-ui/src/commonMain/kotlin/com/flipcash/app/core/ui/SwitchPreview.kt @@ -20,15 +20,16 @@ import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.graphics.Color import androidx.compose.ui.graphics.graphicsLayer -import androidx.compose.ui.res.stringResource +import org.jetbrains.compose.resources.stringResource import androidx.compose.ui.text.font.FontFamily import androidx.compose.ui.text.font.FontWeight import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.sp import com.flipcash.app.theme.FlipcashPreview -import com.flipcash.core.R import com.getcode.theme.CodeTheme +import com.flipcash.core.resources.Res +import com.flipcash.core.resources.title_allowNotifications @Composable fun SwitchPreview(modifier: Modifier = Modifier, checked: Boolean = false) { @@ -45,7 +46,7 @@ fun SwitchPreview(modifier: Modifier = Modifier, checked: Boolean = false) { ) { Text( modifier = Modifier.weight(1f), - text = stringResource(R.string.title_allowNotifications), + text = stringResource(Res.string.title_allowNotifications), fontSize = 14.sp, fontFamily = FontFamily.Default, fontWeight = FontWeight.Medium diff --git a/apps/flipcash/core-ui/src/androidMain/kotlin/com/flipcash/app/core/ui/TokenSelectionPill.kt b/apps/flipcash/core-ui/src/commonMain/kotlin/com/flipcash/app/core/ui/TokenSelectionPill.kt similarity index 93% rename from apps/flipcash/core-ui/src/androidMain/kotlin/com/flipcash/app/core/ui/TokenSelectionPill.kt rename to apps/flipcash/core-ui/src/commonMain/kotlin/com/flipcash/app/core/ui/TokenSelectionPill.kt index ec82200dd9..d5199efa4f 100644 --- a/apps/flipcash/core-ui/src/androidMain/kotlin/com/flipcash/app/core/ui/TokenSelectionPill.kt +++ b/apps/flipcash/core-ui/src/commonMain/kotlin/com/flipcash/app/core/ui/TokenSelectionPill.kt @@ -18,12 +18,13 @@ import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.draw.clip import androidx.compose.ui.graphics.Color -import androidx.compose.ui.res.painterResource +import org.jetbrains.compose.resources.painterResource import androidx.compose.ui.text.TextStyle import androidx.compose.ui.unit.Dp import com.getcode.opencode.model.financial.Token import com.getcode.theme.CodeTheme -import com.getcode.ui.core.R +import com.getcode.util.resources.Res +import com.getcode.util.resources.ic_dropdown @Composable fun TokenSelectionPill( @@ -64,7 +65,7 @@ fun TokenSelectionPill( Image( modifier = Modifier .size(CodeTheme.dimens.grid.x4), - painter = painterResource(R.drawable.ic_dropdown), + painter = painterResource(Res.drawable.ic_dropdown), contentDescription = "" ) } @@ -105,7 +106,7 @@ fun TokenSelectionPill( Image( modifier = Modifier .width(CodeTheme.dimens.grid.x4), - painter = painterResource(R.drawable.ic_dropdown), + painter = painterResource(Res.drawable.ic_dropdown), contentDescription = "" ) } diff --git a/apps/flipcash/core-ui/src/androidMain/kotlin/com/flipcash/app/core/ui/processing/ProcessingLoadingIndicator.kt b/apps/flipcash/core-ui/src/commonMain/kotlin/com/flipcash/app/core/ui/processing/ProcessingLoadingIndicator.kt similarity index 91% rename from apps/flipcash/core-ui/src/androidMain/kotlin/com/flipcash/app/core/ui/processing/ProcessingLoadingIndicator.kt rename to apps/flipcash/core-ui/src/commonMain/kotlin/com/flipcash/app/core/ui/processing/ProcessingLoadingIndicator.kt index d91b21dfc6..ab9dfa1cca 100644 --- a/apps/flipcash/core-ui/src/androidMain/kotlin/com/flipcash/app/core/ui/processing/ProcessingLoadingIndicator.kt +++ b/apps/flipcash/core-ui/src/commonMain/kotlin/com/flipcash/app/core/ui/processing/ProcessingLoadingIndicator.kt @@ -20,8 +20,7 @@ import androidx.compose.runtime.withFrameMillis import androidx.compose.ui.Modifier import androidx.compose.ui.graphics.Color import androidx.compose.ui.graphics.StrokeCap -import androidx.compose.ui.res.painterResource -import com.flipcash.core.R +import org.jetbrains.compose.resources.painterResource import com.getcode.theme.CodeTheme import com.getcode.ui.theme.CodeCircularProgressIndicator import com.getcode.view.LoadingSuccessState @@ -29,6 +28,9 @@ import kotlinx.coroutines.isActive import kotlin.math.pow import kotlin.time.Duration import kotlin.time.Duration.Companion.seconds +import com.flipcash.core.resources.Res +import com.flipcash.core.resources.ic_circle_check_large +import com.flipcash.core.resources.ic_circle_exclamation_large @Composable fun ProcessingLoadingIndicator( @@ -96,7 +98,7 @@ fun ProcessingLoadingIndicator( when (targetState) { LoadingSuccessState.State.Error -> Image( modifier = modifier, - painter = painterResource(R.drawable.ic_circle_exclamation_large), + painter = painterResource(Res.drawable.ic_circle_exclamation_large), contentDescription = null, ) LoadingSuccessState.State.Idle -> Spacer(modifier) @@ -110,7 +112,7 @@ fun ProcessingLoadingIndicator( ) LoadingSuccessState.State.Success -> Image( modifier = modifier, - painter = painterResource(R.drawable.ic_circle_check_large), + painter = painterResource(Res.drawable.ic_circle_check_large), contentDescription = null, ) } diff --git a/apps/flipcash/core/src/androidMain/kotlin/com/flipcash/app/core/extensions/Boolean.kt b/apps/flipcash/core/src/androidMain/kotlin/com/flipcash/app/core/extensions/Boolean.kt deleted file mode 100644 index fd1cd833fe..0000000000 --- a/apps/flipcash/core/src/androidMain/kotlin/com/flipcash/app/core/extensions/Boolean.kt +++ /dev/null @@ -1,8 +0,0 @@ -package com.flipcash.app.core.extensions - -import androidx.compose.runtime.Composable -import androidx.compose.ui.res.stringResource -import com.flipcash.core.R - -@Composable -fun Boolean.toYesOrNo() = if (this) stringResource(R.string.label_yes) else stringResource(R.string.label_no) \ No newline at end of file diff --git a/apps/flipcash/core/src/commonMain/kotlin/com/flipcash/app/core/extensions/Boolean.kt b/apps/flipcash/core/src/commonMain/kotlin/com/flipcash/app/core/extensions/Boolean.kt new file mode 100644 index 0000000000..b2c7209ca9 --- /dev/null +++ b/apps/flipcash/core/src/commonMain/kotlin/com/flipcash/app/core/extensions/Boolean.kt @@ -0,0 +1,10 @@ +package com.flipcash.app.core.extensions + +import androidx.compose.runtime.Composable +import org.jetbrains.compose.resources.stringResource +import com.flipcash.core.resources.Res +import com.flipcash.core.resources.label_no +import com.flipcash.core.resources.label_yes + +@Composable +fun Boolean.toYesOrNo() = if (this) stringResource(Res.string.label_yes) else stringResource(Res.string.label_no) \ No newline at end of file diff --git a/apps/flipcash/shared/common-ui/build.gradle.kts b/apps/flipcash/shared/common-ui/build.gradle.kts index 309e27b1db..9d5e1a37f5 100644 --- a/apps/flipcash/shared/common-ui/build.gradle.kts +++ b/apps/flipcash/shared/common-ui/build.gradle.kts @@ -1,6 +1,9 @@ +import com.getcode.buildlogic.resources.androidResAsComposeResources + plugins { alias(libs.plugins.flipcash.kmp.app.library) alias(libs.plugins.compose.compiler) + alias(libs.plugins.jetbrains.compose) } kotlin { @@ -13,6 +16,7 @@ kotlin { sourceSets { commonMain.dependencies { + implementation(libs.jetbrains.compose.components.resources) implementation(libs.jetbrains.compose.animation) implementation(libs.jetbrains.compose.material) implementation(libs.jetbrains.compose.ui.tooling.preview) @@ -21,6 +25,7 @@ kotlin { implementation(project(":ui:theme")) implementation(project(":services:flipcash")) implementation(project(":services:opencode")) + implementation(project(":apps:flipcash:shared:theme")) implementation(libs.jetbrains.compose.runtime) implementation(libs.jetbrains.compose.foundation) @@ -33,7 +38,6 @@ kotlin { implementation(project(":ui:components")) implementation(project(":ui:resources")) implementation(project(":libs:datetime")) - implementation(project(":apps:flipcash:shared:theme")) implementation(project.dependencies.platform(libs.compose.bom)) implementation(libs.bundles.compose) implementation(libs.bundles.haze) @@ -47,3 +51,12 @@ kotlin { } } } + +compose.resources { + publicResClass = true + packageOfResClass = "${Gradle.flipcashNamespace}.shared.common.ui.resources" + customDirectory( + sourceSetName = "commonMain", + directoryProvider = androidResAsComposeResources(), + ) +} diff --git a/apps/flipcash/shared/common-ui/src/androidMain/kotlin/com/flipcash/shared/common/ui/profile/BalanceRequirementsCard.kt b/apps/flipcash/shared/common-ui/src/commonMain/kotlin/com/flipcash/shared/common/ui/profile/BalanceRequirementsCard.kt similarity index 83% rename from apps/flipcash/shared/common-ui/src/androidMain/kotlin/com/flipcash/shared/common/ui/profile/BalanceRequirementsCard.kt rename to apps/flipcash/shared/common-ui/src/commonMain/kotlin/com/flipcash/shared/common/ui/profile/BalanceRequirementsCard.kt index 7efce6668d..89e1b059fd 100644 --- a/apps/flipcash/shared/common-ui/src/androidMain/kotlin/com/flipcash/shared/common/ui/profile/BalanceRequirementsCard.kt +++ b/apps/flipcash/shared/common-ui/src/commonMain/kotlin/com/flipcash/shared/common/ui/profile/BalanceRequirementsCard.kt @@ -24,15 +24,23 @@ import androidx.compose.runtime.setValue import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.draw.clip -import androidx.compose.ui.res.painterResource -import androidx.compose.ui.res.stringResource +import org.jetbrains.compose.resources.painterResource +import org.jetbrains.compose.resources.stringResource import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.tooling.preview.PreviewWrapper import androidx.compose.ui.unit.dp import com.flipcash.app.theme.FlipcashThemeWrapper -import com.flipcash.shared.common.ui.R import com.getcode.theme.CodeTheme import com.getcode.theme.White05 +import com.flipcash.shared.common.ui.resources.Res as CommonUiRes +import com.flipcash.shared.common.ui.resources.label_balanceRequirementChat +import com.flipcash.shared.common.ui.resources.label_balanceRequirementCommunityCurrency +import com.flipcash.shared.common.ui.resources.label_balanceRequirementJoin +import com.flipcash.shared.common.ui.resources.label_balanceRequirementNone +import com.flipcash.shared.common.ui.resources.label_yourBalance +import com.flipcash.shared.common.ui.resources.title_balanceRequirements +import com.getcode.util.resources.Res as UiRes +import com.getcode.util.resources.ic_chevron_right private val RowHeight = 56.dp private val CompactRowHeight = 48.dp @@ -69,7 +77,7 @@ fun BalanceRequirementsCard( verticalArrangement = Arrangement.spacedBy(if (compact) 8.dp else 16.dp), ) { Text( - text = stringResource(R.string.title_balanceRequirements), + text = stringResource(CommonUiRes.string.title_balanceRequirements), style = if (compact) CodeTheme.typography.textMedium else CodeTheme.typography.textLarge, color = CodeTheme.colors.textMain, ) @@ -84,14 +92,14 @@ fun BalanceRequirementsCard( RowSeparator() } RequirementRow( - label = stringResource(R.string.label_balanceRequirementJoin), - value = join ?: stringResource(R.string.label_balanceRequirementNone), + label = stringResource(CommonUiRes.string.label_balanceRequirementJoin), + value = join ?: stringResource(CommonUiRes.string.label_balanceRequirementNone), compact = compact, ) RowSeparator() RequirementRow( - label = stringResource(R.string.label_balanceRequirementChat), - value = chat ?: stringResource(R.string.label_balanceRequirementNone), + label = stringResource(CommonUiRes.string.label_balanceRequirementChat), + value = chat ?: stringResource(CommonUiRes.string.label_balanceRequirementNone), compact = compact, ) } @@ -118,7 +126,7 @@ fun BalanceRequirementsCard( horizontalArrangement = Arrangement.SpaceBetween, ) { Text( - text = stringResource(R.string.label_yourBalance), + text = stringResource(CommonUiRes.string.label_yourBalance), style = CodeTheme.typography.textSmall, color = CodeTheme.colors.textSecondary, ) @@ -154,13 +162,13 @@ private fun CommunityCurrencyRow(onClick: () -> Unit, content: @Composable RowSc ) { Text( modifier = Modifier.weight(1f), - text = stringResource(R.string.label_balanceRequirementCommunityCurrency), + text = stringResource(CommonUiRes.string.label_balanceRequirementCommunityCurrency), style = CodeTheme.typography.textSmall, color = CodeTheme.colors.textSecondary, ) content() Icon( - painter = painterResource(R.drawable.ic_chevron_right), + painter = painterResource(UiRes.drawable.ic_chevron_right), contentDescription = null, tint = CodeTheme.colors.textSecondary, ) diff --git a/apps/flipcash/shared/common-ui/src/androidMain/kotlin/com/flipcash/shared/common/ui/profile/ProfileStatsCard.kt b/apps/flipcash/shared/common-ui/src/commonMain/kotlin/com/flipcash/shared/common/ui/profile/ProfileStatsCard.kt similarity index 85% rename from apps/flipcash/shared/common-ui/src/androidMain/kotlin/com/flipcash/shared/common/ui/profile/ProfileStatsCard.kt rename to apps/flipcash/shared/common-ui/src/commonMain/kotlin/com/flipcash/shared/common/ui/profile/ProfileStatsCard.kt index 1b3accfba7..53f2374790 100644 --- a/apps/flipcash/shared/common-ui/src/androidMain/kotlin/com/flipcash/shared/common/ui/profile/ProfileStatsCard.kt +++ b/apps/flipcash/shared/common-ui/src/commonMain/kotlin/com/flipcash/shared/common/ui/profile/ProfileStatsCard.kt @@ -15,14 +15,17 @@ import androidx.compose.runtime.Composable import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.draw.clip -import androidx.compose.ui.res.stringResource +import org.jetbrains.compose.resources.stringResource import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.tooling.preview.PreviewWrapper import androidx.compose.ui.unit.dp import com.flipcash.app.theme.FlipcashThemeWrapper -import com.flipcash.shared.common.ui.R import com.getcode.theme.CodeTheme import com.getcode.theme.White05 +import com.flipcash.shared.common.ui.resources.Res +import com.flipcash.shared.common.ui.resources.text_profileStatEmpty +import com.flipcash.shared.common.ui.resources.title_profileDateJoined +import com.flipcash.shared.common.ui.resources.title_profileMinimumToChat private val StatsCardHeight = 84.dp private val LeadingStatWidth = 176.dp @@ -49,7 +52,7 @@ fun ProfileStatsCard( ) { Stat( modifier = Modifier.width(LeadingStatWidth).fillMaxHeight(), - caption = stringResource(R.string.title_profileMinimumToChat), + caption = stringResource(Res.string.title_profileMinimumToChat), value = minimumToChat, ) Box( @@ -60,7 +63,7 @@ fun ProfileStatsCard( ) Stat( modifier = Modifier.weight(1f).fillMaxHeight(), - caption = stringResource(R.string.title_profileDateJoined), + caption = stringResource(Res.string.title_profileDateJoined), value = joined, ) } @@ -84,7 +87,7 @@ private fun Stat( color = CodeTheme.colors.textSecondary, ) Text( - text = value ?: stringResource(R.string.text_profileStatEmpty), + text = value ?: stringResource(Res.string.text_profileStatEmpty), style = CodeTheme.typography.textLarge, color = CodeTheme.colors.textMain, ) diff --git a/ui/components/build.gradle.kts b/ui/components/build.gradle.kts index d578f47feb..8b0494ea60 100644 --- a/ui/components/build.gradle.kts +++ b/ui/components/build.gradle.kts @@ -1,6 +1,9 @@ +import com.getcode.buildlogic.resources.androidResAsComposeResources + plugins { alias(libs.plugins.flipcash.kmp.app.library) alias(libs.plugins.compose.compiler) + alias(libs.plugins.jetbrains.compose) id("org.jetbrains.kotlin.plugin.parcelize") } @@ -19,6 +22,7 @@ kotlin { implementation(libs.jetbrains.compose.material) api(libs.jetbrains.compose.material3) implementation(libs.jetbrains.compose.components.resources) + implementation(libs.jetbrains.compose.material.icons.extended) api(libs.jetbrains.compose.ui.tooling.preview) // api: TopScrollEdge and the app bar take a HazeState, so callers need the type. api(libs.bundles.haze) @@ -59,3 +63,12 @@ kotlin { } } + +compose.resources { + publicResClass = true + packageOfResClass = "${Gradle.codeNamespace}.ui.components.resources" + customDirectory( + sourceSetName = "commonMain", + directoryProvider = androidResAsComposeResources(), + ) +} diff --git a/ui/components/src/androidHostTest/kotlin/com/getcode/ui/components/ComposeResourcesOnAndroidTest.kt b/ui/components/src/androidHostTest/kotlin/com/getcode/ui/components/ComposeResourcesOnAndroidTest.kt new file mode 100644 index 0000000000..42b58770f0 --- /dev/null +++ b/ui/components/src/androidHostTest/kotlin/com/getcode/ui/components/ComposeResourcesOnAndroidTest.kt @@ -0,0 +1,46 @@ +package com.getcode.ui.components + +import androidx.compose.foundation.Image +import androidx.compose.ui.Modifier +import androidx.compose.ui.platform.testTag +import androidx.compose.ui.test.assertIsDisplayed +import androidx.compose.ui.test.junit4.createComposeRule +import androidx.compose.ui.test.onNodeWithTag +import androidx.compose.ui.test.onNodeWithText +import com.getcode.theme.DesignSystem +import com.getcode.util.resources.Res +import com.getcode.util.resources.ic_chevron_right +import org.jetbrains.compose.resources.painterResource +import org.junit.Rule +import org.junit.Test +import org.junit.runner.RunWith +import org.robolectric.RobolectricTestRunner + +/** + * Common code reads strings and drawables through Compose resources, where Android used to read `R`. + * These check the Android build packages them and resolves them at runtime, not only that it compiles. + */ +@RunWith(RobolectricTestRunner::class) +class ComposeResourcesOnAndroidTest { + + @get:Rule + val composeTestRule = createComposeRule() + + @Test + fun `string from this module resolves`() { + composeTestRule.setContent { DesignSystem { BetaIndicator() } } + composeTestRule.onNodeWithText("Beta").assertIsDisplayed() + } + + @Test + fun `vector drawable from ui resources resolves`() { + composeTestRule.setContent { + Image( + painter = painterResource(Res.drawable.ic_chevron_right), + contentDescription = null, + modifier = Modifier.testTag("chevron"), + ) + } + composeTestRule.onNodeWithTag("chevron").assertIsDisplayed() + } +} diff --git a/ui/components/src/androidMain/kotlin/com/getcode/ui/components/BetaIndicator.kt b/ui/components/src/commonMain/kotlin/com/getcode/ui/components/BetaIndicator.kt similarity index 84% rename from ui/components/src/androidMain/kotlin/com/getcode/ui/components/BetaIndicator.kt rename to ui/components/src/commonMain/kotlin/com/getcode/ui/components/BetaIndicator.kt index 07f15b19fe..48492d1bdd 100644 --- a/ui/components/src/androidMain/kotlin/com/getcode/ui/components/BetaIndicator.kt +++ b/ui/components/src/commonMain/kotlin/com/getcode/ui/components/BetaIndicator.kt @@ -10,8 +10,10 @@ import androidx.compose.material3.Text import androidx.compose.runtime.Composable import androidx.compose.ui.Alignment.Companion.CenterVertically import androidx.compose.ui.Modifier -import androidx.compose.ui.res.stringResource +import org.jetbrains.compose.resources.stringResource import com.getcode.theme.CodeTheme +import com.getcode.ui.components.resources.Res +import com.getcode.ui.components.resources.subtitle_beta @Composable fun BetaIndicator(modifier: Modifier = Modifier) { @@ -30,7 +32,7 @@ fun BetaIndicator(modifier: Modifier = Modifier) { ) Text( - text = stringResource(R.string.subtitle_beta), + text = stringResource(Res.string.subtitle_beta), style = CodeTheme.typography.textSmall, color = CodeTheme.colors.textSecondary ) diff --git a/ui/components/src/androidMain/kotlin/com/getcode/ui/components/ListItem.kt b/ui/components/src/commonMain/kotlin/com/getcode/ui/components/ListItem.kt similarity index 96% rename from ui/components/src/androidMain/kotlin/com/getcode/ui/components/ListItem.kt rename to ui/components/src/commonMain/kotlin/com/getcode/ui/components/ListItem.kt index d109b9caa3..22ac260a22 100644 --- a/ui/components/src/androidMain/kotlin/com/getcode/ui/components/ListItem.kt +++ b/ui/components/src/commonMain/kotlin/com/getcode/ui/components/ListItem.kt @@ -21,13 +21,15 @@ import androidx.compose.ui.Alignment.Companion.CenterVertically import androidx.compose.ui.Modifier import androidx.compose.ui.graphics.ColorFilter import androidx.compose.ui.graphics.painter.Painter -import androidx.compose.ui.res.painterResource +import org.jetbrains.compose.resources.painterResource import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.sp import com.getcode.theme.CodeTheme import com.getcode.theme.White20 import com.getcode.ui.theme.CodeToggleSwitch import androidx.compose.foundation.clickable +import com.getcode.util.resources.Res +import com.getcode.util.resources.ic_chevron_right private val ListItemIconSize = 24.dp @@ -152,7 +154,7 @@ object ListItemDefaults { @Composable fun Chevron() { Icon( - painter = painterResource(id = R.drawable.ic_chevron_right), + painter = painterResource(Res.drawable.ic_chevron_right), contentDescription = null, tint = White20, ) diff --git a/ui/components/src/androidMain/kotlin/com/getcode/ui/components/SwipeActionRow.kt b/ui/components/src/commonMain/kotlin/com/getcode/ui/components/SwipeActionRow.kt similarity index 98% rename from ui/components/src/androidMain/kotlin/com/getcode/ui/components/SwipeActionRow.kt rename to ui/components/src/commonMain/kotlin/com/getcode/ui/components/SwipeActionRow.kt index 7ff1638336..4a1ac308b1 100644 --- a/ui/components/src/androidMain/kotlin/com/getcode/ui/components/SwipeActionRow.kt +++ b/ui/components/src/commonMain/kotlin/com/getcode/ui/components/SwipeActionRow.kt @@ -43,7 +43,7 @@ import androidx.compose.ui.graphics.Color import androidx.compose.ui.layout.Layout import androidx.compose.ui.layout.onSizeChanged import androidx.compose.ui.platform.LocalDensity -import androidx.compose.ui.res.painterResource +import org.jetbrains.compose.resources.painterResource import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.Constraints import androidx.compose.ui.unit.IntOffset @@ -51,9 +51,10 @@ import com.getcode.theme.CodeTheme import com.getcode.theme.DesignSystem import com.getcode.theme.White50 import androidx.compose.foundation.clickable -import com.getcode.util.resources.R import kotlin.math.abs import kotlinx.coroutines.launch +import com.getcode.util.resources.Res +import com.getcode.util.resources.ic_delete /** * Describes a single action revealed behind the row content on swipe. @@ -111,7 +112,7 @@ fun SwipeActionRow( resetOnDismiss = resetOnDismiss, ) { Icon( - painter = painterResource(R.drawable.ic_delete), + painter = painterResource(Res.drawable.ic_delete), contentDescription = null, tint = Color.White, modifier = Modifier.requiredSize(iconSize), diff --git a/ui/components/src/androidMain/kotlin/com/getcode/ui/components/text/ExpandableText.kt b/ui/components/src/commonMain/kotlin/com/getcode/ui/components/text/ExpandableText.kt similarity index 93% rename from ui/components/src/androidMain/kotlin/com/getcode/ui/components/text/ExpandableText.kt rename to ui/components/src/commonMain/kotlin/com/getcode/ui/components/text/ExpandableText.kt index 7ffc154c5f..846d942efb 100644 --- a/ui/components/src/androidMain/kotlin/com/getcode/ui/components/text/ExpandableText.kt +++ b/ui/components/src/commonMain/kotlin/com/getcode/ui/components/text/ExpandableText.kt @@ -24,14 +24,16 @@ import androidx.compose.runtime.setValue import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.graphics.Color -import androidx.compose.ui.res.stringResource +import org.jetbrains.compose.resources.stringResource import androidx.compose.ui.text.TextStyle import androidx.compose.ui.text.style.TextOverflow import androidx.compose.ui.unit.dp import com.getcode.theme.CodeTheme -import com.getcode.ui.components.R import com.getcode.ui.core.debugBounds import com.getcode.ui.core.drawWithGradient +import com.getcode.ui.components.resources.Res +import com.getcode.ui.components.resources.action_showLess +import com.getcode.ui.components.resources.action_showMore @Composable fun ExpandableText( @@ -132,7 +134,7 @@ private fun ExpandVisibilityButton( horizontalArrangement = Arrangement.spacedBy(CodeTheme.dimens.grid.x1) ) { Text( - text = if (isExpanded) stringResource(R.string.action_showLess) else stringResource(R.string.action_showMore), + text = if (isExpanded) stringResource(Res.string.action_showLess) else stringResource(Res.string.action_showMore), style = CodeTheme.typography.textMedium, color = CodeTheme.colors.textMain, ) From 597c4125d1f8202340aaf6fee695bde3b705097e Mon Sep 17 00:00:00 2001 From: Brandon McAnsh Date: Sat, 24 Oct 2026 16:30:49 -0400 Subject: [PATCH 3/3] refactor(resources): read the Int-id lookups through Compose resources Common code read strings and icons through stringRes/painterForResId and per-module id objects (CoreStrings, CoreDrawables, TxStrings, FlagStrings), each an expect object with R on Android and Compose ids on jvm. Call sites now use Res.string.x / Res.drawable.x directly and the id objects are gone. - ResourceHelper gains getString(StringResource, args). The transaction mappers build text outside composition, so Android maps the resource key back to R and jvm calls getString. ResourceHelperStringResourceTest checks the Android path finds the real string. - shared:userflags gets Compose resources; Field.label/hint are StringResource, and the Android-only editor reads them with stringResource. - Currency flags are still looked up by name at runtime on jvm, so ComposeResourceIds stays for the name-keyed ResourceHelper. --- apps/flipcash/core-ui/build.gradle.kts | 1 + .../app/core/ui/CurrencyAppreciationLabel.kt | 16 +++-- .../app/core/ui/onboarding/NewUserTutorial.kt | 29 +++++--- .../core/resources/CoreResources.android.kt | 33 --------- .../app/core/resources/CoreResources.kt | 36 ---------- .../app/core/resources/CoreResources.jvm.kt | 55 --------------- .../balance/internal/WalletScreenContent.kt | 34 ++++++---- .../features/userflags/build.gradle.kts | 1 + .../app/userflags/internal/UserFlagsEditor.kt | 2 +- .../internal/components/EditableRow.kt | 2 +- .../internal/components/EditorSheetContent.kt | 2 +- .../userflags/internal/components/Editors.kt | 2 +- .../ResourceHelperStringResourceTest.kt | 25 +++++++ .../TransactionDetailsMapperTest.kt | 7 +- .../TransactionItemMapperTest.kt | 13 ++-- .../TransactionDetailsContent.kt | 7 +- .../resources/TxResources.android.kt | 34 ---------- .../transactionhistory/ActivityFeedRow.kt | 12 ++-- .../RecentActivitySection.kt | 14 ++-- .../transactionhistory/TransactionDetails.kt | 67 ++++++++++++------- .../TransactionSubtitles.kt | 14 ++-- .../internal/TransactionItemMapper.kt | 14 ++-- .../resources/TxResources.kt | 37 ---------- .../resources/TxResources.jvm.kt | 62 ----------------- .../shared/userflags/build.gradle.kts | 12 ++++ .../app/userflags/FlagStrings.android.kt | 26 ------- .../com/flipcash/app/userflags/Field.kt | 67 ++++++++++++------- .../com/flipcash/app/userflags/FlagStrings.kt | 28 -------- .../flipcash/app/userflags/FlagStrings.jvm.kt | 24 ------- .../util/resources/AndroidResources.kt | 8 +++ .../util/resources/StringRes.android.kt | 15 ----- .../getcode/util/resources/ResourceHelper.kt | 6 ++ .../com/getcode/util/resources/StringRes.kt | 18 ----- .../util/resources/ComposeResourceHelper.kt | 4 ++ .../getcode/util/resources/StringRes.jvm.kt | 16 ----- .../util/resources/FakeResourceHelper.kt | 11 +++ 36 files changed, 259 insertions(+), 495 deletions(-) delete mode 100644 apps/flipcash/core/src/androidMain/kotlin/com/flipcash/app/core/resources/CoreResources.android.kt delete mode 100644 apps/flipcash/core/src/commonMain/kotlin/com/flipcash/app/core/resources/CoreResources.kt delete mode 100644 apps/flipcash/core/src/jvmMain/kotlin/com/flipcash/app/core/resources/CoreResources.jvm.kt create mode 100644 apps/flipcash/shared/transaction-history/src/androidHostTest/kotlin/com/flipcash/shared/transactionhistory/ResourceHelperStringResourceTest.kt delete mode 100644 apps/flipcash/shared/transaction-history/src/androidMain/kotlin/com/flipcash/shared/transactionhistory/resources/TxResources.android.kt delete mode 100644 apps/flipcash/shared/transaction-history/src/commonMain/kotlin/com/flipcash/shared/transactionhistory/resources/TxResources.kt delete mode 100644 apps/flipcash/shared/transaction-history/src/jvmMain/kotlin/com/flipcash/shared/transactionhistory/resources/TxResources.jvm.kt delete mode 100644 apps/flipcash/shared/userflags/src/androidMain/kotlin/com/flipcash/app/userflags/FlagStrings.android.kt delete mode 100644 apps/flipcash/shared/userflags/src/commonMain/kotlin/com/flipcash/app/userflags/FlagStrings.kt delete mode 100644 apps/flipcash/shared/userflags/src/jvmMain/kotlin/com/flipcash/app/userflags/FlagStrings.jvm.kt delete mode 100644 ui/resources/src/androidMain/kotlin/com/getcode/util/resources/StringRes.android.kt delete mode 100644 ui/resources/src/commonMain/kotlin/com/getcode/util/resources/StringRes.kt delete mode 100644 ui/resources/src/jvmMain/kotlin/com/getcode/util/resources/StringRes.jvm.kt diff --git a/apps/flipcash/core-ui/build.gradle.kts b/apps/flipcash/core-ui/build.gradle.kts index 28e7f1a441..d177e08c90 100644 --- a/apps/flipcash/core-ui/build.gradle.kts +++ b/apps/flipcash/core-ui/build.gradle.kts @@ -28,6 +28,7 @@ kotlin { implementation(libs.jetbrains.compose.runtime) implementation(libs.jetbrains.compose.foundation) implementation(libs.jetbrains.compose.ui) + implementation(libs.jetbrains.compose.components.resources) implementation(libs.jetbrains.compose.material) implementation(libs.jetbrains.compose.material3) implementation(libs.jetbrains.compose.material.icons.extended) diff --git a/apps/flipcash/core-ui/src/commonMain/kotlin/com/flipcash/app/core/ui/CurrencyAppreciationLabel.kt b/apps/flipcash/core-ui/src/commonMain/kotlin/com/flipcash/app/core/ui/CurrencyAppreciationLabel.kt index bc05434934..3a420dd8d8 100644 --- a/apps/flipcash/core-ui/src/commonMain/kotlin/com/flipcash/app/core/ui/CurrencyAppreciationLabel.kt +++ b/apps/flipcash/core-ui/src/commonMain/kotlin/com/flipcash/app/core/ui/CurrencyAppreciationLabel.kt @@ -1,5 +1,11 @@ package com.flipcash.app.core.ui +import org.jetbrains.compose.resources.stringResource +import com.flipcash.core.resources.Res +import com.flipcash.core.resources.label_fromAppreciation +import com.flipcash.core.resources.label_fromCurrencyAppreciation +import com.flipcash.core.resources.label_fromCurrencyDepreciation +import com.flipcash.core.resources.label_fromDepreciation import androidx.compose.foundation.background import androidx.compose.foundation.border import androidx.compose.foundation.layout.Arrangement @@ -12,13 +18,11 @@ import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.unit.dp import com.flipcash.app.core.money.formattedAppreciation -import com.flipcash.app.core.resources.CoreStrings import com.getcode.opencode.model.financial.Fiat import com.getcode.theme.CodeTheme import com.getcode.theme.White20 import com.getcode.theme.extraSmall import com.getcode.ui.components.text.AnimatedNumberText -import com.getcode.util.resources.stringRes /** Controls the visual treatment of the appreciation badge. */ enum class AppreciationStyle { @@ -88,15 +92,15 @@ fun CurrencyAppreciationLabel( val label = when (style) { AppreciationStyle.Pill -> if (hasAppreciation) { - stringRes(CoreStrings.label_fromAppreciation) + stringResource(Res.string.label_fromAppreciation) } else { - stringRes(CoreStrings.label_fromDepreciation) + stringResource(Res.string.label_fromDepreciation) } AppreciationStyle.Classic -> if (hasAppreciation) { - stringRes(CoreStrings.label_fromCurrencyAppreciation) + stringResource(Res.string.label_fromCurrencyAppreciation) } else { - stringRes(CoreStrings.label_fromCurrencyDepreciation) + stringResource(Res.string.label_fromCurrencyDepreciation) } } Text( diff --git a/apps/flipcash/core-ui/src/commonMain/kotlin/com/flipcash/app/core/ui/onboarding/NewUserTutorial.kt b/apps/flipcash/core-ui/src/commonMain/kotlin/com/flipcash/app/core/ui/onboarding/NewUserTutorial.kt index cb1a56b6c8..2a78b1eda6 100644 --- a/apps/flipcash/core-ui/src/commonMain/kotlin/com/flipcash/app/core/ui/onboarding/NewUserTutorial.kt +++ b/apps/flipcash/core-ui/src/commonMain/kotlin/com/flipcash/app/core/ui/onboarding/NewUserTutorial.kt @@ -1,5 +1,16 @@ package com.flipcash.app.core.ui.onboarding +import org.jetbrains.compose.resources.stringResource +import org.jetbrains.compose.resources.painterResource +import com.flipcash.core.resources.Res +import com.flipcash.core.resources.ic_checked_green +import com.getcode.util.resources.ic_chevron_right +import com.getcode.util.resources.Res as UiRes +import com.flipcash.core.resources.ic_nav_tipcard +import com.flipcash.core.resources.subtitle_addMoney +import com.flipcash.core.resources.subtitle_scanTipCard +import com.flipcash.core.resources.title_addMoney +import com.flipcash.core.resources.title_scanTipCard import androidx.compose.foundation.Image import androidx.compose.foundation.background import androidx.compose.foundation.clickable @@ -26,12 +37,8 @@ import androidx.compose.ui.graphics.vector.rememberVectorPainter import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.sp import androidx.compose.ui.util.fastForEach -import com.flipcash.app.core.resources.CoreDrawables -import com.flipcash.app.core.resources.CoreStrings import com.getcode.theme.CodeTheme import com.getcode.theme.extraSmall -import com.getcode.util.resources.painterForResId -import com.getcode.util.resources.stringRes /** * A row in a "what's left to do" checklist. @@ -53,20 +60,20 @@ sealed interface TutorialItem { class AddMoney(override val isCompleted: Boolean) : Wallet { override val title: String - @Composable get() = stringRes(CoreStrings.title_addMoney) + @Composable get() = stringResource(Res.string.title_addMoney) override val description: String - @Composable get() = stringRes(CoreStrings.subtitle_addMoney) + @Composable get() = stringResource(Res.string.subtitle_addMoney) override val icon: Painter @Composable get() = rememberVectorPainter(Icons.Outlined.AddCircleOutline) } class ScanTipCard(override val isCompleted: Boolean) : Wallet { override val title: String - @Composable get() = stringRes(CoreStrings.title_scanTipCard) + @Composable get() = stringResource(Res.string.title_scanTipCard) override val description: String - @Composable get() = stringRes(CoreStrings.subtitle_scanTipCard) + @Composable get() = stringResource(Res.string.subtitle_scanTipCard) override val icon: Painter - @Composable get() = painterForResId(CoreDrawables.ic_nav_tipcard) + @Composable get() = painterResource(Res.drawable.ic_nav_tipcard) } } @@ -137,7 +144,7 @@ private fun OnboardingItemRow( Image( modifier = Modifier.align(Alignment.Top).size(24.dp), painter = if (item.isCompleted) { - painterForResId(CoreDrawables.ic_checked_green) + painterResource(Res.drawable.ic_checked_green) } else { item.icon }, @@ -162,7 +169,7 @@ private fun OnboardingItemRow( } Icon( modifier = Modifier.align(Alignment.CenterVertically).size(16.dp), - painter = painterForResId(CoreDrawables.ic_chevron_right), + painter = painterResource(UiRes.drawable.ic_chevron_right), tint = CodeTheme.colors.textSecondary, contentDescription = null ) diff --git a/apps/flipcash/core/src/androidMain/kotlin/com/flipcash/app/core/resources/CoreResources.android.kt b/apps/flipcash/core/src/androidMain/kotlin/com/flipcash/app/core/resources/CoreResources.android.kt deleted file mode 100644 index fd2dd31111..0000000000 --- a/apps/flipcash/core/src/androidMain/kotlin/com/flipcash/app/core/resources/CoreResources.android.kt +++ /dev/null @@ -1,33 +0,0 @@ -package com.flipcash.app.core.resources - -import com.flipcash.core.R - -@Suppress("PropertyName") -actual object CoreStrings { - actual val title_addMoney: Int = R.string.title_addMoney - actual val subtitle_addMoney: Int = R.string.subtitle_addMoney - actual val title_scanTipCard: Int = R.string.title_scanTipCard - actual val subtitle_scanTipCard: Int = R.string.subtitle_scanTipCard - actual val label_fromAppreciation: Int = R.string.label_fromAppreciation - actual val label_fromDepreciation: Int = R.string.label_fromDepreciation - actual val label_fromCurrencyAppreciation: Int = R.string.label_fromCurrencyAppreciation - actual val label_fromCurrencyDepreciation: Int = R.string.label_fromCurrencyDepreciation - actual val title_recentActivity: Int = R.string.title_recentActivity - actual val label_chatReceipt_yesterday: Int = R.string.label_chatReceipt_yesterday - actual val title_tipOnboarding: Int = R.string.title_tipOnboarding - actual val action_createYourOwnCurrency: Int = R.string.action_createYourOwnCurrency - actual val action_currencyLeaderboard: Int = R.string.action_currencyLeaderboard - actual val action_addDollars: Int = R.string.action_addDollars - actual val action_withdrawDollars: Int = R.string.action_withdrawDollars -} - -@Suppress("PropertyName") -actual object CoreDrawables { - actual val ic_nav_tipcard: Int = R.drawable.ic_nav_tipcard - actual val ic_checked_green: Int = R.drawable.ic_checked_green - actual val ic_chevron_right: Int = R.drawable.ic_chevron_right - actual val ic_coins_add: Int = R.drawable.ic_coins_add - actual val ic_globe: Int = R.drawable.ic_globe - actual val ic_menu_deposit: Int = R.drawable.ic_menu_deposit - actual val ic_menu_withdraw: Int = R.drawable.ic_menu_withdraw -} diff --git a/apps/flipcash/core/src/commonMain/kotlin/com/flipcash/app/core/resources/CoreResources.kt b/apps/flipcash/core/src/commonMain/kotlin/com/flipcash/app/core/resources/CoreResources.kt deleted file mode 100644 index 28e1615421..0000000000 --- a/apps/flipcash/core/src/commonMain/kotlin/com/flipcash/app/core/resources/CoreResources.kt +++ /dev/null @@ -1,36 +0,0 @@ -package com.flipcash.app.core.resources - -/** - * `Int` IDs for the `app:core` resources that common UI hands to [com.getcode.util.resources.stringRes] - * and [com.getcode.util.resources.painterForResId]. Android returns the `R` IDs; desktop registers the - * generated Compose resources. - */ -@Suppress("PropertyName") -expect object CoreStrings { - val title_addMoney: Int - val subtitle_addMoney: Int - val title_scanTipCard: Int - val subtitle_scanTipCard: Int - val label_fromAppreciation: Int - val label_fromDepreciation: Int - val label_fromCurrencyAppreciation: Int - val label_fromCurrencyDepreciation: Int - val title_recentActivity: Int - val label_chatReceipt_yesterday: Int - val title_tipOnboarding: Int - val action_createYourOwnCurrency: Int - val action_currencyLeaderboard: Int - val action_addDollars: Int - val action_withdrawDollars: Int -} - -@Suppress("PropertyName") -expect object CoreDrawables { - val ic_nav_tipcard: Int - val ic_checked_green: Int - val ic_chevron_right: Int - val ic_coins_add: Int - val ic_globe: Int - val ic_menu_deposit: Int - val ic_menu_withdraw: Int -} diff --git a/apps/flipcash/core/src/jvmMain/kotlin/com/flipcash/app/core/resources/CoreResources.jvm.kt b/apps/flipcash/core/src/jvmMain/kotlin/com/flipcash/app/core/resources/CoreResources.jvm.kt deleted file mode 100644 index 92b968fcf4..0000000000 --- a/apps/flipcash/core/src/jvmMain/kotlin/com/flipcash/app/core/resources/CoreResources.jvm.kt +++ /dev/null @@ -1,55 +0,0 @@ -package com.flipcash.app.core.resources - -import com.flipcash.core.resources.Res -import com.flipcash.core.resources.ic_checked_green -import com.flipcash.core.resources.ic_nav_tipcard -import com.flipcash.core.resources.label_fromAppreciation -import com.flipcash.core.resources.label_fromCurrencyAppreciation -import com.flipcash.core.resources.label_fromCurrencyDepreciation -import com.flipcash.core.resources.label_fromDepreciation -import com.flipcash.core.resources.subtitle_addMoney -import com.flipcash.core.resources.subtitle_scanTipCard -import com.flipcash.core.resources.title_addMoney -import com.flipcash.core.resources.title_scanTipCard -import com.flipcash.core.resources.title_recentActivity -import com.flipcash.core.resources.label_chatReceipt_yesterday -import com.flipcash.core.resources.title_tipOnboarding -import com.flipcash.core.resources.action_createYourOwnCurrency -import com.flipcash.core.resources.action_currencyLeaderboard -import com.flipcash.core.resources.action_addDollars -import com.flipcash.core.resources.action_withdrawDollars -import com.flipcash.core.resources.ic_coins_add -import com.flipcash.core.resources.ic_globe -import com.flipcash.core.resources.ic_menu_deposit -import com.flipcash.core.resources.ic_menu_withdraw -import com.getcode.util.resources.ComposeResourceIds - -@Suppress("PropertyName") -actual object CoreStrings { - actual val title_addMoney: Int = ComposeResourceIds.register(Res.string.title_addMoney) - actual val subtitle_addMoney: Int = ComposeResourceIds.register(Res.string.subtitle_addMoney) - actual val title_scanTipCard: Int = ComposeResourceIds.register(Res.string.title_scanTipCard) - actual val subtitle_scanTipCard: Int = ComposeResourceIds.register(Res.string.subtitle_scanTipCard) - actual val label_fromAppreciation: Int = ComposeResourceIds.register(Res.string.label_fromAppreciation) - actual val label_fromDepreciation: Int = ComposeResourceIds.register(Res.string.label_fromDepreciation) - actual val label_fromCurrencyAppreciation: Int = ComposeResourceIds.register(Res.string.label_fromCurrencyAppreciation) - actual val label_fromCurrencyDepreciation: Int = ComposeResourceIds.register(Res.string.label_fromCurrencyDepreciation) - actual val title_recentActivity: Int = ComposeResourceIds.register(Res.string.title_recentActivity) - actual val label_chatReceipt_yesterday: Int = ComposeResourceIds.register(Res.string.label_chatReceipt_yesterday) - actual val title_tipOnboarding: Int = ComposeResourceIds.register(Res.string.title_tipOnboarding) - actual val action_createYourOwnCurrency: Int = ComposeResourceIds.register(Res.string.action_createYourOwnCurrency) - actual val action_currencyLeaderboard: Int = ComposeResourceIds.register(Res.string.action_currencyLeaderboard) - actual val action_addDollars: Int = ComposeResourceIds.register(Res.string.action_addDollars) - actual val action_withdrawDollars: Int = ComposeResourceIds.register(Res.string.action_withdrawDollars) -} - -@Suppress("PropertyName") -actual object CoreDrawables { - actual val ic_nav_tipcard: Int = ComposeResourceIds.register(Res.drawable.ic_nav_tipcard) - actual val ic_checked_green: Int = ComposeResourceIds.register(Res.drawable.ic_checked_green) - actual val ic_chevron_right: Int = checkNotNull(ComposeResourceIds.drawableId("ic_chevron_right")) - actual val ic_coins_add: Int = ComposeResourceIds.register(Res.drawable.ic_coins_add) - actual val ic_globe: Int = ComposeResourceIds.register(Res.drawable.ic_globe) - actual val ic_menu_deposit: Int = ComposeResourceIds.register(Res.drawable.ic_menu_deposit) - actual val ic_menu_withdraw: Int = ComposeResourceIds.register(Res.drawable.ic_menu_withdraw) -} diff --git a/apps/flipcash/features/balance/src/commonMain/kotlin/com/flipcash/app/balance/internal/WalletScreenContent.kt b/apps/flipcash/features/balance/src/commonMain/kotlin/com/flipcash/app/balance/internal/WalletScreenContent.kt index 0980c6a663..ffbeaf8506 100644 --- a/apps/flipcash/features/balance/src/commonMain/kotlin/com/flipcash/app/balance/internal/WalletScreenContent.kt +++ b/apps/flipcash/features/balance/src/commonMain/kotlin/com/flipcash/app/balance/internal/WalletScreenContent.kt @@ -1,5 +1,17 @@ package com.flipcash.app.balance.internal +import org.jetbrains.compose.resources.stringResource +import org.jetbrains.compose.resources.painterResource +import com.flipcash.core.resources.Res +import com.flipcash.core.resources.action_addDollars +import com.flipcash.core.resources.action_createYourOwnCurrency +import com.flipcash.core.resources.action_currencyLeaderboard +import com.flipcash.core.resources.action_withdrawDollars +import com.flipcash.core.resources.ic_coins_add +import com.flipcash.core.resources.ic_globe +import com.flipcash.core.resources.ic_menu_deposit +import com.flipcash.core.resources.ic_menu_withdraw +import com.flipcash.core.resources.title_tipOnboarding import androidx.compose.foundation.clickable import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.Box @@ -52,10 +64,6 @@ import com.flipcash.app.core.navigation.LocalTabBarPadding import com.flipcash.app.core.ui.TileButton import com.flipcash.app.core.ui.TileButtonStyle import com.flipcash.app.tokens.ui.SelectTokenViewModel -import com.flipcash.app.core.resources.CoreDrawables -import com.flipcash.app.core.resources.CoreStrings -import com.getcode.util.resources.painterForResId -import com.getcode.util.resources.stringRes import com.flipcash.shared.transactionhistory.recentActivitySection import com.getcode.theme.CodeTheme import com.getcode.ui.theme.CodeCircularProgressIndicator @@ -213,7 +221,7 @@ internal fun WalletScreenContent( NewUserTutorial( modifier = Modifier.fillMaxWidth() .padding(bottom = CodeTheme.dimens.grid.x5), - title = stringRes(CoreStrings.title_tipOnboarding), + title = stringResource(Res.string.title_tipOnboarding), items = items, ) { item -> when (item) { @@ -322,8 +330,8 @@ internal fun WalletScreenContent( .weight(1f) .aspectRatio(1.45f), style = TileButtonStyle.Spread, - text = stringRes(CoreStrings.action_createYourOwnCurrency), - icon = painterForResId(CoreDrawables.ic_coins_add), + text = stringResource(Res.string.action_createYourOwnCurrency), + icon = painterResource(Res.drawable.ic_coins_add), ) { dispatchEvent(WalletViewModel.Event.OpenScreen(AppRoute.Token.CurrencyCreator)) } @@ -333,8 +341,8 @@ internal fun WalletScreenContent( .weight(1f) .aspectRatio(1.45f), style = TileButtonStyle.Spread, - text = stringRes(CoreStrings.action_currencyLeaderboard), - icon = painterForResId(CoreDrawables.ic_globe), + text = stringResource(Res.string.action_currencyLeaderboard), + icon = painterResource(Res.drawable.ic_globe), ) { dispatchEvent(WalletViewModel.Event.OpenScreen(AppRoute.Token.Discovery)) } @@ -351,8 +359,8 @@ internal fun WalletScreenContent( .weight(1f) .aspectRatio(1.45f), style = TileButtonStyle.Spread, - text = stringRes(CoreStrings.action_addDollars), - icon = painterForResId(CoreDrawables.ic_menu_deposit), + text = stringResource(Res.string.action_addDollars), + icon = painterResource(Res.drawable.ic_menu_deposit), ) { dispatchEvent(WalletViewModel.Event.PresentDepositOptions) } @@ -362,8 +370,8 @@ internal fun WalletScreenContent( .weight(1f) .aspectRatio(1.45f), style = TileButtonStyle.Spread, - text = stringRes(CoreStrings.action_withdrawDollars), - icon = painterForResId(CoreDrawables.ic_menu_withdraw), + text = stringResource(Res.string.action_withdrawDollars), + icon = painterResource(Res.drawable.ic_menu_withdraw), ) { // No preselected mint: the flow opens on the currency picker, which lists // every balance (Dollars included). diff --git a/apps/flipcash/features/userflags/build.gradle.kts b/apps/flipcash/features/userflags/build.gradle.kts index d7b15af12a..6dadce3e46 100644 --- a/apps/flipcash/features/userflags/build.gradle.kts +++ b/apps/flipcash/features/userflags/build.gradle.kts @@ -10,4 +10,5 @@ dependencies { implementation(project(":apps:flipcash:shared:userflags")) implementation(project(":apps:flipcash:shared:region-selection:core")) implementation(project(":libs:messaging")) + implementation(libs.jetbrains.compose.components.resources) } diff --git a/apps/flipcash/features/userflags/src/main/kotlin/com/flipcash/app/userflags/internal/UserFlagsEditor.kt b/apps/flipcash/features/userflags/src/main/kotlin/com/flipcash/app/userflags/internal/UserFlagsEditor.kt index 9cc77a8e41..595aec648b 100644 --- a/apps/flipcash/features/userflags/src/main/kotlin/com/flipcash/app/userflags/internal/UserFlagsEditor.kt +++ b/apps/flipcash/features/userflags/src/main/kotlin/com/flipcash/app/userflags/internal/UserFlagsEditor.kt @@ -95,7 +95,7 @@ private fun UserFlagsEditor( item(contentType = "section_header") { SectionHeader("Overridable") } items( items = state.editableEntries, - key = { it.field.label }, + key = { it.field.label.key }, contentType = { "editable_row" }, ) { entry -> EditableRow( diff --git a/apps/flipcash/features/userflags/src/main/kotlin/com/flipcash/app/userflags/internal/components/EditableRow.kt b/apps/flipcash/features/userflags/src/main/kotlin/com/flipcash/app/userflags/internal/components/EditableRow.kt index 82de8a7386..d9eeb01b1b 100644 --- a/apps/flipcash/features/userflags/src/main/kotlin/com/flipcash/app/userflags/internal/components/EditableRow.kt +++ b/apps/flipcash/features/userflags/src/main/kotlin/com/flipcash/app/userflags/internal/components/EditableRow.kt @@ -20,7 +20,7 @@ import androidx.compose.material3.Text import androidx.compose.runtime.Composable import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier -import androidx.compose.ui.res.stringResource +import org.jetbrains.compose.resources.stringResource import androidx.compose.ui.unit.dp import com.flipcash.app.userflags.internal.EditableEntry import com.getcode.theme.CodeTheme diff --git a/apps/flipcash/features/userflags/src/main/kotlin/com/flipcash/app/userflags/internal/components/EditorSheetContent.kt b/apps/flipcash/features/userflags/src/main/kotlin/com/flipcash/app/userflags/internal/components/EditorSheetContent.kt index b26e14916b..748204478a 100644 --- a/apps/flipcash/features/userflags/src/main/kotlin/com/flipcash/app/userflags/internal/components/EditorSheetContent.kt +++ b/apps/flipcash/features/userflags/src/main/kotlin/com/flipcash/app/userflags/internal/components/EditorSheetContent.kt @@ -13,7 +13,7 @@ import androidx.compose.material3.Surface import androidx.compose.material3.Text import androidx.compose.runtime.Composable import androidx.compose.ui.Modifier -import androidx.compose.ui.res.stringResource +import org.jetbrains.compose.resources.stringResource import com.flipcash.app.userflags.FieldEditor import com.flipcash.app.userflags.internal.EditableEntry import com.flipcash.app.userflags.internal.UserFlagsViewModel diff --git a/apps/flipcash/features/userflags/src/main/kotlin/com/flipcash/app/userflags/internal/components/Editors.kt b/apps/flipcash/features/userflags/src/main/kotlin/com/flipcash/app/userflags/internal/components/Editors.kt index 89c1c52a5e..3367a1d3fa 100644 --- a/apps/flipcash/features/userflags/src/main/kotlin/com/flipcash/app/userflags/internal/components/Editors.kt +++ b/apps/flipcash/features/userflags/src/main/kotlin/com/flipcash/app/userflags/internal/components/Editors.kt @@ -19,7 +19,7 @@ import androidx.compose.runtime.remember import androidx.compose.runtime.setValue import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier -import androidx.compose.ui.res.stringResource +import org.jetbrains.compose.resources.stringResource import com.flipcash.app.userflags.FieldEditor import com.flipcash.app.userflags.internal.EditableEntry import com.flipcash.app.userflags.internal.UserFlagsViewModel diff --git a/apps/flipcash/shared/transaction-history/src/androidHostTest/kotlin/com/flipcash/shared/transactionhistory/ResourceHelperStringResourceTest.kt b/apps/flipcash/shared/transaction-history/src/androidHostTest/kotlin/com/flipcash/shared/transactionhistory/ResourceHelperStringResourceTest.kt new file mode 100644 index 0000000000..922511d852 --- /dev/null +++ b/apps/flipcash/shared/transaction-history/src/androidHostTest/kotlin/com/flipcash/shared/transactionhistory/ResourceHelperStringResourceTest.kt @@ -0,0 +1,25 @@ +package com.flipcash.shared.transactionhistory + +import androidx.test.core.app.ApplicationProvider +import com.flipcash.shared.transactionhistory.generated.resources.Res +import com.flipcash.shared.transactionhistory.generated.resources.title_activity_sentTo +import com.getcode.util.resources.AndroidResources +import org.junit.Test +import org.junit.runner.RunWith +import org.robolectric.RobolectricTestRunner +import kotlin.test.assertEquals + +/** + * The transaction mappers build display text outside composition from a Compose [Res] string. On Android + * that goes back to `R` by the resource's key, so this checks the key still finds the real Android string. + */ +@RunWith(RobolectricTestRunner::class) +class ResourceHelperStringResourceTest { + + @Test + fun `compose string resource resolves through Android resources`() { + val resources = AndroidResources(ApplicationProvider.getApplicationContext()) + + assertEquals("Sent to Ann", resources.getString(Res.string.title_activity_sentTo, "Ann")) + } +} diff --git a/apps/flipcash/shared/transaction-history/src/androidHostTest/kotlin/com/flipcash/shared/transactionhistory/TransactionDetailsMapperTest.kt b/apps/flipcash/shared/transaction-history/src/androidHostTest/kotlin/com/flipcash/shared/transactionhistory/TransactionDetailsMapperTest.kt index a0f3b58704..939fd012f4 100644 --- a/apps/flipcash/shared/transaction-history/src/androidHostTest/kotlin/com/flipcash/shared/transactionhistory/TransactionDetailsMapperTest.kt +++ b/apps/flipcash/shared/transaction-history/src/androidHostTest/kotlin/com/flipcash/shared/transactionhistory/TransactionDetailsMapperTest.kt @@ -1,5 +1,8 @@ package com.flipcash.shared.transactionhistory +import com.flipcash.shared.transactionhistory.generated.resources.Res +import com.flipcash.shared.transactionhistory.generated.resources.label_txnDetails_inPerson +import com.flipcash.shared.transactionhistory.generated.resources.title_activity_convert import com.flipcash.app.core.feed.ActivityFeedMessage import com.flipcash.app.core.feed.ActivityFeedMessageWithToken import com.flipcash.app.core.feed.MessageMetadata @@ -39,8 +42,8 @@ import org.junit.Test class TransactionDetailsMapperTest { private val resources = FakeResourceHelper() - .stub(R.string.title_activity_convert, "%1\$s → %2\$s") - .stub(R.string.label_txnDetails_inPerson, "In Person") + .stub(Res.string.title_activity_convert, "%1\$s → %2\$s") + .stub(Res.string.label_txnDetails_inPerson, "In Person") private val mapper = TransactionDetailsMapper(resources) private val knownUserId: ID = listOf(0x0A, 0x0B, 0x0C) diff --git a/apps/flipcash/shared/transaction-history/src/androidHostTest/kotlin/com/flipcash/shared/transactionhistory/TransactionItemMapperTest.kt b/apps/flipcash/shared/transaction-history/src/androidHostTest/kotlin/com/flipcash/shared/transactionhistory/TransactionItemMapperTest.kt index 94ca34ae52..ed776cac70 100644 --- a/apps/flipcash/shared/transaction-history/src/androidHostTest/kotlin/com/flipcash/shared/transactionhistory/TransactionItemMapperTest.kt +++ b/apps/flipcash/shared/transaction-history/src/androidHostTest/kotlin/com/flipcash/shared/transactionhistory/TransactionItemMapperTest.kt @@ -1,5 +1,10 @@ package com.flipcash.shared.transactionhistory +import com.flipcash.shared.transactionhistory.generated.resources.Res +import com.flipcash.shared.transactionhistory.generated.resources.title_activity_convert +import com.flipcash.shared.transactionhistory.generated.resources.title_activity_receivedFrom +import com.flipcash.shared.transactionhistory.generated.resources.title_activity_sentTo +import com.flipcash.shared.transactionhistory.generated.resources.title_activity_tipFrom import com.flipcash.app.core.feed.ActivityFeedMessage import com.flipcash.app.core.feed.ActivityFeedMessageWithToken import com.flipcash.app.core.feed.MessageMetadata @@ -28,10 +33,10 @@ import org.junit.Test class TransactionItemMapperTest { private val resources = FakeResourceHelper() - .stub(R.string.title_activity_tipFrom, "Tip from %1\$s") - .stub(R.string.title_activity_sentTo, "Sent to %1\$s") - .stub(R.string.title_activity_receivedFrom, "Received from %1\$s") - .stub(R.string.title_activity_convert, "%1\$s → %2\$s") + .stub(Res.string.title_activity_tipFrom, "Tip from %1\$s") + .stub(Res.string.title_activity_sentTo, "Sent to %1\$s") + .stub(Res.string.title_activity_receivedFrom, "Received from %1\$s") + .stub(Res.string.title_activity_convert, "%1\$s → %2\$s") private val mapper = TransactionItemMapper(resources) private val knownUserId: ID = listOf(0x0A, 0x0B, 0x0C) diff --git a/apps/flipcash/shared/transaction-history/src/androidMain/kotlin/com/flipcash/shared/transactionhistory/TransactionDetailsContent.kt b/apps/flipcash/shared/transaction-history/src/androidMain/kotlin/com/flipcash/shared/transactionhistory/TransactionDetailsContent.kt index d9e079d448..d41b6ac8db 100644 --- a/apps/flipcash/shared/transaction-history/src/androidMain/kotlin/com/flipcash/shared/transactionhistory/TransactionDetailsContent.kt +++ b/apps/flipcash/shared/transaction-history/src/androidMain/kotlin/com/flipcash/shared/transactionhistory/TransactionDetailsContent.kt @@ -1,5 +1,6 @@ package com.flipcash.shared.transactionhistory +import org.jetbrains.compose.resources.stringResource as composeStringResource import androidx.compose.foundation.background import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.Box @@ -159,7 +160,7 @@ private fun Header( // A person-to-person entry is titled by the person; everything else by what it was. Text( text = details.heading?.takeIf { it.isNotBlank() } - ?: stringResource(details.kind.headingRes), + ?: composeStringResource(details.kind.headingRes), style = CodeTheme.typography.textLarge, color = CodeTheme.colors.textMain, textAlign = TextAlign.Center, @@ -262,7 +263,7 @@ private fun DetailCard(details: TransactionDetails, modifier: Modifier = Modifie details.account?.let { account -> ReceiptLineItem( modifier = Modifier.fillMaxWidth(), - label = stringResource(account.direction.labelRes), + label = composeStringResource(account.direction.labelRes), amount = account.shortAddress, ) } @@ -283,7 +284,7 @@ private fun DetailCard(details: TransactionDetails, modifier: Modifier = Modifie ReceiptLineItem( modifier = Modifier.fillMaxWidth(), label = stringResource(R.string.label_txnDetails_status), - amount = stringResource(details.status.labelRes), + amount = composeStringResource(details.status.labelRes), ) } } diff --git a/apps/flipcash/shared/transaction-history/src/androidMain/kotlin/com/flipcash/shared/transactionhistory/resources/TxResources.android.kt b/apps/flipcash/shared/transaction-history/src/androidMain/kotlin/com/flipcash/shared/transactionhistory/resources/TxResources.android.kt deleted file mode 100644 index 3de9123fd1..0000000000 --- a/apps/flipcash/shared/transaction-history/src/androidMain/kotlin/com/flipcash/shared/transactionhistory/resources/TxResources.android.kt +++ /dev/null @@ -1,34 +0,0 @@ -package com.flipcash.shared.transactionhistory.resources - -import com.flipcash.shared.transactionhistory.R - -@Suppress("PropertyName") -actual object TxStrings { - actual val label_activity_convertFee: Int = R.string.label_activity_convertFee - actual val label_txnDetails_from: Int = R.string.label_txnDetails_from - actual val label_txnDetails_inPerson: Int = R.string.label_txnDetails_inPerson - actual val label_txnDetails_paidWith: Int = R.string.label_txnDetails_paidWith - actual val label_txnDetails_soldFor: Int = R.string.label_txnDetails_soldFor - actual val label_txnDetails_status_completed: Int = R.string.label_txnDetails_status_completed - actual val label_txnDetails_status_failed: Int = R.string.label_txnDetails_status_failed - actual val label_txnDetails_status_pending: Int = R.string.label_txnDetails_status_pending - actual val label_txnDetails_status_unknown: Int = R.string.label_txnDetails_status_unknown - actual val label_txnDetails_to: Int = R.string.label_txnDetails_to - actual val title_activity_convert: Int = R.string.title_activity_convert - actual val title_activity_receivedFrom: Int = R.string.title_activity_receivedFrom - actual val title_activity_sentTo: Int = R.string.title_activity_sentTo - actual val title_activity_tipFrom: Int = R.string.title_activity_tipFrom - actual val title_txnDetails_buy: Int = R.string.title_txnDetails_buy - actual val title_txnDetails_convert: Int = R.string.title_txnDetails_convert - actual val title_txnDetails_deposit: Int = R.string.title_txnDetails_deposit - actual val title_txnDetails_poolPayment: Int = R.string.title_txnDetails_poolPayment - actual val title_txnDetails_sell: Int = R.string.title_txnDetails_sell - actual val title_txnDetails_unknown: Int = R.string.title_txnDetails_unknown - actual val title_txnDetails_withdraw: Int = R.string.title_txnDetails_withdraw - actual val title_txnDetails_youGaveCash: Int = R.string.title_txnDetails_youGaveCash - actual val title_txnDetails_youReceived: Int = R.string.title_txnDetails_youReceived - actual val title_txnDetails_youReceivedCash: Int = R.string.title_txnDetails_youReceivedCash - actual val title_txnDetails_youSent: Int = R.string.title_txnDetails_youSent - actual val title_txnDetails_youSentCashLink: Int = R.string.title_txnDetails_youSentCashLink - actual val title_txnDetails_youTipped: Int = R.string.title_txnDetails_youTipped -} diff --git a/apps/flipcash/shared/transaction-history/src/commonMain/kotlin/com/flipcash/shared/transactionhistory/ActivityFeedRow.kt b/apps/flipcash/shared/transaction-history/src/commonMain/kotlin/com/flipcash/shared/transactionhistory/ActivityFeedRow.kt index 9cc8076280..433ee65bcc 100644 --- a/apps/flipcash/shared/transaction-history/src/commonMain/kotlin/com/flipcash/shared/transactionhistory/ActivityFeedRow.kt +++ b/apps/flipcash/shared/transaction-history/src/commonMain/kotlin/com/flipcash/shared/transactionhistory/ActivityFeedRow.kt @@ -1,7 +1,10 @@ package com.flipcash.shared.transactionhistory -import com.flipcash.shared.transactionhistory.resources.TxStrings -import com.flipcash.app.core.resources.CoreStrings +import org.jetbrains.compose.resources.stringResource +import com.flipcash.core.resources.Res as CoreRes +import com.flipcash.core.resources.label_chatReceipt_yesterday +import com.flipcash.shared.transactionhistory.generated.resources.Res as TxRes +import com.flipcash.shared.transactionhistory.generated.resources.label_activity_convertFee import androidx.compose.foundation.clickable import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.Column @@ -12,7 +15,6 @@ import androidx.compose.material3.Text import androidx.compose.runtime.Composable import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier -import com.getcode.util.resources.stringRes import androidx.compose.ui.text.style.TextOverflow import com.flipcash.app.core.ui.ActivityAmount import com.getcode.theme.CodeTheme @@ -82,7 +84,7 @@ fun ActivityFeedRow( maxLines = 1, ) Text( - text = stringRes(TxStrings.label_activity_convertFee, fee.formatted()), + text = stringResource(TxRes.string.label_activity_convertFee, fee.formatted()), style = CodeTheme.typography.textSmall, color = CodeTheme.colors.textSecondary, maxLines = 1, @@ -114,7 +116,7 @@ internal fun formatActivityTimestamp(instant: Instant): String { val time = instant.formatLocalized("h:mm a", is24Hour = is24Hour, if24Hour = "H:mm") return when { dayDiff == 0L -> time - dayDiff == 1L -> stringRes(CoreStrings.label_chatReceipt_yesterday) + dayDiff == 1L -> stringResource(CoreRes.string.label_chatReceipt_yesterday) dayDiff in 2L..6L -> instant.formatLocalized("EEEE") messageDate.year == todayDate.year -> instant.formatLocalized("MMM d") else -> instant.formatLocalized("MMM d, yyyy") diff --git a/apps/flipcash/shared/transaction-history/src/commonMain/kotlin/com/flipcash/shared/transactionhistory/RecentActivitySection.kt b/apps/flipcash/shared/transaction-history/src/commonMain/kotlin/com/flipcash/shared/transactionhistory/RecentActivitySection.kt index bc0c95e73a..3129a06f38 100644 --- a/apps/flipcash/shared/transaction-history/src/commonMain/kotlin/com/flipcash/shared/transactionhistory/RecentActivitySection.kt +++ b/apps/flipcash/shared/transaction-history/src/commonMain/kotlin/com/flipcash/shared/transactionhistory/RecentActivitySection.kt @@ -1,7 +1,11 @@ package com.flipcash.shared.transactionhistory -import com.flipcash.app.core.resources.CoreStrings -import com.flipcash.app.core.resources.CoreDrawables +import org.jetbrains.compose.resources.stringResource +import org.jetbrains.compose.resources.painterResource +import com.flipcash.core.resources.Res +import com.getcode.util.resources.ic_chevron_right +import com.getcode.util.resources.Res as UiRes +import com.flipcash.core.resources.title_recentActivity import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.PaddingValues import androidx.compose.foundation.layout.Row @@ -16,8 +20,6 @@ import androidx.compose.material.Text import androidx.compose.runtime.Composable import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier -import com.getcode.util.resources.painterForResId -import com.getcode.util.resources.stringRes import com.getcode.theme.CodeTheme /** @@ -64,13 +66,13 @@ private fun LazyItemScope.RecentActivityHeader(modifier: Modifier) { verticalAlignment = Alignment.CenterVertically, ) { Text( - text = stringRes(CoreStrings.title_recentActivity), + text = stringResource(Res.string.title_recentActivity), style = CodeTheme.typography.screenTitle, color = CodeTheme.colors.textMain, ) Icon( modifier = Modifier.size(CodeTheme.dimens.staticGrid.x3), - painter = painterForResId(CoreDrawables.ic_chevron_right), + painter = painterResource(UiRes.drawable.ic_chevron_right), contentDescription = null, tint = CodeTheme.colors.textSecondary, ) diff --git a/apps/flipcash/shared/transaction-history/src/commonMain/kotlin/com/flipcash/shared/transactionhistory/TransactionDetails.kt b/apps/flipcash/shared/transaction-history/src/commonMain/kotlin/com/flipcash/shared/transactionhistory/TransactionDetails.kt index 2b14ba1ac8..25875474ae 100644 --- a/apps/flipcash/shared/transaction-history/src/commonMain/kotlin/com/flipcash/shared/transactionhistory/TransactionDetails.kt +++ b/apps/flipcash/shared/transaction-history/src/commonMain/kotlin/com/flipcash/shared/transactionhistory/TransactionDetails.kt @@ -1,7 +1,26 @@ package com.flipcash.shared.transactionhistory -import com.flipcash.shared.transactionhistory.resources.TxStrings -import androidx.annotation.StringRes +import com.flipcash.shared.transactionhistory.generated.resources.Res +import com.flipcash.shared.transactionhistory.generated.resources.label_txnDetails_from +import com.flipcash.shared.transactionhistory.generated.resources.label_txnDetails_status_completed +import com.flipcash.shared.transactionhistory.generated.resources.label_txnDetails_status_failed +import com.flipcash.shared.transactionhistory.generated.resources.label_txnDetails_status_pending +import com.flipcash.shared.transactionhistory.generated.resources.label_txnDetails_status_unknown +import com.flipcash.shared.transactionhistory.generated.resources.label_txnDetails_to +import com.flipcash.shared.transactionhistory.generated.resources.title_txnDetails_buy +import com.flipcash.shared.transactionhistory.generated.resources.title_txnDetails_convert +import com.flipcash.shared.transactionhistory.generated.resources.title_txnDetails_deposit +import com.flipcash.shared.transactionhistory.generated.resources.title_txnDetails_poolPayment +import com.flipcash.shared.transactionhistory.generated.resources.title_txnDetails_sell +import com.flipcash.shared.transactionhistory.generated.resources.title_txnDetails_unknown +import com.flipcash.shared.transactionhistory.generated.resources.title_txnDetails_withdraw +import com.flipcash.shared.transactionhistory.generated.resources.title_txnDetails_youGaveCash +import com.flipcash.shared.transactionhistory.generated.resources.title_txnDetails_youReceived +import com.flipcash.shared.transactionhistory.generated.resources.title_txnDetails_youReceivedCash +import com.flipcash.shared.transactionhistory.generated.resources.title_txnDetails_youSent +import com.flipcash.shared.transactionhistory.generated.resources.title_txnDetails_youSentCashLink +import com.flipcash.shared.transactionhistory.generated.resources.title_txnDetails_youTipped +import org.jetbrains.compose.resources.StringResource import com.getcode.opencode.model.financial.Fiat import com.getcode.opencode.model.financial.Token import kotlin.time.Instant @@ -22,20 +41,20 @@ import kotlin.time.Instant * received-cash-link counterpart because collecting one is indistinguishable, in the metadata, * from taking a bill in person — both arrive as an unattributed `ReceivedCrypto`. */ -enum class TransactionKind(@StringRes val headingRes: Int) { - Tipped(TxStrings.title_txnDetails_youTipped), - Received(TxStrings.title_txnDetails_youReceived), - Sent(TxStrings.title_txnDetails_youSent), - GaveCash(TxStrings.title_txnDetails_youGaveCash), - ReceivedCash(TxStrings.title_txnDetails_youReceivedCash), - SentCashLink(TxStrings.title_txnDetails_youSentCashLink), - Buy(TxStrings.title_txnDetails_buy), - Sell(TxStrings.title_txnDetails_sell), - Withdraw(TxStrings.title_txnDetails_withdraw), - Deposit(TxStrings.title_txnDetails_deposit), - Convert(TxStrings.title_txnDetails_convert), - PoolPayment(TxStrings.title_txnDetails_poolPayment), - Unknown(TxStrings.title_txnDetails_unknown), +enum class TransactionKind(val headingRes: StringResource) { + Tipped(Res.string.title_txnDetails_youTipped), + Received(Res.string.title_txnDetails_youReceived), + Sent(Res.string.title_txnDetails_youSent), + GaveCash(Res.string.title_txnDetails_youGaveCash), + ReceivedCash(Res.string.title_txnDetails_youReceivedCash), + SentCashLink(Res.string.title_txnDetails_youSentCashLink), + Buy(Res.string.title_txnDetails_buy), + Sell(Res.string.title_txnDetails_sell), + Withdraw(Res.string.title_txnDetails_withdraw), + Deposit(Res.string.title_txnDetails_deposit), + Convert(Res.string.title_txnDetails_convert), + PoolPayment(Res.string.title_txnDetails_poolPayment), + Unknown(Res.string.title_txnDetails_unknown), } /** @@ -49,9 +68,9 @@ data class TransactionAccount( val address: String, val direction: Direction, ) { - enum class Direction(@StringRes val labelRes: Int) { - To(TxStrings.label_txnDetails_to), - From(TxStrings.label_txnDetails_from), + enum class Direction(val labelRes: StringResource) { + To(Res.string.label_txnDetails_to), + From(Res.string.label_txnDetails_from), } /** Nobody reads the middle of an address; the ends are what someone actually compares. */ @@ -65,11 +84,11 @@ data class TransactionAccount( } /** The entry's settlement state, as the Status row phrases it. */ -enum class TransactionStatus(@StringRes val labelRes: Int) { - Pending(TxStrings.label_txnDetails_status_pending), - Completed(TxStrings.label_txnDetails_status_completed), - Failed(TxStrings.label_txnDetails_status_failed), - Unknown(TxStrings.label_txnDetails_status_unknown), +enum class TransactionStatus(val labelRes: StringResource) { + Pending(Res.string.label_txnDetails_status_pending), + Completed(Res.string.label_txnDetails_status_completed), + Failed(Res.string.label_txnDetails_status_failed), + Unknown(Res.string.label_txnDetails_status_unknown), } /** diff --git a/apps/flipcash/shared/transaction-history/src/commonMain/kotlin/com/flipcash/shared/transactionhistory/TransactionSubtitles.kt b/apps/flipcash/shared/transaction-history/src/commonMain/kotlin/com/flipcash/shared/transactionhistory/TransactionSubtitles.kt index 0d30391d3d..179b716cfa 100644 --- a/apps/flipcash/shared/transaction-history/src/commonMain/kotlin/com/flipcash/shared/transactionhistory/TransactionSubtitles.kt +++ b/apps/flipcash/shared/transaction-history/src/commonMain/kotlin/com/flipcash/shared/transactionhistory/TransactionSubtitles.kt @@ -1,6 +1,10 @@ package com.flipcash.shared.transactionhistory -import com.flipcash.shared.transactionhistory.resources.TxStrings +import com.flipcash.shared.transactionhistory.generated.resources.Res +import com.flipcash.shared.transactionhistory.generated.resources.label_txnDetails_inPerson +import com.flipcash.shared.transactionhistory.generated.resources.label_txnDetails_paidWith +import com.flipcash.shared.transactionhistory.generated.resources.label_txnDetails_soldFor +import com.flipcash.shared.transactionhistory.generated.resources.title_activity_convert import com.getcode.util.resources.ResourceHelper /** @@ -28,22 +32,22 @@ object TransactionSubtitles { * exchanges identities, so "who" is genuinely unanswerable; how it moved is the useful fact. */ fun inPerson(resources: ResourceHelper): String = - resources.getString(TxStrings.label_txnDetails_inPerson) + resources.getString(Res.string.label_txnDetails_inPerson) /** [TransactionKind.Buy] — the mint that was spent, which the amount alone never says. */ fun paidWith(resources: ResourceHelper, tokenName: String): String = - resources.getString(TxStrings.label_txnDetails_paidWith, tokenName) + resources.getString(Res.string.label_txnDetails_paidWith, tokenName) /** [TransactionKind.Sell] — the mint that came back. */ fun soldFor(resources: ResourceHelper, tokenName: String): String = - resources.getString(TxStrings.label_txnDetails_soldFor, tokenName) + resources.getString(Res.string.label_txnDetails_soldFor, tokenName) /** * [TransactionKind.Convert] — both mints, in the same "from → to" shape the activity row's * convert title already uses, so the row and the screen it opens read alike. */ fun converted(resources: ResourceHelper, from: String, to: String): String = - resources.getString(TxStrings.title_activity_convert, from, to) + resources.getString(Res.string.title_activity_convert, from, to) /** [TransactionKind.PoolPayment] — the pool that was paid. */ fun pool(name: String): String? = name.takeIf { it.isNotBlank() } diff --git a/apps/flipcash/shared/transaction-history/src/commonMain/kotlin/com/flipcash/shared/transactionhistory/internal/TransactionItemMapper.kt b/apps/flipcash/shared/transaction-history/src/commonMain/kotlin/com/flipcash/shared/transactionhistory/internal/TransactionItemMapper.kt index 7004d06418..d7644d2403 100644 --- a/apps/flipcash/shared/transaction-history/src/commonMain/kotlin/com/flipcash/shared/transactionhistory/internal/TransactionItemMapper.kt +++ b/apps/flipcash/shared/transaction-history/src/commonMain/kotlin/com/flipcash/shared/transactionhistory/internal/TransactionItemMapper.kt @@ -1,6 +1,10 @@ package com.flipcash.shared.transactionhistory.internal -import com.flipcash.shared.transactionhistory.resources.TxStrings +import com.flipcash.shared.transactionhistory.generated.resources.Res +import com.flipcash.shared.transactionhistory.generated.resources.title_activity_convert +import com.flipcash.shared.transactionhistory.generated.resources.title_activity_receivedFrom +import com.flipcash.shared.transactionhistory.generated.resources.title_activity_sentTo +import com.flipcash.shared.transactionhistory.generated.resources.title_activity_tipFrom import com.flipcash.app.core.feed.ActivityFeedMessageWithToken import com.flipcash.app.core.feed.MessageMetadata import com.flipcash.app.core.feed.MessageSubstitution @@ -82,7 +86,7 @@ private fun convertTitle( convertOf(source.message.metadata) ?: return null val from = source.token?.name?.takeIf { it.isNotBlank() } ?: return null val to = source.toToken?.name?.takeIf { it.isNotBlank() } ?: return null - return resources.getString(TxStrings.title_activity_convert, from, to) + return resources.getString(Res.string.title_activity_convert, from, to) } /** @@ -130,12 +134,12 @@ private fun resolveTitle( val isTip = text.isTipVerb() return when (meta) { is MessageMetadata.ReceivedCrypto -> - if (isTip) resources.getString(TxStrings.title_activity_tipFrom, counterpartyName) - else resources.getString(TxStrings.title_activity_receivedFrom, counterpartyName) + if (isTip) resources.getString(Res.string.title_activity_tipFrom, counterpartyName) + else resources.getString(Res.string.title_activity_receivedFrom, counterpartyName) is MessageMetadata.DirectlySentCrypto -> // "Tipped" already reads as a transitive verb; "Sent" needs the preposition. if (isTip) "$text $counterpartyName" - else resources.getString(TxStrings.title_activity_sentTo, counterpartyName) + else resources.getString(Res.string.title_activity_sentTo, counterpartyName) else -> "$text $counterpartyName" } } diff --git a/apps/flipcash/shared/transaction-history/src/commonMain/kotlin/com/flipcash/shared/transactionhistory/resources/TxResources.kt b/apps/flipcash/shared/transaction-history/src/commonMain/kotlin/com/flipcash/shared/transactionhistory/resources/TxResources.kt deleted file mode 100644 index d707ec3968..0000000000 --- a/apps/flipcash/shared/transaction-history/src/commonMain/kotlin/com/flipcash/shared/transactionhistory/resources/TxResources.kt +++ /dev/null @@ -1,37 +0,0 @@ -package com.flipcash.shared.transactionhistory.resources - -/** - * `Int` IDs for the transaction-history strings that common code hands to - * [com.getcode.util.resources.ResourceHelper] and [com.getcode.util.resources.stringRes]. Android - * returns the `R` IDs; desktop registers the generated Compose resources. - */ -@Suppress("PropertyName") -expect object TxStrings { - val label_activity_convertFee: Int - val label_txnDetails_from: Int - val label_txnDetails_inPerson: Int - val label_txnDetails_paidWith: Int - val label_txnDetails_soldFor: Int - val label_txnDetails_status_completed: Int - val label_txnDetails_status_failed: Int - val label_txnDetails_status_pending: Int - val label_txnDetails_status_unknown: Int - val label_txnDetails_to: Int - val title_activity_convert: Int - val title_activity_receivedFrom: Int - val title_activity_sentTo: Int - val title_activity_tipFrom: Int - val title_txnDetails_buy: Int - val title_txnDetails_convert: Int - val title_txnDetails_deposit: Int - val title_txnDetails_poolPayment: Int - val title_txnDetails_sell: Int - val title_txnDetails_unknown: Int - val title_txnDetails_withdraw: Int - val title_txnDetails_youGaveCash: Int - val title_txnDetails_youReceived: Int - val title_txnDetails_youReceivedCash: Int - val title_txnDetails_youSent: Int - val title_txnDetails_youSentCashLink: Int - val title_txnDetails_youTipped: Int -} diff --git a/apps/flipcash/shared/transaction-history/src/jvmMain/kotlin/com/flipcash/shared/transactionhistory/resources/TxResources.jvm.kt b/apps/flipcash/shared/transaction-history/src/jvmMain/kotlin/com/flipcash/shared/transactionhistory/resources/TxResources.jvm.kt deleted file mode 100644 index c04328f65f..0000000000 --- a/apps/flipcash/shared/transaction-history/src/jvmMain/kotlin/com/flipcash/shared/transactionhistory/resources/TxResources.jvm.kt +++ /dev/null @@ -1,62 +0,0 @@ -package com.flipcash.shared.transactionhistory.resources - -import com.flipcash.shared.transactionhistory.generated.resources.Res -import com.flipcash.shared.transactionhistory.generated.resources.label_activity_convertFee -import com.flipcash.shared.transactionhistory.generated.resources.label_txnDetails_from -import com.flipcash.shared.transactionhistory.generated.resources.label_txnDetails_inPerson -import com.flipcash.shared.transactionhistory.generated.resources.label_txnDetails_paidWith -import com.flipcash.shared.transactionhistory.generated.resources.label_txnDetails_soldFor -import com.flipcash.shared.transactionhistory.generated.resources.label_txnDetails_status_completed -import com.flipcash.shared.transactionhistory.generated.resources.label_txnDetails_status_failed -import com.flipcash.shared.transactionhistory.generated.resources.label_txnDetails_status_pending -import com.flipcash.shared.transactionhistory.generated.resources.label_txnDetails_status_unknown -import com.flipcash.shared.transactionhistory.generated.resources.label_txnDetails_to -import com.flipcash.shared.transactionhistory.generated.resources.title_activity_convert -import com.flipcash.shared.transactionhistory.generated.resources.title_activity_receivedFrom -import com.flipcash.shared.transactionhistory.generated.resources.title_activity_sentTo -import com.flipcash.shared.transactionhistory.generated.resources.title_activity_tipFrom -import com.flipcash.shared.transactionhistory.generated.resources.title_txnDetails_buy -import com.flipcash.shared.transactionhistory.generated.resources.title_txnDetails_convert -import com.flipcash.shared.transactionhistory.generated.resources.title_txnDetails_deposit -import com.flipcash.shared.transactionhistory.generated.resources.title_txnDetails_poolPayment -import com.flipcash.shared.transactionhistory.generated.resources.title_txnDetails_sell -import com.flipcash.shared.transactionhistory.generated.resources.title_txnDetails_unknown -import com.flipcash.shared.transactionhistory.generated.resources.title_txnDetails_withdraw -import com.flipcash.shared.transactionhistory.generated.resources.title_txnDetails_youGaveCash -import com.flipcash.shared.transactionhistory.generated.resources.title_txnDetails_youReceived -import com.flipcash.shared.transactionhistory.generated.resources.title_txnDetails_youReceivedCash -import com.flipcash.shared.transactionhistory.generated.resources.title_txnDetails_youSent -import com.flipcash.shared.transactionhistory.generated.resources.title_txnDetails_youSentCashLink -import com.flipcash.shared.transactionhistory.generated.resources.title_txnDetails_youTipped -import com.getcode.util.resources.ComposeResourceIds - -@Suppress("PropertyName") -actual object TxStrings { - actual val label_activity_convertFee: Int = ComposeResourceIds.register(Res.string.label_activity_convertFee) - actual val label_txnDetails_from: Int = ComposeResourceIds.register(Res.string.label_txnDetails_from) - actual val label_txnDetails_inPerson: Int = ComposeResourceIds.register(Res.string.label_txnDetails_inPerson) - actual val label_txnDetails_paidWith: Int = ComposeResourceIds.register(Res.string.label_txnDetails_paidWith) - actual val label_txnDetails_soldFor: Int = ComposeResourceIds.register(Res.string.label_txnDetails_soldFor) - actual val label_txnDetails_status_completed: Int = ComposeResourceIds.register(Res.string.label_txnDetails_status_completed) - actual val label_txnDetails_status_failed: Int = ComposeResourceIds.register(Res.string.label_txnDetails_status_failed) - actual val label_txnDetails_status_pending: Int = ComposeResourceIds.register(Res.string.label_txnDetails_status_pending) - actual val label_txnDetails_status_unknown: Int = ComposeResourceIds.register(Res.string.label_txnDetails_status_unknown) - actual val label_txnDetails_to: Int = ComposeResourceIds.register(Res.string.label_txnDetails_to) - actual val title_activity_convert: Int = ComposeResourceIds.register(Res.string.title_activity_convert) - actual val title_activity_receivedFrom: Int = ComposeResourceIds.register(Res.string.title_activity_receivedFrom) - actual val title_activity_sentTo: Int = ComposeResourceIds.register(Res.string.title_activity_sentTo) - actual val title_activity_tipFrom: Int = ComposeResourceIds.register(Res.string.title_activity_tipFrom) - actual val title_txnDetails_buy: Int = ComposeResourceIds.register(Res.string.title_txnDetails_buy) - actual val title_txnDetails_convert: Int = ComposeResourceIds.register(Res.string.title_txnDetails_convert) - actual val title_txnDetails_deposit: Int = ComposeResourceIds.register(Res.string.title_txnDetails_deposit) - actual val title_txnDetails_poolPayment: Int = ComposeResourceIds.register(Res.string.title_txnDetails_poolPayment) - actual val title_txnDetails_sell: Int = ComposeResourceIds.register(Res.string.title_txnDetails_sell) - actual val title_txnDetails_unknown: Int = ComposeResourceIds.register(Res.string.title_txnDetails_unknown) - actual val title_txnDetails_withdraw: Int = ComposeResourceIds.register(Res.string.title_txnDetails_withdraw) - actual val title_txnDetails_youGaveCash: Int = ComposeResourceIds.register(Res.string.title_txnDetails_youGaveCash) - actual val title_txnDetails_youReceived: Int = ComposeResourceIds.register(Res.string.title_txnDetails_youReceived) - actual val title_txnDetails_youReceivedCash: Int = ComposeResourceIds.register(Res.string.title_txnDetails_youReceivedCash) - actual val title_txnDetails_youSent: Int = ComposeResourceIds.register(Res.string.title_txnDetails_youSent) - actual val title_txnDetails_youSentCashLink: Int = ComposeResourceIds.register(Res.string.title_txnDetails_youSentCashLink) - actual val title_txnDetails_youTipped: Int = ComposeResourceIds.register(Res.string.title_txnDetails_youTipped) -} diff --git a/apps/flipcash/shared/userflags/build.gradle.kts b/apps/flipcash/shared/userflags/build.gradle.kts index bcb6712ac2..68416a6e07 100644 --- a/apps/flipcash/shared/userflags/build.gradle.kts +++ b/apps/flipcash/shared/userflags/build.gradle.kts @@ -1,6 +1,9 @@ +import com.getcode.buildlogic.resources.androidResAsComposeResources + plugins { alias(libs.plugins.flipcash.kmp.app.library) alias(libs.plugins.compose.compiler) + alias(libs.plugins.jetbrains.compose) alias(libs.plugins.kotlin.ksp) } @@ -14,6 +17,7 @@ kotlin { commonMain.dependencies { implementation(libs.jetbrains.compose.runtime) implementation(libs.jetbrains.compose.foundation) + implementation(libs.jetbrains.compose.components.resources) implementation(libs.androidx.annotation) implementation(libs.androidx.datastore.preferences.core) implementation(libs.javax.inject) @@ -39,6 +43,14 @@ kotlin { } } +compose.resources { + packageOfResClass = "com.flipcash.app.userflags.generated.resources" + customDirectory( + sourceSetName = "commonMain", + directoryProvider = androidResAsComposeResources(), + ) +} + dependencies { add("kspAndroid", libs.hilt.android.compiler) add("kspAndroid", libs.hilt.compiler) diff --git a/apps/flipcash/shared/userflags/src/androidMain/kotlin/com/flipcash/app/userflags/FlagStrings.android.kt b/apps/flipcash/shared/userflags/src/androidMain/kotlin/com/flipcash/app/userflags/FlagStrings.android.kt deleted file mode 100644 index bf9407fcfc..0000000000 --- a/apps/flipcash/shared/userflags/src/androidMain/kotlin/com/flipcash/app/userflags/FlagStrings.android.kt +++ /dev/null @@ -1,26 +0,0 @@ -package com.flipcash.app.userflags - -import com.flipcash.shared.userflags.R - -internal actual object FlagStrings { - actual val hint_flag_billExchangeDataTimeout: Int = R.string.hint_flag_billExchangeDataTimeout - actual val hint_flag_messageDeleteWindow: Int = R.string.hint_flag_messageDeleteWindow - actual val hint_flag_messageEditWindow: Int = R.string.hint_flag_messageEditWindow - actual val hint_flag_minHolderAmount: Int = R.string.hint_flag_minHolderAmount - actual val hint_flag_minimumVersion: Int = R.string.hint_flag_minimumVersion - actual val hint_flag_newCurrencyFeeAmount: Int = R.string.hint_flag_newCurrencyFeeAmount - actual val hint_flag_newCurrencyPurchaseAmount: Int = R.string.hint_flag_newCurrencyPurchaseAmount - actual val hint_flag_withdrawalFeeAmount: Int = R.string.hint_flag_withdrawalFeeAmount - actual val label_flag_billExchangeDataTimeout: Int = R.string.label_flag_billExchangeDataTimeout - actual val label_flag_messageDeleteWindow: Int = R.string.label_flag_messageDeleteWindow - actual val label_flag_messageEditWindow: Int = R.string.label_flag_messageEditWindow - actual val label_flag_minHolderAmount: Int = R.string.label_flag_minHolderAmount - actual val label_flag_minimumVersion: Int = R.string.label_flag_minimumVersion - actual val label_flag_newCurrencyFeeAmount: Int = R.string.label_flag_newCurrencyFeeAmount - actual val label_flag_newCurrencyPurchaseAmount: Int = R.string.label_flag_newCurrencyPurchaseAmount - actual val label_flag_preferredProvider: Int = R.string.label_flag_preferredProvider - actual val label_flag_preferredUsdcLiquidityPool: Int = R.string.label_flag_preferredUsdcLiquidityPool - actual val label_flag_requireCoinbaseEmailVerification: Int = R.string.label_flag_requireCoinbaseEmailVerification - actual val label_flag_supportedOnRampProviders: Int = R.string.label_flag_supportedOnRampProviders - actual val label_flag_withdrawalFeeAmount: Int = R.string.label_flag_withdrawalFeeAmount -} diff --git a/apps/flipcash/shared/userflags/src/commonMain/kotlin/com/flipcash/app/userflags/Field.kt b/apps/flipcash/shared/userflags/src/commonMain/kotlin/com/flipcash/app/userflags/Field.kt index 6f94b50caa..6579f2d0b9 100644 --- a/apps/flipcash/shared/userflags/src/commonMain/kotlin/com/flipcash/app/userflags/Field.kt +++ b/apps/flipcash/shared/userflags/src/commonMain/kotlin/com/flipcash/app/userflags/Field.kt @@ -1,6 +1,27 @@ package com.flipcash.app.userflags -import androidx.annotation.StringRes +import org.jetbrains.compose.resources.StringResource +import com.flipcash.app.userflags.generated.resources.Res +import com.flipcash.app.userflags.generated.resources.hint_flag_billExchangeDataTimeout +import com.flipcash.app.userflags.generated.resources.hint_flag_messageDeleteWindow +import com.flipcash.app.userflags.generated.resources.hint_flag_messageEditWindow +import com.flipcash.app.userflags.generated.resources.hint_flag_minHolderAmount +import com.flipcash.app.userflags.generated.resources.hint_flag_minimumVersion +import com.flipcash.app.userflags.generated.resources.hint_flag_newCurrencyFeeAmount +import com.flipcash.app.userflags.generated.resources.hint_flag_newCurrencyPurchaseAmount +import com.flipcash.app.userflags.generated.resources.hint_flag_withdrawalFeeAmount +import com.flipcash.app.userflags.generated.resources.label_flag_billExchangeDataTimeout +import com.flipcash.app.userflags.generated.resources.label_flag_messageDeleteWindow +import com.flipcash.app.userflags.generated.resources.label_flag_messageEditWindow +import com.flipcash.app.userflags.generated.resources.label_flag_minHolderAmount +import com.flipcash.app.userflags.generated.resources.label_flag_minimumVersion +import com.flipcash.app.userflags.generated.resources.label_flag_newCurrencyFeeAmount +import com.flipcash.app.userflags.generated.resources.label_flag_newCurrencyPurchaseAmount +import com.flipcash.app.userflags.generated.resources.label_flag_preferredProvider +import com.flipcash.app.userflags.generated.resources.label_flag_preferredUsdcLiquidityPool +import com.flipcash.app.userflags.generated.resources.label_flag_requireCoinbaseEmailVerification +import com.flipcash.app.userflags.generated.resources.label_flag_supportedOnRampProviders +import com.flipcash.app.userflags.generated.resources.label_flag_withdrawalFeeAmount import androidx.compose.foundation.text.input.InputTransformation import androidx.compose.foundation.text.input.OutputTransformation import androidx.compose.foundation.text.input.insert @@ -22,8 +43,8 @@ sealed class Field( val preferenceKey: Preferences.Key, val encode: (Domain) -> Stored, val decode: (Stored) -> Domain?, - @get:StringRes val label: Int, - @get:StringRes val hint: Int = label, + val label: StringResource, + val hint: StringResource = label, val format: (Domain) -> String, val editFormat: (Domain) -> String = format, val editor: FieldEditor, @@ -34,7 +55,7 @@ sealed class Field( stringPreferencesKey("override_preferred_provider"), encode = { it?.encode() ?: "None" }, decode = { decodeOnRampProvider(it) }, - label = FlagStrings.label_flag_preferredProvider, + label = Res.string.label_flag_preferredProvider, format = { provider -> provider?.displayName() ?: "None" }, editor = FieldEditor.SingleSelect( options = listOf( @@ -56,7 +77,7 @@ sealed class Field( else -> "${providers.size} selected" } }, - label = FlagStrings.label_flag_supportedOnRampProviders, + label = Res.string.label_flag_supportedOnRampProviders, editor = FieldEditor.MultiSelect( options = listOf( "Manual Deposit" to OnRampProvider.ManualDeposit, @@ -70,8 +91,8 @@ sealed class Field( intPreferencesKey("override_min_version"), encode = { it ?: 0 }, decode = { it }, - label = FlagStrings.label_flag_minimumVersion, - hint = FlagStrings.hint_flag_minimumVersion, + label = Res.string.label_flag_minimumVersion, + hint = Res.string.hint_flag_minimumVersion, format = { it.toString() }, editor = FieldEditor.TextInput( keyboard = KeyboardType.Number, @@ -86,8 +107,8 @@ sealed class Field( longPreferencesKey("override_bill_timeout"), encode = { it?.inWholeMilliseconds ?: -1L }, decode = { if (it < 0) null else it.milliseconds }, - label = FlagStrings.label_flag_billExchangeDataTimeout, - hint = FlagStrings.hint_flag_billExchangeDataTimeout, + label = Res.string.label_flag_billExchangeDataTimeout, + hint = Res.string.hint_flag_billExchangeDataTimeout, format = { it?.let { "${it.inWholeSeconds}s" } ?: "None" }, editFormat = { it?.inWholeSeconds?.toString() ?: "" }, editor = FieldEditor.TextInput( @@ -108,8 +129,8 @@ sealed class Field( longPreferencesKey("override_message_edit_window"), encode = { it?.inWholeMilliseconds ?: -1L }, decode = { if (it < 0) null else it.milliseconds }, - label = FlagStrings.label_flag_messageEditWindow, - hint = FlagStrings.hint_flag_messageEditWindow, + label = Res.string.label_flag_messageEditWindow, + hint = Res.string.hint_flag_messageEditWindow, format = { it?.let { "${it.inWholeSeconds}s" } ?: "None" }, editFormat = { it?.inWholeSeconds?.toString() ?: "" }, editor = FieldEditor.TextInput( @@ -125,8 +146,8 @@ sealed class Field( longPreferencesKey("override_message_delete_window"), encode = { it?.inWholeMilliseconds ?: -1L }, decode = { if (it < 0) null else it.milliseconds }, - label = FlagStrings.label_flag_messageDeleteWindow, - hint = FlagStrings.hint_flag_messageDeleteWindow, + label = Res.string.label_flag_messageDeleteWindow, + hint = Res.string.hint_flag_messageDeleteWindow, format = { it?.let { "${it.inWholeSeconds}s" } ?: "None" }, editFormat = { it?.inWholeSeconds?.toString() ?: "" }, editor = FieldEditor.TextInput( @@ -142,8 +163,8 @@ sealed class Field( longPreferencesKey("override_new_currency_amount"), encode = { it.quarks }, decode = { Fiat(quarks = it) }, - label = FlagStrings.label_flag_newCurrencyPurchaseAmount, - hint = FlagStrings.hint_flag_newCurrencyPurchaseAmount, + label = Res.string.label_flag_newCurrencyPurchaseAmount, + hint = Res.string.hint_flag_newCurrencyPurchaseAmount, format = { it.formatted(rule = Fiat.FormattingRule.Truncated) }, editFormat = { it.formatted(showPrefix = false, rule = Fiat.FormattingRule.Truncated) }, editor = FieldEditor.TextInput( @@ -161,8 +182,8 @@ sealed class Field( longPreferencesKey("override_new_fee_amount"), encode = { it.quarks }, decode = { Fiat(quarks = it) }, - label = FlagStrings.label_flag_newCurrencyFeeAmount, - hint = FlagStrings.hint_flag_newCurrencyFeeAmount, + label = Res.string.label_flag_newCurrencyFeeAmount, + hint = Res.string.hint_flag_newCurrencyFeeAmount, format = { it.formatted(rule = Fiat.FormattingRule.Truncated) }, editFormat = { it.formatted(showPrefix = false, rule = Fiat.FormattingRule.Truncated) }, editor = FieldEditor.TextInput( @@ -180,8 +201,8 @@ sealed class Field( longPreferencesKey("override_withdrawal_fee_amount"), encode = { it.quarks }, decode = { Fiat(quarks = it) }, - label = FlagStrings.label_flag_withdrawalFeeAmount, - hint = FlagStrings.hint_flag_withdrawalFeeAmount, + label = Res.string.label_flag_withdrawalFeeAmount, + hint = Res.string.hint_flag_withdrawalFeeAmount, format = { it.formatted(rule = Fiat.FormattingRule.Truncated) }, editFormat = { it.formatted(showPrefix = false, rule = Fiat.FormattingRule.Truncated) }, editor = FieldEditor.TextInput( @@ -199,7 +220,7 @@ sealed class Field( stringPreferencesKey("override_preferred_liquidity_pool"), encode = { it.name }, decode = { runCatching { UsdcLiquidtyPool.valueOf(it) }.getOrNull() }, - label = FlagStrings.label_flag_preferredUsdcLiquidityPool, + label = Res.string.label_flag_preferredUsdcLiquidityPool, format = { provider -> provider.displayName() }, editor = FieldEditor.SingleSelect( options = listOf( @@ -213,7 +234,7 @@ sealed class Field( booleanPreferencesKey("override_require_coinbase_email_verification"), encode = { it }, decode = { it }, - label = FlagStrings.label_flag_requireCoinbaseEmailVerification, + label = Res.string.label_flag_requireCoinbaseEmailVerification, format = { if (it) "Yes" else "No" }, editor = FieldEditor.SingleSelect( options = listOf("Yes" to true, "No" to false) @@ -224,8 +245,8 @@ sealed class Field( longPreferencesKey("override_min_holder_amount"), encode = { it.quarks }, decode = { Fiat(quarks = it) }, - label = FlagStrings.label_flag_minHolderAmount, - hint = FlagStrings.hint_flag_minHolderAmount, + label = Res.string.label_flag_minHolderAmount, + hint = Res.string.hint_flag_minHolderAmount, format = { it.formatted(rule = Fiat.FormattingRule.Truncated) }, editFormat = { it.formatted(showPrefix = false, rule = Fiat.FormattingRule.Truncated) }, editor = FieldEditor.TextInput( diff --git a/apps/flipcash/shared/userflags/src/commonMain/kotlin/com/flipcash/app/userflags/FlagStrings.kt b/apps/flipcash/shared/userflags/src/commonMain/kotlin/com/flipcash/app/userflags/FlagStrings.kt deleted file mode 100644 index f7923bed81..0000000000 --- a/apps/flipcash/shared/userflags/src/commonMain/kotlin/com/flipcash/app/userflags/FlagStrings.kt +++ /dev/null @@ -1,28 +0,0 @@ -package com.flipcash.app.userflags - -/** - * String resource ids for the debug flag editor's labels and hints. Android reads them from - * this module's `R`; desktop has no flag editor, so its ids are 0. - */ -internal expect object FlagStrings { - val hint_flag_billExchangeDataTimeout: Int - val hint_flag_messageDeleteWindow: Int - val hint_flag_messageEditWindow: Int - val hint_flag_minHolderAmount: Int - val hint_flag_minimumVersion: Int - val hint_flag_newCurrencyFeeAmount: Int - val hint_flag_newCurrencyPurchaseAmount: Int - val hint_flag_withdrawalFeeAmount: Int - val label_flag_billExchangeDataTimeout: Int - val label_flag_messageDeleteWindow: Int - val label_flag_messageEditWindow: Int - val label_flag_minHolderAmount: Int - val label_flag_minimumVersion: Int - val label_flag_newCurrencyFeeAmount: Int - val label_flag_newCurrencyPurchaseAmount: Int - val label_flag_preferredProvider: Int - val label_flag_preferredUsdcLiquidityPool: Int - val label_flag_requireCoinbaseEmailVerification: Int - val label_flag_supportedOnRampProviders: Int - val label_flag_withdrawalFeeAmount: Int -} diff --git a/apps/flipcash/shared/userflags/src/jvmMain/kotlin/com/flipcash/app/userflags/FlagStrings.jvm.kt b/apps/flipcash/shared/userflags/src/jvmMain/kotlin/com/flipcash/app/userflags/FlagStrings.jvm.kt deleted file mode 100644 index 5e9c5fbd6d..0000000000 --- a/apps/flipcash/shared/userflags/src/jvmMain/kotlin/com/flipcash/app/userflags/FlagStrings.jvm.kt +++ /dev/null @@ -1,24 +0,0 @@ -package com.flipcash.app.userflags - -internal actual object FlagStrings { - actual val hint_flag_billExchangeDataTimeout: Int = 0 - actual val hint_flag_messageDeleteWindow: Int = 0 - actual val hint_flag_messageEditWindow: Int = 0 - actual val hint_flag_minHolderAmount: Int = 0 - actual val hint_flag_minimumVersion: Int = 0 - actual val hint_flag_newCurrencyFeeAmount: Int = 0 - actual val hint_flag_newCurrencyPurchaseAmount: Int = 0 - actual val hint_flag_withdrawalFeeAmount: Int = 0 - actual val label_flag_billExchangeDataTimeout: Int = 0 - actual val label_flag_messageDeleteWindow: Int = 0 - actual val label_flag_messageEditWindow: Int = 0 - actual val label_flag_minHolderAmount: Int = 0 - actual val label_flag_minimumVersion: Int = 0 - actual val label_flag_newCurrencyFeeAmount: Int = 0 - actual val label_flag_newCurrencyPurchaseAmount: Int = 0 - actual val label_flag_preferredProvider: Int = 0 - actual val label_flag_preferredUsdcLiquidityPool: Int = 0 - actual val label_flag_requireCoinbaseEmailVerification: Int = 0 - actual val label_flag_supportedOnRampProviders: Int = 0 - actual val label_flag_withdrawalFeeAmount: Int = 0 -} diff --git a/ui/resources/src/androidMain/kotlin/com/getcode/util/resources/AndroidResources.kt b/ui/resources/src/androidMain/kotlin/com/getcode/util/resources/AndroidResources.kt index db84bf05b6..c1b7463d3b 100644 --- a/ui/resources/src/androidMain/kotlin/com/getcode/util/resources/AndroidResources.kt +++ b/ui/resources/src/androidMain/kotlin/com/getcode/util/resources/AndroidResources.kt @@ -10,6 +10,7 @@ import androidx.annotation.RawRes import androidx.annotation.StringRes import androidx.appcompat.content.res.AppCompatResources import androidx.core.content.res.ResourcesCompat +import org.jetbrains.compose.resources.StringResource import timber.log.Timber import java.io.File @@ -25,6 +26,13 @@ class AndroidResources( return context.getString(resourceId, *formatArgs) } + // Compose resources keep the Android resource name as their key, and every module's resources are + // merged into the app package, so the key resolves to the same R entry Android always read. + override fun getString(resource: StringResource, vararg formatArgs: Any): String { + val id = getIdentifier(resource.key, ResourceType.String) ?: return "" + return context.getString(id, *formatArgs) + } + override fun getRawResource(@RawRes resourceId: Int): String { return try { context.resources.openRawResource(resourceId).bufferedReader().use { it.readText() } diff --git a/ui/resources/src/androidMain/kotlin/com/getcode/util/resources/StringRes.android.kt b/ui/resources/src/androidMain/kotlin/com/getcode/util/resources/StringRes.android.kt deleted file mode 100644 index 5819f8d2f9..0000000000 --- a/ui/resources/src/androidMain/kotlin/com/getcode/util/resources/StringRes.android.kt +++ /dev/null @@ -1,15 +0,0 @@ -package com.getcode.util.resources - -import androidx.compose.runtime.Composable -import androidx.compose.ui.res.pluralStringResource -import androidx.compose.ui.res.stringResource - -@Composable -actual fun stringRes(id: Int): String = stringResource(id) - -@Composable -actual fun stringRes(id: Int, vararg formatArgs: Any): String = stringResource(id, *formatArgs) - -@Composable -actual fun pluralStringRes(id: Int, count: Int, vararg formatArgs: Any): String = - pluralStringResource(id, count, *formatArgs) diff --git a/ui/resources/src/commonMain/kotlin/com/getcode/util/resources/ResourceHelper.kt b/ui/resources/src/commonMain/kotlin/com/getcode/util/resources/ResourceHelper.kt index fb339aa961..72f1cc0070 100644 --- a/ui/resources/src/commonMain/kotlin/com/getcode/util/resources/ResourceHelper.kt +++ b/ui/resources/src/commonMain/kotlin/com/getcode/util/resources/ResourceHelper.kt @@ -5,6 +5,7 @@ import androidx.annotation.PluralsRes import androidx.annotation.RawRes import androidx.annotation.StringRes import androidx.compose.runtime.staticCompositionLocalOf +import org.jetbrains.compose.resources.StringResource /** * Looks up app resources by their Android resource ID. @@ -17,6 +18,9 @@ interface ResourceHelper { fun getString(@StringRes resourceId: Int, vararg formatArgs: Any): String + /** Reads a Compose string resource outside composition, for mappers that build display text. */ + fun getString(resource: StringResource, vararg formatArgs: Any): String + fun getRawResource(@RawRes resourceId: Int): String fun getQuantityString( @@ -49,6 +53,8 @@ private object NoOpResources : ResourceHelper { override fun getString(resourceId: Int, vararg formatArgs: Any): String = "" + override fun getString(resource: StringResource, vararg formatArgs: Any): String = "" + override fun getRawResource(resourceId: Int): String = "" override fun getQuantityString( diff --git a/ui/resources/src/commonMain/kotlin/com/getcode/util/resources/StringRes.kt b/ui/resources/src/commonMain/kotlin/com/getcode/util/resources/StringRes.kt deleted file mode 100644 index 5bb17bec3e..0000000000 --- a/ui/resources/src/commonMain/kotlin/com/getcode/util/resources/StringRes.kt +++ /dev/null @@ -1,18 +0,0 @@ -package com.getcode.util.resources - -import androidx.annotation.PluralsRes -import androidx.annotation.StringRes -import androidx.compose.runtime.Composable - -/** - * Reads the string behind a resource ID in composition. On Android these are `R.string` values; - * on desktop they come from [ResourceHelper.getIdentifier] or a module's string table. - */ -@Composable -expect fun stringRes(@StringRes id: Int): String - -@Composable -expect fun stringRes(@StringRes id: Int, vararg formatArgs: Any): String - -@Composable -expect fun pluralStringRes(@PluralsRes id: Int, count: Int, vararg formatArgs: Any): String diff --git a/ui/resources/src/jvmMain/kotlin/com/getcode/util/resources/ComposeResourceHelper.kt b/ui/resources/src/jvmMain/kotlin/com/getcode/util/resources/ComposeResourceHelper.kt index c55ed631b5..17df59207e 100644 --- a/ui/resources/src/jvmMain/kotlin/com/getcode/util/resources/ComposeResourceHelper.kt +++ b/ui/resources/src/jvmMain/kotlin/com/getcode/util/resources/ComposeResourceHelper.kt @@ -2,6 +2,7 @@ package com.getcode.util.resources import kotlinx.coroutines.runBlocking import org.jetbrains.compose.resources.getPluralString +import org.jetbrains.compose.resources.StringResource import org.jetbrains.compose.resources.getString /** @@ -15,6 +16,9 @@ class ComposeResourceHelper : ResourceHelper { override fun getString(resourceId: Int, vararg formatArgs: Any): String = runBlocking { getString(ComposeResourceIds.string(resourceId), *formatArgs) } + override fun getString(resource: StringResource, vararg formatArgs: Any): String = + runBlocking { getString(resource, *formatArgs) } + override fun getRawResource(resourceId: Int): String = "" override fun getQuantityString(id: Int, quantity: Int, vararg formatArgs: Any, default: String): String = diff --git a/ui/resources/src/jvmMain/kotlin/com/getcode/util/resources/StringRes.jvm.kt b/ui/resources/src/jvmMain/kotlin/com/getcode/util/resources/StringRes.jvm.kt deleted file mode 100644 index 6e9a8f1313..0000000000 --- a/ui/resources/src/jvmMain/kotlin/com/getcode/util/resources/StringRes.jvm.kt +++ /dev/null @@ -1,16 +0,0 @@ -package com.getcode.util.resources - -import androidx.compose.runtime.Composable -import org.jetbrains.compose.resources.pluralStringResource -import org.jetbrains.compose.resources.stringResource - -@Composable -actual fun stringRes(id: Int): String = stringResource(ComposeResourceIds.string(id)) - -@Composable -actual fun stringRes(id: Int, vararg formatArgs: Any): String = - stringResource(ComposeResourceIds.string(id), *formatArgs) - -@Composable -actual fun pluralStringRes(id: Int, count: Int, vararg formatArgs: Any): String = - pluralStringResource(ComposeResourceIds.plural(id), count, *formatArgs) diff --git a/ui/resources/test-fixtures/src/main/kotlin/com/getcode/util/resources/FakeResourceHelper.kt b/ui/resources/test-fixtures/src/main/kotlin/com/getcode/util/resources/FakeResourceHelper.kt index e9881b8b62..84d9e73cc2 100644 --- a/ui/resources/test-fixtures/src/main/kotlin/com/getcode/util/resources/FakeResourceHelper.kt +++ b/ui/resources/test-fixtures/src/main/kotlin/com/getcode/util/resources/FakeResourceHelper.kt @@ -3,6 +3,7 @@ package com.getcode.util.resources import android.graphics.Typeface import android.graphics.drawable.Drawable import android.util.DisplayMetrics +import org.jetbrains.compose.resources.StringResource import java.io.File import java.net.URL import java.net.URLClassLoader @@ -17,6 +18,7 @@ class FakeResourceHelper(vararg rClasses: Class<*>) : AndroidResourceHelper { } private val overrides = mutableMapOf() + private val keyOverrides = mutableMapOf() fun stub(resourceId: Int, value: String): FakeResourceHelper = apply { overrides[resourceId] = value @@ -30,6 +32,15 @@ class FakeResourceHelper(vararg rClasses: Class<*>) : AndroidResourceHelper { return runCatching { template.format(*formatArgs) }.getOrDefault(template) } + fun stub(resource: StringResource, value: String): FakeResourceHelper = apply { + keyOverrides[resource.key] = value + } + + override fun getString(resource: StringResource, vararg formatArgs: Any): String { + val template = keyOverrides[resource.key] ?: return resource.key + return runCatching { template.format(*formatArgs) }.getOrDefault(template) + } + override fun getRawResource(resourceId: Int): String = "" override fun getQuantityString(id: Int, quantity: Int, vararg formatArgs: Any, default: String): String = default override fun getDimension(dimenId: Int, default: Float): Float = default