From 9c0a9b684e628103e8894a9ed6a4a3d75a28867b Mon Sep 17 00:00:00 2001 From: Sk Niyaj Ali Date: Wed, 4 Sep 2024 19:19:33 +0530 Subject: [PATCH] Refactor- Final Cleanup (#2694) Jira Tasks - [MM-82](https://mifosforge.jira.com/browse/MM-82) --- .github/workflows/feature_branch_ci.yml | 186 +- .github/workflows/master_dev_ci.yml | 170 +- .gitignore | 6 - androidApp/build.gradle.kts | 186 +- .../releaseRuntimeClasspath.tree.txt | 1630 + .../dependencies/releaseRuntimeClasspath.txt | 278 + androidApp/lint-baseline.xml | 46876 ++++++++++++++++ androidApp/release-badging.txt | 138 + .../org/mifos/mobile/ApplicationTest.kt | 9 + androidApp/src/debug/res/values/api_keys.xml | 5 - androidApp/src/main/AndroidManifest.xml | 94 +- androidApp/src/main/ic_launcher-playstore.png | Bin 0 -> 57605 bytes .../org/mifos/mobile/MifosSelfServiceApp.kt | 51 - .../org/mifos/mobile/di/ApplicationModule.kt | 82 - .../ui/activities/BiometricAuthentication.kt | 78 - .../mobile/ui/activities/HomeActivity.kt | 135 - .../mobile/ui/activities/LoginActivity.kt | 33 - .../mobile/ui/activities/PassCodeActivity.kt | 35 - .../mobile/ui/activities/SplashActivity.kt | 20 - .../mobile/ui/views/BaseActivityCallback.kt | 13 - .../mobile/ui/widgets/ChargeAppWidget.kt | 64 - .../ui/widgets/ChargeWidgetDataProvider.kt | 110 - .../mobile/ui/widgets/ChargeWidgetService.kt | 14 - .../utils/CheckSelfPermissionAndRequest.kt | 152 - .../mifos/mobile/utils/ComparatorBasedOnId.kt | 24 - .../ConfigurationDialogFragmentCompat.kt | 130 - .../mobile/utils/ConfigurationPreference.kt | 44 - .../java/org/mifos/mobile/utils/DatePick.kt | 8 - .../EndlessRecyclerViewScrollListener.kt | 110 - .../mifos/mobile/utils/GuarantorUiState.kt | 28 - .../java/org/mifos/mobile/utils/ImageUtil.kt | 136 - .../org/mifos/mobile/utils/MFErrorParser.kt | 28 - .../org/mifos/mobile/utils/MaterialDialog.kt | 205 - .../org/mifos/mobile/utils/ProcessView.kt | 72 - .../org/mifos/mobile/utils/RetrofitUtils.kt | 24 - .../main/java/org/mifos/mobile/utils/RxBus.kt | 24 - .../java/org/mifos/mobile/utils/RxEvent.kt | 16 - .../mobile/utils/SavingsAccountUiState.kt | 31 - .../mifos/mobile/utils/ScrollFabBehavior.kt | 63 - .../org/mifos/mobile/utils/StatusUtils.kt | 70 - .../org/mifos/mobile/utils/TextDrawable.kt | 281 - .../java/org/mifos/mobile/utils/Toaster.kt | 56 - .../fcm/MifosFirebaseMessagingService.kt | 94 - .../utils/fcm/RegistrationIntentService.kt | 51 - .../kotlin/org/mifos/mobile/HomeActivity.kt | 105 + .../org/mifos/mobile/HomeActivityViewModel.kt | 50 + .../org/mifos/mobile/MifosSelfServiceApp.kt | 27 + .../mifos/mobile/navigation/MifosNavGraph.kt | 17 + .../mifos/mobile/navigation/MifosNavHost.kt} | 137 +- .../mobile/navigation/PasscodeNavGraph.kt | 42 + .../mifos/mobile/navigation/RootNavGraph.kt | 52 + .../kotlin/org/mifos/mobile/ui/MifosApp.kt | 90 + .../org/mifos/mobile/ui/MifosMobileState.kt | 62 + .../src/main/res/anim/check_animation.xml | 20 - .../ic_qrcode_scan_gray_dark.xml | 10 - .../example_appwidget_preview.png | Bin 3522 -> 0 bytes .../main/res/drawable-v21/animated_check.xml | 7 - .../drawable-v21/mifos_splash_screen_logo.png | Bin 28028 -> 0 bytes .../src/main/res/drawable/animated_check.xml | 5 - androidApp/src/main/res/drawable/bg_about.png | Bin 12047 -> 0 bytes .../res/drawable/ic_about_us_black_24dp.xml | 10 - .../ic_account_balance_black_24dp.xml | 9 - .../ic_account_balance_wallet_black_24dp.xml | 9 - ...t_balance_wallet_black_background_24dp.xml | 9 - .../main/res/drawable/ic_add_white_24dp.xml | 9 - .../main/res/drawable/ic_arrow_drop_down.xml | 10 - .../src/main/res/drawable/ic_arrow_up.xml | 5 - .../ic_assignment_turned_in_black_24dp.xml | 10 - .../drawable/ic_attach_money_black_24dp.xml | 9 - .../main/res/drawable/ic_backspace_48px.xml | 9 - .../drawable/ic_baseline_arrow_back_24.xml | 11 - .../res/drawable/ic_baseline_cloud_off_24.xml | 10 - .../res/drawable/ic_baseline_dark_mode_24.xml | 10 - .../drawable/ic_baseline_filter_list_24.xml | 10 - .../res/drawable/ic_beneficiaries_48px.xml | 9 - .../res/drawable/ic_beneficiary_add_48px.xml | 10 - .../res/drawable/ic_beneficiary_wrapper.xml | 4 - .../drawable/ic_border_color_black_24dp.xml | 13 - .../src/main/res/drawable/ic_cake_24dp.xml | 9 - .../src/main/res/drawable/ic_cake_wrapper.xml | 4 - .../src/main/res/drawable/ic_charges.xml | 46 - .../drawable/ic_check_circle_green_24px.xml | 20 - .../src/main/res/drawable/ic_clients.png | Bin 1001 -> 0 bytes .../drawable/ic_compare_arrows_black_24dp.xml | 9 - androidApp/src/main/res/drawable/ic_edit.xml | 13 - .../main/res/drawable/ic_edit_black_24dp.xml | 9 - .../src/main/res/drawable/ic_edit_wrapper.xml | 4 - .../main/res/drawable/ic_error_black_24dp.xml | 9 - .../drawable/ic_file_upload_black_24dp.xml | 11 - .../drawable/ic_filter_list_black_24dp.xml | 10 - .../src/main/res/drawable/ic_flash_off.xml | 11 - .../src/main/res/drawable/ic_flash_on.xml | 11 - .../src/main/res/drawable/ic_gender_24dp.xml | 45 - .../main/res/drawable/ic_gender_wrapper.xml | 4 - .../main/res/drawable/ic_help_black_24dp.xml | 9 - .../main/res/drawable/ic_info_black_24dp.xml | 9 - .../ic_keyboard_arrow_right_black_24dp.xml | 9 - .../main/res/drawable/ic_label_black_24dp.xml | 9 - androidApp/src/main/res/drawable/ic_loan.xml | 11 - .../res/drawable/ic_local_atm_black_24dp.xml | 10 - .../src/main/res/drawable/ic_location.xml | 9 - .../main/res/drawable/ic_location_wrapper.xml | 4 - .../src/main/res/drawable/ic_logout.xml | 10 - androidApp/src/main/res/drawable/ic_mail.xml | 9 - .../src/main/res/drawable/ic_mail_wrapper.xml | 4 - .../res/drawable/ic_notification_wrapper.xml | 4 - .../res/drawable/ic_person_black_24dp.xml | 9 - .../src/main/res/drawable/ic_phone_24dp.xml | 10 - .../main/res/drawable/ic_phone_wrapper.xml | 4 - .../src/main/res/drawable/ic_qrcode_scan.xml | 9 - .../ic_question_answer_black_24dp.xml | 9 - .../res/drawable/ic_refresh_black_24dp.xml | 9 - .../drawable/ic_report_problem_red_24px.xml | 12 - .../src/main/res/drawable/ic_search.png | Bin 855 -> 0 bytes .../src/main/res/drawable/ic_settings.xml | 9 - androidApp/src/main/res/drawable/ic_share.xml | 10 - .../main/res/drawable/ic_share_black_24dp.xml | 9 - .../main/res/drawable/ic_share_wrapper.xml | 4 - .../src/main/res/drawable/ic_success.xml | 12 - .../ic_supervisor_account_black_24dp.xml | 9 - .../main/res/drawable/ic_visibility_24px.xml | 13 - .../res/drawable/ic_visibility_off_24px.xml | 13 - .../drawable/ic_wrapped_lock_black_24dp.xml | 4 - .../drawable/ic_wrapped_person_black_24dp.xml | 4 - .../mifos_logo.png | Bin .../res/drawable/mifos_splash_screen_logo.png | Bin 0 -> 33661 bytes .../main/res/drawable/notification_circle.xml | 8 - .../main/res/drawable/rectangular_border.xml | 7 - .../src/main/res/drawable/round_corner.xml | 7 - androidApp/src/main/res/drawable/scrim.xml | 6 - .../main/res/drawable/splash_background.xml | 11 - .../src/main/res/drawable/splash_icon.xml | 21 + .../res/drawable/triangular_green_view.xml | 9 - .../main/res/drawable/triangular_red_view.xml | 10 - .../fragment_beneficiary_add_options.xml | 117 - .../res/layout/account_spinner_layout.xml | 23 - .../layout/action_bar_notification_layout.xml | 40 - .../src/main/res/layout/activity_accounts.xml | 25 - .../main/res/layout/activity_client_list.xml | 13 - .../main/res/layout/activity_container.xml | 22 - .../res/layout/activity_edit_user_detail.xml | 19 - .../src/main/res/layout/activity_home.xml | 28 - .../res/layout/activity_loan_application.xml | 17 - .../src/main/res/layout/activity_login.xml | 100 - .../main/res/layout/activity_notification.xml | 18 - .../res/layout/activity_privacy_policy.xml | 28 - .../main/res/layout/activity_registration.xml | 13 - .../activity_savings_account_application.xml | 11 - .../src/main/res/layout/activity_settings.xml | 16 - .../main/res/layout/activity_user_profile.xml | 5 - .../res/layout/beneficiary_spinner_layout.xml | 23 - .../layout/cell_loan_repayment_schedule.xml | 29 - .../src/main/res/layout/charge_app_widget.xml | 54 - .../main/res/layout/core_common_toolbar.xml | 17 - .../corner_view_loan_repayment_schedule.xml | 23 - .../src/main/res/layout/error_layout.xml | 178 - .../res/layout/fragment_account_overview.xml | 80 - .../src/main/res/layout/fragment_accounts.xml | 27 - .../res/layout/fragment_add_guarantor.xml | 71 - .../layout/fragment_add_loan_application.xml | 188 - .../fragment_beneficiary_add_options.xml | 116 - .../fragment_beneficiary_application.xml | 119 - .../layout/fragment_beneficiary_detail.xml | 141 - .../res/layout/fragment_beneficiary_list.xml | 34 - .../res/layout/fragment_client_accounts.xml | 34 - .../res/layout/fragment_client_charge.xml | 27 - .../res/layout/fragment_guarantor_detail.xml | 94 - .../res/layout/fragment_guarantor_list.xml | 35 - .../src/main/res/layout/fragment_help.xml | 65 - .../src/main/res/layout/fragment_home_old.xml | 415 - .../src/main/res/layout/fragment_home_ui.xml | 572 - .../layout/fragment_loan_account_details.xml | 363 - .../layout/fragment_loan_account_summary.xml | 467 - .../fragment_loan_account_transactions.xml | 42 - .../res/layout/fragment_loan_withdraw.xml | 85 - .../main/res/layout/fragment_locations.xml | 25 - .../main/res/layout/fragment_notification.xml | 31 - .../layout/fragment_recent_transactions.xml | 25 - .../fragment_registration_verification.xml | 41 - .../fragment_review_loan_application.xml | 171 - .../fragment_saving_account_details.xml | 414 - .../fragment_saving_account_transactions.xml | 50 - .../fragment_savings_account_application.xml | 94 - ...ment_savings_account_withdraw_fragment.xml | 102 - .../layout/fragment_savings_make_transfer.xml | 293 - .../layout/fragment_third_party_transfer.xml | 344 - .../res/layout/fragment_transfer_process.xml | 174 - .../main/res/layout/fragment_user_profile.xml | 365 - .../res/layout/item_widget_client_charge.xml | 43 - .../src/main/res/layout/layout_error.xml | 26 - .../main/res/layout/layout_filter_dialog.xml | 89 - .../src/main/res/layout/nav_drawer_header.xml | 30 - .../res/layout/preference_configuration.xml | 40 - .../src/main/res/layout/row_beneficiary.xml | 48 - .../src/main/res/layout/row_checkbox.xml | 8 - .../src/main/res/layout/row_client_charge.xml | 142 - .../src/main/res/layout/row_client_name.xml | 33 - .../src/main/res/layout/row_guarantor.xml | 33 - .../row_header_loan_repayment_schedule.xml | 36 - .../src/main/res/layout/row_loan_account.xml | 56 - .../src/main/res/layout/row_notification.xml | 51 - .../res/layout/row_recent_transaction.xml | 65 - .../main/res/layout/row_saving_account.xml | 56 - .../layout/row_saving_account_transaction.xml | 72 - .../src/main/res/layout/row_share_account.xml | 78 - androidApp/src/main/res/layout/toolbar.xml | 8 - androidApp/src/main/res/menu/edit_profile.xml | 8 - androidApp/src/main/res/menu/menu_account.xml | 45 - .../main/res/menu/menu_account_overview.xml | 11 - .../src/main/res/menu/menu_beneficiary.xml | 12 - .../src/main/res/menu/menu_guarantor.xml | 12 - androidApp/src/main/res/menu/menu_help.xml | 10 - .../main/res/menu/menu_help_bottom_bar.xml | 19 - .../src/main/res/menu/menu_loan_details.xml | 16 - androidApp/src/main/res/menu/menu_main.xml | 10 - .../src/main/res/menu/menu_nav_drawer.xml | 71 - .../main/res/menu/menu_qr_code_display.xml | 9 - .../menu/menu_saving_accounts_transaction.xml | 11 - .../res/menu/menu_savings_account_detail.xml | 17 - .../src/main/res/menu/menu_transfer.xml | 10 - .../res/mipmap-anydpi-v26/ic_launcher.xml | 14 + .../mipmap-anydpi-v26/ic_launcher_round.xml | 14 + .../src/main/res/mipmap-hdpi/ic_launcher.png | Bin 3418 -> 0 bytes .../src/main/res/mipmap-hdpi/ic_launcher.webp | Bin 0 -> 3344 bytes .../mipmap-hdpi/ic_launcher_foreground.webp | Bin 0 -> 6546 bytes .../res/mipmap-hdpi/ic_launcher_round.webp | Bin 0 -> 4884 bytes .../src/main/res/mipmap-hdpi/mifos_icon.png | Bin 28552 -> 0 bytes .../src/main/res/mipmap-mdpi/ic_launcher.png | Bin 2206 -> 0 bytes .../src/main/res/mipmap-mdpi/ic_launcher.webp | Bin 0 -> 2478 bytes .../mipmap-mdpi/ic_launcher_foreground.webp | Bin 0 -> 4212 bytes .../res/mipmap-mdpi/ic_launcher_round.webp | Bin 0 -> 3240 bytes .../src/main/res/mipmap-mdpi/mifos_icon.png | Bin 18888 -> 0 bytes .../src/main/res/mipmap-xhdpi/ic_launcher.png | Bin 4842 -> 0 bytes .../main/res/mipmap-xhdpi/ic_launcher.webp | Bin 0 -> 4618 bytes .../mipmap-xhdpi/ic_launcher_foreground.webp | Bin 0 -> 9334 bytes .../res/mipmap-xhdpi/ic_launcher_round.webp | Bin 0 -> 6732 bytes .../src/main/res/mipmap-xhdpi/mifos_icon.png | Bin 38929 -> 0 bytes .../main/res/mipmap-xxhdpi/ic_launcher.png | Bin 7718 -> 0 bytes .../main/res/mipmap-xxhdpi/ic_launcher.webp | Bin 0 -> 6652 bytes .../mipmap-xxhdpi/ic_launcher_foreground.webp | Bin 0 -> 16078 bytes .../res/mipmap-xxhdpi/ic_launcher_round.webp | Bin 0 -> 10238 bytes .../src/main/res/mipmap-xxhdpi/mifos_icon.png | Bin 60911 -> 0 bytes .../main/res/mipmap-xxxhdpi/ic_launcher.png | Bin 10486 -> 0 bytes .../main/res/mipmap-xxxhdpi/ic_launcher.webp | Bin 0 -> 8784 bytes .../ic_launcher_foreground.webp | Bin 0 -> 24830 bytes .../res/mipmap-xxxhdpi/ic_launcher_round.webp | Bin 0 -> 14318 bytes .../main/res/mipmap-xxxhdpi/mifos_icon.png | Bin 84947 -> 0 bytes androidApp/src/main/res/values-ar/strings.xml | 9 + androidApp/src/main/res/values-bn/strings.xml | 10 + androidApp/src/main/res/values-es/strings.xml | 10 + .../src/main/res/values-fa-rAF/strings.xml | 9 + androidApp/src/main/res/values-fr/strings.xml | 10 + androidApp/src/main/res/values-hi/strings.xml | 9 + androidApp/src/main/res/values-in/strings.xml | 10 + androidApp/src/main/res/values-km/strings.xml | 10 + androidApp/src/main/res/values-kn/strings.xml | 10 + androidApp/src/main/res/values-my/strings.xml | 9 + androidApp/src/main/res/values-pl/strings.xml | 10 + androidApp/src/main/res/values-pt/strings.xml | 10 + androidApp/src/main/res/values-ru/strings.xml | 10 + androidApp/src/main/res/values-sw/strings.xml | 10 + androidApp/src/main/res/values-te/strings.xml | 10 + androidApp/src/main/res/values-ur/strings.xml | 10 + androidApp/src/main/res/values/attr.xml | 16 - androidApp/src/main/res/values/colors.xml | 9 + androidApp/src/main/res/values/dimens.xml | 127 - .../res/values/ic_launcher_background.xml | 13 + androidApp/src/main/res/values/ids.xml | 4 - androidApp/src/main/res/values/splash.xml | 25 + androidApp/src/main/res/values/strings.xml | 11 + androidApp/src/main/res/values/styles.xml | 10 - .../src/main/res/values/styles_frame.xml | 15 - .../src/main/res/values/validations.xml | 7 - .../main/res/xml/charge_app_widget_info.xml | 10 - .../src/main/res/xml/fileproviderpath.xml | 9 + .../src/main/res/xml/settings_preference.xml | 43 - .../src/release/res/values/api_keys.xml | 10 + .../org/mifos/mobile/util/CheckUnSucess.kt | 16 - .../mifos/mobile/util/CoroutineTestRule.kt | 28 - .../mobile/util/RxSchedulersOverrideRule.kt | 45 - .../viewModels/AccountsViewModelTest.kt | 115 - .../viewModels/AddGuarantorViewModelTest.kt | 183 - .../BeneficiaryApplicationViewModelTest.kt | 206 - .../BeneficiaryDetailViewModelTest.kt | 80 - .../BeneficiaryListViewModelTest.kt | 96 - .../viewModels/ClientChargeViewModelTest.kt | 227 - .../GuarantorDetailViewModelTest.kt | 77 - .../viewModels/GuarantorListViewModelTest.kt | 75 - .../mobile/viewModels/HelpViewModelTest.kt | 61 - .../mobile/viewModels/HomeViewModelTest.kt | 149 - .../LoanAccountTransactionViewModelTest.kt | 114 - .../LoanAccountWithdrawViewModelTest.kt | 94 - .../LoanAccountsDetailViewModelTest.kt | 88 - .../LoanApplicationViewModelTest.kt | 123 - .../LoanRepaymentScheduleViewModelTest.kt | 96 - .../mobile/viewModels/LoginViewModelTest.kt | 206 - .../viewModels/NotificationViewModelTest.kt | 83 - .../RecentTransactionViewModelTest.kt | 165 - .../viewModels/RegistrationViewModelTest.kt | 216 - .../SavingAccountsDetailViewModelTest.kt | 99 - .../SavingAccountsTransactionViewModelTest.kt | 93 - .../SavingsAccountApplicationViewModelTest.kt | 268 - .../SavingsAccountWithdrawViewModelTest.kt | 105 - .../SavingsMakeTransferViewModelTest.kt | 90 - .../ThirdPartyTransferViewModelTest.kt | 205 - .../TransferProcessViewModelTest.kt | 114 - .../viewModels/UpdatePasswordViewModelTest.kt | 124 - .../viewModels/UserDetailViewModelTest.kt | 93 - build-logic/convention/build.gradle.kts | 32 + ...droidApplicationComposeConventionPlugin.kt | 4 +- .../AndroidApplicationConventionPlugin.kt | 5 + ...ndroidApplicationJacocoConventionPlugin.kt | 24 + .../kotlin/AndroidFeatureConventionPlugin.kt | 5 + .../AndroidLibraryComposeConventionPlugin.kt | 4 +- .../kotlin/AndroidLibraryConventionPlugin.kt | 4 + .../AndroidLibraryJacocoConventionPlugin.kt | 24 + .../kotlin/AndroidLintConventionPlugin.kt | 4 +- .../kotlin/MifosDetektConventionPlugin.kt | 22 + .../kotlin/MifosGitHooksConventionPlugin.kt | 54 + .../kotlin/MifosKtlintConventionPlugin.kt | 16 + .../kotlin/MifosSpotlessConventionPlugin.kt | 22 + .../kotlin/org/mifos/mobile/AndroidCompose.kt | 55 +- .../main/kotlin/org/mifos/mobile/Detekt.kt | 23 + .../main/kotlin/org/mifos/mobile/Jacoco.kt | 104 + .../kotlin/org/mifos/mobile/KotlinAndroid.kt | 49 +- .../org/mifos/mobile/ProjectExtensions.kt | 13 + .../main/kotlin/org/mifos/mobile/Spotless.kt | 31 + build-logic/settings.gradle.kts | 1 + build.gradle.kts | 57 +- ci-prebuild.bat => ci-prepush.bat | 4 +- ci-prebuild.sh => ci-prepush.sh | 4 +- compose_compiler_config.conf | 13 + .../mipmap-hdpi/core_common_mifos_icon.png | Bin 28552 -> 0 bytes .../mipmap-mdpi/core_common_mifos_icon.png | Bin 18888 -> 0 bytes .../mipmap-xhdpi/core_common_mifos_icon.png | Bin 38929 -> 0 bytes .../mipmap-xxhdpi/core_common_mifos_icon.png | Bin 60911 -> 0 bytes .../mipmap-xxxhdpi/core_common_mifos_icon.png | Bin 84947 -> 0 bytes core/data/build.gradle.kts | 28 +- core/data/src/main/AndroidManifest.xml | 4 +- .../mobile/core/data/di/RepositoryModule.kt | 14 + .../data/repository/UserDataRepository.kt | 22 + .../AuthenticationUserRepository.kt | 36 + .../ReviewLoanApplicationRepositoryImpl.kt | 2 +- .../ConnectivityManagerNetworkMonitor.kt | 76 + .../mobile/core/data/utils/NetworkMonitor.kt | 19 + .../repositories/AccountsRepositoryImpTest.kt | 29 +- .../BeneficiaryRepositoryImpTest.kt | 55 +- .../ClientChargeRepositoryImpTest.kt | 67 +- .../repositories/ClientRepositoryImpTest.kt | 59 +- .../GuarantorRepositoryImpTest.kt | 54 +- .../repositories/HomeRepositoryImpTest.kt | 31 +- .../repositories/LoanRepositoryImpTest.kt | 62 +- .../NotificationRepositoryImpTest.kt | 33 +- .../RecentTransactionRepositoryImpTest.kt | 33 +- .../SavingsAccountRepositoryImpTest.kt | 111 +- .../ThirdPartyTransferRepositoryImpTest.kt | 30 +- .../repositories/TransferRepositoryImpTest.kt | 37 +- .../repositories/UserAuthRepositoryImpTest.kt | 81 +- .../UserDetailRepositoryImpTest.kt | 45 +- core/datastore/build.gradle.kts | 2 +- core/designsystem/build.gradle.kts | 3 + .../designsystem/components/MifosTabPager.kt | 10 +- .../core/designsystem/icons/MifosIcons.kt | 24 +- .../designsystem/theme/BackgroundTheme.kt | 29 + .../designsystem/theme/MifosBackground.kt | 80 + core/logs/build.gradle.kts | 2 +- .../core/logs/di/FirebaseAnalyticsHelper.kt | 2 +- core/model/build.gradle.kts | 2 +- .../org/mifos/mobile/core/model/UserData.kt | 16 + core/network/build.gradle.kts | 9 +- core/qrcode/build.gradle.kts | 14 +- .../org/mifos/mobile/core/qr/BarcodeCamera.kt | 45 +- .../mifos/mobile/core/qr/QrCodeAnalyzer.kt | 24 +- .../mifos/mobile/core/qr/QrCodeGenerator.kt | 9 + {feature/login => core/testing}/.gitignore | 0 core/testing/README.md | 1 + core/testing/build.gradle.kts | 36 + core/testing/src/main/AndroidManifest.xml | 13 + .../mobile/core/testing/MifosTestRunner.kt | 21 + .../core/testing/di/TestDispatcherModule.kt | 26 + .../core/testing/di/TestDispatchersModule.kt | 37 + .../GrantPostNotificationsPermissionRule.kt | 22 + .../mobile/core/testing/util}/FakeJsonName.kt | 14 +- .../testing/util}/FakeRemoteDataSource.kt | 51 +- .../core/testing/util/MainDispatcherRule.kt | 31 + .../core/testing/util/TestAnalyticsHelper.kt | 24 + .../core/testing/util}/TestDataFactory.kt | 22 +- .../core/testing/util/TestNetworkMonitor.kt | 28 + .../mifos/mobile/core/testing/util/Util.kt | 40 + .../SavingsAccountWithAssociations.json | 0 .../resources/accountOptionTemplate.json | 0 .../src/main}/resources/beneficiaries.json | 0 .../resources/beneficiaryApplication.json | 0 .../main}/resources/beneficiaryPayload.json | 0 .../main}/resources/beneficiaryTemplate.json | 0 .../resources/beneficiaryUpdatePayload.json | 0 .../testing/src/main}/resources/charge.json | 0 .../testing/src/main}/resources/client.json | 0 .../src/main}/resources/clientAccounts.json | 0 .../main}/resources/clientLoanAccounts.json | 0 .../resources/clientSavingsAccounts.json | 0 .../main}/resources/clientShareAccounts.json | 0 .../testing/src/main}/resources/clients.json | 0 .../src/main}/resources/clientsNotFound.json | 0 .../src/main/resources/guarantorList.json | 0 .../src/main/resources/guarantorTemplate.json | 0 .../src/main}/resources/loanAccount.json | 0 ...loanAccountWithEmptyRepaymentSchedule.json | 0 .../loanAccountWithEmptyTransactions.json | 0 .../loanAccountWithRepaymentSchedule.json | 0 .../loanAccountWithTransactions.json | 0 .../src/main}/resources/loanCharge.json | 0 .../src/main}/resources/loanPayload.json | 0 .../src/main}/resources/loanTemplate.json | 0 .../resources/loanTemplateByProduct.json | 0 .../testing/src/main}/resources/login.json | 0 .../org.mockito.plugins.MockMaker | 0 .../testing/src/main}/resources/register.json | 0 .../src/main}/resources/savingCharge.json | 0 .../resources/savingsAccountTemplate.json | 0 .../src/main}/resources/transactions.json | 0 .../src/main}/resources/transferPayload.json | 0 .../resources/updatePasswordPayload.json | 0 .../testing/src/main}/resources/user.json | 0 .../src/main}/resources/userVerify.json | 0 core/ui/build.gradle.kts | 5 +- .../core/ui/component/MifosComposeView.kt | 28 - .../mifos/mobile/core/ui/utils/ColorUtils.kt | 11 +- .../mifos/mobile/core/ui/utils/ImageUtil.kt | 11 +- core/ui/src/main/res/values/colors.xml | 13 + .../mobile/feature/about/ui/AboutUsHeader.kt | 2 +- .../mobile/feature/about/ui/AboutUsScreen.kt | 3 +- .../res/drawable/feature_about_law_icon.xml | 1 - .../drawable/feature_about_privacy_policy.xml | 1 - .../drawable/feature_about_source_code.xml | 1 - .../res/drawable/feature_about_website.xml | 1 - .../src/main/res/drawable/mifos_logo.png | Bin feature/about/src/main/res/values/strings.xml | 3 +- feature/account/build.gradle.kts | 2 + .../screens/ClientAccountsScreen.kt | 7 +- .../feature/account/utils/StatusUtils.kt | 7 +- .../account/src/main/res/values/colors.xml | 9 + feature/auth/build.gradle.kts | 1 + .../auth/navigation/AuthenticationNavGraph.kt | 17 +- .../AuthenticationNavigationScreen.kt | 2 - .../main/res/drawable/feature_auth_lock.xml | 1 - feature/beneficiary/build.gradle.kts | 4 +- .../res/drawable/ic_beneficiary_add_48px.xml | 1 - .../drawable/ic_file_upload_black_24dp.xml | 1 - .../res/drawable/ic_qrcode_scan_gray_dark.xml | 1 - .../src/main/res/drawable/ic_charges.xml | 16 +- .../src/main/res/values/colors.xml | 13 + feature/guarantor/build.gradle.kts | 4 +- .../home/components/HomeNavigationDrawer.kt | 4 +- .../feature/home/screens/HomeContent.kt | 11 +- .../feature/home/viewmodel/HomeViewModel.kt | 65 +- .../ic_account_balance_black_24dp.xml | 2 +- .../ic_account_balance_wallet_black_24dp.xml | 2 +- .../res/drawable/ic_beneficiaries_48px.xml | 2 +- .../home/src/main/res/drawable/ic_charges.xml | 16 +- .../drawable/ic_compare_arrows_black_24dp.xml | 2 +- .../home/src/main/res/drawable/ic_loan.xml | 2 +- .../home/src/main/res/drawable/ic_logout.xml | 1 - .../src/main/res/drawable/ic_settings.xml | 2 +- .../src/main/res/drawable/ic_surveys_48px.xml | 2 +- .../main/res/drawable/ic_visibility_24px.xml | 2 +- .../res/drawable/ic_visibility_off_24px.xml | 2 +- .../LoanRepaymentScheduleScreen.kt | 7 +- .../ic_assignment_turned_in_black_24dp.xml | 1 - .../loan/src/main/res/drawable/ic_charges.xml | 16 +- .../drawable/ic_compare_arrows_black_24dp.xml | 2 +- .../src/main/res/drawable/ic_qrcode_scan.xml | 2 +- .../src/main/res/drawable/ic_surveys_48px.xml | 2 +- feature/login/build.gradle.kts | 19 - feature/login/consumer-rules.pro | 0 feature/login/proguard-rules.pro | 21 - .../feature/login/ExampleInstrumentedTest.kt | 24 - feature/login/src/main/AndroidManifest.xml | 4 - feature/login/src/main/res/values/strings.xml | 16 - .../mobile/feature/login/ExampleUnitTest.kt | 17 - .../main/res/drawable/ic_notifications.xml | 1 - feature/qr/build.gradle.kts | 4 +- .../feature/qr/components/CropContent.kt | 130 + .../feature/qr/components/CropErrorDialog.kt | 93 + .../feature/qr/navigation/QrNavGraph.kt | 4 +- .../qr/qrCodeImport/QrCodeImportScreen.kt | 180 +- feature/qr/src/main/res/values/strings.xml | 1 + .../res/drawable/ic_local_atm_black_24dp.xml | 1 - feature/registration/.gitignore | 1 - feature/registration/build.gradle.kts | 25 - feature/registration/consumer-rules.pro | 0 feature/registration/proguard-rules.pro | 21 - .../registration/ExampleInstrumentedTest.kt | 24 - .../registration/src/main/AndroidManifest.xml | 4 - .../src/main/res/values/strings.xml | 43 - .../src/main/res/values/validations.xml | 5 - .../src/main/res/values/values.xml | 5 - .../feature/registration/ExampleUnitTest.kt | 17 - .../src/main/res/drawable/ic_charges.xml | 16 +- .../drawable/ic_compare_arrows_black_24dp.xml | 2 +- .../src/main/res/drawable/ic_qrcode_scan.xml | 2 +- .../res/drawable/ic_baseline_dark_mode_24.xml | 1 - .../main/res/drawable/ic_lock_black_24dp.xml | 1 - feature/update-password/build.gradle.kts | 4 +- .../drawable/feature_update_password_lock.xml | 1 - .../src/main/res/drawable/ic_cake_24dp.xml | 2 +- .../src/main/res/drawable/ic_gender_24dp.xml | 26 +- .../src/main/res/drawable/ic_phone_24dp.xml | 2 +- gradle/libs.versions.toml | 226 +- gradle/wrapper/gradle-wrapper.properties | 2 +- libs/country-code-picker/build.gradle.kts | 2 +- .../src/main/AndroidManifest.xml | 2 +- .../countrycodepicker/CountryCodePicker.kt | 2 +- .../countrycodepicker/component/Autofill.kt | 2 +- .../component/CountryCodeDialog.kt | 2 +- .../component/CountryDialog.kt | 2 +- .../countrycodepicker/data/CountryData.kt | 2 +- .../data/utils/CountryCodeUtils.kt | 2 +- .../data/utils/CountryNameMap.kt | 2 +- .../data/utils/NumberHintMap.kt | 2 +- .../data/utils/SearchCountryList.kt | 2 +- .../data/utils/ValidatePhoneNumber.kt | 2 +- .../PhoneNumberTransformation.kt | 2 +- .../src/main/res/values-ar/strings.xml | 2 +- .../src/main/res/values-es/strings.xml | 2 +- .../src/main/res/values-fr/strings.xml | 2 +- .../src/main/res/values-hi/strings.xml | 2 +- .../src/main/res/values-it-rIT/strings.xml | 2 +- .../src/main/res/values-nl/strings.xml | 2 +- .../src/main/res/values-ru-rRU/strings.xml | 2 +- .../src/main/res/values-so/strings.xml | 2 +- .../src/main/res/values-tr-rTR/strings.xml | 2 +- .../src/main/res/values-zh/strings.xml | 2 +- .../src/main/res/values/strings.xml | 2 +- libs/material3-navigation/build.gradle.kts | 2 +- .../src/main/AndroidManifest.xml | 2 +- .../material3/navigation/BottomSheet.kt | 2 +- .../navigation/BottomSheetNavigator.kt | 2 +- .../BottomSheetNavigatorDestinationBuilder.kt | 2 +- .../material3/navigation/NavGraphBuilder.kt | 2 +- libs/mifos-passcode/build.gradle.kts | 2 +- .../src/main/AndroidManifest.xml | 2 +- .../mifos/library/passcode/PassCodeScreen.kt | 2 +- .../library/passcode/PasscodeNavigation.kt | 2 +- .../library/passcode/component/MifosIcon.kt | 2 +- .../passcode/component/PasscodeButton.kt | 2 +- .../passcode/component/PasscodeHeader.kt | 2 +- .../passcode/component/PasscodeKeys.kt | 2 +- .../component/PasscodeMismatchedDialog.kt | 2 +- .../component/PasscodeStepIndicator.kt | 2 +- .../passcode/component/PasscodeToolbar.kt | 2 +- .../library/passcode/data/PasscodeManager.kt | 2 +- .../passcode/data/PasscodeRepository.kt | 2 +- .../passcode/data/PasscodeRepositoryImpl.kt | 2 +- .../library/passcode/di/ApplicationModule.kt | 2 +- .../org/mifos/library/passcode/theme/Color.kt | 2 +- .../org/mifos/library/passcode/theme/Font.kt | 2 +- .../org/mifos/library/passcode/theme/Theme.kt | 2 +- .../org/mifos/library/passcode/theme/Type.kt | 2 +- .../library/passcode/utility/Constants.kt | 2 +- .../passcode/utility/PreferenceManager.kt | 2 +- .../passcode/utility/ShakeAnimation.kt | 2 +- .../mifos/library/passcode/utility/Step.kt | 2 +- .../passcode/utility/VibrationFeedback.kt | 2 +- .../passcode/viewmodels/PasscodeViewModel.kt | 2 +- .../lib_mifos_passcode_delete_forever.xml | 2 +- .../drawable/lib_mifos_passcode_ic_delete.xml | 2 +- .../src/main/res/values/strings.xml | 2 +- libs/pullrefresh/build.gradle.kts | 2 +- libs/pullrefresh/src/main/AndroidManifest.xml | 2 +- .../PullRefresh.kt | 2 +- .../PullRefreshIndicator.kt | 2 +- .../PullRefreshIndicatorTransform.kt | 2 +- .../PullRefreshState.kt | 2 +- lint/build.gradle.kts | 2 - scripts/pre-commit.sh | 91 + scripts/pre-push.sh | 93 + settings.gradle.kts | 3 +- shared/build.gradle.kts | 3 +- 579 files changed, 52556 insertions(+), 15674 deletions(-) create mode 100644 androidApp/dependencies/releaseRuntimeClasspath.tree.txt create mode 100644 androidApp/dependencies/releaseRuntimeClasspath.txt create mode 100644 androidApp/lint-baseline.xml create mode 100644 androidApp/release-badging.txt rename androidApp/src/androidTest/{java => kotlin}/org/mifos/mobile/ApplicationTest.kt (63%) delete mode 100644 androidApp/src/debug/res/values/api_keys.xml create mode 100644 androidApp/src/main/ic_launcher-playstore.png delete mode 100644 androidApp/src/main/java/org/mifos/mobile/MifosSelfServiceApp.kt delete mode 100644 androidApp/src/main/java/org/mifos/mobile/di/ApplicationModule.kt delete mode 100644 androidApp/src/main/java/org/mifos/mobile/ui/activities/BiometricAuthentication.kt delete mode 100644 androidApp/src/main/java/org/mifos/mobile/ui/activities/HomeActivity.kt delete mode 100644 androidApp/src/main/java/org/mifos/mobile/ui/activities/LoginActivity.kt delete mode 100644 androidApp/src/main/java/org/mifos/mobile/ui/activities/PassCodeActivity.kt delete mode 100644 androidApp/src/main/java/org/mifos/mobile/ui/activities/SplashActivity.kt delete mode 100644 androidApp/src/main/java/org/mifos/mobile/ui/views/BaseActivityCallback.kt delete mode 100644 androidApp/src/main/java/org/mifos/mobile/ui/widgets/ChargeAppWidget.kt delete mode 100644 androidApp/src/main/java/org/mifos/mobile/ui/widgets/ChargeWidgetDataProvider.kt delete mode 100644 androidApp/src/main/java/org/mifos/mobile/ui/widgets/ChargeWidgetService.kt delete mode 100644 androidApp/src/main/java/org/mifos/mobile/utils/CheckSelfPermissionAndRequest.kt delete mode 100644 androidApp/src/main/java/org/mifos/mobile/utils/ComparatorBasedOnId.kt delete mode 100644 androidApp/src/main/java/org/mifos/mobile/utils/ConfigurationDialogFragmentCompat.kt delete mode 100644 androidApp/src/main/java/org/mifos/mobile/utils/ConfigurationPreference.kt delete mode 100644 androidApp/src/main/java/org/mifos/mobile/utils/DatePick.kt delete mode 100644 androidApp/src/main/java/org/mifos/mobile/utils/EndlessRecyclerViewScrollListener.kt delete mode 100644 androidApp/src/main/java/org/mifos/mobile/utils/GuarantorUiState.kt delete mode 100644 androidApp/src/main/java/org/mifos/mobile/utils/ImageUtil.kt delete mode 100644 androidApp/src/main/java/org/mifos/mobile/utils/MFErrorParser.kt delete mode 100644 androidApp/src/main/java/org/mifos/mobile/utils/MaterialDialog.kt delete mode 100644 androidApp/src/main/java/org/mifos/mobile/utils/ProcessView.kt delete mode 100644 androidApp/src/main/java/org/mifos/mobile/utils/RetrofitUtils.kt delete mode 100644 androidApp/src/main/java/org/mifos/mobile/utils/RxBus.kt delete mode 100644 androidApp/src/main/java/org/mifos/mobile/utils/RxEvent.kt delete mode 100644 androidApp/src/main/java/org/mifos/mobile/utils/SavingsAccountUiState.kt delete mode 100644 androidApp/src/main/java/org/mifos/mobile/utils/ScrollFabBehavior.kt delete mode 100644 androidApp/src/main/java/org/mifos/mobile/utils/StatusUtils.kt delete mode 100644 androidApp/src/main/java/org/mifos/mobile/utils/TextDrawable.kt delete mode 100644 androidApp/src/main/java/org/mifos/mobile/utils/Toaster.kt delete mode 100644 androidApp/src/main/java/org/mifos/mobile/utils/fcm/MifosFirebaseMessagingService.kt delete mode 100644 androidApp/src/main/java/org/mifos/mobile/utils/fcm/RegistrationIntentService.kt create mode 100644 androidApp/src/main/kotlin/org/mifos/mobile/HomeActivity.kt create mode 100644 androidApp/src/main/kotlin/org/mifos/mobile/HomeActivityViewModel.kt create mode 100644 androidApp/src/main/kotlin/org/mifos/mobile/MifosSelfServiceApp.kt create mode 100644 androidApp/src/main/kotlin/org/mifos/mobile/navigation/MifosNavGraph.kt rename androidApp/src/main/{java/org/mifos/mobile/navigation/MifosNavGraph.kt => kotlin/org/mifos/mobile/navigation/MifosNavHost.kt} (76%) create mode 100644 androidApp/src/main/kotlin/org/mifos/mobile/navigation/PasscodeNavGraph.kt create mode 100644 androidApp/src/main/kotlin/org/mifos/mobile/navigation/RootNavGraph.kt create mode 100644 androidApp/src/main/kotlin/org/mifos/mobile/ui/MifosApp.kt create mode 100644 androidApp/src/main/kotlin/org/mifos/mobile/ui/MifosMobileState.kt delete mode 100644 androidApp/src/main/res/anim/check_animation.xml delete mode 100644 androidApp/src/main/res/drawable-hdpi/ic_qrcode_scan_gray_dark.xml delete mode 100644 androidApp/src/main/res/drawable-nodpi/example_appwidget_preview.png delete mode 100644 androidApp/src/main/res/drawable-v21/animated_check.xml delete mode 100644 androidApp/src/main/res/drawable-v21/mifos_splash_screen_logo.png delete mode 100644 androidApp/src/main/res/drawable/animated_check.xml delete mode 100644 androidApp/src/main/res/drawable/bg_about.png delete mode 100644 androidApp/src/main/res/drawable/ic_about_us_black_24dp.xml delete mode 100644 androidApp/src/main/res/drawable/ic_account_balance_black_24dp.xml delete mode 100644 androidApp/src/main/res/drawable/ic_account_balance_wallet_black_24dp.xml delete mode 100644 androidApp/src/main/res/drawable/ic_account_balance_wallet_black_background_24dp.xml delete mode 100644 androidApp/src/main/res/drawable/ic_add_white_24dp.xml delete mode 100644 androidApp/src/main/res/drawable/ic_arrow_drop_down.xml delete mode 100644 androidApp/src/main/res/drawable/ic_arrow_up.xml delete mode 100644 androidApp/src/main/res/drawable/ic_assignment_turned_in_black_24dp.xml delete mode 100644 androidApp/src/main/res/drawable/ic_attach_money_black_24dp.xml delete mode 100644 androidApp/src/main/res/drawable/ic_backspace_48px.xml delete mode 100644 androidApp/src/main/res/drawable/ic_baseline_arrow_back_24.xml delete mode 100644 androidApp/src/main/res/drawable/ic_baseline_cloud_off_24.xml delete mode 100644 androidApp/src/main/res/drawable/ic_baseline_dark_mode_24.xml delete mode 100644 androidApp/src/main/res/drawable/ic_baseline_filter_list_24.xml delete mode 100644 androidApp/src/main/res/drawable/ic_beneficiaries_48px.xml delete mode 100644 androidApp/src/main/res/drawable/ic_beneficiary_add_48px.xml delete mode 100644 androidApp/src/main/res/drawable/ic_beneficiary_wrapper.xml delete mode 100644 androidApp/src/main/res/drawable/ic_border_color_black_24dp.xml delete mode 100644 androidApp/src/main/res/drawable/ic_cake_24dp.xml delete mode 100644 androidApp/src/main/res/drawable/ic_cake_wrapper.xml delete mode 100644 androidApp/src/main/res/drawable/ic_charges.xml delete mode 100644 androidApp/src/main/res/drawable/ic_check_circle_green_24px.xml delete mode 100644 androidApp/src/main/res/drawable/ic_clients.png delete mode 100644 androidApp/src/main/res/drawable/ic_compare_arrows_black_24dp.xml delete mode 100644 androidApp/src/main/res/drawable/ic_edit.xml delete mode 100644 androidApp/src/main/res/drawable/ic_edit_black_24dp.xml delete mode 100644 androidApp/src/main/res/drawable/ic_edit_wrapper.xml delete mode 100644 androidApp/src/main/res/drawable/ic_error_black_24dp.xml delete mode 100644 androidApp/src/main/res/drawable/ic_file_upload_black_24dp.xml delete mode 100644 androidApp/src/main/res/drawable/ic_filter_list_black_24dp.xml delete mode 100644 androidApp/src/main/res/drawable/ic_flash_off.xml delete mode 100644 androidApp/src/main/res/drawable/ic_flash_on.xml delete mode 100644 androidApp/src/main/res/drawable/ic_gender_24dp.xml delete mode 100644 androidApp/src/main/res/drawable/ic_gender_wrapper.xml delete mode 100644 androidApp/src/main/res/drawable/ic_help_black_24dp.xml delete mode 100644 androidApp/src/main/res/drawable/ic_info_black_24dp.xml delete mode 100644 androidApp/src/main/res/drawable/ic_keyboard_arrow_right_black_24dp.xml delete mode 100644 androidApp/src/main/res/drawable/ic_label_black_24dp.xml delete mode 100644 androidApp/src/main/res/drawable/ic_loan.xml delete mode 100644 androidApp/src/main/res/drawable/ic_local_atm_black_24dp.xml delete mode 100644 androidApp/src/main/res/drawable/ic_location.xml delete mode 100644 androidApp/src/main/res/drawable/ic_location_wrapper.xml delete mode 100644 androidApp/src/main/res/drawable/ic_logout.xml delete mode 100644 androidApp/src/main/res/drawable/ic_mail.xml delete mode 100644 androidApp/src/main/res/drawable/ic_mail_wrapper.xml delete mode 100644 androidApp/src/main/res/drawable/ic_notification_wrapper.xml delete mode 100644 androidApp/src/main/res/drawable/ic_person_black_24dp.xml delete mode 100644 androidApp/src/main/res/drawable/ic_phone_24dp.xml delete mode 100644 androidApp/src/main/res/drawable/ic_phone_wrapper.xml delete mode 100644 androidApp/src/main/res/drawable/ic_qrcode_scan.xml delete mode 100644 androidApp/src/main/res/drawable/ic_question_answer_black_24dp.xml delete mode 100644 androidApp/src/main/res/drawable/ic_refresh_black_24dp.xml delete mode 100644 androidApp/src/main/res/drawable/ic_report_problem_red_24px.xml delete mode 100644 androidApp/src/main/res/drawable/ic_search.png delete mode 100644 androidApp/src/main/res/drawable/ic_settings.xml delete mode 100644 androidApp/src/main/res/drawable/ic_share.xml delete mode 100644 androidApp/src/main/res/drawable/ic_share_black_24dp.xml delete mode 100644 androidApp/src/main/res/drawable/ic_share_wrapper.xml delete mode 100644 androidApp/src/main/res/drawable/ic_success.xml delete mode 100644 androidApp/src/main/res/drawable/ic_supervisor_account_black_24dp.xml delete mode 100644 androidApp/src/main/res/drawable/ic_visibility_24px.xml delete mode 100644 androidApp/src/main/res/drawable/ic_visibility_off_24px.xml delete mode 100644 androidApp/src/main/res/drawable/ic_wrapped_lock_black_24dp.xml delete mode 100644 androidApp/src/main/res/drawable/ic_wrapped_person_black_24dp.xml rename androidApp/src/main/res/{drawable-hdpi => drawable}/mifos_logo.png (100%) create mode 100644 androidApp/src/main/res/drawable/mifos_splash_screen_logo.png delete mode 100644 androidApp/src/main/res/drawable/notification_circle.xml delete mode 100644 androidApp/src/main/res/drawable/rectangular_border.xml delete mode 100644 androidApp/src/main/res/drawable/round_corner.xml delete mode 100644 androidApp/src/main/res/drawable/scrim.xml delete mode 100644 androidApp/src/main/res/drawable/splash_background.xml create mode 100644 androidApp/src/main/res/drawable/splash_icon.xml delete mode 100644 androidApp/src/main/res/drawable/triangular_green_view.xml delete mode 100644 androidApp/src/main/res/drawable/triangular_red_view.xml delete mode 100644 androidApp/src/main/res/layout-land/fragment_beneficiary_add_options.xml delete mode 100644 androidApp/src/main/res/layout/account_spinner_layout.xml delete mode 100644 androidApp/src/main/res/layout/action_bar_notification_layout.xml delete mode 100644 androidApp/src/main/res/layout/activity_accounts.xml delete mode 100644 androidApp/src/main/res/layout/activity_client_list.xml delete mode 100644 androidApp/src/main/res/layout/activity_container.xml delete mode 100644 androidApp/src/main/res/layout/activity_edit_user_detail.xml delete mode 100644 androidApp/src/main/res/layout/activity_home.xml delete mode 100644 androidApp/src/main/res/layout/activity_loan_application.xml delete mode 100644 androidApp/src/main/res/layout/activity_login.xml delete mode 100644 androidApp/src/main/res/layout/activity_notification.xml delete mode 100644 androidApp/src/main/res/layout/activity_privacy_policy.xml delete mode 100644 androidApp/src/main/res/layout/activity_registration.xml delete mode 100644 androidApp/src/main/res/layout/activity_savings_account_application.xml delete mode 100644 androidApp/src/main/res/layout/activity_settings.xml delete mode 100644 androidApp/src/main/res/layout/activity_user_profile.xml delete mode 100644 androidApp/src/main/res/layout/beneficiary_spinner_layout.xml delete mode 100644 androidApp/src/main/res/layout/cell_loan_repayment_schedule.xml delete mode 100644 androidApp/src/main/res/layout/charge_app_widget.xml delete mode 100644 androidApp/src/main/res/layout/core_common_toolbar.xml delete mode 100644 androidApp/src/main/res/layout/corner_view_loan_repayment_schedule.xml delete mode 100644 androidApp/src/main/res/layout/error_layout.xml delete mode 100644 androidApp/src/main/res/layout/fragment_account_overview.xml delete mode 100644 androidApp/src/main/res/layout/fragment_accounts.xml delete mode 100644 androidApp/src/main/res/layout/fragment_add_guarantor.xml delete mode 100644 androidApp/src/main/res/layout/fragment_add_loan_application.xml delete mode 100644 androidApp/src/main/res/layout/fragment_beneficiary_add_options.xml delete mode 100644 androidApp/src/main/res/layout/fragment_beneficiary_application.xml delete mode 100644 androidApp/src/main/res/layout/fragment_beneficiary_detail.xml delete mode 100644 androidApp/src/main/res/layout/fragment_beneficiary_list.xml delete mode 100644 androidApp/src/main/res/layout/fragment_client_accounts.xml delete mode 100644 androidApp/src/main/res/layout/fragment_client_charge.xml delete mode 100644 androidApp/src/main/res/layout/fragment_guarantor_detail.xml delete mode 100644 androidApp/src/main/res/layout/fragment_guarantor_list.xml delete mode 100644 androidApp/src/main/res/layout/fragment_help.xml delete mode 100644 androidApp/src/main/res/layout/fragment_home_old.xml delete mode 100644 androidApp/src/main/res/layout/fragment_home_ui.xml delete mode 100644 androidApp/src/main/res/layout/fragment_loan_account_details.xml delete mode 100644 androidApp/src/main/res/layout/fragment_loan_account_summary.xml delete mode 100644 androidApp/src/main/res/layout/fragment_loan_account_transactions.xml delete mode 100644 androidApp/src/main/res/layout/fragment_loan_withdraw.xml delete mode 100644 androidApp/src/main/res/layout/fragment_locations.xml delete mode 100644 androidApp/src/main/res/layout/fragment_notification.xml delete mode 100644 androidApp/src/main/res/layout/fragment_recent_transactions.xml delete mode 100644 androidApp/src/main/res/layout/fragment_registration_verification.xml delete mode 100644 androidApp/src/main/res/layout/fragment_review_loan_application.xml delete mode 100644 androidApp/src/main/res/layout/fragment_saving_account_details.xml delete mode 100644 androidApp/src/main/res/layout/fragment_saving_account_transactions.xml delete mode 100644 androidApp/src/main/res/layout/fragment_savings_account_application.xml delete mode 100644 androidApp/src/main/res/layout/fragment_savings_account_withdraw_fragment.xml delete mode 100644 androidApp/src/main/res/layout/fragment_savings_make_transfer.xml delete mode 100644 androidApp/src/main/res/layout/fragment_third_party_transfer.xml delete mode 100644 androidApp/src/main/res/layout/fragment_transfer_process.xml delete mode 100644 androidApp/src/main/res/layout/fragment_user_profile.xml delete mode 100644 androidApp/src/main/res/layout/item_widget_client_charge.xml delete mode 100644 androidApp/src/main/res/layout/layout_error.xml delete mode 100644 androidApp/src/main/res/layout/layout_filter_dialog.xml delete mode 100644 androidApp/src/main/res/layout/nav_drawer_header.xml delete mode 100644 androidApp/src/main/res/layout/preference_configuration.xml delete mode 100644 androidApp/src/main/res/layout/row_beneficiary.xml delete mode 100644 androidApp/src/main/res/layout/row_checkbox.xml delete mode 100644 androidApp/src/main/res/layout/row_client_charge.xml delete mode 100644 androidApp/src/main/res/layout/row_client_name.xml delete mode 100644 androidApp/src/main/res/layout/row_guarantor.xml delete mode 100644 androidApp/src/main/res/layout/row_header_loan_repayment_schedule.xml delete mode 100644 androidApp/src/main/res/layout/row_loan_account.xml delete mode 100644 androidApp/src/main/res/layout/row_notification.xml delete mode 100644 androidApp/src/main/res/layout/row_recent_transaction.xml delete mode 100644 androidApp/src/main/res/layout/row_saving_account.xml delete mode 100644 androidApp/src/main/res/layout/row_saving_account_transaction.xml delete mode 100644 androidApp/src/main/res/layout/row_share_account.xml delete mode 100644 androidApp/src/main/res/layout/toolbar.xml delete mode 100644 androidApp/src/main/res/menu/edit_profile.xml delete mode 100644 androidApp/src/main/res/menu/menu_account.xml delete mode 100644 androidApp/src/main/res/menu/menu_account_overview.xml delete mode 100644 androidApp/src/main/res/menu/menu_beneficiary.xml delete mode 100644 androidApp/src/main/res/menu/menu_guarantor.xml delete mode 100644 androidApp/src/main/res/menu/menu_help.xml delete mode 100644 androidApp/src/main/res/menu/menu_help_bottom_bar.xml delete mode 100644 androidApp/src/main/res/menu/menu_loan_details.xml delete mode 100644 androidApp/src/main/res/menu/menu_main.xml delete mode 100644 androidApp/src/main/res/menu/menu_nav_drawer.xml delete mode 100644 androidApp/src/main/res/menu/menu_qr_code_display.xml delete mode 100644 androidApp/src/main/res/menu/menu_saving_accounts_transaction.xml delete mode 100644 androidApp/src/main/res/menu/menu_savings_account_detail.xml delete mode 100644 androidApp/src/main/res/menu/menu_transfer.xml create mode 100644 androidApp/src/main/res/mipmap-anydpi-v26/ic_launcher.xml create mode 100644 androidApp/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml delete mode 100644 androidApp/src/main/res/mipmap-hdpi/ic_launcher.png create mode 100644 androidApp/src/main/res/mipmap-hdpi/ic_launcher.webp create mode 100644 androidApp/src/main/res/mipmap-hdpi/ic_launcher_foreground.webp create mode 100644 androidApp/src/main/res/mipmap-hdpi/ic_launcher_round.webp delete mode 100644 androidApp/src/main/res/mipmap-hdpi/mifos_icon.png delete mode 100644 androidApp/src/main/res/mipmap-mdpi/ic_launcher.png create mode 100644 androidApp/src/main/res/mipmap-mdpi/ic_launcher.webp create mode 100644 androidApp/src/main/res/mipmap-mdpi/ic_launcher_foreground.webp create mode 100644 androidApp/src/main/res/mipmap-mdpi/ic_launcher_round.webp delete mode 100644 androidApp/src/main/res/mipmap-mdpi/mifos_icon.png delete mode 100644 androidApp/src/main/res/mipmap-xhdpi/ic_launcher.png create mode 100644 androidApp/src/main/res/mipmap-xhdpi/ic_launcher.webp create mode 100644 androidApp/src/main/res/mipmap-xhdpi/ic_launcher_foreground.webp create mode 100644 androidApp/src/main/res/mipmap-xhdpi/ic_launcher_round.webp delete mode 100644 androidApp/src/main/res/mipmap-xhdpi/mifos_icon.png delete mode 100644 androidApp/src/main/res/mipmap-xxhdpi/ic_launcher.png create mode 100644 androidApp/src/main/res/mipmap-xxhdpi/ic_launcher.webp create mode 100644 androidApp/src/main/res/mipmap-xxhdpi/ic_launcher_foreground.webp create mode 100644 androidApp/src/main/res/mipmap-xxhdpi/ic_launcher_round.webp delete mode 100644 androidApp/src/main/res/mipmap-xxhdpi/mifos_icon.png delete mode 100644 androidApp/src/main/res/mipmap-xxxhdpi/ic_launcher.png create mode 100644 androidApp/src/main/res/mipmap-xxxhdpi/ic_launcher.webp create mode 100644 androidApp/src/main/res/mipmap-xxxhdpi/ic_launcher_foreground.webp create mode 100644 androidApp/src/main/res/mipmap-xxxhdpi/ic_launcher_round.webp delete mode 100644 androidApp/src/main/res/mipmap-xxxhdpi/mifos_icon.png delete mode 100644 androidApp/src/main/res/values/attr.xml delete mode 100644 androidApp/src/main/res/values/dimens.xml create mode 100644 androidApp/src/main/res/values/ic_launcher_background.xml delete mode 100644 androidApp/src/main/res/values/ids.xml create mode 100644 androidApp/src/main/res/values/splash.xml delete mode 100644 androidApp/src/main/res/values/styles.xml delete mode 100644 androidApp/src/main/res/values/styles_frame.xml delete mode 100644 androidApp/src/main/res/values/validations.xml delete mode 100644 androidApp/src/main/res/xml/charge_app_widget_info.xml delete mode 100644 androidApp/src/main/res/xml/settings_preference.xml delete mode 100644 androidApp/src/test/java/org/mifos/mobile/util/CheckUnSucess.kt delete mode 100644 androidApp/src/test/java/org/mifos/mobile/util/CoroutineTestRule.kt delete mode 100644 androidApp/src/test/java/org/mifos/mobile/util/RxSchedulersOverrideRule.kt delete mode 100644 androidApp/src/test/java/org/mifos/mobile/viewModels/AccountsViewModelTest.kt delete mode 100644 androidApp/src/test/java/org/mifos/mobile/viewModels/AddGuarantorViewModelTest.kt delete mode 100644 androidApp/src/test/java/org/mifos/mobile/viewModels/BeneficiaryApplicationViewModelTest.kt delete mode 100644 androidApp/src/test/java/org/mifos/mobile/viewModels/BeneficiaryDetailViewModelTest.kt delete mode 100644 androidApp/src/test/java/org/mifos/mobile/viewModels/BeneficiaryListViewModelTest.kt delete mode 100644 androidApp/src/test/java/org/mifos/mobile/viewModels/ClientChargeViewModelTest.kt delete mode 100644 androidApp/src/test/java/org/mifos/mobile/viewModels/GuarantorDetailViewModelTest.kt delete mode 100644 androidApp/src/test/java/org/mifos/mobile/viewModels/GuarantorListViewModelTest.kt delete mode 100644 androidApp/src/test/java/org/mifos/mobile/viewModels/HelpViewModelTest.kt delete mode 100644 androidApp/src/test/java/org/mifos/mobile/viewModels/HomeViewModelTest.kt delete mode 100644 androidApp/src/test/java/org/mifos/mobile/viewModels/LoanAccountTransactionViewModelTest.kt delete mode 100644 androidApp/src/test/java/org/mifos/mobile/viewModels/LoanAccountWithdrawViewModelTest.kt delete mode 100644 androidApp/src/test/java/org/mifos/mobile/viewModels/LoanAccountsDetailViewModelTest.kt delete mode 100644 androidApp/src/test/java/org/mifos/mobile/viewModels/LoanApplicationViewModelTest.kt delete mode 100644 androidApp/src/test/java/org/mifos/mobile/viewModels/LoanRepaymentScheduleViewModelTest.kt delete mode 100644 androidApp/src/test/java/org/mifos/mobile/viewModels/LoginViewModelTest.kt delete mode 100644 androidApp/src/test/java/org/mifos/mobile/viewModels/NotificationViewModelTest.kt delete mode 100644 androidApp/src/test/java/org/mifos/mobile/viewModels/RecentTransactionViewModelTest.kt delete mode 100644 androidApp/src/test/java/org/mifos/mobile/viewModels/RegistrationViewModelTest.kt delete mode 100644 androidApp/src/test/java/org/mifos/mobile/viewModels/SavingAccountsDetailViewModelTest.kt delete mode 100644 androidApp/src/test/java/org/mifos/mobile/viewModels/SavingAccountsTransactionViewModelTest.kt delete mode 100644 androidApp/src/test/java/org/mifos/mobile/viewModels/SavingsAccountApplicationViewModelTest.kt delete mode 100644 androidApp/src/test/java/org/mifos/mobile/viewModels/SavingsAccountWithdrawViewModelTest.kt delete mode 100644 androidApp/src/test/java/org/mifos/mobile/viewModels/SavingsMakeTransferViewModelTest.kt delete mode 100644 androidApp/src/test/java/org/mifos/mobile/viewModels/ThirdPartyTransferViewModelTest.kt delete mode 100644 androidApp/src/test/java/org/mifos/mobile/viewModels/TransferProcessViewModelTest.kt delete mode 100644 androidApp/src/test/java/org/mifos/mobile/viewModels/UpdatePasswordViewModelTest.kt delete mode 100644 androidApp/src/test/java/org/mifos/mobile/viewModels/UserDetailViewModelTest.kt create mode 100644 build-logic/convention/src/main/kotlin/AndroidApplicationJacocoConventionPlugin.kt create mode 100644 build-logic/convention/src/main/kotlin/AndroidLibraryJacocoConventionPlugin.kt create mode 100644 build-logic/convention/src/main/kotlin/MifosDetektConventionPlugin.kt create mode 100644 build-logic/convention/src/main/kotlin/MifosGitHooksConventionPlugin.kt create mode 100644 build-logic/convention/src/main/kotlin/MifosKtlintConventionPlugin.kt create mode 100644 build-logic/convention/src/main/kotlin/MifosSpotlessConventionPlugin.kt create mode 100644 build-logic/convention/src/main/kotlin/org/mifos/mobile/Detekt.kt create mode 100644 build-logic/convention/src/main/kotlin/org/mifos/mobile/Jacoco.kt create mode 100644 build-logic/convention/src/main/kotlin/org/mifos/mobile/Spotless.kt rename ci-prebuild.bat => ci-prepush.bat (84%) rename ci-prebuild.sh => ci-prepush.sh (92%) create mode 100644 compose_compiler_config.conf delete mode 100644 core/common/src/main/res/mipmap-hdpi/core_common_mifos_icon.png delete mode 100644 core/common/src/main/res/mipmap-mdpi/core_common_mifos_icon.png delete mode 100644 core/common/src/main/res/mipmap-xhdpi/core_common_mifos_icon.png delete mode 100644 core/common/src/main/res/mipmap-xxhdpi/core_common_mifos_icon.png delete mode 100644 core/common/src/main/res/mipmap-xxxhdpi/core_common_mifos_icon.png create mode 100644 core/data/src/main/java/org/mifos/mobile/core/data/repository/UserDataRepository.kt create mode 100644 core/data/src/main/java/org/mifos/mobile/core/data/repositoryImpl/AuthenticationUserRepository.kt create mode 100644 core/data/src/main/java/org/mifos/mobile/core/data/utils/ConnectivityManagerNetworkMonitor.kt create mode 100644 core/data/src/main/java/org/mifos/mobile/core/data/utils/NetworkMonitor.kt rename {androidApp/src/test/java/org/mifos/mobile => core/data/src/test/kotlin/org/mifos/mobile/core/data}/repositories/AccountsRepositoryImpTest.kt (69%) rename {androidApp/src/test/java/org/mifos/mobile => core/data/src/test/kotlin/org/mifos/mobile/core/data}/repositories/BeneficiaryRepositoryImpTest.kt (80%) rename {androidApp/src/test/java/org/mifos/mobile => core/data/src/test/kotlin/org/mifos/mobile/core/data}/repositories/ClientChargeRepositoryImpTest.kt (70%) rename {androidApp/src/test/java/org/mifos/mobile => core/data/src/test/kotlin/org/mifos/mobile/core/data}/repositories/ClientRepositoryImpTest.kt (66%) rename {androidApp/src/test/java/org/mifos/mobile => core/data/src/test/kotlin/org/mifos/mobile/core/data}/repositories/GuarantorRepositoryImpTest.kt (83%) rename {androidApp/src/test/java/org/mifos/mobile => core/data/src/test/kotlin/org/mifos/mobile/core/data}/repositories/HomeRepositoryImpTest.kt (83%) rename {androidApp/src/test/java/org/mifos/mobile => core/data/src/test/kotlin/org/mifos/mobile/core/data}/repositories/LoanRepositoryImpTest.kt (79%) rename {androidApp/src/test/java/org/mifos/mobile => core/data/src/test/kotlin/org/mifos/mobile/core/data}/repositories/NotificationRepositoryImpTest.kt (66%) rename {androidApp/src/test/java/org/mifos/mobile => core/data/src/test/kotlin/org/mifos/mobile/core/data}/repositories/RecentTransactionRepositoryImpTest.kt (71%) rename {androidApp/src/test/java/org/mifos/mobile => core/data/src/test/kotlin/org/mifos/mobile/core/data}/repositories/SavingsAccountRepositoryImpTest.kt (76%) rename {androidApp/src/test/java/org/mifos/mobile => core/data/src/test/kotlin/org/mifos/mobile/core/data}/repositories/ThirdPartyTransferRepositoryImpTest.kt (64%) rename {androidApp/src/test/java/org/mifos/mobile => core/data/src/test/kotlin/org/mifos/mobile/core/data}/repositories/TransferRepositoryImpTest.kt (90%) rename {androidApp/src/test/java/org/mifos/mobile => core/data/src/test/kotlin/org/mifos/mobile/core/data}/repositories/UserAuthRepositoryImpTest.kt (76%) rename {androidApp/src/test/java/org/mifos/mobile => core/data/src/test/kotlin/org/mifos/mobile/core/data}/repositories/UserDetailRepositoryImpTest.kt (78%) create mode 100644 core/designsystem/src/main/kotlin/org/mifos/mobile/core/designsystem/theme/BackgroundTheme.kt create mode 100644 core/designsystem/src/main/kotlin/org/mifos/mobile/core/designsystem/theme/MifosBackground.kt create mode 100644 core/model/src/main/java/org/mifos/mobile/core/model/UserData.kt rename {feature/login => core/testing}/.gitignore (100%) create mode 100644 core/testing/README.md create mode 100644 core/testing/build.gradle.kts create mode 100644 core/testing/src/main/AndroidManifest.xml create mode 100644 core/testing/src/main/java/org/mifos/mobile/core/testing/MifosTestRunner.kt create mode 100644 core/testing/src/main/java/org/mifos/mobile/core/testing/di/TestDispatcherModule.kt create mode 100644 core/testing/src/main/java/org/mifos/mobile/core/testing/di/TestDispatchersModule.kt create mode 100644 core/testing/src/main/java/org/mifos/mobile/core/testing/rules/GrantPostNotificationsPermissionRule.kt rename {androidApp/src/main/java/org/mifos/mobile/utils => core/testing/src/main/java/org/mifos/mobile/core/testing/util}/FakeJsonName.kt (85%) rename {androidApp/src/main/java/org/mifos/mobile/utils => core/testing/src/main/java/org/mifos/mobile/core/testing/util}/FakeRemoteDataSource.kt (83%) create mode 100644 core/testing/src/main/java/org/mifos/mobile/core/testing/util/MainDispatcherRule.kt create mode 100644 core/testing/src/main/java/org/mifos/mobile/core/testing/util/TestAnalyticsHelper.kt rename {androidApp/src/main/java/org/mifos/mobile/utils => core/testing/src/main/java/org/mifos/mobile/core/testing/util}/TestDataFactory.kt (75%) create mode 100644 core/testing/src/main/java/org/mifos/mobile/core/testing/util/TestNetworkMonitor.kt create mode 100644 core/testing/src/main/java/org/mifos/mobile/core/testing/util/Util.kt rename {androidApp/src/test => core/testing/src/main}/resources/SavingsAccountWithAssociations.json (100%) rename {androidApp/src/test => core/testing/src/main}/resources/accountOptionTemplate.json (100%) rename {androidApp/src/test => core/testing/src/main}/resources/beneficiaries.json (100%) rename {androidApp/src/test => core/testing/src/main}/resources/beneficiaryApplication.json (100%) rename {androidApp/src/test => core/testing/src/main}/resources/beneficiaryPayload.json (100%) rename {androidApp/src/test => core/testing/src/main}/resources/beneficiaryTemplate.json (100%) rename {androidApp/src/test => core/testing/src/main}/resources/beneficiaryUpdatePayload.json (100%) rename {androidApp/src/test => core/testing/src/main}/resources/charge.json (100%) rename {androidApp/src/test => core/testing/src/main}/resources/client.json (100%) rename {androidApp/src/test => core/testing/src/main}/resources/clientAccounts.json (100%) rename {androidApp/src/test => core/testing/src/main}/resources/clientLoanAccounts.json (100%) rename {androidApp/src/test => core/testing/src/main}/resources/clientSavingsAccounts.json (100%) rename {androidApp/src/test => core/testing/src/main}/resources/clientShareAccounts.json (100%) rename {androidApp/src/test => core/testing/src/main}/resources/clients.json (100%) rename {androidApp/src/test => core/testing/src/main}/resources/clientsNotFound.json (100%) rename {androidApp => core/testing}/src/main/resources/guarantorList.json (100%) rename {androidApp => core/testing}/src/main/resources/guarantorTemplate.json (100%) rename {androidApp/src/test => core/testing/src/main}/resources/loanAccount.json (100%) rename {androidApp/src/test => core/testing/src/main}/resources/loanAccountWithEmptyRepaymentSchedule.json (100%) rename {androidApp/src/test => core/testing/src/main}/resources/loanAccountWithEmptyTransactions.json (100%) rename {androidApp/src/test => core/testing/src/main}/resources/loanAccountWithRepaymentSchedule.json (100%) rename {androidApp/src/test => core/testing/src/main}/resources/loanAccountWithTransactions.json (100%) rename {androidApp/src/test => core/testing/src/main}/resources/loanCharge.json (100%) rename {androidApp/src/test => core/testing/src/main}/resources/loanPayload.json (100%) rename {androidApp/src/test => core/testing/src/main}/resources/loanTemplate.json (100%) rename {androidApp/src/test => core/testing/src/main}/resources/loanTemplateByProduct.json (100%) rename {androidApp/src/test => core/testing/src/main}/resources/login.json (100%) rename {androidApp/src/test => core/testing/src/main}/resources/mockito-extensions/org.mockito.plugins.MockMaker (100%) rename {androidApp/src/test => core/testing/src/main}/resources/register.json (100%) rename {androidApp/src/test => core/testing/src/main}/resources/savingCharge.json (100%) rename {androidApp => core/testing}/src/main/resources/savingsAccountTemplate.json (100%) rename {androidApp/src/test => core/testing/src/main}/resources/transactions.json (100%) rename {androidApp/src/test => core/testing/src/main}/resources/transferPayload.json (100%) rename {androidApp/src/test => core/testing/src/main}/resources/updatePasswordPayload.json (100%) rename {androidApp/src/test => core/testing/src/main}/resources/user.json (100%) rename {androidApp/src/test => core/testing/src/main}/resources/userVerify.json (100%) delete mode 100644 core/ui/src/main/java/org/mifos/mobile/core/ui/component/MifosComposeView.kt create mode 100644 core/ui/src/main/res/values/colors.xml rename feature/{registration => about}/src/main/res/drawable/mifos_logo.png (100%) create mode 100644 feature/client-charge/src/main/res/values/colors.xml delete mode 100644 feature/login/build.gradle.kts delete mode 100644 feature/login/consumer-rules.pro delete mode 100644 feature/login/proguard-rules.pro delete mode 100644 feature/login/src/androidTest/java/org/mifos/mobile/feature/login/ExampleInstrumentedTest.kt delete mode 100644 feature/login/src/main/AndroidManifest.xml delete mode 100644 feature/login/src/main/res/values/strings.xml delete mode 100644 feature/login/src/test/java/org/mifos/mobile/feature/login/ExampleUnitTest.kt create mode 100644 feature/qr/src/main/java/org/mifos/mobile/feature/qr/components/CropContent.kt create mode 100644 feature/qr/src/main/java/org/mifos/mobile/feature/qr/components/CropErrorDialog.kt delete mode 100644 feature/registration/.gitignore delete mode 100644 feature/registration/build.gradle.kts delete mode 100644 feature/registration/consumer-rules.pro delete mode 100644 feature/registration/proguard-rules.pro delete mode 100644 feature/registration/src/androidTest/java/org/mifos/mobile/feature/registration/ExampleInstrumentedTest.kt delete mode 100644 feature/registration/src/main/AndroidManifest.xml delete mode 100644 feature/registration/src/main/res/values/strings.xml delete mode 100644 feature/registration/src/main/res/values/validations.xml delete mode 100644 feature/registration/src/main/res/values/values.xml delete mode 100644 feature/registration/src/test/java/org/mifos/mobile/feature/registration/ExampleUnitTest.kt create mode 100644 scripts/pre-commit.sh create mode 100644 scripts/pre-push.sh diff --git a/.github/workflows/feature_branch_ci.yml b/.github/workflows/feature_branch_ci.yml index 7d1456878..49117f243 100644 --- a/.github/workflows/feature_branch_ci.yml +++ b/.github/workflows/feature_branch_ci.yml @@ -7,28 +7,180 @@ on: - '!development' - '!master' +concurrency: + group: build-${{ github.ref }} + cancel-in-progress: true + +permissions: + contents: read + pull-requests: write + jobs: - build: - name: Build APK + setup: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + - uses: actions/setup-java@v4 + with: + distribution: 'zulu' + java-version: 17 + - uses: gradle/actions/setup-gradle@v4 + + - name: Cache Gradle and build outputs + uses: actions/cache@v4 + with: + path: | + ~/.gradle/caches + ~/.gradle/wrapper + build + key: ${{ runner.os }}-gradle-${{ hashFiles('**/*.gradle*', '**/gradle-wrapper.properties') }} + restore-keys: ${{ runner.os }}-gradle- + + checks: + needs: setup runs-on: ubuntu-latest + strategy: + matrix: + check: [ build_logic, spotless, detekt ] steps: - - name: Checking out repository - uses: actions/checkout@v4 + - uses: actions/checkout@v4 + - uses: actions/setup-java@v4 + with: + distribution: 'zulu' + java-version: 17 + - name: Run ${{ matrix.check }} + id: run_check + run: | + if [ "${{ matrix.check }}" = "build_logic" ]; then + ./gradlew check -p build-logic + elif [ "${{ matrix.check }}" = "spotless" ]; then + ./gradlew spotlessCheck --no-configuration-cache --no-daemon + elif [ "${{ matrix.check }}" = "detekt" ]; then + ./gradlew detekt + fi - # Set up JDK - - name: Set Up JDK 1.8 - uses: actions/setup-java@v1 + - name: Upload Detekt Reports + if: ${{ matrix.check == 'detekt' && steps.run_check.outcome == 'success' }} + uses: actions/upload-artifact@v4 with: - java-version: 11 + name: detekt-reports + path: | + **/build/reports/detekt/detekt.md + + - # Install NDK - - name: Install NDK - run: echo "y" | sudo ${ANDROID_HOME}/tools/bin/sdkmanager --install "ndk;20.0.5594570" --sdk_root=${ANDROID_SDK_ROOT} - # Update Gradle Permission - - name: Change gradlew Permission - run: chmod +x gradlew - # Build App - - name: Build with Gradle - run: ./gradlew assemble \ No newline at end of file + dependency_guard: + needs: setup + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + - uses: actions/setup-java@v4 + with: + distribution: 'zulu' + java-version: 17 + + - name: Check Dependency Guard + id: dependencyguard_verify + continue-on-error: true + run: ./gradlew dependencyGuard + + - name: Prevent updating Dependency Guard baselines if this is a fork + id: checkfork_dependencyguard + if: steps.dependencyguard_verify.outcome == 'failure' && github.event.pull_request.head.repo.full_name != github.repository + run: | + echo "::error::Dependency Guard failed, please update baselines with: ./gradlew dependencyGuardBaseline" && exit 1 + + # Runs if previous job failed + - name: Generate new Dependency Guard baselines if verification failed and it's a PR + id: dependencyguard_baseline + if: steps.dependencyguard_verify.outcome == 'failure' && github.event_name == 'pull_request' + run: | + ./gradlew dependencyGuardBaseline + + - name: Push new Dependency Guard baselines if available + uses: stefanzweifel/git-auto-commit-action@v5 + if: steps.dependencyguard_baseline.outcome == 'success' + with: + file_pattern: '**/dependencies/*.txt' + disable_globbing: true + commit_message: "🤖 Updates baselines for Dependency Guard" + + tests_and_lint: + needs: setup + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + + - uses: actions/setup-java@v4 + with: + distribution: 'zulu' + java-version: 17 + + - name: Run tests + run: | + ./gradlew testDebug :lint:test :androidApp:lintRelease :lint:lint + + - name: Upload reports + if: always() + uses: actions/upload-artifact@v4 + with: + name: test-and-lint-reports + path: | + **/build/reports/lint-results-*.html + **/build/test-results/test*UnitTest/**.xml + + + # Add `createProdDebugUnitTestCoverageReport` if we ever add JVM tests for prod + - name: Generate coverage reports for Debug variants (only API 30) + run: ./gradlew createDebugCombinedCoverageReport + + - name: Upload test reports + if: always() + uses: actions/upload-artifact@v4 + with: + name: test-reports-${{ matrix.api-level }} + path: '**/build/reports/androidTests' + + - name: Display local test coverage (only API 30) + id: jacoco + uses: madrapps/jacoco-report@v1.6.1 + with: + title: Combined test coverage report + min-coverage-overall: 40 + min-coverage-changed-files: 60 + paths: | + ${{ github.workspace }}/**/build/reports/jacoco/**/*Report.xml + token: ${{ secrets.GITHUB_TOKEN }} + + - name: Upload local coverage reports (XML + HTML) (only API 30) + uses: actions/upload-artifact@v4 + with: + name: coverage-reports + if-no-files-found: error + compression-level: 1 + overwrite: false + path: '**/build/reports/jacoco/' + + build: + needs: [ checks, dependency_guard, tests_and_lint ] + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + - uses: actions/setup-java@v4 + with: + distribution: 'zulu' + java-version: 17 + + - name: Build APKs + run: ./gradlew :androidApp:assembleDebug + + - name: Check badging + run: ./gradlew :androidApp:checkReleaseBadging + + - name: Upload APKs + uses: actions/upload-artifact@v4 + with: + name: APKs + path: '**/build/outputs/apk/**/*.apk' \ No newline at end of file diff --git a/.github/workflows/master_dev_ci.yml b/.github/workflows/master_dev_ci.yml index 8cca27497..99774b93e 100644 --- a/.github/workflows/master_dev_ci.yml +++ b/.github/workflows/master_dev_ci.yml @@ -7,22 +7,24 @@ on: - 'development' - 'master' +concurrency: + group: build-${{ github.ref }} + cancel-in-progress: true + +permissions: + contents: read + pull-requests: write + jobs: - build: - name: Build APK + setup: runs-on: ubuntu-latest steps: - - name: Checkout code - uses: actions/checkout@v4 - - - name: Set up JDK 17 - uses: actions/setup-java@v4 + - uses: actions/checkout@v4 + - uses: actions/setup-java@v4 with: distribution: 'zulu' java-version: 17 - - - name: Setup Gradle - uses: gradle/actions/setup-gradle@v4 + - uses: gradle/actions/setup-gradle@v4 - name: Cache Gradle and build outputs uses: actions/cache@v4 @@ -34,7 +36,151 @@ jobs: key: ${{ runner.os }}-gradle-${{ hashFiles('**/*.gradle*', '**/gradle-wrapper.properties') }} restore-keys: ${{ runner.os }}-gradle- - - name: Build With Gradle - run: ./gradlew assembleDebug + checks: + needs: setup + runs-on: ubuntu-latest + strategy: + matrix: + check: [ build_logic, spotless, detekt ] + steps: + - uses: actions/checkout@v4 + - uses: actions/setup-java@v4 + with: + distribution: 'zulu' + java-version: 17 + - name: Run ${{ matrix.check }} + id: run_check + run: | + if [ "${{ matrix.check }}" = "build_logic" ]; then + ./gradlew check -p build-logic + elif [ "${{ matrix.check }}" = "spotless" ]; then + ./gradlew spotlessCheck --no-configuration-cache --no-daemon + elif [ "${{ matrix.check }}" = "detekt" ]; then + ./gradlew detekt + fi + + - name: Upload Detekt Reports + if: ${{ matrix.check == 'detekt' && steps.run_check.outcome == 'success' }} + uses: actions/upload-artifact@v4 + with: + name: detekt-reports + path: | + **/build/reports/detekt/detekt.md + + + + + dependency_guard: + needs: setup + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + - uses: actions/setup-java@v4 + with: + distribution: 'zulu' + java-version: 17 + + - name: Check Dependency Guard + id: dependencyguard_verify + continue-on-error: true + run: ./gradlew dependencyGuard + + - name: Prevent updating Dependency Guard baselines if this is a fork + id: checkfork_dependencyguard + if: steps.dependencyguard_verify.outcome == 'failure' && github.event.pull_request.head.repo.full_name != github.repository + run: | + echo "::error::Dependency Guard failed, please update baselines with: ./gradlew dependencyGuardBaseline" && exit 1 + + # Runs if previous job failed + - name: Generate new Dependency Guard baselines if verification failed and it's a PR + id: dependencyguard_baseline + if: steps.dependencyguard_verify.outcome == 'failure' && github.event_name == 'pull_request' + run: | + ./gradlew dependencyGuardBaseline + + - name: Push new Dependency Guard baselines if available + uses: stefanzweifel/git-auto-commit-action@v5 + if: steps.dependencyguard_baseline.outcome == 'success' + with: + file_pattern: '**/dependencies/*.txt' + disable_globbing: true + commit_message: "🤖 Updates baselines for Dependency Guard" + + tests_and_lint: + needs: setup + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + + - uses: actions/setup-java@v4 + with: + distribution: 'zulu' + java-version: 17 + + - name: Run tests + run: | + ./gradlew testDebug :lint:test :androidApp:lintRelease :lint:lint + + - name: Upload reports + if: always() + uses: actions/upload-artifact@v4 + with: + name: test-and-lint-reports + path: | + **/build/reports/lint-results-*.html + **/build/test-results/test*UnitTest/**.xml + + + # Add `createDebugUnitTestCoverageReport` if we ever add JVM tests for prod + - name: Generate coverage reports for Debug variants (only API 30) + run: ./gradlew createDebugCombinedCoverageReport + + - name: Upload test reports + if: always() + uses: actions/upload-artifact@v4 + with: + name: test-reports-${{ matrix.api-level }} + path: '**/build/reports/androidTests' + - name: Display local test coverage (only API 30) + id: jacoco + uses: madrapps/jacoco-report@v1.6.1 + with: + title: Combined test coverage report + min-coverage-overall: 40 + min-coverage-changed-files: 60 + paths: | + ${{ github.workspace }}/**/build/reports/jacoco/**/*Report.xml + token: ${{ secrets.GITHUB_TOKEN }} + + - name: Upload local coverage reports (XML + HTML) (only API 30) + uses: actions/upload-artifact@v4 + with: + name: coverage-reports + if-no-files-found: error + compression-level: 1 + overwrite: false + path: '**/build/reports/jacoco/' + + build: + needs: [ checks, dependency_guard, tests_and_lint ] + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + - uses: actions/setup-java@v4 + with: + distribution: 'zulu' + java-version: 17 + + - name: Build APKs + run: ./gradlew :androidApp:assembleDebug + + - name: Check badging + run: ./gradlew :androidApp:checkReleaseBadging + + - name: Upload APKs + uses: actions/upload-artifact@v4 + with: + name: APKs + path: '**/build/outputs/apk/**/*.apk' diff --git a/.gitignore b/.gitignore index 3c7ee5b81..496785d43 100644 --- a/.gitignore +++ b/.gitignore @@ -26,12 +26,8 @@ build/ .classpath .project -# Windows thumbnail db -.DS_Store - # IDEA/Android Studio project files, because # the project can be imported from settings.gradle.kts -*.iml .idea/* !.idea/copyright # Keep the code styles. @@ -40,8 +36,6 @@ build/ !/.idea/codeStyles/Project.xml !/.idea/codeStyles/codeStyleConfig.xml -# Gradle cache -.gradle # Kotlin .kotlin diff --git a/androidApp/build.gradle.kts b/androidApp/build.gradle.kts index 50bf3108e..cac320cb6 100644 --- a/androidApp/build.gradle.kts +++ b/androidApp/build.gradle.kts @@ -1,27 +1,34 @@ +/* + * Copyright 2024 Mifos Initiative + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at https://mozilla.org/MPL/2.0/. + * + * See https://github.com/openMF/mobile-mobile/blob/master/LICENSE.md + */ plugins { alias(libs.plugins.mifos.android.application) alias(libs.plugins.mifos.android.application.compose) alias(libs.plugins.mifos.android.hilt) alias(libs.plugins.mifos.android.application.firebase) id("com.google.android.gms.oss-licenses-plugin") - id("kotlin-parcelize") alias(libs.plugins.roborazzi) } -apply(from = "../config/quality/quality.gradle") - android { namespace = "org.mifos.mobile" + defaultConfig { - applicationId = "org.mifos.mobile" versionCode = 1 versionName = "1.0" + applicationId = "org.mifos.mobile" vectorDrawables.useSupportLibrary = true testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner" + multiDexEnabled = true ndk { abiFilters.addAll(arrayOf("armeabi-v7a", "x86", "x86_64", "arm64-v8a")) } - multiDexEnabled = true } signingConfigs { @@ -42,40 +49,19 @@ android { } } - sourceSets { - val commonTestDir = "src/commonTest/java" - getByName("main"){ - java.srcDir(commonTestDir) - } - getByName("androidTest"){ - java.srcDir(commonTestDir) - } - getByName("test"){ - java.srcDir(commonTestDir) - } - } - buildFeatures { - dataBinding = true - viewBinding = true compose = true buildConfig = true } - - lint { - abortOnError = false - disable.add("InvalidPackage") - } } dependencyGuard { - configuration("debugCompileClasspath") - configuration("debugRuntimeClasspath") - configuration("releaseCompileClasspath") - configuration("releaseRuntimeClasspath") + configuration("releaseRuntimeClasspath"){ + modules = true + tree = true + } } - dependencies { implementation (projects.shared) @@ -108,120 +94,40 @@ dependencies { implementation(projects.feature.auth) implementation(projects.feature.userProfile) - implementation(libs.androidx.legacy.support.v4) - implementation(libs.androidx.lifecycle.ktx) - implementation(libs.androidx.lifecycle.extensions) - implementation(libs.androidx.appcompat) - implementation(libs.material) - implementation(libs.androidx.preference) - - - // DBFlow - implementation(libs.dbflow) - kapt(libs.dbflow.processor) - implementation(libs.dbflow.core) - - implementation(libs.androidx.recyclerview) - implementation(libs.androidx.vectordrawable) - implementation(libs.google.oss.licenses) - -// implementation(libs.simplecropview) + implementation(projects.libs.mifosPasscode) + // Jetpack Compose + implementation(libs.androidx.appcompat) implementation(libs.androidx.activity.ktx) - implementation(libs.androidx.fragment.ktx) - - //Country Code picker -// implementation(libs.ccp) -// implementation(libs.countrycodechooser) - - //Square dependencies - implementation(libs.squareup.retrofit2) { - // exclude Retrofit’s OkHttp peer-dependency module and define your own module import - exclude(module = "okhttp") - } - implementation(libs.squareup.retrofit.adapter.rxjava) - implementation(libs.squareup.retrofit.converter.gson) - implementation(libs.squareup.okhttp) - implementation(libs.squareup.logging.interceptor) - - //rxjava Dependencies - implementation(libs.reactivex.rxjava2.android) - implementation(libs.reactivex.rxjava2) - - //Butter Knife - implementation(libs.jakewharton.butterknife) - implementation(libs.jakewharton.compiler) - - //Annotation library - implementation(libs.androidx.annotation) - - //qr code -// implementation(libs.zxing.core) -// implementation(libs.zxing) - - //sweet error dependency - implementation(libs.sweet.error) - - //mifos passcode - implementation(libs.mifos.passcode) - - //multidex + implementation(libs.androidx.activity.compose) + implementation(platform(libs.androidx.compose.bom)) + implementation(libs.androidx.compose.material3) + implementation(libs.androidx.compose.material) + implementation(libs.androidx.compose.foundation) + implementation(libs.androidx.compose.foundation.layout) + implementation(libs.androidx.compose.material.iconsExtended) + implementation(libs.androidx.compose.runtime) + implementation(libs.androidx.compose.ui.tooling.preview) + implementation(libs.androidx.compose.ui.util) + implementation(libs.androidx.lifecycle.runtimeCompose) + implementation(libs.androidx.hilt.navigation.compose) + + implementation(libs.androidx.core.splashscreen) + + implementation(libs.androidx.tracing.ktx) + implementation(libs.androidx.profileinstaller) + implementation(libs.google.oss.licenses) implementation(libs.androidx.multidex) - //TableView -// implementation(libs.tableview) - - //Biometric Authentication - implementation(libs.androidx.biometric) - - // Coroutines - implementation(libs.kotlinx.coroutines.android) - testImplementation(libs.kotlinx.coroutines.test) - - // Unit tests dependencies - testImplementation(libs.junit) - testImplementation(libs.mockito.core) - implementation(libs.mockito.core) - //turbine - testImplementation(libs.turbine) - implementation(libs.mockito.android) - androidTestImplementation((libs.junit)) - androidTestImplementation(libs.mockito.core) - androidTestImplementation(libs.mockito.android) - androidTestImplementation(libs.androidx.annotation) - implementation(libs.androidx.core.testing) - androidTestImplementation(libs.androidx.espresso.contrib) - androidTestImplementation(libs.espresso.core) - androidTestImplementation(libs.androidx.runner) - androidTestImplementation(libs.androidx.rules) - - implementation(libs.uihouse) - - // Jetpack Compose - api(libs.androidx.activity.compose) - api(platform(libs.androidx.compose.bom)) - api(libs.androidx.compose.material3) - api(libs.androidx.compose.material) - api(libs.androidx.compose.foundation) - api(libs.androidx.compose.foundation.layout) - api(libs.androidx.compose.material.iconsExtended) - api(libs.androidx.compose.runtime) - api(libs.androidx.compose.ui.tooling.preview) - api(libs.androidx.compose.ui.util) - api(libs.androidx.lifecycle.runtimeCompose) - debugApi(libs.androidx.compose.ui.tooling) - api(libs.androidx.hilt.navigation.compose) - + testImplementation(projects.core.testing) + testImplementation(libs.hilt.android.testing) + testImplementation(libs.work.testing) - //image cropper - implementation(libs.android.image.cropper) + androidTestImplementation(kotlin("test")) + androidTestImplementation(projects.core.testing) + androidTestImplementation(libs.androidx.test.espresso.core) + androidTestImplementation(libs.androidx.navigation.testing) + androidTestImplementation(libs.hilt.android.testing) - // Google Bar code scanner - implementation(libs.google.app.code.scanner) - - //cameraX - implementation(libs.androidx.camera.camera2) - implementation(libs.androidx.camera.lifecycle) - implementation(libs.androidx.camera.view) - implementation(libs.androidx.camera.core) + debugApi(libs.androidx.compose.ui.tooling) } \ No newline at end of file diff --git a/androidApp/dependencies/releaseRuntimeClasspath.tree.txt b/androidApp/dependencies/releaseRuntimeClasspath.tree.txt new file mode 100644 index 000000000..4ff9ad2bb --- /dev/null +++ b/androidApp/dependencies/releaseRuntimeClasspath.tree.txt @@ -0,0 +1,1630 @@ ++--- org.jetbrains.kotlin:kotlin-stdlib:2.0.20 +| +--- org.jetbrains:annotations:13.0 -> 23.0.0 +| +--- org.jetbrains.kotlin:kotlin-stdlib-jdk7:1.8.0 -> 2.0.20 (c) +| +--- org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.8.0 -> 1.9.10 (c) +| \--- org.jetbrains.kotlin:kotlin-stdlib-common:2.0.20 (c) ++--- androidx.compose:compose-bom:2024.08.00 +| +--- androidx.compose.foundation:foundation:1.6.8 -> 1.7.0-rc01 (c) +| +--- androidx.compose.foundation:foundation-layout:1.6.8 -> 1.7.0-rc01 (c) +| +--- androidx.compose.material:material:1.6.8 (c) +| +--- androidx.compose.material:material-icons-extended:1.6.8 (c) +| +--- androidx.compose.material3:material3:1.2.1 (c) +| +--- androidx.compose.runtime:runtime:1.6.8 -> 1.7.0-rc01 (c) +| +--- androidx.compose.ui:ui-tooling-preview:1.6.8 -> 1.7.0-rc01 (c) +| +--- androidx.compose.ui:ui-util:1.6.8 -> 1.7.0-rc01 (c) +| +--- androidx.compose.ui:ui:1.6.8 -> 1.7.0-rc01 (c) +| +--- androidx.compose.runtime:runtime-saveable:1.6.8 -> 1.7.0-rc01 (c) +| +--- androidx.compose.material3:material3-android:1.2.1 (c) +| +--- androidx.compose.material:material-android:1.6.8 (c) +| +--- androidx.compose.material:material-icons-extended-android:1.6.8 (c) +| +--- androidx.compose.animation:animation:1.6.8 -> 1.7.0-rc01 (c) +| +--- androidx.compose.animation:animation-core:1.6.8 -> 1.7.0-rc01 (c) +| +--- androidx.compose.material:material-icons-core:1.6.8 (c) +| +--- androidx.compose.material:material-ripple:1.6.8 (c) +| +--- androidx.compose.ui:ui-graphics:1.6.8 -> 1.7.0-rc01 (c) +| +--- androidx.compose.ui:ui-text:1.6.8 -> 1.7.0-rc01 (c) +| +--- androidx.compose.foundation:foundation-layout-android:1.6.8 -> 1.7.0-rc01 (c) +| +--- androidx.compose.runtime:runtime-android:1.6.8 -> 1.7.0-rc01 (c) +| +--- androidx.compose.runtime:runtime-saveable-android:1.6.8 -> 1.7.0-rc01 (c) +| +--- androidx.compose.ui:ui-android:1.6.8 -> 1.7.0-rc01 (c) +| +--- androidx.compose.animation:animation-android:1.6.8 -> 1.7.0-rc01 (c) +| +--- androidx.compose.material:material-icons-core-android:1.6.8 (c) +| +--- androidx.compose.material:material-ripple-android:1.6.8 (c) +| +--- androidx.compose.ui:ui-unit:1.6.8 -> 1.7.0-rc01 (c) +| +--- androidx.compose.ui:ui-geometry:1.6.8 -> 1.7.0-rc01 (c) +| +--- androidx.compose.ui:ui-util-android:1.6.8 -> 1.7.0-rc01 (c) +| +--- androidx.compose.foundation:foundation-android:1.6.8 -> 1.7.0-rc01 (c) +| +--- androidx.compose.ui:ui-unit-android:1.6.8 -> 1.7.0-rc01 (c) +| +--- androidx.compose.ui:ui-graphics-android:1.6.8 -> 1.7.0-rc01 (c) +| +--- androidx.compose.ui:ui-text-android:1.6.8 -> 1.7.0-rc01 (c) +| +--- androidx.compose.ui:ui-tooling-preview-android:1.6.8 -> 1.7.0-rc01 (c) +| +--- androidx.compose.ui:ui-geometry-android:1.6.8 -> 1.7.0-rc01 (c) +| \--- androidx.compose.animation:animation-core-android:1.6.8 -> 1.7.0-rc01 (c) ++--- androidx.compose.ui:ui-tooling-preview -> 1.7.0-rc01 +| \--- androidx.compose.ui:ui-tooling-preview-android:1.7.0-rc01 +| +--- androidx.annotation:annotation:1.2.0 -> 1.8.1 +| | \--- androidx.annotation:annotation-jvm:1.8.1 +| | \--- org.jetbrains.kotlin:kotlin-stdlib:1.7.10 -> 2.0.20 (*) +| +--- androidx.compose.runtime:runtime:1.7.0-rc01 +| | \--- androidx.compose.runtime:runtime-android:1.7.0-rc01 +| | +--- androidx.annotation:annotation-experimental:1.4.0 -> 1.4.1 +| | | \--- org.jetbrains.kotlin:kotlin-stdlib:1.7.10 -> 2.0.20 (*) +| | +--- androidx.collection:collection:1.4.0 -> 1.4.2 +| | | \--- androidx.collection:collection-jvm:1.4.2 +| | | +--- androidx.annotation:annotation:1.8.1 (*) +| | | +--- org.jetbrains.kotlin:kotlin-stdlib:1.8.22 -> 2.0.20 (*) +| | | +--- androidx.collection:collection-ktx:1.4.2 (c) +| | | \--- androidx.collection:collection-ktx:1.3.0 -> 1.4.2 (c) +| | +--- org.jetbrains.kotlin:kotlin-stdlib:1.8.22 -> 2.0.20 (*) +| | +--- org.jetbrains.kotlinx:kotlinx-coroutines-android:1.7.3 -> 1.8.0 +| | | +--- org.jetbrains.kotlinx:kotlinx-coroutines-core:1.8.0 +| | | | \--- org.jetbrains.kotlinx:kotlinx-coroutines-core-jvm:1.8.0 +| | | | +--- org.jetbrains:annotations:23.0.0 +| | | | +--- org.jetbrains.kotlinx:kotlinx-coroutines-bom:1.8.0 +| | | | | +--- org.jetbrains.kotlinx:kotlinx-coroutines-android:1.8.0 (c) +| | | | | +--- org.jetbrains.kotlinx:kotlinx-coroutines-core-jvm:1.8.0 (c) +| | | | | +--- org.jetbrains.kotlinx:kotlinx-coroutines-core:1.8.0 (c) +| | | | | +--- org.jetbrains.kotlinx:kotlinx-coroutines-play-services:1.8.0 (c) +| | | | | +--- org.jetbrains.kotlinx:kotlinx-coroutines-test-jvm:1.8.0 (c) +| | | | | \--- org.jetbrains.kotlinx:kotlinx-coroutines-test:1.8.0 (c) +| | | | \--- org.jetbrains.kotlin:kotlin-stdlib:1.9.21 -> 2.0.20 (*) +| | | +--- org.jetbrains.kotlinx:kotlinx-coroutines-bom:1.8.0 (*) +| | | \--- org.jetbrains.kotlin:kotlin-stdlib:1.9.21 -> 2.0.20 (*) +| | +--- org.jetbrains.kotlinx:kotlinx-coroutines-core:1.7.3 -> 1.8.0 (*) +| | \--- androidx.compose.runtime:runtime-saveable:1.7.0-rc01 (c) +| +--- androidx.compose.ui:ui:1.7.0-rc01 (c) +| +--- androidx.compose.ui:ui-geometry:1.7.0-rc01 (c) +| +--- androidx.compose.ui:ui-graphics:1.7.0-rc01 (c) +| +--- androidx.compose.ui:ui-text:1.7.0-rc01 (c) +| +--- androidx.compose.ui:ui-unit:1.7.0-rc01 (c) +| \--- androidx.compose.ui:ui-util:1.7.0-rc01 (c) ++--- com.google.dagger:hilt-android:2.52 +| +--- com.google.dagger:dagger:2.52 +| | +--- jakarta.inject:jakarta.inject-api:2.0.1 +| | \--- javax.inject:javax.inject:1 +| +--- com.google.dagger:dagger-lint-aar:2.52 +| +--- com.google.dagger:hilt-core:2.52 +| | +--- com.google.dagger:dagger:2.52 (*) +| | +--- com.google.code.findbugs:jsr305:3.0.2 +| | \--- javax.inject:javax.inject:1 +| +--- com.google.code.findbugs:jsr305:3.0.2 +| +--- androidx.activity:activity:1.5.1 -> 1.9.1 +| | +--- androidx.annotation:annotation:1.1.0 -> 1.8.1 (*) +| | +--- androidx.collection:collection:1.0.0 -> 1.4.2 (*) +| | +--- androidx.core:core:1.13.0 -> 1.13.1 +| | | +--- androidx.annotation:annotation:1.6.0 -> 1.8.1 (*) +| | | +--- androidx.annotation:annotation-experimental:1.4.0 -> 1.4.1 (*) +| | | +--- androidx.collection:collection:1.0.0 -> 1.4.2 (*) +| | | +--- androidx.concurrent:concurrent-futures:1.0.0 -> 1.1.0 +| | | | +--- androidx.annotation:annotation:1.1.0 -> 1.8.1 (*) +| | | | \--- com.google.guava:listenablefuture:1.0 -> 9999.0-empty-to-avoid-conflict-with-guava +| | | +--- androidx.interpolator:interpolator:1.0.0 +| | | | \--- androidx.annotation:annotation:1.0.0 -> 1.8.1 (*) +| | | +--- androidx.lifecycle:lifecycle-runtime:2.6.2 -> 2.8.4 +| | | | \--- androidx.lifecycle:lifecycle-runtime-android:2.8.4 +| | | | +--- androidx.annotation:annotation:1.8.0 -> 1.8.1 (*) +| | | | +--- androidx.arch.core:core-common:2.2.0 +| | | | | \--- androidx.annotation:annotation:1.1.0 -> 1.8.1 (*) +| | | | +--- androidx.arch.core:core-runtime:2.2.0 +| | | | | +--- androidx.annotation:annotation:1.1.0 -> 1.8.1 (*) +| | | | | \--- androidx.arch.core:core-common:2.2.0 (*) +| | | | +--- androidx.lifecycle:lifecycle-common:2.8.4 +| | | | | \--- androidx.lifecycle:lifecycle-common-jvm:2.8.4 +| | | | | +--- androidx.annotation:annotation:1.8.0 -> 1.8.1 (*) +| | | | | +--- org.jetbrains.kotlin:kotlin-stdlib:1.8.22 -> 2.0.20 (*) +| | | | | +--- org.jetbrains.kotlinx:kotlinx-coroutines-core:1.7.3 -> 1.8.0 (*) +| | | | | +--- androidx.lifecycle:lifecycle-common-java8:2.8.4 (c) +| | | | | +--- androidx.lifecycle:lifecycle-livedata:2.8.4 (c) +| | | | | +--- androidx.lifecycle:lifecycle-livedata-core:2.8.4 (c) +| | | | | +--- androidx.lifecycle:lifecycle-livedata-core-ktx:2.8.4 (c) +| | | | | +--- androidx.lifecycle:lifecycle-process:2.8.4 (c) +| | | | | +--- androidx.lifecycle:lifecycle-runtime:2.8.4 (c) +| | | | | +--- androidx.lifecycle:lifecycle-runtime-compose:2.8.4 (c) +| | | | | +--- androidx.lifecycle:lifecycle-runtime-ktx:2.8.4 (c) +| | | | | +--- androidx.lifecycle:lifecycle-viewmodel:2.8.4 (c) +| | | | | +--- androidx.lifecycle:lifecycle-viewmodel-compose:2.8.4 (c) +| | | | | +--- androidx.lifecycle:lifecycle-viewmodel-ktx:2.8.4 (c) +| | | | | \--- androidx.lifecycle:lifecycle-viewmodel-savedstate:2.8.4 (c) +| | | | +--- androidx.profileinstaller:profileinstaller:1.3.1 +| | | | | +--- androidx.annotation:annotation:1.2.0 -> 1.8.1 (*) +| | | | | +--- androidx.concurrent:concurrent-futures:1.1.0 (*) +| | | | | +--- androidx.startup:startup-runtime:1.1.1 +| | | | | | +--- androidx.annotation:annotation:1.1.0 -> 1.8.1 (*) +| | | | | | \--- androidx.tracing:tracing:1.0.0 -> 1.2.0 +| | | | | | +--- androidx.annotation:annotation:1.2.0 -> 1.8.1 (*) +| | | | | | \--- androidx.tracing:tracing-ktx:1.2.0 (c) +| | | | | \--- com.google.guava:listenablefuture:1.0 -> 9999.0-empty-to-avoid-conflict-with-guava +| | | | +--- org.jetbrains.kotlin:kotlin-stdlib:1.8.22 -> 2.0.20 (*) +| | | | +--- org.jetbrains.kotlinx:kotlinx-coroutines-android:1.7.3 -> 1.8.0 (*) +| | | | +--- androidx.lifecycle:lifecycle-common:2.8.4 (c) +| | | | +--- androidx.lifecycle:lifecycle-common-java8:2.8.4 (c) +| | | | +--- androidx.lifecycle:lifecycle-livedata:2.8.4 (c) +| | | | +--- androidx.lifecycle:lifecycle-livedata-core:2.8.4 (c) +| | | | +--- androidx.lifecycle:lifecycle-livedata-core-ktx:2.8.4 (c) +| | | | +--- androidx.lifecycle:lifecycle-process:2.8.4 (c) +| | | | +--- androidx.lifecycle:lifecycle-runtime-compose:2.8.4 (c) +| | | | +--- androidx.lifecycle:lifecycle-runtime-ktx:2.8.4 (c) +| | | | +--- androidx.lifecycle:lifecycle-viewmodel:2.8.4 (c) +| | | | +--- androidx.lifecycle:lifecycle-viewmodel-compose:2.8.4 (c) +| | | | +--- androidx.lifecycle:lifecycle-viewmodel-ktx:2.8.4 (c) +| | | | \--- androidx.lifecycle:lifecycle-viewmodel-savedstate:2.8.4 (c) +| | | +--- androidx.versionedparcelable:versionedparcelable:1.1.1 +| | | | +--- androidx.annotation:annotation:1.1.0 -> 1.8.1 (*) +| | | | \--- androidx.collection:collection:1.0.0 -> 1.4.2 (*) +| | | +--- org.jetbrains.kotlin:kotlin-stdlib:1.8.22 -> 2.0.20 (*) +| | | \--- androidx.core:core-ktx:1.13.1 (c) +| | +--- androidx.lifecycle:lifecycle-runtime:2.6.1 -> 2.8.4 (*) +| | +--- androidx.lifecycle:lifecycle-viewmodel:2.6.1 -> 2.8.4 +| | | \--- androidx.lifecycle:lifecycle-viewmodel-android:2.8.4 +| | | +--- androidx.annotation:annotation:1.8.0 -> 1.8.1 (*) +| | | +--- org.jetbrains.kotlin:kotlin-stdlib:1.8.22 -> 2.0.20 (*) +| | | +--- org.jetbrains.kotlinx:kotlinx-coroutines-android:1.7.3 -> 1.8.0 (*) +| | | +--- org.jetbrains.kotlinx:kotlinx-coroutines-core:1.7.3 -> 1.8.0 (*) +| | | +--- androidx.lifecycle:lifecycle-common:2.8.4 (c) +| | | +--- androidx.lifecycle:lifecycle-common-java8:2.8.4 (c) +| | | +--- androidx.lifecycle:lifecycle-livedata:2.8.4 (c) +| | | +--- androidx.lifecycle:lifecycle-livedata-core:2.8.4 (c) +| | | +--- androidx.lifecycle:lifecycle-livedata-core-ktx:2.8.4 (c) +| | | +--- androidx.lifecycle:lifecycle-process:2.8.4 (c) +| | | +--- androidx.lifecycle:lifecycle-runtime:2.8.4 (c) +| | | +--- androidx.lifecycle:lifecycle-runtime-compose:2.8.4 (c) +| | | +--- androidx.lifecycle:lifecycle-runtime-ktx:2.8.4 (c) +| | | +--- androidx.lifecycle:lifecycle-viewmodel-compose:2.8.4 (c) +| | | +--- androidx.lifecycle:lifecycle-viewmodel-ktx:2.8.4 (c) +| | | \--- androidx.lifecycle:lifecycle-viewmodel-savedstate:2.8.4 (c) +| | +--- androidx.lifecycle:lifecycle-viewmodel-savedstate:2.6.1 -> 2.8.4 +| | | +--- androidx.annotation:annotation:1.0.0 -> 1.8.1 (*) +| | | +--- androidx.core:core-ktx:1.2.0 -> 1.13.1 +| | | | +--- androidx.annotation:annotation:1.1.0 -> 1.8.1 (*) +| | | | +--- androidx.core:core:1.13.1 (*) +| | | | +--- org.jetbrains.kotlin:kotlin-stdlib:1.8.22 -> 2.0.20 (*) +| | | | \--- androidx.core:core:1.13.1 (c) +| | | +--- androidx.lifecycle:lifecycle-livedata-core:2.8.4 +| | | | +--- androidx.arch.core:core-common:2.2.0 (*) +| | | | +--- androidx.arch.core:core-runtime:2.2.0 (*) +| | | | +--- androidx.lifecycle:lifecycle-common:2.8.4 (*) +| | | | +--- org.jetbrains.kotlin:kotlin-stdlib:1.8.22 -> 2.0.20 (*) +| | | | +--- androidx.lifecycle:lifecycle-common:2.8.4 (c) +| | | | +--- androidx.lifecycle:lifecycle-common-java8:2.8.4 (c) +| | | | +--- androidx.lifecycle:lifecycle-livedata:2.8.4 (c) +| | | | +--- androidx.lifecycle:lifecycle-livedata-core-ktx:2.8.4 (c) +| | | | +--- androidx.lifecycle:lifecycle-process:2.8.4 (c) +| | | | +--- androidx.lifecycle:lifecycle-runtime:2.8.4 (c) +| | | | +--- androidx.lifecycle:lifecycle-runtime-compose:2.8.4 (c) +| | | | +--- androidx.lifecycle:lifecycle-runtime-ktx:2.8.4 (c) +| | | | +--- androidx.lifecycle:lifecycle-viewmodel:2.8.4 (c) +| | | | +--- androidx.lifecycle:lifecycle-viewmodel-compose:2.8.4 (c) +| | | | +--- androidx.lifecycle:lifecycle-viewmodel-ktx:2.8.4 (c) +| | | | \--- androidx.lifecycle:lifecycle-viewmodel-savedstate:2.8.4 (c) +| | | +--- androidx.lifecycle:lifecycle-viewmodel:2.8.4 (*) +| | | +--- androidx.savedstate:savedstate:1.2.1 +| | | | +--- androidx.annotation:annotation:1.1.0 -> 1.8.1 (*) +| | | | +--- androidx.arch.core:core-common:2.1.0 -> 2.2.0 (*) +| | | | +--- androidx.lifecycle:lifecycle-common:2.6.1 -> 2.8.4 (*) +| | | | +--- org.jetbrains.kotlin:kotlin-stdlib:1.8.10 -> 2.0.20 (*) +| | | | \--- androidx.savedstate:savedstate-ktx:1.2.1 (c) +| | | +--- org.jetbrains.kotlin:kotlin-stdlib:1.8.22 -> 2.0.20 (*) +| | | +--- org.jetbrains.kotlinx:kotlinx-coroutines-android:1.7.3 -> 1.8.0 (*) +| | | +--- androidx.lifecycle:lifecycle-common:2.8.4 (c) +| | | +--- androidx.lifecycle:lifecycle-common-java8:2.8.4 (c) +| | | +--- androidx.lifecycle:lifecycle-livedata:2.8.4 (c) +| | | +--- androidx.lifecycle:lifecycle-livedata-core:2.8.4 (c) +| | | +--- androidx.lifecycle:lifecycle-livedata-core-ktx:2.8.4 (c) +| | | +--- androidx.lifecycle:lifecycle-process:2.8.4 (c) +| | | +--- androidx.lifecycle:lifecycle-runtime:2.8.4 (c) +| | | +--- androidx.lifecycle:lifecycle-runtime-compose:2.8.4 (c) +| | | +--- androidx.lifecycle:lifecycle-runtime-ktx:2.8.4 (c) +| | | +--- androidx.lifecycle:lifecycle-viewmodel:2.8.4 (c) +| | | +--- androidx.lifecycle:lifecycle-viewmodel-compose:2.8.4 (c) +| | | \--- androidx.lifecycle:lifecycle-viewmodel-ktx:2.8.4 (c) +| | +--- androidx.profileinstaller:profileinstaller:1.3.1 (*) +| | +--- androidx.savedstate:savedstate:1.2.1 (*) +| | +--- androidx.tracing:tracing:1.0.0 -> 1.2.0 (*) +| | +--- org.jetbrains.kotlin:kotlin-stdlib:1.8.22 -> 2.0.20 (*) +| | +--- androidx.activity:activity-compose:1.9.1 (c) +| | \--- androidx.activity:activity-ktx:1.9.1 (c) +| +--- androidx.annotation:annotation:1.3.0 -> 1.8.1 (*) +| +--- androidx.annotation:annotation-experimental:1.3.1 -> 1.4.1 (*) +| +--- androidx.fragment:fragment:1.5.1 -> 1.7.1 +| | +--- androidx.activity:activity:1.8.1 -> 1.9.1 (*) +| | +--- androidx.annotation:annotation:1.1.0 -> 1.8.1 (*) +| | +--- androidx.annotation:annotation-experimental:1.4.0 -> 1.4.1 (*) +| | +--- androidx.collection:collection:1.1.0 -> 1.4.2 (*) +| | +--- androidx.core:core-ktx:1.2.0 -> 1.13.1 (*) +| | +--- androidx.lifecycle:lifecycle-livedata-core:2.6.1 -> 2.8.4 (*) +| | +--- androidx.lifecycle:lifecycle-runtime:2.6.1 -> 2.8.4 (*) +| | +--- androidx.lifecycle:lifecycle-viewmodel:2.6.1 -> 2.8.4 (*) +| | +--- androidx.lifecycle:lifecycle-viewmodel-savedstate:2.6.1 -> 2.8.4 (*) +| | +--- androidx.loader:loader:1.0.0 +| | | +--- androidx.annotation:annotation:1.0.0 -> 1.8.1 (*) +| | | +--- androidx.core:core:1.0.0 -> 1.13.1 (*) +| | | +--- androidx.lifecycle:lifecycle-livedata:2.0.0 -> 2.8.4 +| | | | +--- androidx.arch.core:core-common:2.2.0 (*) +| | | | +--- androidx.arch.core:core-runtime:2.2.0 (*) +| | | | +--- androidx.lifecycle:lifecycle-livedata-core:2.8.4 (*) +| | | | +--- androidx.lifecycle:lifecycle-livedata-core-ktx:2.8.4 +| | | | | +--- androidx.lifecycle:lifecycle-livedata-core:2.8.4 (*) +| | | | | +--- org.jetbrains.kotlin:kotlin-stdlib:1.8.22 -> 2.0.20 (*) +| | | | | +--- androidx.lifecycle:lifecycle-common:2.8.4 (c) +| | | | | +--- androidx.lifecycle:lifecycle-common-java8:2.8.4 (c) +| | | | | +--- androidx.lifecycle:lifecycle-livedata:2.8.4 (c) +| | | | | +--- androidx.lifecycle:lifecycle-livedata-core:2.8.4 (c) +| | | | | +--- androidx.lifecycle:lifecycle-process:2.8.4 (c) +| | | | | +--- androidx.lifecycle:lifecycle-runtime:2.8.4 (c) +| | | | | +--- androidx.lifecycle:lifecycle-runtime-compose:2.8.4 (c) +| | | | | +--- androidx.lifecycle:lifecycle-runtime-ktx:2.8.4 (c) +| | | | | +--- androidx.lifecycle:lifecycle-viewmodel:2.8.4 (c) +| | | | | +--- androidx.lifecycle:lifecycle-viewmodel-compose:2.8.4 (c) +| | | | | +--- androidx.lifecycle:lifecycle-viewmodel-ktx:2.8.4 (c) +| | | | | \--- androidx.lifecycle:lifecycle-viewmodel-savedstate:2.8.4 (c) +| | | | +--- org.jetbrains.kotlin:kotlin-stdlib:1.8.22 -> 2.0.20 (*) +| | | | +--- org.jetbrains.kotlinx:kotlinx-coroutines-core:1.7.3 -> 1.8.0 (*) +| | | | +--- androidx.lifecycle:lifecycle-common:2.8.4 (c) +| | | | +--- androidx.lifecycle:lifecycle-common-java8:2.8.4 (c) +| | | | +--- androidx.lifecycle:lifecycle-livedata-core:2.8.4 (c) +| | | | +--- androidx.lifecycle:lifecycle-livedata-core-ktx:2.8.4 (c) +| | | | +--- androidx.lifecycle:lifecycle-process:2.8.4 (c) +| | | | +--- androidx.lifecycle:lifecycle-runtime:2.8.4 (c) +| | | | +--- androidx.lifecycle:lifecycle-runtime-compose:2.8.4 (c) +| | | | +--- androidx.lifecycle:lifecycle-runtime-ktx:2.8.4 (c) +| | | | +--- androidx.lifecycle:lifecycle-viewmodel:2.8.4 (c) +| | | | +--- androidx.lifecycle:lifecycle-viewmodel-compose:2.8.4 (c) +| | | | +--- androidx.lifecycle:lifecycle-viewmodel-ktx:2.8.4 (c) +| | | | \--- androidx.lifecycle:lifecycle-viewmodel-savedstate:2.8.4 (c) +| | | \--- androidx.lifecycle:lifecycle-viewmodel:2.0.0 -> 2.8.4 (*) +| | +--- androidx.profileinstaller:profileinstaller:1.3.1 (*) +| | +--- androidx.savedstate:savedstate:1.2.1 (*) +| | +--- androidx.viewpager:viewpager:1.0.0 +| | | +--- androidx.annotation:annotation:1.0.0 -> 1.8.1 (*) +| | | +--- androidx.core:core:1.0.0 -> 1.13.1 (*) +| | | \--- androidx.customview:customview:1.0.0 +| | | +--- androidx.annotation:annotation:1.0.0 -> 1.8.1 (*) +| | | \--- androidx.core:core:1.0.0 -> 1.13.1 (*) +| | +--- org.jetbrains.kotlin:kotlin-stdlib:1.8.22 -> 2.0.20 (*) +| | \--- androidx.fragment:fragment-ktx:1.7.1 (c) +| +--- androidx.lifecycle:lifecycle-common:2.5.1 -> 2.8.4 (*) +| +--- androidx.lifecycle:lifecycle-viewmodel:2.5.1 -> 2.8.4 (*) +| +--- androidx.lifecycle:lifecycle-viewmodel-savedstate:2.5.1 -> 2.8.4 (*) +| +--- androidx.savedstate:savedstate:1.2.0 -> 1.2.1 (*) +| +--- javax.inject:javax.inject:1 +| \--- org.jetbrains.kotlin:kotlin-stdlib:1.9.24 -> 2.0.20 (*) ++--- com.google.firebase:firebase-bom:33.2.0 +| +--- com.google.firebase:firebase-perf-ktx:21.0.1 (c) +| +--- com.google.firebase:firebase-crashlytics-ktx:19.0.3 (c) +| +--- com.google.firebase:firebase-analytics-ktx:22.1.0 (c) +| +--- com.google.firebase:firebase-messaging-ktx:24.0.1 (c) +| +--- com.google.firebase:firebase-perf:21.0.1 (c) +| +--- com.google.firebase:firebase-common:21.0.0 (c) +| +--- com.google.firebase:firebase-common-ktx:21.0.0 (c) +| +--- com.google.firebase:firebase-crashlytics:19.0.3 (c) +| +--- com.google.firebase:firebase-analytics:22.1.0 (c) +| +--- com.google.firebase:firebase-messaging:24.0.1 (c) +| +--- com.google.firebase:firebase-config:22.0.0 (c) +| +--- com.google.firebase:firebase-installations:18.0.0 (c) +| \--- com.google.firebase:firebase-encoders:17.0.0 (c) ++--- com.google.firebase:firebase-analytics-ktx -> 22.1.0 +| +--- com.google.firebase:firebase-analytics:22.1.0 +| | +--- com.google.android.gms:play-services-measurement:22.1.0 +| | | +--- androidx.collection:collection:1.0.0 -> 1.4.2 (*) +| | | +--- androidx.legacy:legacy-support-core-utils:1.0.0 +| | | | +--- androidx.annotation:annotation:1.0.0 -> 1.8.1 (*) +| | | | +--- androidx.core:core:1.0.0 -> 1.13.1 (*) +| | | | +--- androidx.documentfile:documentfile:1.0.0 +| | | | | \--- androidx.annotation:annotation:1.0.0 -> 1.8.1 (*) +| | | | +--- androidx.loader:loader:1.0.0 (*) +| | | | +--- androidx.localbroadcastmanager:localbroadcastmanager:1.0.0 +| | | | | \--- androidx.annotation:annotation:1.0.0 -> 1.8.1 (*) +| | | | \--- androidx.print:print:1.0.0 +| | | | \--- androidx.annotation:annotation:1.0.0 -> 1.8.1 (*) +| | | +--- com.google.android.gms:play-services-ads-identifier:18.0.0 +| | | | \--- com.google.android.gms:play-services-basement:18.0.0 -> 18.4.0 +| | | | +--- androidx.collection:collection:1.0.0 -> 1.4.2 (*) +| | | | +--- androidx.core:core:1.2.0 -> 1.13.1 (*) +| | | | \--- androidx.fragment:fragment:1.1.0 -> 1.7.1 (*) +| | | +--- com.google.android.gms:play-services-basement:18.4.0 (*) +| | | +--- com.google.android.gms:play-services-measurement-base:22.1.0 +| | | | \--- com.google.android.gms:play-services-basement:18.4.0 (*) +| | | +--- com.google.android.gms:play-services-measurement-impl:22.1.0 +| | | | +--- androidx.collection:collection:1.0.0 -> 1.4.2 (*) +| | | | +--- androidx.core:core:1.9.0 -> 1.13.1 (*) +| | | | +--- androidx.privacysandbox.ads:ads-adservices:1.0.0-beta05 +| | | | | +--- androidx.annotation:annotation:1.6.0 -> 1.8.1 (*) +| | | | | +--- androidx.core:core-ktx:1.8.0 -> 1.13.1 (*) +| | | | | +--- org.jetbrains.kotlin:kotlin-stdlib:1.8.21 -> 2.0.20 (*) +| | | | | +--- org.jetbrains.kotlinx:kotlinx-coroutines-core:1.7.1 -> 1.8.0 (*) +| | | | | \--- androidx.privacysandbox.ads:ads-adservices-java:1.0.0-beta05 (c) +| | | | +--- androidx.privacysandbox.ads:ads-adservices-java:1.0.0-beta05 +| | | | | +--- androidx.annotation:annotation:1.2.0 -> 1.8.1 (*) +| | | | | +--- androidx.concurrent:concurrent-futures:1.1.0 (*) +| | | | | +--- androidx.core:core-ktx:1.8.0 -> 1.13.1 (*) +| | | | | +--- androidx.privacysandbox.ads:ads-adservices:1.0.0-beta05 (*) +| | | | | +--- com.google.guava:guava:31.1-android +| | | | | | +--- com.google.guava:failureaccess:1.0.1 +| | | | | | +--- com.google.guava:listenablefuture:9999.0-empty-to-avoid-conflict-with-guava +| | | | | | +--- com.google.code.findbugs:jsr305:3.0.2 +| | | | | | +--- org.checkerframework:checker-qual:3.12.0 +| | | | | | +--- com.google.errorprone:error_prone_annotations:2.11.0 -> 2.26.0 +| | | | | | \--- com.google.j2objc:j2objc-annotations:1.3 +| | | | | +--- com.google.guava:listenablefuture:1.0 -> 9999.0-empty-to-avoid-conflict-with-guava +| | | | | +--- org.jetbrains.kotlin:kotlin-stdlib:1.8.21 -> 2.0.20 (*) +| | | | | +--- org.jetbrains.kotlinx:kotlinx-coroutines-core:1.7.1 -> 1.8.0 (*) +| | | | | \--- androidx.privacysandbox.ads:ads-adservices:1.0.0-beta05 (c) +| | | | +--- com.google.android.gms:play-services-ads-identifier:18.0.0 (*) +| | | | +--- com.google.android.gms:play-services-basement:18.4.0 (*) +| | | | +--- com.google.android.gms:play-services-measurement-base:22.1.0 (*) +| | | | +--- com.google.android.gms:play-services-stats:17.0.2 +| | | | | +--- androidx.legacy:legacy-support-core-utils:1.0.0 (*) +| | | | | \--- com.google.android.gms:play-services-basement:18.0.0 -> 18.4.0 (*) +| | | | \--- com.google.guava:guava:31.1-android (*) +| | | \--- com.google.android.gms:play-services-stats:17.0.2 (*) +| | +--- com.google.android.gms:play-services-measurement-api:22.1.0 +| | | +--- com.google.android.gms:play-services-ads-identifier:18.0.0 (*) +| | | +--- com.google.android.gms:play-services-basement:18.4.0 (*) +| | | +--- com.google.android.gms:play-services-measurement-base:22.1.0 (*) +| | | +--- com.google.android.gms:play-services-measurement-sdk-api:22.1.0 +| | | | +--- com.google.android.gms:play-services-basement:18.4.0 (*) +| | | | \--- com.google.android.gms:play-services-measurement-base:22.1.0 (*) +| | | +--- com.google.android.gms:play-services-tasks:18.2.0 +| | | | \--- com.google.android.gms:play-services-basement:18.4.0 (*) +| | | +--- com.google.firebase:firebase-common:21.0.0 +| | | | +--- org.jetbrains.kotlinx:kotlinx-coroutines-play-services:1.6.4 -> 1.8.0 +| | | | | +--- org.jetbrains.kotlinx:kotlinx-coroutines-core:1.8.0 (*) +| | | | | +--- org.jetbrains.kotlinx:kotlinx-coroutines-bom:1.8.0 (*) +| | | | | +--- com.google.android.gms:play-services-tasks:16.0.1 -> 18.2.0 (*) +| | | | | \--- org.jetbrains.kotlin:kotlin-stdlib:1.9.21 -> 2.0.20 (*) +| | | | +--- com.google.firebase:firebase-components:18.0.0 +| | | | | +--- com.google.firebase:firebase-annotations:16.2.0 +| | | | | | \--- javax.inject:javax.inject:1 +| | | | | +--- androidx.annotation:annotation:1.5.0 -> 1.8.1 (*) +| | | | | \--- com.google.errorprone:error_prone_annotations:2.26.0 +| | | | +--- com.google.firebase:firebase-annotations:16.2.0 (*) +| | | | +--- androidx.annotation:annotation:1.5.0 -> 1.8.1 (*) +| | | | +--- androidx.concurrent:concurrent-futures:1.1.0 (*) +| | | | +--- org.jetbrains.kotlin:kotlin-stdlib:1.8.22 -> 2.0.20 (*) +| | | | +--- com.google.android.gms:play-services-basement:18.3.0 -> 18.4.0 (*) +| | | | \--- com.google.android.gms:play-services-tasks:18.1.0 -> 18.2.0 (*) +| | | +--- com.google.firebase:firebase-common-ktx:21.0.0 +| | | | +--- com.google.firebase:firebase-common:21.0.0 (*) +| | | | +--- org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.8.22 -> 1.9.10 +| | | | | +--- org.jetbrains.kotlin:kotlin-stdlib:1.9.10 -> 2.0.20 (*) +| | | | | \--- org.jetbrains.kotlin:kotlin-stdlib-jdk7:1.9.10 -> 2.0.20 +| | | | | \--- org.jetbrains.kotlin:kotlin-stdlib:2.0.20 (*) +| | | | +--- com.google.firebase:firebase-components:18.0.0 (*) +| | | | \--- com.google.firebase:firebase-annotations:16.2.0 (*) +| | | +--- com.google.firebase:firebase-components:18.0.0 (*) +| | | +--- com.google.firebase:firebase-installations:17.0.1 -> 18.0.0 +| | | | +--- com.google.android.gms:play-services-tasks:18.0.1 -> 18.2.0 (*) +| | | | +--- com.google.firebase:firebase-annotations:16.2.0 (*) +| | | | +--- com.google.firebase:firebase-common:21.0.0 (*) +| | | | +--- com.google.firebase:firebase-common-ktx:21.0.0 (*) +| | | | +--- com.google.firebase:firebase-components:18.0.0 (*) +| | | | +--- com.google.firebase:firebase-installations-interop:17.1.1 -> 17.2.0 +| | | | | +--- com.google.android.gms:play-services-tasks:18.0.1 -> 18.2.0 (*) +| | | | | \--- com.google.firebase:firebase-annotations:16.2.0 (*) +| | | | \--- org.jetbrains.kotlin:kotlin-stdlib:1.8.22 -> 2.0.20 (*) +| | | +--- com.google.firebase:firebase-installations-interop:17.0.0 -> 17.2.0 (*) +| | | +--- com.google.firebase:firebase-measurement-connector:19.0.0 -> 20.0.1 +| | | | +--- com.google.android.gms:play-services-basement:18.0.0 -> 18.4.0 (*) +| | | | \--- com.google.firebase:firebase-annotations:16.0.0 -> 16.2.0 (*) +| | | +--- com.google.guava:guava:31.1-android (*) +| | | \--- org.jetbrains.kotlin:kotlin-stdlib:1.7.10 -> 2.0.20 (*) +| | \--- com.google.android.gms:play-services-measurement-sdk:22.1.0 +| | +--- androidx.collection:collection:1.0.0 -> 1.4.2 (*) +| | +--- com.google.android.gms:play-services-basement:18.4.0 (*) +| | +--- com.google.android.gms:play-services-measurement-base:22.1.0 (*) +| | \--- com.google.android.gms:play-services-measurement-impl:22.1.0 (*) +| +--- com.google.firebase:firebase-common:21.0.0 (*) +| +--- com.google.firebase:firebase-common-ktx:21.0.0 (*) +| +--- com.google.firebase:firebase-components:18.0.0 (*) +| \--- org.jetbrains.kotlin:kotlin-stdlib:1.7.10 -> 2.0.20 (*) ++--- com.google.firebase:firebase-perf-ktx -> 21.0.1 +| +--- com.google.firebase:firebase-perf:21.0.1 +| | +--- com.google.firebase:firebase-annotations:16.2.0 (*) +| | +--- com.google.firebase:firebase-installations-interop:17.1.0 -> 17.2.0 (*) +| | +--- com.google.firebase:protolite-well-known-types:18.0.0 +| | | \--- com.google.protobuf:protobuf-javalite:3.14.0 -> 3.21.11 +| | +--- com.google.firebase:firebase-common:21.0.0 (*) +| | +--- com.google.firebase:firebase-common-ktx:21.0.0 (*) +| | +--- com.google.firebase:firebase-components:18.0.0 (*) +| | +--- com.google.firebase:firebase-config:21.5.0 -> 22.0.0 +| | | +--- com.google.firebase:firebase-config-interop:16.0.1 +| | | | +--- com.google.firebase:firebase-encoders-json:18.0.1 +| | | | | +--- org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.7.10 -> 1.9.10 (*) +| | | | | +--- androidx.annotation:annotation:1.1.0 -> 1.8.1 (*) +| | | | | \--- com.google.firebase:firebase-encoders:17.0.0 +| | | | | \--- androidx.annotation:annotation:1.1.0 -> 1.8.1 (*) +| | | | \--- com.google.firebase:firebase-encoders:17.0.0 (*) +| | | +--- com.google.firebase:firebase-annotations:16.2.0 (*) +| | | +--- com.google.firebase:firebase-installations-interop:17.1.0 -> 17.2.0 (*) +| | | +--- com.google.firebase:firebase-abt:21.1.1 +| | | | +--- com.google.firebase:firebase-measurement-connector:18.0.0 -> 20.0.1 (*) +| | | | \--- com.google.android.gms:play-services-basement:18.1.0 -> 18.4.0 (*) +| | | +--- com.google.firebase:firebase-measurement-connector:18.0.0 -> 20.0.1 (*) +| | | +--- com.google.firebase:firebase-common:21.0.0 (*) +| | | +--- com.google.firebase:firebase-common-ktx:21.0.0 (*) +| | | +--- com.google.firebase:firebase-components:18.0.0 (*) +| | | +--- com.google.firebase:firebase-installations:17.2.0 -> 18.0.0 (*) +| | | +--- com.google.android.gms:play-services-tasks:18.0.1 -> 18.2.0 (*) +| | | +--- org.jetbrains.kotlin:kotlin-stdlib:1.8.22 -> 2.0.20 (*) +| | | \--- androidx.annotation:annotation:1.1.0 -> 1.8.1 (*) +| | +--- com.google.firebase:firebase-installations:17.2.0 -> 18.0.0 (*) +| | +--- com.google.firebase:firebase-sessions:2.0.0 -> 2.0.3 +| | | +--- com.google.firebase:firebase-common:21.0.0 (*) +| | | +--- com.google.firebase:firebase-common-ktx:21.0.0 (*) +| | | +--- com.google.firebase:firebase-components:18.0.0 (*) +| | | +--- com.google.firebase:firebase-installations-interop:17.2.0 (*) +| | | +--- com.google.firebase:firebase-annotations:16.2.0 (*) +| | | +--- com.google.firebase:firebase-encoders:17.0.0 (*) +| | | +--- com.google.firebase:firebase-encoders-json:18.0.1 (*) +| | | +--- org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.8.22 -> 1.9.10 (*) +| | | +--- com.google.firebase:firebase-installations:18.0.0 (*) +| | | +--- com.google.firebase:firebase-datatransport:19.0.0 +| | | | +--- androidx.annotation:annotation:1.1.0 -> 1.8.1 (*) +| | | | +--- com.google.android.datatransport:transport-api:3.1.0 -> 3.2.0 +| | | | | \--- androidx.annotation:annotation:1.1.0 -> 1.8.1 (*) +| | | | +--- com.google.android.datatransport:transport-backend-cct:3.2.0 -> 3.3.0 +| | | | | +--- com.google.android.datatransport:transport-api:3.2.0 (*) +| | | | | +--- com.google.android.datatransport:transport-runtime:3.3.0 +| | | | | | +--- com.google.android.datatransport:transport-api:3.2.0 (*) +| | | | | | +--- androidx.annotation:annotation:1.3.0 -> 1.8.1 (*) +| | | | | | +--- javax.inject:javax.inject:1 +| | | | | | +--- com.google.firebase:firebase-encoders:17.0.0 (*) +| | | | | | \--- com.google.firebase:firebase-encoders-proto:16.0.0 +| | | | | | +--- androidx.annotation:annotation:1.1.0 -> 1.8.1 (*) +| | | | | | \--- com.google.firebase:firebase-encoders:17.0.0 (*) +| | | | | +--- com.google.firebase:firebase-encoders:17.0.0 (*) +| | | | | +--- com.google.firebase:firebase-encoders-json:18.0.0 -> 18.0.1 (*) +| | | | | \--- androidx.annotation:annotation:1.1.0 -> 1.8.1 (*) +| | | | +--- com.google.android.datatransport:transport-runtime:3.2.0 -> 3.3.0 (*) +| | | | \--- org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.8.22 -> 1.9.10 (*) +| | | +--- androidx.datastore:datastore-preferences:1.0.0 +| | | | +--- org.jetbrains.kotlin:kotlin-stdlib:1.5.10 -> 2.0.20 (*) +| | | | +--- androidx.datastore:datastore:1.0.0 +| | | | | +--- org.jetbrains.kotlin:kotlin-stdlib:1.5.10 -> 2.0.20 (*) +| | | | | +--- org.jetbrains.kotlinx:kotlinx-coroutines-core:1.5.0 -> 1.8.0 (*) +| | | | | +--- androidx.annotation:annotation:1.2.0 -> 1.8.1 (*) +| | | | | \--- androidx.datastore:datastore-core:1.0.0 +| | | | | +--- org.jetbrains.kotlin:kotlin-stdlib:1.5.10 -> 2.0.20 (*) +| | | | | +--- org.jetbrains.kotlinx:kotlinx-coroutines-core:1.5.0 -> 1.8.0 (*) +| | | | | \--- androidx.annotation:annotation:1.1.0 -> 1.8.1 (*) +| | | | \--- androidx.datastore:datastore-preferences-core:1.0.0 +| | | | +--- org.jetbrains.kotlin:kotlin-stdlib:1.5.10 -> 2.0.20 (*) +| | | | \--- androidx.datastore:datastore-core:1.0.0 (*) +| | | +--- com.google.android.datatransport:transport-api:3.2.0 (*) +| | | \--- androidx.annotation:annotation:1.5.0 -> 1.8.1 (*) +| | +--- com.google.firebase:firebase-datatransport:18.1.8 -> 19.0.0 (*) +| | +--- androidx.annotation:annotation:1.1.0 -> 1.8.1 (*) +| | +--- androidx.lifecycle:lifecycle-process:2.3.1 -> 2.8.4 +| | | +--- androidx.annotation:annotation:1.2.0 -> 1.8.1 (*) +| | | +--- androidx.lifecycle:lifecycle-runtime:2.8.4 (*) +| | | +--- androidx.startup:startup-runtime:1.1.1 (*) +| | | +--- org.jetbrains.kotlin:kotlin-stdlib:1.8.22 -> 2.0.20 (*) +| | | +--- androidx.lifecycle:lifecycle-common:2.8.4 (c) +| | | +--- androidx.lifecycle:lifecycle-common-java8:2.8.4 (c) +| | | +--- androidx.lifecycle:lifecycle-livedata:2.8.4 (c) +| | | +--- androidx.lifecycle:lifecycle-livedata-core:2.8.4 (c) +| | | +--- androidx.lifecycle:lifecycle-livedata-core-ktx:2.8.4 (c) +| | | +--- androidx.lifecycle:lifecycle-runtime:2.8.4 (c) +| | | +--- androidx.lifecycle:lifecycle-runtime-compose:2.8.4 (c) +| | | +--- androidx.lifecycle:lifecycle-runtime-ktx:2.8.4 (c) +| | | +--- androidx.lifecycle:lifecycle-viewmodel:2.8.4 (c) +| | | +--- androidx.lifecycle:lifecycle-viewmodel-compose:2.8.4 (c) +| | | +--- androidx.lifecycle:lifecycle-viewmodel-ktx:2.8.4 (c) +| | | \--- androidx.lifecycle:lifecycle-viewmodel-savedstate:2.8.4 (c) +| | +--- com.google.android.gms:play-services-tasks:18.0.1 -> 18.2.0 (*) +| | +--- com.google.protobuf:protobuf-javalite:3.21.11 +| | +--- org.jetbrains.kotlin:kotlin-stdlib:1.8.22 -> 2.0.20 (*) +| | +--- androidx.appcompat:appcompat:1.2.0 -> 1.7.0 +| | | +--- androidx.activity:activity:1.7.0 -> 1.9.1 (*) +| | | +--- androidx.annotation:annotation:1.3.0 -> 1.8.1 (*) +| | | +--- androidx.appcompat:appcompat-resources:1.7.0 +| | | | +--- androidx.annotation:annotation:1.2.0 -> 1.8.1 (*) +| | | | +--- androidx.collection:collection:1.0.0 -> 1.4.2 (*) +| | | | +--- androidx.core:core:1.6.0 -> 1.13.1 (*) +| | | | +--- androidx.vectordrawable:vectordrawable:1.1.0 +| | | | | +--- androidx.annotation:annotation:1.1.0 -> 1.8.1 (*) +| | | | | +--- androidx.core:core:1.1.0 -> 1.13.1 (*) +| | | | | \--- androidx.collection:collection:1.1.0 -> 1.4.2 (*) +| | | | +--- androidx.vectordrawable:vectordrawable-animated:1.1.0 +| | | | | +--- androidx.vectordrawable:vectordrawable:1.1.0 (*) +| | | | | +--- androidx.interpolator:interpolator:1.0.0 (*) +| | | | | \--- androidx.collection:collection:1.1.0 -> 1.4.2 (*) +| | | | \--- androidx.appcompat:appcompat:1.7.0 (c) +| | | +--- androidx.collection:collection:1.0.0 -> 1.4.2 (*) +| | | +--- androidx.core:core:1.13.0 -> 1.13.1 (*) +| | | +--- androidx.core:core-ktx:1.13.0 -> 1.13.1 (*) +| | | +--- androidx.cursoradapter:cursoradapter:1.0.0 +| | | | \--- androidx.annotation:annotation:1.0.0 -> 1.8.1 (*) +| | | +--- androidx.drawerlayout:drawerlayout:1.0.0 +| | | | +--- androidx.annotation:annotation:1.0.0 -> 1.8.1 (*) +| | | | +--- androidx.core:core:1.0.0 -> 1.13.1 (*) +| | | | \--- androidx.customview:customview:1.0.0 (*) +| | | +--- androidx.emoji2:emoji2:1.3.0 +| | | | +--- androidx.annotation:annotation:1.2.0 -> 1.8.1 (*) +| | | | +--- androidx.collection:collection:1.1.0 -> 1.4.2 (*) +| | | | +--- androidx.core:core:1.3.0 -> 1.13.1 (*) +| | | | +--- androidx.lifecycle:lifecycle-process:2.4.1 -> 2.8.4 (*) +| | | | +--- androidx.startup:startup-runtime:1.0.0 -> 1.1.1 (*) +| | | | \--- androidx.emoji2:emoji2-views-helper:1.3.0 (c) +| | | +--- androidx.emoji2:emoji2-views-helper:1.2.0 -> 1.3.0 +| | | | +--- androidx.collection:collection:1.1.0 -> 1.4.2 (*) +| | | | +--- androidx.core:core:1.3.0 -> 1.13.1 (*) +| | | | +--- androidx.emoji2:emoji2:1.3.0 (*) +| | | | \--- androidx.emoji2:emoji2:1.3.0 (c) +| | | +--- androidx.fragment:fragment:1.5.4 -> 1.7.1 (*) +| | | +--- androidx.lifecycle:lifecycle-runtime:2.6.1 -> 2.8.4 (*) +| | | +--- androidx.lifecycle:lifecycle-viewmodel:2.6.1 -> 2.8.4 (*) +| | | +--- androidx.profileinstaller:profileinstaller:1.3.1 (*) +| | | +--- androidx.resourceinspection:resourceinspection-annotation:1.0.1 +| | | | \--- androidx.annotation:annotation:1.1.0 -> 1.8.1 (*) +| | | +--- androidx.savedstate:savedstate:1.2.1 (*) +| | | +--- org.jetbrains.kotlin:kotlin-stdlib:1.8.22 -> 2.0.20 (*) +| | | \--- androidx.appcompat:appcompat-resources:1.7.0 (c) +| | +--- com.google.android.datatransport:transport-api:3.0.0 -> 3.2.0 (*) +| | +--- com.google.dagger:dagger:2.27 -> 2.52 (*) +| | \--- com.squareup.okhttp3:okhttp:3.12.1 -> 4.12.0 +| | +--- com.squareup.okio:okio:3.6.0 +| | | \--- com.squareup.okio:okio-jvm:3.6.0 +| | | +--- org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.9.10 (*) +| | | \--- org.jetbrains.kotlin:kotlin-stdlib-common:1.9.10 -> 2.0.20 +| | | \--- org.jetbrains.kotlin:kotlin-stdlib:2.0.20 (*) +| | \--- org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.8.21 -> 1.9.10 (*) +| +--- com.google.firebase:firebase-common:21.0.0 (*) +| +--- com.google.firebase:firebase-common-ktx:21.0.0 (*) +| +--- org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.8.22 -> 1.9.10 (*) +| \--- com.google.firebase:firebase-components:18.0.0 (*) ++--- com.google.firebase:firebase-crashlytics-ktx -> 19.0.3 +| +--- com.google.firebase:firebase-crashlytics:19.0.3 +| | +--- com.google.firebase:firebase-sessions:2.0.3 (*) +| | +--- com.google.android.gms:play-services-tasks:18.1.0 -> 18.2.0 (*) +| | +--- com.google.firebase:firebase-annotations:16.2.0 (*) +| | +--- com.google.firebase:firebase-common:21.0.0 (*) +| | +--- com.google.firebase:firebase-common-ktx:21.0.0 (*) +| | +--- com.google.firebase:firebase-components:18.0.0 (*) +| | +--- com.google.firebase:firebase-config-interop:16.0.1 (*) +| | +--- com.google.firebase:firebase-encoders:17.0.0 (*) +| | +--- com.google.firebase:firebase-encoders-json:18.0.1 (*) +| | +--- com.google.firebase:firebase-installations:18.0.0 (*) +| | +--- com.google.firebase:firebase-installations-interop:17.2.0 (*) +| | +--- com.google.firebase:firebase-measurement-connector:20.0.1 (*) +| | +--- org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.8.22 -> 1.9.10 (*) +| | +--- com.google.android.datatransport:transport-api:3.2.0 (*) +| | +--- com.google.android.datatransport:transport-backend-cct:3.3.0 (*) +| | +--- com.google.android.datatransport:transport-runtime:3.3.0 (*) +| | \--- androidx.annotation:annotation:1.5.0 -> 1.8.1 (*) +| +--- com.google.firebase:firebase-common:21.0.0 (*) +| +--- com.google.firebase:firebase-common-ktx:21.0.0 (*) +| +--- org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.8.22 -> 1.9.10 (*) +| \--- com.google.firebase:firebase-components:18.0.0 (*) ++--- com.google.firebase:firebase-messaging-ktx -> 24.0.1 +| +--- com.google.firebase:firebase-messaging:24.0.1 +| | +--- com.google.firebase:firebase-common:21.0.0 (*) +| | +--- com.google.firebase:firebase-common-ktx:21.0.0 (*) +| | +--- com.google.firebase:firebase-components:18.0.0 (*) +| | +--- com.google.firebase:firebase-datatransport:18.2.0 -> 19.0.0 (*) +| | +--- com.google.firebase:firebase-encoders:17.0.0 (*) +| | +--- com.google.firebase:firebase-encoders-json:18.0.0 -> 18.0.1 (*) +| | +--- com.google.firebase:firebase-encoders-proto:16.0.0 (*) +| | +--- com.google.firebase:firebase-iid-interop:17.1.0 +| | | +--- com.google.android.gms:play-services-basement:17.0.0 -> 18.4.0 (*) +| | | \--- com.google.android.gms:play-services-tasks:17.0.0 -> 18.2.0 (*) +| | +--- com.google.firebase:firebase-installations:17.2.0 -> 18.0.0 (*) +| | +--- com.google.firebase:firebase-installations-interop:17.1.0 -> 17.2.0 (*) +| | +--- com.google.firebase:firebase-measurement-connector:19.0.0 -> 20.0.1 (*) +| | +--- androidx.annotation:annotation:1.2.0 -> 1.8.1 (*) +| | +--- com.google.android.datatransport:transport-api:3.1.0 -> 3.2.0 (*) +| | +--- com.google.android.datatransport:transport-backend-cct:3.1.8 -> 3.3.0 (*) +| | +--- com.google.android.datatransport:transport-runtime:3.1.8 -> 3.3.0 (*) +| | +--- com.google.android.gms:play-services-base:18.0.1 -> 18.5.0 +| | | +--- androidx.collection:collection:1.0.0 -> 1.4.2 (*) +| | | +--- androidx.core:core:1.2.0 -> 1.13.1 (*) +| | | +--- androidx.fragment:fragment:1.0.0 -> 1.7.1 (*) +| | | +--- com.google.android.gms:play-services-basement:18.4.0 (*) +| | | \--- com.google.android.gms:play-services-tasks:18.2.0 (*) +| | +--- com.google.android.gms:play-services-basement:18.1.0 -> 18.4.0 (*) +| | +--- com.google.android.gms:play-services-cloud-messaging:17.2.0 +| | | +--- com.google.android.gms:play-services-basement:18.3.0 -> 18.4.0 (*) +| | | \--- com.google.android.gms:play-services-tasks:18.1.0 -> 18.2.0 (*) +| | +--- com.google.android.gms:play-services-stats:17.0.2 (*) +| | +--- com.google.android.gms:play-services-tasks:18.0.1 -> 18.2.0 (*) +| | +--- com.google.errorprone:error_prone_annotations:2.9.0 -> 2.26.0 +| | \--- org.jetbrains.kotlin:kotlin-stdlib:1.8.22 -> 2.0.20 (*) +| +--- com.google.firebase:firebase-common:21.0.0 (*) +| +--- com.google.firebase:firebase-common-ktx:21.0.0 (*) +| +--- org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.8.22 -> 1.9.10 (*) +| \--- com.google.firebase:firebase-components:18.0.0 (*) ++--- project :shared +| +--- org.jetbrains.compose.ui:ui-tooling-preview:1.6.11 +| | \--- androidx.compose.ui:ui-tooling-preview:1.6.7 -> 1.7.0-rc01 (*) +| +--- androidx.activity:activity-compose:1.9.1 +| | +--- androidx.activity:activity-ktx:1.9.1 +| | | +--- androidx.activity:activity:1.9.1 (*) +| | | +--- androidx.core:core-ktx:1.13.0 -> 1.13.1 (*) +| | | +--- androidx.lifecycle:lifecycle-runtime-ktx:2.6.1 -> 2.8.4 +| | | | \--- androidx.lifecycle:lifecycle-runtime-ktx-android:2.8.4 +| | | | +--- androidx.annotation:annotation:1.8.0 -> 1.8.1 (*) +| | | | +--- androidx.lifecycle:lifecycle-runtime:2.8.4 (*) +| | | | +--- org.jetbrains.kotlin:kotlin-stdlib:1.8.22 -> 2.0.20 (*) +| | | | +--- org.jetbrains.kotlinx:kotlinx-coroutines-android:1.7.3 -> 1.8.0 (*) +| | | | +--- androidx.lifecycle:lifecycle-common:2.8.4 (c) +| | | | +--- androidx.lifecycle:lifecycle-common-java8:2.8.4 (c) +| | | | +--- androidx.lifecycle:lifecycle-livedata:2.8.4 (c) +| | | | +--- androidx.lifecycle:lifecycle-livedata-core:2.8.4 (c) +| | | | +--- androidx.lifecycle:lifecycle-livedata-core-ktx:2.8.4 (c) +| | | | +--- androidx.lifecycle:lifecycle-process:2.8.4 (c) +| | | | +--- androidx.lifecycle:lifecycle-runtime:2.8.4 (c) +| | | | +--- androidx.lifecycle:lifecycle-runtime-compose:2.8.4 (c) +| | | | +--- androidx.lifecycle:lifecycle-viewmodel:2.8.4 (c) +| | | | +--- androidx.lifecycle:lifecycle-viewmodel-compose:2.8.4 (c) +| | | | +--- androidx.lifecycle:lifecycle-viewmodel-ktx:2.8.4 (c) +| | | | \--- androidx.lifecycle:lifecycle-viewmodel-savedstate:2.8.4 (c) +| | | +--- androidx.lifecycle:lifecycle-viewmodel-ktx:2.6.1 -> 2.8.4 +| | | | +--- androidx.lifecycle:lifecycle-viewmodel:2.8.4 (*) +| | | | +--- org.jetbrains.kotlin:kotlin-stdlib:1.8.22 -> 2.0.20 (*) +| | | | +--- org.jetbrains.kotlinx:kotlinx-coroutines-android:1.7.3 -> 1.8.0 (*) +| | | | +--- androidx.lifecycle:lifecycle-common:2.8.4 (c) +| | | | +--- androidx.lifecycle:lifecycle-common-java8:2.8.4 (c) +| | | | +--- androidx.lifecycle:lifecycle-livedata:2.8.4 (c) +| | | | +--- androidx.lifecycle:lifecycle-livedata-core:2.8.4 (c) +| | | | +--- androidx.lifecycle:lifecycle-livedata-core-ktx:2.8.4 (c) +| | | | +--- androidx.lifecycle:lifecycle-process:2.8.4 (c) +| | | | +--- androidx.lifecycle:lifecycle-runtime:2.8.4 (c) +| | | | +--- androidx.lifecycle:lifecycle-runtime-compose:2.8.4 (c) +| | | | +--- androidx.lifecycle:lifecycle-runtime-ktx:2.8.4 (c) +| | | | +--- androidx.lifecycle:lifecycle-viewmodel:2.8.4 (c) +| | | | +--- androidx.lifecycle:lifecycle-viewmodel-compose:2.8.4 (c) +| | | | \--- androidx.lifecycle:lifecycle-viewmodel-savedstate:2.8.4 (c) +| | | +--- androidx.savedstate:savedstate-ktx:1.2.1 +| | | | +--- androidx.savedstate:savedstate:1.2.1 (*) +| | | | +--- org.jetbrains.kotlin:kotlin-stdlib:1.8.10 -> 2.0.20 (*) +| | | | \--- androidx.savedstate:savedstate:1.2.1 (c) +| | | +--- org.jetbrains.kotlin:kotlin-stdlib:1.8.22 -> 2.0.20 (*) +| | | +--- androidx.activity:activity:1.9.1 (c) +| | | \--- androidx.activity:activity-compose:1.9.1 (c) +| | +--- androidx.compose.runtime:runtime:1.0.1 -> 1.7.0-rc01 (*) +| | +--- androidx.compose.runtime:runtime-saveable:1.0.1 -> 1.7.0-rc01 +| | | \--- androidx.compose.runtime:runtime-saveable-android:1.7.0-rc01 +| | | +--- androidx.annotation:annotation:1.1.0 -> 1.8.1 (*) +| | | +--- androidx.compose.runtime:runtime:1.7.0-rc01 (*) +| | | +--- org.jetbrains.kotlin:kotlin-stdlib:1.8.22 -> 2.0.20 (*) +| | | \--- androidx.compose.runtime:runtime:1.7.0-rc01 (c) +| | +--- androidx.compose.ui:ui:1.0.1 -> 1.7.0-rc01 +| | | \--- androidx.compose.ui:ui-android:1.7.0-rc01 +| | | +--- androidx.activity:activity-ktx:1.7.0 -> 1.9.1 (*) +| | | +--- androidx.annotation:annotation:1.6.0 -> 1.8.1 (*) +| | | +--- androidx.annotation:annotation-experimental:1.4.0 -> 1.4.1 (*) +| | | +--- androidx.autofill:autofill:1.0.0 +| | | | \--- androidx.core:core:1.1.0 -> 1.13.1 (*) +| | | +--- androidx.collection:collection:1.0.0 -> 1.4.2 (*) +| | | +--- androidx.collection:collection:1.4.0 -> 1.4.2 (*) +| | | +--- androidx.compose.runtime:runtime:1.7.0-rc01 (*) +| | | +--- androidx.compose.runtime:runtime-saveable:1.7.0-rc01 (*) +| | | +--- androidx.compose.ui:ui-geometry:1.7.0-rc01 +| | | | \--- androidx.compose.ui:ui-geometry-android:1.7.0-rc01 +| | | | +--- androidx.annotation:annotation:1.1.0 -> 1.8.1 (*) +| | | | +--- androidx.compose.runtime:runtime:1.7.0-rc01 (*) +| | | | +--- androidx.compose.ui:ui-util:1.7.0-rc01 +| | | | | \--- androidx.compose.ui:ui-util-android:1.7.0-rc01 +| | | | | +--- androidx.annotation:annotation-experimental:1.4.0 -> 1.4.1 (*) +| | | | | +--- org.jetbrains.kotlin:kotlin-stdlib:1.8.22 -> 2.0.20 (*) +| | | | | +--- androidx.compose.ui:ui:1.7.0-rc01 (c) +| | | | | +--- androidx.compose.ui:ui-geometry:1.7.0-rc01 (c) +| | | | | +--- androidx.compose.ui:ui-graphics:1.7.0-rc01 (c) +| | | | | +--- androidx.compose.ui:ui-text:1.7.0-rc01 (c) +| | | | | +--- androidx.compose.ui:ui-tooling-preview:1.7.0-rc01 (c) +| | | | | \--- androidx.compose.ui:ui-unit:1.7.0-rc01 (c) +| | | | +--- org.jetbrains.kotlin:kotlin-stdlib:1.8.22 -> 2.0.20 (*) +| | | | +--- androidx.compose.ui:ui:1.7.0-rc01 (c) +| | | | +--- androidx.compose.ui:ui-graphics:1.7.0-rc01 (c) +| | | | +--- androidx.compose.ui:ui-text:1.7.0-rc01 (c) +| | | | +--- androidx.compose.ui:ui-tooling-preview:1.7.0-rc01 (c) +| | | | +--- androidx.compose.ui:ui-unit:1.7.0-rc01 (c) +| | | | \--- androidx.compose.ui:ui-util:1.7.0-rc01 (c) +| | | +--- androidx.compose.ui:ui-graphics:1.7.0-rc01 +| | | | \--- androidx.compose.ui:ui-graphics-android:1.7.0-rc01 +| | | | +--- androidx.annotation:annotation:1.7.0 -> 1.8.1 (*) +| | | | +--- androidx.annotation:annotation-experimental:1.4.0 -> 1.4.1 (*) +| | | | +--- androidx.collection:collection:1.4.0 -> 1.4.2 (*) +| | | | +--- androidx.compose.runtime:runtime:1.7.0-rc01 (*) +| | | | +--- androidx.compose.ui:ui-unit:1.7.0-rc01 +| | | | | \--- androidx.compose.ui:ui-unit-android:1.7.0-rc01 +| | | | | +--- androidx.annotation:annotation:1.1.0 -> 1.8.1 (*) +| | | | | +--- androidx.annotation:annotation-experimental:1.4.0 -> 1.4.1 (*) +| | | | | +--- androidx.collection:collection:1.4.0 -> 1.4.2 (*) +| | | | | +--- androidx.collection:collection-ktx:1.2.0 -> 1.4.2 +| | | | | | +--- androidx.collection:collection:1.4.2 (*) +| | | | | | \--- androidx.collection:collection:1.4.2 (c) +| | | | | +--- androidx.compose.runtime:runtime:1.7.0-rc01 (*) +| | | | | +--- androidx.compose.ui:ui-geometry:1.7.0-rc01 (*) +| | | | | +--- androidx.compose.ui:ui-util:1.7.0-rc01 (*) +| | | | | +--- org.jetbrains.kotlin:kotlin-stdlib:1.8.22 -> 2.0.20 (*) +| | | | | +--- androidx.compose.ui:ui:1.7.0-rc01 (c) +| | | | | +--- androidx.compose.ui:ui-geometry:1.7.0-rc01 (c) +| | | | | +--- androidx.compose.ui:ui-graphics:1.7.0-rc01 (c) +| | | | | +--- androidx.compose.ui:ui-text:1.7.0-rc01 (c) +| | | | | +--- androidx.compose.ui:ui-tooling-preview:1.7.0-rc01 (c) +| | | | | \--- androidx.compose.ui:ui-util:1.7.0-rc01 (c) +| | | | +--- androidx.compose.ui:ui-util:1.7.0-rc01 (*) +| | | | +--- androidx.core:core:1.12.0 -> 1.13.1 (*) +| | | | +--- androidx.graphics:graphics-path:1.0.1 +| | | | | +--- androidx.core:core:1.12.0 -> 1.13.1 (*) +| | | | | \--- org.jetbrains.kotlin:kotlin-stdlib:1.8.22 -> 2.0.20 (*) +| | | | +--- androidx.compose.ui:ui:1.7.0-rc01 (c) +| | | | +--- androidx.compose.ui:ui-geometry:1.7.0-rc01 (c) +| | | | +--- androidx.compose.ui:ui-text:1.7.0-rc01 (c) +| | | | +--- androidx.compose.ui:ui-tooling-preview:1.7.0-rc01 (c) +| | | | +--- androidx.compose.ui:ui-unit:1.7.0-rc01 (c) +| | | | \--- androidx.compose.ui:ui-util:1.7.0-rc01 (c) +| | | +--- androidx.compose.ui:ui-text:1.7.0-rc01 +| | | | \--- androidx.compose.ui:ui-text-android:1.7.0-rc01 +| | | | +--- androidx.annotation:annotation:1.1.0 -> 1.8.1 (*) +| | | | +--- androidx.annotation:annotation-experimental:1.4.0 -> 1.4.1 (*) +| | | | +--- androidx.collection:collection:1.4.0 -> 1.4.2 (*) +| | | | +--- androidx.compose.runtime:runtime:1.7.0-rc01 (*) +| | | | +--- androidx.compose.runtime:runtime-saveable:1.6.0 -> 1.7.0-rc01 (*) +| | | | +--- androidx.compose.ui:ui-graphics:1.7.0-rc01 (*) +| | | | +--- androidx.compose.ui:ui-unit:1.7.0-rc01 (*) +| | | | +--- androidx.compose.ui:ui-util:1.7.0-rc01 (*) +| | | | +--- androidx.core:core:1.7.0 -> 1.13.1 (*) +| | | | +--- androidx.emoji2:emoji2:1.2.0 -> 1.3.0 (*) +| | | | +--- org.jetbrains.kotlin:kotlin-stdlib:1.8.22 -> 2.0.20 (*) +| | | | +--- org.jetbrains.kotlinx:kotlinx-coroutines-core:1.7.3 -> 1.8.0 (*) +| | | | +--- androidx.compose.ui:ui:1.7.0-rc01 (c) +| | | | +--- androidx.compose.ui:ui-geometry:1.7.0-rc01 (c) +| | | | +--- androidx.compose.ui:ui-graphics:1.7.0-rc01 (c) +| | | | +--- androidx.compose.ui:ui-tooling-preview:1.7.0-rc01 (c) +| | | | +--- androidx.compose.ui:ui-unit:1.7.0-rc01 (c) +| | | | \--- androidx.compose.ui:ui-util:1.7.0-rc01 (c) +| | | +--- androidx.compose.ui:ui-unit:1.7.0-rc01 (*) +| | | +--- androidx.compose.ui:ui-util:1.7.0-rc01 (*) +| | | +--- androidx.core:core:1.12.0 -> 1.13.1 (*) +| | | +--- androidx.customview:customview-poolingcontainer:1.0.0 +| | | | +--- androidx.core:core-ktx:1.5.0 -> 1.13.1 (*) +| | | | \--- org.jetbrains.kotlin:kotlin-stdlib:1.6.21 -> 2.0.20 (*) +| | | +--- androidx.emoji2:emoji2:1.2.0 -> 1.3.0 (*) +| | | +--- androidx.lifecycle:lifecycle-runtime-compose:2.8.3 -> 2.8.4 +| | | | \--- androidx.lifecycle:lifecycle-runtime-compose-android:2.8.4 +| | | | +--- androidx.annotation:annotation:1.8.0 -> 1.8.1 (*) +| | | | +--- androidx.compose.runtime:runtime:1.6.5 -> 1.7.0-rc01 (*) +| | | | +--- androidx.lifecycle:lifecycle-runtime:2.8.4 (*) +| | | | +--- androidx.lifecycle:lifecycle-runtime-ktx:2.8.4 (*) +| | | | +--- androidx.lifecycle:lifecycle-common:2.8.4 (c) +| | | | +--- androidx.lifecycle:lifecycle-common-java8:2.8.4 (c) +| | | | +--- androidx.lifecycle:lifecycle-livedata:2.8.4 (c) +| | | | +--- androidx.lifecycle:lifecycle-process:2.8.4 (c) +| | | | +--- androidx.lifecycle:lifecycle-runtime:2.8.4 (c) +| | | | +--- androidx.lifecycle:lifecycle-runtime-ktx:2.8.4 (c) +| | | | +--- androidx.lifecycle:lifecycle-viewmodel:2.8.4 (c) +| | | | +--- androidx.lifecycle:lifecycle-viewmodel-compose:2.8.4 (c) +| | | | +--- androidx.lifecycle:lifecycle-viewmodel-ktx:2.8.4 (c) +| | | | +--- androidx.lifecycle:lifecycle-viewmodel-savedstate:2.8.4 (c) +| | | | +--- androidx.lifecycle:lifecycle-livedata-core-ktx:2.8.4 (c) +| | | | \--- androidx.lifecycle:lifecycle-livedata-core:2.8.4 (c) +| | | +--- androidx.lifecycle:lifecycle-viewmodel:2.6.1 -> 2.8.4 (*) +| | | +--- androidx.profileinstaller:profileinstaller:1.3.1 (*) +| | | +--- androidx.savedstate:savedstate-ktx:1.2.1 (*) +| | | +--- org.jetbrains.kotlin:kotlin-stdlib:1.8.22 -> 2.0.20 (*) +| | | +--- org.jetbrains.kotlinx:kotlinx-coroutines-android:1.7.3 -> 1.8.0 (*) +| | | +--- org.jetbrains.kotlinx:kotlinx-coroutines-core:1.7.3 -> 1.8.0 (*) +| | | +--- androidx.compose.ui:ui-geometry:1.7.0-rc01 (c) +| | | +--- androidx.compose.ui:ui-graphics:1.7.0-rc01 (c) +| | | +--- androidx.compose.ui:ui-text:1.7.0-rc01 (c) +| | | +--- androidx.compose.ui:ui-tooling-preview:1.7.0-rc01 (c) +| | | +--- androidx.compose.ui:ui-unit:1.7.0-rc01 (c) +| | | +--- androidx.compose.ui:ui-util:1.7.0-rc01 (c) +| | | \--- androidx.compose.foundation:foundation:1.7.0-rc01 (c) +| | +--- androidx.lifecycle:lifecycle-viewmodel:2.6.1 -> 2.8.4 (*) +| | +--- org.jetbrains.kotlin:kotlin-stdlib:1.8.22 -> 2.0.20 (*) +| | +--- androidx.activity:activity:1.9.1 (c) +| | \--- androidx.activity:activity-ktx:1.9.1 (c) +| +--- io.insert-koin:koin-android:3.6.0-Beta4 +| | +--- io.insert-koin:koin-core:3.6.0-Beta4 +| | | \--- io.insert-koin:koin-core-jvm:3.6.0-Beta4 +| | | +--- co.touchlab:stately-concurrency:2.0.6 +| | | | \--- co.touchlab:stately-concurrency-jvm:2.0.6 +| | | | +--- org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.9.10 (*) +| | | | \--- co.touchlab:stately-strict:2.0.6 +| | | | \--- co.touchlab:stately-strict-jvm:2.0.6 +| | | | \--- org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.9.10 (*) +| | | +--- co.touchlab:stately-concurrent-collections:2.0.6 +| | | | \--- co.touchlab:stately-concurrent-collections-jvm:2.0.6 +| | | | +--- org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.9.10 (*) +| | | | \--- co.touchlab:stately-concurrency:2.0.6 (*) +| | | \--- org.jetbrains.kotlin:kotlin-stdlib:1.9.24 -> 2.0.20 (*) +| | +--- androidx.appcompat:appcompat:1.6.1 -> 1.7.0 (*) +| | +--- androidx.activity:activity-ktx:1.9.0 -> 1.9.1 (*) +| | +--- androidx.fragment:fragment-ktx:1.7.1 +| | | +--- androidx.activity:activity-ktx:1.8.1 -> 1.9.1 (*) +| | | +--- androidx.collection:collection-ktx:1.1.0 -> 1.4.2 (*) +| | | +--- androidx.core:core-ktx:1.2.0 -> 1.13.1 (*) +| | | +--- androidx.fragment:fragment:1.7.1 (*) +| | | +--- androidx.lifecycle:lifecycle-livedata-core-ktx:2.6.1 -> 2.8.4 (*) +| | | +--- androidx.lifecycle:lifecycle-viewmodel-ktx:2.6.1 -> 2.8.4 (*) +| | | +--- androidx.savedstate:savedstate-ktx:1.2.1 (*) +| | | +--- org.jetbrains.kotlin:kotlin-stdlib:1.8.22 -> 2.0.20 (*) +| | | \--- androidx.fragment:fragment:1.7.1 (c) +| | +--- androidx.lifecycle:lifecycle-viewmodel-ktx:2.8.0 -> 2.8.4 (*) +| | +--- androidx.lifecycle:lifecycle-common-java8:2.8.0 -> 2.8.4 +| | | +--- androidx.annotation:annotation:1.1.0 -> 1.8.1 (*) +| | | +--- androidx.lifecycle:lifecycle-common:2.8.4 (*) +| | | +--- androidx.lifecycle:lifecycle-common:2.8.4 (c) +| | | +--- androidx.lifecycle:lifecycle-livedata:2.8.4 (c) +| | | +--- androidx.lifecycle:lifecycle-livedata-core-ktx:2.8.4 (c) +| | | +--- androidx.lifecycle:lifecycle-process:2.8.4 (c) +| | | +--- androidx.lifecycle:lifecycle-runtime:2.8.4 (c) +| | | +--- androidx.lifecycle:lifecycle-runtime-compose:2.8.4 (c) +| | | +--- androidx.lifecycle:lifecycle-runtime-ktx:2.8.4 (c) +| | | +--- androidx.lifecycle:lifecycle-viewmodel:2.8.4 (c) +| | | +--- androidx.lifecycle:lifecycle-viewmodel-compose:2.8.4 (c) +| | | +--- androidx.lifecycle:lifecycle-viewmodel-ktx:2.8.4 (c) +| | | +--- androidx.lifecycle:lifecycle-viewmodel-savedstate:2.8.4 (c) +| | | \--- androidx.lifecycle:lifecycle-livedata-core:2.8.4 (c) +| | \--- org.jetbrains.kotlin:kotlin-stdlib:1.9.24 -> 2.0.20 (*) +| +--- io.insert-koin:koin-androidx-compose:3.6.0-Beta4 +| | +--- io.insert-koin:koin-android:3.6.0-Beta4 (*) +| | +--- io.insert-koin:koin-compose:1.2.0-Beta4 +| | | \--- io.insert-koin:koin-compose-jvm:1.2.0-Beta4 +| | | +--- io.insert-koin:koin-core:3.6.0-Beta4 (*) +| | | +--- org.jetbrains.compose.runtime:runtime:1.6.10-rc03 +| | | | \--- androidx.compose.runtime:runtime:1.6.7 -> 1.7.0-rc01 (*) +| | | \--- org.jetbrains.kotlin:kotlin-stdlib:1.9.24 -> 2.0.20 (*) +| | +--- androidx.compose.runtime:runtime:1.6.7 -> 1.7.0-rc01 (*) +| | +--- androidx.lifecycle:lifecycle-viewmodel-compose:2.8.0 -> 2.8.4 +| | | \--- androidx.lifecycle:lifecycle-viewmodel-compose-android:2.8.4 +| | | +--- androidx.annotation:annotation:1.8.0 -> 1.8.1 (*) +| | | +--- androidx.compose.runtime:runtime:1.6.0 -> 1.7.0-rc01 (*) +| | | +--- androidx.compose.ui:ui:1.6.0 -> 1.7.0-rc01 (*) +| | | +--- androidx.lifecycle:lifecycle-common:2.8.4 (*) +| | | +--- androidx.lifecycle:lifecycle-viewmodel:2.8.4 (*) +| | | +--- androidx.lifecycle:lifecycle-viewmodel-savedstate:2.8.4 (*) +| | | +--- org.jetbrains.kotlin:kotlin-stdlib:1.8.22 -> 2.0.20 (*) +| | | +--- androidx.lifecycle:lifecycle-common:2.8.4 (c) +| | | +--- androidx.lifecycle:lifecycle-common-java8:2.8.4 (c) +| | | +--- androidx.lifecycle:lifecycle-livedata:2.8.4 (c) +| | | +--- androidx.lifecycle:lifecycle-livedata-core-ktx:2.8.4 (c) +| | | +--- androidx.lifecycle:lifecycle-process:2.8.4 (c) +| | | +--- androidx.lifecycle:lifecycle-runtime:2.8.4 (c) +| | | +--- androidx.lifecycle:lifecycle-runtime-compose:2.8.4 (c) +| | | +--- androidx.lifecycle:lifecycle-runtime-ktx:2.8.4 (c) +| | | +--- androidx.lifecycle:lifecycle-viewmodel:2.8.4 (c) +| | | +--- androidx.lifecycle:lifecycle-viewmodel-ktx:2.8.4 (c) +| | | +--- androidx.lifecycle:lifecycle-viewmodel-savedstate:2.8.4 (c) +| | | \--- androidx.lifecycle:lifecycle-livedata-core:2.8.4 (c) +| | \--- org.jetbrains.kotlin:kotlin-stdlib:1.9.24 -> 2.0.20 (*) +| +--- io.insert-koin:koin-core:3.6.0-Beta4 (*) +| +--- org.jetbrains.kotlin:kotlin-stdlib:2.0.20 (*) +| +--- org.jetbrains.compose.material:material:1.6.11 +| | \--- androidx.compose.material:material:1.6.7 -> 1.6.8 +| | \--- androidx.compose.material:material-android:1.6.8 +| | +--- androidx.annotation:annotation:1.1.0 -> 1.8.1 (*) +| | +--- androidx.compose.animation:animation:1.6.8 -> 1.7.0-rc01 +| | | \--- androidx.compose.animation:animation-android:1.7.0-rc01 +| | | +--- androidx.annotation:annotation:1.1.0 -> 1.8.1 (*) +| | | +--- androidx.annotation:annotation-experimental:1.4.0 -> 1.4.1 (*) +| | | +--- androidx.collection:collection:1.4.0 -> 1.4.2 (*) +| | | +--- androidx.compose.animation:animation-core:1.7.0-rc01 +| | | | \--- androidx.compose.animation:animation-core-android:1.7.0-rc01 +| | | | +--- androidx.annotation:annotation:1.1.0 -> 1.8.1 (*) +| | | | +--- androidx.collection:collection:1.4.0 -> 1.4.2 (*) +| | | | +--- androidx.compose.runtime:runtime:1.7.0-rc01 (*) +| | | | +--- androidx.compose.ui:ui:1.6.0 -> 1.7.0-rc01 (*) +| | | | +--- androidx.compose.ui:ui-graphics:1.7.0-rc01 (*) +| | | | +--- androidx.compose.ui:ui-unit:1.6.0 -> 1.7.0-rc01 (*) +| | | | +--- androidx.compose.ui:ui-util:1.7.0-rc01 (*) +| | | | +--- org.jetbrains.kotlin:kotlin-stdlib:1.8.22 -> 2.0.20 (*) +| | | | +--- org.jetbrains.kotlinx:kotlinx-coroutines-core:1.7.3 -> 1.8.0 (*) +| | | | \--- androidx.compose.animation:animation:1.7.0-rc01 (c) +| | | +--- androidx.compose.foundation:foundation-layout:1.6.0 -> 1.7.0-rc01 +| | | | \--- androidx.compose.foundation:foundation-layout-android:1.7.0-rc01 +| | | | +--- androidx.annotation:annotation:1.1.0 -> 1.8.1 (*) +| | | | +--- androidx.annotation:annotation-experimental:1.4.0 -> 1.4.1 (*) +| | | | +--- androidx.collection:collection:1.4.0 -> 1.4.2 (*) +| | | | +--- androidx.compose.animation:animation-core:1.2.1 -> 1.7.0-rc01 (*) +| | | | +--- androidx.compose.runtime:runtime:1.7.0-rc01 (*) +| | | | +--- androidx.compose.ui:ui:1.6.0 -> 1.7.0-rc01 (*) +| | | | +--- androidx.compose.ui:ui-unit:1.7.0-rc01 (*) +| | | | +--- androidx.compose.ui:ui-util:1.7.0-rc01 (*) +| | | | +--- androidx.core:core:1.7.0 -> 1.13.1 (*) +| | | | \--- androidx.compose.foundation:foundation:1.7.0-rc01 (c) +| | | +--- androidx.compose.runtime:runtime:1.7.0-rc01 (*) +| | | +--- androidx.compose.ui:ui:1.7.0-rc01 (*) +| | | +--- androidx.compose.ui:ui-geometry:1.6.0 -> 1.7.0-rc01 (*) +| | | +--- androidx.compose.ui:ui-graphics:1.7.0-rc01 (*) +| | | +--- androidx.compose.ui:ui-util:1.7.0-rc01 (*) +| | | \--- androidx.compose.animation:animation-core:1.7.0-rc01 (c) +| | +--- androidx.compose.animation:animation-core:1.6.8 -> 1.7.0-rc01 (*) +| | +--- androidx.compose.foundation:foundation:1.6.8 -> 1.7.0-rc01 +| | | \--- androidx.compose.foundation:foundation-android:1.7.0-rc01 +| | | +--- androidx.annotation:annotation:1.1.0 -> 1.8.1 (*) +| | | +--- androidx.annotation:annotation-experimental:1.4.0 -> 1.4.1 (*) +| | | +--- androidx.collection:collection:1.4.0 -> 1.4.2 (*) +| | | +--- androidx.compose.animation:animation:1.7.0-rc01 (*) +| | | +--- androidx.compose.foundation:foundation-layout:1.7.0-rc01 (*) +| | | +--- androidx.compose.runtime:runtime:1.7.0-rc01 (*) +| | | +--- androidx.compose.ui:ui:1.7.0-rc01 (*) +| | | +--- androidx.compose.ui:ui-text:1.6.0 -> 1.7.0-rc01 (*) +| | | +--- androidx.compose.ui:ui-util:1.6.0 -> 1.7.0-rc01 (*) +| | | +--- androidx.core:core:1.13.1 (*) +| | | +--- androidx.emoji2:emoji2:1.3.0 (*) +| | | \--- androidx.compose.foundation:foundation-layout:1.7.0-rc01 (c) +| | +--- androidx.compose.foundation:foundation-layout:1.6.8 -> 1.7.0-rc01 (*) +| | +--- androidx.compose.material:material-icons-core:1.6.8 +| | | \--- androidx.compose.material:material-icons-core-android:1.6.8 +| | | +--- androidx.compose.ui:ui:1.6.8 -> 1.7.0-rc01 (*) +| | | +--- org.jetbrains.kotlin:kotlin-stdlib:1.8.22 -> 2.0.20 (*) +| | | +--- androidx.compose.material:material:1.6.8 (c) +| | | +--- androidx.compose.material:material-icons-extended:1.6.8 (c) +| | | \--- androidx.compose.material:material-ripple:1.6.8 (c) +| | +--- androidx.compose.material:material-ripple:1.6.8 +| | | \--- androidx.compose.material:material-ripple-android:1.6.8 +| | | +--- androidx.compose.animation:animation:1.6.8 -> 1.7.0-rc01 (*) +| | | +--- androidx.compose.foundation:foundation:1.6.8 -> 1.7.0-rc01 (*) +| | | +--- androidx.compose.runtime:runtime:1.6.8 -> 1.7.0-rc01 (*) +| | | +--- androidx.compose.ui:ui-util:1.6.8 -> 1.7.0-rc01 (*) +| | | +--- androidx.compose.material:material:1.6.8 (c) +| | | +--- androidx.compose.material:material-icons-core:1.6.8 (c) +| | | \--- androidx.compose.material:material-icons-extended:1.6.8 (c) +| | +--- androidx.compose.runtime:runtime:1.6.8 -> 1.7.0-rc01 (*) +| | +--- androidx.compose.ui:ui:1.6.8 -> 1.7.0-rc01 (*) +| | +--- androidx.compose.ui:ui-text:1.6.8 -> 1.7.0-rc01 (*) +| | +--- androidx.compose.ui:ui-util:1.6.8 -> 1.7.0-rc01 (*) +| | +--- androidx.lifecycle:lifecycle-runtime:2.6.1 -> 2.8.4 (*) +| | +--- androidx.lifecycle:lifecycle-viewmodel:2.6.1 -> 2.8.4 (*) +| | +--- androidx.savedstate:savedstate:1.2.1 (*) +| | +--- androidx.compose.material:material-icons-core:1.6.8 (c) +| | +--- androidx.compose.material:material-icons-extended:1.6.8 (c) +| | \--- androidx.compose.material:material-ripple:1.6.8 (c) +| +--- org.jetbrains.compose.material3:material3:1.6.11 +| | \--- androidx.compose.material3:material3:1.2.1 +| | \--- androidx.compose.material3:material3-android:1.2.1 +| | +--- androidx.activity:activity-compose:1.5.0 -> 1.9.1 (*) +| | +--- androidx.annotation:annotation:1.1.0 -> 1.8.1 (*) +| | +--- androidx.annotation:annotation-experimental:1.4.0 -> 1.4.1 (*) +| | +--- androidx.collection:collection:1.4.0 -> 1.4.2 (*) +| | +--- androidx.compose.animation:animation-core:1.6.0 -> 1.7.0-rc01 (*) +| | +--- androidx.compose.foundation:foundation:1.6.0 -> 1.7.0-rc01 (*) +| | +--- androidx.compose.foundation:foundation-layout:1.6.0 -> 1.7.0-rc01 (*) +| | +--- androidx.compose.material:material-icons-core:1.6.0 -> 1.6.8 (*) +| | +--- androidx.compose.material:material-ripple:1.6.0 -> 1.6.8 (*) +| | +--- androidx.compose.runtime:runtime:1.6.0 -> 1.7.0-rc01 (*) +| | +--- androidx.compose.ui:ui-graphics:1.6.0 -> 1.7.0-rc01 (*) +| | +--- androidx.compose.ui:ui-text:1.6.0 -> 1.7.0-rc01 (*) +| | +--- androidx.compose.ui:ui-util:1.6.0 -> 1.7.0-rc01 (*) +| | +--- androidx.lifecycle:lifecycle-common-java8:2.6.1 -> 2.8.4 (*) +| | +--- androidx.lifecycle:lifecycle-runtime:2.6.1 -> 2.8.4 (*) +| | +--- androidx.lifecycle:lifecycle-viewmodel:2.6.1 -> 2.8.4 (*) +| | \--- androidx.savedstate:savedstate-ktx:1.2.1 (*) +| +--- io.insert-koin:koin-compose:1.2.0-Beta4 (*) +| \--- io.insert-koin:koin-compose-viewmodel:1.2.0-Beta4 +| \--- io.insert-koin:koin-compose-viewmodel-jvm:1.2.0-Beta4 +| +--- io.insert-koin:koin-compose:1.2.0-Beta4 (*) +| +--- org.jetbrains.androidx.lifecycle:lifecycle-viewmodel-compose:2.8.0-rc03 +| | \--- androidx.lifecycle:lifecycle-viewmodel-compose:2.8.0 -> 2.8.4 (*) +| +--- org.jetbrains.androidx.navigation:navigation-compose:2.7.0-alpha06 +| | \--- androidx.navigation:navigation-compose:2.7.7 -> 2.8.0-rc01 +| | +--- androidx.activity:activity-compose:1.8.0 -> 1.9.1 (*) +| | +--- androidx.compose.animation:animation:1.7.0-rc01 (*) +| | +--- androidx.compose.foundation:foundation-layout:1.7.0-rc01 (*) +| | +--- androidx.compose.runtime:runtime:1.7.0-rc01 (*) +| | +--- androidx.compose.runtime:runtime-saveable:1.7.0-rc01 (*) +| | +--- androidx.compose.ui:ui:1.7.0-rc01 (*) +| | +--- androidx.lifecycle:lifecycle-viewmodel-compose:2.6.2 -> 2.8.4 (*) +| | +--- androidx.navigation:navigation-runtime-ktx:2.8.0-rc01 +| | | +--- androidx.navigation:navigation-common-ktx:2.8.0-rc01 +| | | | +--- androidx.navigation:navigation-common:2.8.0-rc01 +| | | | | +--- androidx.annotation:annotation:1.8.1 (*) +| | | | | +--- androidx.collection:collection-ktx:1.4.2 (*) +| | | | | +--- androidx.core:core-ktx:1.1.0 -> 1.13.1 (*) +| | | | | +--- androidx.lifecycle:lifecycle-common:2.6.2 -> 2.8.4 (*) +| | | | | +--- androidx.lifecycle:lifecycle-runtime-ktx:2.6.2 -> 2.8.4 (*) +| | | | | +--- androidx.lifecycle:lifecycle-viewmodel-ktx:2.6.2 -> 2.8.4 (*) +| | | | | +--- androidx.lifecycle:lifecycle-viewmodel-savedstate:2.6.2 -> 2.8.4 (*) +| | | | | +--- androidx.profileinstaller:profileinstaller:1.3.1 (*) +| | | | | +--- androidx.savedstate:savedstate-ktx:1.2.1 (*) +| | | | | +--- org.jetbrains.kotlin:kotlin-stdlib:1.8.22 -> 2.0.20 (*) +| | | | | +--- org.jetbrains.kotlinx:kotlinx-serialization-core:1.6.3 +| | | | | | \--- org.jetbrains.kotlinx:kotlinx-serialization-core-jvm:1.6.3 +| | | | | | +--- org.jetbrains.kotlin:kotlin-stdlib:1.9.22 -> 2.0.20 (*) +| | | | | | +--- org.jetbrains.kotlinx:kotlinx-serialization-bom:1.6.3 +| | | | | | | +--- org.jetbrains.kotlinx:kotlinx-serialization-core-jvm:1.6.3 (c) +| | | | | | | \--- org.jetbrains.kotlinx:kotlinx-serialization-core:1.6.3 (c) +| | | | | | \--- org.jetbrains.kotlin:kotlin-stdlib-common:1.9.22 -> 2.0.20 (*) +| | | | | +--- androidx.navigation:navigation-common-ktx:2.8.0-rc01 (c) +| | | | | +--- androidx.navigation:navigation-compose:2.8.0-rc01 (c) +| | | | | +--- androidx.navigation:navigation-runtime:2.8.0-rc01 (c) +| | | | | \--- androidx.navigation:navigation-runtime-ktx:2.8.0-rc01 (c) +| | | | +--- androidx.navigation:navigation-common:2.8.0-rc01 (c) +| | | | +--- androidx.navigation:navigation-compose:2.8.0-rc01 (c) +| | | | +--- androidx.navigation:navigation-runtime:2.8.0-rc01 (c) +| | | | \--- androidx.navigation:navigation-runtime-ktx:2.8.0-rc01 (c) +| | | +--- androidx.navigation:navigation-runtime:2.8.0-rc01 +| | | | +--- androidx.activity:activity-ktx:1.7.1 -> 1.9.1 (*) +| | | | +--- androidx.annotation:annotation-experimental:1.4.1 (*) +| | | | +--- androidx.collection:collection:1.4.2 (*) +| | | | +--- androidx.lifecycle:lifecycle-runtime-ktx:2.6.2 -> 2.8.4 (*) +| | | | +--- androidx.lifecycle:lifecycle-viewmodel-ktx:2.6.2 -> 2.8.4 (*) +| | | | +--- androidx.navigation:navigation-common:2.8.0-rc01 (*) +| | | | +--- org.jetbrains.kotlin:kotlin-stdlib:1.8.22 -> 2.0.20 (*) +| | | | +--- org.jetbrains.kotlinx:kotlinx-serialization-core:1.6.3 (*) +| | | | +--- androidx.navigation:navigation-common:2.8.0-rc01 (c) +| | | | +--- androidx.navigation:navigation-common-ktx:2.8.0-rc01 (c) +| | | | +--- androidx.navigation:navigation-compose:2.8.0-rc01 (c) +| | | | \--- androidx.navigation:navigation-runtime-ktx:2.8.0-rc01 (c) +| | | +--- androidx.navigation:navigation-common-ktx:2.8.0-rc01 (c) +| | | +--- androidx.navigation:navigation-compose:2.8.0-rc01 (c) +| | | +--- androidx.navigation:navigation-runtime:2.8.0-rc01 (c) +| | | \--- androidx.navigation:navigation-common:2.8.0-rc01 (c) +| | +--- org.jetbrains.kotlin:kotlin-stdlib:1.8.22 -> 2.0.20 (*) +| | +--- org.jetbrains.kotlinx:kotlinx-serialization-core:1.6.3 (*) +| | +--- androidx.navigation:navigation-runtime-ktx:2.8.0-rc01 (c) +| | +--- androidx.navigation:navigation-runtime:2.8.0-rc01 (c) +| | +--- androidx.navigation:navigation-common-ktx:2.8.0-rc01 (c) +| | \--- androidx.navigation:navigation-common:2.8.0-rc01 (c) +| \--- org.jetbrains.kotlin:kotlin-stdlib:1.9.24 -> 2.0.20 (*) ++--- project :core:logs +| +--- org.jetbrains.kotlin:kotlin-stdlib:2.0.20 (*) +| +--- androidx.compose:compose-bom:2024.08.00 (*) +| +--- androidx.compose.ui:ui-tooling-preview -> 1.7.0-rc01 (*) +| +--- com.google.dagger:hilt-android:2.52 (*) +| +--- androidx.compose.runtime:runtime -> 1.7.0-rc01 (*) +| +--- com.google.firebase:firebase-bom:33.2.0 (*) +| \--- com.google.firebase:firebase-analytics-ktx -> 22.1.0 (*) ++--- project :core:common +| +--- org.jetbrains.kotlin:kotlin-stdlib:2.0.20 (*) +| \--- com.google.dagger:hilt-android:2.52 (*) ++--- project :core:model +| +--- project :core:common (*) +| +--- org.jetbrains.kotlin:kotlin-stdlib-jdk7:2.0.20 (*) +| +--- com.squareup.retrofit2:converter-gson:2.11.0 +| | +--- com.squareup.retrofit2:retrofit:2.11.0 +| | | \--- com.squareup.okhttp3:okhttp:3.14.9 -> 4.12.0 (*) +| | \--- com.google.code.gson:gson:2.10.1 +| \--- org.jetbrains.kotlin:kotlin-parcelize-runtime:2.0.20 +| +--- org.jetbrains.kotlin:kotlin-stdlib:2.0.20 (*) +| \--- org.jetbrains.kotlin:kotlin-android-extensions-runtime:2.0.20 +| \--- org.jetbrains.kotlin:kotlin-stdlib:2.0.20 (*) ++--- project :core:data +| +--- project :core:common (*) +| +--- project :core:model (*) +| +--- project :core:network +| | +--- project :core:common (*) +| | +--- project :core:model (*) +| | +--- project :core:datastore +| | | +--- project :core:common (*) +| | | +--- project :core:model (*) +| | | +--- org.jetbrains.kotlin:kotlin-stdlib:2.0.20 (*) +| | | +--- com.google.dagger:hilt-android:2.52 (*) +| | | +--- com.squareup.retrofit2:converter-gson:2.11.0 (*) +| | | +--- com.github.Raizlabs.DBFlow:dbflow:4.2.4 +| | | | +--- com.github.Raizlabs.DBFlow:dbflow-core:4.2.4 +| | | | \--- com.android.support:support-annotations:26.0.1 -> androidx.annotation:annotation:1.8.1 (*) +| | | +--- com.github.Raizlabs.DBFlow:dbflow-core:4.2.4 +| | | +--- io.reactivex.rxjava2:rxandroid:2.1.1 +| | | | \--- io.reactivex.rxjava2:rxjava:2.2.6 -> 2.2.21 +| | | | \--- org.reactivestreams:reactive-streams:1.0.3 -> 1.0.4 +| | | \--- io.reactivex.rxjava2:rxjava:2.2.21 (*) +| | +--- com.google.dagger:hilt-android:2.52 (*) +| | +--- com.squareup.retrofit2:retrofit:2.11.0 (*) +| | +--- com.squareup.retrofit2:adapter-rxjava2:2.11.0 +| | | +--- com.squareup.retrofit2:retrofit:2.11.0 (*) +| | | +--- io.reactivex.rxjava2:rxjava:2.2.21 (*) +| | | \--- org.reactivestreams:reactive-streams:1.0.4 +| | +--- com.squareup.retrofit2:converter-gson:2.11.0 (*) +| | +--- com.squareup.okhttp3:logging-interceptor:4.12.0 +| | | +--- com.squareup.okhttp3:okhttp:4.12.0 (*) +| | | \--- org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.8.21 -> 1.9.10 (*) +| | +--- com.squareup.okhttp3:okhttp:4.12.0 (*) +| | +--- org.jetbrains.kotlin:kotlin-stdlib-jdk7:2.0.20 (*) +| | \--- org.mockito:mockito-core:5.4.0 +| | +--- net.bytebuddy:byte-buddy:1.14.5 +| | +--- net.bytebuddy:byte-buddy-agent:1.14.5 +| | \--- org.objenesis:objenesis:3.3 +| +--- org.jetbrains.kotlin:kotlin-stdlib:2.0.20 (*) +| +--- com.google.dagger:hilt-android:2.52 (*) +| +--- com.squareup.retrofit2:retrofit:2.11.0 (*) +| +--- com.squareup.okhttp3:okhttp:4.12.0 (*) +| +--- org.mockito:mockito-core:5.4.0 (*) +| +--- app.cash.turbine:turbine:1.1.0 +| | \--- app.cash.turbine:turbine-jvm:1.1.0 +| | +--- org.jetbrains.kotlinx:kotlinx-coroutines-core:1.8.0 (*) +| | +--- org.jetbrains.kotlin:kotlin-stdlib:1.9.22 -> 2.0.20 (*) +| | \--- org.jetbrains.kotlinx:kotlinx-coroutines-test:1.8.0 +| | \--- org.jetbrains.kotlinx:kotlinx-coroutines-test-jvm:1.8.0 +| | +--- org.jetbrains:annotations:23.0.0 +| | +--- org.jetbrains.kotlinx:kotlinx-coroutines-bom:1.8.0 (*) +| | +--- org.jetbrains.kotlinx:kotlinx-coroutines-core:1.8.0 (*) +| | \--- org.jetbrains.kotlin:kotlin-stdlib:1.9.21 -> 2.0.20 (*) +| \--- org.jetbrains.kotlin:kotlin-parcelize-runtime:2.0.20 (*) ++--- project :core:datastore (*) ++--- project :core:ui +| +--- project :core:designsystem +| | +--- androidx.compose.ui:ui -> 1.7.0-rc01 (*) +| | +--- androidx.compose.foundation:foundation -> 1.7.0-rc01 (*) +| | +--- androidx.compose.foundation:foundation-layout -> 1.7.0-rc01 (*) +| | +--- androidx.compose.material:material-icons-extended -> 1.6.8 +| | | \--- androidx.compose.material:material-icons-extended-android:1.6.8 +| | | +--- androidx.compose.material:material-icons-core:1.6.8 (*) +| | | +--- androidx.compose.runtime:runtime:1.6.8 -> 1.7.0-rc01 (*) +| | | +--- androidx.compose.material:material:1.6.8 (c) +| | | +--- androidx.compose.material:material-icons-core:1.6.8 (c) +| | | \--- androidx.compose.material:material-ripple:1.6.8 (c) +| | +--- androidx.compose.material3:material3:1.2.1 (*) +| | +--- androidx.compose.runtime:runtime -> 1.7.0-rc01 (*) +| | +--- androidx.compose.ui:ui-util -> 1.7.0-rc01 (*) +| | +--- androidx.activity:activity-compose:1.9.1 (*) +| | +--- org.jetbrains.kotlin:kotlin-stdlib:2.0.20 (*) +| | +--- androidx.compose:compose-bom:2024.08.00 (*) +| | +--- androidx.compose.ui:ui-tooling-preview -> 1.7.0-rc01 (*) +| | \--- com.google.accompanist:accompanist-pager:0.34.0 +| | +--- org.jetbrains.kotlinx:kotlinx-coroutines-android:1.6.4 -> 1.8.0 (*) +| | +--- androidx.compose.foundation:foundation:1.6.0 -> 1.7.0-rc01 (*) +| | +--- dev.chrisbanes.snapper:snapper:0.2.2 +| | | +--- androidx.compose.foundation:foundation:1.1.1 -> 1.7.0-rc01 (*) +| | | \--- org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.6.10 -> 1.9.10 (*) +| | \--- org.jetbrains.kotlin:kotlin-stdlib:1.9.22 -> 2.0.20 (*) +| +--- project :core:model (*) +| +--- project :core:common (*) +| +--- androidx.metrics:metrics-performance:1.0.0-beta01 +| | +--- androidx.collection:collection:1.1.0 -> 1.4.2 (*) +| | +--- androidx.core:core:1.5.0 -> 1.13.1 (*) +| | \--- org.jetbrains.kotlin:kotlin-stdlib:1.8.22 -> 2.0.20 (*) +| +--- org.jetbrains.kotlin:kotlin-stdlib:2.0.20 (*) +| +--- androidx.compose:compose-bom:2024.08.00 (*) +| \--- androidx.compose.ui:ui-tooling-preview -> 1.7.0-rc01 (*) ++--- project :core:designsystem (*) ++--- project :feature:loan +| +--- org.jetbrains.kotlin:kotlin-stdlib:2.0.20 (*) +| +--- com.google.dagger:hilt-android:2.52 (*) +| +--- project :core:designsystem (*) +| +--- project :core:ui (*) +| +--- project :core:data (*) +| +--- project :core:model (*) +| +--- project :core:common (*) +| +--- org.jetbrains.kotlinx:kotlinx-collections-immutable:0.3.7 +| | \--- org.jetbrains.kotlinx:kotlinx-collections-immutable-jvm:0.3.7 +| | \--- org.jetbrains.kotlin:kotlin-stdlib:1.9.21 -> 2.0.20 (*) +| +--- androidx.hilt:hilt-navigation-compose:1.2.0 +| | +--- androidx.compose.runtime:runtime:1.0.1 -> 1.7.0-rc01 (*) +| | +--- androidx.compose.ui:ui:1.0.1 -> 1.7.0-rc01 (*) +| | +--- androidx.hilt:hilt-navigation:1.2.0 +| | | +--- androidx.annotation:annotation:1.1.0 -> 1.8.1 (*) +| | | +--- androidx.navigation:navigation-runtime:2.5.1 -> 2.8.0-rc01 (*) +| | | +--- com.google.dagger:hilt-android:2.49 -> 2.52 (*) +| | | \--- org.jetbrains.kotlin:kotlin-stdlib:1.8.22 -> 2.0.20 (*) +| | +--- androidx.lifecycle:lifecycle-viewmodel-compose:2.6.1 -> 2.8.4 (*) +| | +--- androidx.navigation:navigation-compose:2.5.1 -> 2.8.0-rc01 (*) +| | \--- org.jetbrains.kotlin:kotlin-stdlib:1.8.22 -> 2.0.20 (*) +| +--- androidx.lifecycle:lifecycle-runtime-compose:2.8.4 (*) +| +--- androidx.lifecycle:lifecycle-viewmodel-compose:2.8.4 (*) +| +--- androidx.compose:compose-bom:2024.08.00 (*) +| +--- androidx.compose.ui:ui-tooling-preview -> 1.7.0-rc01 (*) +| \--- project :core:qrcode +| +--- com.google.zxing:core:3.5.3 +| +--- com.squareup.retrofit2:converter-gson:2.11.0 (*) +| +--- org.jetbrains.kotlin:kotlin-stdlib:2.0.20 (*) +| +--- androidx.compose:compose-bom:2024.08.00 (*) +| +--- androidx.compose.ui:ui-tooling-preview -> 1.7.0-rc01 (*) +| +--- project :core:model (*) +| +--- androidx.compose.ui:ui -> 1.7.0-rc01 (*) +| +--- androidx.camera:camera-camera2:1.3.4 +| | +--- androidx.annotation:annotation:1.2.0 -> 1.8.1 (*) +| | +--- androidx.camera:camera-core:1.3.4 +| | | +--- androidx.annotation:annotation:1.2.0 -> 1.8.1 (*) +| | | +--- androidx.annotation:annotation-experimental:1.1.0 -> 1.4.1 (*) +| | | +--- androidx.concurrent:concurrent-futures:1.0.0 -> 1.1.0 (*) +| | | +--- androidx.core:core:1.1.0 -> 1.13.1 (*) +| | | +--- androidx.exifinterface:exifinterface:1.3.2 +| | | | \--- androidx.annotation:annotation:1.1.0 -> 1.8.1 (*) +| | | +--- androidx.lifecycle:lifecycle-common:2.1.0 -> 2.8.4 (*) +| | | +--- androidx.lifecycle:lifecycle-livedata:2.1.0 -> 2.8.4 (*) +| | | +--- com.google.auto.value:auto-value-annotations:1.6.3 +| | | +--- com.google.guava:listenablefuture:1.0 -> 9999.0-empty-to-avoid-conflict-with-guava +| | | +--- org.jetbrains.kotlin:kotlin-stdlib:1.8.22 -> 2.0.20 (*) +| | | +--- androidx.camera:camera-camera2:1.3.4 (c) +| | | +--- androidx.camera:camera-lifecycle:1.3.4 (c) +| | | +--- androidx.camera:camera-view:1.3.4 (c) +| | | \--- androidx.camera:camera-video:1.3.4 (c) +| | +--- androidx.concurrent:concurrent-futures:1.0.0 -> 1.1.0 (*) +| | +--- androidx.core:core:1.1.0 -> 1.13.1 (*) +| | +--- com.google.auto.value:auto-value-annotations:1.6.3 +| | +--- com.google.guava:listenablefuture:1.0 -> 9999.0-empty-to-avoid-conflict-with-guava +| | +--- androidx.camera:camera-core:1.3.4 (c) +| | +--- androidx.camera:camera-lifecycle:1.3.4 (c) +| | +--- androidx.camera:camera-view:1.3.4 (c) +| | \--- androidx.camera:camera-video:1.3.4 (c) +| +--- androidx.camera:camera-lifecycle:1.3.4 +| | +--- androidx.camera:camera-core:1.3.4 (*) +| | +--- androidx.concurrent:concurrent-futures:1.0.0 -> 1.1.0 (*) +| | +--- androidx.core:core:1.1.0 -> 1.13.1 (*) +| | +--- androidx.lifecycle:lifecycle-common:2.1.0 -> 2.8.4 (*) +| | +--- com.google.auto.value:auto-value-annotations:1.6.3 +| | +--- com.google.guava:listenablefuture:1.0 -> 9999.0-empty-to-avoid-conflict-with-guava +| | +--- androidx.camera:camera-camera2:1.3.4 (c) +| | +--- androidx.camera:camera-core:1.3.4 (c) +| | +--- androidx.camera:camera-view:1.3.4 (c) +| | \--- androidx.camera:camera-video:1.3.4 (c) +| +--- androidx.camera:camera-view:1.3.4 +| | +--- androidx.annotation:annotation:1.2.0 -> 1.8.1 (*) +| | +--- androidx.annotation:annotation-experimental:1.3.1 -> 1.4.1 (*) +| | +--- androidx.appcompat:appcompat:1.1.0 -> 1.7.0 (*) +| | +--- androidx.camera:camera-core:1.3.4 (*) +| | +--- androidx.camera:camera-lifecycle:1.3.4 (*) +| | +--- androidx.camera:camera-video:1.3.4 +| | | +--- androidx.annotation:annotation:1.2.0 -> 1.8.1 (*) +| | | +--- androidx.camera:camera-core:1.3.4 (*) +| | | +--- androidx.concurrent:concurrent-futures:1.0.0 -> 1.1.0 (*) +| | | +--- androidx.core:core:1.1.0 -> 1.13.1 (*) +| | | +--- com.google.auto.value:auto-value-annotations:1.6.3 +| | | +--- androidx.camera:camera-camera2:1.3.4 (c) +| | | +--- androidx.camera:camera-core:1.3.4 (c) +| | | +--- androidx.camera:camera-lifecycle:1.3.4 (c) +| | | \--- androidx.camera:camera-view:1.3.4 (c) +| | +--- androidx.concurrent:concurrent-futures:1.0.0 -> 1.1.0 (*) +| | +--- androidx.core:core:1.3.2 -> 1.13.1 (*) +| | +--- androidx.lifecycle:lifecycle-common:2.0.0 -> 2.8.4 (*) +| | +--- com.google.auto.value:auto-value-annotations:1.6.3 +| | +--- com.google.guava:listenablefuture:1.0 -> 9999.0-empty-to-avoid-conflict-with-guava +| | +--- androidx.camera:camera-camera2:1.3.4 (c) +| | +--- androidx.camera:camera-core:1.3.4 (c) +| | +--- androidx.camera:camera-lifecycle:1.3.4 (c) +| | \--- androidx.camera:camera-video:1.3.4 (c) +| \--- androidx.camera:camera-core:1.3.4 (*) ++--- project :feature:beneficiary +| +--- org.jetbrains.kotlin:kotlin-stdlib:2.0.20 (*) +| +--- com.google.dagger:hilt-android:2.52 (*) +| +--- project :core:designsystem (*) +| +--- project :core:ui (*) +| +--- project :core:data (*) +| +--- project :core:model (*) +| +--- project :core:common (*) +| +--- org.jetbrains.kotlinx:kotlinx-collections-immutable:0.3.7 (*) +| +--- androidx.hilt:hilt-navigation-compose:1.2.0 (*) +| +--- androidx.lifecycle:lifecycle-runtime-compose:2.8.4 (*) +| +--- androidx.lifecycle:lifecycle-viewmodel-compose:2.8.4 (*) +| +--- androidx.compose:compose-bom:2024.08.00 (*) +| +--- androidx.compose.ui:ui-tooling-preview -> 1.7.0-rc01 (*) +| \--- com.squareup.okhttp3:okhttp:4.12.0 (*) ++--- project :feature:guarantor +| +--- org.jetbrains.kotlin:kotlin-stdlib:2.0.20 (*) +| +--- com.google.dagger:hilt-android:2.52 (*) +| +--- project :core:designsystem (*) +| +--- project :core:ui (*) +| +--- project :core:data (*) +| +--- project :core:model (*) +| +--- project :core:common (*) +| +--- org.jetbrains.kotlinx:kotlinx-collections-immutable:0.3.7 (*) +| +--- androidx.hilt:hilt-navigation-compose:1.2.0 (*) +| +--- androidx.lifecycle:lifecycle-runtime-compose:2.8.4 (*) +| +--- androidx.lifecycle:lifecycle-viewmodel-compose:2.8.4 (*) +| +--- androidx.compose:compose-bom:2024.08.00 (*) +| +--- androidx.compose.ui:ui-tooling-preview -> 1.7.0-rc01 (*) +| \--- com.squareup.okhttp3:okhttp:4.12.0 (*) ++--- project :feature:savings +| +--- org.jetbrains.kotlin:kotlin-stdlib:2.0.20 (*) +| +--- com.google.dagger:hilt-android:2.52 (*) +| +--- project :core:designsystem (*) +| +--- project :core:ui (*) +| +--- project :core:data (*) +| +--- project :core:model (*) +| +--- project :core:common (*) +| +--- org.jetbrains.kotlinx:kotlinx-collections-immutable:0.3.7 (*) +| +--- androidx.hilt:hilt-navigation-compose:1.2.0 (*) +| +--- androidx.lifecycle:lifecycle-runtime-compose:2.8.4 (*) +| +--- androidx.lifecycle:lifecycle-viewmodel-compose:2.8.4 (*) +| +--- androidx.compose:compose-bom:2024.08.00 (*) +| +--- androidx.compose.ui:ui-tooling-preview -> 1.7.0-rc01 (*) +| +--- project :core:qrcode (*) +| \--- org.jetbrains.kotlin:kotlin-parcelize-runtime:2.0.20 (*) ++--- project :feature:qr +| +--- org.jetbrains.kotlin:kotlin-stdlib:2.0.20 (*) +| +--- com.google.dagger:hilt-android:2.52 (*) +| +--- project :core:designsystem (*) +| +--- project :core:ui (*) +| +--- project :core:data (*) +| +--- project :core:model (*) +| +--- project :core:common (*) +| +--- org.jetbrains.kotlinx:kotlinx-collections-immutable:0.3.7 (*) +| +--- androidx.hilt:hilt-navigation-compose:1.2.0 (*) +| +--- androidx.lifecycle:lifecycle-runtime-compose:2.8.4 (*) +| +--- androidx.lifecycle:lifecycle-viewmodel-compose:2.8.4 (*) +| +--- androidx.compose:compose-bom:2024.08.00 (*) +| +--- androidx.compose.ui:ui-tooling-preview -> 1.7.0-rc01 (*) +| +--- project :core:qrcode (*) +| +--- io.github.mr0xf00:easycrop:0.1.1 +| | +--- androidx.compose:compose-bom:2023.01.00 -> 2024.08.00 (*) +| | +--- androidx.core:core-ktx:1.9.0 -> 1.13.1 (*) +| | +--- androidx.lifecycle:lifecycle-runtime-ktx:2.5.1 -> 2.8.4 (*) +| | +--- androidx.activity:activity-compose:1.6.1 -> 1.9.1 (*) +| | +--- androidx.compose.material:material -> 1.6.8 (*) +| | +--- androidx.compose.ui:ui -> 1.7.0-rc01 (*) +| | \--- org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.8.0 -> 1.9.10 (*) +| +--- com.google.accompanist:accompanist-permissions:0.34.0 +| | +--- androidx.activity:activity-compose:1.7.2 -> 1.9.1 (*) +| | +--- androidx.compose.foundation:foundation:1.6.0 -> 1.7.0-rc01 (*) +| | +--- org.jetbrains.kotlinx:kotlinx-coroutines-android:1.6.4 -> 1.8.0 (*) +| | \--- org.jetbrains.kotlin:kotlin-stdlib:1.9.22 -> 2.0.20 (*) +| \--- androidx.camera:camera-core:1.3.4 (*) ++--- project :feature:transfer-process +| +--- org.jetbrains.kotlin:kotlin-stdlib:2.0.20 (*) +| +--- com.google.dagger:hilt-android:2.52 (*) +| +--- project :core:designsystem (*) +| +--- project :core:ui (*) +| +--- project :core:data (*) +| +--- project :core:model (*) +| +--- project :core:common (*) +| +--- org.jetbrains.kotlinx:kotlinx-collections-immutable:0.3.7 (*) +| +--- androidx.hilt:hilt-navigation-compose:1.2.0 (*) +| +--- androidx.lifecycle:lifecycle-runtime-compose:2.8.4 (*) +| +--- androidx.lifecycle:lifecycle-viewmodel-compose:2.8.4 (*) +| +--- androidx.compose:compose-bom:2024.08.00 (*) +| +--- androidx.compose.ui:ui-tooling-preview -> 1.7.0-rc01 (*) +| \--- com.squareup.retrofit2:converter-gson:2.11.0 (*) ++--- project :feature:account +| +--- org.jetbrains.kotlin:kotlin-stdlib:2.0.20 (*) +| +--- com.google.dagger:hilt-android:2.52 (*) +| +--- project :core:designsystem (*) +| +--- project :core:ui (*) +| +--- project :core:data (*) +| +--- project :core:model (*) +| +--- project :core:common (*) +| +--- org.jetbrains.kotlinx:kotlinx-collections-immutable:0.3.7 (*) +| +--- androidx.hilt:hilt-navigation-compose:1.2.0 (*) +| +--- androidx.lifecycle:lifecycle-runtime-compose:2.8.4 (*) +| +--- androidx.lifecycle:lifecycle-viewmodel-compose:2.8.4 (*) +| +--- androidx.compose:compose-bom:2024.08.00 (*) +| +--- androidx.compose.ui:ui-tooling-preview -> 1.7.0-rc01 (*) +| +--- project :libs:pullrefresh +| | +--- org.jetbrains.kotlin:kotlin-stdlib:2.0.20 (*) +| | +--- androidx.compose:compose-bom:2024.08.00 (*) +| | +--- androidx.compose.ui:ui-tooling-preview -> 1.7.0-rc01 (*) +| | +--- androidx.compose.animation:animation -> 1.7.0-rc01 (*) +| | +--- androidx.compose.material3:material3:1.2.1 (*) +| | +--- androidx.compose.runtime:runtime -> 1.7.0-rc01 (*) +| | \--- androidx.compose.ui:ui-util -> 1.7.0-rc01 (*) +| \--- com.google.accompanist:accompanist-pager:0.34.0 (*) ++--- project :feature:client-charge +| +--- org.jetbrains.kotlin:kotlin-stdlib:2.0.20 (*) +| +--- com.google.dagger:hilt-android:2.52 (*) +| +--- project :core:designsystem (*) +| +--- project :core:ui (*) +| +--- project :core:data (*) +| +--- project :core:model (*) +| +--- project :core:common (*) +| +--- org.jetbrains.kotlinx:kotlinx-collections-immutable:0.3.7 (*) +| +--- androidx.hilt:hilt-navigation-compose:1.2.0 (*) +| +--- androidx.lifecycle:lifecycle-runtime-compose:2.8.4 (*) +| +--- androidx.lifecycle:lifecycle-viewmodel-compose:2.8.4 (*) +| +--- androidx.compose:compose-bom:2024.08.00 (*) +| +--- androidx.compose.ui:ui-tooling-preview -> 1.7.0-rc01 (*) +| \--- com.github.Raizlabs.DBFlow:dbflow:4.2.4 (*) ++--- project :feature:recent-transaction +| +--- org.jetbrains.kotlin:kotlin-stdlib:2.0.20 (*) +| +--- com.google.dagger:hilt-android:2.52 (*) +| +--- project :core:designsystem (*) +| +--- project :core:ui (*) +| +--- project :core:data (*) +| +--- project :core:model (*) +| +--- project :core:common (*) +| +--- org.jetbrains.kotlinx:kotlinx-collections-immutable:0.3.7 (*) +| +--- androidx.hilt:hilt-navigation-compose:1.2.0 (*) +| +--- androidx.lifecycle:lifecycle-runtime-compose:2.8.4 (*) +| +--- androidx.lifecycle:lifecycle-viewmodel-compose:2.8.4 (*) +| +--- androidx.compose:compose-bom:2024.08.00 (*) +| \--- androidx.compose.ui:ui-tooling-preview -> 1.7.0-rc01 (*) ++--- project :feature:third-party-transfer +| +--- org.jetbrains.kotlin:kotlin-stdlib:2.0.20 (*) +| +--- com.google.dagger:hilt-android:2.52 (*) +| +--- project :core:designsystem (*) +| +--- project :core:ui (*) +| +--- project :core:data (*) +| +--- project :core:model (*) +| +--- project :core:common (*) +| +--- org.jetbrains.kotlinx:kotlinx-collections-immutable:0.3.7 (*) +| +--- androidx.hilt:hilt-navigation-compose:1.2.0 (*) +| +--- androidx.lifecycle:lifecycle-runtime-compose:2.8.4 (*) +| +--- androidx.lifecycle:lifecycle-viewmodel-compose:2.8.4 (*) +| +--- androidx.compose:compose-bom:2024.08.00 (*) +| +--- androidx.compose.ui:ui-tooling-preview -> 1.7.0-rc01 (*) +| \--- org.jetbrains.kotlin:kotlin-parcelize-runtime:2.0.20 (*) ++--- project :feature:help +| +--- org.jetbrains.kotlin:kotlin-stdlib:2.0.20 (*) +| +--- com.google.dagger:hilt-android:2.52 (*) +| +--- project :core:designsystem (*) +| +--- project :core:ui (*) +| +--- project :core:data (*) +| +--- project :core:model (*) +| +--- project :core:common (*) +| +--- org.jetbrains.kotlinx:kotlinx-collections-immutable:0.3.7 (*) +| +--- androidx.hilt:hilt-navigation-compose:1.2.0 (*) +| +--- androidx.lifecycle:lifecycle-runtime-compose:2.8.4 (*) +| +--- androidx.lifecycle:lifecycle-viewmodel-compose:2.8.4 (*) +| +--- androidx.compose:compose-bom:2024.08.00 (*) +| \--- androidx.compose.ui:ui-tooling-preview -> 1.7.0-rc01 (*) ++--- project :feature:notification +| +--- org.jetbrains.kotlin:kotlin-stdlib:2.0.20 (*) +| +--- com.google.dagger:hilt-android:2.52 (*) +| +--- project :core:designsystem (*) +| +--- project :core:ui (*) +| +--- project :core:data (*) +| +--- project :core:model (*) +| +--- project :core:common (*) +| +--- org.jetbrains.kotlinx:kotlinx-collections-immutable:0.3.7 (*) +| +--- androidx.hilt:hilt-navigation-compose:1.2.0 (*) +| +--- androidx.lifecycle:lifecycle-runtime-compose:2.8.4 (*) +| +--- androidx.lifecycle:lifecycle-viewmodel-compose:2.8.4 (*) +| +--- androidx.compose:compose-bom:2024.08.00 (*) +| +--- androidx.compose.ui:ui-tooling-preview -> 1.7.0-rc01 (*) +| +--- project :core:datastore (*) +| \--- com.github.Raizlabs.DBFlow:dbflow:4.2.4 (*) ++--- project :feature:location +| +--- org.jetbrains.kotlin:kotlin-stdlib:2.0.20 (*) +| +--- com.google.dagger:hilt-android:2.52 (*) +| +--- project :core:designsystem (*) +| +--- project :core:ui (*) +| +--- project :core:data (*) +| +--- project :core:model (*) +| +--- project :core:common (*) +| +--- org.jetbrains.kotlinx:kotlinx-collections-immutable:0.3.7 (*) +| +--- androidx.hilt:hilt-navigation-compose:1.2.0 (*) +| +--- androidx.lifecycle:lifecycle-runtime-compose:2.8.4 (*) +| +--- androidx.lifecycle:lifecycle-viewmodel-compose:2.8.4 (*) +| +--- androidx.compose:compose-bom:2024.08.00 (*) +| +--- androidx.compose.ui:ui-tooling-preview -> 1.7.0-rc01 (*) +| \--- com.google.maps.android:maps-compose:4.4.1 +| +--- androidx.compose:compose-bom:2024.04.00 -> 2024.08.00 (*) +| +--- androidx.core:core-ktx:1.12.0 -> 1.13.1 (*) +| +--- androidx.compose.foundation:foundation -> 1.7.0-rc01 (*) +| +--- org.jetbrains.kotlin:kotlin-stdlib-jdk7:1.9.23 -> 2.0.20 (*) +| \--- com.google.maps.android:maps-ktx:5.0.0 +| +--- com.google.android.gms:play-services-maps:18.2.0 +| | +--- androidx.fragment:fragment:1.0.0 -> 1.7.1 (*) +| | +--- com.google.android.gms:play-services-base:18.0.1 -> 18.5.0 (*) +| | +--- com.google.android.gms:play-services-basement:18.0.0 -> 18.4.0 (*) +| | \--- com.google.android.gms:play-services-tasks:18.0.1 -> 18.2.0 (*) +| \--- androidx.databinding:viewbinding:7.4.2 +| \--- androidx.annotation:annotation:1.0.0 -> 1.8.1 (*) ++--- project :feature:about +| +--- org.jetbrains.kotlin:kotlin-stdlib:2.0.20 (*) +| +--- com.google.dagger:hilt-android:2.52 (*) +| +--- project :core:designsystem (*) +| +--- project :core:ui (*) +| +--- project :core:data (*) +| +--- project :core:model (*) +| +--- project :core:common (*) +| +--- org.jetbrains.kotlinx:kotlinx-collections-immutable:0.3.7 (*) +| +--- androidx.hilt:hilt-navigation-compose:1.2.0 (*) +| +--- androidx.lifecycle:lifecycle-runtime-compose:2.8.4 (*) +| +--- androidx.lifecycle:lifecycle-viewmodel-compose:2.8.4 (*) +| +--- androidx.compose:compose-bom:2024.08.00 (*) +| \--- androidx.compose.ui:ui-tooling-preview -> 1.7.0-rc01 (*) ++--- project :feature:settings +| +--- org.jetbrains.kotlin:kotlin-stdlib:2.0.20 (*) +| +--- com.google.dagger:hilt-android:2.52 (*) +| +--- project :core:designsystem (*) +| +--- project :core:ui (*) +| +--- project :core:data (*) +| +--- project :core:model (*) +| +--- project :core:common (*) +| +--- org.jetbrains.kotlinx:kotlinx-collections-immutable:0.3.7 (*) +| +--- androidx.hilt:hilt-navigation-compose:1.2.0 (*) +| +--- androidx.lifecycle:lifecycle-runtime-compose:2.8.4 (*) +| +--- androidx.lifecycle:lifecycle-viewmodel-compose:2.8.4 (*) +| +--- androidx.compose:compose-bom:2024.08.00 (*) +| +--- androidx.compose.ui:ui-tooling-preview -> 1.7.0-rc01 (*) +| \--- androidx.appcompat:appcompat:1.7.0 (*) ++--- project :feature:update-password +| +--- org.jetbrains.kotlin:kotlin-stdlib:2.0.20 (*) +| +--- com.google.dagger:hilt-android:2.52 (*) +| +--- project :core:designsystem (*) +| +--- project :core:ui (*) +| +--- project :core:data (*) +| +--- project :core:model (*) +| +--- project :core:common (*) +| +--- org.jetbrains.kotlinx:kotlinx-collections-immutable:0.3.7 (*) +| +--- androidx.hilt:hilt-navigation-compose:1.2.0 (*) +| +--- androidx.lifecycle:lifecycle-runtime-compose:2.8.4 (*) +| +--- androidx.lifecycle:lifecycle-viewmodel-compose:2.8.4 (*) +| +--- androidx.compose:compose-bom:2024.08.00 (*) +| +--- androidx.compose.ui:ui-tooling-preview -> 1.7.0-rc01 (*) +| \--- com.squareup.okhttp3:okhttp:4.12.0 (*) ++--- project :feature:home +| +--- org.jetbrains.kotlin:kotlin-stdlib:2.0.20 (*) +| +--- com.google.dagger:hilt-android:2.52 (*) +| +--- project :core:designsystem (*) +| +--- project :core:ui (*) +| +--- project :core:data (*) +| +--- project :core:model (*) +| +--- project :core:common (*) +| +--- org.jetbrains.kotlinx:kotlinx-collections-immutable:0.3.7 (*) +| +--- androidx.hilt:hilt-navigation-compose:1.2.0 (*) +| +--- androidx.lifecycle:lifecycle-runtime-compose:2.8.4 (*) +| +--- androidx.lifecycle:lifecycle-viewmodel-compose:2.8.4 (*) +| +--- androidx.compose:compose-bom:2024.08.00 (*) +| +--- androidx.compose.ui:ui-tooling-preview -> 1.7.0-rc01 (*) +| \--- com.squareup.okhttp3:okhttp:4.12.0 (*) ++--- project :feature:auth +| +--- org.jetbrains.kotlin:kotlin-stdlib:2.0.20 (*) +| +--- com.google.dagger:hilt-android:2.52 (*) +| +--- project :core:designsystem (*) +| +--- project :core:ui (*) +| +--- project :core:data (*) +| +--- project :core:model (*) +| +--- project :core:common (*) +| +--- org.jetbrains.kotlinx:kotlinx-collections-immutable:0.3.7 (*) +| +--- androidx.hilt:hilt-navigation-compose:1.2.0 (*) +| +--- androidx.lifecycle:lifecycle-runtime-compose:2.8.4 (*) +| +--- androidx.lifecycle:lifecycle-viewmodel-compose:2.8.4 (*) +| +--- androidx.compose:compose-bom:2024.08.00 (*) +| +--- androidx.compose.ui:ui-tooling-preview -> 1.7.0-rc01 (*) +| +--- project :libs:country-code-picker +| | +--- org.jetbrains.kotlin:kotlin-stdlib:2.0.20 (*) +| | +--- androidx.compose:compose-bom:2024.08.00 (*) +| | +--- androidx.compose.ui:ui-tooling-preview -> 1.7.0-rc01 (*) +| | +--- androidx.compose.foundation:foundation -> 1.7.0-rc01 (*) +| | +--- androidx.compose.foundation:foundation-layout -> 1.7.0-rc01 (*) +| | +--- androidx.compose.material:material-icons-extended -> 1.6.8 (*) +| | +--- androidx.compose.material3:material3:1.2.1 (*) +| | +--- androidx.compose.runtime:runtime -> 1.7.0-rc01 (*) +| | +--- androidx.compose.ui:ui-util -> 1.7.0-rc01 (*) +| | +--- org.jetbrains.kotlinx:kotlinx-collections-immutable:0.3.7 (*) +| | \--- io.michaelrocks:libphonenumber-android:8.13.35 +| \--- com.squareup.okhttp3:okhttp:4.12.0 (*) ++--- project :feature:user-profile +| +--- org.jetbrains.kotlin:kotlin-stdlib:2.0.20 (*) +| +--- com.google.dagger:hilt-android:2.52 (*) +| +--- project :core:designsystem (*) +| +--- project :core:ui (*) +| +--- project :core:data (*) +| +--- project :core:model (*) +| +--- project :core:common (*) +| +--- org.jetbrains.kotlinx:kotlinx-collections-immutable:0.3.7 (*) +| +--- androidx.hilt:hilt-navigation-compose:1.2.0 (*) +| +--- androidx.lifecycle:lifecycle-runtime-compose:2.8.4 (*) +| +--- androidx.lifecycle:lifecycle-viewmodel-compose:2.8.4 (*) +| +--- androidx.compose:compose-bom:2024.08.00 (*) +| +--- androidx.compose.ui:ui-tooling-preview -> 1.7.0-rc01 (*) +| +--- com.squareup.okhttp3:okhttp:4.12.0 (*) +| \--- org.jetbrains.kotlin:kotlin-parcelize-runtime:2.0.20 (*) ++--- project :libs:mifos-passcode +| +--- org.jetbrains.kotlin:kotlin-stdlib:2.0.20 (*) +| +--- androidx.compose:compose-bom:2024.08.00 (*) +| +--- androidx.compose.ui:ui-tooling-preview -> 1.7.0-rc01 (*) +| +--- com.google.dagger:hilt-android:2.52 (*) +| +--- androidx.core:core-ktx:1.13.1 (*) +| +--- androidx.compose.foundation:foundation -> 1.7.0-rc01 (*) +| +--- androidx.compose.foundation:foundation-layout -> 1.7.0-rc01 (*) +| +--- androidx.compose.material:material-icons-extended -> 1.6.8 (*) +| +--- androidx.compose.material3:material3:1.2.1 (*) +| +--- androidx.compose.runtime:runtime -> 1.7.0-rc01 (*) +| +--- androidx.compose.ui:ui-util -> 1.7.0-rc01 (*) +| +--- androidx.lifecycle:lifecycle-runtime-compose:2.8.4 (*) +| +--- androidx.lifecycle:lifecycle-viewmodel-compose:2.8.4 (*) +| +--- androidx.navigation:navigation-compose:2.8.0-rc01 (*) +| \--- androidx.hilt:hilt-navigation-compose:1.2.0 (*) ++--- androidx.appcompat:appcompat:1.7.0 (*) ++--- androidx.activity:activity-ktx:1.9.1 (*) ++--- androidx.activity:activity-compose:1.9.1 (*) ++--- androidx.compose.material3:material3:1.2.1 (*) ++--- androidx.compose.material:material:1.6.8 (*) ++--- androidx.compose.foundation:foundation -> 1.7.0-rc01 (*) ++--- androidx.compose.foundation:foundation-layout -> 1.7.0-rc01 (*) ++--- androidx.compose.material:material-icons-extended -> 1.6.8 (*) ++--- androidx.compose.runtime:runtime -> 1.7.0-rc01 (*) ++--- androidx.compose.ui:ui-util -> 1.7.0-rc01 (*) ++--- androidx.lifecycle:lifecycle-runtime-compose:2.8.4 (*) ++--- androidx.hilt:hilt-navigation-compose:1.2.0 (*) ++--- androidx.core:core-splashscreen:1.0.1 +| +--- androidx.annotation:annotation:1.2.0 -> 1.8.1 (*) +| \--- org.jetbrains.kotlin:kotlin-stdlib:1.6.21 -> 2.0.20 (*) ++--- androidx.tracing:tracing-ktx:1.2.0 +| +--- androidx.tracing:tracing:1.2.0 (*) +| +--- org.jetbrains.kotlin:kotlin-stdlib:1.8.21 -> 2.0.20 (*) +| \--- androidx.tracing:tracing:1.2.0 (c) ++--- androidx.profileinstaller:profileinstaller:1.3.1 (*) ++--- com.google.android.gms:play-services-oss-licenses:17.1.0 +| +--- androidx.appcompat:appcompat:1.0.0 -> 1.7.0 (*) +| +--- androidx.loader:loader:1.0.0 (*) +| +--- com.google.android.gms:play-services-base:18.5.0 (*) +| +--- com.google.android.gms:play-services-basement:18.4.0 (*) +| \--- com.google.android.gms:play-services-tasks:18.2.0 (*) +\--- androidx.multidex:multidex:2.0.1 diff --git a/androidApp/dependencies/releaseRuntimeClasspath.txt b/androidApp/dependencies/releaseRuntimeClasspath.txt new file mode 100644 index 000000000..c1d6603bb --- /dev/null +++ b/androidApp/dependencies/releaseRuntimeClasspath.txt @@ -0,0 +1,278 @@ +:core:common +:core:data +:core:datastore +:core:designsystem +:core:logs +:core:model +:core:network +:core:qrcode +:core:ui +:feature:about +:feature:account +:feature:auth +:feature:beneficiary +:feature:client-charge +:feature:guarantor +:feature:help +:feature:home +:feature:loan +:feature:location +:feature:notification +:feature:qr +:feature:recent-transaction +:feature:savings +:feature:settings +:feature:third-party-transfer +:feature:transfer-process +:feature:update-password +:feature:user-profile +:libs:country-code-picker +:libs:mifos-passcode +:libs:pullrefresh +:shared +androidx.activity:activity-compose:1.9.1 +androidx.activity:activity-ktx:1.9.1 +androidx.activity:activity:1.9.1 +androidx.annotation:annotation-experimental:1.4.1 +androidx.annotation:annotation-jvm:1.8.1 +androidx.annotation:annotation:1.8.1 +androidx.appcompat:appcompat-resources:1.7.0 +androidx.appcompat:appcompat:1.7.0 +androidx.arch.core:core-common:2.2.0 +androidx.arch.core:core-runtime:2.2.0 +androidx.autofill:autofill:1.0.0 +androidx.camera:camera-camera2:1.3.4 +androidx.camera:camera-core:1.3.4 +androidx.camera:camera-lifecycle:1.3.4 +androidx.camera:camera-video:1.3.4 +androidx.camera:camera-view:1.3.4 +androidx.collection:collection-jvm:1.4.2 +androidx.collection:collection-ktx:1.4.2 +androidx.collection:collection:1.4.2 +androidx.compose.animation:animation-android:1.7.0-rc01 +androidx.compose.animation:animation-core-android:1.7.0-rc01 +androidx.compose.animation:animation-core:1.7.0-rc01 +androidx.compose.animation:animation:1.7.0-rc01 +androidx.compose.foundation:foundation-android:1.7.0-rc01 +androidx.compose.foundation:foundation-layout-android:1.7.0-rc01 +androidx.compose.foundation:foundation-layout:1.7.0-rc01 +androidx.compose.foundation:foundation:1.7.0-rc01 +androidx.compose.material3:material3-android:1.2.1 +androidx.compose.material3:material3:1.2.1 +androidx.compose.material:material-android:1.6.8 +androidx.compose.material:material-icons-core-android:1.6.8 +androidx.compose.material:material-icons-core:1.6.8 +androidx.compose.material:material-icons-extended-android:1.6.8 +androidx.compose.material:material-icons-extended:1.6.8 +androidx.compose.material:material-ripple-android:1.6.8 +androidx.compose.material:material-ripple:1.6.8 +androidx.compose.material:material:1.6.8 +androidx.compose.runtime:runtime-android:1.7.0-rc01 +androidx.compose.runtime:runtime-saveable-android:1.7.0-rc01 +androidx.compose.runtime:runtime-saveable:1.7.0-rc01 +androidx.compose.runtime:runtime:1.7.0-rc01 +androidx.compose.ui:ui-android:1.7.0-rc01 +androidx.compose.ui:ui-geometry-android:1.7.0-rc01 +androidx.compose.ui:ui-geometry:1.7.0-rc01 +androidx.compose.ui:ui-graphics-android:1.7.0-rc01 +androidx.compose.ui:ui-graphics:1.7.0-rc01 +androidx.compose.ui:ui-text-android:1.7.0-rc01 +androidx.compose.ui:ui-text:1.7.0-rc01 +androidx.compose.ui:ui-tooling-preview-android:1.7.0-rc01 +androidx.compose.ui:ui-tooling-preview:1.7.0-rc01 +androidx.compose.ui:ui-unit-android:1.7.0-rc01 +androidx.compose.ui:ui-unit:1.7.0-rc01 +androidx.compose.ui:ui-util-android:1.7.0-rc01 +androidx.compose.ui:ui-util:1.7.0-rc01 +androidx.compose.ui:ui:1.7.0-rc01 +androidx.compose:compose-bom:2024.08.00 +androidx.concurrent:concurrent-futures:1.1.0 +androidx.core:core-ktx:1.13.1 +androidx.core:core-splashscreen:1.0.1 +androidx.core:core:1.13.1 +androidx.cursoradapter:cursoradapter:1.0.0 +androidx.customview:customview-poolingcontainer:1.0.0 +androidx.customview:customview:1.0.0 +androidx.databinding:viewbinding:7.4.2 +androidx.datastore:datastore-core:1.0.0 +androidx.datastore:datastore-preferences-core:1.0.0 +androidx.datastore:datastore-preferences:1.0.0 +androidx.datastore:datastore:1.0.0 +androidx.documentfile:documentfile:1.0.0 +androidx.drawerlayout:drawerlayout:1.0.0 +androidx.emoji2:emoji2-views-helper:1.3.0 +androidx.emoji2:emoji2:1.3.0 +androidx.exifinterface:exifinterface:1.3.2 +androidx.fragment:fragment-ktx:1.7.1 +androidx.fragment:fragment:1.7.1 +androidx.graphics:graphics-path:1.0.1 +androidx.hilt:hilt-navigation-compose:1.2.0 +androidx.hilt:hilt-navigation:1.2.0 +androidx.interpolator:interpolator:1.0.0 +androidx.legacy:legacy-support-core-utils:1.0.0 +androidx.lifecycle:lifecycle-common-java8:2.8.4 +androidx.lifecycle:lifecycle-common-jvm:2.8.4 +androidx.lifecycle:lifecycle-common:2.8.4 +androidx.lifecycle:lifecycle-livedata-core-ktx:2.8.4 +androidx.lifecycle:lifecycle-livedata-core:2.8.4 +androidx.lifecycle:lifecycle-livedata:2.8.4 +androidx.lifecycle:lifecycle-process:2.8.4 +androidx.lifecycle:lifecycle-runtime-android:2.8.4 +androidx.lifecycle:lifecycle-runtime-compose-android:2.8.4 +androidx.lifecycle:lifecycle-runtime-compose:2.8.4 +androidx.lifecycle:lifecycle-runtime-ktx-android:2.8.4 +androidx.lifecycle:lifecycle-runtime-ktx:2.8.4 +androidx.lifecycle:lifecycle-runtime:2.8.4 +androidx.lifecycle:lifecycle-viewmodel-android:2.8.4 +androidx.lifecycle:lifecycle-viewmodel-compose-android:2.8.4 +androidx.lifecycle:lifecycle-viewmodel-compose:2.8.4 +androidx.lifecycle:lifecycle-viewmodel-ktx:2.8.4 +androidx.lifecycle:lifecycle-viewmodel-savedstate:2.8.4 +androidx.lifecycle:lifecycle-viewmodel:2.8.4 +androidx.loader:loader:1.0.0 +androidx.localbroadcastmanager:localbroadcastmanager:1.0.0 +androidx.metrics:metrics-performance:1.0.0-beta01 +androidx.multidex:multidex:2.0.1 +androidx.navigation:navigation-common-ktx:2.8.0-rc01 +androidx.navigation:navigation-common:2.8.0-rc01 +androidx.navigation:navigation-compose:2.8.0-rc01 +androidx.navigation:navigation-runtime-ktx:2.8.0-rc01 +androidx.navigation:navigation-runtime:2.8.0-rc01 +androidx.print:print:1.0.0 +androidx.privacysandbox.ads:ads-adservices-java:1.0.0-beta05 +androidx.privacysandbox.ads:ads-adservices:1.0.0-beta05 +androidx.profileinstaller:profileinstaller:1.3.1 +androidx.resourceinspection:resourceinspection-annotation:1.0.1 +androidx.savedstate:savedstate-ktx:1.2.1 +androidx.savedstate:savedstate:1.2.1 +androidx.startup:startup-runtime:1.1.1 +androidx.tracing:tracing-ktx:1.2.0 +androidx.tracing:tracing:1.2.0 +androidx.vectordrawable:vectordrawable-animated:1.1.0 +androidx.vectordrawable:vectordrawable:1.1.0 +androidx.versionedparcelable:versionedparcelable:1.1.1 +androidx.viewpager:viewpager:1.0.0 +app.cash.turbine:turbine-jvm:1.1.0 +app.cash.turbine:turbine:1.1.0 +co.touchlab:stately-concurrency-jvm:2.0.6 +co.touchlab:stately-concurrency:2.0.6 +co.touchlab:stately-concurrent-collections-jvm:2.0.6 +co.touchlab:stately-concurrent-collections:2.0.6 +co.touchlab:stately-strict-jvm:2.0.6 +co.touchlab:stately-strict:2.0.6 +com.github.Raizlabs.DBFlow:dbflow-core:4.2.4 +com.github.Raizlabs.DBFlow:dbflow:4.2.4 +com.google.accompanist:accompanist-pager:0.34.0 +com.google.accompanist:accompanist-permissions:0.34.0 +com.google.android.datatransport:transport-api:3.2.0 +com.google.android.datatransport:transport-backend-cct:3.3.0 +com.google.android.datatransport:transport-runtime:3.3.0 +com.google.android.gms:play-services-ads-identifier:18.0.0 +com.google.android.gms:play-services-base:18.5.0 +com.google.android.gms:play-services-basement:18.4.0 +com.google.android.gms:play-services-cloud-messaging:17.2.0 +com.google.android.gms:play-services-maps:18.2.0 +com.google.android.gms:play-services-measurement-api:22.1.0 +com.google.android.gms:play-services-measurement-base:22.1.0 +com.google.android.gms:play-services-measurement-impl:22.1.0 +com.google.android.gms:play-services-measurement-sdk-api:22.1.0 +com.google.android.gms:play-services-measurement-sdk:22.1.0 +com.google.android.gms:play-services-measurement:22.1.0 +com.google.android.gms:play-services-oss-licenses:17.1.0 +com.google.android.gms:play-services-stats:17.0.2 +com.google.android.gms:play-services-tasks:18.2.0 +com.google.auto.value:auto-value-annotations:1.6.3 +com.google.code.findbugs:jsr305:3.0.2 +com.google.code.gson:gson:2.10.1 +com.google.dagger:dagger-lint-aar:2.52 +com.google.dagger:dagger:2.52 +com.google.dagger:hilt-android:2.52 +com.google.dagger:hilt-core:2.52 +com.google.errorprone:error_prone_annotations:2.26.0 +com.google.firebase:firebase-abt:21.1.1 +com.google.firebase:firebase-analytics-ktx:22.1.0 +com.google.firebase:firebase-analytics:22.1.0 +com.google.firebase:firebase-annotations:16.2.0 +com.google.firebase:firebase-bom:33.2.0 +com.google.firebase:firebase-common-ktx:21.0.0 +com.google.firebase:firebase-common:21.0.0 +com.google.firebase:firebase-components:18.0.0 +com.google.firebase:firebase-config-interop:16.0.1 +com.google.firebase:firebase-config:22.0.0 +com.google.firebase:firebase-crashlytics-ktx:19.0.3 +com.google.firebase:firebase-crashlytics:19.0.3 +com.google.firebase:firebase-datatransport:19.0.0 +com.google.firebase:firebase-encoders-json:18.0.1 +com.google.firebase:firebase-encoders-proto:16.0.0 +com.google.firebase:firebase-encoders:17.0.0 +com.google.firebase:firebase-iid-interop:17.1.0 +com.google.firebase:firebase-installations-interop:17.2.0 +com.google.firebase:firebase-installations:18.0.0 +com.google.firebase:firebase-measurement-connector:20.0.1 +com.google.firebase:firebase-messaging-ktx:24.0.1 +com.google.firebase:firebase-messaging:24.0.1 +com.google.firebase:firebase-perf-ktx:21.0.1 +com.google.firebase:firebase-perf:21.0.1 +com.google.firebase:firebase-sessions:2.0.3 +com.google.firebase:protolite-well-known-types:18.0.0 +com.google.guava:failureaccess:1.0.1 +com.google.guava:guava:31.1-android +com.google.guava:listenablefuture:9999.0-empty-to-avoid-conflict-with-guava +com.google.j2objc:j2objc-annotations:1.3 +com.google.maps.android:maps-compose:4.4.1 +com.google.maps.android:maps-ktx:5.0.0 +com.google.protobuf:protobuf-javalite:3.21.11 +com.google.zxing:core:3.5.3 +com.squareup.okhttp3:logging-interceptor:4.12.0 +com.squareup.okhttp3:okhttp:4.12.0 +com.squareup.okio:okio-jvm:3.6.0 +com.squareup.okio:okio:3.6.0 +com.squareup.retrofit2:adapter-rxjava2:2.11.0 +com.squareup.retrofit2:converter-gson:2.11.0 +com.squareup.retrofit2:retrofit:2.11.0 +dev.chrisbanes.snapper:snapper:0.2.2 +io.github.mr0xf00:easycrop:0.1.1 +io.insert-koin:koin-android:3.6.0-Beta4 +io.insert-koin:koin-androidx-compose:3.6.0-Beta4 +io.insert-koin:koin-compose-jvm:1.2.0-Beta4 +io.insert-koin:koin-compose-viewmodel-jvm:1.2.0-Beta4 +io.insert-koin:koin-compose-viewmodel:1.2.0-Beta4 +io.insert-koin:koin-compose:1.2.0-Beta4 +io.insert-koin:koin-core-jvm:3.6.0-Beta4 +io.insert-koin:koin-core:3.6.0-Beta4 +io.michaelrocks:libphonenumber-android:8.13.35 +io.reactivex.rxjava2:rxandroid:2.1.1 +io.reactivex.rxjava2:rxjava:2.2.21 +jakarta.inject:jakarta.inject-api:2.0.1 +javax.inject:javax.inject:1 +net.bytebuddy:byte-buddy-agent:1.14.5 +net.bytebuddy:byte-buddy:1.14.5 +org.checkerframework:checker-qual:3.12.0 +org.jetbrains.androidx.lifecycle:lifecycle-viewmodel-compose:2.8.0-rc03 +org.jetbrains.androidx.navigation:navigation-compose:2.7.0-alpha06 +org.jetbrains.compose.material3:material3:1.6.11 +org.jetbrains.compose.material:material:1.6.11 +org.jetbrains.compose.runtime:runtime:1.6.10-rc03 +org.jetbrains.compose.ui:ui-tooling-preview:1.6.11 +org.jetbrains.kotlin:kotlin-android-extensions-runtime:2.0.20 +org.jetbrains.kotlin:kotlin-parcelize-runtime:2.0.20 +org.jetbrains.kotlin:kotlin-stdlib-common:2.0.20 +org.jetbrains.kotlin:kotlin-stdlib-jdk7:2.0.20 +org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.9.10 +org.jetbrains.kotlin:kotlin-stdlib:2.0.20 +org.jetbrains.kotlinx:kotlinx-collections-immutable-jvm:0.3.7 +org.jetbrains.kotlinx:kotlinx-collections-immutable:0.3.7 +org.jetbrains.kotlinx:kotlinx-coroutines-android:1.8.0 +org.jetbrains.kotlinx:kotlinx-coroutines-bom:1.8.0 +org.jetbrains.kotlinx:kotlinx-coroutines-core-jvm:1.8.0 +org.jetbrains.kotlinx:kotlinx-coroutines-core:1.8.0 +org.jetbrains.kotlinx:kotlinx-coroutines-play-services:1.8.0 +org.jetbrains.kotlinx:kotlinx-coroutines-test-jvm:1.8.0 +org.jetbrains.kotlinx:kotlinx-coroutines-test:1.8.0 +org.jetbrains.kotlinx:kotlinx-serialization-bom:1.6.3 +org.jetbrains.kotlinx:kotlinx-serialization-core-jvm:1.6.3 +org.jetbrains.kotlinx:kotlinx-serialization-core:1.6.3 +org.jetbrains:annotations:23.0.0 +org.mockito:mockito-core:5.4.0 +org.objenesis:objenesis:3.3 +org.reactivestreams:reactive-streams:1.0.4 diff --git a/androidApp/lint-baseline.xml b/androidApp/lint-baseline.xml new file mode 100644 index 000000000..230ed0be7 --- /dev/null +++ b/androidApp/lint-baseline.xml @@ -0,0 +1,46876 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/androidApp/release-badging.txt b/androidApp/release-badging.txt new file mode 100644 index 000000000..1bda46167 --- /dev/null +++ b/androidApp/release-badging.txt @@ -0,0 +1,138 @@ +package: name='org.mifos.mobile' versionCode='1' versionName='1.0' platformBuildVersionName='14' platformBuildVersionCode='34' compileSdkVersion='34' compileSdkVersionCodename='14' +sdkVersion:'26' +targetSdkVersion:'34' +uses-permission: name='android.permission.INTERNET' +uses-permission: name='android.permission.READ_MEDIA_IMAGES' +uses-permission: name='android.permission.CAMERA' +uses-permission: name='android.permission.READ_PHONE_STATE' +uses-permission: name='android.permission.WRITE_EXTERNAL_STORAGE' +uses-permission: name='android.permission.READ_EXTERNAL_STORAGE' +uses-permission: name='android.permission.ACCESS_NETWORK_STATE' +uses-permission: name='android.permission.VIBRATE' +uses-permission: name='android.permission.POST_NOTIFICATIONS' +uses-permission: name='android.permission.WAKE_LOCK' +uses-permission: name='com.google.android.c2dm.permission.RECEIVE' +uses-permission: name='com.google.android.gms.permission.AD_ID' +uses-permission: name='android.permission.ACCESS_ADSERVICES_ATTRIBUTION' +uses-permission: name='android.permission.ACCESS_ADSERVICES_AD_ID' +uses-permission: name='com.google.android.finsky.permission.BIND_GET_INSTALL_REFERRER_SERVICE' +uses-permission: name='org.mifos.mobile.DYNAMIC_RECEIVER_NOT_EXPORTED_PERMISSION' +application-label:'Mifos Mobile' +application-label-af:'Mifos Mobile' +application-label-am:'Mifos Mobile' +application-label-ar:'ميفوس موبايل' +application-label-as:'Mifos Mobile' +application-label-az:'Mifos Mobile' +application-label-be:'Mifos Mobile' +application-label-bg:'Mifos Mobile' +application-label-bn:'Mifos Mobile' +application-label-bs:'Mifos Mobile' +application-label-ca:'Mifos Mobile' +application-label-cs:'Mifos Mobile' +application-label-da:'Mifos Mobile' +application-label-de:'Mifos Mobile' +application-label-el:'Mifos Mobile' +application-label-en-AU:'Mifos Mobile' +application-label-en-CA:'Mifos Mobile' +application-label-en-GB:'Mifos Mobile' +application-label-en-IN:'Mifos Mobile' +application-label-en-XC:'Mifos Mobile' +application-label-es:'Mifos Mobile' +application-label-es-US:'Mifos Mobile' +application-label-et:'Mifos Mobile' +application-label-eu:'Mifos Mobile' +application-label-fa:'Mifos Mobile' +application-label-fa-AF:'Mifos Mobile' +application-label-fi:'Mifos Mobile' +application-label-fr:'Mifos Mobile' +application-label-fr-CA:'Mifos Mobile' +application-label-gl:'Mifos Mobile' +application-label-gu:'Mifos Mobile' +application-label-hi:'Mifos Mobile' +application-label-hr:'Mifos Mobile' +application-label-hu:'Mifos Mobile' +application-label-hy:'Mifos Mobile' +application-label-in:'Mifos Mobile' +application-label-is:'Mifos Mobile' +application-label-it:'Mifos Mobile' +application-label-it-IT:'Mifos Mobile' +application-label-iw:'Mifos Mobile' +application-label-ja:'Mifos Mobile' +application-label-ka:'Mifos Mobile' +application-label-kk:'Mifos Mobile' +application-label-km:'Mifos Mobile' +application-label-kn:'Mifos Mobile' +application-label-ko:'Mifos Mobile' +application-label-ky:'Mifos Mobile' +application-label-lo:'Mifos Mobile' +application-label-lt:'Mifos Mobile' +application-label-lv:'Mifos Mobile' +application-label-mk:'Mifos Mobile' +application-label-ml:'Mifos Mobile' +application-label-mn:'Mifos Mobile' +application-label-mr:'Mifos Mobile' +application-label-ms:'Mifos Mobile' +application-label-my:'Mifos မိုဘိုင်း' +application-label-nb:'Mifos Mobile' +application-label-ne:'Mifos Mobile' +application-label-nl:'Mifos Mobile' +application-label-or:'Mifos Mobile' +application-label-pa:'Mifos Mobile' +application-label-pl:'Mifos Mobile' +application-label-pt:'Mifos Mobile' +application-label-pt-BR:'Mifos Mobile' +application-label-pt-PT:'Mifos Mobile' +application-label-ro:'Mifos Mobile' +application-label-ru:'Mifos Mobile' +application-label-ru-RU:'Mifos Mobile' +application-label-si:'Mifos Mobile' +application-label-sk:'Mifos Mobile' +application-label-sl:'Mifos Mobile' +application-label-so:'Mifos Mobile' +application-label-sq:'Mifos Mobile' +application-label-sr:'Mifos Mobile' +application-label-sr-Latn:'Mifos Mobile' +application-label-sv:'Mifos Mobile' +application-label-sw:'Mifos Mobile' +application-label-ta:'Mifos Mobile' +application-label-te:'Mifos Mobile' +application-label-th:'Mifos Mobile' +application-label-tl:'Mifos Mobile' +application-label-tr:'Mifos Mobile' +application-label-tr-TR:'Mifos Mobile' +application-label-uk:'Mifos Mobile' +application-label-ur:'Mifos موبائل' +application-label-uz:'Mifos Mobile' +application-label-vi:'Mifos Mobile' +application-label-zh:'Mifos Mobile' +application-label-zh-CN:'Mifos Mobile' +application-label-zh-HK:'Mifos Mobile' +application-label-zh-TW:'Mifos Mobile' +application-label-zu:'Mifos Mobile' +application-icon-120:'res/mipmap-anydpi-v26/ic_launcher.xml' +application-icon-160:'res/mipmap-anydpi-v26/ic_launcher.xml' +application-icon-240:'res/mipmap-anydpi-v26/ic_launcher.xml' +application-icon-320:'res/mipmap-anydpi-v26/ic_launcher.xml' +application-icon-480:'res/mipmap-anydpi-v26/ic_launcher.xml' +application-icon-640:'res/mipmap-anydpi-v26/ic_launcher.xml' +application-icon-65534:'res/mipmap-anydpi-v26/ic_launcher.xml' +application: label='Mifos Mobile' icon='res/mipmap-anydpi-v26/ic_launcher.xml' +launchable-activity: name='org.mifos.mobile.HomeActivity' label='' icon='' +uses-library-not-required:'org.apache.http.legacy' +property: name='android.adservices.AD_SERVICES_CONFIG' resource='res/xml/ga_ad_services_config.xml' +uses-library-not-required:'android.ext.adservices' +feature-group: label='' + uses-gl-es: '0x20000' + uses-feature-not-required: name='android.hardware.camera' + uses-feature: name='android.hardware.camera.any' + uses-feature: name='android.hardware.faketouch' + uses-implied-feature: name='android.hardware.faketouch' reason='default feature for all apps' +main +other-activities +other-receivers +other-services +supports-screens: 'small' 'normal' 'large' 'xlarge' +supports-any-density: 'true' +locales: '--_--' 'af' 'am' 'ar' 'as' 'az' 'be' 'bg' 'bn' 'bs' 'ca' 'cs' 'da' 'de' 'el' 'en-AU' 'en-CA' 'en-GB' 'en-IN' 'en-XC' 'es' 'es-US' 'et' 'eu' 'fa' 'fa-AF' 'fi' 'fr' 'fr-CA' 'gl' 'gu' 'hi' 'hr' 'hu' 'hy' 'in' 'is' 'it' 'it-IT' 'iw' 'ja' 'ka' 'kk' 'km' 'kn' 'ko' 'ky' 'lo' 'lt' 'lv' 'mk' 'ml' 'mn' 'mr' 'ms' 'my' 'nb' 'ne' 'nl' 'or' 'pa' 'pl' 'pt' 'pt-BR' 'pt-PT' 'ro' 'ru' 'ru-RU' 'si' 'sk' 'sl' 'so' 'sq' 'sr' 'sr-Latn' 'sv' 'sw' 'ta' 'te' 'th' 'tl' 'tr' 'tr-TR' 'uk' 'ur' 'uz' 'vi' 'zh' 'zh-CN' 'zh-HK' 'zh-TW' 'zu' +densities: '120' '160' '240' '320' '480' '640' '65534' +native-code: 'arm64-v8a' 'armeabi-v7a' 'x86' 'x86_64' diff --git a/androidApp/src/androidTest/java/org/mifos/mobile/ApplicationTest.kt b/androidApp/src/androidTest/kotlin/org/mifos/mobile/ApplicationTest.kt similarity index 63% rename from androidApp/src/androidTest/java/org/mifos/mobile/ApplicationTest.kt rename to androidApp/src/androidTest/kotlin/org/mifos/mobile/ApplicationTest.kt index ed59a89a4..fed7a4073 100644 --- a/androidApp/src/androidTest/java/org/mifos/mobile/ApplicationTest.kt +++ b/androidApp/src/androidTest/kotlin/org/mifos/mobile/ApplicationTest.kt @@ -1,3 +1,12 @@ +/* + * Copyright 2024 Mifos Initiative + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at https://mozilla.org/MPL/2.0/. + * + * See https://github.com/openMF/mobile-mobile/blob/master/LICENSE.md + */ package org.mifos.mobile import androidx.test.InstrumentationRegistry diff --git a/androidApp/src/debug/res/values/api_keys.xml b/androidApp/src/debug/res/values/api_keys.xml deleted file mode 100644 index ac8673992..000000000 --- a/androidApp/src/debug/res/values/api_keys.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - AIzaSyBbeT2BaMWLj-lReCgYoNmXs_TIyRLr9qQ - - diff --git a/androidApp/src/main/AndroidManifest.xml b/androidApp/src/main/AndroidManifest.xml index 5789de63f..59800427c 100644 --- a/androidApp/src/main/AndroidManifest.xml +++ b/androidApp/src/main/AndroidManifest.xml @@ -1,7 +1,15 @@ + + xmlns:tools="http://schemas.android.com/tools"> + + @@ -18,53 +28,32 @@ - - - - - - - - + android:theme="@style/Theme.MifosSplash"> + android:theme="@style/Theme.MifosSplash" + android:windowSoftInputMode="adjustPan"> - - + + + + - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/androidApp/src/main/ic_launcher-playstore.png b/androidApp/src/main/ic_launcher-playstore.png new file mode 100644 index 0000000000000000000000000000000000000000..a09ac89ad974f28c8dbfabb13fc40ebce66e1b89 GIT binary patch literal 57605 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 literal 0 HcmV?d00001 diff --git a/androidApp/src/main/java/org/mifos/mobile/MifosSelfServiceApp.kt b/androidApp/src/main/java/org/mifos/mobile/MifosSelfServiceApp.kt deleted file mode 100644 index 53cf8ec12..000000000 --- a/androidApp/src/main/java/org/mifos/mobile/MifosSelfServiceApp.kt +++ /dev/null @@ -1,51 +0,0 @@ -package org.mifos.mobile - -import android.content.Context -import android.content.res.Configuration -import androidx.appcompat.app.AppCompatDelegate -import androidx.multidex.MultiDex -import androidx.multidex.MultiDexApplication -import com.google.firebase.crashlytics.FirebaseCrashlytics -import com.raizlabs.android.dbflow.config.FlowConfig -import com.raizlabs.android.dbflow.config.FlowManager -import dagger.hilt.android.HiltAndroidApp -import org.mifos.mobile.core.common.utils.LanguageHelper.onAttach -import org.mifos.mobile.core.datastore.PreferencesHelper -import org.mifos.mobile.feature.settings.applySavedTheme - -/** - * @author ishan - * @since 08/07/16 - */ -@HiltAndroidApp -class MifosSelfServiceApp : MultiDexApplication() { - - companion object { - private var instance: MifosSelfServiceApp? = null - operator fun get(context: Context): MifosSelfServiceApp { - return context.applicationContext as MifosSelfServiceApp - } - - val context: Context? - get() = instance - - init { - AppCompatDelegate.setCompatVectorFromResourcesEnabled(true) - } - } - - override fun onCreate() { - super.onCreate() - MultiDex.install(this) - FirebaseCrashlytics.getInstance().setCrashlyticsCollectionEnabled(true) - instance = this - FlowManager.init(FlowConfig.Builder(this).build()) - PreferencesHelper(this).applySavedTheme() - } - - override fun onConfigurationChanged(newConfig: Configuration) { - super.onConfigurationChanged(newConfig) - context?.let { onAttach(it) } - } - -} diff --git a/androidApp/src/main/java/org/mifos/mobile/di/ApplicationModule.kt b/androidApp/src/main/java/org/mifos/mobile/di/ApplicationModule.kt deleted file mode 100644 index c94097198..000000000 --- a/androidApp/src/main/java/org/mifos/mobile/di/ApplicationModule.kt +++ /dev/null @@ -1,82 +0,0 @@ -package org.mifos.mobile.di - -import android.content.Context -import dagger.Module -import dagger.Provides -import dagger.hilt.InstallIn -import dagger.hilt.android.qualifiers.ApplicationContext -import dagger.hilt.components.SingletonComponent -import org.mifos.mobile.core.datastore.DatabaseHelper -import org.mifos.mobile.core.datastore.PreferencesHelper -import org.mifos.mobile.core.network.BaseApiManager -import org.mifos.mobile.core.network.DataManager -import org.mifos.mobile.core.network.services.AuthenticationService -import org.mifos.mobile.core.network.services.BeneficiaryService -import org.mifos.mobile.core.network.services.ClientChargeService -import org.mifos.mobile.core.network.services.ClientService -import org.mifos.mobile.core.network.services.GuarantorService -import org.mifos.mobile.core.network.services.LoanAccountsListService -import org.mifos.mobile.core.network.services.NotificationService -import org.mifos.mobile.core.network.services.RecentTransactionsService -import org.mifos.mobile.core.network.services.RegistrationService -import org.mifos.mobile.core.network.services.SavingAccountsListService -import org.mifos.mobile.core.network.services.ThirdPartyTransferService -import org.mifos.mobile.core.network.services.UserDetailsService -import javax.inject.Singleton - -/** - * @author ishan - * @since 08/07/16 - */ -@Module -@InstallIn(SingletonComponent::class) -object ApplicationModule { - - @Provides - @Singleton - fun providePrefManager(@ApplicationContext context: Context?): PreferencesHelper { - return PreferencesHelper(context) - } - - @Provides - @Singleton - fun provideBaseApiManager( - authenticationService: AuthenticationService, - clientsService: ClientService, - savingAccountsListService: SavingAccountsListService, - loanAccountsListService: LoanAccountsListService, - recentTransactionsService: RecentTransactionsService, - clientChargeService: ClientChargeService, - beneficiaryService: BeneficiaryService, - thirdPartyTransferService: ThirdPartyTransferService, - registrationService: RegistrationService, - notificationService: NotificationService, - userDetailsService: UserDetailsService, - guarantorService: GuarantorService - ): BaseApiManager { - return BaseApiManager( - authenticationService, - clientsService, - savingAccountsListService, - loanAccountsListService, - recentTransactionsService, - clientChargeService, - beneficiaryService, - thirdPartyTransferService, - registrationService, - notificationService, - userDetailsService, - guarantorService - ) - } - - @Provides - @Singleton - fun providesDataManager( - preferencesHelper: PreferencesHelper, - baseApiManager: BaseApiManager, - databaseHelper: DatabaseHelper - ): DataManager { - return DataManager(preferencesHelper, baseApiManager, databaseHelper) - } -} diff --git a/androidApp/src/main/java/org/mifos/mobile/ui/activities/BiometricAuthentication.kt b/androidApp/src/main/java/org/mifos/mobile/ui/activities/BiometricAuthentication.kt deleted file mode 100644 index 33bb6ae89..000000000 --- a/androidApp/src/main/java/org/mifos/mobile/ui/activities/BiometricAuthentication.kt +++ /dev/null @@ -1,78 +0,0 @@ -package org.mifos.mobile.ui.activities - -import android.content.Intent -import android.os.Build -import android.provider.Settings -import android.provider.Settings.EXTRA_BIOMETRIC_AUTHENTICATORS_ALLOWED -import androidx.activity.result.ActivityResultLauncher -import androidx.biometric.BiometricManager -import androidx.biometric.BiometricPrompt -import androidx.core.content.ContextCompat -import androidx.fragment.app.FragmentActivity -import org.mifos.mobile.R -import org.mifos.mobile.core.model.enums.BiometricCapability - -open class BiometricAuthentication( - val context: FragmentActivity, -) { - private val executor = ContextCompat.getMainExecutor(context) - private val callback = object : BiometricPrompt.AuthenticationCallback() { - - override fun onAuthenticationSucceeded(result: BiometricPrompt.AuthenticationResult) { - super.onAuthenticationSucceeded(result) - val intent = Intent(context, HomeActivity::class.java) - intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK or Intent.FLAG_ACTIVITY_CLEAR_TASK) - context.startActivity(intent) - context.finish() - } - } - - private val biometricPrompt = BiometricPrompt(context, executor, callback) - - fun launchBiometricEnrollment(resultLauncher: ActivityResultLauncher) { - val intent: Intent = when { - Build.VERSION.SDK_INT >= Build.VERSION_CODES.R -> { - Intent(Settings.ACTION_BIOMETRIC_ENROLL).putExtra( - EXTRA_BIOMETRIC_AUTHENTICATORS_ALLOWED, - BiometricManager.Authenticators.BIOMETRIC_STRONG or BiometricManager.Authenticators.BIOMETRIC_WEAK, - ) - } - - Build.VERSION.SDK_INT >= Build.VERSION_CODES.P -> { - Intent(Settings.ACTION_FINGERPRINT_ENROLL) - } - - else -> { - Intent(Settings.ACTION_SECURITY_SETTINGS) - } - } - resultLauncher.launch(intent) - } - - fun getBiometricCapabilities(): BiometricCapability { - val biometricManager = BiometricManager.from(context) - return when (biometricManager.canAuthenticate(BiometricManager.Authenticators.BIOMETRIC_WEAK or BiometricManager.Authenticators.DEVICE_CREDENTIAL)) { - BiometricManager.BIOMETRIC_SUCCESS -> { - BiometricCapability.HAS_BIOMETRIC_AUTH - } - - BiometricManager.BIOMETRIC_ERROR_NONE_ENROLLED -> { - BiometricCapability.NOT_ENROLLED - } - - else -> { - BiometricCapability.NOT_SUPPORTED - } - } - } - - fun authenticateWithBiometrics() { - val promptInfo = BiometricPrompt.PromptInfo.Builder().apply { - setTitle(context.getString(R.string.sign_in_fingerprint)) - setDescription(context.getString(R.string.scan_your_fingerprint)) - setAllowedAuthenticators(BiometricManager.Authenticators.BIOMETRIC_WEAK or BiometricManager.Authenticators.DEVICE_CREDENTIAL) - }.build() - - biometricPrompt.authenticate(promptInfo) - } -} diff --git a/androidApp/src/main/java/org/mifos/mobile/ui/activities/HomeActivity.kt b/androidApp/src/main/java/org/mifos/mobile/ui/activities/HomeActivity.kt deleted file mode 100644 index fa54a0662..000000000 --- a/androidApp/src/main/java/org/mifos/mobile/ui/activities/HomeActivity.kt +++ /dev/null @@ -1,135 +0,0 @@ -package org.mifos.mobile.ui.activities - -import android.content.BroadcastReceiver -import android.content.Context -import android.content.Intent -import android.content.IntentFilter -import android.os.Bundle -import android.os.Handler -import android.util.Log -import androidx.activity.ComponentActivity -import androidx.activity.compose.setContent -import androidx.activity.enableEdgeToEdge -import androidx.activity.viewModels -import androidx.localbroadcastmanager.content.LocalBroadcastManager -import androidx.navigation.NavHostController -import androidx.navigation.compose.rememberNavController -import com.google.android.gms.common.ConnectionResult -import com.google.android.gms.common.GoogleApiAvailability -import dagger.hilt.android.AndroidEntryPoint -import org.mifos.mobile.R -import org.mifos.mobile.core.common.Constants -import org.mifos.mobile.core.designsystem.theme.MifosMobileTheme -import org.mifos.mobile.feature.home.navigation.HomeNavigation -import org.mifos.mobile.feature.user.profile.viewmodel.UserDetailViewModel -import org.mifos.mobile.navigation.RootNavGraph -import org.mifos.mobile.utils.Toaster -import org.mifos.mobile.utils.fcm.RegistrationIntentService - -/** - * @author Vishwajeet - * @since 14/07/2016 - */ -@AndroidEntryPoint -class HomeActivity : ComponentActivity() { - - private val viewModel: UserDetailViewModel by viewModels() - private var isReceiverRegistered = false - private var doubleBackToExitPressedOnce = false - private lateinit var navHostController: NavHostController - - override fun onCreate(savedInstanceState: Bundle?) { - super.onCreate(savedInstanceState) - - if (checkPlayServices()) { - // Start IntentService to register this application with GCM. - val intent = Intent(this, RegistrationIntentService::class.java) - startService(intent) - } - - enableEdgeToEdge() - setContent { - MifosMobileTheme { - navHostController = rememberNavController() - RootNavGraph( - startDestination = HomeNavigation.HomeBase.route, - navController = navHostController, - ) - } - } - } - - override fun onPause() { - LocalBroadcastManager.getInstance(this).unregisterReceiver(registerReceiver) - isReceiverRegistered = false - super.onPause() - } - - override fun onResume() { - super.onResume() - if (!isReceiverRegistered) { - LocalBroadcastManager.getInstance(this).registerReceiver( - registerReceiver, - IntentFilter(Constants.REGISTER_ON_SERVER), - ) - isReceiverRegistered = true - } - } - - /** - * Handling back press - */ - @Deprecated("Deprecated in Java") - override fun onBackPressed() { - val currentRoute = navHostController.currentBackStackEntry?.destination?.route - - if (currentRoute == HomeNavigation.HomeScreen.route) { -// if (doubleBackToExitPressedOnce && stackCount() == 0) { -// finish() -// return -// } - doubleBackToExitPressedOnce = true - Toaster.show(findViewById(android.R.id.content), getString(R.string.exit_message)) - Handler().postDelayed({ doubleBackToExitPressedOnce = false }, 2000) - } - - super.onBackPressed() - -// if (stackCount() != 0) { -// super.onBackPressed() -// } - } - - - /** - * Check the device to make sure it has the Google Play Services APK. If - * it doesn't, display a dialog that allows users to download the APK from - * the Google Play Store or enable it in the device's system settings. - */ - private fun checkPlayServices(): Boolean { - val apiAvailability = GoogleApiAvailability.getInstance() - val resultCode = apiAvailability.isGooglePlayServicesAvailable(this) - if (resultCode != ConnectionResult.SUCCESS) { - if (apiAvailability.isUserResolvableError(resultCode)) { - apiAvailability.getErrorDialog(this, resultCode, PLAY_SERVICES_RESOLUTION_REQUEST) - ?.show() - } else { - Log.i(HomeActivity::class.java.name, "This device is not supported.") - finish() - } - return false - } - return true - } - - private val registerReceiver: BroadcastReceiver = object : BroadcastReceiver() { - override fun onReceive(context: Context, intent: Intent) { - val token = intent.getStringExtra(Constants.TOKEN) - token?.let { viewModel.registerNotification(it) } - } - } - - companion object { - private const val PLAY_SERVICES_RESOLUTION_REQUEST = 9000 - } -} \ No newline at end of file diff --git a/androidApp/src/main/java/org/mifos/mobile/ui/activities/LoginActivity.kt b/androidApp/src/main/java/org/mifos/mobile/ui/activities/LoginActivity.kt deleted file mode 100644 index 679d61763..000000000 --- a/androidApp/src/main/java/org/mifos/mobile/ui/activities/LoginActivity.kt +++ /dev/null @@ -1,33 +0,0 @@ -package org.mifos.mobile.ui.activities - -import android.os.Bundle -import androidx.activity.ComponentActivity -import androidx.activity.compose.setContent -import androidx.activity.enableEdgeToEdge -import androidx.navigation.compose.rememberNavController -import dagger.hilt.android.AndroidEntryPoint -import org.mifos.mobile.core.designsystem.theme.MifosMobileTheme -import org.mifos.mobile.feature.auth.navigation.AuthenticationNavigation -import org.mifos.mobile.navigation.RootNavGraph - -/** - * @author Vishwajeet - * @since 05/06/16 - */ -@AndroidEntryPoint -class LoginActivity : ComponentActivity() { - - override fun onCreate(savedInstanceState: Bundle?) { - super.onCreate(savedInstanceState) - enableEdgeToEdge() - setContent { - MifosMobileTheme { - val navController = rememberNavController() - RootNavGraph( - startDestination = AuthenticationNavigation.AuthenticationBase.route, - navController = navController, - ) - } - } - } -} diff --git a/androidApp/src/main/java/org/mifos/mobile/ui/activities/PassCodeActivity.kt b/androidApp/src/main/java/org/mifos/mobile/ui/activities/PassCodeActivity.kt deleted file mode 100644 index ad5ea3485..000000000 --- a/androidApp/src/main/java/org/mifos/mobile/ui/activities/PassCodeActivity.kt +++ /dev/null @@ -1,35 +0,0 @@ -package org.mifos.mobile.ui.activities - -import android.os.Bundle -import androidx.activity.ComponentActivity -import androidx.activity.compose.setContent -import androidx.activity.enableEdgeToEdge -import androidx.compose.foundation.layout.Box -import androidx.compose.foundation.layout.statusBarsPadding -import androidx.compose.ui.Modifier -import androidx.navigation.compose.rememberNavController -import dagger.hilt.android.AndroidEntryPoint -import org.mifos.mobile.core.designsystem.theme.MifosMobileTheme -import org.mifos.mobile.navigation.PASSCODE_SCREEN -import org.mifos.mobile.navigation.RootNavGraph - -@AndroidEntryPoint -class PassCodeActivity : ComponentActivity() { - - override fun onCreate(savedInstanceState: Bundle?) { - super.onCreate(savedInstanceState) - enableEdgeToEdge() - setContent { - MifosMobileTheme { - val navController = rememberNavController() - - Box(modifier = Modifier.statusBarsPadding()) { - RootNavGraph( - startDestination = PASSCODE_SCREEN, - navController = navController, - ) - } - } - } - } -} diff --git a/androidApp/src/main/java/org/mifos/mobile/ui/activities/SplashActivity.kt b/androidApp/src/main/java/org/mifos/mobile/ui/activities/SplashActivity.kt deleted file mode 100644 index 69169dd48..000000000 --- a/androidApp/src/main/java/org/mifos/mobile/ui/activities/SplashActivity.kt +++ /dev/null @@ -1,20 +0,0 @@ -package org.mifos.mobile.ui.activities - -import android.content.Intent -import android.os.Bundle -import androidx.activity.ComponentActivity - -/* -* Created by saksham on 01/June/2018 -*/ -class SplashActivity : ComponentActivity() { - - override fun onCreate(savedInstanceState: Bundle?) { - super.onCreate(savedInstanceState) - // TODO:: check for user logged in or not, and if logged in move to PasscodeActivity instead. - val intent = Intent(this, LoginActivity::class.java) - - startActivity(intent) - finish() - } -} diff --git a/androidApp/src/main/java/org/mifos/mobile/ui/views/BaseActivityCallback.kt b/androidApp/src/main/java/org/mifos/mobile/ui/views/BaseActivityCallback.kt deleted file mode 100644 index 64fababdc..000000000 --- a/androidApp/src/main/java/org/mifos/mobile/ui/views/BaseActivityCallback.kt +++ /dev/null @@ -1,13 +0,0 @@ -package org.mifos.mobile.ui.views - -/** - * @author Rajan Maurya - */ -interface BaseActivityCallback { - - fun showProgressDialog(message: String?) - - fun hideProgressDialog() - - fun setToolbarTitle(title: String?) -} diff --git a/androidApp/src/main/java/org/mifos/mobile/ui/widgets/ChargeAppWidget.kt b/androidApp/src/main/java/org/mifos/mobile/ui/widgets/ChargeAppWidget.kt deleted file mode 100644 index 0dda7998d..000000000 --- a/androidApp/src/main/java/org/mifos/mobile/ui/widgets/ChargeAppWidget.kt +++ /dev/null @@ -1,64 +0,0 @@ -package org.mifos.mobile.ui.widgets - -import android.annotation.TargetApi -import android.appwidget.AppWidgetManager -import android.appwidget.AppWidgetProvider -import android.content.Context -import android.content.Intent -import android.os.Build -import android.widget.RemoteViews -import org.mifos.mobile.R - -/** - * Implementation of App Widget functionality. - */ -class ChargeAppWidget : AppWidgetProvider() { - - override fun onUpdate( - context: Context, - appWidgetManager: AppWidgetManager, - appWidgetIds: IntArray, - ) { - // There may be multiple widgets active, so update all of them - for (appWidgetId in appWidgetIds) { - updateAppWidget(context, appWidgetManager, appWidgetId) - } - super.onUpdate(context, appWidgetManager, appWidgetIds) - } - - override fun onEnabled(context: Context) { - // Enter relevant functionality for when the first widget is created - } - - override fun onDisabled(context: Context) { - // Enter relevant functionality for when the last widget is disabled - } - - companion object { - fun updateAppWidget( - context: Context, - appWidgetManager: AppWidgetManager, - appWidgetId: Int, - ) { - val views = RemoteViews(context.packageName, R.layout.charge_app_widget) - - // Set up the collection - setRemoteAdapter(context, views) - // Instruct the widget manager to update the widget - appWidgetManager.updateAppWidget(appWidgetId, views) - } - - /** - * Sets the remote adapter used to fill in the list items - * - * @param views RemoteViews to set the RemoteAdapter - */ - @TargetApi(Build.VERSION_CODES.ICE_CREAM_SANDWICH) - private fun setRemoteAdapter(context: Context, views: RemoteViews) { - views.setRemoteAdapter( - R.id.lv_charges, - Intent(context, ChargeWidgetService::class.java), - ) - } - } -} diff --git a/androidApp/src/main/java/org/mifos/mobile/ui/widgets/ChargeWidgetDataProvider.kt b/androidApp/src/main/java/org/mifos/mobile/ui/widgets/ChargeWidgetDataProvider.kt deleted file mode 100644 index c82ad4c9f..000000000 --- a/androidApp/src/main/java/org/mifos/mobile/ui/widgets/ChargeWidgetDataProvider.kt +++ /dev/null @@ -1,110 +0,0 @@ -package org.mifos.mobile.ui.widgets - -import android.content.Context -import android.widget.RemoteViews -import android.widget.RemoteViewsService.RemoteViewsFactory -import android.widget.Toast -import dagger.hilt.android.qualifiers.ApplicationContext -import org.mifos.mobile.R -import org.mifos.mobile.core.data.repository.ClientChargeRepository -import org.mifos.mobile.core.datastore.model.Charge -import java.util.concurrent.locks.ReentrantLock -import javax.inject.Inject - -/** - * ChargeWidgetDataProvider acts as the adapter for the collection view widget, - * providing RemoteViews to the widget in the getViewAt method. - */ -class ChargeWidgetDataProvider(@param:ApplicationContext private val context: Context) : - RemoteViewsFactory { - - @Inject - lateinit var clientChargeRepository: ClientChargeRepository - - - private var charges: List? - private val `object`: ReentrantLock = ReentrantLock() - private val condition = `object`.newCondition() - - override fun onCreate() { - - } - - override fun onDataSetChanged() { - // TODO Make ClientId Dynamic - //clientChargeViewModel.loadClientLocalCharges() - synchronized(`object`) { - try { - // Calling wait() will block this thread until another thread - // calls notify() on the object. - condition.await() - } catch (e: InterruptedException) { - // Happens if someone interrupts your thread. - } - } - } - - override fun getCount(): Int { - return if (charges != null) { - charges!!.size - } else { - 0 - } - } - - override fun getViewAt(position: Int): RemoteViews { - val charge = charges?.get(position) - val itemId = R.layout.item_widget_client_charge - val view = RemoteViews(context.packageName, itemId) - view.setTextViewText(R.id.tv_charge_name, charge?.name) - view.setTextViewText(R.id.tv_charge_amount, charge?.amount.toString()) - view.setImageViewResource(R.id.circle_status, R.drawable.ic_attach_money_black_24dp) - return view - } - - override fun getLoadingView(): RemoteViews? { - return null - } - - override fun getViewTypeCount(): Int { - return 1 - } - - override fun getItemId(position: Int): Long { - return position.toLong() - } - - override fun hasStableIds(): Boolean { - return false - } - - fun showErrorFetchingClientCharges(message: String?) { - Toast.makeText( - context, - context.getString(R.string.error_client_charge_loading), - Toast.LENGTH_SHORT, - ).show() - } - - fun showClientCharges(clientChargesList: List?) { - charges = clientChargesList - synchronized(`object`) { - condition.signal() - } - } - - fun showProgress() {} - - fun hideProgress() {} - - override fun onDestroy() { - } - - companion object { - private val LOG_TAG = ChargeWidgetDataProvider::class.java.simpleName - } - - init { - charges = ArrayList() - } -} diff --git a/androidApp/src/main/java/org/mifos/mobile/ui/widgets/ChargeWidgetService.kt b/androidApp/src/main/java/org/mifos/mobile/ui/widgets/ChargeWidgetService.kt deleted file mode 100644 index e2f40873e..000000000 --- a/androidApp/src/main/java/org/mifos/mobile/ui/widgets/ChargeWidgetService.kt +++ /dev/null @@ -1,14 +0,0 @@ -package org.mifos.mobile.ui.widgets - -import android.content.Intent -import android.widget.RemoteViewsService - -/** - * ChargeWidgetService is the [RemoteViewsService] that will return our RemoteViewsFactory - */ -class ChargeWidgetService : RemoteViewsService() { - - override fun onGetViewFactory(intent: Intent): RemoteViewsFactory { - return ChargeWidgetDataProvider(this) - } -} diff --git a/androidApp/src/main/java/org/mifos/mobile/utils/CheckSelfPermissionAndRequest.kt b/androidApp/src/main/java/org/mifos/mobile/utils/CheckSelfPermissionAndRequest.kt deleted file mode 100644 index cad06575a..000000000 --- a/androidApp/src/main/java/org/mifos/mobile/utils/CheckSelfPermissionAndRequest.kt +++ /dev/null @@ -1,152 +0,0 @@ -package org.mifos.mobile.utils - -import android.annotation.TargetApi -import android.content.Context -import android.content.DialogInterface -import android.content.Intent -import android.content.pm.PackageManager -import android.net.Uri -import android.os.Build -import android.provider.Settings -import android.widget.Toast -import androidx.appcompat.app.AppCompatActivity -import androidx.core.app.ActivityCompat -import androidx.core.content.ContextCompat -import org.mifos.mobile.R -import org.mifos.mobile.core.datastore.PreferencesHelper - -/** - * Created by dilpreet on 14/7/17. - */ -object CheckSelfPermissionAndRequest { - /** - * This Method Check the Permission is granted or not to the App. If the Permission granted, - * returns true and If not permission denied then returns false. - * - * @param context Context - * @param permission Manifest.permission...Permission... - * @return Boolean True or False. - */ - @JvmStatic - fun checkSelfPermission(context: Context?, permission: String?): Boolean { - return ContextCompat.checkSelfPermission(context!!, permission!!) == - PackageManager.PERMISSION_GRANTED - } - - /** - * This Method is requesting to device to grant the permission. When App is trying to - * request the device to grant the permission, then their is Three cases. - * 1. First case Device Prompt the Permission Dialog to user and user accepted or denied the - * Permission. - * 2. Second case will come, if user will denied the permission, after onclick dialog denied - * button and next time App ask for permission, It will show a Material Dialog and there - * will be a message to tell the user that you have denied the permission before, So do - * you want to give this permission to app or not, If yes then click on Re-Try dialog button - * and if not then click on Dialog button "I'm Sure", to not to give this permission to the - * app. - * - * - * And as user will click on "Re-Try" dialog button, he will be prompt with the with - * permission dialog with "[-] never ask again" and have two options first one to click on - * denied button again and put Un check the never ask check box. In this case, user will - * prompt with permission dialog with "[-] never ask again" in the loop, whenever app ask - * for that permission. - * - * - * and If user will click on "[_/] never ask again" check box then permission dialog with - * that permission will not prompt to the user. - * 3. Third case will came. when user have denied to accept permission with never ask again. - * then user will prompt with dialog and message that you have denied this permission with - * never ask again. but this is necessary permission to this app feature. and to grant - * this permission please click on dialog app settings button and give the permission to - * work with this feature. - * - * @param activity AppCompatActivity - * @param permission Manifest.permission...Permission... - * @param permissionRequestCode Permission Request Code. - * @param dialogMessageRetry Dialog Message Retry - * @param messageNeverAskAgain Dialog Message Never Ask Again - * @param permissionDeniedStatus Permission Denied Status - */ - @JvmStatic - @TargetApi(Build.VERSION_CODES.JELLY_BEAN) - fun requestPermission( - activity: AppCompatActivity, - permission: String, - permissionRequestCode: Int, - dialogMessageRetry: String?, - messageNeverAskAgain: String?, - permissionDeniedStatus: String?, - ) { - // Should we show an explanation? - if (ActivityCompat.shouldShowRequestPermissionRationale(activity, permission)) { - // Show an explanation to the user *asynchronously* -- don't block - // this thread waiting for the user's response! After the user - // sees the explanation, try again to request the permission. - MaterialDialog.Builder().init(activity) - .setTitle(R.string.dialog_permission_denied) - .setMessage(dialogMessageRetry) - .setPositiveButton( - R.string.dialog_action_re_try, - DialogInterface.OnClickListener { _, _ -> - ActivityCompat.requestPermissions( - activity, - arrayOf(permission), - permissionRequestCode, - ) - }, - ) - .setNegativeButton(R.string.dialog_action_i_am_sure) - .createMaterialDialog() - .show() - } else { - // Requesting Permission, first time to the device. - val preferencesHelper = PreferencesHelper(activity.applicationContext) - if (preferencesHelper.getBoolean(permissionDeniedStatus, true) == true) { - preferencesHelper.putBoolean(permissionDeniedStatus, false) - ActivityCompat.requestPermissions( - activity, - arrayOf(permission), - permissionRequestCode, - ) - } else { - // Requesting Permission, more the one time and opening the setting to change - // the Permission in App Settings. - MaterialDialog.Builder().init(activity) - .setMessage(messageNeverAskAgain) - .setNegativeButton(R.string.dialog_action_cancel) - .setPositiveButton( - R.string.dialog_action_app_settings, - DialogInterface.OnClickListener { _, _ -> // Making the Intent to grant the permission - val intent = Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS) - val uri = Uri.fromParts( - activity.resources.getString( - R.string.package_name, - ), - activity.packageName, - null, - ) - intent.data = uri - val pm = activity.packageManager - if (intent.resolveActivity(pm) != null) { - activity.startActivityForResult( - intent, - org.mifos.mobile.core.common.Constants.REQUEST_PERMISSION_SETTING, - ) - } else { - Toast.makeText( - activity, - activity.getString( - R.string.msg_setting_activity_not_found, - ), - Toast.LENGTH_LONG, - ).show() - } - }, - ) - .createMaterialDialog() - .show() - } - } - } -} diff --git a/androidApp/src/main/java/org/mifos/mobile/utils/ComparatorBasedOnId.kt b/androidApp/src/main/java/org/mifos/mobile/utils/ComparatorBasedOnId.kt deleted file mode 100644 index 4b84615d9..000000000 --- a/androidApp/src/main/java/org/mifos/mobile/utils/ComparatorBasedOnId.kt +++ /dev/null @@ -1,24 +0,0 @@ -package org.mifos.mobile.utils - -import org.mifos.mobile.core.model.entity.accounts.Account - -/** - * Created by dilpreet on 14/6/17. - */ -open class ComparatorBasedOnId : Comparator { - /** - * Compares [Account] based on their Id - * @param o1 the first object to be compared. - * @param o2 the second object to be compared. - * @return a negative integer, zero, or a positive integer as the - * first argument is less than, equal to, or greater than the - * second. - */ - override fun compare(o1: Account?, o2: Account?): Int { - return if (o1 != null && o2 != null) { - o2.id.toFloat().compareTo(o1.id.toFloat()) - } else { - 0 - } - } -} diff --git a/androidApp/src/main/java/org/mifos/mobile/utils/ConfigurationDialogFragmentCompat.kt b/androidApp/src/main/java/org/mifos/mobile/utils/ConfigurationDialogFragmentCompat.kt deleted file mode 100644 index 9cdeafb0a..000000000 --- a/androidApp/src/main/java/org/mifos/mobile/utils/ConfigurationDialogFragmentCompat.kt +++ /dev/null @@ -1,130 +0,0 @@ -package org.mifos.mobile.utils - -import android.content.Context -import android.content.Intent -import android.text.Editable -import android.text.TextWatcher -import android.view.LayoutInflater -import android.view.View -import android.widget.EditText -import androidx.preference.DialogPreference.TargetFragment -import androidx.preference.Preference -import androidx.preference.PreferenceDialogFragmentCompat -import butterknife.BindView -import butterknife.ButterKnife -import com.google.android.material.textfield.TextInputLayout -import org.mifos.mobile.R -import org.mifos.mobile.core.datastore.PreferencesHelper -import org.mifos.mobile.ui.activities.LoginActivity -import java.net.MalformedURLException -import java.net.URL - -/** - * Created by dilpreet on 11/03/18. - */ -class ConfigurationDialogFragmentCompat : - PreferenceDialogFragmentCompat(), - TargetFragment, - TextWatcher { - @JvmField - @BindView(R.id.et_tenant) - var etTenant: EditText? = null - - @JvmField - @BindView(R.id.et_base_url) - var etBaseUrl: EditText? = null - - @JvmField - @BindView(R.id.til_tenant) - var tilTenant: TextInputLayout? = null - - @JvmField - @BindView(R.id.til_base_url) - var tilBaseUrl: TextInputLayout? = null - private var preferencesHelper: PreferencesHelper? = null - override fun onCreateDialogView(context: Context): View { - return LayoutInflater.from(context).inflate(R.layout.preference_configuration, null) - } - - override fun onBindDialogView(view: View) { - super.onBindDialogView(view) - ButterKnife.bind(this, view) - preferencesHelper = PreferencesHelper(context) - val preference = preference as ConfigurationPreference - etBaseUrl?.setText(preference.baseUrl) - etTenant?.setText(preference.tenant) - etBaseUrl?.text?.length?.let { etBaseUrl?.setSelection(it) } - etTenant?.addTextChangedListener(this) - etBaseUrl?.addTextChangedListener(this) - } - - override fun onDialogClosed(positiveResult: Boolean) { - if (positiveResult && !isFieldEmpty && isUrlValid) { - val preference = preference as ConfigurationPreference - if (!( - preference.baseUrl.toString() - .equals(etBaseUrl!!.text.toString()) && preference.tenant.toString() - .equals(etTenant!!.text.toString()) - ) - ) { - preference.updateConfigurations( - etBaseUrl?.text.toString(), - etTenant?.text.toString(), - ) - preferencesHelper?.clear() - val loginIntent = Intent(activity, LoginActivity::class.java) - loginIntent.flags = Intent.FLAG_ACTIVITY_NEW_TASK or Intent.FLAG_ACTIVITY_CLEAR_TASK - startActivity(loginIntent) - activity?.finish() - } - } - } - - override fun findPreference(key: CharSequence): Preference { - return preference - } - - val isFieldEmpty: Boolean - get() { - if (etBaseUrl?.text.toString().trim { it <= ' ' }.isEmpty()) { - return true - } - return etTenant?.text.toString().trim { it <= ' ' }.isEmpty() - } - val isUrlValid: Boolean - get() = try { - URL(etBaseUrl?.text.toString()) - true - } catch (e: MalformedURLException) { - false - } - - override fun beforeTextChanged(s: CharSequence, start: Int, count: Int, after: Int) {} - override fun onTextChanged(s: CharSequence, start: Int, before: Int, count: Int) { - if (s.toString().isEmpty()) { - if (etBaseUrl?.text.toString().isEmpty()) { - tilBaseUrl?.isErrorEnabled = true - tilBaseUrl?.error = getString( - R.string.error_validation_blank, - getString(R.string.base_url), - ) - } - if (etTenant?.text.toString().isEmpty()) { - tilTenant?.isErrorEnabled = true - tilTenant?.error = getString( - R.string.error_validation_blank, - getString(R.string.tenant), - ) - } - } else { - if (etBaseUrl?.text.toString().length != 0) { - tilBaseUrl?.isErrorEnabled = false - } - if (etTenant?.text.toString().length != 0) { - tilTenant?.isErrorEnabled = false - } - } - } - - override fun afterTextChanged(s: Editable) {} -} diff --git a/androidApp/src/main/java/org/mifos/mobile/utils/ConfigurationPreference.kt b/androidApp/src/main/java/org/mifos/mobile/utils/ConfigurationPreference.kt deleted file mode 100644 index 8430001bd..000000000 --- a/androidApp/src/main/java/org/mifos/mobile/utils/ConfigurationPreference.kt +++ /dev/null @@ -1,44 +0,0 @@ -package org.mifos.mobile.utils - -import android.content.Context -import android.util.AttributeSet -import androidx.preference.DialogPreference -import org.mifos.mobile.core.datastore.PreferencesHelper - -/** - * Created by dilpreet on 11/03/18. - */ -class ConfigurationPreference : DialogPreference { - private var preferencesHelper: PreferencesHelper? = null - - constructor(context: Context?, attrs: AttributeSet?, defStyleAttr: Int) : super( - context, - attrs, - defStyleAttr, - ) { - init() - } - - constructor(context: Context?, attrs: AttributeSet?) : super(context, attrs) { - init() - } - - constructor(context: Context?) : super(context) { - init() - } - - private fun init() { - isPersistent = false - preferencesHelper = PreferencesHelper(context) - } - - val baseUrl: String? - get() = preferencesHelper?.baseUrl - - fun updateConfigurations(baseUrl: String?, tenant: String?) { - preferencesHelper?.updateConfiguration(baseUrl, tenant) - } - - val tenant: String? - get() = preferencesHelper?.tenant -} diff --git a/androidApp/src/main/java/org/mifos/mobile/utils/DatePick.kt b/androidApp/src/main/java/org/mifos/mobile/utils/DatePick.kt deleted file mode 100644 index fe9af7639..000000000 --- a/androidApp/src/main/java/org/mifos/mobile/utils/DatePick.kt +++ /dev/null @@ -1,8 +0,0 @@ -package org.mifos.mobile.utils - -/** - * Created by dilpreet on 6/3/17. - */ -enum class DatePick { - START, END -} diff --git a/androidApp/src/main/java/org/mifos/mobile/utils/EndlessRecyclerViewScrollListener.kt b/androidApp/src/main/java/org/mifos/mobile/utils/EndlessRecyclerViewScrollListener.kt deleted file mode 100644 index ca89e43fd..000000000 --- a/androidApp/src/main/java/org/mifos/mobile/utils/EndlessRecyclerViewScrollListener.kt +++ /dev/null @@ -1,110 +0,0 @@ -package org.mifos.mobile.utils - -import androidx.recyclerview.widget.GridLayoutManager -import androidx.recyclerview.widget.LinearLayoutManager -import androidx.recyclerview.widget.RecyclerView -import androidx.recyclerview.widget.StaggeredGridLayoutManager - -abstract class EndlessRecyclerViewScrollListener : RecyclerView.OnScrollListener { - // The minimum amount of items to have below your current scroll position - // before loading more. - private var visibleThreshold = 5 - - // The current offset index of data you have loaded - private var currentPage = 0 - - // The total number of items in the dataset after the last load - private var previousTotalItemCount = 0 - - // True if we are still waiting for the last set of data to load. - private var loading = true - - // Sets the starting page index - private val startingPageIndex = 0 - var mLayoutManager: RecyclerView.LayoutManager - - constructor(layoutManager: LinearLayoutManager) { - mLayoutManager = layoutManager - } - - constructor(layoutManager: GridLayoutManager) { - mLayoutManager = layoutManager - visibleThreshold = visibleThreshold * layoutManager.spanCount - } - - constructor(layoutManager: StaggeredGridLayoutManager) { - mLayoutManager = layoutManager - visibleThreshold = visibleThreshold * layoutManager.spanCount - } - - fun getLastVisibleItem(lastVisibleItemPositions: IntArray): Int { - var maxSize = 0 - for (i in lastVisibleItemPositions.indices) { - if (i == 0) { - maxSize = lastVisibleItemPositions[i] - } else if (lastVisibleItemPositions[i] > maxSize) { - maxSize = lastVisibleItemPositions[i] - } - } - return maxSize - } - - // This happens many times a second during a scroll, so be wary of the code you place here. - // We are given a few useful parameters to help us work out if we need to load some more data, - // but first we check if we are waiting for the previous load to finish. - override fun onScrolled(view: RecyclerView, dx: Int, dy: Int) { - var lastVisibleItemPosition = 0 - val totalItemCount = mLayoutManager.itemCount - if (mLayoutManager is StaggeredGridLayoutManager) { - val lastVisibleItemPositions = - (mLayoutManager as StaggeredGridLayoutManager).findLastVisibleItemPositions( - null, - ) - // get maximum element within the list - lastVisibleItemPosition = getLastVisibleItem(lastVisibleItemPositions) - } else if (mLayoutManager is GridLayoutManager) { - lastVisibleItemPosition = - (mLayoutManager as GridLayoutManager).findLastVisibleItemPosition() - } else if (mLayoutManager is LinearLayoutManager) { - lastVisibleItemPosition = - (mLayoutManager as LinearLayoutManager).findLastVisibleItemPosition() - } - - // If the total item count is zero and the previous isn't, assume the - // list is invalidated and should be reset back to initial state - if (totalItemCount < previousTotalItemCount) { - currentPage = startingPageIndex - previousTotalItemCount = totalItemCount - if (totalItemCount == 0) { - loading = true - } - } - // If it’s still loading, we check to see if the dataset count has - // changed, if so we conclude it has finished loading and update the current page - // number and total item count. - if (loading && totalItemCount > previousTotalItemCount) { - loading = false - previousTotalItemCount = totalItemCount - } - - // If it isn’t currently loading, we check to see if we have breached - // the visibleThreshold and need to reload more data. - // If we do need to reload some more data, we execute onLoadMore to fetch the data. - // threshold should reflect how many total columns there are too - if (!loading && lastVisibleItemPosition + visibleThreshold > totalItemCount) { - currentPage++ - onLoadMore(currentPage, totalItemCount, view) - loading = true - } - } - - // Call this method whenever performing new searches - fun resetState() { - currentPage = startingPageIndex - previousTotalItemCount = 0 - loading = true - } - - // Defines the process for actually loading more data based on page - abstract fun onLoadMore(page: Int, totalItemsCount: Int, view: RecyclerView?) -} diff --git a/androidApp/src/main/java/org/mifos/mobile/utils/GuarantorUiState.kt b/androidApp/src/main/java/org/mifos/mobile/utils/GuarantorUiState.kt deleted file mode 100644 index b95f9aaa1..000000000 --- a/androidApp/src/main/java/org/mifos/mobile/utils/GuarantorUiState.kt +++ /dev/null @@ -1,28 +0,0 @@ -package org.mifos.mobile.utils - -import org.mifos.mobile.core.model.entity.guarantor.GuarantorApplicationPayload -import org.mifos.mobile.core.model.entity.guarantor.GuarantorPayload -import org.mifos.mobile.core.model.entity.guarantor.GuarantorTemplatePayload - -sealed class GuarantorUiState { - object Loading : GuarantorUiState() - - data class ShowError(val message: String?) : GuarantorUiState() - - data class GuarantorDeletedSuccessfully(val message: String?) : GuarantorUiState() - - data class GuarantorUpdatedSuccessfully(val message: String?) : GuarantorUiState() - - data class ShowGuarantorListSuccessfully(val payload: List?) : - GuarantorUiState() - - data class ShowGuarantorApplication(val template: GuarantorTemplatePayload?) : - GuarantorUiState() - - data class ShowGuarantorUpdation(val template: GuarantorTemplatePayload?) : GuarantorUiState() - - data class SubmittedSuccessfully( - val message: String?, - val payload: GuarantorApplicationPayload? - ) : GuarantorUiState() -} \ No newline at end of file diff --git a/androidApp/src/main/java/org/mifos/mobile/utils/ImageUtil.kt b/androidApp/src/main/java/org/mifos/mobile/utils/ImageUtil.kt deleted file mode 100644 index dd0d3eca4..000000000 --- a/androidApp/src/main/java/org/mifos/mobile/utils/ImageUtil.kt +++ /dev/null @@ -1,136 +0,0 @@ -package org.mifos.mobile.utils - -import android.graphics.Bitmap -import android.graphics.BitmapFactory -import android.graphics.Canvas -import android.graphics.Matrix -import android.graphics.Paint -import android.util.Log - -/** - * Created by dilpreet on 10/8/17. - */ -class ImageUtil { - // Default width and height - fun compressImage(decodedBytes: ByteArray): Bitmap? { - return compress(decodedBytes, 816.0f, 612.0f) - } - - fun compressImage(decodedBytes: ByteArray, maxHeight: Float, maxWidth: Float): Bitmap? { - return compress(decodedBytes, maxHeight, maxWidth) - } - - private fun compress(decodedBytes: ByteArray, maxHeight: Float, maxWidth: Float): Bitmap? { - var scaledBitmap: Bitmap? = null - val options = BitmapFactory.Options() - -// by setting this field as true, the actual bitmap pixels are not loaded in the memory. -// Just the bounds are loaded. If -// you try the use the bitmap here, you will get null. - options.inJustDecodeBounds = true - var bmp = BitmapFactory.decodeByteArray(decodedBytes, 0, decodedBytes.size, options) - var actualHeight = options.outHeight - var actualWidth = options.outWidth - var imgRatio = actualWidth / actualHeight.toFloat() - val maxRatio = maxWidth / maxHeight - -// width and height values are set maintaining the aspect ratio of the image - if (actualHeight > maxHeight || actualWidth > maxWidth) { - if (imgRatio < maxRatio) { - imgRatio = maxHeight / actualHeight - actualWidth = (imgRatio * actualWidth).toInt() - actualHeight = maxHeight.toInt() - } else if (imgRatio > maxRatio) { - imgRatio = maxWidth / actualWidth - actualHeight = (imgRatio * actualHeight).toInt() - actualWidth = maxWidth.toInt() - } else { - actualHeight = maxHeight.toInt() - actualWidth = maxWidth.toInt() - } - } - -// setting inSampleSize value allows to load a scaled down version of the original image - options.inSampleSize = calculateInSampleSize(options, actualWidth, actualHeight) - -// inJustDecodeBounds set to false to load the actual bitmap - options.inJustDecodeBounds = false - -// this options allow android to claim the bitmap memory if it runs low on memory - options.inPurgeable = true - options.inInputShareable = true - options.inTempStorage = ByteArray(16 * 1024) - try { - bmp = BitmapFactory.decodeByteArray(decodedBytes, 0, decodedBytes.size, options) - } catch (exception: OutOfMemoryError) { - Log.e(ImageUtil::class.java.name, exception.toString()) - } - try { - scaledBitmap = Bitmap.createBitmap(actualWidth, actualHeight, Bitmap.Config.ARGB_8888) - } catch (exception: OutOfMemoryError) { - Log.e(ImageUtil::class.java.name, exception.toString()) - } - val ratioX = actualWidth / options.outWidth.toFloat() - val ratioY = actualHeight / options.outHeight.toFloat() - val middleX = actualWidth / 2.0f - val middleY = actualHeight / 2.0f - val scaleMatrix = Matrix() - scaleMatrix.setScale(ratioX, ratioY, middleX, middleY) - val canvas = Canvas(scaledBitmap!!) - canvas.setMatrix(scaleMatrix) - canvas.drawBitmap( - bmp, - middleX - bmp.width / 2, - middleY - bmp.height / 2, - Paint(Paint.FILTER_BITMAP_FLAG), - ) - scaledBitmap = Bitmap.createBitmap( - scaledBitmap, - 0, - 0, - scaledBitmap.width, - scaledBitmap.height, - null, - true, - ) - return scaledBitmap - } - - private fun calculateInSampleSize( - options: BitmapFactory.Options, - reqWidth: Int, - reqHeight: Int, - ): Int { - val height = options.outHeight - val width = options.outWidth - var inSampleSize = 1 - if (height > reqHeight || width > reqWidth) { - val heightRatio = Math.round(height.toFloat() / reqHeight.toFloat()) - val widthRatio = Math.round(width.toFloat() / reqWidth.toFloat()) - inSampleSize = if (heightRatio < widthRatio) heightRatio else widthRatio - } - val totalPixels = width * height.toFloat() - val totalReqPixelsCap = reqWidth * reqHeight * 2.toFloat() - while (totalPixels / (inSampleSize * inSampleSize) > totalReqPixelsCap) { - inSampleSize++ - } - return inSampleSize - } - - companion object { - /** - * Reference : https://developer.android.com/topic/performance/graphics/load-bitmap.html - * And for scaling : - * https://stackoverflow.com/questions/8722359/scale-rotate-bitmap-using-matrix-in-android/8722592#8722592 - */ - @JvmStatic - var instance: ImageUtil? = null - get() { - if (field == null) { - field = ImageUtil() - } - return field - } - private set - } -} diff --git a/androidApp/src/main/java/org/mifos/mobile/utils/MFErrorParser.kt b/androidApp/src/main/java/org/mifos/mobile/utils/MFErrorParser.kt deleted file mode 100644 index 01a2178e2..000000000 --- a/androidApp/src/main/java/org/mifos/mobile/utils/MFErrorParser.kt +++ /dev/null @@ -1,28 +0,0 @@ -package org.mifos.mobile.utils - -import com.google.gson.Gson -import io.reactivex.plugins.RxJavaPlugins -import org.mifos.mobile.core.model.entity.mifoserror.MifosError -import retrofit2.HttpException - -object MFErrorParser { - const val LOG_TAG = "MFErrorParser" - private val gson = Gson() - fun parseError(serverResponse: String?): MifosError { - return gson.fromJson(serverResponse, MifosError::class.java) - } - - @JvmStatic - fun errorMessage(throwableError: Throwable?): String? { - var errorMessage: String? = "" - try { - if (throwableError is HttpException) { - errorMessage = throwableError.response()?.errorBody()?.string() - errorMessage = parseError(errorMessage).errors[0].defaultUserMessage - } - } catch (throwable: Throwable) { - RxJavaPlugins.getErrorHandler() - } - return errorMessage - } -} diff --git a/androidApp/src/main/java/org/mifos/mobile/utils/MaterialDialog.kt b/androidApp/src/main/java/org/mifos/mobile/utils/MaterialDialog.kt deleted file mode 100644 index 531b6a72d..000000000 --- a/androidApp/src/main/java/org/mifos/mobile/utils/MaterialDialog.kt +++ /dev/null @@ -1,205 +0,0 @@ -package org.mifos.mobile.utils - -import android.content.Context -import android.content.DialogInterface -import android.view.View -import androidx.annotation.StringRes -import androidx.appcompat.app.AlertDialog -import androidx.core.content.ContextCompat -import com.google.android.material.dialog.MaterialAlertDialogBuilder -import org.mifos.mobile.R - -/** - * This Class is the Material Dialog Builder Class - * Created by Rajan Maurya on 03/08/16. - */ -class MaterialDialog { - - class Builder { - - private var mMaterialDialogBuilder: AlertDialog.Builder? = null - private var context: Context? = null - - // This is the Default Builder Initialization with Material Style - fun init(context: Context?): Builder { - mMaterialDialogBuilder = MaterialAlertDialogBuilder(context!!) - this.context = context - return this - } - - // This method set the custom Material Style - fun init(context: Context?, theme: Int): Builder { - mMaterialDialogBuilder = AlertDialog.Builder(context!!, theme) - this.context = context - return this - } - - // This method set the String Title - fun setTitle(title: String?): Builder { - mMaterialDialogBuilder?.setTitle(title) - return this - } - - // This Method set the String Resources to Title - fun setTitle(@StringRes title: Int): Builder { - mMaterialDialogBuilder?.setTitle(title) - return this - } - - // This Method set the String Message - fun setMessage(message: String?): Builder { - mMaterialDialogBuilder?.setMessage(message) - return this - } - - // This Method set the String Resources message - fun setMessage(@StringRes message: Int): Builder { - mMaterialDialogBuilder?.setMessage(message) - return this - } - - // This Method set String Test to the Positive Button and set the Onclick null - fun setPositiveButton(positiveText: String?): Builder { - mMaterialDialogBuilder?.setPositiveButton(positiveText, null) - return this - } - - // This Method Set the String Resources Text To Positive Button - fun setPositiveButton(@StringRes positiveText: Int): Builder { - mMaterialDialogBuilder?.setPositiveButton(positiveText, null) - return this - } - - // This Method set the String Text to Positive Button and set the OnClick Event to it - fun setPositiveButton( - positiveText: String?, - listener: DialogInterface.OnClickListener?, - ): Builder { - mMaterialDialogBuilder?.setPositiveButton(positiveText, listener) - return this - } - - // This method set the String Resources text To Positive button and set the Onclick Event - fun setPositiveButton( - @StringRes positiveText: Int, - listener: DialogInterface.OnClickListener?, - ): Builder { - mMaterialDialogBuilder?.setPositiveButton(positiveText, listener) - return this - } - - // This Method the String Text to Negative Button and Set the onclick event to null - fun setNegativeButton(negativeText: String?): Builder { - mMaterialDialogBuilder?.setNegativeButton(negativeText, null) - return this - } - - // This Method set the String Resources Text to Negative button - // and set the onclick event to null - fun setNegativeButton(@StringRes negativeText: Int): Builder { - mMaterialDialogBuilder?.setNegativeButton(negativeText, null) - return this - } - - // This Method set String Text to Negative Button and - // Set the Onclick event - fun setNegativeButton( - negativeText: String?, - listener: DialogInterface.OnClickListener?, - ): Builder { - mMaterialDialogBuilder?.setNegativeButton(negativeText, listener) - return this - } - - // This method set String Resources Text to Negative Button and set Onclick Event - fun setNegativeButton( - @StringRes negativeText: Int, - listener: DialogInterface.OnClickListener?, - ): Builder { - mMaterialDialogBuilder?.setNegativeButton(negativeText, listener) - return this - } - - // This Method the String Text to Neutral Button and Set the onclick event to null - fun setNeutralButton(neutralText: String?): Builder { - mMaterialDialogBuilder?.setNeutralButton(neutralText, null) - return this - } - - // This Method set the String Resources Text to Neutral button - // and set the onclick event to null - fun setNeutralButton(@StringRes neutralText: Int): Builder { - mMaterialDialogBuilder?.setNeutralButton(neutralText, null) - return this - } - - // This Method set String Text to Neutral Button and - // Set the Onclick event - fun setNeutralButton( - neutralText: String?, - listener: DialogInterface.OnClickListener?, - ): Builder { - mMaterialDialogBuilder?.setNeutralButton(neutralText, listener) - return this - } - - // This method set String Resources Text to Neutral Button and set Onclick Event - fun setNeutralButton( - @StringRes neutralText: Int, - listener: DialogInterface.OnClickListener?, - ): Builder { - mMaterialDialogBuilder?.setNeutralButton(neutralText, listener) - return this - } - - fun setCancelable(cancelable: Boolean?): Builder { - mMaterialDialogBuilder?.setCancelable(cancelable!!) - return this - } - - fun setItems(items: Int, listener: DialogInterface.OnClickListener?): Builder { - mMaterialDialogBuilder?.setItems(items, listener) - return this - } - - fun setItems(items: Array?, listener: DialogInterface.OnClickListener?): Builder { - mMaterialDialogBuilder?.setItems(items, listener) - return this - } - - fun addView(view: View?): Builder { - mMaterialDialogBuilder?.setView(view) - return this - } - - // This Method Create the Final Material Dialog - fun createMaterialDialog(): Builder { - mMaterialDialogBuilder?.create() - return this - } - - // This Method Show the Dialog - fun show(): Builder { - val dialog = mMaterialDialogBuilder?.show() - dialog?.getButton(DialogInterface.BUTTON_POSITIVE)?.setTextColor( - ContextCompat.getColor( - context!!, - R.color.accent, - ), - ) - dialog?.getButton(DialogInterface.BUTTON_NEGATIVE)?.setTextColor( - ContextCompat.getColor( - context!!, - R.color.gray_dark, - ), - ) - dialog?.getButton(DialogInterface.BUTTON_NEUTRAL)?.setTextColor( - ContextCompat.getColor( - context!!, - R.color.black, - ), - ) - return this - } - } -} diff --git a/androidApp/src/main/java/org/mifos/mobile/utils/ProcessView.kt b/androidApp/src/main/java/org/mifos/mobile/utils/ProcessView.kt deleted file mode 100644 index 8601dccb2..000000000 --- a/androidApp/src/main/java/org/mifos/mobile/utils/ProcessView.kt +++ /dev/null @@ -1,72 +0,0 @@ -package org.mifos.mobile.utils - -import android.content.Context -import android.graphics.Canvas -import android.graphics.Paint -import android.util.AttributeSet -import android.view.View -import androidx.core.content.ContextCompat -import org.mifos.mobile.R -import org.mifos.mobile.ui.getThemeAttributeColor - -/** - * Created by dilpreet on 30/6/17. - */ -class ProcessView : View { - private var valueStr: String? = null - private var textPaint: Paint? = null - private var backgroundPaint: Paint? = null - - constructor(context: Context?) : super(context, null) - constructor(context: Context, attrs: AttributeSet?) : super(context, attrs) { - val typedArray = context.obtainStyledAttributes(attrs, R.styleable.ProcessView) - valueStr = typedArray.getString(R.styleable.ProcessView_value) - typedArray.recycle() - textPaint = Paint() - textPaint?.color = getColorCompat(android.R.color.white) - textPaint?.isAntiAlias = true - textPaint?.style = Paint.Style.FILL - textPaint?.strokeWidth = 1f - textPaint?.textSize = 40f - backgroundPaint = Paint() - backgroundPaint?.color = getColorCompat(R.color.gray_dark) - backgroundPaint?.isAntiAlias = true - backgroundPaint?.style = Paint.Style.FILL - } - - override fun onDraw(canvas: Canvas) { - super.onDraw(canvas) - val xPos = - canvas.width / 2 - (textPaint?.measureText(valueStr.toString())?.div(2))?.toInt()!! - val yPos = ( - canvas.height / 2 - ( - ( - textPaint?.descent() - ?.plus(textPaint?.ascent()!!) - )?.div(2) - )!! - ).toInt() - val usableWidth = width - (paddingLeft + paddingRight) - val usableHeight = height - (paddingTop + paddingBottom) - val radius = usableWidth.coerceAtMost(usableHeight) / 2 - val cx = paddingLeft + usableWidth / 2 - val cy = paddingTop + usableHeight / 2 - canvas.drawCircle(cx.toFloat(), cy.toFloat(), radius.toFloat(), backgroundPaint!!) - canvas.drawText(valueStr!!, xPos.toFloat(), yPos.toFloat(), textPaint!!) - } - - fun setCurrentActive() { - backgroundPaint?.color = context.getThemeAttributeColor(R.attr.colorPrimary) - invalidate() - } - - fun setCurrentCompleted() { - backgroundPaint?.color = context.getThemeAttributeColor(R.attr.colorPrimary) - valueStr = "\u2713" - invalidate() - } - - private fun getColorCompat(colorId: Int): Int { - return ContextCompat.getColor(context, colorId) - } -} diff --git a/androidApp/src/main/java/org/mifos/mobile/utils/RetrofitUtils.kt b/androidApp/src/main/java/org/mifos/mobile/utils/RetrofitUtils.kt deleted file mode 100644 index 420ac7296..000000000 --- a/androidApp/src/main/java/org/mifos/mobile/utils/RetrofitUtils.kt +++ /dev/null @@ -1,24 +0,0 @@ -package org.mifos.mobile.utils - -import okhttp3.MediaType -import okhttp3.Protocol -import okhttp3.ResponseBody -import retrofit2.HttpException -import retrofit2.Response - -/** - * Created by dilpreet on 29/7/17. - */ -object RetrofitUtils { - fun getResponseForError(errorCode: Int): Exception { - val message = if (errorCode == 401) "UnAuthorized" else "Not Found" - val responseBody = - ResponseBody.create(MediaType.parse("application/json"), "{\"message\":\"$message\"}") - val response = okhttp3.Response.Builder().code(errorCode) - .message(message) - .protocol(Protocol.HTTP_1_1) - .request(okhttp3.Request.Builder().url("http://localhost/").build()) - .build() - return HttpException(Response.error(responseBody, response)) - } -} diff --git a/androidApp/src/main/java/org/mifos/mobile/utils/RxBus.kt b/androidApp/src/main/java/org/mifos/mobile/utils/RxBus.kt deleted file mode 100644 index 240167b82..000000000 --- a/androidApp/src/main/java/org/mifos/mobile/utils/RxBus.kt +++ /dev/null @@ -1,24 +0,0 @@ -package org.mifos.mobile.utils - -import io.reactivex.Observable -import io.reactivex.subjects.PublishSubject - -/* - * Created by saksham on 31/July/2018 -*/ - -object RxBus { - - @JvmStatic - private val publisher = PublishSubject.create() - - @JvmStatic - fun publish(event: Any?) { - if (event != null) publisher.onNext(event) - } - - @JvmStatic - fun listen(eventType: Class): Observable { - return publisher.ofType(eventType) - } -} diff --git a/androidApp/src/main/java/org/mifos/mobile/utils/RxEvent.kt b/androidApp/src/main/java/org/mifos/mobile/utils/RxEvent.kt deleted file mode 100644 index 590edcaa9..000000000 --- a/androidApp/src/main/java/org/mifos/mobile/utils/RxEvent.kt +++ /dev/null @@ -1,16 +0,0 @@ -package org.mifos.mobile.utils - -import org.mifos.mobile.core.model.entity.guarantor.GuarantorApplicationPayload - -/* - * Created by saksham on 29/July/2018 -*/ - -class RxEvent { - - data class AddGuarantorEvent(var payload: GuarantorApplicationPayload?, var index: Int?) - - data class DeleteGuarantorEvent(var index: Int?) - - data class UpdateGuarantorEvent(var payload: GuarantorApplicationPayload?, var index: Int?) -} diff --git a/androidApp/src/main/java/org/mifos/mobile/utils/SavingsAccountUiState.kt b/androidApp/src/main/java/org/mifos/mobile/utils/SavingsAccountUiState.kt deleted file mode 100644 index 615543926..000000000 --- a/androidApp/src/main/java/org/mifos/mobile/utils/SavingsAccountUiState.kt +++ /dev/null @@ -1,31 +0,0 @@ -package org.mifos.mobile.utils - -import org.mifos.mobile.core.model.entity.accounts.savings.SavingsWithAssociations -import org.mifos.mobile.core.model.entity.accounts.savings.Transactions -import org.mifos.mobile.core.model.entity.templates.account.AccountOptionsTemplate -import org.mifos.mobile.core.model.entity.templates.savings.SavingsAccountTemplate - -sealed class SavingsAccountUiState { - object Initial : SavingsAccountUiState() - object Loading : SavingsAccountUiState() - object Error : SavingsAccountUiState() - data class SuccessLoadingSavingsWithAssociations(val savingAccount: SavingsWithAssociations) : - SavingsAccountUiState() - - data class ShowFilteredTransactionsList(val savingAccountsTransactionList: List?) : - SavingsAccountUiState() - - object SavingsAccountUpdateSuccess : SavingsAccountUiState() - object SavingsAccountApplicationSuccess : SavingsAccountUiState() - data class ShowUserInterfaceSavingAccountUpdate(val template: SavingsAccountTemplate) : - SavingsAccountUiState() - - data class ShowUserInterfaceSavingAccountApplication(val template: SavingsAccountTemplate) : - SavingsAccountUiState() - - data class ErrorMessage(val error: Throwable) : SavingsAccountUiState() - object HideProgress : SavingsAccountUiState() - object SavingsAccountWithdrawSuccess : SavingsAccountUiState() - - data class ShowSavingsAccountTemplate(val accountOptionsTemplate: AccountOptionsTemplate) : SavingsAccountUiState() -} diff --git a/androidApp/src/main/java/org/mifos/mobile/utils/ScrollFabBehavior.kt b/androidApp/src/main/java/org/mifos/mobile/utils/ScrollFabBehavior.kt deleted file mode 100644 index c6c2e97ac..000000000 --- a/androidApp/src/main/java/org/mifos/mobile/utils/ScrollFabBehavior.kt +++ /dev/null @@ -1,63 +0,0 @@ -package org.mifos.mobile.utils - -import android.content.Context -import android.util.AttributeSet -import android.view.View -import androidx.coordinatorlayout.widget.CoordinatorLayout -import androidx.core.view.ViewCompat -import com.google.android.material.floatingactionbutton.FloatingActionButton -import com.google.android.material.floatingactionbutton.FloatingActionButton.OnVisibilityChangedListener - -/** - * Created by dilpreet on 23/8/17. - */ -class ScrollFabBehavior(context: Context?, attrs: AttributeSet?) : FloatingActionButton.Behavior() { - override fun onStartNestedScroll( - coordinatorLayout: CoordinatorLayout, - child: FloatingActionButton, - directTargetChild: View, - target: View, - nestedScrollAxes: Int, - ): Boolean { - return nestedScrollAxes == ViewCompat.SCROLL_AXIS_VERTICAL || - super.onStartNestedScroll( - coordinatorLayout, - child, - directTargetChild, - target, - nestedScrollAxes, - ) - } - - override fun onNestedScroll( - coordinatorLayout: CoordinatorLayout, - child: FloatingActionButton, - target: View, - dxConsumed: Int, - dyConsumed: Int, - dxUnconsumed: Int, - dyUnconsumed: Int, - ) { - super.onNestedScroll( - coordinatorLayout, - child, - target, - dxConsumed, - dyConsumed, - dxUnconsumed, - dyUnconsumed, - ) - if (dyConsumed > 0 && child.visibility == View.VISIBLE) { - // Reason to set fab visiblity as INVISIBLE : - // https://stackoverflow.com/a/41386278/4672688 - child.hide(object : OnVisibilityChangedListener() { - override fun onHidden(fab: FloatingActionButton) { - super.onHidden(fab) - fab.visibility = View.INVISIBLE - } - }) - } else if (dyConsumed < 0 && child.visibility != View.VISIBLE) { - child.show() - } - } -} diff --git a/androidApp/src/main/java/org/mifos/mobile/utils/StatusUtils.kt b/androidApp/src/main/java/org/mifos/mobile/utils/StatusUtils.kt deleted file mode 100644 index 41f2edb55..000000000 --- a/androidApp/src/main/java/org/mifos/mobile/utils/StatusUtils.kt +++ /dev/null @@ -1,70 +0,0 @@ -package org.mifos.mobile.utils - -import android.content.Context -import androidx.core.content.ContextCompat -import org.mifos.mobile.R -import org.mifos.mobile.core.model.entity.CheckboxStatus - -/** - * Created by dilpreet on 3/7/17. - */ -object StatusUtils { - - fun getSavingsAccountTransactionList(context: Context?): List { - val arrayList = ArrayList() - arrayList.add( - CheckboxStatus( - context?.getString(R.string.feature_account_deposit), - ContextCompat - .getColor(context!!, R.color.deposit_green), - ), - ) - arrayList.add( - CheckboxStatus( - context.getString(R.string.feature_account_dividend_payout), - ContextCompat - .getColor(context, R.color.red_light), - ), - ) - arrayList.add( - CheckboxStatus( - context.getString(R.string.feature_account_withdrawal), - ContextCompat - .getColor(context, R.color.red_light), - ), - ) - arrayList.add( - CheckboxStatus( - context.getString(R.string.feature_account_interest_posting), - ContextCompat.getColor(context, R.color.green_light), - ), - ) - arrayList.add( - CheckboxStatus( - context.getString(R.string.feature_account_fee_deduction), - ContextCompat - .getColor(context, R.color.red_light), - ), - ) - arrayList.add( - CheckboxStatus( - context.getString(R.string.feature_account_withdrawal_transfer), - ContextCompat.getColor(context, R.color.red_light), - ), - ) - arrayList.add( - CheckboxStatus( - context.getString(R.string.feature_account_rejected_transfer), - ContextCompat.getColor(context, R.color.green_light), - ), - ) - arrayList.add( - CheckboxStatus( - context.getString(R.string.feature_account_overdraft_fee), - ContextCompat - .getColor(context, R.color.red_light), - ), - ) - return arrayList - } -} diff --git a/androidApp/src/main/java/org/mifos/mobile/utils/TextDrawable.kt b/androidApp/src/main/java/org/mifos/mobile/utils/TextDrawable.kt deleted file mode 100644 index 82f369af9..000000000 --- a/androidApp/src/main/java/org/mifos/mobile/utils/TextDrawable.kt +++ /dev/null @@ -1,281 +0,0 @@ -package org.mifos.mobile.utils - -import android.graphics.Canvas -import android.graphics.Color -import android.graphics.ColorFilter -import android.graphics.Paint -import android.graphics.PixelFormat -import android.graphics.RectF -import android.graphics.Typeface -import android.graphics.drawable.ShapeDrawable -import android.graphics.drawable.shapes.OvalShape -import android.graphics.drawable.shapes.RectShape -import android.graphics.drawable.shapes.RoundRectShape -import java.util.Locale - -class TextDrawable private constructor(builder: Builder) : ShapeDrawable(builder.shape) { - private val textPaint: Paint - private val borderPaint: Paint - private val text: String - private val color: Int - private val shape: RectShape - private val height: Int - private val width: Int - private val fontSize: Int - private val radius: Float - private val borderThickness: Int - private fun getDarkerShade(color: Int): Int { - return Color.rgb( - (SHADE_FACTOR * Color.red(color)).toInt(), - (SHADE_FACTOR * Color.green(color)).toInt(), - (SHADE_FACTOR * Color.blue(color)).toInt(), - ) - } - - override fun draw(canvas: Canvas) { - super.draw(canvas) - val r = bounds - - // draw border - if (borderThickness > 0) { - drawBorder(canvas) - } - val count = canvas.save() - canvas.translate(r.left.toFloat(), r.top.toFloat()) - - // draw text - val width = if (width < 0) r.width() else width - val height = if (height < 0) r.height() else height - val fontSize = if (fontSize < 0) Math.min(width, height) / 2 else fontSize - textPaint.textSize = fontSize.toFloat() - canvas.drawText( - text, - width / 2.toFloat(), - height / 2 - (textPaint.descent() + textPaint.ascent()) / 2, - textPaint, - ) - canvas.restoreToCount(count) - } - - private fun drawBorder(canvas: Canvas) { - val rect = RectF(bounds) - rect.inset(borderThickness / 2.toFloat(), borderThickness / 2.toFloat()) - if (shape is OvalShape) { - canvas.drawOval(rect, borderPaint) - } else if (shape is RoundRectShape) { - canvas.drawRoundRect(rect, radius, radius, borderPaint) - } else { - canvas.drawRect(rect, borderPaint) - } - } - - override fun setAlpha(alpha: Int) { - textPaint.alpha = alpha - } - - override fun setColorFilter(cf: ColorFilter?) { - textPaint.colorFilter = cf - } - - override fun getOpacity(): Int { - return PixelFormat.TRANSLUCENT - } - - override fun getIntrinsicWidth(): Int { - return width - } - - override fun getIntrinsicHeight(): Int { - return height - } - - class Builder : IConfigBuilder, IShapeBuilder, IBuilder { - var text = "" - var color: Int - var borderThickness: Int - var iconWidth: Int - var iconHeight: Int - var font: Typeface - var shape: RectShape - var iconTextColor: Int - var iconFontSize: Int - var isBold: Boolean - var iconToUpperCase: Boolean - var radius = 0f - override fun width(width: Int): IConfigBuilder { - iconWidth = width - return this - } - - override fun height(height: Int): IConfigBuilder { - iconHeight = height - return this - } - - override fun textColor(color: Int): IConfigBuilder { - iconTextColor = color - return this - } - - override fun withBorder(thickness: Int): IConfigBuilder { - borderThickness = thickness - return this - } - - override fun useFont(font: Typeface): IConfigBuilder { - this.font = font - return this - } - - override fun fontSize(size: Int): IConfigBuilder { - iconFontSize = size - return this - } - - override fun bold(): IConfigBuilder { - isBold = true - return this - } - - override fun toUpperCase(): IConfigBuilder { - iconToUpperCase = true - return this - } - - override fun beginConfig(): IConfigBuilder { - return this - } - - override fun endConfig(): IShapeBuilder { - return this - } - - override fun rect(): IBuilder { - shape = RectShape() - return this - } - - override fun round(): IBuilder { - shape = OvalShape() - return this - } - - override fun roundRect(radius: Int): IBuilder { - this.radius = radius.toFloat() - val radii = floatArrayOf( - radius.toFloat(), - radius.toFloat(), - radius.toFloat(), - radius.toFloat(), - radius.toFloat(), - radius.toFloat(), - radius.toFloat(), - radius.toFloat(), - ) - shape = RoundRectShape(radii, null, null) - return this - } - - override fun buildRect(text: String, color: Int): TextDrawable { - rect() - return build(text, color) - } - - override fun buildRoundRect(text: String, color: Int, radius: Int): TextDrawable { - roundRect(radius) - return build(text, color) - } - - override fun buildRound(text: String?, color: Int): TextDrawable { - round() - return build(text!!, color) - } - - override fun build(text: String, color: Int): TextDrawable { - this.color = color - this.text = text - return TextDrawable(this) - } - - init { - color = Color.GRAY - iconTextColor = Color.WHITE - borderThickness = 0 - iconWidth = -1 - iconHeight = -1 - shape = RectShape() - font = Typeface.create("sans-serif-light", Typeface.NORMAL) - iconFontSize = -1 - isBold = false - iconToUpperCase = false - } - } - - interface IConfigBuilder { - fun width(width: Int): IConfigBuilder - fun height(height: Int): IConfigBuilder - fun textColor(color: Int): IConfigBuilder - fun withBorder(thickness: Int): IConfigBuilder - fun useFont(font: Typeface): IConfigBuilder - fun fontSize(size: Int): IConfigBuilder - fun bold(): IConfigBuilder - fun toUpperCase(): IConfigBuilder - fun endConfig(): IShapeBuilder - } - - interface IBuilder { - fun build(text: String, color: Int): TextDrawable - } - - interface IShapeBuilder { - fun beginConfig(): IConfigBuilder - fun rect(): IBuilder - fun round(): IBuilder - fun roundRect(radius: Int): IBuilder - fun buildRect(text: String, color: Int): TextDrawable - fun buildRoundRect(text: String, color: Int, radius: Int): TextDrawable - fun buildRound(text: String?, color: Int): TextDrawable - } - - companion object { - private const val SHADE_FACTOR = 0.9f - fun builder(): IShapeBuilder { - return Builder() - } - } - - init { - - // shape properties - shape = builder.shape - height = builder.iconHeight - width = builder.iconWidth - radius = builder.radius - - // text and color - text = if (builder.iconToUpperCase) builder.text.uppercase(Locale.ROOT) else builder.text - color = builder.color - - // text paint settings - fontSize = builder.iconFontSize - textPaint = Paint() - textPaint.color = builder.iconTextColor - textPaint.isAntiAlias = true - textPaint.isFakeBoldText = builder.isBold - textPaint.style = Paint.Style.FILL - textPaint.typeface = builder.font - textPaint.textAlign = Paint.Align.CENTER - textPaint.strokeWidth = builder.borderThickness.toFloat() - - // border paint settings - borderThickness = builder.borderThickness - borderPaint = Paint() - borderPaint.color = getDarkerShade(color) - borderPaint.style = Paint.Style.STROKE - borderPaint.strokeWidth = borderThickness.toFloat() - - // drawable paint color - val paint = paint - paint.color = color - } -} diff --git a/androidApp/src/main/java/org/mifos/mobile/utils/Toaster.kt b/androidApp/src/main/java/org/mifos/mobile/utils/Toaster.kt deleted file mode 100644 index 869884f82..000000000 --- a/androidApp/src/main/java/org/mifos/mobile/utils/Toaster.kt +++ /dev/null @@ -1,56 +0,0 @@ -package org.mifos.mobile.utils - -import android.content.Context -import android.view.View -import android.view.inputmethod.InputMethodManager -import com.google.android.material.snackbar.Snackbar -import org.mifos.mobile.MifosSelfServiceApp - -object Toaster { - - private val snackbarsQueue = ArrayList() - - @JvmOverloads - fun show(view: View?, text: String?, duration: Int = Snackbar.LENGTH_LONG) { - val imm = - MifosSelfServiceApp.context?.getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager - imm.hideSoftInputFromWindow(view?.windowToken, 0) - val snackbar = Snackbar.make(view!!, text!!, duration) - snackbar.setAction("OK") { } - snackbar.addCallback(object : Snackbar.Callback() { - - override fun onDismissed(transientBottomBar: Snackbar, event: Int) { - super.onDismissed(transientBottomBar, event) - if (snackbarsQueue.isNotEmpty()) { - snackbarsQueue.removeAt(0) - if (snackbarsQueue.isNotEmpty()) { - snackbarsQueue[0].show() - } - } - } - }) - snackbarsQueue.add(snackbar) - if (!snackbarsQueue[0].isShown) { - snackbarsQueue[0].show() - } - } - - fun show(view: View, res: Int, duration: Int) { - show(view, MifosSelfServiceApp.context?.resources?.getString(res), duration) - } - - fun cancelTransfer( - view: View?, - text: String?, - buttonText: String?, - listener: View.OnClickListener?, - ) { - val snackbar = Snackbar.make(view!!, text!!, Snackbar.LENGTH_LONG) - snackbar.setAction(buttonText, listener) - snackbar.show() - } - - fun show(view: View?, res: Int) { - show(view, MifosSelfServiceApp.context?.resources?.getString(res)) - } -} diff --git a/androidApp/src/main/java/org/mifos/mobile/utils/fcm/MifosFirebaseMessagingService.kt b/androidApp/src/main/java/org/mifos/mobile/utils/fcm/MifosFirebaseMessagingService.kt deleted file mode 100644 index 39523e0cc..000000000 --- a/androidApp/src/main/java/org/mifos/mobile/utils/fcm/MifosFirebaseMessagingService.kt +++ /dev/null @@ -1,94 +0,0 @@ -/** - * Copyright 2015 Google Inc. All Rights Reserved. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.mifos.mobile.utils.fcm - -import android.app.NotificationManager -import android.app.PendingIntent -import android.content.Context -import android.content.Intent -import android.media.RingtoneManager -import android.util.Log -import androidx.core.app.NotificationCompat -import androidx.localbroadcastmanager.content.LocalBroadcastManager -import com.google.firebase.messaging.FirebaseMessagingService -import com.google.firebase.messaging.RemoteMessage -import org.mifos.mobile.R -import org.mifos.mobile.ui.activities.HomeActivity - -class MifosFirebaseMessagingService : FirebaseMessagingService() { - // [START receive_message] - override fun onMessageReceived(remoteMessage: RemoteMessage) { - val from = remoteMessage.from - val data = remoteMessage.data - val message = data[getString(R.string.message)] - if ((from?.startsWith("/topics/") == true)) { - // message received from some topic. - } else { - // normal downstream message. - } - sendNotification(message) - val registrationComplete = Intent(org.mifos.mobile.core.common.Constants.NOTIFY_HOME_FRAGMENT) - LocalBroadcastManager.getInstance(this).sendBroadcast(registrationComplete) - } - // [END receive_message] - /** - * Create and show a simple notification containing the received FCM message. - * - * @param message FCM message received. - */ - private fun sendNotification(message: String?) { - val intent = Intent(this, HomeActivity::class.java) - intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP) - intent.putExtra(getString(R.string.notification), true) - val pendingIntent = PendingIntent.getActivity( - this, - 0 /* Request code */, - intent, - PendingIntent.FLAG_ONE_SHOT, - ) - val defaultSoundUri = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION) - val notificationBuilder = NotificationCompat.Builder(this) - .setSmallIcon(R.mipmap.core_common_mifos_icon) - .setContentTitle(getString(R.string.feature_about_app_name)) - .setContentText(message) - .setAutoCancel(true) - .setSound(defaultSoundUri) - .setContentIntent(pendingIntent) - val notificationManager = - getSystemService(Context.NOTIFICATION_SERVICE) as NotificationManager - val notification = org.mifos.mobile.core.datastore.model.MifosNotification() - notification.msg = message - notification.timeStamp = System.currentTimeMillis() - notification.setRead(false) - notificationManager.notify(0, notificationBuilder.build()) - } - - /** - * Called if InstanceID token is updated. This may occur if the security of - * the previous token had been compromised. Note that this is called when the InstanceID token - * is initially generated so this is where you would retrieve the token. - */ - override fun onNewToken(s: String) { - super.onNewToken(s) - Log.d(TAG, "Refreshed token: $s") - val intent = Intent(this, RegistrationIntentService::class.java) - startService(intent) - } - - companion object { - private val TAG = MifosFirebaseMessagingService::class.java.simpleName - } -} diff --git a/androidApp/src/main/java/org/mifos/mobile/utils/fcm/RegistrationIntentService.kt b/androidApp/src/main/java/org/mifos/mobile/utils/fcm/RegistrationIntentService.kt deleted file mode 100644 index 2b8a689b2..000000000 --- a/androidApp/src/main/java/org/mifos/mobile/utils/fcm/RegistrationIntentService.kt +++ /dev/null @@ -1,51 +0,0 @@ -/** - * Copyright 2015 Google Inc. All Rights Reserved. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.mifos.mobile.utils.fcm - -import android.app.IntentService -import android.content.Intent -import android.util.Log -import androidx.localbroadcastmanager.content.LocalBroadcastManager -import com.google.android.gms.tasks.OnCompleteListener -import com.google.firebase.messaging.FirebaseMessaging - -class RegistrationIntentService : IntentService(TAG) { - override fun onHandleIntent(intent: Intent?) { - FirebaseMessaging.getInstance().token - .addOnCompleteListener( - OnCompleteListener { task -> - if (!task.isSuccessful) { - Log.w(TAG, "getInstanceId failed", task.exception) - return@OnCompleteListener - } - - // Get new Instance ID token - val token = task.result - sendRegistrationToServer(token) - }, - ) - } - - private fun sendRegistrationToServer(token: String?) { - val registrationComplete = Intent(org.mifos.mobile.core.common.Constants.REGISTER_ON_SERVER) - registrationComplete.putExtra(org.mifos.mobile.core.common.Constants.TOKEN, token) - LocalBroadcastManager.getInstance(this).sendBroadcast(registrationComplete) - } - - companion object { - private const val TAG = "RegIntentService" - } -} diff --git a/androidApp/src/main/kotlin/org/mifos/mobile/HomeActivity.kt b/androidApp/src/main/kotlin/org/mifos/mobile/HomeActivity.kt new file mode 100644 index 000000000..7ced2b270 --- /dev/null +++ b/androidApp/src/main/kotlin/org/mifos/mobile/HomeActivity.kt @@ -0,0 +1,105 @@ +/* + * Copyright 2024 Mifos Initiative + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at https://mozilla.org/MPL/2.0/. + * + * See https://github.com/openMF/mobile-mobile/blob/master/LICENSE.md + */ +package org.mifos.mobile + +import android.os.Bundle +import androidx.activity.ComponentActivity +import androidx.activity.compose.setContent +import androidx.activity.enableEdgeToEdge +import androidx.activity.viewModels +import androidx.compose.runtime.CompositionLocalProvider +import androidx.compose.runtime.getValue +import androidx.compose.runtime.mutableStateOf +import androidx.compose.runtime.setValue +import androidx.core.splashscreen.SplashScreen.Companion.installSplashScreen +import androidx.lifecycle.Lifecycle +import androidx.lifecycle.lifecycleScope +import androidx.lifecycle.repeatOnLifecycle +import androidx.navigation.compose.rememberNavController +import dagger.hilt.android.AndroidEntryPoint +import kotlinx.coroutines.flow.collect +import kotlinx.coroutines.flow.onEach +import kotlinx.coroutines.launch +import org.mifos.mobile.HomeActivityUiState.Success +import org.mifos.mobile.core.data.utils.NetworkMonitor +import org.mifos.mobile.core.designsystem.theme.MifosMobileTheme +import org.mifos.mobile.navigation.MifosNavGraph.AUTH_GRAPH +import org.mifos.mobile.navigation.MifosNavGraph.PASSCODE_GRAPH +import org.mifos.mobile.navigation.RootNavGraph +import org.mifos.mobile.ui.rememberMifosMobileState +import javax.inject.Inject + +@AndroidEntryPoint +class HomeActivity : ComponentActivity() { + + @Inject + lateinit var networkMonitor: NetworkMonitor + + private val viewModel: HomeActivityViewModel by viewModels() + + override fun onCreate(savedInstanceState: Bundle?) { + val splashScreen = installSplashScreen() + super.onCreate(savedInstanceState) + + var uiState: HomeActivityUiState by mutableStateOf(HomeActivityUiState.Loading) + + // Update the uiState + lifecycleScope.launch { + lifecycle.repeatOnLifecycle(Lifecycle.State.STARTED) { + viewModel.uiState + .onEach { uiState = it } + .collect() + } + } + + splashScreen.setKeepOnScreenCondition { + when (uiState) { + HomeActivityUiState.Loading -> true + is Success -> false + } + } + + enableEdgeToEdge() + + setContent { + val navController = rememberNavController() + + val appState = rememberMifosMobileState(networkMonitor = networkMonitor) + + val navDestination = when (uiState) { + is Success -> if ((uiState as Success).userData.isAuthenticated) { + PASSCODE_GRAPH + } else { + AUTH_GRAPH + } + + else -> AUTH_GRAPH + } + + CompositionLocalProvider { + MifosMobileTheme { + RootNavGraph( + appState = appState, + navHostController = navController, + startDestination = navDestination, + onClickLogout = { + viewModel.logOut() + navController.navigate(AUTH_GRAPH) { + popUpTo(navController.graph.id) { + inclusive = true + } + } + }, + ) + } + } + } + } +} diff --git a/androidApp/src/main/kotlin/org/mifos/mobile/HomeActivityViewModel.kt b/androidApp/src/main/kotlin/org/mifos/mobile/HomeActivityViewModel.kt new file mode 100644 index 000000000..fdfc7e533 --- /dev/null +++ b/androidApp/src/main/kotlin/org/mifos/mobile/HomeActivityViewModel.kt @@ -0,0 +1,50 @@ +/* + * Copyright 2024 Mifos Initiative + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at https://mozilla.org/MPL/2.0/. + * + * See https://github.com/openMF/mobile-mobile/blob/master/LICENSE.md + */ +package org.mifos.mobile + +import androidx.lifecycle.ViewModel +import androidx.lifecycle.viewModelScope +import dagger.hilt.android.lifecycle.HiltViewModel +import kotlinx.coroutines.flow.SharingStarted +import kotlinx.coroutines.flow.StateFlow +import kotlinx.coroutines.flow.map +import kotlinx.coroutines.flow.stateIn +import kotlinx.coroutines.launch +import org.mifos.library.passcode.data.PasscodeManager +import org.mifos.mobile.core.data.repository.UserDataRepository +import org.mifos.mobile.core.model.UserData +import javax.inject.Inject + +@HiltViewModel +class HomeActivityViewModel @Inject constructor( + private val userDataRepository: UserDataRepository, + private val passcodeManager: PasscodeManager, +) : ViewModel() { + + val uiState: StateFlow = userDataRepository.userData.map { + HomeActivityUiState.Success(it) + }.stateIn( + scope = viewModelScope, + initialValue = HomeActivityUiState.Loading, + started = SharingStarted.WhileSubscribed(5_000), + ) + + fun logOut() { + viewModelScope.launch { + userDataRepository.logOut() + passcodeManager.clearPasscode() + } + } +} + +sealed interface HomeActivityUiState { + data object Loading : HomeActivityUiState + data class Success(val userData: UserData) : HomeActivityUiState +} diff --git a/androidApp/src/main/kotlin/org/mifos/mobile/MifosSelfServiceApp.kt b/androidApp/src/main/kotlin/org/mifos/mobile/MifosSelfServiceApp.kt new file mode 100644 index 000000000..cf4270510 --- /dev/null +++ b/androidApp/src/main/kotlin/org/mifos/mobile/MifosSelfServiceApp.kt @@ -0,0 +1,27 @@ +/* + * Copyright 2024 Mifos Initiative + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at https://mozilla.org/MPL/2.0/. + * + * See https://github.com/openMF/mobile-mobile/blob/master/LICENSE.md + */ +package org.mifos.mobile + +import androidx.multidex.MultiDex +import androidx.multidex.MultiDexApplication +import com.google.firebase.crashlytics.FirebaseCrashlytics +import dagger.hilt.android.HiltAndroidApp +import org.mifos.mobile.core.datastore.PreferencesHelper +import org.mifos.mobile.feature.settings.applySavedTheme + +@HiltAndroidApp +class MifosSelfServiceApp : MultiDexApplication() { + override fun onCreate() { + super.onCreate() + MultiDex.install(this) + FirebaseCrashlytics.getInstance().setCrashlyticsCollectionEnabled(true) + PreferencesHelper(this).applySavedTheme() + } +} diff --git a/androidApp/src/main/kotlin/org/mifos/mobile/navigation/MifosNavGraph.kt b/androidApp/src/main/kotlin/org/mifos/mobile/navigation/MifosNavGraph.kt new file mode 100644 index 000000000..b20112e4b --- /dev/null +++ b/androidApp/src/main/kotlin/org/mifos/mobile/navigation/MifosNavGraph.kt @@ -0,0 +1,17 @@ +/* + * Copyright 2024 Mifos Initiative + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at https://mozilla.org/MPL/2.0/. + * + * See https://github.com/openMF/mobile-mobile/blob/master/LICENSE.md + */ +package org.mifos.mobile.navigation + +internal object MifosNavGraph { + const val ROOT_GRAPH = "root_graph" + const val AUTH_GRAPH = "auth_graph" + const val PASSCODE_GRAPH = "passcode_graph" + const val MAIN_GRAPH = "main_graph" +} diff --git a/androidApp/src/main/java/org/mifos/mobile/navigation/MifosNavGraph.kt b/androidApp/src/main/kotlin/org/mifos/mobile/navigation/MifosNavHost.kt similarity index 76% rename from androidApp/src/main/java/org/mifos/mobile/navigation/MifosNavGraph.kt rename to androidApp/src/main/kotlin/org/mifos/mobile/navigation/MifosNavHost.kt index 07f743199..e161cd448 100644 --- a/androidApp/src/main/java/org/mifos/mobile/navigation/MifosNavGraph.kt +++ b/androidApp/src/main/kotlin/org/mifos/mobile/navigation/MifosNavHost.kt @@ -1,3 +1,12 @@ +/* + * Copyright 2024 Mifos Initiative + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at https://mozilla.org/MPL/2.0/. + * + * See https://github.com/openMF/mobile-mobile/blob/master/LICENSE.md + */ package org.mifos.mobile.navigation import android.app.Activity @@ -7,16 +16,14 @@ import android.net.Uri import android.provider.Settings import android.widget.Toast import androidx.compose.runtime.Composable +import androidx.compose.ui.Modifier import androidx.compose.ui.platform.LocalContext -import androidx.navigation.NavController import androidx.navigation.NavHostController -import androidx.navigation.NavOptions import androidx.navigation.compose.NavHost -import androidx.navigation.compose.composable +import androidx.navigation.compose.rememberNavController import com.google.android.gms.oss.licenses.OssLicensesMenuActivity -import com.mifos.compose.component.PasscodeScreen +import org.mifos.mobile.HomeActivity import org.mifos.mobile.R -import org.mifos.mobile.core.common.Constants.INTIAL_LOGIN import org.mifos.mobile.core.common.Constants.TRANSFER_PAY_TO import org.mifos.mobile.core.model.enums.AccountType import org.mifos.mobile.core.model.enums.ChargeType @@ -24,7 +31,6 @@ import org.mifos.mobile.feature.about.navigation.aboutUsNavGraph import org.mifos.mobile.feature.about.navigation.navigateToAboutUsScreen import org.mifos.mobile.feature.account.navigation.clientAccountsNavGraph import org.mifos.mobile.feature.account.navigation.navigateToClientAccountsScreen -import org.mifos.mobile.feature.auth.navigation.authenticationNavGraph import org.mifos.mobile.feature.auth.navigation.navigateToLoginScreen import org.mifos.mobile.feature.beneficiary.navigation.beneficiaryNavGraph import org.mifos.mobile.feature.beneficiary.navigation.navigateToAddBeneficiaryScreen @@ -37,8 +43,8 @@ import org.mifos.mobile.feature.guarantor.navigation.navigateToGuarantorScreen import org.mifos.mobile.feature.help.navigation.helpNavGraph import org.mifos.mobile.feature.help.navigation.navigateToHelpScreen import org.mifos.mobile.feature.home.navigation.HomeDestinations +import org.mifos.mobile.feature.home.navigation.HomeNavigation import org.mifos.mobile.feature.home.navigation.homeNavGraph -import org.mifos.mobile.feature.home.navigation.navigateToHomeScreen import org.mifos.mobile.feature.loan.navigation.loanNavGraph import org.mifos.mobile.feature.loan.navigation.navigateToLoanApplication import org.mifos.mobile.feature.loan.navigation.navigateToLoanDetailScreen @@ -62,51 +68,44 @@ import org.mifos.mobile.feature.transaction.navigation.navigateToRecentTransacti import org.mifos.mobile.feature.transaction.navigation.recentTransactionNavGraph import org.mifos.mobile.feature.transfer.process.navigation.navigateToTransferProcessScreen import org.mifos.mobile.feature.transfer.process.navigation.transferProcessNavGraph -import org.mifos.mobile.feature.update_password.navigation.navigateToUpdatePassword -import org.mifos.mobile.feature.update_password.navigation.updatePasswordNavGraph +import org.mifos.mobile.feature.update.password.navigation.navigateToUpdatePassword +import org.mifos.mobile.feature.update.password.navigation.updatePasswordNavGraph import org.mifos.mobile.feature.user.profile.navigation.navigateToUserProfile import org.mifos.mobile.feature.user.profile.navigation.userProfileNavGraph -import org.mifos.mobile.ui.activities.HomeActivity -import org.mifos.mobile.ui.activities.PassCodeActivity - @Composable -fun RootNavGraph( - startDestination: String, - navController: NavHostController, +fun MifosNavHost( + onClickLogout: () -> Unit, + modifier: Modifier = Modifier, ) { val context = LocalContext.current + val navController = rememberNavController() NavHost( navController = navController, - startDestination = startDestination, + route = MifosNavGraph.MAIN_GRAPH, + startDestination = HomeNavigation.HomeBase.route, + modifier = modifier, ) { homeNavGraph( - onNavigate = { handleHomeNavigation(navController, it, context) }, + onNavigate = { handleHomeNavigation(navController, it, onClickLogout, context) }, callHelpline = { callHelpline(context) }, - mailHelpline = { mailHelpline(context) } + mailHelpline = { mailHelpline(context) }, ) - authenticationNavGraph( - navController = navController, - navigateToPasscodeScreen = { startPassCodeActivity(context = context) } - ) - - guarantorNavGraph( - navController = navController, - ) + guarantorNavGraph(navController = navController) loanNavGraph( navController = navController, viewQr = navController::navigateToQrDisplayScreen, viewGuarantor = navController::navigateToGuarantorScreen, viewCharges = navController::navigateToClientChargeScreen, - makePayment = navController::navigateToSavingsMakeTransfer + makePayment = navController::navigateToSavingsMakeTransfer, ) userProfileNavGraph( navigateBack = navController::popBackStack, - navigateToChangePassword = navController::navigateToUpdatePassword + navigateToChangePassword = navController::navigateToUpdatePassword, ) updatePasswordNavGraph(navigateBack = navController::popBackStack) @@ -114,24 +113,20 @@ fun RootNavGraph( thirdPartyTransferNavGraph( navigateBack = navController::popBackStack, addBeneficiary = navController::navigateToAddBeneficiaryScreen, - reviewTransfer = navController::navigateToTransferProcessScreen + reviewTransfer = navController::navigateToTransferProcessScreen, ) settingsNavGraph( navigateBack = navController::popBackStack, changePassword = navController::navigateToUpdatePassword, - changePasscode = {}, // { navigateToUpdatePasscodeActivity(it, context) }, + changePasscode = {}, navigateToLoginScreen = navController::navigateToLoginScreen, - languageChanged = { startActivity(context, HomeActivity::class.java) } + languageChanged = { startActivity(context, HomeActivity::class.java) }, ) - recentTransactionNavGraph( - navigateBack = navController::popBackStack - ) + recentTransactionNavGraph(navigateBack = navController::popBackStack) - notificationNavGraph( - navigateBack = navController::popBackStack - ) + notificationNavGraph(navigateBack = navController::popBackStack) locationsNavGraph() @@ -139,16 +134,16 @@ fun RootNavGraph( findLocations = navController::navigateToLocationsScreen, navigateBack = navController::popBackStack, callHelpline = { callHelpline(context) }, - mailHelpline = { mailHelpline(context) } + mailHelpline = { mailHelpline(context) }, ) - clientChargeNavGraph( - navigateBack = navController::popBackStack - ) + clientChargeNavGraph(navigateBack = navController::popBackStack) aboutUsNavGraph( navController = navController, - navigateToOssLicense = { startActivity(context, OssLicensesMenuActivity::class.java) } + navigateToOssLicense = { + context.startActivity(Intent(context, OssLicensesMenuActivity::class.java)) + }, ) transferProcessNavGraph(navigateBack = navController::popBackStack) @@ -156,7 +151,7 @@ fun RootNavGraph( beneficiaryNavGraph( navController = navController, openQrImportScreen = navController::navigateToQrImportScreen, - openQrReaderScreen = navController::navigateToQrReaderScreen + openQrReaderScreen = navController::navigateToQrReaderScreen, ) qrNavGraph( @@ -169,7 +164,7 @@ fun RootNavGraph( viewCharges = navController::navigateToClientChargeScreen, viewQrCode = navController::navigateToQrDisplayScreen, callHelpline = { callHelpline(context) }, - reviewTransfer = navController::navigateToTransferProcessScreen + reviewTransfer = navController::navigateToTransferProcessScreen, ) clientAccountsNavGraph( @@ -182,38 +177,28 @@ fun RootNavGraph( AccountType.LOAN -> navController.navigateToLoanDetailScreen(loanId = id) AccountType.SHARE -> {} } - } + }, ) - - composable(PASSCODE_SCREEN) { - PasscodeScreen( - onForgotButton = navController::navigateToHomeScreen, - onSkipButton = navController::navigateToHomeScreen, - onPasscodeConfirm = { - navController.navigateToHomeScreen() - }, - onPasscodeRejected = {} - ) - } } } -const val PASSCODE_SCREEN = "passcode_screen" - -fun NavController.navigateToPasscodeScreen(navOptions: NavOptions? = null) { - return this.navigate(PASSCODE_SCREEN, navOptions) -} - fun handleHomeNavigation( navController: NavHostController, homeDestinations: HomeDestinations, - context: Context + onClickLogout: () -> Unit, + context: Context, ) { when (homeDestinations) { HomeDestinations.HOME -> Unit HomeDestinations.ACCOUNTS -> navController.navigateToClientAccountsScreen() - HomeDestinations.LOAN_ACCOUNT -> navController.navigateToClientAccountsScreen(accountType = AccountType.LOAN) - HomeDestinations.SAVINGS_ACCOUNT -> navController.navigateToClientAccountsScreen(accountType = AccountType.SAVINGS) + HomeDestinations.LOAN_ACCOUNT -> { + navController.navigateToClientAccountsScreen(accountType = AccountType.LOAN) + } + + HomeDestinations.SAVINGS_ACCOUNT -> { + navController.navigateToClientAccountsScreen(accountType = AccountType.SAVINGS) + } + HomeDestinations.RECENT_TRANSACTIONS -> navController.navigateToRecentTransaction() HomeDestinations.CHARGES -> navController.navigateToClientChargeScreen(ChargeType.CLIENT) HomeDestinations.THIRD_PARTY_TRANSFER -> navController.navigateToThirdPartyTransfer() @@ -228,10 +213,10 @@ fun handleHomeNavigation( openAppInfo(context) } - HomeDestinations.LOGOUT -> navController.navigateToLoginScreen() + HomeDestinations.LOGOUT -> onClickLogout.invoke() HomeDestinations.TRANSFER -> navController.navigateToSavingsMakeTransfer( accountId = 1, - transferType = TRANSFER_PAY_TO + transferType = TRANSFER_PAY_TO, ) HomeDestinations.BENEFICIARIES -> navController.navigateToBeneficiaryListScreen() @@ -245,20 +230,6 @@ fun startActivity(context: Context, clazz: Class) { context.startActivity(Intent(context, clazz)) } -private fun startPassCodeActivity(context: Context) { - val intent = Intent(context, PassCodeActivity::class.java) - intent.putExtra(INTIAL_LOGIN, true) - context.startActivity(intent) -} -// -//private fun navigateToUpdatePasscodeActivity(passcode: String, context: Context) { -// val intent = Intent(context, PassCodeActivity::class.java).apply { -// putExtra(CURR_PASSWORD, passcode) -// putExtra(IS_TO_UPDATE_PASS_CODE, true)s -// } -// context.startActivity(intent)ss -//} - private fun callHelpline(context: Context) { val intent = Intent(Intent.ACTION_DIAL) intent.data = @@ -271,11 +242,11 @@ private fun mailHelpline(context: Context) { data = Uri.parse("mailto:") putExtra( Intent.EXTRA_EMAIL, - arrayOf(context.getString(org.mifos.mobile.feature.home.R.string.contact_email)) + arrayOf(context.getString(org.mifos.mobile.feature.home.R.string.contact_email)), ) putExtra( Intent.EXTRA_SUBJECT, - context.getString(org.mifos.mobile.feature.home.R.string.user_query) + context.getString(org.mifos.mobile.feature.home.R.string.user_query), ) } try { diff --git a/androidApp/src/main/kotlin/org/mifos/mobile/navigation/PasscodeNavGraph.kt b/androidApp/src/main/kotlin/org/mifos/mobile/navigation/PasscodeNavGraph.kt new file mode 100644 index 000000000..b9be8e693 --- /dev/null +++ b/androidApp/src/main/kotlin/org/mifos/mobile/navigation/PasscodeNavGraph.kt @@ -0,0 +1,42 @@ +/* + * Copyright 2024 Mifos Initiative + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at https://mozilla.org/MPL/2.0/. + * + * See https://github.com/openMF/mobile-mobile/blob/master/LICENSE.md + */ +package org.mifos.mobile.navigation + +import androidx.navigation.NavGraphBuilder +import androidx.navigation.NavHostController +import androidx.navigation.navigation +import org.mifos.library.passcode.PASSCODE_SCREEN +import org.mifos.library.passcode.passcodeRoute + +internal fun NavGraphBuilder.passcodeNavGraph(navController: NavHostController) { + navigation( + route = MifosNavGraph.PASSCODE_GRAPH, + startDestination = PASSCODE_SCREEN, + ) { + passcodeRoute( + onForgotButton = { + navController.popBackStack() + navController.navigate(MifosNavGraph.MAIN_GRAPH) + }, + onSkipButton = { + navController.popBackStack() + navController.navigate(MifosNavGraph.MAIN_GRAPH) + }, + onPasscodeConfirm = { + navController.popBackStack() + navController.navigate(MifosNavGraph.MAIN_GRAPH) + }, + onPasscodeRejected = { + navController.popBackStack() + navController.navigate(MifosNavGraph.MAIN_GRAPH) + }, + ) + } +} diff --git a/androidApp/src/main/kotlin/org/mifos/mobile/navigation/RootNavGraph.kt b/androidApp/src/main/kotlin/org/mifos/mobile/navigation/RootNavGraph.kt new file mode 100644 index 000000000..cc8d007da --- /dev/null +++ b/androidApp/src/main/kotlin/org/mifos/mobile/navigation/RootNavGraph.kt @@ -0,0 +1,52 @@ +/* + * Copyright 2024 Mifos Initiative + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at https://mozilla.org/MPL/2.0/. + * + * See https://github.com/openMF/mobile-mobile/blob/master/LICENSE.md + */ +package org.mifos.mobile.navigation + +import androidx.compose.runtime.Composable +import androidx.compose.ui.Modifier +import androidx.navigation.NavHostController +import androidx.navigation.compose.NavHost +import androidx.navigation.compose.composable +import org.mifos.library.passcode.navigateToPasscodeScreen +import org.mifos.mobile.feature.auth.navigation.authenticationNavGraph +import org.mifos.mobile.navigation.MifosNavGraph.AUTH_GRAPH +import org.mifos.mobile.ui.MifosApp +import org.mifos.mobile.ui.MifosMobileState + +@Composable +internal fun RootNavGraph( + appState: MifosMobileState, + navHostController: NavHostController, + startDestination: String, + onClickLogout: () -> Unit, + modifier: Modifier = Modifier, +) { + NavHost( + navController = navHostController, + startDestination = startDestination, + route = MifosNavGraph.ROOT_GRAPH, + modifier = modifier, + ) { + authenticationNavGraph( + navController = navHostController, + route = AUTH_GRAPH, + navigateToPasscodeScreen = navHostController::navigateToPasscodeScreen, + ) + + passcodeNavGraph(navHostController) + + composable(MifosNavGraph.MAIN_GRAPH) { + MifosApp( + appState = appState, + onClickLogout = onClickLogout, + ) + } + } +} diff --git a/androidApp/src/main/kotlin/org/mifos/mobile/ui/MifosApp.kt b/androidApp/src/main/kotlin/org/mifos/mobile/ui/MifosApp.kt new file mode 100644 index 000000000..c8a46c215 --- /dev/null +++ b/androidApp/src/main/kotlin/org/mifos/mobile/ui/MifosApp.kt @@ -0,0 +1,90 @@ +/* + * Copyright 2024 Mifos Initiative + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at https://mozilla.org/MPL/2.0/. + * + * See https://github.com/openMF/mobile-mobile/blob/master/LICENSE.md + */ +package org.mifos.mobile.ui + +import androidx.compose.foundation.layout.Box +import androidx.compose.foundation.layout.WindowInsets +import androidx.compose.foundation.layout.WindowInsetsSides +import androidx.compose.foundation.layout.consumeWindowInsets +import androidx.compose.foundation.layout.fillMaxSize +import androidx.compose.foundation.layout.only +import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.layout.safeDrawing +import androidx.compose.foundation.layout.windowInsetsPadding +import androidx.compose.material3.MaterialTheme +import androidx.compose.material3.Scaffold +import androidx.compose.material3.SnackbarDuration.Indefinite +import androidx.compose.material3.SnackbarHost +import androidx.compose.material3.SnackbarHostState +import androidx.compose.runtime.Composable +import androidx.compose.runtime.LaunchedEffect +import androidx.compose.runtime.getValue +import androidx.compose.runtime.remember +import androidx.compose.ui.ExperimentalComposeUiApi +import androidx.compose.ui.Modifier +import androidx.compose.ui.graphics.Color +import androidx.compose.ui.res.stringResource +import androidx.compose.ui.semantics.semantics +import androidx.compose.ui.semantics.testTagsAsResourceId +import androidx.lifecycle.compose.collectAsStateWithLifecycle +import org.mifos.mobile.R +import org.mifos.mobile.core.designsystem.theme.MifosBackground +import org.mifos.mobile.navigation.MifosNavHost + +@OptIn(ExperimentalComposeUiApi::class) +@Composable +fun MifosApp( + appState: MifosMobileState, + onClickLogout: () -> Unit, + modifier: Modifier = Modifier, +) { + MifosBackground(modifier) { + val snackbarHostState = remember { SnackbarHostState() } + + val isOffline by appState.isOffline.collectAsStateWithLifecycle() + + // If user is not connected to the internet show a snack bar to inform them. + val notConnectedMessage = stringResource(R.string.not_connected) + LaunchedEffect(isOffline) { + if (isOffline) { + snackbarHostState.showSnackbar( + message = notConnectedMessage, + duration = Indefinite, + ) + } + } + + Scaffold( + modifier = Modifier.semantics { + testTagsAsResourceId = true + }, + containerColor = Color.Transparent, + contentColor = MaterialTheme.colorScheme.onBackground, + snackbarHost = { SnackbarHost(snackbarHostState) }, + ) { padding -> + Box( + modifier = Modifier + .fillMaxSize() + .padding(padding) + .consumeWindowInsets(padding) + .windowInsetsPadding( + WindowInsets.safeDrawing.only( + WindowInsetsSides.Horizontal, + ), + ), + ) { + MifosNavHost( + onClickLogout = onClickLogout, + modifier = Modifier, + ) + } + } + } +} diff --git a/androidApp/src/main/kotlin/org/mifos/mobile/ui/MifosMobileState.kt b/androidApp/src/main/kotlin/org/mifos/mobile/ui/MifosMobileState.kt new file mode 100644 index 000000000..b24792113 --- /dev/null +++ b/androidApp/src/main/kotlin/org/mifos/mobile/ui/MifosMobileState.kt @@ -0,0 +1,62 @@ +/* + * Copyright 2024 Mifos Initiative + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at https://mozilla.org/MPL/2.0/. + * + * See https://github.com/openMF/mobile-mobile/blob/master/LICENSE.md + */ +package org.mifos.mobile.ui + +import androidx.compose.runtime.Composable +import androidx.compose.runtime.Stable +import androidx.compose.runtime.remember +import androidx.compose.runtime.rememberCoroutineScope +import androidx.navigation.NavDestination +import androidx.navigation.NavHostController +import androidx.navigation.compose.currentBackStackEntryAsState +import androidx.navigation.compose.rememberNavController +import kotlinx.coroutines.CoroutineScope +import kotlinx.coroutines.flow.SharingStarted +import kotlinx.coroutines.flow.map +import kotlinx.coroutines.flow.stateIn +import org.mifos.mobile.core.data.utils.NetworkMonitor + +@Composable +fun rememberMifosMobileState( + networkMonitor: NetworkMonitor, + coroutineScope: CoroutineScope = rememberCoroutineScope(), + navController: NavHostController = rememberNavController(), +): MifosMobileState { + return remember( + navController, + coroutineScope, + networkMonitor, + ) { + MifosMobileState( + navController = navController, + coroutineScope = coroutineScope, + networkMonitor = networkMonitor, + ) + } +} + +@Stable +class MifosMobileState( + val navController: NavHostController, + coroutineScope: CoroutineScope, + networkMonitor: NetworkMonitor, +) { + val currentDestination: NavDestination? + @Composable get() = navController + .currentBackStackEntryAsState().value?.destination + + val isOffline = networkMonitor.isOnline + .map(Boolean::not) + .stateIn( + scope = coroutineScope, + started = SharingStarted.WhileSubscribed(5_000), + initialValue = false, + ) +} diff --git a/androidApp/src/main/res/anim/check_animation.xml b/androidApp/src/main/res/anim/check_animation.xml deleted file mode 100644 index c566312fa..000000000 --- a/androidApp/src/main/res/anim/check_animation.xml +++ /dev/null @@ -1,20 +0,0 @@ - - - - - - - \ No newline at end of file diff --git a/androidApp/src/main/res/drawable-hdpi/ic_qrcode_scan_gray_dark.xml b/androidApp/src/main/res/drawable-hdpi/ic_qrcode_scan_gray_dark.xml deleted file mode 100644 index d70535a7b..000000000 --- a/androidApp/src/main/res/drawable-hdpi/ic_qrcode_scan_gray_dark.xml +++ /dev/null @@ -1,10 +0,0 @@ - - - diff --git a/androidApp/src/main/res/drawable-nodpi/example_appwidget_preview.png b/androidApp/src/main/res/drawable-nodpi/example_appwidget_preview.png deleted file mode 100644 index 894b069a4907d258f60b1b2406b90f5a0fe1c35b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3522 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 - - - \ No newline at end of file diff --git a/androidApp/src/main/res/drawable-v21/mifos_splash_screen_logo.png b/androidApp/src/main/res/drawable-v21/mifos_splash_screen_logo.png deleted file mode 100644 index c1819abf049293cdbcc247e2f0d1b3b82048aad4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 28028 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 diff --git a/androidApp/src/main/res/drawable/animated_check.xml b/androidApp/src/main/res/drawable/animated_check.xml deleted file mode 100644 index c43401e89..000000000 --- a/androidApp/src/main/res/drawable/animated_check.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - \ No newline at end of file diff --git a/androidApp/src/main/res/drawable/bg_about.png b/androidApp/src/main/res/drawable/bg_about.png deleted file mode 100644 index ae673c4bf4dc96d3bc269d0bd1e9e6f236664f2b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 12047 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 diff --git a/androidApp/src/main/res/drawable/ic_about_us_black_24dp.xml b/androidApp/src/main/res/drawable/ic_about_us_black_24dp.xml deleted file mode 100644 index 6e75dbfc3..000000000 --- a/androidApp/src/main/res/drawable/ic_about_us_black_24dp.xml +++ /dev/null @@ -1,10 +0,0 @@ - - - diff --git a/androidApp/src/main/res/drawable/ic_account_balance_black_24dp.xml b/androidApp/src/main/res/drawable/ic_account_balance_black_24dp.xml deleted file mode 100644 index 4da1d5287..000000000 --- a/androidApp/src/main/res/drawable/ic_account_balance_black_24dp.xml +++ /dev/null @@ -1,9 +0,0 @@ - - - diff --git a/androidApp/src/main/res/drawable/ic_account_balance_wallet_black_24dp.xml b/androidApp/src/main/res/drawable/ic_account_balance_wallet_black_24dp.xml deleted file mode 100644 index fee88542c..000000000 --- a/androidApp/src/main/res/drawable/ic_account_balance_wallet_black_24dp.xml +++ /dev/null @@ -1,9 +0,0 @@ - - - diff --git a/androidApp/src/main/res/drawable/ic_account_balance_wallet_black_background_24dp.xml b/androidApp/src/main/res/drawable/ic_account_balance_wallet_black_background_24dp.xml deleted file mode 100644 index dbd73b85a..000000000 --- a/androidApp/src/main/res/drawable/ic_account_balance_wallet_black_background_24dp.xml +++ /dev/null @@ -1,9 +0,0 @@ - - - \ No newline at end of file diff --git a/androidApp/src/main/res/drawable/ic_add_white_24dp.xml b/androidApp/src/main/res/drawable/ic_add_white_24dp.xml deleted file mode 100644 index d29480261..000000000 --- a/androidApp/src/main/res/drawable/ic_add_white_24dp.xml +++ /dev/null @@ -1,9 +0,0 @@ - - - diff --git a/androidApp/src/main/res/drawable/ic_arrow_drop_down.xml b/androidApp/src/main/res/drawable/ic_arrow_drop_down.xml deleted file mode 100644 index e51044cc7..000000000 --- a/androidApp/src/main/res/drawable/ic_arrow_drop_down.xml +++ /dev/null @@ -1,10 +0,0 @@ - - - diff --git a/androidApp/src/main/res/drawable/ic_arrow_up.xml b/androidApp/src/main/res/drawable/ic_arrow_up.xml deleted file mode 100644 index 7d4b75ca4..000000000 --- a/androidApp/src/main/res/drawable/ic_arrow_up.xml +++ /dev/null @@ -1,5 +0,0 @@ - - \ No newline at end of file diff --git a/androidApp/src/main/res/drawable/ic_assignment_turned_in_black_24dp.xml b/androidApp/src/main/res/drawable/ic_assignment_turned_in_black_24dp.xml deleted file mode 100644 index 7aeaab097..000000000 --- a/androidApp/src/main/res/drawable/ic_assignment_turned_in_black_24dp.xml +++ /dev/null @@ -1,10 +0,0 @@ - - - diff --git a/androidApp/src/main/res/drawable/ic_attach_money_black_24dp.xml b/androidApp/src/main/res/drawable/ic_attach_money_black_24dp.xml deleted file mode 100644 index be66a221e..000000000 --- a/androidApp/src/main/res/drawable/ic_attach_money_black_24dp.xml +++ /dev/null @@ -1,9 +0,0 @@ - - - diff --git a/androidApp/src/main/res/drawable/ic_backspace_48px.xml b/androidApp/src/main/res/drawable/ic_backspace_48px.xml deleted file mode 100644 index 7e1e137f1..000000000 --- a/androidApp/src/main/res/drawable/ic_backspace_48px.xml +++ /dev/null @@ -1,9 +0,0 @@ - - - diff --git a/androidApp/src/main/res/drawable/ic_baseline_arrow_back_24.xml b/androidApp/src/main/res/drawable/ic_baseline_arrow_back_24.xml deleted file mode 100644 index cd06f3098..000000000 --- a/androidApp/src/main/res/drawable/ic_baseline_arrow_back_24.xml +++ /dev/null @@ -1,11 +0,0 @@ - - - diff --git a/androidApp/src/main/res/drawable/ic_baseline_cloud_off_24.xml b/androidApp/src/main/res/drawable/ic_baseline_cloud_off_24.xml deleted file mode 100644 index 5207b48a9..000000000 --- a/androidApp/src/main/res/drawable/ic_baseline_cloud_off_24.xml +++ /dev/null @@ -1,10 +0,0 @@ - - - diff --git a/androidApp/src/main/res/drawable/ic_baseline_dark_mode_24.xml b/androidApp/src/main/res/drawable/ic_baseline_dark_mode_24.xml deleted file mode 100644 index e52c5baff..000000000 --- a/androidApp/src/main/res/drawable/ic_baseline_dark_mode_24.xml +++ /dev/null @@ -1,10 +0,0 @@ - - - diff --git a/androidApp/src/main/res/drawable/ic_baseline_filter_list_24.xml b/androidApp/src/main/res/drawable/ic_baseline_filter_list_24.xml deleted file mode 100644 index 52d959093..000000000 --- a/androidApp/src/main/res/drawable/ic_baseline_filter_list_24.xml +++ /dev/null @@ -1,10 +0,0 @@ - - - diff --git a/androidApp/src/main/res/drawable/ic_beneficiaries_48px.xml b/androidApp/src/main/res/drawable/ic_beneficiaries_48px.xml deleted file mode 100644 index 1ccd32405..000000000 --- a/androidApp/src/main/res/drawable/ic_beneficiaries_48px.xml +++ /dev/null @@ -1,9 +0,0 @@ - - - diff --git a/androidApp/src/main/res/drawable/ic_beneficiary_add_48px.xml b/androidApp/src/main/res/drawable/ic_beneficiary_add_48px.xml deleted file mode 100644 index 4ef00e2c0..000000000 --- a/androidApp/src/main/res/drawable/ic_beneficiary_add_48px.xml +++ /dev/null @@ -1,10 +0,0 @@ - - - diff --git a/androidApp/src/main/res/drawable/ic_beneficiary_wrapper.xml b/androidApp/src/main/res/drawable/ic_beneficiary_wrapper.xml deleted file mode 100644 index 8436109e0..000000000 --- a/androidApp/src/main/res/drawable/ic_beneficiary_wrapper.xml +++ /dev/null @@ -1,4 +0,0 @@ - - - - \ No newline at end of file diff --git a/androidApp/src/main/res/drawable/ic_border_color_black_24dp.xml b/androidApp/src/main/res/drawable/ic_border_color_black_24dp.xml deleted file mode 100644 index 6821236b8..000000000 --- a/androidApp/src/main/res/drawable/ic_border_color_black_24dp.xml +++ /dev/null @@ -1,13 +0,0 @@ - - - - diff --git a/androidApp/src/main/res/drawable/ic_cake_24dp.xml b/androidApp/src/main/res/drawable/ic_cake_24dp.xml deleted file mode 100644 index 1b1025e7a..000000000 --- a/androidApp/src/main/res/drawable/ic_cake_24dp.xml +++ /dev/null @@ -1,9 +0,0 @@ - - - diff --git a/androidApp/src/main/res/drawable/ic_cake_wrapper.xml b/androidApp/src/main/res/drawable/ic_cake_wrapper.xml deleted file mode 100644 index 11bc4ec9d..000000000 --- a/androidApp/src/main/res/drawable/ic_cake_wrapper.xml +++ /dev/null @@ -1,4 +0,0 @@ - - - - \ No newline at end of file diff --git a/androidApp/src/main/res/drawable/ic_charges.xml b/androidApp/src/main/res/drawable/ic_charges.xml deleted file mode 100644 index dc27ed8af..000000000 --- a/androidApp/src/main/res/drawable/ic_charges.xml +++ /dev/null @@ -1,46 +0,0 @@ - - - - - - - - - - diff --git a/androidApp/src/main/res/drawable/ic_check_circle_green_24px.xml b/androidApp/src/main/res/drawable/ic_check_circle_green_24px.xml deleted file mode 100644 index e9c6a620c..000000000 --- a/androidApp/src/main/res/drawable/ic_check_circle_green_24px.xml +++ /dev/null @@ -1,20 +0,0 @@ - - - - - - - - - \ No newline at end of file diff --git a/androidApp/src/main/res/drawable/ic_clients.png b/androidApp/src/main/res/drawable/ic_clients.png deleted file mode 100644 index 5a39aa03041fd8daadc66eb45ba9c646e67b7d46..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1001 zcmVg1rc{wK}3B}N>G$Eb0@Vz-*jOY{{T_2z7^~? znWRBcg6M;a2-Y8n;BQ6PcKfiRFXFGRU@C>Sxn~(k@n_7P%%skixvz81x!=$Io}A2F z!USD3LAels{okAo919%t$q59l=o2HfWmL_vTrL;R=kx0TY$c+f0L(0^dcn-M0i20M zB0bS)bXZ%hgTShQb#-+u6ha&zqD=s5OXwM4=JQIa{VgpmeGW8hg?bK_PN#on=A!`S zYbgNwiD-{u7*{ppwZc3F>+bGeQYaKI0GO?{`-h-sp-^aJb93_}hj}H#Jq5EYD+NGS zD9(~nnib}Lk>(j#DwS#^q87IZwGo{n%O8|a#DeAIe80(3MUDojiESt?v8XXz?k`n zX`1`o)ELY4WO&%cGMUV3rPM_LlPVPUP6)9f9*^IsFuywEzSxe(0qm$y*a^chc6!l< zo{jr45X-Vw0yqbt!6Dph0Gp+hw;bk;&nuO^OEQ_9c}B9S<+8Lt)Q z*>CLQ-7=ZXa-~!|fHeR_2_*`^bs@yQcszbjORa;Ts(=-zWJCzD1;93DUh(mVCK25M za9SyK)-=t$1HIazRRhyjP^G{CtV#!4wX%U@PL4L4&CVDe9{z!dW)aae01*J;Vh#IN zD$mRV%=|nY4nK*-VlSQ4*NJuQST2{V8yp;53Sb!#{m9G<0n7z3;~S%XOq)IOZK%gY z)W^&Z0o<>zuYVAYMu&6&O2t$R*4f$FP+MEOz4!{XN&`Yyrww}(z=@HOk&~^ht@c}q zOb%M5^HQp#6OQXPR6FKqqUV+&o*Z!mR!y1rMmi>^`b!-5@R6kGw_*Y6< z_K*XxiR#!t0H*k)72ilH=ati<)r#ec`0;rF=0{h)r73VMaLgws5VWFCjL?=bVIBJq X)gc>3?NoX`00000NkvXXu0mjfT%6Ii diff --git a/androidApp/src/main/res/drawable/ic_compare_arrows_black_24dp.xml b/androidApp/src/main/res/drawable/ic_compare_arrows_black_24dp.xml deleted file mode 100644 index a16bbb784..000000000 --- a/androidApp/src/main/res/drawable/ic_compare_arrows_black_24dp.xml +++ /dev/null @@ -1,9 +0,0 @@ - - - diff --git a/androidApp/src/main/res/drawable/ic_edit.xml b/androidApp/src/main/res/drawable/ic_edit.xml deleted file mode 100644 index c66b75b93..000000000 --- a/androidApp/src/main/res/drawable/ic_edit.xml +++ /dev/null @@ -1,13 +0,0 @@ - - - - - - \ No newline at end of file diff --git a/androidApp/src/main/res/drawable/ic_edit_black_24dp.xml b/androidApp/src/main/res/drawable/ic_edit_black_24dp.xml deleted file mode 100644 index dbc718244..000000000 --- a/androidApp/src/main/res/drawable/ic_edit_black_24dp.xml +++ /dev/null @@ -1,9 +0,0 @@ - - - diff --git a/androidApp/src/main/res/drawable/ic_edit_wrapper.xml b/androidApp/src/main/res/drawable/ic_edit_wrapper.xml deleted file mode 100644 index 5f836a0b6..000000000 --- a/androidApp/src/main/res/drawable/ic_edit_wrapper.xml +++ /dev/null @@ -1,4 +0,0 @@ - - - - \ No newline at end of file diff --git a/androidApp/src/main/res/drawable/ic_error_black_24dp.xml b/androidApp/src/main/res/drawable/ic_error_black_24dp.xml deleted file mode 100644 index b666c1818..000000000 --- a/androidApp/src/main/res/drawable/ic_error_black_24dp.xml +++ /dev/null @@ -1,9 +0,0 @@ - - - diff --git a/androidApp/src/main/res/drawable/ic_file_upload_black_24dp.xml b/androidApp/src/main/res/drawable/ic_file_upload_black_24dp.xml deleted file mode 100644 index 7bd6fa147..000000000 --- a/androidApp/src/main/res/drawable/ic_file_upload_black_24dp.xml +++ /dev/null @@ -1,11 +0,0 @@ - - - diff --git a/androidApp/src/main/res/drawable/ic_filter_list_black_24dp.xml b/androidApp/src/main/res/drawable/ic_filter_list_black_24dp.xml deleted file mode 100644 index d47884fbf..000000000 --- a/androidApp/src/main/res/drawable/ic_filter_list_black_24dp.xml +++ /dev/null @@ -1,10 +0,0 @@ - - - \ No newline at end of file diff --git a/androidApp/src/main/res/drawable/ic_flash_off.xml b/androidApp/src/main/res/drawable/ic_flash_off.xml deleted file mode 100644 index ea32cd62e..000000000 --- a/androidApp/src/main/res/drawable/ic_flash_off.xml +++ /dev/null @@ -1,11 +0,0 @@ - - - \ No newline at end of file diff --git a/androidApp/src/main/res/drawable/ic_flash_on.xml b/androidApp/src/main/res/drawable/ic_flash_on.xml deleted file mode 100644 index c7fb081c9..000000000 --- a/androidApp/src/main/res/drawable/ic_flash_on.xml +++ /dev/null @@ -1,11 +0,0 @@ - - - \ No newline at end of file diff --git a/androidApp/src/main/res/drawable/ic_gender_24dp.xml b/androidApp/src/main/res/drawable/ic_gender_24dp.xml deleted file mode 100644 index fb8596be4..000000000 --- a/androidApp/src/main/res/drawable/ic_gender_24dp.xml +++ /dev/null @@ -1,45 +0,0 @@ - - - - - - - - - - - - - - - diff --git a/androidApp/src/main/res/drawable/ic_gender_wrapper.xml b/androidApp/src/main/res/drawable/ic_gender_wrapper.xml deleted file mode 100644 index 670cd3555..000000000 --- a/androidApp/src/main/res/drawable/ic_gender_wrapper.xml +++ /dev/null @@ -1,4 +0,0 @@ - - - - \ No newline at end of file diff --git a/androidApp/src/main/res/drawable/ic_help_black_24dp.xml b/androidApp/src/main/res/drawable/ic_help_black_24dp.xml deleted file mode 100644 index b1d7a2cf5..000000000 --- a/androidApp/src/main/res/drawable/ic_help_black_24dp.xml +++ /dev/null @@ -1,9 +0,0 @@ - - - diff --git a/androidApp/src/main/res/drawable/ic_info_black_24dp.xml b/androidApp/src/main/res/drawable/ic_info_black_24dp.xml deleted file mode 100644 index 0cbb99601..000000000 --- a/androidApp/src/main/res/drawable/ic_info_black_24dp.xml +++ /dev/null @@ -1,9 +0,0 @@ - - - diff --git a/androidApp/src/main/res/drawable/ic_keyboard_arrow_right_black_24dp.xml b/androidApp/src/main/res/drawable/ic_keyboard_arrow_right_black_24dp.xml deleted file mode 100644 index 138fcc3eb..000000000 --- a/androidApp/src/main/res/drawable/ic_keyboard_arrow_right_black_24dp.xml +++ /dev/null @@ -1,9 +0,0 @@ - - - diff --git a/androidApp/src/main/res/drawable/ic_label_black_24dp.xml b/androidApp/src/main/res/drawable/ic_label_black_24dp.xml deleted file mode 100644 index 0e887d432..000000000 --- a/androidApp/src/main/res/drawable/ic_label_black_24dp.xml +++ /dev/null @@ -1,9 +0,0 @@ - - - diff --git a/androidApp/src/main/res/drawable/ic_loan.xml b/androidApp/src/main/res/drawable/ic_loan.xml deleted file mode 100644 index 83555f96a..000000000 --- a/androidApp/src/main/res/drawable/ic_loan.xml +++ /dev/null @@ -1,11 +0,0 @@ - - - diff --git a/androidApp/src/main/res/drawable/ic_local_atm_black_24dp.xml b/androidApp/src/main/res/drawable/ic_local_atm_black_24dp.xml deleted file mode 100644 index 07b27418c..000000000 --- a/androidApp/src/main/res/drawable/ic_local_atm_black_24dp.xml +++ /dev/null @@ -1,10 +0,0 @@ - - - diff --git a/androidApp/src/main/res/drawable/ic_location.xml b/androidApp/src/main/res/drawable/ic_location.xml deleted file mode 100644 index 84e8820d2..000000000 --- a/androidApp/src/main/res/drawable/ic_location.xml +++ /dev/null @@ -1,9 +0,0 @@ - - - diff --git a/androidApp/src/main/res/drawable/ic_location_wrapper.xml b/androidApp/src/main/res/drawable/ic_location_wrapper.xml deleted file mode 100644 index 8e4a381e1..000000000 --- a/androidApp/src/main/res/drawable/ic_location_wrapper.xml +++ /dev/null @@ -1,4 +0,0 @@ - - - - \ No newline at end of file diff --git a/androidApp/src/main/res/drawable/ic_logout.xml b/androidApp/src/main/res/drawable/ic_logout.xml deleted file mode 100644 index a5b54e5c9..000000000 --- a/androidApp/src/main/res/drawable/ic_logout.xml +++ /dev/null @@ -1,10 +0,0 @@ - - - diff --git a/androidApp/src/main/res/drawable/ic_mail.xml b/androidApp/src/main/res/drawable/ic_mail.xml deleted file mode 100644 index 0a291858e..000000000 --- a/androidApp/src/main/res/drawable/ic_mail.xml +++ /dev/null @@ -1,9 +0,0 @@ - - - diff --git a/androidApp/src/main/res/drawable/ic_mail_wrapper.xml b/androidApp/src/main/res/drawable/ic_mail_wrapper.xml deleted file mode 100644 index 0c92f4ae4..000000000 --- a/androidApp/src/main/res/drawable/ic_mail_wrapper.xml +++ /dev/null @@ -1,4 +0,0 @@ - - - - \ No newline at end of file diff --git a/androidApp/src/main/res/drawable/ic_notification_wrapper.xml b/androidApp/src/main/res/drawable/ic_notification_wrapper.xml deleted file mode 100644 index ed08903a3..000000000 --- a/androidApp/src/main/res/drawable/ic_notification_wrapper.xml +++ /dev/null @@ -1,4 +0,0 @@ - - - - \ No newline at end of file diff --git a/androidApp/src/main/res/drawable/ic_person_black_24dp.xml b/androidApp/src/main/res/drawable/ic_person_black_24dp.xml deleted file mode 100644 index 55495d5a0..000000000 --- a/androidApp/src/main/res/drawable/ic_person_black_24dp.xml +++ /dev/null @@ -1,9 +0,0 @@ - - - diff --git a/androidApp/src/main/res/drawable/ic_phone_24dp.xml b/androidApp/src/main/res/drawable/ic_phone_24dp.xml deleted file mode 100644 index b9a9fdf2b..000000000 --- a/androidApp/src/main/res/drawable/ic_phone_24dp.xml +++ /dev/null @@ -1,10 +0,0 @@ - - - diff --git a/androidApp/src/main/res/drawable/ic_phone_wrapper.xml b/androidApp/src/main/res/drawable/ic_phone_wrapper.xml deleted file mode 100644 index a1c9b14e8..000000000 --- a/androidApp/src/main/res/drawable/ic_phone_wrapper.xml +++ /dev/null @@ -1,4 +0,0 @@ - - - - \ No newline at end of file diff --git a/androidApp/src/main/res/drawable/ic_qrcode_scan.xml b/androidApp/src/main/res/drawable/ic_qrcode_scan.xml deleted file mode 100644 index 5b0e12ba0..000000000 --- a/androidApp/src/main/res/drawable/ic_qrcode_scan.xml +++ /dev/null @@ -1,9 +0,0 @@ - - - diff --git a/androidApp/src/main/res/drawable/ic_question_answer_black_24dp.xml b/androidApp/src/main/res/drawable/ic_question_answer_black_24dp.xml deleted file mode 100644 index 4932df431..000000000 --- a/androidApp/src/main/res/drawable/ic_question_answer_black_24dp.xml +++ /dev/null @@ -1,9 +0,0 @@ - - - diff --git a/androidApp/src/main/res/drawable/ic_refresh_black_24dp.xml b/androidApp/src/main/res/drawable/ic_refresh_black_24dp.xml deleted file mode 100644 index 1f9072a36..000000000 --- a/androidApp/src/main/res/drawable/ic_refresh_black_24dp.xml +++ /dev/null @@ -1,9 +0,0 @@ - - - diff --git a/androidApp/src/main/res/drawable/ic_report_problem_red_24px.xml b/androidApp/src/main/res/drawable/ic_report_problem_red_24px.xml deleted file mode 100644 index fa6d437a1..000000000 --- a/androidApp/src/main/res/drawable/ic_report_problem_red_24px.xml +++ /dev/null @@ -1,12 +0,0 @@ - - - - - - \ No newline at end of file diff --git a/androidApp/src/main/res/drawable/ic_search.png b/androidApp/src/main/res/drawable/ic_search.png deleted file mode 100644 index bfa4d4f08e7a72b8c5460de6de1e7af2166d4434..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 855 zcmeAS@N?(olHy`uVBq!ia0vp^1|ZDA1|-9oezpTCmUKs7M+SzC{oH>NS%G}U;vjb? zhIQv;UIIA^$sR$z3=CCj3=9n|3=F@3LJcn%7)pVryh>nTu$sZZAYL$MSD+10f-TA0 z-33Sk!B6Mi^+1ZVz$3C4NPB>>+sSM@1_mYxPZ!6KjC*gVZ}gLP6li;{vy)3mP1fmx ztGf%QhsVLCzfDeZw}dM!>Gocs(eX)O;X)NgAI3^HbuU5AmVhjGuf`+O4{=8<-uw97 zp55(B|Eh{V-uwIc|MIf@au+2ac;yoG)m1@s;&r7p=R0Z7n~n?=a18NQ-?mpLw}xOZJzBnO13b-haX$$WCB7 ze@36x>`cV8&Vs21r`;CwuMw{(ziYF4qqx_fRjFscH@p;*x%^Caulh7+i3^>-Q;+n2 z*rGGl;*;*brAxo`>&=$gXX+cBqi&c?p3{T4H(|8+02Ff~~J zsF67M!wu+EDCO$an1Nnbiz(&s?8NTf5I|%oaUwX<)GWk-Z&n%!(bK z)Js@$MgM=xbdWd6mzAhk{3w}yPT36anWvlAf%@k(>^)Pt4`njxgN@xNARVq$) diff --git a/androidApp/src/main/res/drawable/ic_settings.xml b/androidApp/src/main/res/drawable/ic_settings.xml deleted file mode 100644 index bfa34fea9..000000000 --- a/androidApp/src/main/res/drawable/ic_settings.xml +++ /dev/null @@ -1,9 +0,0 @@ - - - diff --git a/androidApp/src/main/res/drawable/ic_share.xml b/androidApp/src/main/res/drawable/ic_share.xml deleted file mode 100644 index 57536fdfc..000000000 --- a/androidApp/src/main/res/drawable/ic_share.xml +++ /dev/null @@ -1,10 +0,0 @@ - - - diff --git a/androidApp/src/main/res/drawable/ic_share_black_24dp.xml b/androidApp/src/main/res/drawable/ic_share_black_24dp.xml deleted file mode 100644 index 338d95ad5..000000000 --- a/androidApp/src/main/res/drawable/ic_share_black_24dp.xml +++ /dev/null @@ -1,9 +0,0 @@ - - - diff --git a/androidApp/src/main/res/drawable/ic_share_wrapper.xml b/androidApp/src/main/res/drawable/ic_share_wrapper.xml deleted file mode 100644 index fda1d8c45..000000000 --- a/androidApp/src/main/res/drawable/ic_share_wrapper.xml +++ /dev/null @@ -1,4 +0,0 @@ - - - - \ No newline at end of file diff --git a/androidApp/src/main/res/drawable/ic_success.xml b/androidApp/src/main/res/drawable/ic_success.xml deleted file mode 100644 index fb51d988b..000000000 --- a/androidApp/src/main/res/drawable/ic_success.xml +++ /dev/null @@ -1,12 +0,0 @@ - - - - diff --git a/androidApp/src/main/res/drawable/ic_supervisor_account_black_24dp.xml b/androidApp/src/main/res/drawable/ic_supervisor_account_black_24dp.xml deleted file mode 100644 index 800c58d45..000000000 --- a/androidApp/src/main/res/drawable/ic_supervisor_account_black_24dp.xml +++ /dev/null @@ -1,9 +0,0 @@ - - - diff --git a/androidApp/src/main/res/drawable/ic_visibility_24px.xml b/androidApp/src/main/res/drawable/ic_visibility_24px.xml deleted file mode 100644 index 229fda028..000000000 --- a/androidApp/src/main/res/drawable/ic_visibility_24px.xml +++ /dev/null @@ -1,13 +0,0 @@ - - - - - - \ No newline at end of file diff --git a/androidApp/src/main/res/drawable/ic_visibility_off_24px.xml b/androidApp/src/main/res/drawable/ic_visibility_off_24px.xml deleted file mode 100644 index 8e840f753..000000000 --- a/androidApp/src/main/res/drawable/ic_visibility_off_24px.xml +++ /dev/null @@ -1,13 +0,0 @@ - - - - - - \ No newline at end of file diff --git a/androidApp/src/main/res/drawable/ic_wrapped_lock_black_24dp.xml b/androidApp/src/main/res/drawable/ic_wrapped_lock_black_24dp.xml deleted file mode 100644 index f0b49c99e..000000000 --- a/androidApp/src/main/res/drawable/ic_wrapped_lock_black_24dp.xml +++ /dev/null @@ -1,4 +0,0 @@ - - - - \ No newline at end of file diff --git a/androidApp/src/main/res/drawable/ic_wrapped_person_black_24dp.xml b/androidApp/src/main/res/drawable/ic_wrapped_person_black_24dp.xml deleted file mode 100644 index 0b1822d0a..000000000 --- a/androidApp/src/main/res/drawable/ic_wrapped_person_black_24dp.xml +++ /dev/null @@ -1,4 +0,0 @@ - - - - \ No newline at end of file diff --git a/androidApp/src/main/res/drawable-hdpi/mifos_logo.png b/androidApp/src/main/res/drawable/mifos_logo.png similarity index 100% rename from androidApp/src/main/res/drawable-hdpi/mifos_logo.png rename to androidApp/src/main/res/drawable/mifos_logo.png diff --git a/androidApp/src/main/res/drawable/mifos_splash_screen_logo.png b/androidApp/src/main/res/drawable/mifos_splash_screen_logo.png new file mode 100644 index 0000000000000000000000000000000000000000..4a515337aa40ecd463ae5c26dde41fd91a9c45d2 GIT binary patch literal 33661 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 - - - - \ No newline at end of file diff --git a/androidApp/src/main/res/drawable/rectangular_border.xml b/androidApp/src/main/res/drawable/rectangular_border.xml deleted file mode 100644 index 92845c9b6..000000000 --- a/androidApp/src/main/res/drawable/rectangular_border.xml +++ /dev/null @@ -1,7 +0,0 @@ - - - - \ No newline at end of file diff --git a/androidApp/src/main/res/drawable/round_corner.xml b/androidApp/src/main/res/drawable/round_corner.xml deleted file mode 100644 index 4e4da7946..000000000 --- a/androidApp/src/main/res/drawable/round_corner.xml +++ /dev/null @@ -1,7 +0,0 @@ - - - - - \ No newline at end of file diff --git a/androidApp/src/main/res/drawable/scrim.xml b/androidApp/src/main/res/drawable/scrim.xml deleted file mode 100644 index 4320acfb9..000000000 --- a/androidApp/src/main/res/drawable/scrim.xml +++ /dev/null @@ -1,6 +0,0 @@ - - - \ No newline at end of file diff --git a/androidApp/src/main/res/drawable/splash_background.xml b/androidApp/src/main/res/drawable/splash_background.xml deleted file mode 100644 index 2262620e4..000000000 --- a/androidApp/src/main/res/drawable/splash_background.xml +++ /dev/null @@ -1,11 +0,0 @@ - - - - - - - - - - \ No newline at end of file diff --git a/androidApp/src/main/res/drawable/splash_icon.xml b/androidApp/src/main/res/drawable/splash_icon.xml new file mode 100644 index 000000000..fb9902e0e --- /dev/null +++ b/androidApp/src/main/res/drawable/splash_icon.xml @@ -0,0 +1,21 @@ + + + + + + + + + \ No newline at end of file diff --git a/androidApp/src/main/res/drawable/triangular_green_view.xml b/androidApp/src/main/res/drawable/triangular_green_view.xml deleted file mode 100644 index d6cd9b495..000000000 --- a/androidApp/src/main/res/drawable/triangular_green_view.xml +++ /dev/null @@ -1,9 +0,0 @@ - - - \ No newline at end of file diff --git a/androidApp/src/main/res/drawable/triangular_red_view.xml b/androidApp/src/main/res/drawable/triangular_red_view.xml deleted file mode 100644 index 66994c39a..000000000 --- a/androidApp/src/main/res/drawable/triangular_red_view.xml +++ /dev/null @@ -1,10 +0,0 @@ - - - \ No newline at end of file diff --git a/androidApp/src/main/res/layout-land/fragment_beneficiary_add_options.xml b/androidApp/src/main/res/layout-land/fragment_beneficiary_add_options.xml deleted file mode 100644 index 96b2fc91b..000000000 --- a/androidApp/src/main/res/layout-land/fragment_beneficiary_add_options.xml +++ /dev/null @@ -1,117 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/androidApp/src/main/res/layout/account_spinner_layout.xml b/androidApp/src/main/res/layout/account_spinner_layout.xml deleted file mode 100644 index 2dfc79e1c..000000000 --- a/androidApp/src/main/res/layout/account_spinner_layout.xml +++ /dev/null @@ -1,23 +0,0 @@ - - - - - - - - diff --git a/androidApp/src/main/res/layout/action_bar_notification_layout.xml b/androidApp/src/main/res/layout/action_bar_notification_layout.xml deleted file mode 100644 index c94345343..000000000 --- a/androidApp/src/main/res/layout/action_bar_notification_layout.xml +++ /dev/null @@ -1,40 +0,0 @@ - - - - - - - - - - - - \ No newline at end of file diff --git a/androidApp/src/main/res/layout/activity_accounts.xml b/androidApp/src/main/res/layout/activity_accounts.xml deleted file mode 100644 index 1627e9856..000000000 --- a/androidApp/src/main/res/layout/activity_accounts.xml +++ /dev/null @@ -1,25 +0,0 @@ - - - - - - - - - - - diff --git a/androidApp/src/main/res/layout/activity_client_list.xml b/androidApp/src/main/res/layout/activity_client_list.xml deleted file mode 100644 index 2908c07e6..000000000 --- a/androidApp/src/main/res/layout/activity_client_list.xml +++ /dev/null @@ -1,13 +0,0 @@ - - - - - \ No newline at end of file diff --git a/androidApp/src/main/res/layout/activity_container.xml b/androidApp/src/main/res/layout/activity_container.xml deleted file mode 100644 index 5f6d1704a..000000000 --- a/androidApp/src/main/res/layout/activity_container.xml +++ /dev/null @@ -1,22 +0,0 @@ - - - - - - - - - - - - - diff --git a/androidApp/src/main/res/layout/activity_edit_user_detail.xml b/androidApp/src/main/res/layout/activity_edit_user_detail.xml deleted file mode 100644 index 757dd55ab..000000000 --- a/androidApp/src/main/res/layout/activity_edit_user_detail.xml +++ /dev/null @@ -1,19 +0,0 @@ - - - - - - - - - - - diff --git a/androidApp/src/main/res/layout/activity_home.xml b/androidApp/src/main/res/layout/activity_home.xml deleted file mode 100644 index f568fc257..000000000 --- a/androidApp/src/main/res/layout/activity_home.xml +++ /dev/null @@ -1,28 +0,0 @@ - - - - - - - - - - - diff --git a/androidApp/src/main/res/layout/activity_loan_application.xml b/androidApp/src/main/res/layout/activity_loan_application.xml deleted file mode 100644 index 5539c1cdb..000000000 --- a/androidApp/src/main/res/layout/activity_loan_application.xml +++ /dev/null @@ -1,17 +0,0 @@ - - - - - - - - - - - diff --git a/androidApp/src/main/res/layout/activity_login.xml b/androidApp/src/main/res/layout/activity_login.xml deleted file mode 100644 index 6d2c55418..000000000 --- a/androidApp/src/main/res/layout/activity_login.xml +++ /dev/null @@ -1,100 +0,0 @@ - - - - - - - - - - - - - - - - - - - -