Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
23 commits
Select commit Hold shift + click to select a range
4f8eb56
feat(feature:send-money): add UPI QR code processor
biplab1 Aug 5, 2025
001e260
feat(feature:send-money): add screen for payment options
biplab1 Aug 13, 2025
c7e26d0
feat(feature:send-money): fit names in one line
biplab1 Aug 14, 2025
e20f6f8
feat(feature:send-money): implement upi and non upi scanner navigation
biplab1 Aug 14, 2025
3c31541
fix(feature:send-money): fetch UPI data in payee details screen
biplab1 Aug 15, 2025
fa8e9af
refactor(send-money): enhance payment details UI/UX
biplab1 Aug 15, 2025
b1d9104
Merge branch 'dev' into MW-260-add-basic-upi-payment-support
biplab1 Aug 15, 2025
278e1aa
Merge branch 'refs/heads/dev' into MW-260-add-basic-upi-payment-support
biplab1 Aug 19, 2025
069353f
feat(feature:autopay): add module structure and navigation integration
biplab1 Aug 20, 2025
7539965
feat(feature:autopay): add autopay to send money options
biplab1 Aug 24, 2025
f8844fd
feat(feature:autopay): implement autopay dashboard screen
biplab1 Aug 24, 2025
49ba5ec
feat(feature:autopay): implement data layer
biplab1 Aug 25, 2025
8f19f14
feat(feature:autopay): implement add biller screen
biplab1 Aug 25, 2025
980a4f0
feat(feature:autopay): implement edit biller and biller list
biplab1 Aug 25, 2025
8b64267
fix(feature:autopay): resolve navigation state issue
biplab1 Aug 26, 2025
beaa205
fix(feature:autopay): implement add bill and bill list
biplab1 Aug 26, 2025
fe765a6
feat(feature:autopay): implement bill data layer
biplab1 Aug 30, 2025
d5a3176
chore(feature:autopay): add to dos for network layer
biplab1 Aug 31, 2025
7b89ca9
feat(feature:autopay): implement setup autopay screen
biplab1 Sep 4, 2025
4f0094d
feat(feature:autopay): add autopay preferences and schedule management
biplab1 Sep 4, 2025
dfc1287
refactor(feature:autopay): remove unused screens and improve ui ux
biplab1 Sep 4, 2025
11be9d5
feat(feature:autopay): add settings to edit bill, remove unused ui
biplab1 Sep 5, 2025
8bcf72e
feat(feature:autopay): add viewmodel, data layer for history
biplab1 Sep 5, 2025
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
33 changes: 33 additions & 0 deletions cmp-android/dependencies/prodReleaseRuntimeClasspath.tree.txt
Original file line number Diff line number Diff line change
Expand Up @@ -3012,6 +3012,39 @@
| | +--- org.jetbrains.compose.material3:material3:1.8.2 (*)
| | +--- org.jetbrains.compose.components:components-resources:1.8.2 (*)
| | \--- org.jetbrains.compose.components:components-ui-tooling-preview:1.8.2 (*)
| +--- project :feature:autopay
| | +--- androidx.lifecycle:lifecycle-runtime-compose:2.9.2 (*)
| | +--- androidx.lifecycle:lifecycle-viewmodel-compose:2.9.2 (*)
| | +--- androidx.tracing:tracing-ktx:1.3.0 (*)
| | +--- io.insert-koin:koin-bom:4.1.0 (*)
| | +--- io.insert-koin:koin-android:4.1.0 (*)
| | +--- io.insert-koin:koin-androidx-compose:4.1.0 (*)
| | +--- io.insert-koin:koin-androidx-navigation:4.1.0 (*)
| | +--- io.insert-koin:koin-core-viewmodel:4.1.0 (*)
| | +--- org.jetbrains.kotlin:kotlin-stdlib:2.1.20 -> 2.1.21 (*)
| | +--- io.insert-koin:koin-core:4.1.0 (*)
| | +--- io.insert-koin:koin-annotations:2.1.0 (*)
| | +--- project :core:ui (*)
| | +--- project :core:designsystem (*)
| | +--- project :core:data (*)
| | +--- io.insert-koin:koin-compose:4.1.0 (*)
| | +--- io.insert-koin:koin-compose-viewmodel:4.1.0 (*)
| | +--- org.jetbrains.compose.runtime:runtime:1.8.2 (*)
| | +--- org.jetbrains.androidx.lifecycle:lifecycle-runtime-compose:2.9.1 (*)
| | +--- org.jetbrains.androidx.lifecycle:lifecycle-viewmodel-compose:2.9.1 (*)
| | +--- org.jetbrains.androidx.lifecycle:lifecycle-viewmodel:2.9.1 (*)
| | +--- org.jetbrains.androidx.lifecycle:lifecycle-viewmodel-savedstate:2.9.1 (*)
| | +--- org.jetbrains.androidx.savedstate:savedstate:1.3.1 (*)
| | +--- org.jetbrains.androidx.core:core-bundle:1.0.1 (*)
| | +--- org.jetbrains.androidx.navigation:navigation-compose:2.9.0-beta03 (*)
| | +--- org.jetbrains.kotlinx:kotlinx-collections-immutable:0.3.8 (*)
| | +--- org.jetbrains.kotlinx:kotlinx-serialization-json:1.7.3 -> 1.8.0 (*)
| | +--- org.jetbrains.compose.ui:ui:1.8.2 (*)
| | +--- org.jetbrains.compose.foundation:foundation:1.8.2 (*)
| | +--- org.jetbrains.compose.material3:material3:1.8.2 (*)
| | +--- org.jetbrains.compose.components:components-resources:1.8.2 (*)
| | +--- org.jetbrains.compose.components:components-ui-tooling-preview:1.8.2 (*)
| | \--- project :core:common (*)
| \--- org.jetbrains.kotlin:kotlin-parcelize-runtime:2.1.20 (*)
+--- project :core:data (*)
+--- project :core:ui (*)
Expand Down
1 change: 1 addition & 0 deletions cmp-android/dependencies/prodReleaseRuntimeClasspath.txt
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@
:core:ui
:feature:accounts
:feature:auth
:feature:autopay
:feature:editpassword
:feature:faq
:feature:finance
Expand Down
2 changes: 1 addition & 1 deletion cmp-android/prodRelease-badging.txt
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package: name='org.mifospay' versionCode='1' versionName='2025.8.2-beta.0.3' platformBuildVersionName='15' platformBuildVersionCode='35' compileSdkVersion='35' compileSdkVersionCodename='15'
package: name='org.mifospay' versionCode='1' versionName='2025.8.4-beta.0.9' platformBuildVersionName='15' platformBuildVersionCode='35' compileSdkVersion='35' compileSdkVersionCodename='15'
minSdkVersion:'26'
targetSdkVersion:'34'
uses-permission: name='android.permission.INTERNET'
Expand Down
1 change: 1 addition & 0 deletions cmp-shared/build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -55,6 +55,7 @@ kotlin {
implementation(projects.feature.qr)
implementation(projects.feature.merchants)
implementation(projects.feature.upiSetup)
implementation(projects.feature.autopay)
}

desktopMain.dependencies {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,7 @@ import org.mifospay.core.network.di.LocalModule
import org.mifospay.core.network.di.NetworkModule
import org.mifospay.feature.accounts.di.AccountsModule
import org.mifospay.feature.auth.di.AuthModule
import org.mifospay.feature.autopay.di.AutoPayModule
import org.mifospay.feature.editpassword.di.EditPasswordModule
import org.mifospay.feature.faq.di.FaqModule
import org.mifospay.feature.history.di.HistoryModule
Expand Down Expand Up @@ -88,6 +89,7 @@ object KoinModules {
QrModule,
MerchantsModule,
UpiSetupModule,
AutoPayModule,
)
}
private val LibraryModule = module {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,17 @@ import org.mifospay.feature.accounts.savingsaccount.addEditSavingAccountScreen
import org.mifospay.feature.accounts.savingsaccount.details.navigateToSavingAccountDetails
import org.mifospay.feature.accounts.savingsaccount.details.savingAccountDetailRoute
import org.mifospay.feature.accounts.savingsaccount.navigateToSavingAccountAddEdit
import org.mifospay.feature.autopay.AutoPayScreen
import org.mifospay.feature.autopay.autoPayGraph
import org.mifospay.feature.autopay.navigateToAddBill
import org.mifospay.feature.autopay.navigateToAddBiller
import org.mifospay.feature.autopay.navigateToAutoPay
import org.mifospay.feature.autopay.navigateToAutoPayHistory
import org.mifospay.feature.autopay.navigateToAutoPayPreferences
import org.mifospay.feature.autopay.navigateToAutoPayScheduleDetails
import org.mifospay.feature.autopay.navigateToBillList
import org.mifospay.feature.autopay.navigateToBillerList
import org.mifospay.feature.autopay.navigateToScheduleManagement
import org.mifospay.feature.editpassword.navigation.editPasswordScreen
import org.mifospay.feature.editpassword.navigation.navigateToEditPassword
import org.mifospay.feature.faq.navigation.faqScreen
Expand Down Expand Up @@ -72,7 +83,12 @@ import org.mifospay.feature.savedcards.details.cardDetailRoute
import org.mifospay.feature.savedcards.details.navigateToCardDetails
import org.mifospay.feature.send.money.SendMoneyScreen
import org.mifospay.feature.send.money.navigation.SEND_MONEY_BASE_ROUTE
import org.mifospay.feature.send.money.navigation.SEND_MONEY_OPTIONS_ROUTE
import org.mifospay.feature.send.money.navigation.navigateToPayeeDetailsScreen
import org.mifospay.feature.send.money.navigation.navigateToSendMoneyOptionsScreen
import org.mifospay.feature.send.money.navigation.navigateToSendMoneyScreen
import org.mifospay.feature.send.money.navigation.payeeDetailsScreen
import org.mifospay.feature.send.money.navigation.sendMoneyOptionsScreen
import org.mifospay.feature.send.money.navigation.sendMoneyScreen
import org.mifospay.feature.settings.navigation.settingsScreen
import org.mifospay.feature.standing.instruction.StandingInstructionsScreen
Expand All @@ -97,6 +113,7 @@ internal fun MifosNavHost(
onBackClick = navController::navigateUp,
navigateToTransferScreen = navController::navigateToTransferScreen,
navigateToScanQrScreen = navController::navigateToScanQr,
navigateToPayeeDetails = navController::navigateToPayeeDetailsScreen,
showTopBar = false,
)
},
Expand All @@ -121,6 +138,35 @@ internal fun MifosNavHost(
navigateToInvoiceDetailScreen = navController::navigateToInvoiceDetail,
)
},
TabContent(PaymentsScreenContents.AUTOPAY.name) {
AutoPayScreen(
onNavigateToScheduleManagement = {
navController.navigateToScheduleManagement()
},
onNavigateToPreferences = {
navController.navigateToAutoPayPreferences()
},
onNavigateToHistory = {
navController.navigateToAutoPayHistory()
},
onNavigateToScheduleDetails = { scheduleId ->
navController.navigateToAutoPayScheduleDetails(scheduleId)
},
onNavigateToAddBiller = {
navController.navigateToAddBiller()
},
onNavigateToBillerList = {
navController.navigateToBillerList()
},
onNavigateToAddBill = {
navController.navigateToAddBill()
},
onNavigateToBillList = {
navController.navigateToBillList()
},
showTopBar = false,
)
},
)

val tabContents = listOf(
Expand Down Expand Up @@ -160,7 +206,10 @@ internal fun MifosNavHost(
onRequest = {
navController.navigateToShowQrScreen()
},
onPay = navController::navigateToSendMoneyScreen,
onPay = navController::navigateToSendMoneyOptionsScreen,
onAutoPay = {
navController.navigateToAutoPay()
},
navigateToTransactionDetail = navController::navigateToSpecificTransaction,
navigateToAccountDetail = navController::navigateToSavingAccountDetails,
)
Expand Down Expand Up @@ -279,12 +328,55 @@ internal fun MifosNavHost(
navigateBack = navController::navigateUp,
)

sendMoneyOptionsScreen(
onBackClick = navController::popBackStack,
onScanQrClick = {
// This is now handled by the ViewModel using ML Kit scanner
},
onPayAnyoneClick = {
// TODO: Navigate to Pay Anyone screen
},
onBankTransferClick = {
// TODO: Navigate to Bank Transfer screen
},
onFineractPaymentsClick = {
navController.navigateToSendMoneyScreen()
},
onAutoPayClick = {
navController.navigateToAutoPay()
},
onQrCodeScanned = { qrData ->
navController.navigateToSendMoneyScreen(
requestData = qrData,
navOptions = navOptions {
popUpTo(SEND_MONEY_OPTIONS_ROUTE) {
inclusive = true
}
},
)
},
onNavigateToPayeeDetails = { qrCodeData ->
navController.navigateToPayeeDetailsScreen(qrCodeData)
},
)

sendMoneyScreen(
onBackClick = navController::popBackStack,
navigateToTransferScreen = navController::navigateToTransferScreen,
navigateToPayeeDetailsScreen = navController::navigateToPayeeDetailsScreen,
navigateToScanQrScreen = navController::navigateToScanQr,
)

payeeDetailsScreen(
onBackClick = navController::popBackStack,
onNavigateToUpiPayment = { state ->
// TODO: Handle UPI payment navigation
},
onNavigateToFineractPayment = { state ->
// TODO: Handle Fineract payment navigation
},
)

transferScreen(
navigateBack = navController::popBackStack,
onTransferSuccess = {
Expand Down Expand Up @@ -322,6 +414,16 @@ internal fun MifosNavHost(
},
)
},
navigateToPayeeDetailsScreen = {
navController.navigateToPayeeDetailsScreen(
qrCodeData = it,
navOptions = navOptions {
popUpTo(SCAN_QR_ROUTE) {
inclusive = true
}
},
)
},
)

merchantTransferScreen(
Expand All @@ -332,5 +434,10 @@ internal fun MifosNavHost(
setupUpiPinScreen(
navigateBack = navController::navigateUp,
)

autoPayGraph(
navController = navController,
onNavigateBack = navController::navigateUp,
)
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,10 @@ import org.mifospay.core.common.MifosDispatchers
import org.mifospay.core.data.repository.AccountRepository
import org.mifospay.core.data.repository.AssetRepository
import org.mifospay.core.data.repository.AuthenticationRepository
import org.mifospay.core.data.repository.AutoPayHistoryRepository
import org.mifospay.core.data.repository.AutoPayRepository
import org.mifospay.core.data.repository.BeneficiaryRepository
import org.mifospay.core.data.repository.BillerRepository
import org.mifospay.core.data.repository.ClientRepository
import org.mifospay.core.data.repository.DocumentRepository
import org.mifospay.core.data.repository.InvoiceRepository
Expand All @@ -36,7 +39,10 @@ import org.mifospay.core.data.repository.UserRepository
import org.mifospay.core.data.repositoryImpl.AccountRepositoryImpl
import org.mifospay.core.data.repositoryImpl.AssetRepositoryImpl
import org.mifospay.core.data.repositoryImpl.AuthenticationRepositoryImpl
import org.mifospay.core.data.repositoryImpl.AutoPayHistoryRepositoryImpl
import org.mifospay.core.data.repositoryImpl.AutoPayRepositoryImpl
import org.mifospay.core.data.repositoryImpl.BeneficiaryRepositoryImpl
import org.mifospay.core.data.repositoryImpl.BillerRepositoryImpl
import org.mifospay.core.data.repositoryImpl.ClientRepositoryImpl
import org.mifospay.core.data.repositoryImpl.DocumentRepositoryImpl
import org.mifospay.core.data.repositoryImpl.InvoiceRepositoryImpl
Expand Down Expand Up @@ -93,6 +99,15 @@ val RepositoryModule = module {
}
single<TwoFactorAuthRepository> { TwoFactorAuthRepositoryImpl(get(), get(ioDispatcher)) }
single<UserRepository> { UserRepositoryImpl(get(), get(ioDispatcher)) }
single<AutoPayRepository> { AutoPayRepositoryImpl(get(), get(ioDispatcher)) }
single<AutoPayHistoryRepository> { AutoPayHistoryRepositoryImpl(get(), get(ioDispatcher)) }

// TODO: Switch to network-based implementation when APIs are finalized
// or use hybrid approach syncing local and remote data
// single<BillerRepository> { BillerRepositoryImpl(get(), get(ioDispatcher)) }

// Current local storage implementation
single<BillerRepository> { BillerRepositoryImpl(get(), get(ioDispatcher)) }

includes(platformModule)
single<PlatformDependentDataModule> { getPlatformDataModule }
Expand Down
Loading