From 9a3ca1cf4791a9daefc753d254a349f422badef7 Mon Sep 17 00:00:00 2001 From: ILIYANGERMANOV Date: Mon, 4 Sep 2023 00:08:31 +0300 Subject: [PATCH] Devexp (#2552) * Create a separate "Detekt workflow" * WIP: Configure dependabot * Migrate Hilt to Version catalog * Migrate Room to version catalog * WIP: Massive legacy code cleanup * Delete legacy code * Migrate deps to version catalog * Cleanup * Refactor `libs.versions.toml` * Update the dependabot configuration * Fix the `dependabot.yml` (attempt #1) * Fix the `dependabot.yml` (attempt #2) * Fix the `dependabot.yml` (attempt #3) * Fix the `dependabot.yml` (attempt #4) * Fix the `dependabot.yml` (attempt #5) * Update Deket baseline * Don't send APK to Telegram if it's `dependabot` * Bump the dependabot.yml open PRs limit to 10 * Add Gradle caching to the "Detekt" workflow --- .github/dependabot.yml | 55 +- .github/workflows/apk.yml | 4 +- .github/workflows/detekt.yml | 53 ++ .github/workflows/lint.yml | 12 - app/build.gradle.kts | 19 +- .../main/java/com/ivy/wallet/AppModuleDI.kt | 498 --------------- .../ivy/wallet/android/billing/IvyBilling.kt | 3 +- .../notification/NotificationService.kt | 6 +- .../action/exchange/SyncExchangeRatesAct.kt | 20 +- .../transaction/FetchAllTrnsFromServerAct.kt | 42 -- .../viewmodel/experiment/FetchImagesAct.kt | 17 - .../transaction/UploadTrnToServerAct.kt | 66 -- .../ivy/wallet/domain/data/core/Account.kt | 13 +- .../com/ivy/wallet/domain/data/core/Budget.kt | 12 +- .../ivy/wallet/domain/data/core/Category.kt | 11 +- .../wallet/domain/data/core/ExchangeRate.kt | 7 - .../com/ivy/wallet/domain/data/core/Loan.kt | 14 +- .../ivy/wallet/domain/data/core/LoanRecord.kt | 14 +- .../domain/data/core/PlannedPaymentRule.kt | 17 +- .../ivy/wallet/domain/data/core/Settings.kt | 11 +- .../wallet/domain/data/core/Transaction.kt | 19 - .../com/ivy/wallet/domain/data/core/User.kt | 14 +- .../domain/deprecated/logic/AccountCreator.kt | 14 - .../domain/deprecated/logic/BudgetCreator.kt | 14 - .../deprecated/logic/CategoryCreator.kt | 10 - .../domain/deprecated/logic/LoanCreator.kt | 16 +- .../deprecated/logic/LoanRecordCreator.kt | 16 +- .../domain/deprecated/logic/LogoutLogic.kt | 6 - .../domain/deprecated/logic/PaywallLogic.kt | 3 +- .../logic/PlannedPaymentsGenerator.kt | 3 +- .../deprecated/logic/PlannedPaymentsLogic.kt | 33 +- .../deprecated/logic/csv/CSVImporter.kt | 5 +- .../domain/deprecated/logic/csv/CSVMapper.kt | 3 +- .../deprecated/logic/csv/CSVNormalizer.kt | 3 +- .../deprecated/logic/csv/ExportCSVLogic.kt | 5 +- .../deprecated/logic/csv/IvyFileReader.kt | 5 +- .../logic/currency/ExchangeRatesLogic.kt | 7 +- .../loantrasactions/LoanTransactionsCore.kt | 25 +- .../notification/TransactionReminderLogic.kt | 5 +- .../wallet/domain/deprecated/sync/IvySync.kt | 45 -- .../deprecated/sync/item/AccountSync.kt | 76 --- .../domain/deprecated/sync/item/BudgetSync.kt | 76 --- .../deprecated/sync/item/CategorySync.kt | 76 --- .../deprecated/sync/item/LoanRecordSync.kt | 77 --- .../domain/deprecated/sync/item/LoanSync.kt | 76 --- .../sync/item/PlannedPaymentSync.kt | 78 --- .../deprecated/sync/item/TransactionSync.kt | 77 --- .../sync/uploader/AccountUploader.kt | 71 --- .../sync/uploader/BudgetUploader.kt | 67 -- .../sync/uploader/CategoryUploader.kt | 67 -- .../sync/uploader/LoanRecordUploader.kt | 67 -- .../deprecated/sync/uploader/LoanUploader.kt | 67 -- .../uploader/PlannedPaymentRuleUploader.kt | 67 -- .../sync/uploader/TransactionUploader.kt | 67 -- .../ivy/wallet/io/network/GsonTypeAdapters.kt | 46 -- .../com/ivy/wallet/io/network/IvyAnalytics.kt | 45 -- .../com/ivy/wallet/io/network/IvySession.kt | 49 -- .../com/ivy/wallet/io/network/RestClient.kt | 189 ------ .../ivy/wallet/io/network/data/AccountDTO.kt | 30 - .../ivy/wallet/io/network/data/BudgetDTO.kt | 66 -- .../ivy/wallet/io/network/data/CategoryDTO.kt | 25 - .../wallet/io/network/data/ExchangeRateDTO.kt | 13 - .../com/ivy/wallet/io/network/data/LoanDTO.kt | 35 -- .../wallet/io/network/data/LoanRecordDTO.kt | 32 - .../io/network/data/PlannedPaymentRuleDTO.kt | 39 -- .../ivy/wallet/io/network/data/SettingsDTO.kt | 25 - .../wallet/io/network/data/TransactionDTO.kt | 52 -- .../com/ivy/wallet/io/network/data/UserDTO.kt | 32 - .../ivy/wallet/io/network/error/ErrorCode.kt | 23 - .../wallet/io/network/error/NetworkError.kt | 6 - .../ivy/wallet/io/network/error/RestError.kt | 10 - .../request/account/AccountsResponse.kt | 8 - .../request/account/DeleteAccountRequest.kt | 7 - .../request/account/UpdateAccountRequest.kt | 7 - .../analytics/AnalyticsReportResponse.kt | 24 - .../request/analytics/LogEventRequest.kt | 7 - .../io/network/request/auth/AuthResponse.kt | 11 - .../network/request/auth/CheckEmailRequest.kt | 8 - .../request/auth/CheckEmailResponse.kt | 11 - .../request/auth/GoogleSignInRequest.kt | 10 - .../auth/InitiateResetPasswordRequest.kt | 8 - .../auth/InitiateResetPasswordResponse.kt | 8 - .../request/auth/ResetPasswordRequest.kt | 14 - .../io/network/request/auth/SignInRequest.kt | 12 - .../io/network/request/auth/SignUpRequest.kt | 18 - .../request/auth/UpdateUserInfoRequest.kt | 10 - .../request/auth/UpdateUserInfoResponse.kt | 9 - .../network/request/budget/BudgetsResponse.kt | 8 - .../request/budget/CrupdateBudgetRequest.kt | 8 - .../request/budget/DeleteBudgetRequest.kt | 7 - .../category/DeleteWalletCategoryRequest.kt | 7 - .../category/UpdateWalletCategoryRequest.kt | 7 - .../category/WalletCategoriesResponse.kt | 8 - .../request/currency/ExchangeRatesResponse.kt | 9 - .../request/github/OpenIssueRequest.kt | 6 - .../request/github/OpenIssueResponse.kt | 5 - .../request/loan/DeleteLoanRecordRequest.kt | 7 - .../network/request/loan/DeleteLoanRequest.kt | 7 - .../request/loan/LoanRecordsResponse.kt | 7 - .../io/network/request/loan/LoansResponse.kt | 7 - .../request/loan/UpdateLoanRecordRequest.kt | 7 - .../network/request/loan/UpdateLoanRequest.kt | 7 - .../DeletePlannedPaymentRuleRequest.kt | 7 - .../planned/PlannedPaymentRulesResponse.kt | 8 - .../UpdatePlannedPaymentRuleRequest.kt | 7 - .../transaction/DeleteTransactionRequest.kt | 7 - .../transaction/TransactionsResponse.kt | 8 - .../transaction/UpdateTransactionRequest.kt | 7 - .../io/network/service/AccountService.kt | 19 - .../io/network/service/AnalyticsService.kt | 24 - .../wallet/io/network/service/AuthService.kt | 33 - .../io/network/service/BudgetService.kt | 19 - .../io/network/service/CategoryService.kt | 19 - .../network/service/ExchangeRatesService.kt | 14 - .../io/network/service/ExpImagesService.kt | 10 - .../wallet/io/network/service/LoanService.kt | 27 - .../wallet/io/network/service/NukeService.kt | 10 - .../service/PlannedPaymentRuleService.kt | 19 - .../io/network/service/TransactionService.kt | 26 - .../wallet/{backup => }/ktor/KtorClient.kt | 2 +- .../{backup => }/ktor/KtorClientModule.kt | 2 +- .../kotlinxserilzation/UUIDSerializer.kt | 2 +- .../java/com/ivy/wallet/ui/RootActivity.kt | 4 - .../java/com/ivy/wallet/ui/RootViewModel.kt | 7 - .../main/java/com/ivy/wallet/ui/Screens.kt | 4 +- .../wallet/ui/accounts/AccountsViewModel.kt | 6 - .../ui/analytics/AnalyticsReportScreen.kt | 321 ---------- .../ui/analytics/AnalyticsReportViewModel.kt | 201 ------ .../ivy/wallet/ui/analytics/AnalyticsTab.kt | 5 - .../com/ivy/wallet/ui/analytics/DataCircle.kt | 73 --- .../ivy/wallet/ui/analytics/model/Health.kt | 14 - .../com/ivy/wallet/ui/analytics/model/KPIs.kt | 48 -- .../ui/analytics/model/OnboardingReport.kt | 14 - .../wallet/ui/analytics/model/UserStats.kt | 12 - .../ivy/wallet/ui/analytics/tab/HealthTab.kt | 97 --- .../ivy/wallet/ui/analytics/tab/KPIsTab.kt | 359 ----------- .../ui/analytics/tab/OnboardingReportTab.kt | 162 ----- .../wallet/ui/analytics/tab/UserStatsTab.kt | 80 --- .../ivy/wallet/ui/budget/BudgetViewModel.kt | 12 - .../wallet/ui/category/CategoriesViewModel.kt | 12 +- .../ui/edit/EditTransactionViewModel.kt | 17 +- .../com/ivy/wallet/ui/loan/LoanViewModel.kt | 17 +- .../com/ivy/wallet/ui/main/MainViewModel.kt | 11 - .../onboarding/viewmodel/OnboardingRouter.kt | 36 -- .../viewmodel/OnboardingViewModel.kt | 33 - .../ivy/wallet/ui/paywall/PaywallViewModel.kt | 43 -- .../ui/planned/edit/EditPlannedViewModel.kt | 22 +- .../wallet/ui/settings/SettingsViewModel.kt | 85 +-- .../level2/ItemStatisticViewModel.kt | 48 +- .../com/ivy/wallet/ui/test/TestViewModel.kt | 13 +- .../ivy/wallet/ui/webView/WebViewScreen.kt | 74 --- buildSrc/build.gradle.kts | 14 +- .../wallet/buildsrc/DependencyHandlerExt.kt | 40 -- .../java/com/ivy/wallet/buildsrc/Project.kt | 16 + .../com/ivy/wallet/buildsrc/dependencies.kt | 206 ------- config/detekt/baseline.yml | 574 ++---------------- gradle/libs.versions.toml | 101 ++- ivy-design/build.gradle.kts | 3 - 158 files changed, 370 insertions(+), 5834 deletions(-) create mode 100644 .github/workflows/detekt.yml delete mode 100644 app/src/main/java/com/ivy/wallet/domain/action/transaction/FetchAllTrnsFromServerAct.kt delete mode 100644 app/src/main/java/com/ivy/wallet/domain/action/viewmodel/experiment/FetchImagesAct.kt delete mode 100644 app/src/main/java/com/ivy/wallet/domain/action/viewmodel/transaction/UploadTrnToServerAct.kt delete mode 100644 app/src/main/java/com/ivy/wallet/domain/deprecated/sync/IvySync.kt delete mode 100644 app/src/main/java/com/ivy/wallet/domain/deprecated/sync/item/AccountSync.kt delete mode 100644 app/src/main/java/com/ivy/wallet/domain/deprecated/sync/item/BudgetSync.kt delete mode 100644 app/src/main/java/com/ivy/wallet/domain/deprecated/sync/item/CategorySync.kt delete mode 100644 app/src/main/java/com/ivy/wallet/domain/deprecated/sync/item/LoanRecordSync.kt delete mode 100644 app/src/main/java/com/ivy/wallet/domain/deprecated/sync/item/LoanSync.kt delete mode 100644 app/src/main/java/com/ivy/wallet/domain/deprecated/sync/item/PlannedPaymentSync.kt delete mode 100644 app/src/main/java/com/ivy/wallet/domain/deprecated/sync/item/TransactionSync.kt delete mode 100644 app/src/main/java/com/ivy/wallet/domain/deprecated/sync/uploader/AccountUploader.kt delete mode 100644 app/src/main/java/com/ivy/wallet/domain/deprecated/sync/uploader/BudgetUploader.kt delete mode 100644 app/src/main/java/com/ivy/wallet/domain/deprecated/sync/uploader/CategoryUploader.kt delete mode 100644 app/src/main/java/com/ivy/wallet/domain/deprecated/sync/uploader/LoanRecordUploader.kt delete mode 100644 app/src/main/java/com/ivy/wallet/domain/deprecated/sync/uploader/LoanUploader.kt delete mode 100644 app/src/main/java/com/ivy/wallet/domain/deprecated/sync/uploader/PlannedPaymentRuleUploader.kt delete mode 100644 app/src/main/java/com/ivy/wallet/domain/deprecated/sync/uploader/TransactionUploader.kt delete mode 100644 app/src/main/java/com/ivy/wallet/io/network/GsonTypeAdapters.kt delete mode 100644 app/src/main/java/com/ivy/wallet/io/network/IvyAnalytics.kt delete mode 100644 app/src/main/java/com/ivy/wallet/io/network/IvySession.kt delete mode 100644 app/src/main/java/com/ivy/wallet/io/network/RestClient.kt delete mode 100644 app/src/main/java/com/ivy/wallet/io/network/data/AccountDTO.kt delete mode 100644 app/src/main/java/com/ivy/wallet/io/network/data/BudgetDTO.kt delete mode 100644 app/src/main/java/com/ivy/wallet/io/network/data/CategoryDTO.kt delete mode 100644 app/src/main/java/com/ivy/wallet/io/network/data/ExchangeRateDTO.kt delete mode 100644 app/src/main/java/com/ivy/wallet/io/network/data/LoanDTO.kt delete mode 100644 app/src/main/java/com/ivy/wallet/io/network/data/LoanRecordDTO.kt delete mode 100644 app/src/main/java/com/ivy/wallet/io/network/data/PlannedPaymentRuleDTO.kt delete mode 100644 app/src/main/java/com/ivy/wallet/io/network/data/SettingsDTO.kt delete mode 100644 app/src/main/java/com/ivy/wallet/io/network/data/TransactionDTO.kt delete mode 100644 app/src/main/java/com/ivy/wallet/io/network/data/UserDTO.kt delete mode 100644 app/src/main/java/com/ivy/wallet/io/network/error/ErrorCode.kt delete mode 100644 app/src/main/java/com/ivy/wallet/io/network/error/NetworkError.kt delete mode 100644 app/src/main/java/com/ivy/wallet/io/network/error/RestError.kt delete mode 100644 app/src/main/java/com/ivy/wallet/io/network/request/account/AccountsResponse.kt delete mode 100644 app/src/main/java/com/ivy/wallet/io/network/request/account/DeleteAccountRequest.kt delete mode 100644 app/src/main/java/com/ivy/wallet/io/network/request/account/UpdateAccountRequest.kt delete mode 100644 app/src/main/java/com/ivy/wallet/io/network/request/analytics/AnalyticsReportResponse.kt delete mode 100644 app/src/main/java/com/ivy/wallet/io/network/request/analytics/LogEventRequest.kt delete mode 100644 app/src/main/java/com/ivy/wallet/io/network/request/auth/AuthResponse.kt delete mode 100644 app/src/main/java/com/ivy/wallet/io/network/request/auth/CheckEmailRequest.kt delete mode 100644 app/src/main/java/com/ivy/wallet/io/network/request/auth/CheckEmailResponse.kt delete mode 100644 app/src/main/java/com/ivy/wallet/io/network/request/auth/GoogleSignInRequest.kt delete mode 100644 app/src/main/java/com/ivy/wallet/io/network/request/auth/InitiateResetPasswordRequest.kt delete mode 100644 app/src/main/java/com/ivy/wallet/io/network/request/auth/InitiateResetPasswordResponse.kt delete mode 100644 app/src/main/java/com/ivy/wallet/io/network/request/auth/ResetPasswordRequest.kt delete mode 100644 app/src/main/java/com/ivy/wallet/io/network/request/auth/SignInRequest.kt delete mode 100644 app/src/main/java/com/ivy/wallet/io/network/request/auth/SignUpRequest.kt delete mode 100644 app/src/main/java/com/ivy/wallet/io/network/request/auth/UpdateUserInfoRequest.kt delete mode 100644 app/src/main/java/com/ivy/wallet/io/network/request/auth/UpdateUserInfoResponse.kt delete mode 100644 app/src/main/java/com/ivy/wallet/io/network/request/budget/BudgetsResponse.kt delete mode 100644 app/src/main/java/com/ivy/wallet/io/network/request/budget/CrupdateBudgetRequest.kt delete mode 100644 app/src/main/java/com/ivy/wallet/io/network/request/budget/DeleteBudgetRequest.kt delete mode 100644 app/src/main/java/com/ivy/wallet/io/network/request/category/DeleteWalletCategoryRequest.kt delete mode 100644 app/src/main/java/com/ivy/wallet/io/network/request/category/UpdateWalletCategoryRequest.kt delete mode 100644 app/src/main/java/com/ivy/wallet/io/network/request/category/WalletCategoriesResponse.kt delete mode 100644 app/src/main/java/com/ivy/wallet/io/network/request/currency/ExchangeRatesResponse.kt delete mode 100644 app/src/main/java/com/ivy/wallet/io/network/request/github/OpenIssueRequest.kt delete mode 100644 app/src/main/java/com/ivy/wallet/io/network/request/github/OpenIssueResponse.kt delete mode 100644 app/src/main/java/com/ivy/wallet/io/network/request/loan/DeleteLoanRecordRequest.kt delete mode 100644 app/src/main/java/com/ivy/wallet/io/network/request/loan/DeleteLoanRequest.kt delete mode 100644 app/src/main/java/com/ivy/wallet/io/network/request/loan/LoanRecordsResponse.kt delete mode 100644 app/src/main/java/com/ivy/wallet/io/network/request/loan/LoansResponse.kt delete mode 100644 app/src/main/java/com/ivy/wallet/io/network/request/loan/UpdateLoanRecordRequest.kt delete mode 100644 app/src/main/java/com/ivy/wallet/io/network/request/loan/UpdateLoanRequest.kt delete mode 100644 app/src/main/java/com/ivy/wallet/io/network/request/planned/DeletePlannedPaymentRuleRequest.kt delete mode 100644 app/src/main/java/com/ivy/wallet/io/network/request/planned/PlannedPaymentRulesResponse.kt delete mode 100644 app/src/main/java/com/ivy/wallet/io/network/request/planned/UpdatePlannedPaymentRuleRequest.kt delete mode 100644 app/src/main/java/com/ivy/wallet/io/network/request/transaction/DeleteTransactionRequest.kt delete mode 100644 app/src/main/java/com/ivy/wallet/io/network/request/transaction/TransactionsResponse.kt delete mode 100644 app/src/main/java/com/ivy/wallet/io/network/request/transaction/UpdateTransactionRequest.kt delete mode 100644 app/src/main/java/com/ivy/wallet/io/network/service/AccountService.kt delete mode 100644 app/src/main/java/com/ivy/wallet/io/network/service/AnalyticsService.kt delete mode 100644 app/src/main/java/com/ivy/wallet/io/network/service/AuthService.kt delete mode 100644 app/src/main/java/com/ivy/wallet/io/network/service/BudgetService.kt delete mode 100644 app/src/main/java/com/ivy/wallet/io/network/service/CategoryService.kt delete mode 100644 app/src/main/java/com/ivy/wallet/io/network/service/ExchangeRatesService.kt delete mode 100644 app/src/main/java/com/ivy/wallet/io/network/service/ExpImagesService.kt delete mode 100644 app/src/main/java/com/ivy/wallet/io/network/service/LoanService.kt delete mode 100644 app/src/main/java/com/ivy/wallet/io/network/service/NukeService.kt delete mode 100644 app/src/main/java/com/ivy/wallet/io/network/service/PlannedPaymentRuleService.kt delete mode 100644 app/src/main/java/com/ivy/wallet/io/network/service/TransactionService.kt rename app/src/main/java/com/ivy/wallet/{backup => }/ktor/KtorClient.kt (95%) rename app/src/main/java/com/ivy/wallet/{backup => }/ktor/KtorClientModule.kt (91%) rename app/src/main/java/com/ivy/wallet/{backup => ktor}/kotlinxserilzation/UUIDSerializer.kt (92%) delete mode 100644 app/src/main/java/com/ivy/wallet/ui/analytics/AnalyticsReportScreen.kt delete mode 100644 app/src/main/java/com/ivy/wallet/ui/analytics/AnalyticsReportViewModel.kt delete mode 100644 app/src/main/java/com/ivy/wallet/ui/analytics/AnalyticsTab.kt delete mode 100644 app/src/main/java/com/ivy/wallet/ui/analytics/DataCircle.kt delete mode 100644 app/src/main/java/com/ivy/wallet/ui/analytics/model/Health.kt delete mode 100644 app/src/main/java/com/ivy/wallet/ui/analytics/model/KPIs.kt delete mode 100644 app/src/main/java/com/ivy/wallet/ui/analytics/model/OnboardingReport.kt delete mode 100644 app/src/main/java/com/ivy/wallet/ui/analytics/model/UserStats.kt delete mode 100644 app/src/main/java/com/ivy/wallet/ui/analytics/tab/HealthTab.kt delete mode 100644 app/src/main/java/com/ivy/wallet/ui/analytics/tab/KPIsTab.kt delete mode 100644 app/src/main/java/com/ivy/wallet/ui/analytics/tab/OnboardingReportTab.kt delete mode 100644 app/src/main/java/com/ivy/wallet/ui/analytics/tab/UserStatsTab.kt delete mode 100644 app/src/main/java/com/ivy/wallet/ui/webView/WebViewScreen.kt delete mode 100644 buildSrc/src/main/java/com/ivy/wallet/buildsrc/DependencyHandlerExt.kt create mode 100644 buildSrc/src/main/java/com/ivy/wallet/buildsrc/Project.kt delete mode 100644 buildSrc/src/main/java/com/ivy/wallet/buildsrc/dependencies.kt diff --git a/.github/dependabot.yml b/.github/dependabot.yml index 6cb5e3aef1..5868e5053c 100644 --- a/.github/dependabot.yml +++ b/.github/dependabot.yml @@ -4,17 +4,52 @@ version: 2 updates: - - package-ecosystem: "gradle" - directory: "/" - schedule: - interval: "weekly" - registries: - - maven-google + - package-ecosystem: "gradle" + directory: "/" + schedule: + interval: "weekly" + registries: + - maven-google + open-pull-requests-limit: 10 + groups: + kotlin-compose: + patterns: + - "org.jetbrains.kotlin:*" + - "org.jetbrains.kotlinx:*" + - "org.jetbrains.kotlin.plugin.serialization" + - "androidx.compose:*" + - "androidx.glance:*" + - "io.coil-kt:coil-compose" + - "com.android.tools.build:gradle" + - "androidx.activity:activity-compose" + - "androidx.lifecycle:lifecycle-viewmodel-compose" + ktor: + patterns: + - "io.ktor:*" + google-firebase: + patterns: + - "com.google.*" + - "com.android.billingclient:*" + kotest: + patterns: + - "io.kotest.*" + - "io.kotest:*" + androidx: + patterns: + - "androidx.*" + hilt: + patterns: + - "com.google.dagger:*" + - "androidx.hilt:hilt-work" + room: + patterns: + - "androidx.room:*" - - package-ecosystem: "github-actions" - directory: "/" - schedule: - interval: "weekly" + - package-ecosystem: "github-actions" + directory: "/" + schedule: + interval: "weekly" + open-pull-requests-limit: 10 # This is only a workaround as long as # https://github.com/dependabot/dependabot-core/pull/7260 diff --git a/.github/workflows/apk.yml b/.github/workflows/apk.yml index 7c55e35fb5..0761a11cbd 100644 --- a/.github/workflows/apk.yml +++ b/.github/workflows/apk.yml @@ -41,7 +41,9 @@ jobs: path: app/build/outputs/apk/demo/app-demo.apk - name: Upload APK in Telegram Group - if: github.ref == 'refs/heads/main' + if: | + github.ref == 'refs/heads/main' && + github.event.head_commit.author.name != 'dependabot[bot]' run: | COMMIT_LINK="https://github.com/${GITHUB_REPOSITORY}/commit/${GITHUB_SHA}" COMMIT_MESSAGE=$(curl -s -H "Authorization: token ${{ secrets.GITHUB_TOKEN }}" "https://api.github.com/repos/${GITHUB_REPOSITORY}/commits/${GITHUB_SHA}" | jq -r .commit.message) diff --git a/.github/workflows/detekt.yml b/.github/workflows/detekt.yml new file mode 100644 index 0000000000..d12fe76217 --- /dev/null +++ b/.github/workflows/detekt.yml @@ -0,0 +1,53 @@ +name: Detekt + +# Controls when the workflow will run +on: + # Triggers the workflow on push or pull request events + push: + branches: + - main + + pull_request: + +# A workflow run is made up of one or more jobs that can run sequentially or in parallel +jobs: + detekt: + # The type of runner that the job will run on + runs-on: ubuntu-latest + + # Steps represent a sequence of tasks that will be executed as part of the job + steps: + # Checks-out your repository under $GITHUB_WORKSPACE, so your job can access it + - name: Checkout GIT + uses: actions/checkout@v3 + + - name: Setup Java SDK + uses: actions/setup-java@v3 + with: + distribution: 'adopt' + java-version: '18' + #---------------------------------------------------- + + #Optimization + - name: Enable Gradle Wrapper caching (optmization) + uses: actions/cache@v3 + with: + path: | + ~/.gradle/caches + ~/.gradle/wrapper + key: ${{ runner.os }}-gradle-${{ hashFiles('**/*.gradle*', '**/gradle-wrapper.properties') }} + restore-keys: | + ${{ runner.os }}-gradle- + #--------------------------------------------------- + + #Detekt + - name: Detekt + run: ./gradlew detekt + + - name: Upload Detekt Release report to GitHub + if: always() + uses: actions/upload-artifact@v3 + with: + name: detekt-report.html + path: build/reports/detekt/detekt.html + #------------------------------------------------------------------ diff --git a/.github/workflows/lint.yml b/.github/workflows/lint.yml index c25b6d6cc7..0dd1ff7f80 100644 --- a/.github/workflows/lint.yml +++ b/.github/workflows/lint.yml @@ -40,18 +40,6 @@ jobs: ${{ runner.os }}-gradle- #--------------------------------------------------- - #Detekt - - name: Detekt - run: ./gradlew detekt - - - name: Upload Detekt Release report to GitHub - if: always() - uses: actions/upload-artifact@v3 - with: - name: detekt-report.html - path: build/reports/detekt/detekt.html - #------------------------------------------------------------------ - #Lint - name: Lint (release) run: ./gradlew lintRelease diff --git a/app/build.gradle.kts b/app/build.gradle.kts index 43ff1b4eec..1965ab2541 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -1,5 +1,4 @@ import com.ivy.wallet.buildsrc.Project -import com.ivy.wallet.buildsrc.appModuleDependencies plugins { id("com.android.application") @@ -140,7 +139,6 @@ android { } dependencies { - appModuleDependencies() implementation(project(":ivy-design")) implementation(libs.ivy.frp.temp) @@ -156,6 +154,23 @@ dependencies { implementation(libs.androidx.security) implementation(libs.androidx.biometrics) + implementation(libs.gson) + + implementation(libs.bundles.hilt) + kapt(libs.hilt.compiler) + + implementation(libs.bundles.room) + kapt(libs.room.compiler) + + implementation(libs.timber) + implementation(libs.eventbus) + implementation(libs.keval) + implementation(libs.bundles.opencsv) + implementation(libs.androidx.work) + implementation(libs.androidx.recyclerview) + testImplementation(libs.bundles.kotest) testImplementation(libs.bundles.kotlin.test) + testImplementation(libs.hilt.testing) + testImplementation(libs.androidx.work.testing) } diff --git a/app/src/main/java/com/ivy/wallet/AppModuleDI.kt b/app/src/main/java/com/ivy/wallet/AppModuleDI.kt index 79a2a25fdd..43faf4749c 100644 --- a/app/src/main/java/com/ivy/wallet/AppModuleDI.kt +++ b/app/src/main/java/com/ivy/wallet/AppModuleDI.kt @@ -1,11 +1,7 @@ package com.ivy.wallet import android.content.Context -import com.google.gson.Gson -import com.google.gson.GsonBuilder import com.ivy.frp.view.navigation.Navigation -import com.ivy.wallet.android.billing.IvyBilling -import com.ivy.wallet.android.notification.NotificationService import com.ivy.wallet.domain.deprecated.logic.* import com.ivy.wallet.domain.deprecated.logic.csv.* import com.ivy.wallet.domain.deprecated.logic.currency.ExchangeRatesLogic @@ -13,16 +9,7 @@ import com.ivy.wallet.domain.deprecated.logic.loantrasactions.LTLoanMapper import com.ivy.wallet.domain.deprecated.logic.loantrasactions.LTLoanRecordMapper import com.ivy.wallet.domain.deprecated.logic.loantrasactions.LoanTransactionsCore import com.ivy.wallet.domain.deprecated.logic.loantrasactions.LoanTransactionsLogic -import com.ivy.wallet.domain.deprecated.logic.notification.TransactionReminderLogic -import com.ivy.wallet.domain.deprecated.sync.IvySync -import com.ivy.wallet.domain.deprecated.sync.item.* -import com.ivy.wallet.domain.deprecated.sync.uploader.* import com.ivy.wallet.domain.pure.data.WalletDAOs -import com.ivy.wallet.io.network.* -import com.ivy.wallet.io.network.error.ErrorCode -import com.ivy.wallet.io.network.error.NetworkError -import com.ivy.wallet.io.network.error.RestError -import com.ivy.wallet.io.network.service.ExpImagesService import com.ivy.wallet.io.persistence.IvyRoomDatabase import com.ivy.wallet.io.persistence.SharedPrefs import com.ivy.wallet.io.persistence.dao.* @@ -32,10 +19,7 @@ import dagger.Provides import dagger.hilt.InstallIn import dagger.hilt.android.qualifiers.ApplicationContext import dagger.hilt.components.SingletonComponent -import kotlinx.coroutines.delay -import java.time.LocalDateTime import javax.inject.Singleton -import kotlin.random.Random @Module @InstallIn(SingletonComponent::class) @@ -60,30 +44,6 @@ object AppModuleDI { return SharedPrefs(appContext) } - @Provides - @Singleton - fun provideIvySession(sharedPrefs: SharedPrefs, userDao: UserDao): IvySession { - return IvySession(sharedPrefs, userDao) - } - - @Provides - @Singleton - fun provideGson(): Gson { - return GsonBuilder() - .registerTypeAdapter(LocalDateTime::class.java, LocalDateTimeTypeAdapter()) - .registerTypeAdapter(ErrorCode::class.java, ErrorCodeTypeAdapter()) - .create() - } - - @Provides - @Singleton - fun provideRestClient( - @ApplicationContext appContext: Context, - gson: Gson, - ivySession: IvySession - ): RestClient { - return RestClient.initialize(appContext, ivySession, gson) - } @Provides @Singleton @@ -150,379 +110,6 @@ object AppModuleDI { transactionDao = transactionDao ) - @Provides - fun provideRecurringGenerator( - transactionDao: TransactionDao, - ): PlannedPaymentsGenerator = PlannedPaymentsGenerator( - transactionDao = transactionDao, - ) - - //Sync - @Provides - fun provideAccountUploader( - accountDao: AccountDao, - transactionDao: TransactionDao, - restClient: RestClient, - ivySession: IvySession - ): AccountUploader { - return AccountUploader( - accountDao = accountDao, - transactionDao = transactionDao, - restClient = restClient, - ivySession = ivySession - ) - } - - @Provides - fun provideAccountSync( - sharedPrefs: SharedPrefs, - dao: AccountDao, - restClient: RestClient, - uploader: AccountUploader, - ivySession: IvySession - ): AccountSync { - return AccountSync( - sharedPrefs = sharedPrefs, - dao = dao, - restClient = restClient, - uploader = uploader, - ivySession = ivySession - ) - } - - @Provides - fun provideCategoryUploader( - categoryDao: CategoryDao, - restClient: RestClient, - ivySession: IvySession - ): CategoryUploader { - return CategoryUploader( - dao = categoryDao, - restClient = restClient, - ivySession = ivySession - ) - } - - @Provides - fun provideBudgetUploader( - budgetDao: BudgetDao, - restClient: RestClient, - ivySession: IvySession - ): BudgetUploader { - return BudgetUploader( - dao = budgetDao, - restClient = restClient, - ivySession = ivySession - ) - } - - @Provides - fun provideLoanUploader( - loanDao: LoanDao, - restClient: RestClient, - ivySession: IvySession - ): LoanUploader { - return LoanUploader( - dao = loanDao, - restClient = restClient, - ivySession = ivySession - ) - } - - @Provides - fun provideLoanRecordUploader( - dao: LoanRecordDao, - restClient: RestClient, - ivySession: IvySession - ): LoanRecordUploader { - return LoanRecordUploader( - dao = dao, - restClient = restClient, - ivySession = ivySession - ) - } - - @Provides - fun provideCategorySync( - sharedPrefs: SharedPrefs, - categoryDao: CategoryDao, - restClient: RestClient, - categoryUploader: CategoryUploader, - ivySession: IvySession - ): CategorySync { - return CategorySync( - sharedPrefs = sharedPrefs, - dao = categoryDao, - restClient = restClient, - uploader = categoryUploader, - ivySession = ivySession - ) - } - - @Provides - fun provideBudgetSync( - sharedPrefs: SharedPrefs, - budgetDao: BudgetDao, - restClient: RestClient, - budgetUploader: BudgetUploader, - ivySession: IvySession - ): BudgetSync { - return BudgetSync( - sharedPrefs = sharedPrefs, - dao = budgetDao, - restClient = restClient, - uploader = budgetUploader, - ivySession = ivySession - ) - } - - @Provides - fun provideLoanSync( - sharedPrefs: SharedPrefs, - dao: LoanDao, - restClient: RestClient, - loanUploader: LoanUploader, - ivySession: IvySession - ): LoanSync { - return LoanSync( - sharedPrefs = sharedPrefs, - dao = dao, - restClient = restClient, - uploader = loanUploader, - ivySession = ivySession - ) - } - - @Provides - fun provideLoanRecordSync( - sharedPrefs: SharedPrefs, - dao: LoanRecordDao, - restClient: RestClient, - uploader: LoanRecordUploader, - ivySession: IvySession - ): LoanRecordSync { - return LoanRecordSync( - sharedPrefs = sharedPrefs, - dao = dao, - restClient = restClient, - uploader = uploader, - ivySession = ivySession - ) - } - - @Provides - fun provideTransactionUploader( - transactionDao: TransactionDao, - restClient: RestClient, - ivySession: IvySession - ): TransactionUploader { - return TransactionUploader( - dao = transactionDao, - restClient = restClient, - ivySession = ivySession - ) - } - - @Provides - fun provideTransactionSync( - sharedPrefs: SharedPrefs, - transactionDao: TransactionDao, - restClient: RestClient, - transactionUploader: TransactionUploader, - ivySession: IvySession - ): TransactionSync { - return TransactionSync( - sharedPrefs = sharedPrefs, - dao = transactionDao, - restClient = restClient, - uploader = transactionUploader, - ivySession = ivySession - ) - } - - @Provides - fun providePlannedPaymentRuleUploader( - plannedPaymentRuleDao: PlannedPaymentRuleDao, - restClient: RestClient, - ivySession: IvySession - ): PlannedPaymentRuleUploader { - return PlannedPaymentRuleUploader( - dao = plannedPaymentRuleDao, - restClient = restClient, - ivySession = ivySession - ) - } - - @Provides - fun providePlannedPaymentSync( - sharedPrefs: SharedPrefs, - plannedPaymentRuleDao: PlannedPaymentRuleDao, - restClient: RestClient, - plannedPaymentRuleUploader: PlannedPaymentRuleUploader, - ivySession: IvySession - ): PlannedPaymentSync { - return PlannedPaymentSync( - sharedPrefs = sharedPrefs, - dao = plannedPaymentRuleDao, - restClient = restClient, - uploader = plannedPaymentRuleUploader, - ivySession = ivySession - ) - } - - @Provides - @Singleton - fun provideIvySync( - accountSync: AccountSync, - categorySync: CategorySync, - transactionSync: TransactionSync, - plannedPaymentSync: PlannedPaymentSync, - budgetSync: BudgetSync, - loanSync: LoanSync, - loanRecordSync: LoanRecordSync, - ivySession: IvySession - ): IvySync { - return IvySync( - accountSync = accountSync, - categorySync = categorySync, - transactionSync = transactionSync, - plannedPaymentSync = plannedPaymentSync, - budgetSync = budgetSync, - loanSync = loanSync, - loanRecordSync = loanRecordSync, - ivySession = ivySession - ) - } - - @Provides - fun providePlannedPaymentsLogic( - plannedPaymentRuleDao: PlannedPaymentRuleDao, - transactionDao: TransactionDao, - transactionUploader: TransactionUploader, - exchangeRatesLogic: ExchangeRatesLogic, - accountDao: AccountDao, - settingsDao: SettingsDao, - plannedPaymentRuleUploader: PlannedPaymentRuleUploader - ): PlannedPaymentsLogic { - return PlannedPaymentsLogic( - plannedPaymentRuleDao = plannedPaymentRuleDao, - transactionDao = transactionDao, - transactionUploader = transactionUploader, - accountDao = accountDao, - exchangeRatesLogic = exchangeRatesLogic, - settingsDao = settingsDao, - plannedPaymentRuleUploader = plannedPaymentRuleUploader - ) - } - - @Provides - @Singleton - fun provideIvyBilling( - ): IvyBilling { - return IvyBilling() - } - - @Provides - @Singleton - fun providepaywallLogic( - ivyBilling: IvyBilling, - ivyContext: IvyWalletCtx, - navigation: Navigation, - accountDao: AccountDao, - categoryDao: CategoryDao, - budgetDao: BudgetDao, - loanDao: LoanDao - ): PaywallLogic { - return PaywallLogic( - ivyBilling = ivyBilling, - ivyContext = ivyContext, - navigation = navigation, - accountDao = accountDao, - categoryDao = categoryDao, - budgetDao = budgetDao, - loanDao = loanDao - ) - } - - @Provides - @Singleton - fun provideIvyAnalytics( - sharedPrefs: SharedPrefs, - restClient: RestClient - ): IvyAnalytics { - return IvyAnalytics( - sharedPrefs = sharedPrefs, - restClient = restClient - ) - } - - @Provides - fun provideExportCSVLogic( - settingsDao: SettingsDao, - transactionDao: TransactionDao, - categoryDao: CategoryDao, - accountDao: AccountDao - ): ExportCSVLogic { - return ExportCSVLogic( - settingsDao = settingsDao, - transactionDao = transactionDao, - categoryDao = categoryDao, - accountDao = accountDao - ) - } - - @Provides - fun provideNotificationService( - @ApplicationContext appContext: Context - ): NotificationService { - return NotificationService(appContext) - } - - @Provides - fun provideTransactionReminderLogic( - @ApplicationContext appContext: Context, - sharedPrefs: SharedPrefs, - ): TransactionReminderLogic { - return TransactionReminderLogic( - appContext = appContext, - sharedPrefs = sharedPrefs - ) - } - - @Provides - fun provideFileReader( - @ApplicationContext appContext: Context - ): IvyFileReader { - return IvyFileReader( - appContext = appContext - ) - } - - @Provides - fun provideCSMNormalizer(): CSVNormalizer { - return CSVNormalizer() - } - - @Provides - fun provideCSVMapper(): CSVMapper { - return CSVMapper() - } - - @Provides - fun provideCSMImporter( - settingsDao: SettingsDao, - accountDao: AccountDao, - categoryDao: CategoryDao, - transactionDao: TransactionDao - ): CSVImporter { - return CSVImporter( - settingsDao = settingsDao, - accountDao = accountDao, - categoryDao = categoryDao, - transactionDao = transactionDao - ) - } - @Provides fun providePreloadDataLogic( accountDao: AccountDao, @@ -541,27 +128,14 @@ object AppModuleDI { return roomDatabase.exchangeRatesDao() } - @Provides - fun provideExchangeRatesLogic( - restClient: RestClient, - exchangeRateDao: ExchangeRateDao - ): ExchangeRatesLogic { - return ExchangeRatesLogic( - restClient = restClient, - exchangeRateDao = exchangeRateDao - ) - } - @Provides fun provideCategoryCreator( paywallLogic: PaywallLogic, categoryDao: CategoryDao, - categoryUploader: CategoryUploader ): CategoryCreator { return CategoryCreator( paywallLogic = paywallLogic, categoryDao = categoryDao, - categoryUploader = categoryUploader ) } @@ -569,12 +143,10 @@ object AppModuleDI { fun provideBudgetCreator( paywallLogic: PaywallLogic, budgetDao: BudgetDao, - budgetUploader: BudgetUploader ): BudgetCreator { return BudgetCreator( paywallLogic = paywallLogic, budgetDao = budgetDao, - budgetUploader = budgetUploader ) } @@ -582,12 +154,10 @@ object AppModuleDI { fun provideLoanCreator( paywallLogic: PaywallLogic, dao: LoanDao, - uploader: LoanUploader ): LoanCreator { return LoanCreator( paywallLogic = paywallLogic, dao = dao, - uploader = uploader ) } @@ -595,12 +165,10 @@ object AppModuleDI { fun provideLoanRecordCreator( paywallLogic: PaywallLogic, dao: LoanRecordDao, - uploader: LoanRecordUploader ): LoanRecordCreator { return LoanRecordCreator( paywallLogic = paywallLogic, dao = dao, - uploader = uploader ) } @@ -608,29 +176,23 @@ object AppModuleDI { fun provideAccountCreator( paywallLogic: PaywallLogic, accountDao: AccountDao, - accountUploader: AccountUploader, accountLogic: WalletAccountLogic, - transactionSync: TransactionSync ): AccountCreator { return AccountCreator( paywallLogic = paywallLogic, accountDao = accountDao, - transactionSync = transactionSync, accountLogic = accountLogic, - accountUploader = accountUploader, ) } @Provides fun provideLogoutLogic( ivyRoomDatabase: IvyRoomDatabase, - ivySession: IvySession, sharedPrefs: SharedPrefs, navigation: Navigation ): LogoutLogic { return LogoutLogic( ivyDb = ivyRoomDatabase, - ivySession = ivySession, sharedPrefs = sharedPrefs, navigation = navigation ) @@ -673,31 +235,6 @@ object AppModuleDI { ) } - @Provides - @Singleton - fun loanTransactionsCore( - categoryDao: CategoryDao, - transactionUploader: TransactionUploader, - transactionDao: TransactionDao, - ivyContext: IvyWalletCtx, - loanDao: LoanDao, - loanRecordDao: LoanRecordDao, - exchangeRatesLogic: ExchangeRatesLogic, - settingsDao: SettingsDao, - accountDao: AccountDao - ): LoanTransactionsCore { - return LoanTransactionsCore( - categoryDao = categoryDao, - transactionUploader = transactionUploader, - transactionDao = transactionDao, - ivyContext = ivyContext, - loanDao = loanDao, - loanRecordDao = loanRecordDao, - settingsDao = settingsDao, - accountsDao = accountDao, - exchangeRatesLogic = exchangeRatesLogic - ) - } @Provides fun loanTransactionsLogic(loanTransactionsCore: LoanTransactionsCore): LoanTransactionsLogic { @@ -706,39 +243,4 @@ object AppModuleDI { LoanRecord = LTLoanRecordMapper(ltCore = loanTransactionsCore) ) } - - @Provides - fun provideExpImagesService(): ExpImagesService = object : ExpImagesService { - override suspend fun fetchImages(): List { - val randDelay = Random.nextLong(from = 300, until = 1500) - delay(randDelay) - - val success = Random.nextBoolean() - return if (success) { - val res = mutableListOf() - - val images = listOf( - "https://stimg.cardekho.com/images/carexteriorimages/930x620/Lamborghini/Aventador/6721/Lamborghini-Aventador-SVJ/1621849426405/front-left-side-47.jpg", - "https://scuffedentertainment.com/wp-content/uploads/2021/11/what-car-suits-you-best-quiz.jpg", - "malformed_url", - "https://maserati.scene7.com/is/image/maserati/maserati/regional/us/models/my22/levante/22_LV_Trofeo_PS_T1_HomePage_1920x1080.jpg?\$1920x2000\$&fit=constrain", - "https://i.ytimg.com/vi/dip_8dmrcaU/maxresdefault.jpg", - "https://img.poki.com/cdn-cgi/image/quality=78,width=600,height=600,fit=cover,f=auto/94945631828bfdcf32a8ad0b79978913.png", - "https://pixelmedia.bg/wp-content/uploads/2021/08/Apple-Car.jpeg", - "https://www.teslarati.com/wp-content/uploads/2021/12/apple-car-patent.jpeg" - ) - - for (i in 0..50) { - res.addAll(images) - } - - res - } else { - throw NetworkError( - restError = RestError(ErrorCode.UNKNOWN, "Random error") - ) - } - } - - } } \ No newline at end of file diff --git a/app/src/main/java/com/ivy/wallet/android/billing/IvyBilling.kt b/app/src/main/java/com/ivy/wallet/android/billing/IvyBilling.kt index 9a9e0e96d1..cc6476aba3 100644 --- a/app/src/main/java/com/ivy/wallet/android/billing/IvyBilling.kt +++ b/app/src/main/java/com/ivy/wallet/android/billing/IvyBilling.kt @@ -16,8 +16,9 @@ import com.android.billingclient.api.querySkuDetails import com.ivy.wallet.utils.ioThread import com.ivy.wallet.utils.sendToCrashlytics import timber.log.Timber +import javax.inject.Inject -class IvyBilling( +class IvyBilling @Inject constructor( ) { companion object { diff --git a/app/src/main/java/com/ivy/wallet/android/notification/NotificationService.kt b/app/src/main/java/com/ivy/wallet/android/notification/NotificationService.kt index 4e8eaf38b0..2679f00afe 100644 --- a/app/src/main/java/com/ivy/wallet/android/notification/NotificationService.kt +++ b/app/src/main/java/com/ivy/wallet/android/notification/NotificationService.kt @@ -2,12 +2,14 @@ package com.ivy.wallet.android.notification import android.app.NotificationManager import android.content.Context -import android.os.Build import androidx.core.app.NotificationCompat import androidx.core.content.ContextCompat import com.ivy.wallet.R +import dagger.hilt.android.qualifiers.ApplicationContext +import javax.inject.Inject -class NotificationService( +class NotificationService @Inject constructor( + @ApplicationContext private val context: Context ) { diff --git a/app/src/main/java/com/ivy/wallet/domain/action/exchange/SyncExchangeRatesAct.kt b/app/src/main/java/com/ivy/wallet/domain/action/exchange/SyncExchangeRatesAct.kt index fb5db6e7b4..c5fb0203e8 100644 --- a/app/src/main/java/com/ivy/wallet/domain/action/exchange/SyncExchangeRatesAct.kt +++ b/app/src/main/java/com/ivy/wallet/domain/action/exchange/SyncExchangeRatesAct.kt @@ -1,22 +1,25 @@ package com.ivy.wallet.domain.action.exchange +import androidx.annotation.Keep import com.ivy.frp.action.Action -import com.ivy.wallet.io.network.RestClient import com.ivy.wallet.io.persistence.dao.ExchangeRateDao import com.ivy.wallet.io.persistence.data.ExchangeRateEntity +import dagger.Lazy +import io.ktor.client.HttpClient +import io.ktor.client.call.body +import io.ktor.client.request.get +import kotlinx.serialization.Serializable import timber.log.Timber import javax.inject.Inject class SyncExchangeRatesAct @Inject constructor( private val exchangeRateDao: ExchangeRateDao, - restClient: RestClient + private val ktorClient: Lazy, ) : Action() { data class Input( val baseCurrency: String, ) - private val service = restClient.exchangeRatesService - companion object { private val URLS = listOf( "https://cdn.jsdelivr.net/gh/fawazahmed0/currency-api@1/latest/currencies/eur.json", @@ -85,10 +88,17 @@ class SyncExchangeRatesAct @Inject constructor( private suspend fun fetchEurRates(url: String): Map { return try { - service.getExchangeRates(url).eur + val client = ktorClient.get() + client.get(url).body().eur } catch (e: Exception) { e.printStackTrace() emptyMap() } } + + @Keep + @Serializable + data class Response( + val eur: Map + ) } \ No newline at end of file diff --git a/app/src/main/java/com/ivy/wallet/domain/action/transaction/FetchAllTrnsFromServerAct.kt b/app/src/main/java/com/ivy/wallet/domain/action/transaction/FetchAllTrnsFromServerAct.kt deleted file mode 100644 index 31ac5b850d..0000000000 --- a/app/src/main/java/com/ivy/wallet/domain/action/transaction/FetchAllTrnsFromServerAct.kt +++ /dev/null @@ -1,42 +0,0 @@ -package com.ivy.wallet.domain.action.transaction - -import com.ivy.frp.action.FPAction -import com.ivy.frp.monad.Res -import com.ivy.frp.monad.tryOp -import com.ivy.wallet.Constants -import com.ivy.wallet.io.network.RestClient -import com.ivy.wallet.io.persistence.dao.TransactionDao -import javax.inject.Inject - -class FetchAllTrnsFromServerAct @Inject constructor( - restClient: RestClient, - private val transactionDao: TransactionDao -) : FPAction>() { - companion object { - private const val MAX_LIMIT_IF_SHIT_HAPPENS = 1000 - } - - private val transactionService = restClient.transactionService - - override suspend fun Unit.compose(): suspend () -> Res = tryOp( - operation = ::fetch - ) - - private suspend fun fetch() { - tailrec suspend fun fetchInternal(page: Int) { - val transactions = transactionService.getPaginated( - page = page, - size = Constants.PAGE_TRANSACTIONS_SIZE - ).transactions.map { it.toEntity() } - - transactionDao.save(transactions) - - if (transactions.isNotEmpty() && page < MAX_LIMIT_IF_SHIT_HAPPENS) { - //recurse - fetchInternal(page = page + 1) - } - } - - fetchInternal(page = 0) - } -} \ No newline at end of file diff --git a/app/src/main/java/com/ivy/wallet/domain/action/viewmodel/experiment/FetchImagesAct.kt b/app/src/main/java/com/ivy/wallet/domain/action/viewmodel/experiment/FetchImagesAct.kt deleted file mode 100644 index 5573fca341..0000000000 --- a/app/src/main/java/com/ivy/wallet/domain/action/viewmodel/experiment/FetchImagesAct.kt +++ /dev/null @@ -1,17 +0,0 @@ -package com.ivy.wallet.domain.action.viewmodel.experiment - -import com.ivy.frp.action.FPAction -import com.ivy.frp.monad.Res -import com.ivy.frp.monad.tryOp -import com.ivy.wallet.io.network.service.ExpImagesService -import javax.inject.Inject - -typealias FetchImagesRes = Res> - -class FetchImagesAct @Inject constructor( - private val expImagesService: ExpImagesService -) : FPAction() { - override suspend fun Unit.compose(): suspend () -> FetchImagesRes = tryOp( - operation = expImagesService::fetchImages - ) -} \ No newline at end of file diff --git a/app/src/main/java/com/ivy/wallet/domain/action/viewmodel/transaction/UploadTrnToServerAct.kt b/app/src/main/java/com/ivy/wallet/domain/action/viewmodel/transaction/UploadTrnToServerAct.kt deleted file mode 100644 index 886b5d790c..0000000000 --- a/app/src/main/java/com/ivy/wallet/domain/action/viewmodel/transaction/UploadTrnToServerAct.kt +++ /dev/null @@ -1,66 +0,0 @@ -package com.ivy.wallet.domain.action.viewmodel.transaction - -import com.ivy.frp.action.FPAction -import com.ivy.frp.monad.Res -import com.ivy.wallet.domain.data.core.Transaction -import com.ivy.wallet.io.network.IvySession -import com.ivy.wallet.io.network.RestClient -import com.ivy.wallet.io.persistence.dao.TransactionDao -import javax.inject.Inject - -class UploadTrnToServerAct @Inject constructor( - private val ivySession: IvySession, - restClient: RestClient, - private val dao: TransactionDao -) : FPAction>() { - private val service = restClient.transactionService - override suspend fun Transaction.compose(): suspend () -> Res { - TODO("Not yet implemented") - } - -// override suspend fun Transaction.compose(): suspend () -> Res = -// ivySession::isLoggedIn then { loggedIn -> -// if (loggedIn) Res.Ok(Unit) else Res.Err("User not logged in.") -// } thenIfSuccess tryOp { -// service.update( -// UpdateTransactionRequest( -// transaction = this.toDTO() -// ) -// ) -// } mapError { -// -// } thenIfSuccess { -// //flag as synced -// dao.save( -// this.copy( -// isSynced = true -// ).toEntity() -// ) -// -// Res.Ok(Unit) -// } -// -// suspend fun sync(item: Transaction) { -// if (!ivySession.isLoggedIn()) return -// -// try { -// //update -// service.update( -// UpdateTransactionRequest( -// transaction = item.toDTO() -// ) -// ) -// -// //flag as synced -// dao.save( -// item.copy( -// isSynced = true -// ).toEntity() -// ) -// Timber.d("Transaction updated: $item.") -// } catch (e: Exception) { -// Timber.e("Failed to update with error (${e.message}): $item") -// e.printStackTrace() -// } -// } -} \ No newline at end of file diff --git a/app/src/main/java/com/ivy/wallet/domain/data/core/Account.kt b/app/src/main/java/com/ivy/wallet/domain/data/core/Account.kt index e11d51d9b5..e0d68f1767 100644 --- a/app/src/main/java/com/ivy/wallet/domain/data/core/Account.kt +++ b/app/src/main/java/com/ivy/wallet/domain/data/core/Account.kt @@ -1,10 +1,9 @@ package com.ivy.wallet.domain.data.core import androidx.compose.ui.graphics.toArgb -import com.ivy.wallet.io.network.data.AccountDTO import com.ivy.wallet.io.persistence.data.AccountEntity import com.ivy.wallet.ui.theme.Green -import java.util.* +import java.util.UUID data class Account( val name: String, @@ -30,14 +29,4 @@ data class Account( isDeleted = isDeleted, id = id ) - - fun toDTO(): AccountDTO = AccountDTO( - name = name, - currency = currency, - color = color, - icon = icon, - orderNum = orderNum, - includeInBalance = includeInBalance, - id = id - ) } \ No newline at end of file diff --git a/app/src/main/java/com/ivy/wallet/domain/data/core/Budget.kt b/app/src/main/java/com/ivy/wallet/domain/data/core/Budget.kt index 8cafaaabe4..febd9b3b51 100644 --- a/app/src/main/java/com/ivy/wallet/domain/data/core/Budget.kt +++ b/app/src/main/java/com/ivy/wallet/domain/data/core/Budget.kt @@ -1,10 +1,9 @@ package com.ivy.wallet.domain.data.core import com.ivy.wallet.R -import com.ivy.wallet.io.network.data.BudgetDTO import com.ivy.wallet.io.persistence.data.BudgetEntity import com.ivy.wallet.stringRes -import java.util.* +import java.util.UUID data class Budget( val name: String, @@ -30,15 +29,6 @@ data class Budget( id = id, ) - fun toDTO(): BudgetDTO = BudgetDTO( - name = name, - amount = amount, - categoryIdsSerialized = categoryIdsSerialized, - accountIdsSerialized = accountIdsSerialized, - orderId = orderId, - id = id - ) - companion object { fun serialize(ids: List): String { return ids.joinToString(separator = ",") diff --git a/app/src/main/java/com/ivy/wallet/domain/data/core/Category.kt b/app/src/main/java/com/ivy/wallet/domain/data/core/Category.kt index 49ad3a650b..9e9e00509d 100644 --- a/app/src/main/java/com/ivy/wallet/domain/data/core/Category.kt +++ b/app/src/main/java/com/ivy/wallet/domain/data/core/Category.kt @@ -1,10 +1,9 @@ package com.ivy.wallet.domain.data.core import androidx.compose.ui.graphics.toArgb -import com.ivy.wallet.io.network.data.CategoryDTO import com.ivy.wallet.io.persistence.data.CategoryEntity import com.ivy.wallet.ui.theme.Ivy -import java.util.* +import java.util.UUID data class Category( val name: String, @@ -26,12 +25,4 @@ data class Category( isDeleted = isDeleted, id = id ) - - fun toDTO(): CategoryDTO = CategoryDTO( - name = name, - color = color, - icon = icon, - orderNum = orderNum, - id = id - ) } \ No newline at end of file diff --git a/app/src/main/java/com/ivy/wallet/domain/data/core/ExchangeRate.kt b/app/src/main/java/com/ivy/wallet/domain/data/core/ExchangeRate.kt index 7f2240e66b..5216bc1fb8 100644 --- a/app/src/main/java/com/ivy/wallet/domain/data/core/ExchangeRate.kt +++ b/app/src/main/java/com/ivy/wallet/domain/data/core/ExchangeRate.kt @@ -1,6 +1,5 @@ package com.ivy.wallet.domain.data.core -import com.ivy.wallet.io.network.data.ExchangeRateDTO import com.ivy.wallet.io.persistence.data.ExchangeRateEntity data class ExchangeRate( @@ -13,10 +12,4 @@ data class ExchangeRate( currency = currency, rate = rate ) - - fun toDTO(): ExchangeRateDTO = ExchangeRateDTO( - baseCurrency = baseCurrency, - currency = currency, - rate = rate - ) } \ No newline at end of file diff --git a/app/src/main/java/com/ivy/wallet/domain/data/core/Loan.kt b/app/src/main/java/com/ivy/wallet/domain/data/core/Loan.kt index c7b61efca6..529b8588ba 100644 --- a/app/src/main/java/com/ivy/wallet/domain/data/core/Loan.kt +++ b/app/src/main/java/com/ivy/wallet/domain/data/core/Loan.kt @@ -2,10 +2,9 @@ package com.ivy.wallet.domain.data.core import com.ivy.wallet.R import com.ivy.wallet.domain.data.LoanType -import com.ivy.wallet.io.network.data.LoanDTO import com.ivy.wallet.io.persistence.data.LoanEntity import com.ivy.wallet.stringRes -import java.util.* +import java.util.UUID data class Loan( val name: String, @@ -34,17 +33,6 @@ data class Loan( id = id ) - fun toDTO(): LoanDTO = LoanDTO( - name = name, - amount = amount, - type = type, - color = color, - icon = icon, - orderNum = orderNum, - accountId = accountId, - id = id - ) - fun humanReadableType(): String { return if (type == LoanType.BORROW) stringRes(R.string.borrowed_uppercase) else stringRes( R.string.lent_uppercase) diff --git a/app/src/main/java/com/ivy/wallet/domain/data/core/LoanRecord.kt b/app/src/main/java/com/ivy/wallet/domain/data/core/LoanRecord.kt index c0b72b7e4f..72fc1c7d3d 100644 --- a/app/src/main/java/com/ivy/wallet/domain/data/core/LoanRecord.kt +++ b/app/src/main/java/com/ivy/wallet/domain/data/core/LoanRecord.kt @@ -1,9 +1,8 @@ package com.ivy.wallet.domain.data.core -import com.ivy.wallet.io.network.data.LoanRecordDTO import com.ivy.wallet.io.persistence.data.LoanRecordEntity import java.time.LocalDateTime -import java.util.* +import java.util.UUID data class LoanRecord( val loanId: UUID, @@ -32,15 +31,4 @@ data class LoanRecord( isDeleted = isDeleted, id = id ) - - fun toDTO(): LoanRecordDTO = LoanRecordDTO( - loanId = loanId, - amount = amount, - note = note, - dateTime = dateTime, - interest = interest, - accountId = accountId, - convertedAmount = convertedAmount, - id = id - ) } \ No newline at end of file diff --git a/app/src/main/java/com/ivy/wallet/domain/data/core/PlannedPaymentRule.kt b/app/src/main/java/com/ivy/wallet/domain/data/core/PlannedPaymentRule.kt index dceb2a3a59..e6baeca7bb 100644 --- a/app/src/main/java/com/ivy/wallet/domain/data/core/PlannedPaymentRule.kt +++ b/app/src/main/java/com/ivy/wallet/domain/data/core/PlannedPaymentRule.kt @@ -2,10 +2,9 @@ package com.ivy.wallet.domain.data.core import com.ivy.wallet.domain.data.IntervalType import com.ivy.wallet.domain.data.TransactionType -import com.ivy.wallet.io.network.data.PlannedPaymentRuleDTO import com.ivy.wallet.io.persistence.data.PlannedPaymentRuleEntity import java.time.LocalDateTime -import java.util.* +import java.util.UUID data class PlannedPaymentRule( val startDate: LocalDateTime?, @@ -40,18 +39,4 @@ data class PlannedPaymentRule( isDeleted = isDeleted, id = id ) - - fun toDTO(): PlannedPaymentRuleDTO = PlannedPaymentRuleDTO( - startDate = startDate, - intervalN = intervalN, - intervalType = intervalType, - oneTime = oneTime, - type = type, - accountId = accountId, - amount = amount, - categoryId = categoryId, - title = title, - description = description, - id = id - ) } \ No newline at end of file diff --git a/app/src/main/java/com/ivy/wallet/domain/data/core/Settings.kt b/app/src/main/java/com/ivy/wallet/domain/data/core/Settings.kt index 3970eadd55..f7e89be0e2 100644 --- a/app/src/main/java/com/ivy/wallet/domain/data/core/Settings.kt +++ b/app/src/main/java/com/ivy/wallet/domain/data/core/Settings.kt @@ -1,10 +1,9 @@ package com.ivy.wallet.domain.data.core import com.ivy.design.l0_system.Theme -import com.ivy.wallet.io.network.data.SettingsDTO import com.ivy.wallet.io.persistence.data.SettingsEntity import java.math.BigDecimal -import java.util.* +import java.util.UUID data class Settings( val theme: Theme, @@ -21,12 +20,4 @@ data class Settings( name = name, id = id ) - - fun toDTO(): SettingsDTO = SettingsDTO( - theme = theme, - currency = baseCurrency, - bufferAmount = bufferAmount.toDouble(), - name = name, - id = id - ) } \ No newline at end of file diff --git a/app/src/main/java/com/ivy/wallet/domain/data/core/Transaction.kt b/app/src/main/java/com/ivy/wallet/domain/data/core/Transaction.kt index 73d937f149..275c5332e6 100644 --- a/app/src/main/java/com/ivy/wallet/domain/data/core/Transaction.kt +++ b/app/src/main/java/com/ivy/wallet/domain/data/core/Transaction.kt @@ -2,7 +2,6 @@ package com.ivy.wallet.domain.data.core import com.ivy.wallet.domain.data.TransactionHistoryItem import com.ivy.wallet.domain.data.TransactionType -import com.ivy.wallet.io.network.data.TransactionDTO import com.ivy.wallet.io.persistence.data.TransactionEntity import java.math.BigDecimal import java.time.LocalDateTime @@ -56,22 +55,4 @@ data class Transaction( isSynced = isSynced, isDeleted = isDeleted ) - - fun toDTO(): TransactionDTO = TransactionDTO( - accountId = accountId, - type = type, - amount = amount.toDouble(), - toAccountId = toAccountId, - toAmount = toAmount.toDouble(), - title = title, - description = description, - dateTime = dateTime, - categoryId = categoryId, - dueDate = dueDate, - recurringRuleId = recurringRuleId, - attachmentUrl = attachmentUrl, - loanId = loanId, - loanRecordId = loanRecordId, - id = id - ) } \ No newline at end of file diff --git a/app/src/main/java/com/ivy/wallet/domain/data/core/User.kt b/app/src/main/java/com/ivy/wallet/domain/data/core/User.kt index 031b6ca12d..03fb6732fb 100644 --- a/app/src/main/java/com/ivy/wallet/domain/data/core/User.kt +++ b/app/src/main/java/com/ivy/wallet/domain/data/core/User.kt @@ -1,9 +1,8 @@ package com.ivy.wallet.domain.data.core import com.ivy.wallet.domain.data.AuthProviderType -import com.ivy.wallet.io.network.data.UserDTO import com.ivy.wallet.io.persistence.data.UserEntity -import java.util.* +import java.util.UUID data class User( val email: String, @@ -27,16 +26,5 @@ data class User( id = id ) - fun toDTO(): UserDTO = UserDTO( - email = email, - authProviderType = authProviderType, - firstName = firstName, - lastName = lastName, - profilePicture = profilePicture, - color = color, - testUser = testUser, - id = id - ) - fun names(): String = firstName + if (lastName != null) " $lastName" else "" } \ No newline at end of file diff --git a/app/src/main/java/com/ivy/wallet/domain/deprecated/logic/AccountCreator.kt b/app/src/main/java/com/ivy/wallet/domain/deprecated/logic/AccountCreator.kt index d744d003bf..6680ede550 100644 --- a/app/src/main/java/com/ivy/wallet/domain/deprecated/logic/AccountCreator.kt +++ b/app/src/main/java/com/ivy/wallet/domain/deprecated/logic/AccountCreator.kt @@ -3,8 +3,6 @@ package com.ivy.wallet.domain.deprecated.logic import androidx.compose.ui.graphics.toArgb import com.ivy.wallet.domain.data.core.Account import com.ivy.wallet.domain.deprecated.logic.model.CreateAccountData -import com.ivy.wallet.domain.deprecated.sync.item.TransactionSync -import com.ivy.wallet.domain.deprecated.sync.uploader.AccountUploader import com.ivy.wallet.domain.pure.util.nextOrderNum import com.ivy.wallet.io.persistence.dao.AccountDao import com.ivy.wallet.utils.ioThread @@ -12,8 +10,6 @@ import com.ivy.wallet.utils.ioThread class AccountCreator( private val paywallLogic: PaywallLogic, private val accountDao: AccountDao, - private val accountUploader: AccountUploader, - private val transactionSync: TransactionSync, private val accountLogic: WalletAccountLogic ) { @@ -48,11 +44,6 @@ class AccountCreator( } onRefreshUI() - - ioThread { - accountUploader.sync(newAccount) - transactionSync.sync() - } } } @@ -75,10 +66,5 @@ class AccountCreator( } onRefreshUI() - - ioThread { - accountUploader.sync(updatedAccount) - transactionSync.sync() - } } } \ No newline at end of file diff --git a/app/src/main/java/com/ivy/wallet/domain/deprecated/logic/BudgetCreator.kt b/app/src/main/java/com/ivy/wallet/domain/deprecated/logic/BudgetCreator.kt index 18c52faac1..d017e6d1fe 100644 --- a/app/src/main/java/com/ivy/wallet/domain/deprecated/logic/BudgetCreator.kt +++ b/app/src/main/java/com/ivy/wallet/domain/deprecated/logic/BudgetCreator.kt @@ -2,7 +2,6 @@ package com.ivy.wallet.domain.deprecated.logic import com.ivy.wallet.domain.data.core.Budget import com.ivy.wallet.domain.deprecated.logic.model.CreateBudgetData -import com.ivy.wallet.domain.deprecated.sync.uploader.BudgetUploader import com.ivy.wallet.domain.pure.util.nextOrderNum import com.ivy.wallet.io.persistence.dao.BudgetDao import com.ivy.wallet.utils.ioThread @@ -10,7 +9,6 @@ import com.ivy.wallet.utils.ioThread class BudgetCreator( private val paywallLogic: PaywallLogic, private val budgetDao: BudgetDao, - private val budgetUploader: BudgetUploader ) { suspend fun createBudget( data: CreateBudgetData, @@ -39,10 +37,6 @@ class BudgetCreator( } onRefreshUI(newBudget) - - ioThread { - budgetUploader.sync(newBudget) - } } } catch (e: Exception) { e.printStackTrace() @@ -67,10 +61,6 @@ class BudgetCreator( } onRefreshUI(updatedBudget) - - ioThread { - budgetUploader.sync(updatedBudget) - } } catch (e: Exception) { e.printStackTrace() } @@ -86,10 +76,6 @@ class BudgetCreator( } onRefreshUI() - - ioThread { - budgetUploader.delete(budget.id) - } } catch (e: Exception) { e.printStackTrace() } diff --git a/app/src/main/java/com/ivy/wallet/domain/deprecated/logic/CategoryCreator.kt b/app/src/main/java/com/ivy/wallet/domain/deprecated/logic/CategoryCreator.kt index 0f356c4da8..4cbb4c6aa1 100644 --- a/app/src/main/java/com/ivy/wallet/domain/deprecated/logic/CategoryCreator.kt +++ b/app/src/main/java/com/ivy/wallet/domain/deprecated/logic/CategoryCreator.kt @@ -3,7 +3,6 @@ package com.ivy.wallet.domain.deprecated.logic import androidx.compose.ui.graphics.toArgb import com.ivy.wallet.domain.data.core.Category import com.ivy.wallet.domain.deprecated.logic.model.CreateCategoryData -import com.ivy.wallet.domain.deprecated.sync.uploader.CategoryUploader import com.ivy.wallet.domain.pure.util.nextOrderNum import com.ivy.wallet.io.persistence.dao.CategoryDao import com.ivy.wallet.utils.ioThread @@ -11,7 +10,6 @@ import com.ivy.wallet.utils.ioThread class CategoryCreator( private val paywallLogic: PaywallLogic, private val categoryDao: CategoryDao, - private val categoryUploader: CategoryUploader ) { suspend fun createCategory( data: CreateCategoryData, @@ -38,10 +36,6 @@ class CategoryCreator( } onRefreshUI(newCategory) - - ioThread { - categoryUploader.sync(newCategory) - } } } catch (e: Exception) { e.printStackTrace() @@ -65,10 +59,6 @@ class CategoryCreator( } onRefreshUI(updatedCategory) - - ioThread { - categoryUploader.sync(updatedCategory) - } } catch (e: Exception) { e.printStackTrace() } diff --git a/app/src/main/java/com/ivy/wallet/domain/deprecated/logic/LoanCreator.kt b/app/src/main/java/com/ivy/wallet/domain/deprecated/logic/LoanCreator.kt index 1d65906833..a0692aa916 100644 --- a/app/src/main/java/com/ivy/wallet/domain/deprecated/logic/LoanCreator.kt +++ b/app/src/main/java/com/ivy/wallet/domain/deprecated/logic/LoanCreator.kt @@ -3,16 +3,14 @@ package com.ivy.wallet.domain.deprecated.logic import androidx.compose.ui.graphics.toArgb import com.ivy.wallet.domain.data.core.Loan import com.ivy.wallet.domain.deprecated.logic.model.CreateLoanData -import com.ivy.wallet.domain.deprecated.sync.uploader.LoanUploader import com.ivy.wallet.domain.pure.util.nextOrderNum import com.ivy.wallet.io.persistence.dao.LoanDao import com.ivy.wallet.utils.ioThread -import java.util.* +import java.util.UUID class LoanCreator( private val paywallLogic: PaywallLogic, private val dao: LoanDao, - private val uploader: LoanUploader ) { suspend fun create( data: CreateLoanData, @@ -45,10 +43,6 @@ class LoanCreator( } onRefreshUI(newItem) - - ioThread { - uploader.sync(newItem) - } } } catch (e: Exception) { e.printStackTrace() @@ -75,10 +69,6 @@ class LoanCreator( } onRefreshUI(updatedItem) - - ioThread { - uploader.sync(updatedItem) - } } catch (e: Exception) { e.printStackTrace() } @@ -94,10 +84,6 @@ class LoanCreator( } onRefreshUI() - - ioThread { - uploader.delete(item.id) - } } catch (e: Exception) { e.printStackTrace() } diff --git a/app/src/main/java/com/ivy/wallet/domain/deprecated/logic/LoanRecordCreator.kt b/app/src/main/java/com/ivy/wallet/domain/deprecated/logic/LoanRecordCreator.kt index 29edb414bf..f7e58f4416 100644 --- a/app/src/main/java/com/ivy/wallet/domain/deprecated/logic/LoanRecordCreator.kt +++ b/app/src/main/java/com/ivy/wallet/domain/deprecated/logic/LoanRecordCreator.kt @@ -2,16 +2,14 @@ package com.ivy.wallet.domain.deprecated.logic import com.ivy.wallet.domain.data.core.LoanRecord import com.ivy.wallet.domain.deprecated.logic.model.CreateLoanRecordData -import com.ivy.wallet.domain.deprecated.sync.uploader.LoanRecordUploader import com.ivy.wallet.io.persistence.dao.LoanRecordDao import com.ivy.wallet.utils.ioThread -import java.util.* +import java.util.UUID @Deprecated("Use FP style, look into `domain.fp` package") class LoanRecordCreator( private val paywallLogic: PaywallLogic, private val dao: LoanRecordDao, - private val uploader: LoanRecordUploader ) { suspend fun create( loanId: UUID, @@ -41,10 +39,6 @@ class LoanRecordCreator( } onRefreshUI(newItem!!) - - ioThread { - uploader.sync(newItem!!) - } } return newItem?.id } catch (e: Exception) { @@ -70,10 +64,6 @@ class LoanRecordCreator( } onRefreshUI(updatedItem) - - ioThread { - uploader.sync(updatedItem) - } } catch (e: Exception) { e.printStackTrace() } @@ -89,10 +79,6 @@ class LoanRecordCreator( } onRefreshUI() - - ioThread { - uploader.delete(item.id) - } } catch (e: Exception) { e.printStackTrace() } diff --git a/app/src/main/java/com/ivy/wallet/domain/deprecated/logic/LogoutLogic.kt b/app/src/main/java/com/ivy/wallet/domain/deprecated/logic/LogoutLogic.kt index cbce2392e0..4ace30aab3 100644 --- a/app/src/main/java/com/ivy/wallet/domain/deprecated/logic/LogoutLogic.kt +++ b/app/src/main/java/com/ivy/wallet/domain/deprecated/logic/LogoutLogic.kt @@ -1,7 +1,6 @@ package com.ivy.wallet.domain.deprecated.logic import com.ivy.frp.view.navigation.Navigation -import com.ivy.wallet.io.network.IvySession import com.ivy.wallet.io.persistence.IvyRoomDatabase import com.ivy.wallet.io.persistence.SharedPrefs import com.ivy.wallet.ui.Main @@ -11,14 +10,12 @@ import com.ivy.wallet.utils.ioThread @Deprecated("Migrate to FP Style & Actions") class LogoutLogic( private val ivyDb: IvyRoomDatabase, - private val ivySession: IvySession, private val sharedPrefs: SharedPrefs, private val navigation: Navigation ) { suspend fun logout() { ioThread { ivyDb.reset() - ivySession.logout() sharedPrefs.removeAll() } @@ -27,9 +24,6 @@ class LogoutLogic( } suspend fun cloudLogout() { - ioThread { - ivySession.logout() - } navigation.navigateTo(Main); } diff --git a/app/src/main/java/com/ivy/wallet/domain/deprecated/logic/PaywallLogic.kt b/app/src/main/java/com/ivy/wallet/domain/deprecated/logic/PaywallLogic.kt index bfeee7940b..0a41f36566 100644 --- a/app/src/main/java/com/ivy/wallet/domain/deprecated/logic/PaywallLogic.kt +++ b/app/src/main/java/com/ivy/wallet/domain/deprecated/logic/PaywallLogic.kt @@ -13,9 +13,10 @@ import com.ivy.wallet.ui.IvyWalletCtx import com.ivy.wallet.ui.Paywall import com.ivy.wallet.ui.paywall.PaywallReason import com.ivy.wallet.utils.ioThread +import javax.inject.Inject @Deprecated("Migrate to FP Style & Actions") -class PaywallLogic( +class PaywallLogic @Inject constructor( private val ivyBilling: IvyBilling, private val ivyContext: IvyWalletCtx, private val navigation: Navigation, diff --git a/app/src/main/java/com/ivy/wallet/domain/deprecated/logic/PlannedPaymentsGenerator.kt b/app/src/main/java/com/ivy/wallet/domain/deprecated/logic/PlannedPaymentsGenerator.kt index fefb81070c..eaea1fc220 100644 --- a/app/src/main/java/com/ivy/wallet/domain/deprecated/logic/PlannedPaymentsGenerator.kt +++ b/app/src/main/java/com/ivy/wallet/domain/deprecated/logic/PlannedPaymentsGenerator.kt @@ -4,9 +4,10 @@ import com.ivy.wallet.domain.data.core.PlannedPaymentRule import com.ivy.wallet.domain.data.core.Transaction import com.ivy.wallet.io.persistence.dao.TransactionDao import java.time.LocalDateTime +import javax.inject.Inject @Deprecated("Migrate to FP Style") -class PlannedPaymentsGenerator( +class PlannedPaymentsGenerator @Inject constructor( private val transactionDao: TransactionDao ) { companion object { diff --git a/app/src/main/java/com/ivy/wallet/domain/deprecated/logic/PlannedPaymentsLogic.kt b/app/src/main/java/com/ivy/wallet/domain/deprecated/logic/PlannedPaymentsLogic.kt index 1d297edb4d..cb2407097d 100644 --- a/app/src/main/java/com/ivy/wallet/domain/deprecated/logic/PlannedPaymentsLogic.kt +++ b/app/src/main/java/com/ivy/wallet/domain/deprecated/logic/PlannedPaymentsLogic.kt @@ -7,8 +7,6 @@ import com.ivy.wallet.domain.data.core.PlannedPaymentRule import com.ivy.wallet.domain.data.core.Transaction import com.ivy.wallet.domain.deprecated.logic.currency.ExchangeRatesLogic import com.ivy.wallet.domain.deprecated.logic.currency.sumByDoublePlannedInBaseCurrency -import com.ivy.wallet.domain.deprecated.sync.uploader.PlannedPaymentRuleUploader -import com.ivy.wallet.domain.deprecated.sync.uploader.TransactionUploader import com.ivy.wallet.io.persistence.dao.AccountDao import com.ivy.wallet.io.persistence.dao.PlannedPaymentRuleDao import com.ivy.wallet.io.persistence.dao.SettingsDao @@ -16,16 +14,15 @@ import com.ivy.wallet.io.persistence.dao.TransactionDao import com.ivy.wallet.ui.onboarding.model.FromToTimeRange import com.ivy.wallet.utils.ioThread import com.ivy.wallet.utils.timeNowUTC +import javax.inject.Inject @Deprecated("Migrate to FP Style") -class PlannedPaymentsLogic( +class PlannedPaymentsLogic @Inject constructor( private val plannedPaymentRuleDao: PlannedPaymentRuleDao, private val transactionDao: TransactionDao, - private val transactionUploader: TransactionUploader, private val settingsDao: SettingsDao, private val exchangeRatesLogic: ExchangeRatesLogic, private val accountDao: AccountDao, - private val plannedPaymentRuleUploader: PlannedPaymentRuleUploader ) { companion object { private const val AVG_DAYS_IN_MONTH = 30.436875 @@ -180,17 +177,6 @@ class PlannedPaymentsLogic( } onUpdateUI(paidTransaction) - - ioThread { - if (syncTransaction && !skipTransaction) { - transactionUploader.sync(paidTransaction) - } - - if (plannedPaymentRule != null && plannedPaymentRule.oneTime) { - //delete paid oneTime planned payment rules - plannedPaymentRuleUploader.delete(plannedPaymentRule.id) - } - } } suspend fun payOrGet( @@ -238,20 +224,5 @@ class PlannedPaymentsLogic( } onUpdateUI(paidTransactions) - - ioThread { - paidTransactions.forEach{ paidTransaction -> - if (syncTransaction && !skipTransaction) { - transactionUploader.sync(paidTransaction) - } - } - - plannedPaymentRules.forEach{ plannedPaymentRule -> - if (plannedPaymentRule != null && plannedPaymentRule.oneTime) { - //delete paid oneTime planned payment rules - plannedPaymentRuleUploader.delete(plannedPaymentRule.id) - } - } - } } } \ No newline at end of file diff --git a/app/src/main/java/com/ivy/wallet/domain/deprecated/logic/csv/CSVImporter.kt b/app/src/main/java/com/ivy/wallet/domain/deprecated/logic/csv/CSVImporter.kt index 9389b9dff5..1db5a117c7 100644 --- a/app/src/main/java/com/ivy/wallet/domain/deprecated/logic/csv/CSVImporter.kt +++ b/app/src/main/java/com/ivy/wallet/domain/deprecated/logic/csv/CSVImporter.kt @@ -28,10 +28,11 @@ import java.io.StringReader import java.time.LocalDate import java.time.LocalDateTime import java.time.format.DateTimeFormatter -import java.util.* +import java.util.UUID +import javax.inject.Inject import kotlin.math.absoluteValue -class CSVImporter( +class CSVImporter @Inject constructor( private val settingsDao: SettingsDao, private val accountDao: AccountDao, private val categoryDao: CategoryDao, diff --git a/app/src/main/java/com/ivy/wallet/domain/deprecated/logic/csv/CSVMapper.kt b/app/src/main/java/com/ivy/wallet/domain/deprecated/logic/csv/CSVMapper.kt index 98c35a0015..8ff9557afb 100644 --- a/app/src/main/java/com/ivy/wallet/domain/deprecated/logic/csv/CSVMapper.kt +++ b/app/src/main/java/com/ivy/wallet/domain/deprecated/logic/csv/CSVMapper.kt @@ -6,8 +6,9 @@ import com.ivy.wallet.domain.deprecated.logic.csv.model.ImportType import com.ivy.wallet.domain.deprecated.logic.csv.model.JoinResult import com.ivy.wallet.domain.deprecated.logic.csv.model.RowMapping import com.ivy.wallet.utils.toLowerCaseLocal +import javax.inject.Inject -class CSVMapper { +class CSVMapper @Inject constructor() { @ExperimentalStdlibApi fun mapping(type: ImportType, headerRow: String?) = when (type) { diff --git a/app/src/main/java/com/ivy/wallet/domain/deprecated/logic/csv/CSVNormalizer.kt b/app/src/main/java/com/ivy/wallet/domain/deprecated/logic/csv/CSVNormalizer.kt index 4f1b4389c3..b39372a153 100644 --- a/app/src/main/java/com/ivy/wallet/domain/deprecated/logic/csv/CSVNormalizer.kt +++ b/app/src/main/java/com/ivy/wallet/domain/deprecated/logic/csv/CSVNormalizer.kt @@ -1,8 +1,9 @@ package com.ivy.wallet.domain.deprecated.logic.csv import com.ivy.wallet.domain.deprecated.logic.csv.model.ImportType +import javax.inject.Inject -class CSVNormalizer { +class CSVNormalizer @Inject constructor() { fun normalize(rawCSV: String, importType: ImportType): String { return when (importType) { diff --git a/app/src/main/java/com/ivy/wallet/domain/deprecated/logic/csv/ExportCSVLogic.kt b/app/src/main/java/com/ivy/wallet/domain/deprecated/logic/csv/ExportCSVLogic.kt index 498d5d48f7..9fc2511504 100644 --- a/app/src/main/java/com/ivy/wallet/domain/deprecated/logic/csv/ExportCSVLogic.kt +++ b/app/src/main/java/com/ivy/wallet/domain/deprecated/logic/csv/ExportCSVLogic.kt @@ -16,9 +16,10 @@ import com.ivy.wallet.utils.ioThread import com.ivy.wallet.utils.localDecimalSeparator import com.ivy.wallet.utils.writeToFile import org.apache.commons.text.StringEscapeUtils -import java.util.* +import java.util.UUID +import javax.inject.Inject -class ExportCSVLogic( +class ExportCSVLogic @Inject constructor( private val settingsDao: SettingsDao, private val transactionDao: TransactionDao, private val categoryDao: CategoryDao, diff --git a/app/src/main/java/com/ivy/wallet/domain/deprecated/logic/csv/IvyFileReader.kt b/app/src/main/java/com/ivy/wallet/domain/deprecated/logic/csv/IvyFileReader.kt index 0ad0b9c05a..8bd34f5b8f 100644 --- a/app/src/main/java/com/ivy/wallet/domain/deprecated/logic/csv/IvyFileReader.kt +++ b/app/src/main/java/com/ivy/wallet/domain/deprecated/logic/csv/IvyFileReader.kt @@ -3,9 +3,12 @@ package com.ivy.wallet.domain.deprecated.logic.csv import android.content.Context import android.net.Uri import com.ivy.wallet.utils.readFile +import dagger.hilt.android.qualifiers.ApplicationContext import java.nio.charset.Charset +import javax.inject.Inject -class IvyFileReader( +class IvyFileReader @Inject constructor( + @ApplicationContext private val appContext: Context ) { diff --git a/app/src/main/java/com/ivy/wallet/domain/deprecated/logic/currency/ExchangeRatesLogic.kt b/app/src/main/java/com/ivy/wallet/domain/deprecated/logic/currency/ExchangeRatesLogic.kt index 0c07564dc2..2b05c46905 100644 --- a/app/src/main/java/com/ivy/wallet/domain/deprecated/logic/currency/ExchangeRatesLogic.kt +++ b/app/src/main/java/com/ivy/wallet/domain/deprecated/logic/currency/ExchangeRatesLogic.kt @@ -3,15 +3,14 @@ package com.ivy.wallet.domain.deprecated.logic.currency import com.ivy.wallet.domain.data.core.Account import com.ivy.wallet.domain.data.core.PlannedPaymentRule import com.ivy.wallet.domain.data.core.Transaction -import com.ivy.wallet.io.network.RestClient import com.ivy.wallet.io.persistence.dao.AccountDao import com.ivy.wallet.io.persistence.dao.ExchangeRateDao import com.ivy.wallet.io.persistence.dao.SettingsDao -import java.util.* +import java.util.UUID +import javax.inject.Inject @Deprecated("Use FP style, look into `domain.fp` package") -class ExchangeRatesLogic( - restClient: RestClient, +class ExchangeRatesLogic @Inject constructor( private val exchangeRateDao: ExchangeRateDao ) { suspend fun amountBaseCurrency( diff --git a/app/src/main/java/com/ivy/wallet/domain/deprecated/logic/loantrasactions/LoanTransactionsCore.kt b/app/src/main/java/com/ivy/wallet/domain/deprecated/logic/loantrasactions/LoanTransactionsCore.kt index 82d4efe386..8fa7c77909 100644 --- a/app/src/main/java/com/ivy/wallet/domain/deprecated/logic/loantrasactions/LoanTransactionsCore.kt +++ b/app/src/main/java/com/ivy/wallet/domain/deprecated/logic/loantrasactions/LoanTransactionsCore.kt @@ -4,10 +4,18 @@ import androidx.compose.ui.graphics.toArgb import com.ivy.wallet.R import com.ivy.wallet.domain.data.LoanType import com.ivy.wallet.domain.data.TransactionType -import com.ivy.wallet.domain.data.core.* +import com.ivy.wallet.domain.data.core.Account +import com.ivy.wallet.domain.data.core.Category +import com.ivy.wallet.domain.data.core.Loan +import com.ivy.wallet.domain.data.core.LoanRecord +import com.ivy.wallet.domain.data.core.Transaction import com.ivy.wallet.domain.deprecated.logic.currency.ExchangeRatesLogic -import com.ivy.wallet.domain.deprecated.sync.uploader.TransactionUploader -import com.ivy.wallet.io.persistence.dao.* +import com.ivy.wallet.io.persistence.dao.AccountDao +import com.ivy.wallet.io.persistence.dao.CategoryDao +import com.ivy.wallet.io.persistence.dao.LoanDao +import com.ivy.wallet.io.persistence.dao.LoanRecordDao +import com.ivy.wallet.io.persistence.dao.SettingsDao +import com.ivy.wallet.io.persistence.dao.TransactionDao import com.ivy.wallet.stringRes import com.ivy.wallet.ui.IvyWalletCtx import com.ivy.wallet.ui.theme.components.IVY_COLOR_PICKER_COLORS_FREE @@ -18,11 +26,12 @@ import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.launch import java.time.LocalDateTime -import java.util.* +import java.util.Locale +import java.util.UUID +import javax.inject.Inject -class LoanTransactionsCore( +class LoanTransactionsCore @Inject constructor( private val categoryDao: CategoryDao, - private val transactionUploader: TransactionUploader, private val transactionDao: TransactionDao, private val ivyContext: IvyWalletCtx, private val loanRecordDao: LoanRecordDao, @@ -173,10 +182,6 @@ class LoanTransactionsCore( transaction?.let { transactionDao.flagDeleted(it.id) } - - transaction?.let { - transactionUploader.delete(it.id) - } } } diff --git a/app/src/main/java/com/ivy/wallet/domain/deprecated/logic/notification/TransactionReminderLogic.kt b/app/src/main/java/com/ivy/wallet/domain/deprecated/logic/notification/TransactionReminderLogic.kt index 79b6a5e742..206879dce3 100644 --- a/app/src/main/java/com/ivy/wallet/domain/deprecated/logic/notification/TransactionReminderLogic.kt +++ b/app/src/main/java/com/ivy/wallet/domain/deprecated/logic/notification/TransactionReminderLogic.kt @@ -7,10 +7,13 @@ import androidx.work.WorkManager import com.ivy.wallet.io.persistence.SharedPrefs import com.ivy.wallet.utils.timeNowLocal import com.ivy.wallet.utils.toEpochSeconds +import dagger.hilt.android.qualifiers.ApplicationContext import java.util.concurrent.TimeUnit +import javax.inject.Inject @Deprecated("Use FP style, look into `domain.fp` package") -class TransactionReminderLogic( +class TransactionReminderLogic @Inject constructor( + @ApplicationContext private val appContext: Context, private val sharedPrefs: SharedPrefs, ) { diff --git a/app/src/main/java/com/ivy/wallet/domain/deprecated/sync/IvySync.kt b/app/src/main/java/com/ivy/wallet/domain/deprecated/sync/IvySync.kt deleted file mode 100644 index 6e6d1588c7..0000000000 --- a/app/src/main/java/com/ivy/wallet/domain/deprecated/sync/IvySync.kt +++ /dev/null @@ -1,45 +0,0 @@ -package com.ivy.wallet.domain.deprecated.sync - -import com.ivy.wallet.domain.deprecated.sync.item.* -import com.ivy.wallet.io.network.IvySession - -class IvySync( - private val accountSync: AccountSync, - private val categorySync: CategorySync, - private val budgetSync: BudgetSync, - private val transactionSync: TransactionSync, - private val plannedPaymentSync: PlannedPaymentSync, - private val loanSync: LoanSync, - private val loanRecordSync: LoanRecordSync, - private val ivySession: IvySession -) { - suspend fun isSynced(): Boolean { - return accountSync.isSynced() && - categorySync.isSynced() && - transactionSync.isSynced() && - plannedPaymentSync.isSynced() && - budgetSync.isSynced() && - loanSync.isSynced() && - loanRecordSync.isSynced() - } - - suspend fun sync() { - if (ivySession.isLoggedIn()) { - accountSync.sync() - categorySync.sync() - transactionSync.sync() - plannedPaymentSync.sync() - budgetSync.sync() - loanSync.sync() - loanRecordSync.sync() - } - } - - suspend fun syncCategories() { - categorySync.sync() - } - - suspend fun syncAccounts() { - accountSync.sync() - } -} \ No newline at end of file diff --git a/app/src/main/java/com/ivy/wallet/domain/deprecated/sync/item/AccountSync.kt b/app/src/main/java/com/ivy/wallet/domain/deprecated/sync/item/AccountSync.kt deleted file mode 100644 index 0aa9f1184b..0000000000 --- a/app/src/main/java/com/ivy/wallet/domain/deprecated/sync/item/AccountSync.kt +++ /dev/null @@ -1,76 +0,0 @@ -package com.ivy.wallet.domain.deprecated.sync.item - -import com.ivy.wallet.domain.deprecated.sync.uploader.AccountUploader -import com.ivy.wallet.io.network.IvySession -import com.ivy.wallet.io.network.RestClient -import com.ivy.wallet.io.persistence.SharedPrefs -import com.ivy.wallet.io.persistence.dao.AccountDao -import com.ivy.wallet.utils.timeNowUTC -import com.ivy.wallet.utils.toEpochSeconds - -class AccountSync( - private val sharedPrefs: SharedPrefs, - private val dao: AccountDao, - restClient: RestClient, - private val uploader: AccountUploader, - private val ivySession: IvySession -) { - private val service = restClient.accountService - - suspend fun isSynced(): Boolean = - dao.findByIsSyncedAndIsDeleted(synced = false, deleted = false).isEmpty() && - dao.findByIsSyncedAndIsDeleted(synced = false, deleted = true).isEmpty() - - suspend fun sync() { - if (!ivySession.isLoggedIn()) return - - val syncStart = timeNowUTC().toEpochSeconds() - - uploadUpdated() - deleteDeleted() - fetchNew() - - sharedPrefs.putLong(SharedPrefs.LAST_SYNC_DATE_ACCOUNTS, syncStart) - } - - private suspend fun uploadUpdated() { - val toSync = dao.findByIsSyncedAndIsDeleted( - synced = false, - deleted = false - ) - - for (item in toSync) { - uploader.sync(item.toDomain()) - } - } - - private suspend fun deleteDeleted() { - val toDelete = dao.findByIsSyncedAndIsDeleted( - synced = false, - deleted = true - ) - - for (item in toDelete) { - uploader.delete(item.id) - } - } - - private suspend fun fetchNew() { - try { - val afterTimestamp = sharedPrefs.getEpochSeconds(SharedPrefs.LAST_SYNC_DATE_ACCOUNTS) - - val response = service.get(after = afterTimestamp) - - response.accounts.forEach { item -> - dao.save( - item.toEntity().copy( - isSynced = true, - isDeleted = false - ) - ) - } - } catch (e: Exception) { - e.printStackTrace() - } - } -} \ No newline at end of file diff --git a/app/src/main/java/com/ivy/wallet/domain/deprecated/sync/item/BudgetSync.kt b/app/src/main/java/com/ivy/wallet/domain/deprecated/sync/item/BudgetSync.kt deleted file mode 100644 index 2b6f644cd4..0000000000 --- a/app/src/main/java/com/ivy/wallet/domain/deprecated/sync/item/BudgetSync.kt +++ /dev/null @@ -1,76 +0,0 @@ -package com.ivy.wallet.domain.deprecated.sync.item - -import com.ivy.wallet.domain.deprecated.sync.uploader.BudgetUploader -import com.ivy.wallet.io.network.IvySession -import com.ivy.wallet.io.network.RestClient -import com.ivy.wallet.io.persistence.SharedPrefs -import com.ivy.wallet.io.persistence.dao.BudgetDao -import com.ivy.wallet.utils.timeNowUTC -import com.ivy.wallet.utils.toEpochSeconds - -class BudgetSync( - private val sharedPrefs: SharedPrefs, - private val dao: BudgetDao, - restClient: RestClient, - private val uploader: BudgetUploader, - private val ivySession: IvySession -) { - private val service = restClient.budgetService - - suspend fun isSynced(): Boolean = - dao.findByIsSyncedAndIsDeleted(synced = false, deleted = false).isEmpty() && - dao.findByIsSyncedAndIsDeleted(synced = false, deleted = true).isEmpty() - - suspend fun sync() { - if (!ivySession.isLoggedIn()) return - - val syncStart = timeNowUTC().toEpochSeconds() - - uploadUpdated() - deleteDeleted() - fetchNew() - - sharedPrefs.putLong(SharedPrefs.LAST_SYNC_DATE_BUDGETS, syncStart) - } - - private suspend fun uploadUpdated() { - val toSync = dao.findByIsSyncedAndIsDeleted( - synced = false, - deleted = false - ) - - for (item in toSync) { - uploader.sync(item.toDomain()) - } - } - - private suspend fun deleteDeleted() { - val toDelete = dao.findByIsSyncedAndIsDeleted( - synced = false, - deleted = true - ) - - for (item in toDelete) { - uploader.delete(item.id) - } - } - - private suspend fun fetchNew() { - try { - val afterTimestamp = sharedPrefs.getEpochSeconds(SharedPrefs.LAST_SYNC_DATE_BUDGETS) - - val response = service.get(after = afterTimestamp) - - response.budgets.forEach { item -> - dao.save( - item.toEntity().copy( - isSynced = true, - isDeleted = false - ) - ) - } - } catch (e: Exception) { - e.printStackTrace() - } - } -} \ No newline at end of file diff --git a/app/src/main/java/com/ivy/wallet/domain/deprecated/sync/item/CategorySync.kt b/app/src/main/java/com/ivy/wallet/domain/deprecated/sync/item/CategorySync.kt deleted file mode 100644 index 3d9146b160..0000000000 --- a/app/src/main/java/com/ivy/wallet/domain/deprecated/sync/item/CategorySync.kt +++ /dev/null @@ -1,76 +0,0 @@ -package com.ivy.wallet.domain.deprecated.sync.item - -import com.ivy.wallet.domain.deprecated.sync.uploader.CategoryUploader -import com.ivy.wallet.io.network.IvySession -import com.ivy.wallet.io.network.RestClient -import com.ivy.wallet.io.persistence.SharedPrefs -import com.ivy.wallet.io.persistence.dao.CategoryDao -import com.ivy.wallet.utils.timeNowUTC -import com.ivy.wallet.utils.toEpochSeconds - -class CategorySync( - private val sharedPrefs: SharedPrefs, - private val dao: CategoryDao, - restClient: RestClient, - private val uploader: CategoryUploader, - private val ivySession: IvySession -) { - private val service = restClient.categoryService - - suspend fun isSynced(): Boolean = - dao.findByIsSyncedAndIsDeleted(synced = false, deleted = false).isEmpty() && - dao.findByIsSyncedAndIsDeleted(synced = false, deleted = true).isEmpty() - - suspend fun sync() { - if (!ivySession.isLoggedIn()) return - - val syncStart = timeNowUTC().toEpochSeconds() - - uploadUpdated() - deleteDeleted() - fetchNew() - - sharedPrefs.putLong(SharedPrefs.LAST_SYNC_DATE_CATEGORIES, syncStart) - } - - private suspend fun uploadUpdated() { - val toSync = dao.findByIsSyncedAndIsDeleted( - synced = false, - deleted = false - ) - - for (item in toSync) { - uploader.sync(item.toDomain()) - } - } - - private suspend fun deleteDeleted() { - val toDelete = dao.findByIsSyncedAndIsDeleted( - synced = false, - deleted = true - ) - - for (item in toDelete) { - uploader.delete(item.id) - } - } - - private suspend fun fetchNew() { - try { - val afterTimestamp = sharedPrefs.getEpochSeconds(SharedPrefs.LAST_SYNC_DATE_CATEGORIES) - - val response = service.get(after = afterTimestamp) - - response.categories.forEach { item -> - dao.save( - item.toEntity().copy( - isSynced = true, - isDeleted = false - ) - ) - } - } catch (e: Exception) { - e.printStackTrace() - } - } -} \ No newline at end of file diff --git a/app/src/main/java/com/ivy/wallet/domain/deprecated/sync/item/LoanRecordSync.kt b/app/src/main/java/com/ivy/wallet/domain/deprecated/sync/item/LoanRecordSync.kt deleted file mode 100644 index 38f48e19f5..0000000000 --- a/app/src/main/java/com/ivy/wallet/domain/deprecated/sync/item/LoanRecordSync.kt +++ /dev/null @@ -1,77 +0,0 @@ -package com.ivy.wallet.domain.deprecated.sync.item - -import com.ivy.wallet.domain.deprecated.sync.uploader.LoanRecordUploader -import com.ivy.wallet.io.network.IvySession -import com.ivy.wallet.io.network.RestClient -import com.ivy.wallet.io.persistence.SharedPrefs -import com.ivy.wallet.io.persistence.dao.LoanRecordDao -import com.ivy.wallet.utils.timeNowUTC -import com.ivy.wallet.utils.toEpochSeconds - -class LoanRecordSync( - private val sharedPrefs: SharedPrefs, - private val dao: LoanRecordDao, - restClient: RestClient, - private val uploader: LoanRecordUploader, - private val ivySession: IvySession -) { - private val service = restClient.loanService - - suspend fun isSynced(): Boolean = - dao.findByIsSyncedAndIsDeleted(synced = false, deleted = false).isEmpty() && - dao.findByIsSyncedAndIsDeleted(synced = false, deleted = true).isEmpty() - - suspend fun sync() { - if (!ivySession.isLoggedIn()) return - - val syncStart = timeNowUTC().toEpochSeconds() - - uploadUpdated() - deleteDeleted() - fetchNew() - - sharedPrefs.putLong(SharedPrefs.LAST_SYNC_DATE_LOAN_RECORDS, syncStart) - } - - private suspend fun uploadUpdated() { - val toSync = dao.findByIsSyncedAndIsDeleted( - synced = false, - deleted = false - ) - - for (item in toSync) { - uploader.sync(item.toDomain()) - } - } - - private suspend fun deleteDeleted() { - val toDelete = dao.findByIsSyncedAndIsDeleted( - synced = false, - deleted = true - ) - - for (item in toDelete) { - uploader.delete(item.id) - } - } - - private suspend fun fetchNew() { - try { - val afterTimestamp = - sharedPrefs.getEpochSeconds(SharedPrefs.LAST_SYNC_DATE_LOAN_RECORDS) - - val response = service.getRecords(after = afterTimestamp) - - response.loanRecords.forEach { item -> - dao.save( - item.toEntity().copy( - isSynced = true, - isDeleted = false - ) - ) - } - } catch (e: Exception) { - e.printStackTrace() - } - } -} \ No newline at end of file diff --git a/app/src/main/java/com/ivy/wallet/domain/deprecated/sync/item/LoanSync.kt b/app/src/main/java/com/ivy/wallet/domain/deprecated/sync/item/LoanSync.kt deleted file mode 100644 index 243d05c56a..0000000000 --- a/app/src/main/java/com/ivy/wallet/domain/deprecated/sync/item/LoanSync.kt +++ /dev/null @@ -1,76 +0,0 @@ -package com.ivy.wallet.domain.deprecated.sync.item - -import com.ivy.wallet.domain.deprecated.sync.uploader.LoanUploader -import com.ivy.wallet.io.network.IvySession -import com.ivy.wallet.io.network.RestClient -import com.ivy.wallet.io.persistence.SharedPrefs -import com.ivy.wallet.io.persistence.dao.LoanDao -import com.ivy.wallet.utils.timeNowUTC -import com.ivy.wallet.utils.toEpochSeconds - -class LoanSync( - private val sharedPrefs: SharedPrefs, - private val dao: LoanDao, - restClient: RestClient, - private val uploader: LoanUploader, - private val ivySession: IvySession -) { - private val service = restClient.loanService - - suspend fun isSynced(): Boolean = - dao.findByIsSyncedAndIsDeleted(synced = false, deleted = false).isEmpty() && - dao.findByIsSyncedAndIsDeleted(synced = false, deleted = true).isEmpty() - - suspend fun sync() { - if (!ivySession.isLoggedIn()) return - - val syncStart = timeNowUTC().toEpochSeconds() - - uploadUpdated() - deleteDeleted() - fetchNew() - - sharedPrefs.putLong(SharedPrefs.LAST_SYNC_DATE_LOANS, syncStart) - } - - private suspend fun uploadUpdated() { - val toSync = dao.findByIsSyncedAndIsDeleted( - synced = false, - deleted = false - ) - - for (item in toSync) { - uploader.sync(item.toDomain()) - } - } - - private suspend fun deleteDeleted() { - val toDelete = dao.findByIsSyncedAndIsDeleted( - synced = false, - deleted = true - ) - - for (item in toDelete) { - uploader.delete(item.id) - } - } - - private suspend fun fetchNew() { - try { - val afterTimestamp = sharedPrefs.getEpochSeconds(SharedPrefs.LAST_SYNC_DATE_LOANS) - - val response = service.get(after = afterTimestamp) - - response.loans.forEach { item -> - dao.save( - item.toEntity().copy( - isSynced = true, - isDeleted = false - ) - ) - } - } catch (e: Exception) { - e.printStackTrace() - } - } -} \ No newline at end of file diff --git a/app/src/main/java/com/ivy/wallet/domain/deprecated/sync/item/PlannedPaymentSync.kt b/app/src/main/java/com/ivy/wallet/domain/deprecated/sync/item/PlannedPaymentSync.kt deleted file mode 100644 index aa2ad770a7..0000000000 --- a/app/src/main/java/com/ivy/wallet/domain/deprecated/sync/item/PlannedPaymentSync.kt +++ /dev/null @@ -1,78 +0,0 @@ -package com.ivy.wallet.domain.deprecated.sync.item - -import com.ivy.wallet.domain.deprecated.sync.uploader.PlannedPaymentRuleUploader -import com.ivy.wallet.io.network.IvySession -import com.ivy.wallet.io.network.RestClient -import com.ivy.wallet.io.persistence.SharedPrefs -import com.ivy.wallet.io.persistence.dao.PlannedPaymentRuleDao -import com.ivy.wallet.utils.timeNowUTC -import com.ivy.wallet.utils.toEpochSeconds - -class PlannedPaymentSync( - private val sharedPrefs: SharedPrefs, - private val dao: PlannedPaymentRuleDao, - restClient: RestClient, - private val uploader: PlannedPaymentRuleUploader, - private val ivySession: IvySession -) { - private val service = restClient.plannedPaymentRuleService - - suspend fun isSynced(): Boolean = - dao.findByIsSyncedAndIsDeleted(synced = false, deleted = false).isEmpty() && - dao.findByIsSyncedAndIsDeleted(synced = false, deleted = true).isEmpty() - - suspend fun sync() { - if (!ivySession.isLoggedIn()) return - - - val syncStart = timeNowUTC().toEpochSeconds() - - uploadUpdated() - deleteDeleted() - fetchNew() - - sharedPrefs.putLong(SharedPrefs.LAST_SYNC_DATE_PLANNED_PAYMENTS, syncStart) - } - - private suspend fun uploadUpdated() { - val toSync = dao.findByIsSyncedAndIsDeleted( - synced = false, - deleted = false - ) - - for (item in toSync) { - uploader.sync(item.toDomain()) - } - } - - private suspend fun deleteDeleted() { - val toDelete = dao.findByIsSyncedAndIsDeleted( - synced = false, - deleted = true - ) - - for (item in toDelete) { - uploader.delete(item.id) - } - } - - private suspend fun fetchNew() { - try { - val afterTimestamp = - sharedPrefs.getEpochSeconds(SharedPrefs.LAST_SYNC_DATE_PLANNED_PAYMENTS) - - val response = service.get(after = afterTimestamp) - - response.rules.forEach { item -> - dao.save( - item.toEntity().copy( - isSynced = true, - isDeleted = false - ) - ) - } - } catch (e: Exception) { - e.printStackTrace() - } - } -} \ No newline at end of file diff --git a/app/src/main/java/com/ivy/wallet/domain/deprecated/sync/item/TransactionSync.kt b/app/src/main/java/com/ivy/wallet/domain/deprecated/sync/item/TransactionSync.kt deleted file mode 100644 index 5c65746124..0000000000 --- a/app/src/main/java/com/ivy/wallet/domain/deprecated/sync/item/TransactionSync.kt +++ /dev/null @@ -1,77 +0,0 @@ -package com.ivy.wallet.domain.deprecated.sync.item - -import com.ivy.wallet.domain.deprecated.sync.uploader.TransactionUploader -import com.ivy.wallet.io.network.IvySession -import com.ivy.wallet.io.network.RestClient -import com.ivy.wallet.io.persistence.SharedPrefs -import com.ivy.wallet.io.persistence.dao.TransactionDao -import com.ivy.wallet.utils.timeNowUTC -import com.ivy.wallet.utils.toEpochSeconds - -class TransactionSync( - private val sharedPrefs: SharedPrefs, - private val dao: TransactionDao, - restClient: RestClient, - private val uploader: TransactionUploader, - private val ivySession: IvySession -) { - private val service = restClient.transactionService - - suspend fun isSynced(): Boolean = - dao.findByIsSyncedAndIsDeleted(synced = false, deleted = false).isEmpty() && - dao.findByIsSyncedAndIsDeleted(synced = false, deleted = true).isEmpty() - - suspend fun sync() { - if (!ivySession.isLoggedIn()) return - - val syncStart = timeNowUTC().toEpochSeconds() - - uploadUpdated() - deleteDeleted() - fetchNew() - - sharedPrefs.putLong(SharedPrefs.LAST_SYNC_DATE_TRANSACTIONS, syncStart) - } - - private suspend fun uploadUpdated() { - val toSync = dao.findByIsSyncedAndIsDeleted( - synced = false, - deleted = false - ) - - for (item in toSync) { - uploader.sync(item.toDomain()) - } - } - - private suspend fun deleteDeleted() { - val toDelete = dao.findByIsSyncedAndIsDeleted( - synced = false, - deleted = true - ) - - for (item in toDelete) { - uploader.delete(item.id) - } - } - - private suspend fun fetchNew() { - try { - val afterTimestamp = - sharedPrefs.getEpochSeconds(SharedPrefs.LAST_SYNC_DATE_TRANSACTIONS) - - val response = service.get(after = afterTimestamp) - - response.transactions.forEach { item -> - dao.save( - item.toEntity().copy( - isSynced = true, - isDeleted = false - ) - ) - } - } catch (e: Exception) { - e.printStackTrace() - } - } -} \ No newline at end of file diff --git a/app/src/main/java/com/ivy/wallet/domain/deprecated/sync/uploader/AccountUploader.kt b/app/src/main/java/com/ivy/wallet/domain/deprecated/sync/uploader/AccountUploader.kt deleted file mode 100644 index a71735cab2..0000000000 --- a/app/src/main/java/com/ivy/wallet/domain/deprecated/sync/uploader/AccountUploader.kt +++ /dev/null @@ -1,71 +0,0 @@ -package com.ivy.wallet.domain.deprecated.sync.uploader - -import com.ivy.wallet.domain.data.core.Account -import com.ivy.wallet.io.network.IvySession -import com.ivy.wallet.io.network.RestClient -import com.ivy.wallet.io.network.request.account.DeleteAccountRequest -import com.ivy.wallet.io.network.request.account.UpdateAccountRequest -import com.ivy.wallet.io.persistence.dao.AccountDao -import com.ivy.wallet.io.persistence.dao.TransactionDao -import timber.log.Timber -import java.util.* - -class AccountUploader( - private val accountDao: AccountDao, - private val transactionDao: TransactionDao, - restClient: RestClient, - private val ivySession: IvySession -) { - private val service = restClient.accountService - - suspend fun sync(item: Account) { - if (!ivySession.isLoggedIn()) return - - try { - //update - service.update( - UpdateAccountRequest( - account = item.toDTO() - ) - ) - - //flag as synced - accountDao.save( - item.copy( - isSynced = true - ).toEntity() - ) - Timber.d("Account updated: $item.") - } catch (e: Exception) { - Timber.e("Failed to update with error (${e.message}): $item") - e.printStackTrace() - } - } - - - suspend fun delete(id: UUID) { - if (!ivySession.isLoggedIn()) return - - try { - //Delete on server - service.delete( - DeleteAccountRequest( - id = id - ) - ) - - //delete from local db - transactionDao.deleteAllByAccountId(id) - accountDao.deleteById(id) - Timber.d("Account deleted: $id.") - } catch (e: Exception) { - Timber.e("Failed to delete with error (${e.message}): $id") - e.printStackTrace() - - //delete from local db - transactionDao.deleteAllByAccountId(id) - accountDao.deleteById(id) - } - } - -} \ No newline at end of file diff --git a/app/src/main/java/com/ivy/wallet/domain/deprecated/sync/uploader/BudgetUploader.kt b/app/src/main/java/com/ivy/wallet/domain/deprecated/sync/uploader/BudgetUploader.kt deleted file mode 100644 index 17d609d890..0000000000 --- a/app/src/main/java/com/ivy/wallet/domain/deprecated/sync/uploader/BudgetUploader.kt +++ /dev/null @@ -1,67 +0,0 @@ -package com.ivy.wallet.domain.deprecated.sync.uploader - -import com.ivy.wallet.domain.data.core.Budget -import com.ivy.wallet.io.network.IvySession -import com.ivy.wallet.io.network.RestClient -import com.ivy.wallet.io.network.request.budget.CrupdateBudgetRequest -import com.ivy.wallet.io.network.request.budget.DeleteBudgetRequest -import com.ivy.wallet.io.persistence.dao.BudgetDao -import timber.log.Timber -import java.util.* - -class BudgetUploader( - private val dao: BudgetDao, - restClient: RestClient, - private val ivySession: IvySession -) { - private val service = restClient.budgetService - - suspend fun sync(item: Budget) { - if (!ivySession.isLoggedIn()) return - - try { - //update - service.update( - CrupdateBudgetRequest( - budget = item.toDTO() - ) - ) - - //flag as synced - dao.save( - item.copy( - isSynced = true - ).toEntity() - ) - Timber.d("Budget updated: $item.") - } catch (e: Exception) { - Timber.e("Failed to update with error (${e.message}): $item") - e.printStackTrace() - } - } - - - suspend fun delete(id: UUID) { - if (!ivySession.isLoggedIn()) return - - try { - //Delete on server - service.delete( - DeleteBudgetRequest( - id = id - ) - ) - - //delete from local db - dao.deleteById(id) - Timber.d("Budget deleted: $id.") - } catch (e: Exception) { - Timber.e("Failed to delete with error (${e.message}): $id") - e.printStackTrace() - - //delete from local db - dao.deleteById(id) - } - } - -} \ No newline at end of file diff --git a/app/src/main/java/com/ivy/wallet/domain/deprecated/sync/uploader/CategoryUploader.kt b/app/src/main/java/com/ivy/wallet/domain/deprecated/sync/uploader/CategoryUploader.kt deleted file mode 100644 index c0d452bdd1..0000000000 --- a/app/src/main/java/com/ivy/wallet/domain/deprecated/sync/uploader/CategoryUploader.kt +++ /dev/null @@ -1,67 +0,0 @@ -package com.ivy.wallet.domain.deprecated.sync.uploader - -import com.ivy.wallet.domain.data.core.Category -import com.ivy.wallet.io.network.IvySession -import com.ivy.wallet.io.network.RestClient -import com.ivy.wallet.io.network.request.category.DeleteWalletCategoryRequest -import com.ivy.wallet.io.network.request.category.UpdateWalletCategoryRequest -import com.ivy.wallet.io.persistence.dao.CategoryDao -import timber.log.Timber -import java.util.* - -class CategoryUploader( - private val dao: CategoryDao, - restClient: RestClient, - private val ivySession: IvySession -) { - private val service = restClient.categoryService - - suspend fun sync(item: Category) { - if (!ivySession.isLoggedIn()) return - - try { - //update - service.update( - UpdateWalletCategoryRequest( - category = item.toDTO() - ) - ) - - //flag as synced - dao.save( - item.copy( - isSynced = true - ).toEntity() - ) - Timber.d("Category updated: $item.") - } catch (e: Exception) { - Timber.e("Failed to update with error (${e.message}): $item") - e.printStackTrace() - } - } - - - suspend fun delete(id: UUID) { - if (!ivySession.isLoggedIn()) return - - try { - //Delete on server - service.delete( - DeleteWalletCategoryRequest( - id = id - ) - ) - - //delete from local db - dao.deleteById(id) - Timber.d("Category deleted: $id.") - } catch (e: Exception) { - Timber.e("Failed to delete with error (${e.message}): $id") - e.printStackTrace() - - //delete from local db - dao.deleteById(id) - } - } - -} \ No newline at end of file diff --git a/app/src/main/java/com/ivy/wallet/domain/deprecated/sync/uploader/LoanRecordUploader.kt b/app/src/main/java/com/ivy/wallet/domain/deprecated/sync/uploader/LoanRecordUploader.kt deleted file mode 100644 index 14809c41ff..0000000000 --- a/app/src/main/java/com/ivy/wallet/domain/deprecated/sync/uploader/LoanRecordUploader.kt +++ /dev/null @@ -1,67 +0,0 @@ -package com.ivy.wallet.domain.deprecated.sync.uploader - -import com.ivy.wallet.domain.data.core.LoanRecord -import com.ivy.wallet.io.network.IvySession -import com.ivy.wallet.io.network.RestClient -import com.ivy.wallet.io.network.request.loan.DeleteLoanRecordRequest -import com.ivy.wallet.io.network.request.loan.UpdateLoanRecordRequest -import com.ivy.wallet.io.persistence.dao.LoanRecordDao -import timber.log.Timber -import java.util.* - -class LoanRecordUploader( - private val dao: LoanRecordDao, - restClient: RestClient, - private val ivySession: IvySession -) { - private val service = restClient.loanService - - suspend fun sync(item: LoanRecord) { - if (!ivySession.isLoggedIn()) return - - try { - //update - service.updateRecord( - UpdateLoanRecordRequest( - loanRecord = item.toDTO() - ) - ) - - //flag as synced - dao.save( - item.copy( - isSynced = true - ).toEntity() - ) - Timber.d("Loan record updated: $item.") - } catch (e: Exception) { - Timber.e("Failed to update with error (${e.message}): $item") - e.printStackTrace() - } - } - - - suspend fun delete(id: UUID) { - if (!ivySession.isLoggedIn()) return - - try { - //Delete on server - service.deleteRecord( - DeleteLoanRecordRequest( - id = id - ) - ) - - //delete from local db - dao.deleteById(id) - Timber.d("Loan record deleted: $id.") - } catch (e: Exception) { - Timber.e("Failed to delete with error (${e.message}): $id") - e.printStackTrace() - - //delete from local db - dao.deleteById(id) - } - } - -} \ No newline at end of file diff --git a/app/src/main/java/com/ivy/wallet/domain/deprecated/sync/uploader/LoanUploader.kt b/app/src/main/java/com/ivy/wallet/domain/deprecated/sync/uploader/LoanUploader.kt deleted file mode 100644 index 5ddb17d2af..0000000000 --- a/app/src/main/java/com/ivy/wallet/domain/deprecated/sync/uploader/LoanUploader.kt +++ /dev/null @@ -1,67 +0,0 @@ -package com.ivy.wallet.domain.deprecated.sync.uploader - -import com.ivy.wallet.domain.data.core.Loan -import com.ivy.wallet.io.network.IvySession -import com.ivy.wallet.io.network.RestClient -import com.ivy.wallet.io.network.request.loan.DeleteLoanRequest -import com.ivy.wallet.io.network.request.loan.UpdateLoanRequest -import com.ivy.wallet.io.persistence.dao.LoanDao -import timber.log.Timber -import java.util.* - -class LoanUploader( - private val dao: LoanDao, - restClient: RestClient, - private val ivySession: IvySession -) { - private val service = restClient.loanService - - suspend fun sync(item: Loan) { - if (!ivySession.isLoggedIn()) return - - try { - //update - service.update( - UpdateLoanRequest( - loan = item.toDTO() - ) - ) - - //flag as synced - dao.save( - item.copy( - isSynced = true - ).toEntity() - ) - Timber.d("Loan updated: $item.") - } catch (e: Exception) { - Timber.e("Failed to update with error (${e.message}): $item") - e.printStackTrace() - } - } - - - suspend fun delete(id: UUID) { - if (!ivySession.isLoggedIn()) return - - try { - //Delete on server - service.delete( - DeleteLoanRequest( - id = id - ) - ) - - //delete from local db - dao.deleteById(id) - Timber.d("Loan deleted: $id.") - } catch (e: Exception) { - Timber.e("Failed to delete with error (${e.message}): $id") - e.printStackTrace() - - //delete from local db - dao.deleteById(id) - } - } - -} \ No newline at end of file diff --git a/app/src/main/java/com/ivy/wallet/domain/deprecated/sync/uploader/PlannedPaymentRuleUploader.kt b/app/src/main/java/com/ivy/wallet/domain/deprecated/sync/uploader/PlannedPaymentRuleUploader.kt deleted file mode 100644 index a4d264f6dc..0000000000 --- a/app/src/main/java/com/ivy/wallet/domain/deprecated/sync/uploader/PlannedPaymentRuleUploader.kt +++ /dev/null @@ -1,67 +0,0 @@ -package com.ivy.wallet.domain.deprecated.sync.uploader - -import com.ivy.wallet.domain.data.core.PlannedPaymentRule -import com.ivy.wallet.io.network.IvySession -import com.ivy.wallet.io.network.RestClient -import com.ivy.wallet.io.network.request.planned.DeletePlannedPaymentRuleRequest -import com.ivy.wallet.io.network.request.planned.UpdatePlannedPaymentRuleRequest -import com.ivy.wallet.io.persistence.dao.PlannedPaymentRuleDao -import timber.log.Timber -import java.util.* - -class PlannedPaymentRuleUploader( - private val dao: PlannedPaymentRuleDao, - restClient: RestClient, - private val ivySession: IvySession -) { - private val service = restClient.plannedPaymentRuleService - - suspend fun sync(item: PlannedPaymentRule) { - if (!ivySession.isLoggedIn()) return - - try { - //update - service.update( - UpdatePlannedPaymentRuleRequest( - rule = item.toDTO() - ) - ) - - //flag as synced - dao.save( - item.copy( - isSynced = true - ).toEntity() - ) - Timber.d("PlannedPaymentRule updated: $item.") - } catch (e: Exception) { - Timber.e("Failed to update with error (${e.message}): $item") - e.printStackTrace() - } - } - - - suspend fun delete(id: UUID) { - if (!ivySession.isLoggedIn()) return - - try { - //Delete on server - service.delete( - DeletePlannedPaymentRuleRequest( - id = id - ) - ) - - //delete from local db - dao.deleteById(id) - Timber.d("PlannedPaymentRule deleted: $id.") - } catch (e: Exception) { - Timber.e("Failed to delete with error (${e.message}): $id") - e.printStackTrace() - - //delete from local db - dao.deleteById(id) - } - } - -} \ No newline at end of file diff --git a/app/src/main/java/com/ivy/wallet/domain/deprecated/sync/uploader/TransactionUploader.kt b/app/src/main/java/com/ivy/wallet/domain/deprecated/sync/uploader/TransactionUploader.kt deleted file mode 100644 index 78cdabd6d5..0000000000 --- a/app/src/main/java/com/ivy/wallet/domain/deprecated/sync/uploader/TransactionUploader.kt +++ /dev/null @@ -1,67 +0,0 @@ -package com.ivy.wallet.domain.deprecated.sync.uploader - -import com.ivy.wallet.domain.data.core.Transaction -import com.ivy.wallet.io.network.IvySession -import com.ivy.wallet.io.network.RestClient -import com.ivy.wallet.io.network.request.transaction.DeleteTransactionRequest -import com.ivy.wallet.io.network.request.transaction.UpdateTransactionRequest -import com.ivy.wallet.io.persistence.dao.TransactionDao -import timber.log.Timber -import java.util.* - -class TransactionUploader( - private val dao: TransactionDao, - restClient: RestClient, - private val ivySession: IvySession -) { - private val service = restClient.transactionService - - suspend fun sync(item: Transaction) { - if (!ivySession.isLoggedIn()) return - - try { - //update - service.update( - UpdateTransactionRequest( - transaction = item.toDTO() - ) - ) - - //flag as synced - dao.save( - item.copy( - isSynced = true - ).toEntity() - ) - Timber.d("Transaction updated: $item.") - } catch (e: Exception) { - Timber.e("Failed to update with error (${e.message}): $item") - e.printStackTrace() - } - } - - - suspend fun delete(id: UUID) { - if (!ivySession.isLoggedIn()) return - - try { - //Delete on server - service.delete( - DeleteTransactionRequest( - id = id - ) - ) - - //delete from local db - dao.deleteById(id) - Timber.d("Transaction deleted: $id.") - } catch (e: Exception) { - Timber.e("Failed to delete with error (${e.message}): $id") - e.printStackTrace() - - //delete from local db - dao.deleteById(id) - } - } - -} \ No newline at end of file diff --git a/app/src/main/java/com/ivy/wallet/io/network/GsonTypeAdapters.kt b/app/src/main/java/com/ivy/wallet/io/network/GsonTypeAdapters.kt deleted file mode 100644 index ddd3f2da15..0000000000 --- a/app/src/main/java/com/ivy/wallet/io/network/GsonTypeAdapters.kt +++ /dev/null @@ -1,46 +0,0 @@ -package com.ivy.wallet.io.network - -import com.google.gson.TypeAdapter -import com.google.gson.stream.JsonReader -import com.google.gson.stream.JsonWriter -import com.ivy.wallet.io.network.error.ErrorCode -import com.ivy.wallet.utils.epochSecondToDateTime -import com.ivy.wallet.utils.toEpochSeconds -import java.time.LocalDateTime - -class LocalDateTimeTypeAdapter : TypeAdapter() { - override fun write(out: JsonWriter, date: LocalDateTime?) { - date?.let { - out.value(it.toEpochSeconds()) - } ?: out.nullValue() - } - - override fun read(jsonIn: JsonReader): LocalDateTime? { - return try { - val timestampSeconds = jsonIn.nextLong() - timestampSeconds.epochSecondToDateTime() - } catch (e: Exception) { - jsonIn.nextNull() - null - } - } -} - -class ErrorCodeTypeAdapter : TypeAdapter() { - override fun write(out: JsonWriter, value: ErrorCode?) { - value?.let { - out.value(value.code) - } ?: out.nullValue() - } - - override fun read(jsonIn: JsonReader): ErrorCode { - return try { - val code = jsonIn.nextInt() - ErrorCode.values().find { it.code == code } ?: ErrorCode.UNKNOWN - } catch (e: Exception) { - jsonIn.nextNull() - ErrorCode.UNKNOWN - } - } - -} \ No newline at end of file diff --git a/app/src/main/java/com/ivy/wallet/io/network/IvyAnalytics.kt b/app/src/main/java/com/ivy/wallet/io/network/IvyAnalytics.kt deleted file mode 100644 index 0471ef4d22..0000000000 --- a/app/src/main/java/com/ivy/wallet/io/network/IvyAnalytics.kt +++ /dev/null @@ -1,45 +0,0 @@ -package com.ivy.wallet.io.network - -import com.ivy.wallet.BuildConfig -import com.ivy.wallet.domain.data.analytics.AnalyticsEvent -import com.ivy.wallet.io.network.request.analytics.LogEventRequest -import com.ivy.wallet.io.persistence.SharedPrefs -import com.ivy.wallet.utils.ioThread -import java.util.* - -class IvyAnalytics( - private val sharedPrefs: SharedPrefs, - restClient: RestClient -) { - private val service = restClient.analyticsService - - private lateinit var sessionId: UUID - - fun loadSession() { - var sessionIdStr = sharedPrefs.getString(SharedPrefs.ANALYTICS_SESSION_ID, null) - if (sessionIdStr == null) { - sessionIdStr = UUID.randomUUID().toString() - sharedPrefs.putString(SharedPrefs.ANALYTICS_SESSION_ID, sessionIdStr) - } - sessionId = UUID.fromString(sessionIdStr) - } - - suspend fun logEvent(name: String) { - if (BuildConfig.DEBUG) return - - ioThread { - try { - service.logEvent( - LogEventRequest( - event = AnalyticsEvent( - name = name, - sessionId = sessionId - ) - ) - ) - } catch (e: Exception) { - e.printStackTrace() - } - } - } -} \ No newline at end of file diff --git a/app/src/main/java/com/ivy/wallet/io/network/IvySession.kt b/app/src/main/java/com/ivy/wallet/io/network/IvySession.kt deleted file mode 100644 index ee97ca3e69..0000000000 --- a/app/src/main/java/com/ivy/wallet/io/network/IvySession.kt +++ /dev/null @@ -1,49 +0,0 @@ -package com.ivy.wallet.io.network - -import com.ivy.wallet.io.network.request.auth.AuthResponse -import com.ivy.wallet.io.persistence.SharedPrefs -import com.ivy.wallet.io.persistence.dao.UserDao -import java.util.* - -class IvySession( - private val sharedPrefs: SharedPrefs, - private val userDao: UserDao -) { - private var userId: UUID? = null - private var authToken: String? = null - - fun loadFromCache() { -// userId = sharedPrefs.getString(SharedPrefs.SESSION_USER_ID, null) -// ?.let { UUID.fromString(it) } -// authToken = sharedPrefs.getString(SharedPrefs.SESSION_AUTH_TOKEN, null) - } - - fun getSessionToken() = authToken ?: throw NoSessionException() - - fun getUserId(): UUID = userId ?: throw NoSessionException() - - fun getUserIdSafe(): UUID? = userId - - fun isLoggedIn(): Boolean = false - - suspend fun initiate(authResponse: AuthResponse) { - val user = authResponse.user - userDao.save(user.toEntity()) - - sharedPrefs.putString(SharedPrefs.SESSION_USER_ID, user.id.toString()) - sharedPrefs.putString(SharedPrefs.SESSION_AUTH_TOKEN, authResponse.sessionToken) - - userId = authResponse.user.id - authToken = authResponse.sessionToken - } - - fun logout() { - sharedPrefs.remove(SharedPrefs.SESSION_USER_ID) - sharedPrefs.remove(SharedPrefs.SESSION_AUTH_TOKEN) - - userId = null - authToken = null - } -} - -class NoSessionException : IllegalStateException("No session.") \ No newline at end of file diff --git a/app/src/main/java/com/ivy/wallet/io/network/RestClient.kt b/app/src/main/java/com/ivy/wallet/io/network/RestClient.kt deleted file mode 100644 index 79039640c3..0000000000 --- a/app/src/main/java/com/ivy/wallet/io/network/RestClient.kt +++ /dev/null @@ -1,189 +0,0 @@ -package com.ivy.wallet.io.network - -import android.annotation.SuppressLint -import android.content.Context -import android.net.ConnectivityManager -import android.net.Network -import androidx.annotation.Keep -import com.google.gson.Gson -import com.ivy.wallet.BuildConfig -import com.ivy.wallet.io.network.error.ErrorCode -import com.ivy.wallet.io.network.error.NetworkError -import com.ivy.wallet.io.network.error.RestError -import com.ivy.wallet.io.network.service.* -import okhttp3.Interceptor -import okhttp3.OkHttpClient -import okhttp3.logging.HttpLoggingInterceptor -import retrofit2.Retrofit -import retrofit2.converter.gson.GsonConverterFactory -import timber.log.Timber -import java.security.SecureRandom -import java.security.cert.CertificateException -import java.security.cert.X509Certificate -import java.util.concurrent.TimeUnit -import javax.net.ssl.HostnameVerifier -import javax.net.ssl.SSLContext -import javax.net.ssl.TrustManager -import javax.net.ssl.X509TrustManager - -@Keep -class RestClient private constructor( - private val appContext: Context, - private val retrofit: Retrofit -) { - - companion object { - private const val API_URL = "https://ivy-apps.com" - private const val HEADER_USER_ID = "userId" - private const val HEADER_SESSION_TOKEN = "sessionToken" - - private var networkAvailable = false - - fun initialize(appContext: Context, session: IvySession, gson: Gson): RestClient { - val retrofit = newRetrofit(gson, session) - return RestClient(appContext, retrofit).apply { - monitorNetworkConnectivity() - } - } - - private fun newRetrofit(gson: Gson, session: IvySession): Retrofit { - val httpClientBuilder = OkHttpClient.Builder() - .connectTimeout(5, TimeUnit.SECONDS) - .readTimeout(15, TimeUnit.SECONDS) - .callTimeout(15, TimeUnit.SECONDS) - - if (BuildConfig.DEBUG) { - val loggingInterceptor = HttpLoggingInterceptor().apply { - setLevel(HttpLoggingInterceptor.Level.BODY) - } - - httpClientBuilder.addInterceptor(loggingInterceptor) - } - - - //Add AUTH headers - httpClientBuilder.addInterceptor { - try { - val request = it.request() - .newBuilder() - .addHeader(HEADER_USER_ID, session.getUserId().toString()) - .addHeader(HEADER_SESSION_TOKEN, session.getSessionToken()) - .build() - - it.proceed(request) - } catch (e: NoSessionException) { - //Session not initialized, yet - do nothing - it.proceed(it.request()) - } - } - - //Handle Server errors - httpClientBuilder.addInterceptor(Interceptor { chain -> - val response = chain.proceed(chain.request()) - - if (response.code < 200 || response.code > 299) { - response.body?.string()?.let { errorBody -> - try { - Timber.e("Server error: $errorBody") - val restError = gson.fromJson( - errorBody, - RestError::class.java - ) ?: RestError(ErrorCode.UNKNOWN, "Failed to parse RestError.") - throw NetworkError(restError) - } catch (exception: Exception) { - throw if (exception is NetworkError) exception else { - exception.printStackTrace() - NetworkError(RestError(ErrorCode.UNKNOWN, exception.message)) - } - } - } ?: throw NetworkError(RestError(ErrorCode.UNKNOWN, "Empty error body.")) - } - response - }) - - trustAllSSLCertificates(httpClientBuilder) - - return Retrofit.Builder() - .baseUrl(API_URL) - .client(httpClientBuilder.build()) - .addConverterFactory(GsonConverterFactory.create(gson)) - .build() - } - - @SuppressLint("TrustAllX509TrustManager") - fun trustAllSSLCertificates(okHttpBuilder: OkHttpClient.Builder) { - //TODO: SECURITY - Considering trusting only Ivy's cert - val trustAllCerts = arrayOf( - object : X509TrustManager { - @Throws(CertificateException::class) - override fun checkClientTrusted( - chain: Array?, - authType: String? - ) { - } - - @Throws(CertificateException::class) - override fun checkServerTrusted( - chain: Array?, - authType: String? - ) { - } - - override fun getAcceptedIssuers(): Array? { - return arrayOf() - } - } - ) - - // Install the all-trusting trust manager - val sslContext = SSLContext.getInstance("SSL") - sslContext.init(null, trustAllCerts, SecureRandom()) - // Create an ssl socket factory with our all-trusting manager - // Create an ssl socket factory with our all-trusting manager - val sslSocketFactory = sslContext.socketFactory - - okHttpBuilder.sslSocketFactory(sslSocketFactory, (trustAllCerts[0] as X509TrustManager)) - okHttpBuilder.hostnameVerifier(HostnameVerifier { hostname, session -> - true - }) - } - } - - private fun monitorNetworkConnectivity() { - val connectivityManager = - appContext.getSystemService(Context.CONNECTIVITY_SERVICE) as ConnectivityManager - - connectivityManager.registerDefaultNetworkCallback(object : - ConnectivityManager.NetworkCallback() { - override fun onAvailable(network: Network) { - networkAvailable = true - Timber.d("Network available: $network. (networkAvailable = $networkAvailable)") - } - - override fun onLost(network: Network) { - networkAvailable = false - Timber.d("Network lost: $network. (networkAvailable = $networkAvailable)") - } - - override fun onUnavailable() { - networkAvailable = false - Timber.d("Network unavailable. (networkAvailable = $networkAvailable)") - } - }) - } - - val authService: AuthService by lazy { retrofit.create(AuthService::class.java) } - val categoryService: CategoryService by lazy { retrofit.create(CategoryService::class.java) } - val accountService: AccountService by lazy { retrofit.create(AccountService::class.java) } - val budgetService: BudgetService by lazy { retrofit.create(BudgetService::class.java) } - val loanService: LoanService by lazy { retrofit.create(LoanService::class.java) } - val transactionService: TransactionService by lazy { retrofit.create(TransactionService::class.java) } - val plannedPaymentRuleService: PlannedPaymentRuleService by lazy { - retrofit.create( - PlannedPaymentRuleService::class.java - ) - } - val analyticsService: AnalyticsService by lazy { retrofit.create(AnalyticsService::class.java) } - val exchangeRatesService: ExchangeRatesService by lazy { retrofit.create(ExchangeRatesService::class.java) } - val nukeService: NukeService by lazy { retrofit.create(NukeService::class.java) } -} \ No newline at end of file diff --git a/app/src/main/java/com/ivy/wallet/io/network/data/AccountDTO.kt b/app/src/main/java/com/ivy/wallet/io/network/data/AccountDTO.kt deleted file mode 100644 index 37f758c248..0000000000 --- a/app/src/main/java/com/ivy/wallet/io/network/data/AccountDTO.kt +++ /dev/null @@ -1,30 +0,0 @@ -package com.ivy.wallet.io.network.data - -import androidx.compose.ui.graphics.toArgb -import com.ivy.wallet.io.persistence.data.AccountEntity -import com.ivy.wallet.ui.theme.Green -import java.util.* - -data class AccountDTO( - val name: String, - val currency: String? = null, - val color: Int = Green.toArgb(), - val icon: String? = null, - val orderNum: Double = 0.0, - val includeInBalance: Boolean = true, - - val id: UUID = UUID.randomUUID() -) { - fun toEntity(): AccountEntity = AccountEntity( - name = name, - currency = currency, - color = color, - icon = icon, - orderNum = orderNum, - includeInBalance = includeInBalance, - id = id, - isSynced = true, - isDeleted = false - ) -} - diff --git a/app/src/main/java/com/ivy/wallet/io/network/data/BudgetDTO.kt b/app/src/main/java/com/ivy/wallet/io/network/data/BudgetDTO.kt deleted file mode 100644 index c3e395afc8..0000000000 --- a/app/src/main/java/com/ivy/wallet/io/network/data/BudgetDTO.kt +++ /dev/null @@ -1,66 +0,0 @@ -package com.ivy.wallet.io.network.data - -import com.ivy.wallet.io.persistence.data.BudgetEntity -import java.util.* - -data class BudgetDTO( - val name: String, - val amount: Double, - - val categoryIdsSerialized: String?, - val accountIdsSerialized: String?, - - val orderId: Double, - val id: UUID = UUID.randomUUID() -) { - fun toEntity(): BudgetEntity = BudgetEntity( - name = name, - amount = amount, - categoryIdsSerialized = categoryIdsSerialized, - accountIdsSerialized = accountIdsSerialized, - orderId = orderId, - id = id, - isSynced = true, - isDeleted = false - ) - - companion object { - fun serialize(ids: List): String { - return ids.joinToString(separator = ",") - } - - fun type(categoriesCount: Int): String { - return when (categoriesCount) { - 0 -> "Total Budget" - 1 -> "Category Budget" - else -> "Multi-Category ($categoriesCount) Budget" - } - } - } - - fun parseCategoryIds(): List { - return parseIdsString(categoryIdsSerialized) - } - - fun parseAccountIds(): List { - return parseIdsString(accountIdsSerialized) - } - - private fun parseIdsString(idsString: String?): List { - return try { - if (idsString == null) return emptyList() - - idsString - .split(",") - .map { UUID.fromString(it) } - } catch (e: Exception) { - e.printStackTrace() - emptyList() - } - } - - - fun validate(): Boolean { - return name.isNotEmpty() && amount > 0.0 - } -} \ No newline at end of file diff --git a/app/src/main/java/com/ivy/wallet/io/network/data/CategoryDTO.kt b/app/src/main/java/com/ivy/wallet/io/network/data/CategoryDTO.kt deleted file mode 100644 index 7446f8184e..0000000000 --- a/app/src/main/java/com/ivy/wallet/io/network/data/CategoryDTO.kt +++ /dev/null @@ -1,25 +0,0 @@ -package com.ivy.wallet.io.network.data - -import androidx.compose.ui.graphics.toArgb -import com.ivy.wallet.io.persistence.data.CategoryEntity -import com.ivy.wallet.ui.theme.Ivy -import java.util.* - -data class CategoryDTO( - val name: String, - val color: Int = Ivy.toArgb(), - val icon: String? = null, - val orderNum: Double = 0.0, - - val id: UUID = UUID.randomUUID() -) { - fun toEntity(): CategoryEntity = CategoryEntity( - name = name, - color = color, - icon = icon, - orderNum = orderNum, - isSynced = true, - isDeleted = false, - id = id - ) -} \ No newline at end of file diff --git a/app/src/main/java/com/ivy/wallet/io/network/data/ExchangeRateDTO.kt b/app/src/main/java/com/ivy/wallet/io/network/data/ExchangeRateDTO.kt deleted file mode 100644 index 0dc2b63ee9..0000000000 --- a/app/src/main/java/com/ivy/wallet/io/network/data/ExchangeRateDTO.kt +++ /dev/null @@ -1,13 +0,0 @@ -package com.ivy.wallet.io.network.data - -data class ExchangeRateDTO( - val baseCurrency: String, - val currency: String, - val rate: Double, -) { - fun toEntity(): ExchangeRateDTO = ExchangeRateDTO( - baseCurrency = baseCurrency, - currency = currency, - rate = rate - ) -} \ No newline at end of file diff --git a/app/src/main/java/com/ivy/wallet/io/network/data/LoanDTO.kt b/app/src/main/java/com/ivy/wallet/io/network/data/LoanDTO.kt deleted file mode 100644 index bccc945f43..0000000000 --- a/app/src/main/java/com/ivy/wallet/io/network/data/LoanDTO.kt +++ /dev/null @@ -1,35 +0,0 @@ -package com.ivy.wallet.io.network.data - -import com.ivy.wallet.domain.data.LoanType -import com.ivy.wallet.io.persistence.data.LoanEntity -import java.util.* - -data class LoanDTO( - val name: String, - val amount: Double, - val type: LoanType, - val color: Int = 0, - val icon: String? = null, - val orderNum: Double = 0.0, - val accountId: UUID? = null, - - val id: UUID = UUID.randomUUID() -) { - fun toEntity(): LoanEntity = LoanEntity( - name = name, - amount = amount, - type = type, - color = color, - icon = icon, - orderNum = orderNum, - accountId = accountId, - id = id, - - isSynced = true, - isDeleted = false - ) - - fun humanReadableType(): String { - return if (type == LoanType.BORROW) "BORROWED" else "LENT" - } -} \ No newline at end of file diff --git a/app/src/main/java/com/ivy/wallet/io/network/data/LoanRecordDTO.kt b/app/src/main/java/com/ivy/wallet/io/network/data/LoanRecordDTO.kt deleted file mode 100644 index 9062cec26f..0000000000 --- a/app/src/main/java/com/ivy/wallet/io/network/data/LoanRecordDTO.kt +++ /dev/null @@ -1,32 +0,0 @@ -package com.ivy.wallet.io.network.data - -import com.ivy.wallet.io.persistence.data.LoanRecordEntity -import java.time.LocalDateTime -import java.util.* - -data class LoanRecordDTO( - val loanId: UUID, - val amount: Double, - val note: String? = null, - val dateTime: LocalDateTime, - val interest: Boolean = false, - val accountId: UUID? = null, - //This is used store the converted amount for currencies which are different from the loan account currency - val convertedAmount: Double? = null, - - val id: UUID = UUID.randomUUID() -) { - fun toEntity(): LoanRecordEntity = LoanRecordEntity( - loanId = loanId, - amount = amount, - note = note, - dateTime = dateTime, - interest = interest, - accountId = accountId, - convertedAmount = convertedAmount, - id = id, - - isSynced = true, - isDeleted = false - ) -} \ No newline at end of file diff --git a/app/src/main/java/com/ivy/wallet/io/network/data/PlannedPaymentRuleDTO.kt b/app/src/main/java/com/ivy/wallet/io/network/data/PlannedPaymentRuleDTO.kt deleted file mode 100644 index f9310370d3..0000000000 --- a/app/src/main/java/com/ivy/wallet/io/network/data/PlannedPaymentRuleDTO.kt +++ /dev/null @@ -1,39 +0,0 @@ -package com.ivy.wallet.io.network.data - -import com.ivy.wallet.domain.data.IntervalType -import com.ivy.wallet.domain.data.TransactionType -import com.ivy.wallet.io.persistence.data.PlannedPaymentRuleEntity -import java.time.LocalDateTime -import java.util.* - -data class PlannedPaymentRuleDTO( - val startDate: LocalDateTime?, - val intervalN: Int?, - val intervalType: IntervalType?, - val oneTime: Boolean, - - val type: TransactionType, - val accountId: UUID, - val amount: Double = 0.0, - val categoryId: UUID? = null, - val title: String? = null, - val description: String? = null, - - val id: UUID = UUID.randomUUID() -) { - fun toEntity(): PlannedPaymentRuleEntity = PlannedPaymentRuleEntity( - startDate = startDate, - intervalN = intervalN, - intervalType = intervalType, - oneTime = oneTime, - type = type, - accountId = accountId, - amount = amount, - categoryId = categoryId, - title = title, - id = id, - - isSynced = true, - isDeleted = false - ) -} \ No newline at end of file diff --git a/app/src/main/java/com/ivy/wallet/io/network/data/SettingsDTO.kt b/app/src/main/java/com/ivy/wallet/io/network/data/SettingsDTO.kt deleted file mode 100644 index 49b0d54695..0000000000 --- a/app/src/main/java/com/ivy/wallet/io/network/data/SettingsDTO.kt +++ /dev/null @@ -1,25 +0,0 @@ -package com.ivy.wallet.io.network.data - -import com.ivy.design.l0_system.Theme -import com.ivy.wallet.io.persistence.data.SettingsEntity -import java.util.* - -data class SettingsDTO( - val theme: Theme, - val currency: String, - val bufferAmount: Double, - val name: String, - - val id: UUID = UUID.randomUUID() -) { - fun toEntity(): SettingsEntity = SettingsEntity( - theme = theme, - currency = currency, - bufferAmount = bufferAmount, - name = name, - id = id, - - isSynced = true, - isDeleted = false - ) -} \ No newline at end of file diff --git a/app/src/main/java/com/ivy/wallet/io/network/data/TransactionDTO.kt b/app/src/main/java/com/ivy/wallet/io/network/data/TransactionDTO.kt deleted file mode 100644 index fa7c7f5f54..0000000000 --- a/app/src/main/java/com/ivy/wallet/io/network/data/TransactionDTO.kt +++ /dev/null @@ -1,52 +0,0 @@ -package com.ivy.wallet.io.network.data - -import com.ivy.wallet.domain.data.TransactionType -import com.ivy.wallet.io.persistence.data.TransactionEntity -import java.time.LocalDateTime -import java.util.* - -data class TransactionDTO( - val accountId: UUID, - val type: TransactionType, - val amount: Double, - val toAccountId: UUID? = null, - val toAmount: Double? = null, - val title: String? = null, - val description: String? = null, - val dateTime: LocalDateTime? = null, - val categoryId: UUID? = null, - val dueDate: LocalDateTime? = null, - - val recurringRuleId: UUID? = null, - - val attachmentUrl: String? = null, - - //This refers to the loan id that is linked with a transaction - val loanId: UUID? = null, - - //This refers to the loan record id that is linked with a transaction - val loanRecordId: UUID? = null, - - val id: UUID = UUID.randomUUID() -) { - fun toEntity(): TransactionEntity = TransactionEntity( - accountId = accountId, - type = type, - amount = amount, - toAccountId = toAccountId, - toAmount = toAmount, - title = title, - description = description, - dateTime = dateTime, - categoryId = categoryId, - dueDate = dueDate, - recurringRuleId = recurringRuleId, - attachmentUrl = attachmentUrl, - loanId = loanId, - loanRecordId = loanRecordId, - id = id, - - isSynced = true, - isDeleted = false - ) -} \ No newline at end of file diff --git a/app/src/main/java/com/ivy/wallet/io/network/data/UserDTO.kt b/app/src/main/java/com/ivy/wallet/io/network/data/UserDTO.kt deleted file mode 100644 index 7df9fb851b..0000000000 --- a/app/src/main/java/com/ivy/wallet/io/network/data/UserDTO.kt +++ /dev/null @@ -1,32 +0,0 @@ -package com.ivy.wallet.io.network.data - -import com.google.gson.annotations.SerializedName -import com.ivy.wallet.domain.data.AuthProviderType -import com.ivy.wallet.io.persistence.data.UserEntity -import java.util.* - -data class UserDTO( - val email: String, - val authProviderType: AuthProviderType, - var firstName: String, - val lastName: String?, - @SerializedName("profilePictureUrl") - val profilePicture: String?, - val color: Int, - - val testUser: Boolean = false, - var id: UUID -) { - fun toEntity(): UserEntity = UserEntity( - email = email, - authProviderType = authProviderType, - firstName = firstName, - lastName = lastName, - profilePicture = profilePicture, - color = color, - testUser = testUser, - id = id, - ) - - fun names(): String = firstName + if (lastName != null) " $lastName" else "" -} \ No newline at end of file diff --git a/app/src/main/java/com/ivy/wallet/io/network/error/ErrorCode.kt b/app/src/main/java/com/ivy/wallet/io/network/error/ErrorCode.kt deleted file mode 100644 index c7b71a5401..0000000000 --- a/app/src/main/java/com/ivy/wallet/io/network/error/ErrorCode.kt +++ /dev/null @@ -1,23 +0,0 @@ -package com.ivy.wallet.io.network.error - -enum class ErrorCode(val code: Int) { - SERVER_EXCEPTION(666), - PARSE(-2), - INPUT(-1), - - STATE_ERROR(7), - - SECURITY(13), - PERMISSION_ERROR(14), - - CATEGORY_NOT_FOUND(4041), - LABEL_NOT_FOUND(4042), - TASK_NOT_FOUND(4043), - NOTE_NOT_FOUND(4044), - EVENT_NOT_FOUND(4045), - CUSTOM_FIELD_NOT_FOUND(4046), - - NOT_IVY_ATTACHMENT(7404), - - UNKNOWN(-666) -} \ No newline at end of file diff --git a/app/src/main/java/com/ivy/wallet/io/network/error/NetworkError.kt b/app/src/main/java/com/ivy/wallet/io/network/error/NetworkError.kt deleted file mode 100644 index c02e2b6fb0..0000000000 --- a/app/src/main/java/com/ivy/wallet/io/network/error/NetworkError.kt +++ /dev/null @@ -1,6 +0,0 @@ -package com.ivy.wallet.io.network.error - -import java.io.IOException - -class NetworkError(val restError: RestError) : - IOException("Network error: ${restError.errorCode.code} - ${restError.msg}") \ No newline at end of file diff --git a/app/src/main/java/com/ivy/wallet/io/network/error/RestError.kt b/app/src/main/java/com/ivy/wallet/io/network/error/RestError.kt deleted file mode 100644 index d31e49e6a7..0000000000 --- a/app/src/main/java/com/ivy/wallet/io/network/error/RestError.kt +++ /dev/null @@ -1,10 +0,0 @@ -package com.ivy.wallet.io.network.error - -import com.google.gson.annotations.SerializedName - -data class RestError( - @SerializedName("errorCode") - val errorCode: ErrorCode, - @SerializedName("msg") - val msg: String? -) \ No newline at end of file diff --git a/app/src/main/java/com/ivy/wallet/io/network/request/account/AccountsResponse.kt b/app/src/main/java/com/ivy/wallet/io/network/request/account/AccountsResponse.kt deleted file mode 100644 index fd0d885d68..0000000000 --- a/app/src/main/java/com/ivy/wallet/io/network/request/account/AccountsResponse.kt +++ /dev/null @@ -1,8 +0,0 @@ -package com.ivy.wallet.io.network.request.account - -import com.ivy.wallet.io.network.data.AccountDTO - - -data class AccountsResponse( - val accounts: List -) \ No newline at end of file diff --git a/app/src/main/java/com/ivy/wallet/io/network/request/account/DeleteAccountRequest.kt b/app/src/main/java/com/ivy/wallet/io/network/request/account/DeleteAccountRequest.kt deleted file mode 100644 index 54c6592e80..0000000000 --- a/app/src/main/java/com/ivy/wallet/io/network/request/account/DeleteAccountRequest.kt +++ /dev/null @@ -1,7 +0,0 @@ -package com.ivy.wallet.io.network.request.account - -import java.util.* - -data class DeleteAccountRequest( - val id: UUID? = null -) \ No newline at end of file diff --git a/app/src/main/java/com/ivy/wallet/io/network/request/account/UpdateAccountRequest.kt b/app/src/main/java/com/ivy/wallet/io/network/request/account/UpdateAccountRequest.kt deleted file mode 100644 index d2136e8a6d..0000000000 --- a/app/src/main/java/com/ivy/wallet/io/network/request/account/UpdateAccountRequest.kt +++ /dev/null @@ -1,7 +0,0 @@ -package com.ivy.wallet.io.network.request.account - -import com.ivy.wallet.io.network.data.AccountDTO - -data class UpdateAccountRequest( - val account: AccountDTO? = null -) \ No newline at end of file diff --git a/app/src/main/java/com/ivy/wallet/io/network/request/analytics/AnalyticsReportResponse.kt b/app/src/main/java/com/ivy/wallet/io/network/request/analytics/AnalyticsReportResponse.kt deleted file mode 100644 index ed7cb32751..0000000000 --- a/app/src/main/java/com/ivy/wallet/io/network/request/analytics/AnalyticsReportResponse.kt +++ /dev/null @@ -1,24 +0,0 @@ -package com.ivy.wallet.io.network.request.analytics - -data class AnalyticsReportResponse( - //Events ----------------------------------------------------- - val eventsCount: Map, - val eventAvgCount: Map, - - //KPIs - val onboardedUsersCount: Int, - val usersCreatedAccount: List, - val usersCreatedCategory: List, - val usersCreatedTransaction: List, - val usersCreatedPlannedPayment: List, - - //Health - val usersWithTransactionLast24H: List, - val usersWithTransactionLast7Days: List, - val usersWithTransactionLast30Days: List, - - //User Stats - val powerUsersV1: List, //>= 14 per week (2 transactions per day = 14 per week) - val activeUsersV1: List, //5-13 transactions per week - val dyingUsersV1: List, //1-4 transaction per week -) \ No newline at end of file diff --git a/app/src/main/java/com/ivy/wallet/io/network/request/analytics/LogEventRequest.kt b/app/src/main/java/com/ivy/wallet/io/network/request/analytics/LogEventRequest.kt deleted file mode 100644 index 424bcf6200..0000000000 --- a/app/src/main/java/com/ivy/wallet/io/network/request/analytics/LogEventRequest.kt +++ /dev/null @@ -1,7 +0,0 @@ -package com.ivy.wallet.io.network.request.analytics - -import com.ivy.wallet.domain.data.analytics.AnalyticsEvent - -data class LogEventRequest( - val event: AnalyticsEvent -) \ No newline at end of file diff --git a/app/src/main/java/com/ivy/wallet/io/network/request/auth/AuthResponse.kt b/app/src/main/java/com/ivy/wallet/io/network/request/auth/AuthResponse.kt deleted file mode 100644 index 39e89b27b8..0000000000 --- a/app/src/main/java/com/ivy/wallet/io/network/request/auth/AuthResponse.kt +++ /dev/null @@ -1,11 +0,0 @@ -package com.ivy.wallet.io.network.request.auth - -import com.google.gson.annotations.SerializedName -import com.ivy.wallet.io.network.data.UserDTO - -data class AuthResponse( - @SerializedName("user") - val user: UserDTO, - @SerializedName("sessionToken") - val sessionToken: String -) \ No newline at end of file diff --git a/app/src/main/java/com/ivy/wallet/io/network/request/auth/CheckEmailRequest.kt b/app/src/main/java/com/ivy/wallet/io/network/request/auth/CheckEmailRequest.kt deleted file mode 100644 index 8c14b26952..0000000000 --- a/app/src/main/java/com/ivy/wallet/io/network/request/auth/CheckEmailRequest.kt +++ /dev/null @@ -1,8 +0,0 @@ -package com.ivy.wallet.io.network.request.auth - -import com.google.gson.annotations.SerializedName - -data class CheckEmailRequest( - @SerializedName("email") - val email: String -) \ No newline at end of file diff --git a/app/src/main/java/com/ivy/wallet/io/network/request/auth/CheckEmailResponse.kt b/app/src/main/java/com/ivy/wallet/io/network/request/auth/CheckEmailResponse.kt deleted file mode 100644 index 3e91b06bad..0000000000 --- a/app/src/main/java/com/ivy/wallet/io/network/request/auth/CheckEmailResponse.kt +++ /dev/null @@ -1,11 +0,0 @@ -package com.ivy.wallet.io.network.request.auth - -import com.google.gson.annotations.SerializedName -import com.ivy.wallet.domain.data.EmailState - -data class CheckEmailResponse( - @SerializedName("emailState") - val emailState: EmailState, - @SerializedName("firstName") - val firstName: String? -) \ No newline at end of file diff --git a/app/src/main/java/com/ivy/wallet/io/network/request/auth/GoogleSignInRequest.kt b/app/src/main/java/com/ivy/wallet/io/network/request/auth/GoogleSignInRequest.kt deleted file mode 100644 index 44712bade0..0000000000 --- a/app/src/main/java/com/ivy/wallet/io/network/request/auth/GoogleSignInRequest.kt +++ /dev/null @@ -1,10 +0,0 @@ -package com.ivy.wallet.io.network.request.auth - -import com.google.gson.annotations.SerializedName - -data class GoogleSignInRequest( - @SerializedName("googleIdToken") - val googleIdToken: String, - @SerializedName("fcmToken") - val fcmToken: String -) \ No newline at end of file diff --git a/app/src/main/java/com/ivy/wallet/io/network/request/auth/InitiateResetPasswordRequest.kt b/app/src/main/java/com/ivy/wallet/io/network/request/auth/InitiateResetPasswordRequest.kt deleted file mode 100644 index 97fb375400..0000000000 --- a/app/src/main/java/com/ivy/wallet/io/network/request/auth/InitiateResetPasswordRequest.kt +++ /dev/null @@ -1,8 +0,0 @@ -package com.ivy.wallet.io.network.request.auth - -import com.google.gson.annotations.SerializedName - -data class InitiateResetPasswordRequest( - @SerializedName("email") - val email: String? = null -) \ No newline at end of file diff --git a/app/src/main/java/com/ivy/wallet/io/network/request/auth/InitiateResetPasswordResponse.kt b/app/src/main/java/com/ivy/wallet/io/network/request/auth/InitiateResetPasswordResponse.kt deleted file mode 100644 index 71aab08688..0000000000 --- a/app/src/main/java/com/ivy/wallet/io/network/request/auth/InitiateResetPasswordResponse.kt +++ /dev/null @@ -1,8 +0,0 @@ -package com.ivy.wallet.io.network.request.auth - -import com.google.gson.annotations.SerializedName - -data class InitiateResetPasswordResponse( - @SerializedName("email") - val email: String -) \ No newline at end of file diff --git a/app/src/main/java/com/ivy/wallet/io/network/request/auth/ResetPasswordRequest.kt b/app/src/main/java/com/ivy/wallet/io/network/request/auth/ResetPasswordRequest.kt deleted file mode 100644 index 9d60845a14..0000000000 --- a/app/src/main/java/com/ivy/wallet/io/network/request/auth/ResetPasswordRequest.kt +++ /dev/null @@ -1,14 +0,0 @@ -package com.ivy.wallet.io.network.request.auth - -import com.google.gson.annotations.SerializedName - -data class ResetPasswordRequest( - @SerializedName("email") - val email: String? = null, - @SerializedName("newPassword") - val newPassword: String? = null, - @SerializedName("otc") - val otc: String? = null, - @SerializedName("fcmToken") - val fcmToken: String? = null -) \ No newline at end of file diff --git a/app/src/main/java/com/ivy/wallet/io/network/request/auth/SignInRequest.kt b/app/src/main/java/com/ivy/wallet/io/network/request/auth/SignInRequest.kt deleted file mode 100644 index ae45c5581f..0000000000 --- a/app/src/main/java/com/ivy/wallet/io/network/request/auth/SignInRequest.kt +++ /dev/null @@ -1,12 +0,0 @@ -package com.ivy.wallet.io.network.request.auth - -import com.google.gson.annotations.SerializedName - -data class SignInRequest( - @SerializedName("email") - private val email: String, - @SerializedName("password") - private val password: String, - @SerializedName("fcmToken") - private val fcmToken: String -) \ No newline at end of file diff --git a/app/src/main/java/com/ivy/wallet/io/network/request/auth/SignUpRequest.kt b/app/src/main/java/com/ivy/wallet/io/network/request/auth/SignUpRequest.kt deleted file mode 100644 index 50cb819ac4..0000000000 --- a/app/src/main/java/com/ivy/wallet/io/network/request/auth/SignUpRequest.kt +++ /dev/null @@ -1,18 +0,0 @@ -package com.ivy.wallet.io.network.request.auth - -import com.google.gson.annotations.SerializedName - -data class SignUpRequest( - @SerializedName("email") - val email: String, - @SerializedName("password") - val password: String, - @SerializedName("firstName") - val firstName: String, - @SerializedName("lastName") - val lastName: String? = null, - @SerializedName("color") - val color: Int = 0, - @SerializedName("fcmToken") - val fcmToken: String -) \ No newline at end of file diff --git a/app/src/main/java/com/ivy/wallet/io/network/request/auth/UpdateUserInfoRequest.kt b/app/src/main/java/com/ivy/wallet/io/network/request/auth/UpdateUserInfoRequest.kt deleted file mode 100644 index 0598d6007a..0000000000 --- a/app/src/main/java/com/ivy/wallet/io/network/request/auth/UpdateUserInfoRequest.kt +++ /dev/null @@ -1,10 +0,0 @@ -package com.ivy.wallet.io.network.request.auth - -import com.google.gson.annotations.SerializedName - -data class UpdateUserInfoRequest( - @SerializedName("firstName") - val firstName: String? = null, - @SerializedName("lastName") - val lastName: String? = null -) \ No newline at end of file diff --git a/app/src/main/java/com/ivy/wallet/io/network/request/auth/UpdateUserInfoResponse.kt b/app/src/main/java/com/ivy/wallet/io/network/request/auth/UpdateUserInfoResponse.kt deleted file mode 100644 index d37241f64f..0000000000 --- a/app/src/main/java/com/ivy/wallet/io/network/request/auth/UpdateUserInfoResponse.kt +++ /dev/null @@ -1,9 +0,0 @@ -package com.ivy.wallet.io.network.request.auth - -import com.google.gson.annotations.SerializedName -import com.ivy.wallet.domain.data.core.User - -data class UpdateUserInfoResponse( - @SerializedName("user") - val user: User -) \ No newline at end of file diff --git a/app/src/main/java/com/ivy/wallet/io/network/request/budget/BudgetsResponse.kt b/app/src/main/java/com/ivy/wallet/io/network/request/budget/BudgetsResponse.kt deleted file mode 100644 index 0a390092f8..0000000000 --- a/app/src/main/java/com/ivy/wallet/io/network/request/budget/BudgetsResponse.kt +++ /dev/null @@ -1,8 +0,0 @@ -package com.ivy.wallet.io.network.request.budget - -import com.ivy.wallet.io.network.data.BudgetDTO - - -data class BudgetsResponse( - val budgets: List -) \ No newline at end of file diff --git a/app/src/main/java/com/ivy/wallet/io/network/request/budget/CrupdateBudgetRequest.kt b/app/src/main/java/com/ivy/wallet/io/network/request/budget/CrupdateBudgetRequest.kt deleted file mode 100644 index 4273e5efb4..0000000000 --- a/app/src/main/java/com/ivy/wallet/io/network/request/budget/CrupdateBudgetRequest.kt +++ /dev/null @@ -1,8 +0,0 @@ -package com.ivy.wallet.io.network.request.budget - -import com.ivy.wallet.io.network.data.BudgetDTO - - -data class CrupdateBudgetRequest( - val budget: BudgetDTO? = null -) \ No newline at end of file diff --git a/app/src/main/java/com/ivy/wallet/io/network/request/budget/DeleteBudgetRequest.kt b/app/src/main/java/com/ivy/wallet/io/network/request/budget/DeleteBudgetRequest.kt deleted file mode 100644 index f8ede15993..0000000000 --- a/app/src/main/java/com/ivy/wallet/io/network/request/budget/DeleteBudgetRequest.kt +++ /dev/null @@ -1,7 +0,0 @@ -package com.ivy.wallet.io.network.request.budget - -import java.util.* - -data class DeleteBudgetRequest( - val id: UUID? = null -) \ No newline at end of file diff --git a/app/src/main/java/com/ivy/wallet/io/network/request/category/DeleteWalletCategoryRequest.kt b/app/src/main/java/com/ivy/wallet/io/network/request/category/DeleteWalletCategoryRequest.kt deleted file mode 100644 index f3ae02e35b..0000000000 --- a/app/src/main/java/com/ivy/wallet/io/network/request/category/DeleteWalletCategoryRequest.kt +++ /dev/null @@ -1,7 +0,0 @@ -package com.ivy.wallet.io.network.request.category - -import java.util.* - -data class DeleteWalletCategoryRequest( - val id: UUID? = null -) \ No newline at end of file diff --git a/app/src/main/java/com/ivy/wallet/io/network/request/category/UpdateWalletCategoryRequest.kt b/app/src/main/java/com/ivy/wallet/io/network/request/category/UpdateWalletCategoryRequest.kt deleted file mode 100644 index 5642bce39d..0000000000 --- a/app/src/main/java/com/ivy/wallet/io/network/request/category/UpdateWalletCategoryRequest.kt +++ /dev/null @@ -1,7 +0,0 @@ -package com.ivy.wallet.io.network.request.category - -import com.ivy.wallet.io.network.data.CategoryDTO - -data class UpdateWalletCategoryRequest( - val category: CategoryDTO? = null -) \ No newline at end of file diff --git a/app/src/main/java/com/ivy/wallet/io/network/request/category/WalletCategoriesResponse.kt b/app/src/main/java/com/ivy/wallet/io/network/request/category/WalletCategoriesResponse.kt deleted file mode 100644 index 41ff386004..0000000000 --- a/app/src/main/java/com/ivy/wallet/io/network/request/category/WalletCategoriesResponse.kt +++ /dev/null @@ -1,8 +0,0 @@ -package com.ivy.wallet.io.network.request.category - -import com.ivy.wallet.io.network.data.CategoryDTO - - -data class WalletCategoriesResponse( - val categories: List -) \ No newline at end of file diff --git a/app/src/main/java/com/ivy/wallet/io/network/request/currency/ExchangeRatesResponse.kt b/app/src/main/java/com/ivy/wallet/io/network/request/currency/ExchangeRatesResponse.kt deleted file mode 100644 index e92385f140..0000000000 --- a/app/src/main/java/com/ivy/wallet/io/network/request/currency/ExchangeRatesResponse.kt +++ /dev/null @@ -1,9 +0,0 @@ -package com.ivy.wallet.io.network.request.currency - -import androidx.annotation.Keep - -@Keep -data class ExchangeRatesResponse( - val date: String, - val eur: Map, -) \ No newline at end of file diff --git a/app/src/main/java/com/ivy/wallet/io/network/request/github/OpenIssueRequest.kt b/app/src/main/java/com/ivy/wallet/io/network/request/github/OpenIssueRequest.kt deleted file mode 100644 index e7a60acd38..0000000000 --- a/app/src/main/java/com/ivy/wallet/io/network/request/github/OpenIssueRequest.kt +++ /dev/null @@ -1,6 +0,0 @@ -package com.ivy.wallet.io.network.request.github - -data class OpenIssueRequest( - val title: String, - val body: String, -) \ No newline at end of file diff --git a/app/src/main/java/com/ivy/wallet/io/network/request/github/OpenIssueResponse.kt b/app/src/main/java/com/ivy/wallet/io/network/request/github/OpenIssueResponse.kt deleted file mode 100644 index d20b7d628e..0000000000 --- a/app/src/main/java/com/ivy/wallet/io/network/request/github/OpenIssueResponse.kt +++ /dev/null @@ -1,5 +0,0 @@ -package com.ivy.wallet.io.network.request.github - -data class OpenIssueResponse( - val url: String -) \ No newline at end of file diff --git a/app/src/main/java/com/ivy/wallet/io/network/request/loan/DeleteLoanRecordRequest.kt b/app/src/main/java/com/ivy/wallet/io/network/request/loan/DeleteLoanRecordRequest.kt deleted file mode 100644 index d48401c41f..0000000000 --- a/app/src/main/java/com/ivy/wallet/io/network/request/loan/DeleteLoanRecordRequest.kt +++ /dev/null @@ -1,7 +0,0 @@ -package com.ivy.wallet.io.network.request.loan - -import java.util.* - -data class DeleteLoanRecordRequest( - val id: UUID? = null -) \ No newline at end of file diff --git a/app/src/main/java/com/ivy/wallet/io/network/request/loan/DeleteLoanRequest.kt b/app/src/main/java/com/ivy/wallet/io/network/request/loan/DeleteLoanRequest.kt deleted file mode 100644 index 307e48613e..0000000000 --- a/app/src/main/java/com/ivy/wallet/io/network/request/loan/DeleteLoanRequest.kt +++ /dev/null @@ -1,7 +0,0 @@ -package com.ivy.wallet.io.network.request.loan - -import java.util.* - -data class DeleteLoanRequest( - val id: UUID? = null -) \ No newline at end of file diff --git a/app/src/main/java/com/ivy/wallet/io/network/request/loan/LoanRecordsResponse.kt b/app/src/main/java/com/ivy/wallet/io/network/request/loan/LoanRecordsResponse.kt deleted file mode 100644 index be6a3e030a..0000000000 --- a/app/src/main/java/com/ivy/wallet/io/network/request/loan/LoanRecordsResponse.kt +++ /dev/null @@ -1,7 +0,0 @@ -package com.ivy.wallet.io.network.request.loan - -import com.ivy.wallet.io.network.data.LoanRecordDTO - -data class LoanRecordsResponse( - val loanRecords: List -) \ No newline at end of file diff --git a/app/src/main/java/com/ivy/wallet/io/network/request/loan/LoansResponse.kt b/app/src/main/java/com/ivy/wallet/io/network/request/loan/LoansResponse.kt deleted file mode 100644 index 6397632fa8..0000000000 --- a/app/src/main/java/com/ivy/wallet/io/network/request/loan/LoansResponse.kt +++ /dev/null @@ -1,7 +0,0 @@ -package com.ivy.wallet.io.network.request.loan - -import com.ivy.wallet.io.network.data.LoanDTO - -data class LoansResponse( - val loans: List -) \ No newline at end of file diff --git a/app/src/main/java/com/ivy/wallet/io/network/request/loan/UpdateLoanRecordRequest.kt b/app/src/main/java/com/ivy/wallet/io/network/request/loan/UpdateLoanRecordRequest.kt deleted file mode 100644 index b35a489089..0000000000 --- a/app/src/main/java/com/ivy/wallet/io/network/request/loan/UpdateLoanRecordRequest.kt +++ /dev/null @@ -1,7 +0,0 @@ -package com.ivy.wallet.io.network.request.loan - -import com.ivy.wallet.io.network.data.LoanRecordDTO - -data class UpdateLoanRecordRequest( - val loanRecord: LoanRecordDTO? = null -) \ No newline at end of file diff --git a/app/src/main/java/com/ivy/wallet/io/network/request/loan/UpdateLoanRequest.kt b/app/src/main/java/com/ivy/wallet/io/network/request/loan/UpdateLoanRequest.kt deleted file mode 100644 index 7b3f48408a..0000000000 --- a/app/src/main/java/com/ivy/wallet/io/network/request/loan/UpdateLoanRequest.kt +++ /dev/null @@ -1,7 +0,0 @@ -package com.ivy.wallet.io.network.request.loan - -import com.ivy.wallet.io.network.data.LoanDTO - -data class UpdateLoanRequest( - val loan: LoanDTO? = null -) \ No newline at end of file diff --git a/app/src/main/java/com/ivy/wallet/io/network/request/planned/DeletePlannedPaymentRuleRequest.kt b/app/src/main/java/com/ivy/wallet/io/network/request/planned/DeletePlannedPaymentRuleRequest.kt deleted file mode 100644 index 3974efafbe..0000000000 --- a/app/src/main/java/com/ivy/wallet/io/network/request/planned/DeletePlannedPaymentRuleRequest.kt +++ /dev/null @@ -1,7 +0,0 @@ -package com.ivy.wallet.io.network.request.planned - -import java.util.* - -data class DeletePlannedPaymentRuleRequest( - val id: UUID? = null -) \ No newline at end of file diff --git a/app/src/main/java/com/ivy/wallet/io/network/request/planned/PlannedPaymentRulesResponse.kt b/app/src/main/java/com/ivy/wallet/io/network/request/planned/PlannedPaymentRulesResponse.kt deleted file mode 100644 index 5009e0cbaa..0000000000 --- a/app/src/main/java/com/ivy/wallet/io/network/request/planned/PlannedPaymentRulesResponse.kt +++ /dev/null @@ -1,8 +0,0 @@ -package com.ivy.wallet.io.network.request.planned - -import com.ivy.wallet.io.network.data.PlannedPaymentRuleDTO - - -data class PlannedPaymentRulesResponse( - val rules: List -) \ No newline at end of file diff --git a/app/src/main/java/com/ivy/wallet/io/network/request/planned/UpdatePlannedPaymentRuleRequest.kt b/app/src/main/java/com/ivy/wallet/io/network/request/planned/UpdatePlannedPaymentRuleRequest.kt deleted file mode 100644 index f0e53df538..0000000000 --- a/app/src/main/java/com/ivy/wallet/io/network/request/planned/UpdatePlannedPaymentRuleRequest.kt +++ /dev/null @@ -1,7 +0,0 @@ -package com.ivy.wallet.io.network.request.planned - -import com.ivy.wallet.io.network.data.PlannedPaymentRuleDTO - -data class UpdatePlannedPaymentRuleRequest( - val rule: PlannedPaymentRuleDTO? = null -) \ No newline at end of file diff --git a/app/src/main/java/com/ivy/wallet/io/network/request/transaction/DeleteTransactionRequest.kt b/app/src/main/java/com/ivy/wallet/io/network/request/transaction/DeleteTransactionRequest.kt deleted file mode 100644 index 688e9f559c..0000000000 --- a/app/src/main/java/com/ivy/wallet/io/network/request/transaction/DeleteTransactionRequest.kt +++ /dev/null @@ -1,7 +0,0 @@ -package com.ivy.wallet.io.network.request.transaction - -import java.util.* - -data class DeleteTransactionRequest( - val id: UUID? = null -) \ No newline at end of file diff --git a/app/src/main/java/com/ivy/wallet/io/network/request/transaction/TransactionsResponse.kt b/app/src/main/java/com/ivy/wallet/io/network/request/transaction/TransactionsResponse.kt deleted file mode 100644 index e09e65b88f..0000000000 --- a/app/src/main/java/com/ivy/wallet/io/network/request/transaction/TransactionsResponse.kt +++ /dev/null @@ -1,8 +0,0 @@ -package com.ivy.wallet.io.network.request.transaction - -import com.ivy.wallet.io.network.data.TransactionDTO - - -data class TransactionsResponse( - val transactions: List -) \ No newline at end of file diff --git a/app/src/main/java/com/ivy/wallet/io/network/request/transaction/UpdateTransactionRequest.kt b/app/src/main/java/com/ivy/wallet/io/network/request/transaction/UpdateTransactionRequest.kt deleted file mode 100644 index d0c26b57a0..0000000000 --- a/app/src/main/java/com/ivy/wallet/io/network/request/transaction/UpdateTransactionRequest.kt +++ /dev/null @@ -1,7 +0,0 @@ -package com.ivy.wallet.io.network.request.transaction - -import com.ivy.wallet.io.network.data.TransactionDTO - -data class UpdateTransactionRequest( - val transaction: TransactionDTO? = null -) \ No newline at end of file diff --git a/app/src/main/java/com/ivy/wallet/io/network/service/AccountService.kt b/app/src/main/java/com/ivy/wallet/io/network/service/AccountService.kt deleted file mode 100644 index a8fd29bc5a..0000000000 --- a/app/src/main/java/com/ivy/wallet/io/network/service/AccountService.kt +++ /dev/null @@ -1,19 +0,0 @@ -package com.ivy.wallet.io.network.service - -import androidx.annotation.Keep -import com.ivy.wallet.io.network.request.account.AccountsResponse -import com.ivy.wallet.io.network.request.account.DeleteAccountRequest -import com.ivy.wallet.io.network.request.account.UpdateAccountRequest -import retrofit2.http.* - -@Keep -interface AccountService { - @POST("/wallet/accounts/update") - suspend fun update(@Body request: UpdateAccountRequest) - - @GET("/wallet/accounts") - suspend fun get(@Query("after") after: Long? = null): AccountsResponse - - @HTTP(method = "DELETE", path = "/wallet/accounts/delete", hasBody = true) - suspend fun delete(@Body request: DeleteAccountRequest) -} \ No newline at end of file diff --git a/app/src/main/java/com/ivy/wallet/io/network/service/AnalyticsService.kt b/app/src/main/java/com/ivy/wallet/io/network/service/AnalyticsService.kt deleted file mode 100644 index a2bd7f415e..0000000000 --- a/app/src/main/java/com/ivy/wallet/io/network/service/AnalyticsService.kt +++ /dev/null @@ -1,24 +0,0 @@ -package com.ivy.wallet.io.network.service - -import androidx.annotation.Keep -import com.ivy.wallet.io.network.request.analytics.AnalyticsReportResponse -import com.ivy.wallet.io.network.request.analytics.LogEventRequest -import retrofit2.http.Body -import retrofit2.http.GET -import retrofit2.http.POST -import retrofit2.http.Query - -@Keep -interface AnalyticsService { - @POST("/wallet/analytics/log-event") - suspend fun logEvent(@Body request: LogEventRequest) - - @GET("/wallet/analytics/report") - suspend fun getReport( - @Query("startDate") startDate: Long? = null, - @Query("endDate") endDate: Long? = null, - ): AnalyticsReportResponse - - @POST("/wallet/analytics/nuke-test-events") - suspend fun nukeTestEvents() -} \ No newline at end of file diff --git a/app/src/main/java/com/ivy/wallet/io/network/service/AuthService.kt b/app/src/main/java/com/ivy/wallet/io/network/service/AuthService.kt deleted file mode 100644 index 7a6a9040d9..0000000000 --- a/app/src/main/java/com/ivy/wallet/io/network/service/AuthService.kt +++ /dev/null @@ -1,33 +0,0 @@ -package com.ivy.wallet.io.network.service - -import androidx.annotation.Keep -import com.ivy.wallet.io.network.request.auth.* -import retrofit2.http.Body -import retrofit2.http.POST - -@Keep -interface AuthService { - @POST("/auth/check-email") - suspend fun checkEmail(@Body request: CheckEmailRequest): CheckEmailResponse - - @POST("/auth/sign-up") - suspend fun signUp(@Body request: SignUpRequest): AuthResponse - - @POST("/auth/sign-in") - suspend fun signIn(@Body request: SignInRequest): AuthResponse - - @POST("/auth/google-sign-in") - suspend fun googleSignIn(@Body request: GoogleSignInRequest): AuthResponse - - @POST("/auth/initiate-reset-password") - suspend fun initiateResetPassword( - @Body request: InitiateResetPasswordRequest - ): InitiateResetPasswordResponse - - @POST("/auth/reset-password") - suspend fun resetPassword(@Body request: ResetPasswordRequest): AuthResponse - - @POST("/auth/update-user-info") - suspend fun updateUserInfo(@Body request: UpdateUserInfoRequest): UpdateUserInfoResponse - -} \ No newline at end of file diff --git a/app/src/main/java/com/ivy/wallet/io/network/service/BudgetService.kt b/app/src/main/java/com/ivy/wallet/io/network/service/BudgetService.kt deleted file mode 100644 index fd6952f1a5..0000000000 --- a/app/src/main/java/com/ivy/wallet/io/network/service/BudgetService.kt +++ /dev/null @@ -1,19 +0,0 @@ -package com.ivy.wallet.io.network.service - -import androidx.annotation.Keep -import com.ivy.wallet.io.network.request.budget.BudgetsResponse -import com.ivy.wallet.io.network.request.budget.CrupdateBudgetRequest -import com.ivy.wallet.io.network.request.budget.DeleteBudgetRequest -import retrofit2.http.* - -@Keep -interface BudgetService { - @POST("/wallet/budgets/update") - suspend fun update(@Body request: CrupdateBudgetRequest) - - @GET("/wallet/budgets") - suspend fun get(@Query("after") after: Long? = null): BudgetsResponse - - @HTTP(method = "DELETE", path = "/wallet/budgets/delete", hasBody = true) - suspend fun delete(@Body request: DeleteBudgetRequest) -} \ No newline at end of file diff --git a/app/src/main/java/com/ivy/wallet/io/network/service/CategoryService.kt b/app/src/main/java/com/ivy/wallet/io/network/service/CategoryService.kt deleted file mode 100644 index 6f32efc0d6..0000000000 --- a/app/src/main/java/com/ivy/wallet/io/network/service/CategoryService.kt +++ /dev/null @@ -1,19 +0,0 @@ -package com.ivy.wallet.io.network.service - -import androidx.annotation.Keep -import com.ivy.wallet.io.network.request.category.DeleteWalletCategoryRequest -import com.ivy.wallet.io.network.request.category.UpdateWalletCategoryRequest -import com.ivy.wallet.io.network.request.category.WalletCategoriesResponse -import retrofit2.http.* - -@Keep -interface CategoryService { - @POST("/wallet/categories/update") - suspend fun update(@Body request: UpdateWalletCategoryRequest) - - @GET("/wallet/categories") - suspend fun get(@Query("after") after: Long? = null): WalletCategoriesResponse - - @HTTP(method = "DELETE", path = "/wallet/categories/delete", hasBody = true) - suspend fun delete(@Body request: DeleteWalletCategoryRequest) -} \ No newline at end of file diff --git a/app/src/main/java/com/ivy/wallet/io/network/service/ExchangeRatesService.kt b/app/src/main/java/com/ivy/wallet/io/network/service/ExchangeRatesService.kt deleted file mode 100644 index a0402526f1..0000000000 --- a/app/src/main/java/com/ivy/wallet/io/network/service/ExchangeRatesService.kt +++ /dev/null @@ -1,14 +0,0 @@ -package com.ivy.wallet.io.network.service - -import androidx.annotation.Keep -import com.ivy.wallet.io.network.request.currency.ExchangeRatesResponse -import retrofit2.http.GET -import retrofit2.http.Url - -@Keep -interface ExchangeRatesService { - @GET - suspend fun getExchangeRates( - @Url url: String, - ): ExchangeRatesResponse -} \ No newline at end of file diff --git a/app/src/main/java/com/ivy/wallet/io/network/service/ExpImagesService.kt b/app/src/main/java/com/ivy/wallet/io/network/service/ExpImagesService.kt deleted file mode 100644 index 7a3c4113cb..0000000000 --- a/app/src/main/java/com/ivy/wallet/io/network/service/ExpImagesService.kt +++ /dev/null @@ -1,10 +0,0 @@ -package com.ivy.wallet.io.network.service - -import androidx.annotation.Keep -import retrofit2.http.GET - -@Keep -interface ExpImagesService { - @GET - suspend fun fetchImages(): List -} \ No newline at end of file diff --git a/app/src/main/java/com/ivy/wallet/io/network/service/LoanService.kt b/app/src/main/java/com/ivy/wallet/io/network/service/LoanService.kt deleted file mode 100644 index 2d4524077a..0000000000 --- a/app/src/main/java/com/ivy/wallet/io/network/service/LoanService.kt +++ /dev/null @@ -1,27 +0,0 @@ -package com.ivy.wallet.io.network.service - -import androidx.annotation.Keep -import com.ivy.wallet.io.network.request.loan.* -import retrofit2.http.* - -@Keep -interface LoanService { - @POST("/wallet/loans/update") - suspend fun update(@Body request: UpdateLoanRequest) - - @GET("/wallet/loans") - suspend fun get(@Query("after") after: Long? = null): LoansResponse - - @HTTP(method = "DELETE", path = "/wallet/loans/delete", hasBody = true) - suspend fun delete(@Body request: DeleteLoanRequest) - - //LOAN RECORDS ---------------------------------------------------------------- - @POST("/wallet/loans/update-record") - suspend fun updateRecord(@Body request: UpdateLoanRecordRequest) - - @GET("/wallet/loans/records") - suspend fun getRecords(@Query("after") after: Long? = null): LoanRecordsResponse - - @HTTP(method = "DELETE", path = "/wallet/loans/delete-record", hasBody = true) - suspend fun deleteRecord(@Body request: DeleteLoanRecordRequest) -} \ No newline at end of file diff --git a/app/src/main/java/com/ivy/wallet/io/network/service/NukeService.kt b/app/src/main/java/com/ivy/wallet/io/network/service/NukeService.kt deleted file mode 100644 index bfe19d9e7e..0000000000 --- a/app/src/main/java/com/ivy/wallet/io/network/service/NukeService.kt +++ /dev/null @@ -1,10 +0,0 @@ -package com.ivy.wallet.io.network.service - -import androidx.annotation.Keep -import retrofit2.http.POST - -@Keep -interface NukeService { - @POST("wallet/nuke/delete-all-user-data") - suspend fun deleteAllUserData() -} \ No newline at end of file diff --git a/app/src/main/java/com/ivy/wallet/io/network/service/PlannedPaymentRuleService.kt b/app/src/main/java/com/ivy/wallet/io/network/service/PlannedPaymentRuleService.kt deleted file mode 100644 index e7b7848a9d..0000000000 --- a/app/src/main/java/com/ivy/wallet/io/network/service/PlannedPaymentRuleService.kt +++ /dev/null @@ -1,19 +0,0 @@ -package com.ivy.wallet.io.network.service - -import androidx.annotation.Keep -import com.ivy.wallet.io.network.request.planned.DeletePlannedPaymentRuleRequest -import com.ivy.wallet.io.network.request.planned.PlannedPaymentRulesResponse -import com.ivy.wallet.io.network.request.planned.UpdatePlannedPaymentRuleRequest -import retrofit2.http.* - -@Keep -interface PlannedPaymentRuleService { - @POST("/wallet/planned-payments/update") - suspend fun update(@Body request: UpdatePlannedPaymentRuleRequest) - - @GET("/wallet/planned-payments") - suspend fun get(@Query("after") after: Long? = null): PlannedPaymentRulesResponse - - @HTTP(method = "DELETE", path = "/wallet/planned-payments/delete", hasBody = true) - suspend fun delete(@Body request: DeletePlannedPaymentRuleRequest) -} \ No newline at end of file diff --git a/app/src/main/java/com/ivy/wallet/io/network/service/TransactionService.kt b/app/src/main/java/com/ivy/wallet/io/network/service/TransactionService.kt deleted file mode 100644 index aba6416012..0000000000 --- a/app/src/main/java/com/ivy/wallet/io/network/service/TransactionService.kt +++ /dev/null @@ -1,26 +0,0 @@ -package com.ivy.wallet.io.network.service - -import androidx.annotation.Keep -import com.ivy.wallet.io.network.request.transaction.DeleteTransactionRequest -import com.ivy.wallet.io.network.request.transaction.TransactionsResponse -import com.ivy.wallet.io.network.request.transaction.UpdateTransactionRequest -import retrofit2.http.* - -@Keep -interface TransactionService { - @POST("/wallet/transactions/update") - suspend fun update(@Body request: UpdateTransactionRequest) - - @GET("/wallet/transactions") - suspend fun get(@Query("after") after: Long? = null): TransactionsResponse - - @GET("/wallet/transactions/paginated") - suspend fun getPaginated( - @Query("page") page: Int, - @Query("size") size: Int - ): TransactionsResponse - - - @HTTP(method = "DELETE", path = "/wallet/transactions/delete", hasBody = true) - suspend fun delete(@Body request: DeleteTransactionRequest) -} \ No newline at end of file diff --git a/app/src/main/java/com/ivy/wallet/backup/ktor/KtorClient.kt b/app/src/main/java/com/ivy/wallet/ktor/KtorClient.kt similarity index 95% rename from app/src/main/java/com/ivy/wallet/backup/ktor/KtorClient.kt rename to app/src/main/java/com/ivy/wallet/ktor/KtorClient.kt index 7b2ca75c33..ab3533a5bc 100644 --- a/app/src/main/java/com/ivy/wallet/backup/ktor/KtorClient.kt +++ b/app/src/main/java/com/ivy/wallet/ktor/KtorClient.kt @@ -1,4 +1,4 @@ -package com.ivy.wallet.backup.ktor +package com.ivy.wallet.ktor import io.ktor.client.HttpClient import io.ktor.client.plugins.contentnegotiation.ContentNegotiation diff --git a/app/src/main/java/com/ivy/wallet/backup/ktor/KtorClientModule.kt b/app/src/main/java/com/ivy/wallet/ktor/KtorClientModule.kt similarity index 91% rename from app/src/main/java/com/ivy/wallet/backup/ktor/KtorClientModule.kt rename to app/src/main/java/com/ivy/wallet/ktor/KtorClientModule.kt index e7964f552b..ec3a15fe60 100644 --- a/app/src/main/java/com/ivy/wallet/backup/ktor/KtorClientModule.kt +++ b/app/src/main/java/com/ivy/wallet/ktor/KtorClientModule.kt @@ -1,4 +1,4 @@ -package com.ivy.wallet.backup.ktor +package com.ivy.wallet.ktor import dagger.Module import dagger.Provides diff --git a/app/src/main/java/com/ivy/wallet/backup/kotlinxserilzation/UUIDSerializer.kt b/app/src/main/java/com/ivy/wallet/ktor/kotlinxserilzation/UUIDSerializer.kt similarity index 92% rename from app/src/main/java/com/ivy/wallet/backup/kotlinxserilzation/UUIDSerializer.kt rename to app/src/main/java/com/ivy/wallet/ktor/kotlinxserilzation/UUIDSerializer.kt index ef51eecd19..03ff62d7d0 100644 --- a/app/src/main/java/com/ivy/wallet/backup/kotlinxserilzation/UUIDSerializer.kt +++ b/app/src/main/java/com/ivy/wallet/ktor/kotlinxserilzation/UUIDSerializer.kt @@ -1,4 +1,4 @@ -package com.ivy.wallet.backup.kotlinxserilzation +package com.ivy.wallet.ktor.kotlinxserilzation import kotlinx.serialization.KSerializer import kotlinx.serialization.descriptors.PrimitiveKind diff --git a/app/src/main/java/com/ivy/wallet/ui/RootActivity.kt b/app/src/main/java/com/ivy/wallet/ui/RootActivity.kt index e7462b121c..e454c5ea66 100644 --- a/app/src/main/java/com/ivy/wallet/ui/RootActivity.kt +++ b/app/src/main/java/com/ivy/wallet/ui/RootActivity.kt @@ -50,7 +50,6 @@ import com.ivy.wallet.R import com.ivy.wallet.backup.github.ui.GitHubBackupScreen import com.ivy.wallet.domain.data.TransactionType import com.ivy.wallet.domain.deprecated.logic.CustomerJourneyLogic -import com.ivy.wallet.ui.analytics.AnalyticsReport import com.ivy.wallet.ui.applocked.AppLockedScreen import com.ivy.wallet.ui.balance.BalanceScreen import com.ivy.wallet.ui.budget.BudgetScreen @@ -75,7 +74,6 @@ import com.ivy.wallet.ui.settings.SettingsScreen import com.ivy.wallet.ui.statistic.level1.PieChartStatisticScreen import com.ivy.wallet.ui.statistic.level2.ItemStatisticScreen import com.ivy.wallet.ui.test.TestScreen -import com.ivy.wallet.ui.webView.WebViewScreen import com.ivy.wallet.ui.widget.AddTransactionWidget import com.ivy.wallet.ui.widget.AddTransactionWidgetCompact import com.ivy.wallet.ui.widget.WalletBalanceWidgetReceiver @@ -222,14 +220,12 @@ class RootActivity : AppCompatActivity() { is Test -> TestScreen(screen = screen) is Charts -> ChartsScreen(screen = screen) - is AnalyticsReport -> AnalyticsReport(screen = screen) is Import -> ImportCSVScreen(screen = screen) is Report -> ReportScreen(screen = screen) is BudgetScreen -> BudgetScreen(screen = screen) is Loans -> LoansScreen(screen = screen) is LoanDetails -> LoanDetailsScreen(screen = screen) is Search -> SearchScreen(screen = screen) - is IvyWebView -> WebViewScreen(screen = screen) is DonateScreen -> DonateScreen(screen = screen) is CSVScreen -> CSVScreen(screen = screen) is GitHubBackupScreen -> GitHubBackupScreen() diff --git a/app/src/main/java/com/ivy/wallet/ui/RootViewModel.kt b/app/src/main/java/com/ivy/wallet/ui/RootViewModel.kt index e13f40e939..cf70e5f415 100644 --- a/app/src/main/java/com/ivy/wallet/ui/RootViewModel.kt +++ b/app/src/main/java/com/ivy/wallet/ui/RootViewModel.kt @@ -14,8 +14,6 @@ import com.ivy.wallet.android.billing.IvyBilling import com.ivy.wallet.domain.data.TransactionType import com.ivy.wallet.domain.deprecated.logic.PaywallLogic import com.ivy.wallet.domain.deprecated.logic.notification.TransactionReminderLogic -import com.ivy.wallet.io.network.IvyAnalytics -import com.ivy.wallet.io.network.IvySession import com.ivy.wallet.io.persistence.SharedPrefs import com.ivy.wallet.io.persistence.dao.SettingsDao import com.ivy.wallet.migrations.MigrationsManager @@ -38,10 +36,8 @@ import javax.inject.Inject class RootViewModel @Inject constructor( private val ivyContext: IvyWalletCtx, private val nav: Navigation, - private val ivyAnalytics: IvyAnalytics, private val settingsDao: SettingsDao, private val sharedPrefs: SharedPrefs, - private val ivySession: IvySession, private val ivyBilling: IvyBilling, private val paywallLogic: PaywallLogic, private val transactionReminderLogic: TransactionReminderLogic, @@ -77,9 +73,6 @@ class RootViewModel @Inject constructor( TestIdlingResource.increment() ioThread { - ivySession.loadFromCache() - ivyAnalytics.loadSession() - appLockEnabled = sharedPrefs.getBoolean(SharedPrefs.APP_LOCK_ENABLED, false) //initial app locked state _appLocked.value = appLockEnabled diff --git a/app/src/main/java/com/ivy/wallet/ui/Screens.kt b/app/src/main/java/com/ivy/wallet/ui/Screens.kt index 66869a067c..a38dc71c64 100644 --- a/app/src/main/java/com/ivy/wallet/ui/Screens.kt +++ b/app/src/main/java/com/ivy/wallet/ui/Screens.kt @@ -4,7 +4,7 @@ import com.ivy.frp.view.navigation.Screen import com.ivy.wallet.domain.data.TransactionType import com.ivy.wallet.domain.data.core.Transaction import com.ivy.wallet.ui.paywall.PaywallReason -import java.util.* +import java.util.UUID object Main : Screen @@ -91,6 +91,4 @@ data class LoanDetails( object Test : Screen -data class IvyWebView(val url: String) : Screen - object Charts : Screen diff --git a/app/src/main/java/com/ivy/wallet/ui/accounts/AccountsViewModel.kt b/app/src/main/java/com/ivy/wallet/ui/accounts/AccountsViewModel.kt index 135ac2d971..0d5775c498 100644 --- a/app/src/main/java/com/ivy/wallet/ui/accounts/AccountsViewModel.kt +++ b/app/src/main/java/com/ivy/wallet/ui/accounts/AccountsViewModel.kt @@ -10,7 +10,6 @@ import com.ivy.wallet.domain.action.viewmodel.account.AccountDataAct import com.ivy.wallet.domain.action.wallet.CalcWalletBalanceAct import com.ivy.wallet.domain.data.core.Account import com.ivy.wallet.domain.deprecated.logic.AccountCreator -import com.ivy.wallet.domain.deprecated.sync.item.AccountSync import com.ivy.wallet.domain.event.AccountsUpdatedEvent import com.ivy.wallet.domain.pure.data.WalletDAOs import com.ivy.wallet.io.persistence.SharedPrefs @@ -35,7 +34,6 @@ class AccountsViewModel @Inject constructor( private val walletDAOs: WalletDAOs, private val accountDao: AccountDao, private val settingsDao: SettingsDao, - private val accountSync: AccountSync, private val accountCreator: AccountCreator, private val ivyContext: IvyWalletCtx, private val sharedPrefs: SharedPrefs, @@ -126,10 +124,6 @@ class AccountsViewModel @Inject constructor( } startInternally() - ioThread { - accountSync.sync() - } - TestIdlingResource.decrement() } diff --git a/app/src/main/java/com/ivy/wallet/ui/analytics/AnalyticsReportScreen.kt b/app/src/main/java/com/ivy/wallet/ui/analytics/AnalyticsReportScreen.kt deleted file mode 100644 index 3a38ce9dd1..0000000000 --- a/app/src/main/java/com/ivy/wallet/ui/analytics/AnalyticsReportScreen.kt +++ /dev/null @@ -1,321 +0,0 @@ -package com.ivy.wallet.ui.analytics - -import androidx.compose.foundation.horizontalScroll -import androidx.compose.foundation.layout.Arrangement -import androidx.compose.foundation.layout.BoxWithConstraintsScope -import androidx.compose.foundation.layout.Column -import androidx.compose.foundation.layout.ColumnScope -import androidx.compose.foundation.layout.Row -import androidx.compose.foundation.layout.Spacer -import androidx.compose.foundation.layout.fillMaxSize -import androidx.compose.foundation.layout.fillMaxWidth -import androidx.compose.foundation.layout.height -import androidx.compose.foundation.layout.systemBarsPadding -import androidx.compose.foundation.layout.width -import androidx.compose.foundation.rememberScrollState -import androidx.compose.material3.Text -import androidx.compose.runtime.Composable -import androidx.compose.runtime.getValue -import androidx.compose.runtime.livedata.observeAsState -import androidx.compose.ui.Alignment -import androidx.compose.ui.Modifier -import androidx.compose.ui.tooling.preview.Preview -import androidx.compose.ui.unit.dp -import androidx.lifecycle.viewmodel.compose.viewModel -import com.ivy.design.l0_system.UI -import com.ivy.design.l0_system.colorAs -import com.ivy.wallet.R -import com.ivy.wallet.ui.AnalyticsReport -import com.ivy.wallet.ui.IvyWalletPreview -import com.ivy.wallet.ui.analytics.model.Health -import com.ivy.wallet.ui.analytics.model.KPIs -import com.ivy.wallet.ui.analytics.model.OnboardingReport -import com.ivy.wallet.ui.analytics.model.UserStats -import com.ivy.wallet.ui.analytics.tab.HealthTab -import com.ivy.wallet.ui.analytics.tab.KPIsTab -import com.ivy.wallet.ui.analytics.tab.OnboardingReportTab -import com.ivy.wallet.ui.analytics.tab.UserStatsTab -import com.ivy.wallet.ui.ivyWalletCtx -import com.ivy.wallet.ui.theme.Gradient -import com.ivy.wallet.ui.theme.GradientIvy -import com.ivy.wallet.ui.theme.Gray -import com.ivy.wallet.ui.theme.Orange -import com.ivy.wallet.ui.theme.components.CircleButton -import com.ivy.wallet.ui.theme.components.IvyButton -import com.ivy.wallet.ui.theme.components.IvyOutlinedButton -import com.ivy.wallet.utils.dateNowUTC -import com.ivy.wallet.utils.formatDateOnly -import com.ivy.wallet.utils.onScreenStart -import java.time.LocalDateTime - - -@Composable -fun BoxWithConstraintsScope.AnalyticsReport(screen: AnalyticsReport) { - val viewModel: AnalyticsReportViewModel = viewModel() - - val selectedTab by viewModel.selectedTab.observeAsState(AnalyticsTab.KPIs) - val startDate by viewModel.startDate.observeAsState() - val endDate by viewModel.endDate.observeAsState() - - val onboardingReport by viewModel.onboardingReport.observeAsState() - val kpis by viewModel.kpis.observeAsState() - val health by viewModel.health.observeAsState() - val userStats by viewModel.userStats.observeAsState() - val loading by viewModel.loading.observeAsState(false) - - onScreenStart { - viewModel.start() - } - - UI( - selectedTab = selectedTab, - startDate = startDate, - endDate = endDate, - - onboardingReport = onboardingReport, - kpis = kpis, - health = health, - userStats = userStats, - loading = loading, - - onRefresh = viewModel::start, - onSetStartDate = viewModel::setStartDate, - onSetEndDate = viewModel::setEndDate, - onSelectTab = viewModel::selectTab, - onNukeTestEvents = viewModel::nukeTestEvents - ) -} - -@Composable -private fun UI( - selectedTab: AnalyticsTab, - startDate: LocalDateTime?, - endDate: LocalDateTime?, - - onboardingReport: OnboardingReport?, - kpis: KPIs?, - health: Health?, - userStats: UserStats?, - loading: Boolean, - - onRefresh: () -> Unit = {}, - onSetStartDate: (LocalDateTime?) -> Unit = {}, - onSetEndDate: (LocalDateTime?) -> Unit = {}, - onSelectTab: (AnalyticsTab) -> Unit = {}, - onNukeTestEvents: () -> Unit = {}, -) { - Column( - modifier = Modifier - .fillMaxSize() - .systemBarsPadding(), - verticalArrangement = Arrangement.Center, - horizontalAlignment = Alignment.CenterHorizontally - ) { - Spacer(Modifier.height(16.dp)) - - Row( - modifier = Modifier - .align(Alignment.Start) - .horizontalScroll(rememberScrollState()), - verticalAlignment = Alignment.CenterVertically - ) { - Spacer(Modifier.width(24.dp)) - - CircleButton( - icon = R.drawable.ic_sync - ) { - onRefresh() - } - - Spacer(Modifier.width(16.dp)) - - val ivyContext = ivyWalletCtx() - IvyOutlinedButton( - iconStart = R.drawable.ic_calendar, - text = startDate?.toLocalDate()?.formatDateOnly() ?: "Not set", - ) { - ivyContext.datePicker( - initialDate = null - ) { - onSetStartDate(it.atStartOfDay()) - } - } - - Spacer(Modifier.width(8.dp)) - - IvyOutlinedButton( - iconStart = R.drawable.ic_calendar, - text = endDate?.toLocalDate()?.formatDateOnly() ?: "Not set", - ) { - ivyContext.datePicker( - initialDate = null - ) { - onSetEndDate(it.atStartOfDay()) - } - } - - Spacer(Modifier.width(8.dp)) - - IvyOutlinedButton( - iconStart = R.drawable.ic_calendar, - text = "Today", - ) { - onSetStartDate(dateNowUTC().atStartOfDay()) - onSetEndDate(dateNowUTC().plusDays(1).atStartOfDay()) - } - - Spacer(Modifier.width(8.dp)) - - IvyOutlinedButton( - iconStart = R.drawable.ic_calendar, - text = "Clear", - ) { - onSetStartDate(null) - onSetEndDate(null) - } - - Spacer(Modifier.width(8.dp)) - - IvyOutlinedButton( - iconStart = R.drawable.ic_delete, - text = "Nuke Test", - ) { - onNukeTestEvents() - } - - Spacer(Modifier.width(24.dp)) - } - - - Spacer(Modifier.height(8.dp)) - - if (loading || onboardingReport == null || kpis == null || - health == null || userStats == null - ) { - Text( - text = "Loading...", - style = UI.typo.h2.colorAs(Orange) - ) - } else { - Content( - selectedTab = selectedTab, - onboardingReport = onboardingReport, - kpis = kpis, - health = health, - userStats = userStats, - setSelectedTab = onSelectTab - ) - } - } -} - -@Composable -private fun ColumnScope.Content( - selectedTab: AnalyticsTab, - onboardingReport: OnboardingReport, - kpis: KPIs, - health: Health, - userStats: UserStats, - - setSelectedTab: (AnalyticsTab) -> Unit, -) { - - Spacer(Modifier.height(24.dp)) - - when (selectedTab) { - AnalyticsTab.KPIs -> KPIsTab( - kpis = kpis, - activeUsersCount = userStats.activeUsers + userStats.powerUsers, - onboardingCompletedEventCount = onboardingReport.onboardingCompleted ?: 0, - onboardingStartedEventCount = onboardingReport.onboardingStarted ?: 0 - ) - AnalyticsTab.Onboarding -> OnboardingReportTab( - report = onboardingReport - ) - AnalyticsTab.Health -> HealthTab( - onboardedUsers = kpis.onboardedUsers, - localAccountCount = onboardingReport.onboardingLocalAccount, - health = health - ) - AnalyticsTab.UserStats -> UserStatsTab( - onboardedUsersGoogle = kpis.onboardedUsers, - userStats = userStats - ) - } - - Spacer(Modifier.height(24.dp)) - - Row( - modifier = Modifier - .fillMaxWidth() - .horizontalScroll(rememberScrollState()), - verticalAlignment = Alignment.CenterVertically, - horizontalArrangement = Arrangement.SpaceEvenly - ) { - Spacer(Modifier.width(24.dp)) - - IvyButton( - text = "KPIs", - backgroundGradient = if (selectedTab == AnalyticsTab.KPIs) GradientIvy else Gradient.solid( - Gray - ) - ) { - setSelectedTab(AnalyticsTab.KPIs) - } - - Spacer(Modifier.width(16.dp)) - - IvyButton( - text = "Onboarding", - backgroundGradient = if (selectedTab == AnalyticsTab.Onboarding) GradientIvy else Gradient.solid( - Gray - ) - ) { - setSelectedTab(AnalyticsTab.Onboarding) - } - - Spacer(Modifier.width(16.dp)) - - IvyButton( - text = "Health", - backgroundGradient = if (selectedTab == AnalyticsTab.Health) GradientIvy else Gradient.solid( - Gray - ) - ) { - setSelectedTab(AnalyticsTab.Health) - } - - Spacer(Modifier.width(16.dp)) - - IvyButton( - text = "User Stats", - backgroundGradient = if (selectedTab == AnalyticsTab.UserStats) GradientIvy else Gradient.solid( - Gray - ) - ) { - setSelectedTab(AnalyticsTab.UserStats) - } - - Spacer(Modifier.width(24.dp)) - } - - Spacer(Modifier.height(12.dp)) -} - - -@Preview -@Composable -private fun Preview() { - IvyWalletPreview { - UI( - selectedTab = AnalyticsTab.KPIs, - startDate = dateNowUTC().atStartOfDay(), - endDate = dateNowUTC().plusDays(1).atStartOfDay(), - onboardingReport = null, - health = null, - userStats = null, - kpis = null, - loading = true - ) - } -} diff --git a/app/src/main/java/com/ivy/wallet/ui/analytics/AnalyticsReportViewModel.kt b/app/src/main/java/com/ivy/wallet/ui/analytics/AnalyticsReportViewModel.kt deleted file mode 100644 index 63f96d9625..0000000000 --- a/app/src/main/java/com/ivy/wallet/ui/analytics/AnalyticsReportViewModel.kt +++ /dev/null @@ -1,201 +0,0 @@ -package com.ivy.wallet.ui.analytics - -import androidx.lifecycle.MutableLiveData -import androidx.lifecycle.ViewModel -import androidx.lifecycle.viewModelScope -import com.ivy.wallet.domain.data.analytics.AnalyticsEvent -import com.ivy.wallet.io.network.RestClient -import com.ivy.wallet.ui.analytics.model.Health -import com.ivy.wallet.ui.analytics.model.KPIs -import com.ivy.wallet.ui.analytics.model.OnboardingReport -import com.ivy.wallet.ui.analytics.model.UserStats -import com.ivy.wallet.utils.asLiveData -import com.ivy.wallet.utils.ioThread -import com.ivy.wallet.utils.toEpochSeconds -import dagger.hilt.android.lifecycle.HiltViewModel -import kotlinx.coroutines.launch -import java.time.LocalDateTime -import javax.inject.Inject - -@HiltViewModel -class AnalyticsReportViewModel @Inject constructor( - private val restClient: RestClient -) : ViewModel() { - - private val _startDate = MutableLiveData() - val startDate = _startDate.asLiveData() - - private val _endDate = MutableLiveData() - val endDate = _endDate.asLiveData() - - private val _selectedTab = MutableLiveData(AnalyticsTab.KPIs) - val selectedTab = _selectedTab.asLiveData() - - private val _loading = MutableLiveData() - val loading = _loading.asLiveData() - - private val _kpis = MutableLiveData() - val kpis = _kpis.asLiveData() - - private val _onboardingReport = MutableLiveData() - val onboardingReport = _onboardingReport.asLiveData() - - private val _health = MutableLiveData() - val health = _health.asLiveData() - - private val _userStats = MutableLiveData() - val userStats = _userStats.asLiveData() - - fun start( - startDate: LocalDateTime? = this.startDate.value, - endDate: LocalDateTime? = this.endDate.value, - ) { - viewModelScope.launch { - try { - _startDate.value = startDate - _endDate.value = endDate - - _loading.value = true - - val report = ioThread { - restClient.analyticsService.getReport( - startDate = startDate?.toEpochSeconds(), - endDate = endDate?.toEpochSeconds() - ) - } - - val events = report.eventsCount - _onboardingReport.value = OnboardingReport( - onboardingStarted = events[AnalyticsEvent.ONBOARDING_STARTED], - avgOnboardingStarted = report.eventAvgCount?.get(AnalyticsEvent.ONBOARDING_STARTED), - - onboardingLogin = events[AnalyticsEvent.ONBOARDING_LOGIN], - onboardingPrivacyTCAccepted = events[AnalyticsEvent.ONBOARDING_PRIVACY_TC_ACCEPTED], - onboardingLocalAccount = events[AnalyticsEvent.ONBOARDING_LOCAL_ACCOUNT], - onboardingSetName = events[AnalyticsEvent.ONBOARDING_NAME_SET], - onboardingSetCurrency = events[AnalyticsEvent.ONBOARDING_CURRENCY_SET], - onboardingAddAccount = events[AnalyticsEvent.ONBOARDING_ACCOUNTS_DONE], - onboardingCompleted = events[AnalyticsEvent.ONBOARDING_COMPLETED] - ) - - KPIs( - onboardedUsers = report.onboardedUsersCount, - - usersCreatedAccount = report.usersCreatedAccount.size, - avgAccountsPerUser = avg(report.usersCreatedAccount), - - usersCreatedCategory = report.usersCreatedCategory.size, - avgCategoriesPerUser = avg(report.usersCreatedCategory), - - usersCreatedTransaction = report.usersCreatedTransaction.size, - avgTransactionsPerUser = avg(report.usersCreatedTransaction), - - usersCreatedPlannedPayment = report.usersCreatedPlannedPayment.size, - avgPlannedPaymentsPerUser = avg(report.usersCreatedPlannedPayment), - - paywallAccounts = report.eventsCount[AnalyticsEvent.PAYWALL_ACCOUNTS] ?: 0, - avgPaywallAccounts = report.eventAvgCount[AnalyticsEvent.PAYWALL_ACCOUNTS], - - paywallCategories = report.eventsCount[AnalyticsEvent.PAYWALL_CATEGORIES] ?: 0, - avgPaywallCategories = report.eventAvgCount[AnalyticsEvent.PAYWALL_CATEGORIES], - - paywallNoReason = report.eventsCount[AnalyticsEvent.PAYWALL_NO_REASON] ?: 0, - avgPaywallNoReason = report.eventAvgCount[AnalyticsEvent.PAYWALL_NO_REASON], - - paywallExportCSV = report.eventsCount[AnalyticsEvent.PAYWALL_EXPORT_CSV] ?: 0, - avgPaywallExportCSV = report.eventAvgCount[AnalyticsEvent.PAYWALL_EXPORT_CSV], - - paywallPremiumColor = report.eventsCount[AnalyticsEvent.PAYWALL_PREMIUM_COLOR] - ?: 0, - avgPaywallPremiumColor = report.eventAvgCount[AnalyticsEvent.PAYWALL_PREMIUM_COLOR], - - choosePlan = report.eventsCount[AnalyticsEvent.PAYWALL_CHOOSE_PLAN] ?: 0, - choosePlanMonthly = report.eventsCount[AnalyticsEvent.PAYWALL_CHOOSE_PLAN_MONTHLY] - ?: 0, - choosePlan6Month = report.eventsCount[AnalyticsEvent.PAYWALL_CHOOSE_PLAN_6MONTH] - ?: 0, - choosePlanYearly = report.eventsCount[AnalyticsEvent.PAYWALL_CHOOSE_PLAN_YEARLY] - ?: 0, - choosePlanLifetime = report.eventsCount[AnalyticsEvent.PAYWALL_CHOOSE_PLAN_LIFETIME] - ?: 0, - - startBuyPremium = report.eventsCount[AnalyticsEvent.PAYWALL_START_BUY] ?: 0, - startBuyPremiumMonthly = report.eventsCount[AnalyticsEvent.PAYWALL_START_BUY_MONTHLY] - ?: 0, - startBuyPremium6Month = report.eventsCount[AnalyticsEvent.PAYWALL_START_BUY_6MONTH] - ?: 0, - startBuyPremiumYearly = report.eventsCount[AnalyticsEvent.PAYWALL_START_BUY_YEARLY] - ?: 0, - startBuyPremiumLifetime = report.eventsCount[AnalyticsEvent.PAYWALL_START_BUY_LIFETIME] - ?: 0, - - activePremium = report.eventsCount[AnalyticsEvent.PAYWALL_ACTIVE_PREMIUM] ?: 0, - ).also { _kpis.value = it } - - _health.value = Health( - usersWithTransactionLast24h = report.usersWithTransactionLast24H.size, - avgTransactionsLast24 = avg(report.usersWithTransactionLast24H), - - usersWithTransactionLast7Days = report.usersWithTransactionLast7Days.size, - avgTransactionsLast7Days = avg(report.usersWithTransactionLast7Days), - - usersWithTransactionLast30Days = report.usersWithTransactionLast30Days.size, - avgTransactionsLast30Days = avg(report.usersWithTransactionLast30Days), - - loggedFromSettings = report.eventsCount[AnalyticsEvent.LOGIN_FROM_SETTINGS] ?: 0 - ) - - _userStats.value = UserStats( - powerUsers = report.powerUsersV1.size, - avgPowerUsersTrns = avg(report.powerUsersV1), - - activeUsers = report.activeUsersV1.size, - avgActiveUsersTrns = avg(report.activeUsersV1), - - dyingUsers = report.dyingUsersV1.size, - avgDyingUsers = avg(report.dyingUsersV1) - ) - - _loading.value = false - } catch (e: Exception) { - e.printStackTrace() - _loading.value = false - } - } - } - - fun selectTab(tab: AnalyticsTab) { - _selectedTab.value = tab - } - - fun setStartDate(startDate: LocalDateTime?) { - start( - startDate = startDate, - endDate = endDate.value - ) - } - - fun setEndDate(endDate: LocalDateTime?) { - start( - startDate = startDate.value, - endDate = endDate - ) - } - - fun nukeTestEvents() { - viewModelScope.launch { - ioThread { - restClient.analyticsService.nukeTestEvents() - } - - start() - } - } - - private fun avg(list: List): Double = list - .takeIf { - list.isNotEmpty() - } - ?.sum() - ?.div(list.size.toDouble()) ?: 0.0 -} \ No newline at end of file diff --git a/app/src/main/java/com/ivy/wallet/ui/analytics/AnalyticsTab.kt b/app/src/main/java/com/ivy/wallet/ui/analytics/AnalyticsTab.kt deleted file mode 100644 index 7d42637d6f..0000000000 --- a/app/src/main/java/com/ivy/wallet/ui/analytics/AnalyticsTab.kt +++ /dev/null @@ -1,5 +0,0 @@ -package com.ivy.wallet.ui.analytics - -enum class AnalyticsTab { - KPIs, Onboarding, Health, UserStats -} \ No newline at end of file diff --git a/app/src/main/java/com/ivy/wallet/ui/analytics/DataCircle.kt b/app/src/main/java/com/ivy/wallet/ui/analytics/DataCircle.kt deleted file mode 100644 index 83dca8a44c..0000000000 --- a/app/src/main/java/com/ivy/wallet/ui/analytics/DataCircle.kt +++ /dev/null @@ -1,73 +0,0 @@ -package com.ivy.wallet.ui.analytics - -import androidx.compose.foundation.background -import androidx.compose.foundation.layout.Column -import androidx.compose.foundation.layout.Spacer -import androidx.compose.foundation.layout.height -import androidx.compose.foundation.layout.padding -import androidx.compose.foundation.shape.CircleShape -import androidx.compose.material3.Text -import androidx.compose.runtime.Composable -import androidx.compose.ui.Alignment -import androidx.compose.ui.Modifier -import androidx.compose.ui.graphics.Color -import androidx.compose.ui.text.style.TextAlign -import androidx.compose.ui.unit.dp -import com.ivy.design.l0_system.UI -import com.ivy.design.l0_system.colorAs -import com.ivy.design.l0_system.style -import com.ivy.wallet.ui.theme.findContrastTextColor -import com.ivy.wallet.utils.format - - -@Composable -fun DataCircle( - count: Int, - metric: String, - circleColor: Color, - parentCount: Int?, - avgCount: Double? = null -) { - Column( - horizontalAlignment = Alignment.CenterHorizontally - ) { - Text( - modifier = Modifier - .background(circleColor, CircleShape) - .padding(all = 24.dp), - text = count.toString(), - style = UI.typo.nH1.style( - color = findContrastTextColor(circleColor), - textAlign = TextAlign.Center - ) - ) - - Spacer(Modifier.height(12.dp)) - - Text( - text = metric, - style = UI.typo.b1.style( - textAlign = TextAlign.Center - ) - ) - - if (parentCount != null && parentCount != 0) { - Spacer(Modifier.height(4.dp)) - - Text( - text = "${(count / parentCount.toDouble()).times(100).format(2)}%", - style = UI.typo.nB2.colorAs(UI.colors.mediumInverse) - ) - } - - if (avgCount != null) { - Spacer(Modifier.height(4.dp)) - - Text( - text = "AVG ${avgCount.format(2)}", - style = UI.typo.nC.colorAs(UI.colors.mediumInverse) - ) - } - } - -} \ No newline at end of file diff --git a/app/src/main/java/com/ivy/wallet/ui/analytics/model/Health.kt b/app/src/main/java/com/ivy/wallet/ui/analytics/model/Health.kt deleted file mode 100644 index 618a81fce7..0000000000 --- a/app/src/main/java/com/ivy/wallet/ui/analytics/model/Health.kt +++ /dev/null @@ -1,14 +0,0 @@ -package com.ivy.wallet.ui.analytics.model - -data class Health( - val usersWithTransactionLast24h: Int, - val avgTransactionsLast24: Double, - - val usersWithTransactionLast7Days: Int, - val avgTransactionsLast7Days: Double, - - val usersWithTransactionLast30Days: Int, - val avgTransactionsLast30Days: Double, - - val loggedFromSettings: Int, -) \ No newline at end of file diff --git a/app/src/main/java/com/ivy/wallet/ui/analytics/model/KPIs.kt b/app/src/main/java/com/ivy/wallet/ui/analytics/model/KPIs.kt deleted file mode 100644 index 3459282f10..0000000000 --- a/app/src/main/java/com/ivy/wallet/ui/analytics/model/KPIs.kt +++ /dev/null @@ -1,48 +0,0 @@ -package com.ivy.wallet.ui.analytics.model - -data class KPIs( - val onboardedUsers: Int, - - val usersCreatedAccount: Int, - val avgAccountsPerUser: Double, - - val usersCreatedCategory: Int, - val avgCategoriesPerUser: Double, - - val usersCreatedTransaction: Int, - val avgTransactionsPerUser: Double, - - val usersCreatedPlannedPayment: Int, - val avgPlannedPaymentsPerUser: Double, - - //Paywall - val paywallAccounts: Int, - val avgPaywallAccounts: Double?, - - val paywallCategories: Int, - val avgPaywallCategories: Double?, - - val paywallNoReason: Int, - val avgPaywallNoReason: Double?, - - val paywallExportCSV: Int, - val avgPaywallExportCSV: Double?, - - val paywallPremiumColor: Int, - val avgPaywallPremiumColor: Double?, - - //Premium - val choosePlan: Int, - val choosePlanMonthly: Int, - val choosePlan6Month: Int, - val choosePlanYearly: Int, - val choosePlanLifetime: Int, - - val startBuyPremium: Int, - val startBuyPremiumMonthly: Int, - val startBuyPremium6Month: Int, - val startBuyPremiumYearly: Int, - val startBuyPremiumLifetime: Int, - - val activePremium: Int -) \ No newline at end of file diff --git a/app/src/main/java/com/ivy/wallet/ui/analytics/model/OnboardingReport.kt b/app/src/main/java/com/ivy/wallet/ui/analytics/model/OnboardingReport.kt deleted file mode 100644 index 97fda738e8..0000000000 --- a/app/src/main/java/com/ivy/wallet/ui/analytics/model/OnboardingReport.kt +++ /dev/null @@ -1,14 +0,0 @@ -package com.ivy.wallet.ui.analytics.model - -data class OnboardingReport( - val onboardingStarted: Int?, - val avgOnboardingStarted: Double?, - - val onboardingLogin: Int?, - val onboardingPrivacyTCAccepted: Int?, - val onboardingLocalAccount: Int?, - val onboardingSetName: Int?, - val onboardingSetCurrency: Int?, - val onboardingAddAccount: Int?, - val onboardingCompleted: Int?, -) \ No newline at end of file diff --git a/app/src/main/java/com/ivy/wallet/ui/analytics/model/UserStats.kt b/app/src/main/java/com/ivy/wallet/ui/analytics/model/UserStats.kt deleted file mode 100644 index f8edc20439..0000000000 --- a/app/src/main/java/com/ivy/wallet/ui/analytics/model/UserStats.kt +++ /dev/null @@ -1,12 +0,0 @@ -package com.ivy.wallet.ui.analytics.model - -data class UserStats( - val powerUsers: Int, - val avgPowerUsersTrns: Double, - - val activeUsers: Int, - val avgActiveUsersTrns: Double, - - val dyingUsers: Int, - val avgDyingUsers: Double, -) \ No newline at end of file diff --git a/app/src/main/java/com/ivy/wallet/ui/analytics/tab/HealthTab.kt b/app/src/main/java/com/ivy/wallet/ui/analytics/tab/HealthTab.kt deleted file mode 100644 index ccb81cc1c0..0000000000 --- a/app/src/main/java/com/ivy/wallet/ui/analytics/tab/HealthTab.kt +++ /dev/null @@ -1,97 +0,0 @@ -package com.ivy.wallet.ui.analytics.tab - -import androidx.compose.foundation.horizontalScroll -import androidx.compose.foundation.layout.* -import androidx.compose.foundation.rememberScrollState -import androidx.compose.runtime.Composable -import androidx.compose.ui.Alignment -import androidx.compose.ui.Modifier -import androidx.compose.ui.tooling.preview.Preview -import androidx.compose.ui.unit.dp -import com.ivy.wallet.ui.IvyWalletPreview -import com.ivy.wallet.ui.analytics.DataCircle -import com.ivy.wallet.ui.analytics.model.Health -import com.ivy.wallet.ui.theme.Ivy -import com.ivy.wallet.ui.theme.IvyDark -import com.ivy.wallet.ui.theme.Orange -import com.ivy.wallet.ui.theme.Red - -@Composable -fun ColumnScope.HealthTab( - onboardedUsers: Int, - localAccountCount: Int?, - health: Health -) { - Row( - modifier = Modifier - .weight(1f) - .horizontalScroll(rememberScrollState()), - verticalAlignment = Alignment.CenterVertically, - ) { - Spacer(Modifier.width(32.dp)) - - DataCircle( - count = health.usersWithTransactionLast24h, - metric = "Users made\ntrn last 24h", - circleColor = Ivy, - parentCount = onboardedUsers, - avgCount = health.avgTransactionsLast24 - ) - - Spacer(Modifier.width(32.dp)) - - DataCircle( - count = health.usersWithTransactionLast7Days, - metric = "Users made\ntrn last 7 days", - circleColor = IvyDark, - parentCount = onboardedUsers, - avgCount = health.avgTransactionsLast7Days - ) - - Spacer(Modifier.width(32.dp)) - - DataCircle( - count = health.usersWithTransactionLast30Days, - metric = "Users made\ntrn last 30 days", - circleColor = Orange, - parentCount = onboardedUsers, - avgCount = health.avgTransactionsLast30Days - ) - - Spacer(Modifier.width(32.dp)) - - DataCircle( - count = health.loggedFromSettings, - metric = "Login from Settings", - circleColor = Red, - parentCount = localAccountCount, - ) - - Spacer(Modifier.width(32.dp)) - } -} - -@Preview -@Composable -private fun Preview() { - IvyWalletPreview { - Column(Modifier.fillMaxSize()) { - HealthTab( - onboardedUsers = 1024, - localAccountCount = 120, - health = Health( - usersWithTransactionLast24h = 24, - avgTransactionsLast24 = 2.1, - - usersWithTransactionLast7Days = 108, - avgTransactionsLast7Days = 16.7, - - usersWithTransactionLast30Days = 130, - avgTransactionsLast30Days = 19.7, - - loggedFromSettings = 3, - ) - ) - } - } -} \ No newline at end of file diff --git a/app/src/main/java/com/ivy/wallet/ui/analytics/tab/KPIsTab.kt b/app/src/main/java/com/ivy/wallet/ui/analytics/tab/KPIsTab.kt deleted file mode 100644 index 459fec834f..0000000000 --- a/app/src/main/java/com/ivy/wallet/ui/analytics/tab/KPIsTab.kt +++ /dev/null @@ -1,359 +0,0 @@ -package com.ivy.wallet.ui.analytics.tab - -import androidx.compose.foundation.horizontalScroll -import androidx.compose.foundation.layout.* -import androidx.compose.foundation.rememberScrollState -import androidx.compose.foundation.verticalScroll -import androidx.compose.runtime.Composable -import androidx.compose.ui.Alignment -import androidx.compose.ui.Modifier -import androidx.compose.ui.tooling.preview.Preview -import androidx.compose.ui.unit.dp -import com.ivy.wallet.ui.IvyWalletPreview -import com.ivy.wallet.ui.analytics.DataCircle -import com.ivy.wallet.ui.analytics.model.KPIs -import com.ivy.wallet.ui.theme.* - -@Composable -fun ColumnScope.KPIsTab( - kpis: KPIs, - activeUsersCount: Int, - onboardingCompletedEventCount: Int, - onboardingStartedEventCount: Int, -) { - Row( - modifier = Modifier - .weight(1f) - .horizontalScroll(rememberScrollState()), - verticalAlignment = Alignment.CenterVertically, - ) { - Spacer(Modifier.width(32.dp)) - - DataCircle( - count = kpis.onboardedUsers, - metric = "Have 1 account\non server", - circleColor = Ivy, - parentCount = null - ) - - Spacer(Modifier.width(32.dp)) - - AccountCategoryTrnPlanned( - kpis = kpis - ) - - Spacer(Modifier.width(32.dp)) - - DataCircle( - count = onboardingStartedEventCount, - metric = "Onboarding\nStarted", - circleColor = Blue, - parentCount = null - ) - - Spacer(Modifier.width(32.dp)) - - DataCircle( - count = onboardingCompletedEventCount, - metric = "Onboarding\nCompleted", - circleColor = BlueDark, - parentCount = onboardingStartedEventCount - ) - - Spacer(Modifier.width(32.dp)) - - val totalPaywallHits = kpis.paywallAccounts + kpis.paywallCategories + - kpis.paywallNoReason + kpis.paywallExportCSV + kpis.paywallPremiumColor - DataCircle( - count = totalPaywallHits, - metric = "Paywall hits", - circleColor = Orange, - parentCount = onboardingCompletedEventCount - ) - - Spacer(Modifier.width(32.dp)) - - Paywall( - kpis = kpis, - onboardingCompletedEventCount = onboardingCompletedEventCount - ) - - Spacer(Modifier.width(32.dp)) - - DataCircle( - count = kpis.choosePlan, - metric = "Choose plan", - circleColor = IvyLight, - parentCount = totalPaywallHits - ) - - Spacer(Modifier.width(32.dp)) - - ChoosePlanOptions(kpis = kpis) - - Spacer(Modifier.width(32.dp)) - - DataCircle( - count = kpis.startBuyPremium, - metric = "Buy Prompt", - circleColor = IvyLight, - parentCount = kpis.choosePlan - ) - - Spacer(Modifier.width(32.dp)) - - BuyPlanOptions(kpis = kpis) - - Spacer(Modifier.width(32.dp)) - - DataCircle( - count = kpis.activePremium, - metric = "Active Premium", - circleColor = IvyDark, - parentCount = kpis.startBuyPremium - ) - - Spacer(Modifier.width(32.dp)) - } -} - -@Composable -private fun AccountCategoryTrnPlanned(kpis: KPIs) { - Column( - modifier = Modifier.verticalScroll(rememberScrollState()), - horizontalAlignment = Alignment.CenterHorizontally - ) { - Spacer(Modifier.height(32.dp)) - - DataCircle( - count = kpis.usersCreatedAccount, - metric = "Have at least\n2 accounts", - circleColor = Green, - parentCount = kpis.onboardedUsers, - avgCount = kpis.avgAccountsPerUser - ) - - Spacer(Modifier.height(32.dp)) - - DataCircle( - count = kpis.usersCreatedCategory, - metric = "Created category", - circleColor = Orange, - parentCount = kpis.onboardedUsers, - avgCount = kpis.avgCategoriesPerUser - ) - - Spacer(Modifier.height(32.dp)) - - DataCircle( - count = kpis.usersCreatedTransaction, - metric = "Created transaction", - circleColor = IvyDark, - parentCount = kpis.onboardedUsers, - avgCount = kpis.avgTransactionsPerUser - ) - - Spacer(Modifier.height(32.dp)) - - DataCircle( - count = kpis.usersCreatedPlannedPayment, - metric = "Created planned\npayment", - circleColor = Red, - parentCount = kpis.onboardedUsers, - avgCount = kpis.avgPlannedPaymentsPerUser - ) - - Spacer(Modifier.height(32.dp)) - } -} - -@Composable -private fun Paywall( - kpis: KPIs, - onboardingCompletedEventCount: Int -) { - Column( - modifier = Modifier.verticalScroll(rememberScrollState()), - horizontalAlignment = Alignment.CenterHorizontally - ) { - Spacer(Modifier.height(32.dp)) - - DataCircle( - count = kpis.paywallAccounts, - metric = "Paywall Accounts", - circleColor = RedDark, - parentCount = onboardingCompletedEventCount, - avgCount = kpis.avgPaywallAccounts - ) - - Spacer(Modifier.height(32.dp)) - - DataCircle( - count = kpis.paywallCategories, - metric = "Paywall Categories", - circleColor = Red, - parentCount = onboardingCompletedEventCount, - avgCount = kpis.avgPaywallCategories - ) - - Spacer(Modifier.height(32.dp)) - - DataCircle( - count = kpis.paywallNoReason, - metric = "Paywall Settings", - circleColor = RedLight, - parentCount = onboardingCompletedEventCount, - avgCount = kpis.avgPaywallNoReason - ) - - Spacer(Modifier.height(32.dp)) - - DataCircle( - count = kpis.paywallExportCSV, - metric = "Paywall CSV", - circleColor = Ivy, - parentCount = onboardingCompletedEventCount, - avgCount = kpis.avgPaywallExportCSV - ) - - Spacer(Modifier.height(32.dp)) - - DataCircle( - count = kpis.paywallPremiumColor, - metric = "Paywall Color", - circleColor = Blue, - parentCount = onboardingCompletedEventCount, - avgCount = kpis.avgPaywallPremiumColor - ) - - Spacer(Modifier.height(32.dp)) - } -} - -@Composable -private fun ChoosePlanOptions(kpis: KPIs) { - Column( - modifier = Modifier.verticalScroll(rememberScrollState()), - horizontalAlignment = Alignment.CenterHorizontally - ) { - Spacer(Modifier.height(32.dp)) - - DataCircle( - count = kpis.choosePlanMonthly, - metric = "Choose Monthly", - circleColor = Ivy, - parentCount = kpis.choosePlan, - ) - - Spacer(Modifier.height(32.dp)) - - DataCircle( - count = kpis.choosePlanYearly, - metric = "Choose Yearly", - circleColor = Green, - parentCount = kpis.choosePlan, - ) - - Spacer(Modifier.height(32.dp)) - - DataCircle( - count = kpis.choosePlanLifetime, - metric = "Choose Lifetime", - circleColor = Orange, - parentCount = kpis.choosePlan, - ) - - Spacer(Modifier.height(32.dp)) - } -} - -@Composable -private fun BuyPlanOptions(kpis: KPIs) { - Column( - modifier = Modifier.verticalScroll(rememberScrollState()), - horizontalAlignment = Alignment.CenterHorizontally - ) { - Spacer(Modifier.height(32.dp)) - - DataCircle( - count = kpis.startBuyPremiumMonthly, - metric = "Buy Monthly", - circleColor = Ivy, - parentCount = kpis.startBuyPremium, - ) - - Spacer(Modifier.height(32.dp)) - - DataCircle( - count = kpis.startBuyPremiumYearly, - metric = "Buy Yearly", - circleColor = Green, - parentCount = kpis.startBuyPremium, - ) - - Spacer(Modifier.height(32.dp)) - - DataCircle( - count = kpis.startBuyPremiumLifetime, - metric = "Buy Lifetime", - circleColor = Orange, - parentCount = kpis.startBuyPremium, - ) - - Spacer(Modifier.height(32.dp)) - } -} - -@Composable -@Preview -private fun Preview() { - IvyWalletPreview { - Column(Modifier.fillMaxSize()) { - KPIsTab( - kpis = KPIs( - onboardedUsers = 1000, - - usersCreatedAccount = 700, - avgAccountsPerUser = 2.4, - - usersCreatedCategory = 560, - avgCategoriesPerUser = 5.5, - - usersCreatedTransaction = 522, - avgTransactionsPerUser = 18.6, - - usersCreatedPlannedPayment = 430, - avgPlannedPaymentsPerUser = 13.0, - - paywallAccounts = 15, - avgPaywallAccounts = 2.3, - paywallCategories = 13, - avgPaywallCategories = 3.7, - paywallNoReason = 3, - avgPaywallNoReason = null, - paywallExportCSV = 2, - avgPaywallExportCSV = 1.7, - paywallPremiumColor = 1, - avgPaywallPremiumColor = 1.0, - - choosePlan = 10, - choosePlanMonthly = 3, - choosePlan6Month = 1, - choosePlanYearly = 6, - choosePlanLifetime = 8, - - startBuyPremium = 7, - startBuyPremiumMonthly = 2, - startBuyPremium6Month = 1, - startBuyPremiumYearly = 4, - startBuyPremiumLifetime = 5, - - activePremium = 3, - ), - activeUsersCount = 60, - onboardingCompletedEventCount = 823, - onboardingStartedEventCount = 1000 - ) - } - } -} \ No newline at end of file diff --git a/app/src/main/java/com/ivy/wallet/ui/analytics/tab/OnboardingReportTab.kt b/app/src/main/java/com/ivy/wallet/ui/analytics/tab/OnboardingReportTab.kt deleted file mode 100644 index 86f811ecd3..0000000000 --- a/app/src/main/java/com/ivy/wallet/ui/analytics/tab/OnboardingReportTab.kt +++ /dev/null @@ -1,162 +0,0 @@ -package com.ivy.wallet.ui.analytics.tab - -import androidx.compose.foundation.horizontalScroll -import androidx.compose.foundation.layout.* -import androidx.compose.foundation.rememberScrollState -import androidx.compose.foundation.verticalScroll -import androidx.compose.runtime.Composable -import androidx.compose.ui.Alignment -import androidx.compose.ui.Modifier -import androidx.compose.ui.tooling.preview.Preview -import androidx.compose.ui.unit.dp -import com.ivy.wallet.ui.IvyWalletPreview -import com.ivy.wallet.ui.analytics.DataCircle -import com.ivy.wallet.ui.analytics.model.OnboardingReport -import com.ivy.wallet.ui.theme.* - -@Composable -fun ColumnScope.OnboardingReportTab( - report: OnboardingReport -) { - Row( - modifier = Modifier - .weight(1f) - .horizontalScroll(rememberScrollState()), - verticalAlignment = Alignment.CenterVertically, - ) { - Spacer(Modifier.width(32.dp)) - - DataCircle( - count = report.onboardingStarted ?: 0, - metric = "Started", - circleColor = Blue, - avgCount = report.avgOnboardingStarted, - parentCount = null - ) - - Spacer(Modifier.width(32.dp)) - - LoginGoogleOrLocalAccount( - report = report - ) - - Spacer(Modifier.width(32.dp)) - -// PrivacyTCorSetName( -// report = report -// ) -// -// Spacer(Modifier.width(32.dp)) - - DataCircle( - count = report.onboardingSetCurrency ?: 0, - metric = "Set currency", - circleColor = IvyLight, - parentCount = report.onboardingLogin?.plus(report.onboardingLocalAccount ?: 0) - ) - - Spacer(Modifier.width(32.dp)) - - DataCircle( - count = report.onboardingAddAccount ?: 0, - metric = "Add account", - circleColor = IvyDark, - parentCount = report.onboardingSetCurrency - ) - - Spacer(Modifier.width(32.dp)) - - DataCircle( - count = report.onboardingCompleted ?: 0, - metric = "Completed", - circleColor = Green, - parentCount = report.onboardingAddAccount - ) - - Spacer(Modifier.width(32.dp)) - } -} - -@Composable -private fun LoginGoogleOrLocalAccount( - report: OnboardingReport -) { - Column( - modifier = Modifier.verticalScroll(rememberScrollState()), - horizontalAlignment = Alignment.CenterHorizontally - ) { - Spacer(Modifier.height(32.dp)) - - DataCircle( - count = report.onboardingLogin ?: 0, - metric = "Login Google", - circleColor = Red, - parentCount = report.onboardingStarted, - ) - - - Spacer(Modifier.height(32.dp)) - - DataCircle( - count = report.onboardingLocalAccount ?: 0, - metric = "Local Account", - circleColor = Gray, - parentCount = report.onboardingStarted, - ) - - Spacer(Modifier.height(32.dp)) - } -} - -@Composable -private fun PrivacyTCorSetName( - report: OnboardingReport -) { - Column( - modifier = Modifier.verticalScroll(rememberScrollState()), - horizontalAlignment = Alignment.CenterHorizontally - ) { - Spacer(Modifier.height(32.dp)) - - DataCircle( - count = report.onboardingPrivacyTCAccepted ?: 0, - metric = "Privacy & TC", - circleColor = IvyDark, - parentCount = report.onboardingLogin, - ) - - Spacer(Modifier.height(32.dp)) - - DataCircle( - count = report.onboardingSetName ?: 0, - metric = "Set name", - circleColor = Orange, - parentCount = report.onboardingLocalAccount, - ) - - Spacer(Modifier.height(32.dp)) - } -} - -@Preview -@Composable -private fun Preview() { - IvyWalletPreview { - Column(Modifier.fillMaxSize()) { - OnboardingReportTab( - report = OnboardingReport( - onboardingStarted = 1000, - avgOnboardingStarted = 1.34, - - onboardingLogin = 970, - onboardingPrivacyTCAccepted = 950, - onboardingLocalAccount = 25, - onboardingSetName = 23, - onboardingSetCurrency = 900, - onboardingAddAccount = 800, - onboardingCompleted = 799 - ) - ) - } - } -} \ No newline at end of file diff --git a/app/src/main/java/com/ivy/wallet/ui/analytics/tab/UserStatsTab.kt b/app/src/main/java/com/ivy/wallet/ui/analytics/tab/UserStatsTab.kt deleted file mode 100644 index 540fd4e38e..0000000000 --- a/app/src/main/java/com/ivy/wallet/ui/analytics/tab/UserStatsTab.kt +++ /dev/null @@ -1,80 +0,0 @@ -package com.ivy.wallet.ui.analytics.tab - -import androidx.compose.foundation.horizontalScroll -import androidx.compose.foundation.layout.* -import androidx.compose.foundation.rememberScrollState -import androidx.compose.runtime.Composable -import androidx.compose.ui.Alignment -import androidx.compose.ui.Modifier -import androidx.compose.ui.tooling.preview.Preview -import androidx.compose.ui.unit.dp -import com.ivy.wallet.ui.IvyWalletPreview -import com.ivy.wallet.ui.analytics.DataCircle -import com.ivy.wallet.ui.analytics.model.UserStats -import com.ivy.wallet.ui.theme.Ivy -import com.ivy.wallet.ui.theme.IvyDark -import com.ivy.wallet.ui.theme.Red - -@Composable -fun ColumnScope.UserStatsTab( - onboardedUsersGoogle: Int, - userStats: UserStats -) { - Row( - modifier = Modifier - .weight(1f) - .horizontalScroll(rememberScrollState()), - verticalAlignment = Alignment.CenterVertically, - ) { - Spacer(Modifier.width(32.dp)) - - DataCircle( - count = userStats.powerUsers, - metric = "Power users", - circleColor = Ivy, - parentCount = onboardedUsersGoogle, - avgCount = userStats.avgPowerUsersTrns - ) - - Spacer(Modifier.width(32.dp)) - - DataCircle( - count = userStats.activeUsers, - metric = "Active users", - circleColor = IvyDark, - parentCount = onboardedUsersGoogle, - avgCount = userStats.avgActiveUsersTrns - ) - Spacer(Modifier.width(32.dp)) - - DataCircle( - count = userStats.dyingUsers, - metric = "Dying users", - circleColor = Red, - parentCount = onboardedUsersGoogle, - avgCount = userStats.avgDyingUsers - ) - - Spacer(Modifier.width(32.dp)) - } -} - -@Preview -@Composable -private fun Preview() { - IvyWalletPreview { - Column(Modifier.fillMaxSize()) { - UserStatsTab( - onboardedUsersGoogle = 1000, - userStats = UserStats( - powerUsers = 50, - avgPowerUsersTrns = 15.1, - activeUsers = 100, - avgActiveUsersTrns = 6.12, - dyingUsers = 300, - avgDyingUsers = 1.0 - ) - ) - } - } -} \ No newline at end of file diff --git a/app/src/main/java/com/ivy/wallet/ui/budget/BudgetViewModel.kt b/app/src/main/java/com/ivy/wallet/ui/budget/BudgetViewModel.kt index 68989da9f7..4352c63bcb 100644 --- a/app/src/main/java/com/ivy/wallet/ui/budget/BudgetViewModel.kt +++ b/app/src/main/java/com/ivy/wallet/ui/budget/BudgetViewModel.kt @@ -17,14 +17,10 @@ import com.ivy.wallet.domain.data.core.Category import com.ivy.wallet.domain.data.core.Transaction import com.ivy.wallet.domain.deprecated.logic.BudgetCreator import com.ivy.wallet.domain.deprecated.logic.model.CreateBudgetData -import com.ivy.wallet.domain.deprecated.sync.item.BudgetSync import com.ivy.wallet.domain.pure.exchange.ExchangeData import com.ivy.wallet.domain.pure.transaction.trnCurrency import com.ivy.wallet.io.persistence.SharedPrefs -import com.ivy.wallet.io.persistence.dao.AccountDao import com.ivy.wallet.io.persistence.dao.BudgetDao -import com.ivy.wallet.io.persistence.dao.CategoryDao -import com.ivy.wallet.io.persistence.dao.SettingsDao import com.ivy.wallet.ui.IvyWalletCtx import com.ivy.wallet.ui.budget.model.DisplayBudget import com.ivy.wallet.ui.onboarding.model.TimePeriod @@ -41,12 +37,8 @@ import javax.inject.Inject @HiltViewModel class BudgetViewModel @Inject constructor( private val sharedPrefs: SharedPrefs, - private val settingsDao: SettingsDao, private val budgetDao: BudgetDao, - private val categoryDao: CategoryDao, - private val accountDao: AccountDao, private val budgetCreator: BudgetCreator, - private val budgetSync: BudgetSync, private val ivyContext: IvyWalletCtx, private val accountsAct: AccountsAct, private val categoriesAct: CategoriesAct, @@ -216,10 +208,6 @@ class BudgetViewModel @Inject constructor( } start() - ioThread { - budgetSync.sync() - } - TestIdlingResource.decrement() } } diff --git a/app/src/main/java/com/ivy/wallet/ui/category/CategoriesViewModel.kt b/app/src/main/java/com/ivy/wallet/ui/category/CategoriesViewModel.kt index 8a55a1897e..54e7526087 100644 --- a/app/src/main/java/com/ivy/wallet/ui/category/CategoriesViewModel.kt +++ b/app/src/main/java/com/ivy/wallet/ui/category/CategoriesViewModel.kt @@ -15,7 +15,6 @@ import com.ivy.wallet.domain.data.core.Account import com.ivy.wallet.domain.data.core.Transaction import com.ivy.wallet.domain.deprecated.logic.CategoryCreator import com.ivy.wallet.domain.deprecated.logic.model.CreateCategoryData -import com.ivy.wallet.domain.deprecated.sync.item.CategorySync import com.ivy.wallet.io.persistence.SharedPrefs import com.ivy.wallet.io.persistence.dao.CategoryDao import com.ivy.wallet.ui.IvyWalletCtx @@ -24,15 +23,18 @@ import com.ivy.wallet.ui.theme.modal.edit.CategoryModalData import com.ivy.wallet.utils.ioThread import com.ivy.wallet.utils.scopedIOThread import dagger.hilt.android.lifecycle.HiltViewModel -import kotlinx.coroutines.* +import kotlinx.coroutines.CoroutineScope +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.async +import kotlinx.coroutines.awaitAll import kotlinx.coroutines.flow.MutableStateFlow +import kotlinx.coroutines.launch import javax.inject.Inject import kotlin.math.absoluteValue @HiltViewModel class CategoriesViewModel @Inject constructor( private val categoryDao: CategoryDao, - private val categorySync: CategorySync, private val categoryCreator: CategoryCreator, private val categoriesAct: CategoriesAct, private val ivyContext: IvyWalletCtx, @@ -153,10 +155,6 @@ class CategoriesViewModel @Inject constructor( it.copy(categories = sortedList, sortOrder = sortOrder) } - ioThread { - categorySync.sync() - } - TestIdlingResource.decrement() } diff --git a/app/src/main/java/com/ivy/wallet/ui/edit/EditTransactionViewModel.kt b/app/src/main/java/com/ivy/wallet/ui/edit/EditTransactionViewModel.kt index c156407f6f..b3b03ed005 100644 --- a/app/src/main/java/com/ivy/wallet/ui/edit/EditTransactionViewModel.kt +++ b/app/src/main/java/com/ivy/wallet/ui/edit/EditTransactionViewModel.kt @@ -24,17 +24,13 @@ import com.ivy.wallet.domain.deprecated.logic.currency.ExchangeRatesLogic import com.ivy.wallet.domain.deprecated.logic.loantrasactions.LoanTransactionsLogic import com.ivy.wallet.domain.deprecated.logic.model.CreateAccountData import com.ivy.wallet.domain.deprecated.logic.model.CreateCategoryData -import com.ivy.wallet.domain.deprecated.sync.uploader.TransactionUploader import com.ivy.wallet.domain.event.AccountsUpdatedEvent import com.ivy.wallet.io.persistence.SharedPrefs -import com.ivy.wallet.io.persistence.dao.AccountDao -import com.ivy.wallet.io.persistence.dao.CategoryDao import com.ivy.wallet.io.persistence.dao.LoanDao import com.ivy.wallet.io.persistence.dao.SettingsDao import com.ivy.wallet.io.persistence.dao.TransactionDao import com.ivy.wallet.refreshWidget import com.ivy.wallet.ui.EditTransaction -import com.ivy.wallet.ui.IvyWalletCtx import com.ivy.wallet.ui.Main import com.ivy.wallet.ui.loan.data.EditTransactionDisplayLoan import com.ivy.wallet.ui.widget.WalletBalanceWidgetReceiver @@ -57,12 +53,8 @@ import javax.inject.Inject class EditTransactionViewModel @Inject constructor( private val loanDao: LoanDao, private val transactionDao: TransactionDao, - private val accountDao: AccountDao, - private val categoryDao: CategoryDao, private val settingsDao: SettingsDao, - private val ivyContext: IvyWalletCtx, private val nav: Navigation, - private val transactionUploader: TransactionUploader, private val sharedPrefs: SharedPrefs, private val exchangeRatesLogic: ExchangeRatesLogic, private val categoryCreator: CategoryCreator, @@ -429,10 +421,6 @@ class EditTransactionViewModel @Inject constructor( transactionDao.flagDeleted(it.id) } closeScreen() - - loadedTransaction?.let { - transactionUploader.delete(it.id) - } } TestIdlingResource.decrement() @@ -527,6 +515,7 @@ class EditTransactionViewModel @Inject constructor( dueDate.value == null -> { timeNowUTC() } + else -> loadedTransaction().dateTime }, categoryId = category.value?.id, @@ -555,10 +544,6 @@ class EditTransactionViewModel @Inject constructor( if (closeScreen) { closeScreen() - - ioThread { - transactionUploader.sync(loadedTransaction()) - } } } catch (e: Exception) { e.printStackTrace() diff --git a/app/src/main/java/com/ivy/wallet/ui/loan/LoanViewModel.kt b/app/src/main/java/com/ivy/wallet/ui/loan/LoanViewModel.kt index 31b93a0491..e459198352 100644 --- a/app/src/main/java/com/ivy/wallet/ui/loan/LoanViewModel.kt +++ b/app/src/main/java/com/ivy/wallet/ui/loan/LoanViewModel.kt @@ -4,7 +4,6 @@ import androidx.lifecycle.ViewModel import androidx.lifecycle.viewModelScope import com.ivy.frp.test.TestIdlingResource import com.ivy.wallet.domain.action.account.AccountsAct -import com.ivy.wallet.domain.action.category.CategoriesAct import com.ivy.wallet.domain.action.loan.LoansAct import com.ivy.wallet.domain.data.core.Account import com.ivy.wallet.domain.data.core.Loan @@ -13,10 +12,8 @@ import com.ivy.wallet.domain.deprecated.logic.LoanCreator import com.ivy.wallet.domain.deprecated.logic.loantrasactions.LoanTransactionsLogic import com.ivy.wallet.domain.deprecated.logic.model.CreateAccountData import com.ivy.wallet.domain.deprecated.logic.model.CreateLoanData -import com.ivy.wallet.domain.deprecated.sync.item.LoanSync import com.ivy.wallet.domain.event.AccountsUpdatedEvent import com.ivy.wallet.io.persistence.SharedPrefs -import com.ivy.wallet.io.persistence.dao.AccountDao import com.ivy.wallet.io.persistence.dao.LoanDao import com.ivy.wallet.io.persistence.dao.LoanRecordDao import com.ivy.wallet.io.persistence.dao.SettingsDao @@ -32,7 +29,7 @@ import kotlinx.coroutines.flow.StateFlow import kotlinx.coroutines.flow.asStateFlow import kotlinx.coroutines.launch import org.greenrobot.eventbus.EventBus -import java.util.* +import java.util.UUID import javax.inject.Inject @HiltViewModel @@ -40,15 +37,12 @@ class LoanViewModel @Inject constructor( private val loanDao: LoanDao, private val loanRecordDao: LoanRecordDao, private val settingsDao: SettingsDao, - private val loanSync: LoanSync, private val loanCreator: LoanCreator, private val sharedPrefs: SharedPrefs, - private val accountDao: AccountDao, private val accountCreator: AccountCreator, private val loanTransactionsLogic: LoanTransactionsLogic, private val loansAct: LoansAct, private val accountsAct: AccountsAct, - private val categoriesAct: CategoriesAct ) : ViewModel() { private val _baseCurrencyCode = MutableStateFlow(getDefaultFIATCurrency().currencyCode) @@ -157,10 +151,6 @@ class LoanViewModel @Inject constructor( } start() - ioThread { - loanSync.sync() - } - TestIdlingResource.decrement() } } @@ -221,6 +211,7 @@ class LoanViewModel @Inject constructor( is LoanScreenEvent.OnLoanCreate -> { createLoan(event.createLoanData) } + is LoanScreenEvent.OnAddLoan -> { _state.value = _state.value.copy( loanModalData = LoanModalData( @@ -230,22 +221,26 @@ class LoanViewModel @Inject constructor( ) ) } + is LoanScreenEvent.OnLoanModalDismiss -> { _state.value = _state.value.copy( loanModalData = null ) } + is LoanScreenEvent.OnReOrderModalShow -> { _state.value = _state.value.copy( reorderModalVisible = event.show ) } + is LoanScreenEvent.OnReordered -> { reorder(event.reorderedList) _state.value = _state.value.copy( loans = event.reorderedList ) } + is LoanScreenEvent.OnCreateAccount -> { createAccount(event.accountData) } diff --git a/app/src/main/java/com/ivy/wallet/ui/main/MainViewModel.kt b/app/src/main/java/com/ivy/wallet/ui/main/MainViewModel.kt index f5866c7407..265603ae37 100644 --- a/app/src/main/java/com/ivy/wallet/ui/main/MainViewModel.kt +++ b/app/src/main/java/com/ivy/wallet/ui/main/MainViewModel.kt @@ -7,9 +7,7 @@ import com.ivy.frp.test.TestIdlingResource import com.ivy.frp.view.navigation.Navigation import com.ivy.wallet.domain.action.exchange.SyncExchangeRatesAct import com.ivy.wallet.domain.deprecated.logic.AccountCreator -import com.ivy.wallet.domain.deprecated.logic.currency.ExchangeRatesLogic import com.ivy.wallet.domain.deprecated.logic.model.CreateAccountData -import com.ivy.wallet.domain.deprecated.sync.IvySync import com.ivy.wallet.domain.event.AccountsUpdatedEvent import com.ivy.wallet.io.persistence.SharedPrefs import com.ivy.wallet.io.persistence.dao.SettingsDao @@ -27,8 +25,6 @@ class MainViewModel @Inject constructor( private val settingsDao: SettingsDao, private val ivyContext: IvyWalletCtx, private val nav: Navigation, - private val ivySync: IvySync, - private val exchangeRatesLogic: ExchangeRatesLogic, private val syncExchangeRatesAct: SyncExchangeRatesAct, private val accountCreator: AccountCreator, private val sharedPrefs: SharedPrefs, @@ -58,13 +54,6 @@ class MainViewModel @Inject constructor( sharedPrefs.getBoolean(SharedPrefs.DATA_BACKUP_COMPLETED, false) ioThread { -// try { -// bankIntegrationsLogic.sync() //sync bank integrations -// } catch (e: Exception) { -// e.printStackTrace() -// } - ivySync.sync() //sync app data - //Sync exchange rates syncExchangeRatesAct( SyncExchangeRatesAct.Input(baseCurrency = baseCurrency) diff --git a/app/src/main/java/com/ivy/wallet/ui/onboarding/viewmodel/OnboardingRouter.kt b/app/src/main/java/com/ivy/wallet/ui/onboarding/viewmodel/OnboardingRouter.kt index 48de4c0e18..16779c1bf9 100644 --- a/app/src/main/java/com/ivy/wallet/ui/onboarding/viewmodel/OnboardingRouter.kt +++ b/app/src/main/java/com/ivy/wallet/ui/onboarding/viewmodel/OnboardingRouter.kt @@ -4,21 +4,16 @@ import androidx.lifecycle.MutableLiveData import com.ivy.frp.view.navigation.Navigation import com.ivy.wallet.domain.action.exchange.SyncExchangeRatesAct import com.ivy.wallet.domain.data.IvyCurrency -import com.ivy.wallet.domain.data.analytics.AnalyticsEvent import com.ivy.wallet.domain.data.core.Category import com.ivy.wallet.domain.deprecated.logic.LogoutLogic import com.ivy.wallet.domain.deprecated.logic.PreloadDataLogic -import com.ivy.wallet.domain.deprecated.logic.currency.ExchangeRatesLogic import com.ivy.wallet.domain.deprecated.logic.model.CreateAccountData import com.ivy.wallet.domain.deprecated.logic.model.CreateCategoryData import com.ivy.wallet.domain.deprecated.logic.notification.TransactionReminderLogic -import com.ivy.wallet.domain.deprecated.sync.IvySync -import com.ivy.wallet.io.network.IvyAnalytics import com.ivy.wallet.io.persistence.SharedPrefs import com.ivy.wallet.io.persistence.dao.AccountDao import com.ivy.wallet.io.persistence.dao.CategoryDao import com.ivy.wallet.ui.Import -import com.ivy.wallet.ui.IvyWalletCtx import com.ivy.wallet.ui.Main import com.ivy.wallet.ui.Onboarding import com.ivy.wallet.ui.onboarding.OnboardingState @@ -37,14 +32,10 @@ class OnboardingRouter( private val _categories: MutableLiveData>, private val _categorySuggestions: MutableLiveData>, - private val ivyContext: IvyWalletCtx, private val nav: Navigation, - private val ivyAnalytics: IvyAnalytics, - private val exchangeRatesLogic: ExchangeRatesLogic, private val accountDao: AccountDao, private val sharedPrefs: SharedPrefs, private val transactionReminderLogic: TransactionReminderLogic, - private val ivySync: IvySync, private val preloadDataLogic: PreloadDataLogic, private val categoryDao: CategoryDao, private val logoutLogic: LogoutLogic, @@ -106,7 +97,6 @@ class OnboardingRouter( //------------------------------------- Step 0 - Splash ---------------------------------------- suspend fun splashNext() { if (_state.value == OnboardingState.SPLASH) { - ivyAnalytics.logEvent(AnalyticsEvent.ONBOARDING_STARTED) delay(1000) _state.value = OnboardingState.LOGIN @@ -117,9 +107,6 @@ class OnboardingRouter( //------------------------------------- Step 1 - Login ----------------------------------------- suspend fun googleLoginNext() { - ioThread { - ivySync.sync() - } if (isLogin()) { //Route logged user @@ -128,10 +115,6 @@ class OnboardingRouter( //Route new user _state.value = OnboardingState.CHOOSE_PATH } - - ioThread { - ivyAnalytics.logEvent(AnalyticsEvent.ONBOARDING_LOGIN) - } } private suspend fun isLogin(): Boolean { @@ -141,10 +124,6 @@ class OnboardingRouter( suspend fun offlineAccountNext() { _state.value = OnboardingState.CHOOSE_PATH - - ioThread { - ivyAnalytics.logEvent(AnalyticsEvent.ONBOARDING_LOCAL_ACCOUNT) - } } //------------------------------------- Step 1 ------------------------------------------------- @@ -187,8 +166,6 @@ class OnboardingRouter( if (isLogin()) { completeOnboarding(baseCurrency = baseCurrency) } - - ivyAnalytics.logEvent(AnalyticsEvent.ONBOARDING_CURRENCY_SET) } //------------------------------------- Step 3 ------------------------------------------------- @@ -196,18 +173,13 @@ class OnboardingRouter( //------------------------------------- Step 4 - Accounts -------------------------------------- suspend fun accountsNext() { routeToCategories() - - ivyAnalytics.logEvent(AnalyticsEvent.ONBOARDING_ACCOUNTS_DONE) } suspend fun accountsSkip() { routeToCategories() - ivyAnalytics.logEvent(AnalyticsEvent.ONBOARDING_ACCOUNTS_SKIP) - ioThread { preloadDataLogic.preloadAccounts() - ivySync.syncAccounts() } } //------------------------------------- Step 4 ------------------------------------------------- @@ -216,19 +188,13 @@ class OnboardingRouter( //------------------------------------- Step 5 - Categories ------------------------------------ suspend fun categoriesNext(baseCurrency: IvyCurrency?) { completeOnboarding(baseCurrency = baseCurrency) - - - ivyAnalytics.logEvent(AnalyticsEvent.ONBOARDING_CATEGORIES_DONE) } suspend fun categoriesSkip(baseCurrency: IvyCurrency?) { completeOnboarding(baseCurrency = baseCurrency) - ivyAnalytics.logEvent(AnalyticsEvent.ONBOARDING_CATEGORIES_SKIP) - ioThread { preloadDataLogic.preloadCategories() - ivySync.syncCategories() } } @@ -262,8 +228,6 @@ class OnboardingRouter( navigateOutOfOnboarding() - ivyAnalytics.logEvent(AnalyticsEvent.ONBOARDING_COMPLETED) - //the rest below is not UI stuff so I don't care ioThread { transactionReminderLogic.scheduleReminder() diff --git a/app/src/main/java/com/ivy/wallet/ui/onboarding/viewmodel/OnboardingViewModel.kt b/app/src/main/java/com/ivy/wallet/ui/onboarding/viewmodel/OnboardingViewModel.kt index 789cda3d1c..401a545284 100644 --- a/app/src/main/java/com/ivy/wallet/ui/onboarding/viewmodel/OnboardingViewModel.kt +++ b/app/src/main/java/com/ivy/wallet/ui/onboarding/viewmodel/OnboardingViewModel.kt @@ -22,11 +22,6 @@ import com.ivy.wallet.domain.deprecated.logic.currency.ExchangeRatesLogic import com.ivy.wallet.domain.deprecated.logic.model.CreateAccountData import com.ivy.wallet.domain.deprecated.logic.model.CreateCategoryData import com.ivy.wallet.domain.deprecated.logic.notification.TransactionReminderLogic -import com.ivy.wallet.domain.deprecated.sync.IvySync -import com.ivy.wallet.io.network.IvyAnalytics -import com.ivy.wallet.io.network.IvySession -import com.ivy.wallet.io.network.RestClient -import com.ivy.wallet.io.network.request.auth.GoogleSignInRequest import com.ivy.wallet.io.persistence.SharedPrefs import com.ivy.wallet.io.persistence.dao.AccountDao import com.ivy.wallet.io.persistence.dao.CategoryDao @@ -50,8 +45,6 @@ class OnboardingViewModel @Inject constructor( private val nav: Navigation, private val accountDao: AccountDao, private val settingsDao: SettingsDao, - private val restClient: RestClient, - private val session: IvySession, private val accountLogic: WalletAccountLogic, private val categoryCreator: CategoryCreator, private val categoryDao: CategoryDao, @@ -63,8 +56,6 @@ class OnboardingViewModel @Inject constructor( //Only OnboardingRouter stuff sharedPrefs: SharedPrefs, - ivySync: IvySync, - ivyAnalytics: IvyAnalytics, transactionReminderLogic: TransactionReminderLogic, preloadDataLogic: PreloadDataLogic, exchangeRatesLogic: ExchangeRatesLogic, @@ -100,14 +91,10 @@ class OnboardingViewModel @Inject constructor( _categories = _categories, _categorySuggestions = _categorySuggestions, - ivyContext = ivyContext, nav = nav, - ivyAnalytics = ivyAnalytics, - exchangeRatesLogic = exchangeRatesLogic, accountDao = accountDao, sharedPrefs = sharedPrefs, categoryDao = categoryDao, - ivySync = ivySync, preloadDataLogic = preloadDataLogic, transactionReminderLogic = transactionReminderLogic, logoutLogic = logoutLogic, @@ -190,26 +177,6 @@ class OnboardingViewModel @Inject constructor( private suspend fun loginWithGoogleOnServer(idToken: String) { TestIdlingResource.increment() - // TODO: Delete this legacy code - val authResponse = restClient.authService.googleSignIn( - GoogleSignInRequest( - googleIdToken = idToken, - fcmToken = "" - ) - ) - - ioThread { - session.initiate(authResponse) - - settingsDao.save( - settingsDao.findFirst().copy( - name = authResponse.user.firstName - ) - ) - } - - _opGoogleSignIn.value = OpResult.success(Unit) - TestIdlingResource.decrement() } diff --git a/app/src/main/java/com/ivy/wallet/ui/paywall/PaywallViewModel.kt b/app/src/main/java/com/ivy/wallet/ui/paywall/PaywallViewModel.kt index e91de323f9..500c5564fe 100644 --- a/app/src/main/java/com/ivy/wallet/ui/paywall/PaywallViewModel.kt +++ b/app/src/main/java/com/ivy/wallet/ui/paywall/PaywallViewModel.kt @@ -11,13 +11,11 @@ import com.ivy.wallet.domain.action.account.AccountsAct import com.ivy.wallet.domain.action.budget.BudgetsAct import com.ivy.wallet.domain.action.category.CategoriesAct import com.ivy.wallet.domain.action.loan.LoansAct -import com.ivy.wallet.domain.data.analytics.AnalyticsEvent import com.ivy.wallet.domain.data.core.Account import com.ivy.wallet.domain.data.core.Budget import com.ivy.wallet.domain.data.core.Category import com.ivy.wallet.domain.data.core.Loan import com.ivy.wallet.domain.deprecated.logic.PaywallLogic -import com.ivy.wallet.io.network.IvyAnalytics import com.ivy.wallet.ui.Paywall import com.ivy.wallet.ui.RootActivity import com.ivy.wallet.utils.asLiveData @@ -31,7 +29,6 @@ import javax.inject.Inject class PaywallViewModel @Inject constructor( private val ivyBilling: IvyBilling, private val paywallLogic: PaywallLogic, - private val ivyAnalytics: IvyAnalytics, private val categoriesAct: CategoriesAct, private val accountsAct: AccountsAct, private val budgetsAct: BudgetsAct, @@ -93,18 +90,6 @@ class PaywallViewModel @Inject constructor( _accounts.value = accountsAct(Unit)!! _budgets.value = budgetsAct(Unit)!! _loans.value = loansAct(Unit)!! - - ivyAnalytics.logEvent( - when (screen.paywallReason) { - PaywallReason.CATEGORIES -> AnalyticsEvent.PAYWALL_CATEGORIES - PaywallReason.ACCOUNTS -> AnalyticsEvent.PAYWALL_ACCOUNTS - PaywallReason.EXPORT_CSV -> AnalyticsEvent.PAYWALL_EXPORT_CSV - PaywallReason.PREMIUM_COLOR -> AnalyticsEvent.PAYWALL_PREMIUM_COLOR - PaywallReason.BUDGETS -> AnalyticsEvent.PAYWALL_BUDGETS - PaywallReason.LOANS -> AnalyticsEvent.PAYWALL_LOANS - null -> AnalyticsEvent.PAYWALL_NO_REASON - } - ) } } @@ -117,28 +102,12 @@ class PaywallViewModel @Inject constructor( onActivePurchase = { _purchasedSkus.value = purchasedSkus.value.orEmpty().plus(it.skus) activePurchases.add(it) - - viewModelScope.launch { - ivyAnalytics.logEvent(AnalyticsEvent.PAYWALL_ACTIVE_PREMIUM) - } } ) } fun onPlanSelected(plan: Plan?) { - if (plan != null) { - viewModelScope.launch { - val chooseSpecificPlanEvent = when (plan.type) { - PlanType.MONTHLY -> AnalyticsEvent.PAYWALL_CHOOSE_PLAN_MONTHLY - PlanType.SIX_MONTH -> AnalyticsEvent.PAYWALL_CHOOSE_PLAN_6MONTH - PlanType.YEARLY -> AnalyticsEvent.PAYWALL_CHOOSE_PLAN_YEARLY - PlanType.LIFETIME -> AnalyticsEvent.PAYWALL_CHOOSE_PLAN_LIFETIME - } - ivyAnalytics.logEvent(chooseSpecificPlanEvent) - ivyAnalytics.logEvent(AnalyticsEvent.PAYWALL_CHOOSE_PLAN) - } - } } fun buy(activity: RootActivity, plan: Plan) { @@ -149,17 +118,5 @@ class PaywallViewModel @Inject constructor( .firstOrNull { !it.originalJson.contains("lifetime") } ?.purchaseToken ) - - viewModelScope.launch { - val buySpecificPlanEvent = when (plan.type) { - PlanType.MONTHLY -> AnalyticsEvent.PAYWALL_START_BUY_MONTHLY - PlanType.SIX_MONTH -> AnalyticsEvent.PAYWALL_START_BUY_6MONTH - PlanType.YEARLY -> AnalyticsEvent.PAYWALL_START_BUY_YEARLY - PlanType.LIFETIME -> AnalyticsEvent.PAYWALL_START_BUY_LIFETIME - } - - ivyAnalytics.logEvent(buySpecificPlanEvent) - ivyAnalytics.logEvent(AnalyticsEvent.PAYWALL_START_BUY) - } } } \ No newline at end of file diff --git a/app/src/main/java/com/ivy/wallet/ui/planned/edit/EditPlannedViewModel.kt b/app/src/main/java/com/ivy/wallet/ui/planned/edit/EditPlannedViewModel.kt index 608c9ead5b..8a0a18ecb3 100644 --- a/app/src/main/java/com/ivy/wallet/ui/planned/edit/EditPlannedViewModel.kt +++ b/app/src/main/java/com/ivy/wallet/ui/planned/edit/EditPlannedViewModel.kt @@ -17,12 +17,13 @@ import com.ivy.wallet.domain.deprecated.logic.CategoryCreator import com.ivy.wallet.domain.deprecated.logic.PlannedPaymentsGenerator import com.ivy.wallet.domain.deprecated.logic.model.CreateAccountData import com.ivy.wallet.domain.deprecated.logic.model.CreateCategoryData -import com.ivy.wallet.domain.deprecated.sync.item.TransactionSync -import com.ivy.wallet.domain.deprecated.sync.uploader.PlannedPaymentRuleUploader import com.ivy.wallet.domain.event.AccountsUpdatedEvent -import com.ivy.wallet.io.persistence.dao.* +import com.ivy.wallet.io.persistence.dao.AccountDao +import com.ivy.wallet.io.persistence.dao.CategoryDao +import com.ivy.wallet.io.persistence.dao.PlannedPaymentRuleDao +import com.ivy.wallet.io.persistence.dao.SettingsDao +import com.ivy.wallet.io.persistence.dao.TransactionDao import com.ivy.wallet.ui.EditPlanned -import com.ivy.wallet.ui.IvyWalletCtx import com.ivy.wallet.utils.asLiveData import com.ivy.wallet.utils.ioThread import dagger.hilt.android.lifecycle.HiltViewModel @@ -37,11 +38,8 @@ class EditPlannedViewModel @Inject constructor( private val accountDao: AccountDao, private val categoryDao: CategoryDao, private val settingsDao: SettingsDao, - private val ivyContext: IvyWalletCtx, private val nav: Navigation, - private val transactionSync: TransactionSync, private val plannedPaymentRuleDao: PlannedPaymentRuleDao, - private val plannedPaymentRuleUploader: PlannedPaymentRuleUploader, private val plannedPaymentsGenerator: PlannedPaymentsGenerator, private val categoryCreator: CategoryCreator, private val accountCreator: AccountCreator, @@ -272,11 +270,6 @@ class EditPlannedViewModel @Inject constructor( if (closeScreen) { nav.back() - - ioThread { - plannedPaymentRuleUploader.sync(loadedRule()) - transactionSync.sync() - } } } catch (e: Exception) { e.printStackTrace() @@ -319,11 +312,6 @@ class EditPlannedViewModel @Inject constructor( ) } nav.back() - - loadedRule?.let { - plannedPaymentRuleUploader.delete(it.id) - transactionSync.sync() - } } } } diff --git a/app/src/main/java/com/ivy/wallet/ui/settings/SettingsViewModel.kt b/app/src/main/java/com/ivy/wallet/ui/settings/SettingsViewModel.kt index d4657eafa0..7a9ced5c99 100644 --- a/app/src/main/java/com/ivy/wallet/ui/settings/SettingsViewModel.kt +++ b/app/src/main/java/com/ivy/wallet/ui/settings/SettingsViewModel.kt @@ -10,24 +10,15 @@ import com.ivy.frp.view.navigation.Navigation import com.ivy.wallet.domain.action.exchange.SyncExchangeRatesAct import com.ivy.wallet.domain.action.global.StartDayOfMonthAct import com.ivy.wallet.domain.action.global.UpdateStartDayOfMonthAct -import com.ivy.wallet.domain.action.transaction.FetchAllTrnsFromServerAct -import com.ivy.wallet.domain.data.analytics.AnalyticsEvent import com.ivy.wallet.domain.data.core.User import com.ivy.wallet.domain.deprecated.logic.LogoutLogic import com.ivy.wallet.domain.deprecated.logic.csv.ExportCSVLogic -import com.ivy.wallet.domain.deprecated.logic.currency.ExchangeRatesLogic import com.ivy.wallet.domain.deprecated.logic.zip.BackupLogic -import com.ivy.wallet.domain.deprecated.sync.IvySync -import com.ivy.wallet.io.network.IvyAnalytics -import com.ivy.wallet.io.network.IvySession -import com.ivy.wallet.io.network.RestClient -import com.ivy.wallet.io.network.request.auth.GoogleSignInRequest import com.ivy.wallet.io.persistence.SharedPrefs import com.ivy.wallet.io.persistence.dao.SettingsDao import com.ivy.wallet.io.persistence.dao.UserDao import com.ivy.wallet.refreshWidget import com.ivy.wallet.ui.IvyWalletCtx -import com.ivy.wallet.ui.Main import com.ivy.wallet.ui.RootActivity import com.ivy.wallet.ui.widget.WalletBalanceWidgetReceiver import com.ivy.wallet.utils.OpResult @@ -48,20 +39,14 @@ import javax.inject.Inject @HiltViewModel class SettingsViewModel @Inject constructor( private val settingsDao: SettingsDao, - private val ivySession: IvySession, private val userDao: UserDao, private val ivyContext: IvyWalletCtx, - private val ivySync: IvySync, private val exportCSVLogic: ExportCSVLogic, - private val restClient: RestClient, - private val ivyAnalytics: IvyAnalytics, - private val exchangeRatesLogic: ExchangeRatesLogic, private val logoutLogic: LogoutLogic, private val sharedPrefs: SharedPrefs, private val backupLogic: BackupLogic, private val startDayOfMonthAct: StartDayOfMonthAct, private val updateStartDayOfMonthAct: UpdateStartDayOfMonthAct, - private val fetchAllTrnsFromServerAct: FetchAllTrnsFromServerAct, private val nav: Navigation, private val syncExchangeRatesAct: SyncExchangeRatesAct, ) : ViewModel() { @@ -111,10 +96,7 @@ class SettingsViewModel @Inject constructor( _startDateOfMonth.value = startDayOfMonthAct(Unit)!! - _user.value = ioThread { - val userId = ivySession.getUserIdSafe() - if (userId != null) userDao.findById(userId)?.toDomain() else null - } + _user.value = null _currencyCode.value = settings.currency _lockApp.value = sharedPrefs.getBoolean(SharedPrefs.APP_LOCK_ENABLED, false) @@ -126,8 +108,6 @@ class SettingsViewModel @Inject constructor( _treatTransfersAsIncomeExpense.value = sharedPrefs.getBoolean(SharedPrefs.TRANSFERS_AS_INCOME_EXPENSE, false) - _opSync.value = OpResult.success(ioThread { ivySync.isSynced() }) - TestIdlingResource.decrement() } } @@ -138,12 +118,6 @@ class SettingsViewModel @Inject constructor( _opSync.value = OpResult.loading() - ioThread { - ivySync.sync() - } - - _opSync.value = OpResult.success(ioThread { ivySync.isSynced() }) - TestIdlingResource.decrement() } } @@ -282,30 +256,6 @@ class SettingsViewModel @Inject constructor( TestIdlingResource.increment() try { - val authResponse = restClient.authService.googleSignIn( - GoogleSignInRequest( - googleIdToken = idToken, - fcmToken = "" - ) - ) - - ioThread { - ivySession.initiate(authResponse) - - settingsDao.save( - settingsDao.findFirst().copy( - name = authResponse.user.firstName - ) - ) - } - - start() - - ioThread { - ivyAnalytics.logEvent(AnalyticsEvent.LOGIN_FROM_SETTINGS) - } - - sync() } catch (e: Exception) { e.sendToCrashlytics("Settings - GOOGLE_SIGN_IN ERROR: generic exception when logging with GOOGLE") e.printStackTrace() @@ -371,46 +321,13 @@ class SettingsViewModel @Inject constructor( fun deleteAllUserData() { viewModelScope.launch { - try { - restClient.nukeService.deleteAllUserData() - } catch (e: Exception) { - e.printStackTrace() - } logout() } } fun deleteCloudUserData() { viewModelScope.launch { - try { - restClient.nukeService.deleteAllUserData() - } catch (e: Exception) { - e.printStackTrace() - } cloudLogout() } } - - fun fetchMissingTransactions() { - if (opFetchTrns.value is OpResult.Loading) { - //wait for sync to finish - return - } - - if (opFetchTrns.value is OpResult.Success) { - //go to home screen - ivyContext.setMoreMenuExpanded(expanded = false) - nav.navigateTo(Main) - return - } - - viewModelScope.launch { - _opFetchtrns.value = OpResult.loading() - - when (val res = fetchAllTrnsFromServerAct(Unit)) { - is Res.Ok -> _opFetchtrns.value = OpResult.success(Unit) - is Res.Err -> _opFetchtrns.value = OpResult.failure(res.error) - } - } - } } \ No newline at end of file diff --git a/app/src/main/java/com/ivy/wallet/ui/statistic/level2/ItemStatisticViewModel.kt b/app/src/main/java/com/ivy/wallet/ui/statistic/level2/ItemStatisticViewModel.kt index 7afdfb3333..ff378d9a52 100644 --- a/app/src/main/java/com/ivy/wallet/ui/statistic/level2/ItemStatisticViewModel.kt +++ b/app/src/main/java/com/ivy/wallet/ui/statistic/level2/ItemStatisticViewModel.kt @@ -22,46 +22,47 @@ import com.ivy.wallet.domain.data.TransactionType import com.ivy.wallet.domain.data.core.Account import com.ivy.wallet.domain.data.core.Category import com.ivy.wallet.domain.data.core.Transaction -import com.ivy.wallet.domain.deprecated.logic.* -import com.ivy.wallet.domain.deprecated.logic.currency.ExchangeRatesLogic -import com.ivy.wallet.domain.deprecated.sync.uploader.AccountUploader -import com.ivy.wallet.domain.deprecated.sync.uploader.CategoryUploader -import com.ivy.wallet.domain.pure.data.WalletDAOs +import com.ivy.wallet.domain.deprecated.logic.AccountCreator +import com.ivy.wallet.domain.deprecated.logic.CategoryCreator +import com.ivy.wallet.domain.deprecated.logic.PlannedPaymentsLogic +import com.ivy.wallet.domain.deprecated.logic.WalletAccountLogic +import com.ivy.wallet.domain.deprecated.logic.WalletCategoryLogic import com.ivy.wallet.domain.pure.exchange.ExchangeData import com.ivy.wallet.io.persistence.SharedPrefs -import com.ivy.wallet.io.persistence.dao.* +import com.ivy.wallet.io.persistence.dao.AccountDao +import com.ivy.wallet.io.persistence.dao.CategoryDao +import com.ivy.wallet.io.persistence.dao.PlannedPaymentRuleDao +import com.ivy.wallet.io.persistence.dao.TransactionDao import com.ivy.wallet.stringRes import com.ivy.wallet.ui.ItemStatistic import com.ivy.wallet.ui.IvyWalletCtx import com.ivy.wallet.ui.onboarding.model.TimePeriod import com.ivy.wallet.ui.onboarding.model.toCloseTimeRange import com.ivy.wallet.ui.theme.RedLight -import com.ivy.wallet.utils.* +import com.ivy.wallet.utils.computationThread +import com.ivy.wallet.utils.dateNowUTC +import com.ivy.wallet.utils.ioThread +import com.ivy.wallet.utils.isNotNullOrBlank +import com.ivy.wallet.utils.readOnly import dagger.hilt.android.lifecycle.HiltViewModel import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.launch -import java.util.* +import java.util.UUID import javax.inject.Inject @HiltViewModel class ItemStatisticViewModel @Inject constructor( - private val walletDAOs: WalletDAOs, private val accountDao: AccountDao, - private val exchangeRateDao: ExchangeRateDao, private val transactionDao: TransactionDao, private val categoryDao: CategoryDao, - private val settingsDao: SettingsDao, private val ivyContext: IvyWalletCtx, private val nav: Navigation, - private val categoryUploader: CategoryUploader, - private val accountUploader: AccountUploader, private val accountLogic: WalletAccountLogic, private val categoryLogic: WalletCategoryLogic, private val plannedPaymentRuleDao: PlannedPaymentRuleDao, private val categoryCreator: CategoryCreator, private val accountCreator: AccountCreator, private val plannedPaymentsLogic: PlannedPaymentsLogic, - private val exchangeRatesLogic: ExchangeRatesLogic, private val sharedPrefs: SharedPrefs, private val categoriesAct: CategoriesAct, private val accountsAct: AccountsAct, @@ -171,6 +172,7 @@ class ItemStatisticViewModel @Inject constructor( screen.accountId != null -> { initForAccount(screen.accountId) } + screen.categoryId != null && screen.transactions.isEmpty() -> { initForCategory(screen.categoryId, screen.accountIdFilterList) } @@ -183,6 +185,7 @@ class ItemStatisticViewModel @Inject constructor( screen.transactions ) } + screen.unspecifiedCategory == true && screen.transactions.isNotEmpty() -> { initForAccountTransfersCategory( screen.categoryId, @@ -190,9 +193,11 @@ class ItemStatisticViewModel @Inject constructor( screen.transactions ) } + screen.unspecifiedCategory == true -> { initForUnspecifiedCategory() } + else -> error("no id provided") } } @@ -465,7 +470,8 @@ class ItemStatisticViewModel @Inject constructor( transactions: List ) { _initWithTransactions.value = true - _category.value = Category(stringRes(R.string.account_transfers), RedLight.toArgb(), "transfer") + _category.value = + Category(stringRes(R.string.account_transfers), RedLight.toArgb(), "transfer") val accountFilterIdSet = accountFilterList.toHashSet() val trans = transactions.filter { it.categoryId == null && (accountFilterIdSet.contains(it.accountId) || accountFilterIdSet.contains( @@ -548,6 +554,7 @@ class ItemStatisticViewModel @Inject constructor( screen.accountId != null -> { deleteAccount(screen.accountId) } + screen.categoryId != null -> { deleteCategory(screen.categoryId) } @@ -564,9 +571,6 @@ class ItemStatisticViewModel @Inject constructor( accountDao.flagDeleted(accountId) nav.back() - - //the server deletes transactions + planned payments for the account - accountUploader.delete(accountId) } } @@ -575,8 +579,6 @@ class ItemStatisticViewModel @Inject constructor( categoryDao.flagDeleted(categoryId) nav.back() - - categoryUploader.delete(categoryId) } } @@ -623,7 +625,7 @@ class ItemStatisticViewModel @Inject constructor( } } - fun skipTransaction(screen: ItemStatistic, transaction: Transaction){ + fun skipTransaction(screen: ItemStatistic, transaction: Transaction) { viewModelScope.launch { TestIdlingResource.increment() @@ -641,8 +643,8 @@ class ItemStatisticViewModel @Inject constructor( } } - fun skipTransactions(screen: ItemStatistic, transactions: List){ - viewModelScope.launch{ + fun skipTransactions(screen: ItemStatistic, transactions: List) { + viewModelScope.launch { TestIdlingResource.increment() plannedPaymentsLogic.payOrGet( diff --git a/app/src/main/java/com/ivy/wallet/ui/test/TestViewModel.kt b/app/src/main/java/com/ivy/wallet/ui/test/TestViewModel.kt index 346e29ee78..8756d9568f 100644 --- a/app/src/main/java/com/ivy/wallet/ui/test/TestViewModel.kt +++ b/app/src/main/java/com/ivy/wallet/ui/test/TestViewModel.kt @@ -5,19 +5,13 @@ import androidx.lifecycle.ViewModel import androidx.lifecycle.viewModelScope import com.ivy.frp.test.TestIdlingResource import com.ivy.wallet.domain.data.core.User -import com.ivy.wallet.io.network.IvySession -import com.ivy.wallet.io.persistence.dao.UserDao import com.ivy.wallet.utils.asLiveData -import com.ivy.wallet.utils.ioThread import dagger.hilt.android.lifecycle.HiltViewModel import kotlinx.coroutines.launch import javax.inject.Inject @HiltViewModel -class TestViewModel @Inject constructor( - private val userDao: UserDao, - private val ivySession: IvySession, -) : ViewModel() { +class TestViewModel @Inject constructor() : ViewModel() { private val _user = MutableLiveData() val user = _user.asLiveData() @@ -26,11 +20,6 @@ class TestViewModel @Inject constructor( viewModelScope.launch { TestIdlingResource.increment() - _user.value = ioThread { - val userId = ivySession.getUserIdSafe() - if (userId != null) userDao.findById(userId)?.toDomain() else null - } - TestIdlingResource.decrement() } } diff --git a/app/src/main/java/com/ivy/wallet/ui/webView/WebViewScreen.kt b/app/src/main/java/com/ivy/wallet/ui/webView/WebViewScreen.kt deleted file mode 100644 index 20cce14744..0000000000 --- a/app/src/main/java/com/ivy/wallet/ui/webView/WebViewScreen.kt +++ /dev/null @@ -1,74 +0,0 @@ -package com.ivy.wallet.ui.webView - -import android.annotation.SuppressLint -import android.webkit.WebChromeClient -import android.webkit.WebView -import androidx.compose.foundation.ExperimentalFoundationApi -import androidx.compose.foundation.layout.BoxWithConstraintsScope -import androidx.compose.foundation.layout.Column -import androidx.compose.foundation.layout.fillMaxSize -import androidx.compose.foundation.layout.systemBarsPadding -import androidx.compose.runtime.Composable -import androidx.compose.ui.Modifier -import androidx.compose.ui.unit.dp -import androidx.compose.ui.viewinterop.AndroidView -import androidx.webkit.WebSettingsCompat -import androidx.webkit.WebViewFeature -import com.ivy.design.l0_system.Theme -import com.ivy.frp.view.navigation.navigation -import com.ivy.wallet.ui.IvyWebView -import com.ivy.wallet.ui.ivyWalletCtx -import com.ivy.wallet.ui.theme.components.BackButtonType -import com.ivy.wallet.ui.theme.components.IvyToolbar - -@SuppressLint("SetJavaScriptEnabled") -@ExperimentalFoundationApi -@Composable -fun BoxWithConstraintsScope.WebViewScreen(screen: IvyWebView) { - UI(url = screen.url) -} - -@SuppressLint("SetJavaScriptEnabled") -@ExperimentalFoundationApi -@Composable -private fun BoxWithConstraintsScope.UI(url: String) { - Column( - modifier = Modifier - .fillMaxSize() - .systemBarsPadding() - ) { - val ivyContext = ivyWalletCtx() - val nav = navigation() - IvyToolbar( - onBack = { nav.onBackPressed() }, - backButtonType = BackButtonType.CLOSE, - paddingTop = 8.dp, - paddingBottom = 8.dp - ) - - //Android WebView should not be a in a scroll container :/ - //because anchor links doesn't work - //https://stackoverflow.com/questions/3039555/android-webview-anchor-link-jump-link-not-working - AndroidView( - factory = ::WebView, - update = { webView -> - //Activate Dark mode if the user uses Dark theme & it's supported - if (WebViewFeature.isFeatureSupported(WebViewFeature.FORCE_DARK)) { - val forceDarkMode = if (ivyContext.theme == Theme.DARK) - WebSettingsCompat.FORCE_DARK_ON else WebSettingsCompat.FORCE_DARK_OFF - WebSettingsCompat.setForceDark( - webView.settings, - forceDarkMode - ) - } - - //Chrome Client is compatible with most of websites - webView.webChromeClient = WebChromeClient() - webView.settings.javaScriptEnabled = true - webView.loadUrl(url) - } - ) - } -} - - diff --git a/buildSrc/build.gradle.kts b/buildSrc/build.gradle.kts index d852c2cd2e..c46192c97a 100644 --- a/buildSrc/build.gradle.kts +++ b/buildSrc/build.gradle.kts @@ -15,19 +15,19 @@ repositories { dependencies { //https://mvnrepository.com/artifact/com.android.tools.build/gradle?repo=google - implementation("com.android.tools.build:gradle:8.2.0-beta01") + implementation(libs.android.gradle.plugin) - //Must match kotlinVersion from dependencies.kt - implementation("org.jetbrains.kotlin:kotlin-gradle-plugin:1.9.0") + //Must match kotlinVersion from Project.kt + implementation(libs.kotlin.gradle.plugin) - implementation("com.google.dagger:hilt-android-gradle-plugin:2.47") + implementation(libs.hilt.gradle.plugin) //URL: https://developers.google.com/android/guides/google-services-plugin - implementation("com.google.gms:google-services:4.3.15") + implementation(libs.google.services) - implementation("com.google.firebase:firebase-crashlytics-gradle:2.9.8") + implementation(libs.firebase.crashlytics.gradle.plugin) - implementation(libs.detekt.gradle) + implementation(libs.detekt.gradle.plugin) // Make version catalog available in precompiled scripts // https://github.com/gradle/gradle/issues/15383#issuecomment-1567461389 diff --git a/buildSrc/src/main/java/com/ivy/wallet/buildsrc/DependencyHandlerExt.kt b/buildSrc/src/main/java/com/ivy/wallet/buildsrc/DependencyHandlerExt.kt deleted file mode 100644 index 3ee438f804..0000000000 --- a/buildSrc/src/main/java/com/ivy/wallet/buildsrc/DependencyHandlerExt.kt +++ /dev/null @@ -1,40 +0,0 @@ -package com.ivy.wallet.buildsrc - -import org.gradle.api.artifacts.dsl.DependencyHandler - -internal fun DependencyHandler.implementation(dependency: Any) { - this.add("implementation", dependency) -} - -internal fun DependencyHandler.implementation(value: String) { - this.implementation(dependency = value) -} - -internal fun DependencyHandler.api(dependency: Any) { - this.add("api", dependency) -} - -internal fun DependencyHandler.api(value: String) { - this.api(dependency = value) -} - -internal fun DependencyHandler.kapt(dependency: Any) { - this.add("kapt", dependency) -} - -internal fun DependencyHandler.kapt(value: String) { - this.kapt(dependency = value) -} - -internal fun DependencyHandler.testImplementation(value: String) { - this.add("testImplementation", value) -} - -internal fun DependencyHandler.androidTestImplementation(value: String) { - this.add("androidTestImplementation", value) -} - -internal fun DependencyHandler.kaptAndroidTest(value: String) { - this.add("kaptAndroidTest", value) -} - diff --git a/buildSrc/src/main/java/com/ivy/wallet/buildsrc/Project.kt b/buildSrc/src/main/java/com/ivy/wallet/buildsrc/Project.kt new file mode 100644 index 0000000000..a11b4bf8b8 --- /dev/null +++ b/buildSrc/src/main/java/com/ivy/wallet/buildsrc/Project.kt @@ -0,0 +1,16 @@ +package com.ivy.wallet.buildsrc + + +object Project { + //Version + const val versionName = "4.4.4" + const val versionCode = 144 + + //Compile SDK & Build Tools + const val compileSdkVersion = 34 + + //App + const val applicationId = "com.ivy.wallet" + const val minSdk = 28 + const val targetSdk = 34 +} diff --git a/buildSrc/src/main/java/com/ivy/wallet/buildsrc/dependencies.kt b/buildSrc/src/main/java/com/ivy/wallet/buildsrc/dependencies.kt deleted file mode 100644 index 0ab9e70913..0000000000 --- a/buildSrc/src/main/java/com/ivy/wallet/buildsrc/dependencies.kt +++ /dev/null @@ -1,206 +0,0 @@ -/* - * Copyright 2020 The Android Open Source Project - * - * 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 - * - * https://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 com.ivy.wallet.buildsrc - -import org.gradle.api.artifacts.dsl.DependencyHandler - - -object Project { - //Version - const val versionName = "4.4.4" - const val versionCode = 144 - - //Compile SDK & Build Tools - const val compileSdkVersion = 34 - - //App - const val applicationId = "com.ivy.wallet" - const val minSdk = 28 - const val targetSdk = 34 -} - -object GlobalVersions { - const val compose = "1.5.1" - const val composeFoundation = "1.5.0" - const val kotlinVersion = "1.9.0" -} - -/** - * @param kotlinVersion must also be updated in buildSrc gradle - */ -fun DependencyHandler.appModuleDependencies( - kotlinVersion: String = GlobalVersions.kotlinVersion -) { -// implementation(project(":ivy-design")) - -// implementation("com.github.ILIYANGERMANOV:ivy-frp:0.9.5") - -// Coroutines(version = "1.5.0") -// FunctionalProgramming( -// arrowVersion = "1.0.1", -// kotestVersion = "5.1.0", -// kotlinVersion = kotlinVersion -// ) - -// Compose(version = GlobalVersions.compose) - - - Hilt( - hiltVersion = "2.47", - versionX = "1.0.0" - ) - RoomDB() - - Networking(retrofitVersion = "2.9.0") - - Lifecycle(version = "2.3.1") - AndroidX() - - ThirdParty() -} - -fun DependencyHandler.ivyDesignModuleDependencies( - kotlinVersion: String = GlobalVersions.kotlinVersion -) { -// Coroutines(version = "1.5.0") -// FunctionalProgramming( -// arrowVersion = "1.0.1", -// kotestVersion = "5.1.0", -// kotlinVersion = kotlinVersion -// ) - -// Compose(version = GlobalVersions.compose) - - AndroidX() - Lifecycle(version = "2.3.1") -} -//--------------------------------------------------------------------------------- - - -/** - * Hilt DI - * https://developer.android.com/training/dependency-injection/hilt-android - */ -fun DependencyHandler.Hilt( - hiltVersion: String, - versionX: String -) { - implementation("com.google.dagger:hilt-android:$hiltVersion") - kapt("com.google.dagger:hilt-android-compiler:$hiltVersion") - - //URL: https://mvnrepository.com/artifact/androidx.hilt/hilt-lifecycle-viewmodel?repo=google -// implementation("androidx.hilt:hilt-lifecycle-viewmodel:$versionX") - kapt("androidx.hilt:hilt-compiler:$versionX") - - //URL: https://developer.android.com/training/dependency-injection/hilt-jetpack#workmanager - implementation("androidx.hilt:hilt-work:$versionX") - - HiltTesting(version = hiltVersion) -} - -fun DependencyHandler.HiltTesting( - version: String -) { - androidTestImplementation("com.google.dagger:hilt-android-testing:$version") - kaptAndroidTest("com.google.dagger:hilt-android-compiler:$version") - implementation("androidx.test:runner:1.4.0") -} - -/** - * https://developer.android.com/jetpack/androidx/releases/room - */ -fun DependencyHandler.RoomDB( - version: String = "2.6.0-alpha03" -) { - implementation("androidx.room:room-runtime:$version") - kapt("androidx.room:room-compiler:$version") - implementation("androidx.room:room-ktx:$version") -} - -/** - * REST - */ -fun DependencyHandler.Networking( - retrofitVersion: String = "2.9.0" -) { - //URL: https://github.com/square/retrofit - implementation("com.squareup.retrofit2:retrofit:$retrofitVersion") - implementation("com.squareup.retrofit2:converter-gson:$retrofitVersion") - - //URL: https://github.com/google/gson - implementation("com.google.code.gson:gson:2.10.1") - - - //URL: https://github.com/square/okhttp/tree/master/okhttp-logging-interceptor - implementation("com.squareup.okhttp3:logging-interceptor:4.11.0") -} - -/** - * Jetpack Compose Lifecycle - * https://developer.android.com/jetpack/androidx/releases/lifecycle - */ -fun DependencyHandler.Lifecycle( - version: String = "2.6.1" -) { - // https://developer.android.com/jetpack/androidx/releases/lifecycle - implementation("androidx.lifecycle:lifecycle-livedata-ktx:$version") - implementation("androidx.lifecycle:lifecycle-viewmodel-ktx:$version") - implementation("androidx.lifecycle:lifecycle-viewmodel-savedstate:$version") - implementation("androidx.lifecycle:lifecycle-runtime-ktx:$version") - kapt("androidx.lifecycle:lifecycle-compiler:$version") -} - -fun DependencyHandler.AndroidX() { - //https://developer.android.com/jetpack/androidx/releases/appcompat - implementation("androidx.appcompat:appcompat:1.6.1") - - //URL: https://developer.android.com/jetpack/androidx/releases/core - implementation("androidx.core:core-ktx:1.10.1") - - //URL: https://developer.android.com/jetpack/androidx/releases/work - val workVersion = "2.7.1" - implementation("androidx.work:work-runtime-ktx:$workVersion") - implementation("androidx.work:work-testing:$workVersion") - - implementation("androidx.biometric:biometric:1.1.0") - - //URL: https://developer.android.com/jetpack/androidx/releases/recyclerview - implementation("androidx.recyclerview:recyclerview:1.2.1") - - implementation("androidx.webkit:webkit:1.4.0") -} - - -fun DependencyHandler.ThirdParty() { - //URL: https://github.com/airbnb/lottie-android - implementation("com.airbnb.android:lottie:3.7.0") - - //URL: https://github.com/jeziellago/compose-markdown - implementation("com.github.jeziellago:compose-markdown:0.2.6") - - //URL: https://github.com/JakeWharton/timber/releases - implementation("com.jakewharton.timber:timber:4.7.1") - - //URL: https://github.com/greenrobot/EventBus/releases - implementation("org.greenrobot:eventbus:3.3.1") - - //URL: https://github.com/notKamui/Keval - evaluate math expressions (calculator) - implementation("com.notkamui.libs:keval:0.9.0") - - implementation("com.opencsv:opencsv:5.5") - implementation("org.apache.commons:commons-lang3:3.12.0") -} \ No newline at end of file diff --git a/config/detekt/baseline.yml b/config/detekt/baseline.yml index 30683fbf02..ce7ce45e3d 100644 --- a/config/detekt/baseline.yml +++ b/config/detekt/baseline.yml @@ -122,10 +122,6 @@ CommentSpacing:AccValueFunctions.kt$AccountValueFunctions$//transfer to another account CommentSpacing:AccValueFunctions.kt$AccountValueFunctions$//transfer to self CommentSpacing:AccountByIdAct.kt$AccountByIdAct$//accountId - CommentSpacing:AccountUploader.kt$AccountUploader$//Delete on server - CommentSpacing:AccountUploader.kt$AccountUploader$//delete from local db - CommentSpacing:AccountUploader.kt$AccountUploader$//flag as synced - CommentSpacing:AccountUploader.kt$AccountUploader$//update CommentSpacing:AccountsTab.kt$//scroll hack CommentSpacing:AccountsViewModel.kt$AccountsViewModel$//this must be monthly CommentSpacing:AddTransactionWidget.kt$AddTransactionWidget$//--------------------------- </BROADCASTS> ---------------------------------------------------- @@ -136,25 +132,13 @@ CommentSpacing:AddTransactionWidgetCompact.kt$AddTransactionWidgetCompact$//--------------------------- </BROADCASTS> ---------------------------------------------------- CommentSpacing:AmountFormatting.kt$//Display Formatting CommentSpacing:AmountFormatting.kt$//TODO: Review, might cause trouble when integrating crypto - CommentSpacing:AnalyticsReportResponse.kt$AnalyticsReportResponse$//1-4 transaction per week - CommentSpacing:AnalyticsReportResponse.kt$AnalyticsReportResponse$//5-13 transactions per week - CommentSpacing:AnalyticsReportResponse.kt$AnalyticsReportResponse$//>= 14 per week (2 transactions per day = 14 per week) - CommentSpacing:AnalyticsReportResponse.kt$AnalyticsReportResponse$//Events ----------------------------------------------------- - CommentSpacing:AnalyticsReportResponse.kt$AnalyticsReportResponse$//Health - CommentSpacing:AnalyticsReportResponse.kt$AnalyticsReportResponse$//KPIs - CommentSpacing:AnalyticsReportResponse.kt$AnalyticsReportResponse$//User Stats CommentSpacing:AppLockedScreen.kt$//To automatically launch the biometric screen on load of this composable - CommentSpacing:AppModuleDI.kt$AppModuleDI$//Sync CommentSpacing:BalanceScreen.kt$//preview CommentSpacing:BalanceViewModel.kt$BalanceViewModel$//+ positive if Income > Expenses else - negative CommentSpacing:BudgetModal.kt$//add category CommentSpacing:BudgetModal.kt$//remove category CommentSpacing:BudgetScreen.kt$//preview CommentSpacing:BudgetScreen.kt$//scroll hack - CommentSpacing:BudgetUploader.kt$BudgetUploader$//Delete on server - CommentSpacing:BudgetUploader.kt$BudgetUploader$//delete from local db - CommentSpacing:BudgetUploader.kt$BudgetUploader$//flag as synced - CommentSpacing:BudgetUploader.kt$BudgetUploader$//update CommentSpacing:BudgetViewModel.kt$BudgetViewModel$//TODO: Re-work this by creating an FPAction for it CommentSpacing:BudgetViewModel.kt$BudgetViewModel$//decrement spent amount if it's not global budget CommentSpacing:BudgetViewModel.kt$BudgetViewModel$//ignore income @@ -200,10 +184,6 @@ CommentSpacing:CategoryCharts.kt$//add category CommentSpacing:CategoryCharts.kt$//remove category CommentSpacing:CategoryCharts.kt$//scroll hack - CommentSpacing:CategoryUploader.kt$CategoryUploader$//Delete on server - CommentSpacing:CategoryUploader.kt$CategoryUploader$//delete from local db - CommentSpacing:CategoryUploader.kt$CategoryUploader$//flag as synced - CommentSpacing:CategoryUploader.kt$CategoryUploader$//update CommentSpacing:ChartPeriod.kt$ChartPeriod$//end recursion CommentSpacing:ChartPeriod.kt$ChartPeriod$//not sure if this line is needed CommentSpacing:ChartPeriod.kt$ChartPeriod$//recurse @@ -301,7 +281,6 @@ CommentSpacing:ExportCSVLogic.kt$ExportCSVLogic$//Transfer Currency CommentSpacing:ExportCSVLogic.kt$ExportCSVLogic$//Type CommentSpacing:FAB.kt$//Floating action button - CommentSpacing:FetchAllTrnsFromServerAct.kt$FetchAllTrnsFromServerAct$//recurse CommentSpacing:FilterOverlay.kt$//Remove keyword CommentSpacing:FilterOverlay.kt$//add account CommentSpacing:FilterOverlay.kt$//add category @@ -367,7 +346,6 @@ CommentSpacing:ItemStatisticViewModel.kt$ItemStatisticViewModel$//TODO: Rework Overdue to FP CommentSpacing:ItemStatisticViewModel.kt$ItemStatisticViewModel$//TODO: Rework Upcoming to FP CommentSpacing:ItemStatisticViewModel.kt$ItemStatisticViewModel$//Upcoming - CommentSpacing:ItemStatisticViewModel.kt$ItemStatisticViewModel$//the server deletes transactions + planned payments for the account CommentSpacing:ItemStatisticViewModel.kt$ItemStatisticViewModel$//unspecifiedCategory==false is explicitly checked to accommodate for a temp AccountTransfers Category during Reports Screen CommentSpacing:IvyAndroidApp.kt$//I don't want strings.xml to handle something different than String at this point CommentSpacing:IvyColorPicker.kt$//Dark @@ -402,8 +380,6 @@ CommentSpacing:IvyWalletCtx.kt$IvyWalletCtx$//Testing -------------------------------------------------------------------------------------- CommentSpacing:IvyWalletCtx.kt$IvyWalletCtx$//if (BuildConfig.DEBUG) Constants.PREMIUM_INITIAL_VALUE_DEBUG else false CommentSpacing:IvyWalletCtx.kt$IvyWalletCtx$//this is default value - CommentSpacing:KPIs.kt$KPIs$//Paywall - CommentSpacing:KPIs.kt$KPIs$//Premium CommentSpacing:Keyboard.kt$//callback as soon as the layout is set with whether the keyboard is open or not CommentSpacing:Keyboard.kt$//get init state of keyboard CommentSpacing:Keyboard.kt$//since the observer is hit quite often, only callback when there is a change. @@ -421,22 +397,12 @@ CommentSpacing:LoanModal.kt$//breaks UI tests CommentSpacing:LoanModal.kt$//enabled = nameTextFieldValue.text.isNotNullOrBlank() && amount > 0 && ((createLoanTrans && selectedAcc != null) || !createLoanTrans) CommentSpacing:LoanRecord.kt$LoanRecord$//This is used store the converted amount for currencies which are different from the loan account currency - CommentSpacing:LoanRecordDTO.kt$LoanRecordDTO$//This is used store the converted amount for currencies which are different from the loan account currency CommentSpacing:LoanRecordEntity.kt$LoanRecordEntity$//This is used store the converted amount for currencies which are different from the loan account currency CommentSpacing:LoanRecordModal.kt$//+1 because Spacer width 24.dp CommentSpacing:LoanRecordModal.kt$//Unchecks the Recalculate Option if Recalculate Checkbox is not visible CommentSpacing:LoanRecordModal.kt$//breaks UI tests CommentSpacing:LoanRecordModal.kt$//enabled = amount > 0 && ((createLoanRecordTrans && selectedAcc != null) || !createLoanRecordTrans) CommentSpacing:LoanRecordModal.kt$//fix broken tests - CommentSpacing:LoanRecordUploader.kt$LoanRecordUploader$//Delete on server - CommentSpacing:LoanRecordUploader.kt$LoanRecordUploader$//delete from local db - CommentSpacing:LoanRecordUploader.kt$LoanRecordUploader$//flag as synced - CommentSpacing:LoanRecordUploader.kt$LoanRecordUploader$//update - CommentSpacing:LoanService.kt$LoanService$//LOAN RECORDS ---------------------------------------------------------------- - CommentSpacing:LoanUploader.kt$LoanUploader$//Delete on server - CommentSpacing:LoanUploader.kt$LoanUploader$//delete from local db - CommentSpacing:LoanUploader.kt$LoanUploader$//flag as synced - CommentSpacing:LoanUploader.kt$LoanUploader$//update CommentSpacing:LoansScreen.kt$//scroll hack CommentSpacing:MainBottomBar.kt$//+ & x button CommentSpacing:MainBottomBar.kt$//24.dp @@ -452,7 +418,6 @@ CommentSpacing:MainBottomBar.kt$//swipe up right CommentSpacing:MainViewModel.kt$MainViewModel$//Exiting (the backstack will close the app) CommentSpacing:MainViewModel.kt$MainViewModel$//Sync exchange rates - CommentSpacing:MainViewModel.kt$MainViewModel$//sync app data CommentSpacing:MoreInfo.kt$//More Info Button + Info Modal CommentSpacing:MoreMenu.kt$//Ivy Wallet's Home More menu CommentSpacing:OnboardingPrivacyTC.kt$//24+8=32.dp @@ -497,10 +462,6 @@ CommentSpacing:PieChartStatisticScreen.kt$//preview CommentSpacing:PieChartStatisticScreen.kt$//scroll hack CommentSpacing:PieChartStatisticScreen.kt$//selectedCategory && we're selected - CommentSpacing:PlannedPaymentRuleUploader.kt$PlannedPaymentRuleUploader$//Delete on server - CommentSpacing:PlannedPaymentRuleUploader.kt$PlannedPaymentRuleUploader$//delete from local db - CommentSpacing:PlannedPaymentRuleUploader.kt$PlannedPaymentRuleUploader$//flag as synced - CommentSpacing:PlannedPaymentRuleUploader.kt$PlannedPaymentRuleUploader$//update CommentSpacing:PlannedPaymentsGenerator.kt$PlannedPaymentsGenerator$//delete all not happened transactions CommentSpacing:PlannedPaymentsGenerator.kt$PlannedPaymentsGenerator$//generate transaction CommentSpacing:PlannedPaymentsGenerator.kt$PlannedPaymentsGenerator$//skip first N happened transactions @@ -513,6 +474,9 @@ CommentSpacing:PlansSheet.kt$//Lifetime plan CommentSpacing:PlansSheet.kt$//Subscription CommentSpacing:PreloadDataLogic.kt$PreloadDataLogic$//Preload data only if the user has less than 2 accounts + CommentSpacing:Project.kt$Project$//App + CommentSpacing:Project.kt$Project$//Compile SDK & Build Tools + CommentSpacing:Project.kt$Project$//Version CommentSpacing:RecurringRuleModal.kt$//One-time & Multiple Times CommentSpacing:ReorderModal.kt$//It's first in it's priority CommentSpacing:ReorderModal.kt$//It's last in it's priority @@ -533,10 +497,6 @@ CommentSpacing:ReportViewModel.kt$ReportViewModel$//Transfers Out CommentSpacing:ReportViewModel.kt$ReportViewModel$//Upcoming CommentSpacing:ReportViewModel.kt$ReportViewModel$//clear filter - CommentSpacing:RestClient.kt$RestClient.Companion$//Add AUTH headers - CommentSpacing:RestClient.kt$RestClient.Companion$//Handle Server errors - CommentSpacing:RestClient.kt$RestClient.Companion$//Session not initialized, yet - do nothing - CommentSpacing:RestClient.kt$RestClient.Companion$//TODO: SECURITY - Considering trusting only Ivy's cert CommentSpacing:RootActivity.kt$RootActivity$//Helpers for Compose UI CommentSpacing:RootActivity.kt$RootActivity$//display nothing CommentSpacing:RootActivity.kt$RootActivity$//month-1 because LocalDate start from 1 and date picker starts from 0 @@ -553,8 +513,6 @@ CommentSpacing:SettingsScreen.kt$//not synced CommentSpacing:SettingsScreen.kt$//onboarding toolbar include paddingBottom 16.dp CommentSpacing:SettingsScreen.kt$//synced - CommentSpacing:SettingsViewModel.kt$SettingsViewModel$//go to home screen - CommentSpacing:SettingsViewModel.kt$SettingsViewModel$//wait for sync to finish CommentSpacing:SharedPrefs.kt$SharedPrefs.Companion$//----------------------------- App Settings ----------------------------------------------- CommentSpacing:SharedPrefs.kt$SharedPrefs.Companion$//----------------------------- Others ----------------------------------------------- CommentSpacing:SharedPrefs.kt$SharedPrefs.Companion$//-------------------------------- Bank Integrations temp ---------------------------------- @@ -590,8 +548,6 @@ CommentSpacing:TransactionCard.kt$//TODO: Optimize this CommentSpacing:TransactionCard.kt$//Transfer CommentSpacing:TransactionCard.kt$//Upcoming Expense - CommentSpacing:TransactionDTO.kt$TransactionDTO$//This refers to the loan id that is linked with a transaction - CommentSpacing:TransactionDTO.kt$TransactionDTO$//This refers to the loan record id that is linked with a transaction CommentSpacing:TransactionDao.kt$TransactionDao$//Smart Title Suggestions CommentSpacing:TransactionEntity.kt$TransactionEntity$//Set isSynced && isDeleted to false so they aren't accounted in the equals check CommentSpacing:TransactionEntity.kt$TransactionEntity$//This refers to the loan id that is linked with a transaction @@ -600,10 +556,6 @@ CommentSpacing:TransactionReminderLogic.kt$TransactionReminderLogic$//8 PM is in the future, we can start reminder today CommentSpacing:TransactionReminderWorker.kt$TransactionReminderWorker$//Double check is needed because the user can switch off notifications in settings after it has been scheduled to show notifications for the next day CommentSpacing:TransactionReminderWorker.kt$TransactionReminderWorker$//Have less than 1 two transactions today, remind them - CommentSpacing:TransactionUploader.kt$TransactionUploader$//Delete on server - CommentSpacing:TransactionUploader.kt$TransactionUploader$//delete from local db - CommentSpacing:TransactionUploader.kt$TransactionUploader$//flag as synced - CommentSpacing:TransactionUploader.kt$TransactionUploader$//update CommentSpacing:TransactionViewModel.kt$TransactionViewModel$//TODO: Handle properly transfers exchange rate CommentSpacing:TransactionViewModel.kt$TransactionViewModel$//TODO: Handle transfers properly CommentSpacing:TransactionViewModel.kt$TransactionViewModel$//TRANSFER w/o toAccount @@ -631,38 +583,14 @@ CommentSpacing:WalletCharts.kt$//recurse CommentSpacing:WalletCharts.kt$//scroll hack CommentSpacing:WalletValueFunctions.kt$WalletValueFunctions$//Do not remove copy() - CommentSpacing:WebViewScreen.kt$//Activate Dark mode if the user uses Dark theme & it's supported - CommentSpacing:WebViewScreen.kt$//Android WebView should not be a in a scroll container :/ - CommentSpacing:WebViewScreen.kt$//Chrome Client is compatible with most of websites - CommentSpacing:WebViewScreen.kt$//because anchor links doesn't work - CommentSpacing:WebViewScreen.kt$//https://stackoverflow.com/questions/3039555/android-webview-anchor-link-jump-link-not-working CommentSpacing:WrapContentRow.kt$//Reset x CommentSpacing:WrapContentRow.kt$//item is overflowing -> move it to a new row CommentSpacing:build.gradle.kts$//------------------------------------------------------- CommentSpacing:build.gradle.kts$//Exclude this files so Jetpack Compose UI tests can build - CommentSpacing:build.gradle.kts$//Must match kotlinVersion from dependencies.kt + CommentSpacing:build.gradle.kts$//Must match kotlinVersion from Project.kt CommentSpacing:build.gradle.kts$//Required by Kotest CommentSpacing:build.gradle.kts$//URL: https://developers.google.com/android/guides/google-services-plugin CommentSpacing:build.gradle.kts$//https://mvnrepository.com/artifact/com.android.tools.build/gradle?repo=google - CommentSpacing:dependencies.kt$//--------------------------------------------------------------------------------- - CommentSpacing:dependencies.kt$//URL: https://developer.android.com/jetpack/androidx/releases/core - CommentSpacing:dependencies.kt$//URL: https://developer.android.com/jetpack/androidx/releases/recyclerview - CommentSpacing:dependencies.kt$//URL: https://developer.android.com/jetpack/androidx/releases/work - CommentSpacing:dependencies.kt$//URL: https://developer.android.com/training/dependency-injection/hilt-jetpack#workmanager - CommentSpacing:dependencies.kt$//URL: https://github.com/JakeWharton/timber/releases - CommentSpacing:dependencies.kt$//URL: https://github.com/airbnb/lottie-android - CommentSpacing:dependencies.kt$//URL: https://github.com/google/gson - CommentSpacing:dependencies.kt$//URL: https://github.com/greenrobot/EventBus/releases - CommentSpacing:dependencies.kt$//URL: https://github.com/jeziellago/compose-markdown - CommentSpacing:dependencies.kt$//URL: https://github.com/notKamui/Keval - evaluate math expressions (calculator) - CommentSpacing:dependencies.kt$//URL: https://github.com/square/okhttp/tree/master/okhttp-logging-interceptor - CommentSpacing:dependencies.kt$//URL: https://github.com/square/retrofit - CommentSpacing:dependencies.kt$//URL: https://mvnrepository.com/artifact/androidx.hilt/hilt-lifecycle-viewmodel?repo=google - CommentSpacing:dependencies.kt$//https://developer.android.com/jetpack/androidx/releases/appcompat - CommentSpacing:dependencies.kt$Project$//App - CommentSpacing:dependencies.kt$Project$//Compile SDK & Build Tools - CommentSpacing:dependencies.kt$Project$//Version - ComplexCondition:AnalyticsReportScreen.kt$loading || onboardingReport == null || kpis == null || health == null || userStats == null ComplexCondition:EditTransactionViewModel.kt$EditTransactionViewModel$customExchangeRateState.value.showCard && toAccCurrencyCode == customExchangeRateState.value.toCurrencyCode && fromAccCurrencyCode == customExchangeRateState.value.fromCurrencyCode && !resetRate ComplexCondition:Transactions.kt$(upcoming == null || upcoming.trns.isEmpty()) && (overdue == null || overdue.trns.isEmpty()) && history.isEmpty() ComposableNaming:Compose.kt$onEvent @@ -792,7 +720,6 @@ ConstructorParameterNaming:OnboardingRouter.kt$OnboardingRouter$private val _state: MutableLiveData<OnboardingState> ConstructorParameterNaming:ReorderModal.kt$Adapter$private val ItemContent: @Composable RowScope.(Int, Any) -> Unit CyclomaticComplexMethod:AccountModal.kt$@Composable fun BoxWithConstraintsScope.AccountModal( modal: AccountModalData?, onCreateAccount: (CreateAccountData) -> Unit, onEditAccount: (Account, balance: Double) -> Unit, dismiss: () -> Unit, ) - CyclomaticComplexMethod:AnalyticsReportViewModel.kt$AnalyticsReportViewModel$fun start( startDate: LocalDateTime? = this.startDate.value, endDate: LocalDateTime? = this.endDate.value, ) CyclomaticComplexMethod:BudgetBattery.kt$@Composable fun BudgetBattery( modifier: Modifier = Modifier, currency: String, expenses: Double, budget: Double, backgroundNotFilled: Color = UI.colors.pure, onClick: (() -> Unit)? = null, ) CyclomaticComplexMethod:CSVViewModel.kt$CSVViewModel$private suspend fun handleEvent(event: CSVEvent) CyclomaticComplexMethod:DonateScreen.kt$@Composable private fun DonateOptionPicker( option: DonateOption, onSelect: (DonateOption) -> Unit ) @@ -805,7 +732,6 @@ CyclomaticComplexMethod:LoanRecordModal.kt$@Composable fun BoxWithConstraintsScope.LoanRecordModal( modal: LoanRecordModalData?, accounts: List<Account> = emptyList(), onCreateAccount: (CreateAccountData) -> Unit = {}, onCreate: (CreateLoanRecordData) -> Unit, onEdit: (EditLoanRecordData) -> Unit, onDelete: (LoanRecord) -> Unit, dismiss: () -> Unit ) CyclomaticComplexMethod:MainBottomBar.kt$@Composable fun BoxWithConstraintsScope.BottomBar( tab: MainTab, selectTab: (MainTab) -> Unit, onAddIncome: () -> Unit, onAddExpense: () -> Unit, onAddTransfer: () -> Unit, onAddPlannedPayment: () -> Unit, showAddAccountModal: () -> Unit, ) CyclomaticComplexMethod:ParseFields.kt$fun parseTransactionType( value: String, metadata: TrnTypeMetadata ): TransactionType? - CyclomaticComplexMethod:PlannedPaymentsLogic.kt$PlannedPaymentsLogic$suspend fun payOrGet( transactions: List<Transaction>, syncTransaction: Boolean = true, skipTransaction: Boolean = false, onUpdateUI: suspend (paidTransactions: List<Transaction>) -> Unit ) CyclomaticComplexMethod:PlansSheet.kt$@Composable private fun ColumnScope.PlanCard( plan: Plan, purchased: Boolean, selectedPlan: Plan?, monthlyPlan: Plan?, onClick: () -> Unit ) CyclomaticComplexMethod:ReportViewModel.kt$ReportViewModel$private suspend fun filterTransactions( baseCurrency: String, accounts: List<Account>, filter: ReportFilter, ): List<Transaction> CyclomaticComplexMethod:RootActivity.kt$RootActivity$@ExperimentalFoundationApi @ExperimentalAnimationApi @Composable private fun BoxWithConstraintsScope.Screens(screen: Screen?) @@ -816,13 +742,12 @@ EmptyCatchBlock:ComposeExt.kt${ } EmptyCatchBlock:IntervalPickerRow.kt${ } EmptyClassBlock:AccountsUpdatedEvent.kt$AccountsUpdatedEvent${ } - EmptyDefaultConstructor:IvyBilling.kt$IvyBilling$( ) EmptyFunctionBlock:AccountCharts.kt${ } - EmptyFunctionBlock:RestClient.kt$RestClient.Companion.<no name provided>${ } + EmptyFunctionBlock:PaywallViewModel.kt$PaywallViewModel${ } EmptyFunctionBlock:RootViewModel.kt$RootViewModel.<no name provided>${ } + EmptyTryBlock:SettingsViewModel.kt$SettingsViewModel${ } ExplicitItLambdaParameter:TimeValue.kt${ index, it -> Value( x = index.toDouble(), y = it.value ) } ExplicitItLambdaParameter:TimeValue.kt${ index, it -> Value( x = index.toDouble(), y = it.value.toDouble() ) } - Filename:dependencies.kt$com.ivy.wallet.buildsrc.dependencies.kt FinalNewline:AccValueFunctions.kt$com.ivy.wallet.domain.pure.transaction.AccValueFunctions.kt FinalNewline:Account.kt$com.ivy.wallet.domain.data.core.Account.kt FinalNewline:AccountBalance.kt$com.ivy.wallet.ui.onboarding.model.AccountBalance.kt @@ -835,13 +760,9 @@ FinalNewline:AccountEntity.kt$com.ivy.wallet.io.persistence.data.AccountEntity.kt FinalNewline:AccountFunctions.kt$com.ivy.wallet.domain.pure.account.AccountFunctions.kt FinalNewline:AccountModal.kt$com.ivy.wallet.ui.theme.modal.edit.AccountModal.kt - FinalNewline:AccountService.kt$com.ivy.wallet.io.network.service.AccountService.kt FinalNewline:AccountState.kt$com.ivy.wallet.ui.accounts.AccountState.kt - FinalNewline:AccountSync.kt$com.ivy.wallet.domain.deprecated.sync.item.AccountSync.kt - FinalNewline:AccountUploader.kt$com.ivy.wallet.domain.deprecated.sync.uploader.AccountUploader.kt FinalNewline:AccountsAct.kt$com.ivy.wallet.domain.action.account.AccountsAct.kt FinalNewline:AccountsEvent.kt$com.ivy.wallet.ui.accounts.AccountsEvent.kt - FinalNewline:AccountsResponse.kt$com.ivy.wallet.io.network.request.account.AccountsResponse.kt FinalNewline:AccountsUpdatedEvent.kt$com.ivy.wallet.domain.event.AccountsUpdatedEvent.kt FinalNewline:AccountsViewModel.kt$com.ivy.wallet.ui.accounts.AccountsViewModel.kt FinalNewline:ActivityResultExt.kt$com.ivy.wallet.utils.ActivityResultExt.kt @@ -855,17 +776,11 @@ FinalNewline:AmountCurrency.kt$com.ivy.wallet.ui.theme.wallet.AmountCurrency.kt FinalNewline:AmountFormatting.kt$com.ivy.wallet.utils.AmountFormatting.kt FinalNewline:AnalyticsEvent.kt$com.ivy.wallet.domain.data.analytics.AnalyticsEvent.kt - FinalNewline:AnalyticsReportResponse.kt$com.ivy.wallet.io.network.request.analytics.AnalyticsReportResponse.kt - FinalNewline:AnalyticsReportViewModel.kt$com.ivy.wallet.ui.analytics.AnalyticsReportViewModel.kt - FinalNewline:AnalyticsService.kt$com.ivy.wallet.io.network.service.AnalyticsService.kt - FinalNewline:AnalyticsTab.kt$com.ivy.wallet.ui.analytics.AnalyticsTab.kt FinalNewline:Android.kt$com.ivy.design.utils.Android.kt FinalNewline:Animation.kt$com.ivy.design.utils.Animation.kt FinalNewline:AppBaseData.kt$com.ivy.wallet.ui.data.AppBaseData.kt FinalNewline:AppModuleDI.kt$com.ivy.wallet.AppModuleDI.kt FinalNewline:AuthProviderType.kt$com.ivy.wallet.domain.data.AuthProviderType.kt - FinalNewline:AuthResponse.kt$com.ivy.wallet.io.network.request.auth.AuthResponse.kt - FinalNewline:AuthService.kt$com.ivy.wallet.io.network.service.AuthService.kt FinalNewline:BackBottomBar.kt$com.ivy.wallet.ui.theme.components.BackBottomBar.kt FinalNewline:Background.kt$com.ivy.design.l1_buildingBlocks.data.Background.kt FinalNewline:BackupLogic.kt$com.ivy.wallet.domain.deprecated.logic.zip.BackupLogic.kt @@ -876,16 +791,11 @@ FinalNewline:Budget.kt$com.ivy.wallet.domain.data.core.Budget.kt FinalNewline:BudgetBattery.kt$com.ivy.wallet.ui.theme.components.BudgetBattery.kt FinalNewline:BudgetCreator.kt$com.ivy.wallet.domain.deprecated.logic.BudgetCreator.kt - FinalNewline:BudgetDTO.kt$com.ivy.wallet.io.network.data.BudgetDTO.kt FinalNewline:BudgetDao.kt$com.ivy.wallet.io.persistence.dao.BudgetDao.kt FinalNewline:BudgetEntity.kt$com.ivy.wallet.io.persistence.data.BudgetEntity.kt FinalNewline:BudgetModal.kt$com.ivy.wallet.ui.theme.modal.BudgetModal.kt - FinalNewline:BudgetService.kt$com.ivy.wallet.io.network.service.BudgetService.kt - FinalNewline:BudgetSync.kt$com.ivy.wallet.domain.deprecated.sync.item.BudgetSync.kt - FinalNewline:BudgetUploader.kt$com.ivy.wallet.domain.deprecated.sync.uploader.BudgetUploader.kt FinalNewline:BudgetViewModel.kt$com.ivy.wallet.ui.budget.BudgetViewModel.kt FinalNewline:BudgetsAct.kt$com.ivy.wallet.domain.action.budget.BudgetsAct.kt - FinalNewline:BudgetsResponse.kt$com.ivy.wallet.io.network.request.budget.BudgetsResponse.kt FinalNewline:BufferBattery.kt$com.ivy.wallet.ui.theme.components.BufferBattery.kt FinalNewline:BufferInfo.kt$com.ivy.wallet.ui.data.BufferInfo.kt FinalNewline:BufferModal.kt$com.ivy.wallet.ui.theme.modal.BufferModal.kt @@ -913,23 +823,17 @@ FinalNewline:CategoryAmount.kt$com.ivy.wallet.ui.statistic.level1.CategoryAmount.kt FinalNewline:CategoryByIdAct.kt$com.ivy.wallet.domain.action.category.CategoryByIdAct.kt FinalNewline:CategoryCreator.kt$com.ivy.wallet.domain.deprecated.logic.CategoryCreator.kt - FinalNewline:CategoryDTO.kt$com.ivy.wallet.io.network.data.CategoryDTO.kt FinalNewline:CategoryDao.kt$com.ivy.wallet.io.persistence.dao.CategoryDao.kt FinalNewline:CategoryData.kt$com.ivy.wallet.ui.category.CategoryData.kt FinalNewline:CategoryEntity.kt$com.ivy.wallet.io.persistence.data.CategoryEntity.kt FinalNewline:CategoryIncomeWithAccountFiltersAct.kt$com.ivy.wallet.domain.action.category.CategoryIncomeWithAccountFiltersAct.kt FinalNewline:CategoryModal.kt$com.ivy.wallet.ui.theme.modal.edit.CategoryModal.kt - FinalNewline:CategoryService.kt$com.ivy.wallet.io.network.service.CategoryService.kt - FinalNewline:CategorySync.kt$com.ivy.wallet.domain.deprecated.sync.item.CategorySync.kt FinalNewline:CategoryTrnsBetweenAct.kt$com.ivy.wallet.domain.action.category.CategoryTrnsBetweenAct.kt - FinalNewline:CategoryUploader.kt$com.ivy.wallet.domain.deprecated.sync.uploader.CategoryUploader.kt FinalNewline:CategoryValues.kt$com.ivy.wallet.ui.charts.CategoryValues.kt FinalNewline:ChangeTransactionTypeModal.kt$com.ivy.wallet.ui.theme.components.ChangeTransactionTypeModal.kt FinalNewline:ChartPeriod.kt$com.ivy.wallet.domain.pure.charts.ChartPeriod.kt FinalNewline:ChartType.kt$com.ivy.wallet.ui.charts.ChartType.kt FinalNewline:ChartsCore.kt$com.ivy.wallet.domain.pure.charts.ChartsCore.kt - FinalNewline:CheckEmailRequest.kt$com.ivy.wallet.io.network.request.auth.CheckEmailRequest.kt - FinalNewline:CheckEmailResponse.kt$com.ivy.wallet.io.network.request.auth.CheckEmailResponse.kt FinalNewline:Checkbox.kt$com.ivy.design.l2_components.Checkbox.kt FinalNewline:ChooseCategoryModal.kt$com.ivy.wallet.ui.theme.modal.edit.ChooseCategoryModal.kt FinalNewline:ChoosePeriodModal.kt$com.ivy.wallet.ui.theme.modal.ChoosePeriodModal.kt @@ -947,27 +851,18 @@ FinalNewline:CreateCategoryData.kt$com.ivy.wallet.domain.deprecated.logic.model.CreateCategoryData.kt FinalNewline:CreateLoanData.kt$com.ivy.wallet.domain.deprecated.logic.model.CreateLoanData.kt FinalNewline:CreateLoanRecordData.kt$com.ivy.wallet.domain.deprecated.logic.model.CreateLoanRecordData.kt - FinalNewline:CrupdateBudgetRequest.kt$com.ivy.wallet.io.network.request.budget.CrupdateBudgetRequest.kt FinalNewline:CurrencyModal.kt$com.ivy.wallet.ui.theme.modal.CurrencyModal.kt FinalNewline:CurrencyPicker.kt$com.ivy.wallet.ui.theme.components.CurrencyPicker.kt FinalNewline:CustomExchangeRateCard.kt$com.ivy.wallet.ui.theme.components.CustomExchangeRateCard.kt FinalNewline:CustomExchangeRateState.kt$com.ivy.wallet.domain.data.CustomExchangeRateState.kt FinalNewline:CustomerJourney.kt$com.ivy.wallet.ui.home.CustomerJourney.kt FinalNewline:CustomerJourneyCardData.kt$com.ivy.wallet.domain.deprecated.logic.model.CustomerJourneyCardData.kt - FinalNewline:DataCircle.kt$com.ivy.wallet.ui.analytics.DataCircle.kt FinalNewline:DateExt.kt$com.ivy.wallet.utils.DateExt.kt FinalNewline:DefaultImportSteps.kt$com.ivy.wallet.ui.csvimport.flow.instructions.DefaultImportSteps.kt - FinalNewline:DeleteAccountRequest.kt$com.ivy.wallet.io.network.request.account.DeleteAccountRequest.kt FinalNewline:DeleteAllData.kt$com.ivy.design.l4_patterns.delete.DeleteAllData.kt - FinalNewline:DeleteBudgetRequest.kt$com.ivy.wallet.io.network.request.budget.DeleteBudgetRequest.kt FinalNewline:DeleteButton.kt$com.ivy.wallet.ui.theme.components.DeleteButton.kt FinalNewline:DeleteItem.kt$com.ivy.design.l4_patterns.delete.DeleteItem.kt - FinalNewline:DeleteLoanRecordRequest.kt$com.ivy.wallet.io.network.request.loan.DeleteLoanRecordRequest.kt - FinalNewline:DeleteLoanRequest.kt$com.ivy.wallet.io.network.request.loan.DeleteLoanRequest.kt FinalNewline:DeleteModal.kt$com.ivy.wallet.ui.theme.modal.DeleteModal.kt - FinalNewline:DeletePlannedPaymentRuleRequest.kt$com.ivy.wallet.io.network.request.planned.DeletePlannedPaymentRuleRequest.kt - FinalNewline:DeleteTransactionRequest.kt$com.ivy.wallet.io.network.request.transaction.DeleteTransactionRequest.kt - FinalNewline:DeleteWalletCategoryRequest.kt$com.ivy.wallet.io.network.request.category.DeleteWalletCategoryRequest.kt FinalNewline:Description.kt$com.ivy.wallet.ui.edit.core.Description.kt FinalNewline:DescriptionModal.kt$com.ivy.wallet.ui.theme.modal.edit.DescriptionModal.kt FinalNewline:DisplayBudget.kt$com.ivy.wallet.ui.budget.model.DisplayBudget.kt @@ -992,24 +887,17 @@ FinalNewline:EditTransactionViewModel.kt$com.ivy.wallet.ui.edit.EditTransactionViewModel.kt FinalNewline:EmailState.kt$com.ivy.wallet.domain.data.EmailState.kt FinalNewline:EncryptedSharedPrefs.kt$com.ivy.wallet.data.EncryptedSharedPrefs.kt - FinalNewline:ErrorCode.kt$com.ivy.wallet.io.network.error.ErrorCode.kt FinalNewline:ExampleInstrumentedTest.kt$com.ivy.design.ExampleInstrumentedTest.kt FinalNewline:Exchange.kt$com.ivy.wallet.domain.pure.exchange.Exchange.kt FinalNewline:ExchangeRate.kt$com.ivy.wallet.domain.data.core.ExchangeRate.kt - FinalNewline:ExchangeRateDTO.kt$com.ivy.wallet.io.network.data.ExchangeRateDTO.kt FinalNewline:ExchangeRateDao.kt$com.ivy.wallet.io.persistence.dao.ExchangeRateDao.kt FinalNewline:ExchangeRateEntity.kt$com.ivy.wallet.io.persistence.data.ExchangeRateEntity.kt FinalNewline:ExchangeRatesLogic.kt$com.ivy.wallet.domain.deprecated.logic.currency.ExchangeRatesLogic.kt - FinalNewline:ExchangeRatesResponse.kt$com.ivy.wallet.io.network.request.currency.ExchangeRatesResponse.kt FinalNewline:ExchangeRatesScreen.kt$com.ivy.wallet.ui.exchangerates.ExchangeRatesScreen.kt - FinalNewline:ExchangeRatesService.kt$com.ivy.wallet.io.network.service.ExchangeRatesService.kt FinalNewline:ExchangeRatesViewModel.kt$com.ivy.wallet.ui.exchangerates.ExchangeRatesViewModel.kt FinalNewline:ExchangeTrns.kt$com.ivy.wallet.domain.pure.exchange.ExchangeTrns.kt - FinalNewline:ExpImagesService.kt$com.ivy.wallet.io.network.service.ExpImagesService.kt FinalNewline:ExportCSVLogic.kt$com.ivy.wallet.domain.deprecated.logic.csv.ExportCSVLogic.kt FinalNewline:FAB.kt$com.ivy.design.l3_ivyComponents.button.FAB.kt - FinalNewline:FetchAllTrnsFromServerAct.kt$com.ivy.wallet.domain.action.transaction.FetchAllTrnsFromServerAct.kt - FinalNewline:FetchImagesAct.kt$com.ivy.wallet.domain.action.viewmodel.experiment.FetchImagesAct.kt FinalNewline:FileUtil.kt$com.ivy.wallet.utils.FileUtil.kt FinalNewline:FilterOverlay.kt$com.ivy.wallet.ui.reports.FilterOverlay.kt FinalNewline:FinancistoSteps.kt$com.ivy.wallet.ui.csvimport.flow.instructions.FinancistoSteps.kt @@ -1028,12 +916,8 @@ FinalNewline:GitHubCredentials.kt$com.ivy.wallet.backup.github.GitHubCredentials.kt FinalNewline:GitHubPATMigration.kt$com.ivy.wallet.migrations.impl.GitHubPATMigration.kt FinalNewline:GitHubWorkerMigration.kt$com.ivy.wallet.migrations.impl.GitHubWorkerMigration.kt - FinalNewline:GoogleSignInRequest.kt$com.ivy.wallet.io.network.request.auth.GoogleSignInRequest.kt FinalNewline:GradientCut.kt$com.ivy.wallet.ui.theme.components.GradientCut.kt - FinalNewline:GsonTypeAdapters.kt$com.ivy.wallet.io.network.GsonTypeAdapters.kt FinalNewline:HasTrnsAct.kt$com.ivy.wallet.domain.action.viewmodel.home.HasTrnsAct.kt - FinalNewline:Health.kt$com.ivy.wallet.ui.analytics.model.Health.kt - FinalNewline:HealthTab.kt$com.ivy.wallet.ui.analytics.tab.HealthTab.kt FinalNewline:HistoryDateDivider.kt$com.ivy.wallet.ui.component.transaction.HistoryDateDivider.kt FinalNewline:HistoryTrnsAct.kt$com.ivy.wallet.domain.action.transaction.HistoryTrnsAct.kt FinalNewline:HistoryWithDateDivsAct.kt$com.ivy.wallet.domain.action.transaction.HistoryWithDateDivsAct.kt @@ -1052,8 +936,6 @@ FinalNewline:ImportType.kt$com.ivy.wallet.domain.deprecated.logic.csv.model.ImportType.kt FinalNewline:ImportViewModel.kt$com.ivy.wallet.ui.csvimport.ImportViewModel.kt FinalNewline:IncomeExpensePair.kt$com.ivy.wallet.domain.pure.data.IncomeExpensePair.kt - FinalNewline:InitiateResetPasswordRequest.kt$com.ivy.wallet.io.network.request.auth.InitiateResetPasswordRequest.kt - FinalNewline:InitiateResetPasswordResponse.kt$com.ivy.wallet.io.network.request.auth.InitiateResetPasswordResponse.kt FinalNewline:InputError.kt$com.ivy.wallet.utils.InputError.kt FinalNewline:InputField.kt$com.ivy.design.l2_components.InputField.kt FinalNewline:Insets.kt$com.ivy.design.utils.Insets.kt @@ -1063,7 +945,6 @@ FinalNewline:ItemIcon.kt$com.ivy.wallet.ui.theme.components.ItemIcon.kt FinalNewline:ItemStatisticScreen.kt$com.ivy.wallet.ui.statistic.level2.ItemStatisticScreen.kt FinalNewline:ItemStatisticViewModel.kt$com.ivy.wallet.ui.statistic.level2.ItemStatisticViewModel.kt - FinalNewline:IvyAnalytics.kt$com.ivy.wallet.io.network.IvyAnalytics.kt FinalNewline:IvyAndroidApp.kt$com.ivy.wallet.IvyAndroidApp.kt FinalNewline:IvyAnimation.kt$com.ivy.wallet.utils.IvyAnimation.kt FinalNewline:IvyBasicTextField.kt$com.ivy.wallet.ui.theme.components.IvyBasicTextField.kt @@ -1097,10 +978,8 @@ FinalNewline:IvyOutlinedTextField.kt$com.ivy.wallet.ui.theme.components.IvyOutlinedTextField.kt FinalNewline:IvyPadding.kt$com.ivy.design.l1_buildingBlocks.data.IvyPadding.kt FinalNewline:IvyRoomDatabase.kt$com.ivy.wallet.io.persistence.IvyRoomDatabase.kt - FinalNewline:IvySession.kt$com.ivy.wallet.io.network.IvySession.kt FinalNewline:IvyShapes.kt$com.ivy.design.l0_system.IvyShapes.kt FinalNewline:IvySwitch.kt$com.ivy.wallet.ui.theme.components.IvySwitch.kt - FinalNewline:IvySync.kt$com.ivy.wallet.domain.deprecated.sync.IvySync.kt FinalNewline:IvyText.kt$com.ivy.design.l1_buildingBlocks.IvyText.kt FinalNewline:IvyTitleTextField.kt$com.ivy.wallet.ui.theme.components.IvyTitleTextField.kt FinalNewline:IvyToolbar.kt$com.ivy.wallet.ui.theme.components.IvyToolbar.kt @@ -1111,19 +990,16 @@ FinalNewline:IvyWalletDatastore.kt$com.ivy.wallet.data.IvyWalletDatastore.kt FinalNewline:IvyWalletDesign.kt$com.ivy.design.api.systems.IvyWalletDesign.kt FinalNewline:IvyWalletSteps.kt$com.ivy.wallet.ui.csvimport.flow.instructions.IvyWalletSteps.kt - FinalNewline:KPIs.kt$com.ivy.wallet.ui.analytics.model.KPIs.kt - FinalNewline:KPIsTab.kt$com.ivy.wallet.ui.analytics.tab.KPIsTab.kt FinalNewline:KTWMoneyMangerSteps.kt$com.ivy.wallet.ui.csvimport.flow.instructions.KTWMoneyMangerSteps.kt FinalNewline:Keyboard.kt$com.ivy.design.utils.Keyboard.kt - FinalNewline:KtorClient.kt$com.ivy.wallet.backup.ktor.KtorClient.kt - FinalNewline:KtorClientModule.kt$com.ivy.wallet.backup.ktor.KtorClientModule.kt + FinalNewline:KtorClient.kt$com.ivy.wallet.ktor.KtorClient.kt + FinalNewline:KtorClientModule.kt$com.ivy.wallet.ktor.KtorClientModule.kt FinalNewline:LTLoanRecordMapper.kt$com.ivy.wallet.domain.deprecated.logic.loantrasactions.LTLoanRecordMapper.kt FinalNewline:LastNTimeRange.kt$com.ivy.wallet.ui.onboarding.model.LastNTimeRange.kt FinalNewline:Loan.kt$com.ivy.wallet.domain.data.core.Loan.kt FinalNewline:LoanBottomBar.kt$com.ivy.wallet.ui.loan.LoanBottomBar.kt FinalNewline:LoanByIdAct.kt$com.ivy.wallet.domain.action.loan.LoanByIdAct.kt FinalNewline:LoanCreator.kt$com.ivy.wallet.domain.deprecated.logic.LoanCreator.kt - FinalNewline:LoanDTO.kt$com.ivy.wallet.io.network.data.LoanDTO.kt FinalNewline:LoanDao.kt$com.ivy.wallet.io.persistence.dao.LoanDao.kt FinalNewline:LoanDetailsScreen.kt$com.ivy.wallet.ui.loandetails.LoanDetailsScreen.kt FinalNewline:LoanDetailsViewModel.kt$com.ivy.wallet.ui.loandetails.LoanDetailsViewModel.kt @@ -1131,23 +1007,14 @@ FinalNewline:LoanModal.kt$com.ivy.wallet.ui.theme.modal.LoanModal.kt FinalNewline:LoanRecord.kt$com.ivy.wallet.domain.data.core.LoanRecord.kt FinalNewline:LoanRecordCreator.kt$com.ivy.wallet.domain.deprecated.logic.LoanRecordCreator.kt - FinalNewline:LoanRecordDTO.kt$com.ivy.wallet.io.network.data.LoanRecordDTO.kt FinalNewline:LoanRecordDao.kt$com.ivy.wallet.io.persistence.dao.LoanRecordDao.kt FinalNewline:LoanRecordEntity.kt$com.ivy.wallet.io.persistence.data.LoanRecordEntity.kt FinalNewline:LoanRecordModal.kt$com.ivy.wallet.ui.theme.modal.LoanRecordModal.kt - FinalNewline:LoanRecordSync.kt$com.ivy.wallet.domain.deprecated.sync.item.LoanRecordSync.kt - FinalNewline:LoanRecordUploader.kt$com.ivy.wallet.domain.deprecated.sync.uploader.LoanRecordUploader.kt - FinalNewline:LoanRecordsResponse.kt$com.ivy.wallet.io.network.request.loan.LoanRecordsResponse.kt - FinalNewline:LoanService.kt$com.ivy.wallet.io.network.service.LoanService.kt - FinalNewline:LoanSync.kt$com.ivy.wallet.domain.deprecated.sync.item.LoanSync.kt FinalNewline:LoanTransactionsCore.kt$com.ivy.wallet.domain.deprecated.logic.loantrasactions.LoanTransactionsCore.kt FinalNewline:LoanType.kt$com.ivy.wallet.domain.data.LoanType.kt - FinalNewline:LoanUploader.kt$com.ivy.wallet.domain.deprecated.sync.uploader.LoanUploader.kt FinalNewline:LoanViewModel.kt$com.ivy.wallet.ui.loan.LoanViewModel.kt FinalNewline:LoansAct.kt$com.ivy.wallet.domain.action.loan.LoansAct.kt - FinalNewline:LoansResponse.kt$com.ivy.wallet.io.network.request.loan.LoansResponse.kt FinalNewline:LoansScreen.kt$com.ivy.wallet.ui.loan.LoansScreen.kt - FinalNewline:LogEventRequest.kt$com.ivy.wallet.io.network.request.analytics.LogEventRequest.kt FinalNewline:LogoutLogic.kt$com.ivy.wallet.domain.deprecated.logic.LogoutLogic.kt FinalNewline:MVVMExt.kt$com.ivy.wallet.utils.MVVMExt.kt FinalNewline:MainBottomBar.kt$com.ivy.wallet.ui.main.MainBottomBar.kt @@ -1180,17 +1047,13 @@ FinalNewline:MoreInfo.kt$com.ivy.design.l4_patterns.MoreInfo.kt FinalNewline:MoreMenu.kt$com.ivy.design.l4_patterns.MoreMenu.kt FinalNewline:NameModal.kt$com.ivy.wallet.ui.theme.modal.NameModal.kt - FinalNewline:NetworkError.kt$com.ivy.wallet.io.network.error.NetworkError.kt FinalNewline:NewEditScreenPref.kt$com.ivy.wallet.domain.data.preference.NewEditScreenPref.kt FinalNewline:NotificationService.kt$com.ivy.wallet.android.notification.NotificationService.kt - FinalNewline:NukeService.kt$com.ivy.wallet.io.network.service.NukeService.kt FinalNewline:OnboardingAccounts.kt$com.ivy.wallet.ui.onboarding.steps.OnboardingAccounts.kt FinalNewline:OnboardingCategories.kt$com.ivy.wallet.ui.onboarding.steps.OnboardingCategories.kt FinalNewline:OnboardingComponents.kt$com.ivy.wallet.ui.theme.components.OnboardingComponents.kt FinalNewline:OnboardingPrivacyTC.kt$com.ivy.wallet.ui.onboarding.steps.archived.OnboardingPrivacyTC.kt FinalNewline:OnboardingProgressSlider.kt$com.ivy.wallet.ui.onboarding.components.OnboardingProgressSlider.kt - FinalNewline:OnboardingReport.kt$com.ivy.wallet.ui.analytics.model.OnboardingReport.kt - FinalNewline:OnboardingReportTab.kt$com.ivy.wallet.ui.analytics.tab.OnboardingReportTab.kt FinalNewline:OnboardingRouter.kt$com.ivy.wallet.ui.onboarding.viewmodel.OnboardingRouter.kt FinalNewline:OnboardingScreen.kt$com.ivy.wallet.ui.onboarding.OnboardingScreen.kt FinalNewline:OnboardingSetCurrency.kt$com.ivy.wallet.ui.onboarding.steps.OnboardingSetCurrency.kt @@ -1202,8 +1065,6 @@ FinalNewline:OnboardingViewModel.kt$com.ivy.wallet.ui.onboarding.viewmodel.OnboardingViewModel.kt FinalNewline:OneMoneySteps.kt$com.ivy.wallet.ui.csvimport.flow.instructions.OneMoneySteps.kt FinalNewline:OpResult.kt$com.ivy.wallet.utils.OpResult.kt - FinalNewline:OpenIssueRequest.kt$com.ivy.wallet.io.network.request.github.OpenIssueRequest.kt - FinalNewline:OpenIssueResponse.kt$com.ivy.wallet.io.network.request.github.OpenIssueResponse.kt FinalNewline:OverdueAct.kt$com.ivy.wallet.domain.action.viewmodel.home.OverdueAct.kt FinalNewline:ParseFields.kt$com.ivy.wallet.ui.csv.domain.ParseFields.kt FinalNewline:ParseStatus.kt$com.ivy.wallet.ui.csv.domain.ParseStatus.kt @@ -1218,13 +1079,8 @@ FinalNewline:Plan.kt$com.ivy.wallet.android.billing.Plan.kt FinalNewline:PlanType.kt$com.ivy.wallet.android.billing.PlanType.kt FinalNewline:PlannedPaymentRule.kt$com.ivy.wallet.domain.data.core.PlannedPaymentRule.kt - FinalNewline:PlannedPaymentRuleDTO.kt$com.ivy.wallet.io.network.data.PlannedPaymentRuleDTO.kt FinalNewline:PlannedPaymentRuleDao.kt$com.ivy.wallet.io.persistence.dao.PlannedPaymentRuleDao.kt FinalNewline:PlannedPaymentRuleEntity.kt$com.ivy.wallet.io.persistence.data.PlannedPaymentRuleEntity.kt - FinalNewline:PlannedPaymentRuleService.kt$com.ivy.wallet.io.network.service.PlannedPaymentRuleService.kt - FinalNewline:PlannedPaymentRuleUploader.kt$com.ivy.wallet.domain.deprecated.sync.uploader.PlannedPaymentRuleUploader.kt - FinalNewline:PlannedPaymentRulesResponse.kt$com.ivy.wallet.io.network.request.planned.PlannedPaymentRulesResponse.kt - FinalNewline:PlannedPaymentSync.kt$com.ivy.wallet.domain.deprecated.sync.item.PlannedPaymentSync.kt FinalNewline:PlannedPaymentsBottomBar.kt$com.ivy.wallet.ui.planned.list.PlannedPaymentsBottomBar.kt FinalNewline:PlannedPaymentsGenerator.kt$com.ivy.wallet.domain.deprecated.logic.PlannedPaymentsGenerator.kt FinalNewline:PlannedPaymentsLazyColumn.kt$com.ivy.wallet.ui.planned.list.PlannedPaymentsLazyColumn.kt @@ -1253,9 +1109,6 @@ FinalNewline:ReportScreenEvent.kt$com.ivy.wallet.ui.reports.ReportScreenEvent.kt FinalNewline:ReportScreenState.kt$com.ivy.wallet.ui.reports.ReportScreenState.kt FinalNewline:ReportViewModel.kt$com.ivy.wallet.ui.reports.ReportViewModel.kt - FinalNewline:ResetPasswordRequest.kt$com.ivy.wallet.io.network.request.auth.ResetPasswordRequest.kt - FinalNewline:RestClient.kt$com.ivy.wallet.io.network.RestClient.kt - FinalNewline:RestError.kt$com.ivy.wallet.io.network.error.RestError.kt FinalNewline:RoomTypeConverters.kt$com.ivy.wallet.io.persistence.RoomTypeConverters.kt FinalNewline:RootActivity.kt$com.ivy.wallet.ui.RootActivity.kt FinalNewline:RootViewModel.kt$com.ivy.wallet.ui.RootViewModel.kt @@ -1271,7 +1124,6 @@ FinalNewline:SetPreferenceAct.kt$com.ivy.wallet.domain.action.settings.preference.SetPreferenceAct.kt FinalNewline:Settings.kt$com.ivy.wallet.domain.data.core.Settings.kt FinalNewline:SettingsAct.kt$com.ivy.wallet.domain.action.settings.SettingsAct.kt - FinalNewline:SettingsDTO.kt$com.ivy.wallet.io.network.data.SettingsDTO.kt FinalNewline:SettingsDao.kt$com.ivy.wallet.io.persistence.dao.SettingsDao.kt FinalNewline:SettingsEntity.kt$com.ivy.wallet.io.persistence.data.SettingsEntity.kt FinalNewline:SettingsScreen.kt$com.ivy.wallet.ui.settings.SettingsScreen.kt @@ -1280,8 +1132,6 @@ FinalNewline:SharedPrefs.kt$com.ivy.wallet.io.persistence.SharedPrefs.kt FinalNewline:ShortAmountTest.kt$com.ivy.wallet.ShortAmountTest.kt FinalNewline:ShouldHideBalanceAct.kt$com.ivy.wallet.domain.action.viewmodel.home.ShouldHideBalanceAct.kt - FinalNewline:SignInRequest.kt$com.ivy.wallet.io.network.request.auth.SignInRequest.kt - FinalNewline:SignUpRequest.kt$com.ivy.wallet.io.network.request.auth.SignUpRequest.kt FinalNewline:SmallTrnsPref.kt$com.ivy.wallet.domain.data.preference.SmallTrnsPref.kt FinalNewline:SmartTitleSuggestionsLogic.kt$com.ivy.wallet.domain.deprecated.logic.SmartTitleSuggestionsLogic.kt FinalNewline:SortOrder.kt$com.ivy.wallet.domain.data.SortOrder.kt @@ -1299,7 +1149,6 @@ FinalNewline:Title.kt$com.ivy.wallet.ui.edit.core.Title.kt FinalNewline:Transaction.kt$com.ivy.wallet.domain.data.core.Transaction.kt FinalNewline:TransactionCard.kt$com.ivy.wallet.ui.component.transaction.TransactionCard.kt - FinalNewline:TransactionDTO.kt$com.ivy.wallet.io.network.data.TransactionDTO.kt FinalNewline:TransactionDao.kt$com.ivy.wallet.io.persistence.dao.TransactionDao.kt FinalNewline:TransactionDateTime.kt$com.ivy.wallet.ui.edit.TransactionDateTime.kt FinalNewline:TransactionEntity.kt$com.ivy.wallet.io.persistence.data.TransactionEntity.kt @@ -1308,13 +1157,9 @@ FinalNewline:TransactionReminderLogic.kt$com.ivy.wallet.domain.deprecated.logic.notification.TransactionReminderLogic.kt FinalNewline:TransactionReminderWorker.kt$com.ivy.wallet.domain.deprecated.logic.notification.TransactionReminderWorker.kt FinalNewline:TransactionSectionDivider.kt$com.ivy.wallet.ui.component.transaction.TransactionSectionDivider.kt - FinalNewline:TransactionService.kt$com.ivy.wallet.io.network.service.TransactionService.kt - FinalNewline:TransactionSync.kt$com.ivy.wallet.domain.deprecated.sync.item.TransactionSync.kt FinalNewline:TransactionType.kt$com.ivy.wallet.domain.data.TransactionType.kt - FinalNewline:TransactionUploader.kt$com.ivy.wallet.domain.deprecated.sync.uploader.TransactionUploader.kt FinalNewline:TransactionViewModel.kt$com.ivy.wallet.ui.transaction.TransactionViewModel.kt FinalNewline:TransactionsDividerLine.kt$com.ivy.wallet.ui.component.transaction.TransactionsDividerLine.kt - FinalNewline:TransactionsResponse.kt$com.ivy.wallet.io.network.request.transaction.TransactionsResponse.kt FinalNewline:TrnByIdAct.kt$com.ivy.wallet.domain.action.transaction.TrnByIdAct.kt FinalNewline:TrnDate.kt$com.ivy.wallet.ui.transaction.data.TrnDate.kt FinalNewline:TrnDateDividers.kt$com.ivy.wallet.domain.pure.transaction.TrnDateDividers.kt @@ -1326,28 +1171,16 @@ FinalNewline:TrnsWithRangeAndAccFiltersAct.kt$com.ivy.wallet.domain.action.transaction.TrnsWithRangeAndAccFiltersAct.kt FinalNewline:TypographyExt.kt$com.ivy.design.l0_system.TypographyExt.kt FinalNewline:UIExt.kt$com.ivy.wallet.utils.UIExt.kt - FinalNewline:UUIDSerializer.kt$com.ivy.wallet.backup.kotlinxserilzation.UUIDSerializer.kt + FinalNewline:UUIDSerializer.kt$com.ivy.wallet.ktor.kotlinxserilzation.UUIDSerializer.kt FinalNewline:UiText.kt$com.ivy.wallet.utils.UiText.kt FinalNewline:UpcomingAct.kt$com.ivy.wallet.domain.action.viewmodel.home.UpcomingAct.kt FinalNewline:UpdateAccCacheAct.kt$com.ivy.wallet.domain.action.viewmodel.home.UpdateAccCacheAct.kt - FinalNewline:UpdateAccountRequest.kt$com.ivy.wallet.io.network.request.account.UpdateAccountRequest.kt FinalNewline:UpdateCategoriesCacheAct.kt$com.ivy.wallet.domain.action.viewmodel.home.UpdateCategoriesCacheAct.kt - FinalNewline:UpdateLoanRecordRequest.kt$com.ivy.wallet.io.network.request.loan.UpdateLoanRecordRequest.kt - FinalNewline:UpdateLoanRequest.kt$com.ivy.wallet.io.network.request.loan.UpdateLoanRequest.kt - FinalNewline:UpdatePlannedPaymentRuleRequest.kt$com.ivy.wallet.io.network.request.planned.UpdatePlannedPaymentRuleRequest.kt FinalNewline:UpdateSettingsAct.kt$com.ivy.wallet.domain.action.settings.UpdateSettingsAct.kt FinalNewline:UpdateStartDayOfMonthAct.kt$com.ivy.wallet.domain.action.global.UpdateStartDayOfMonthAct.kt - FinalNewline:UpdateTransactionRequest.kt$com.ivy.wallet.io.network.request.transaction.UpdateTransactionRequest.kt - FinalNewline:UpdateUserInfoRequest.kt$com.ivy.wallet.io.network.request.auth.UpdateUserInfoRequest.kt - FinalNewline:UpdateUserInfoResponse.kt$com.ivy.wallet.io.network.request.auth.UpdateUserInfoResponse.kt - FinalNewline:UpdateWalletCategoryRequest.kt$com.ivy.wallet.io.network.request.category.UpdateWalletCategoryRequest.kt - FinalNewline:UploadTrnToServerAct.kt$com.ivy.wallet.domain.action.viewmodel.transaction.UploadTrnToServerAct.kt FinalNewline:User.kt$com.ivy.wallet.domain.data.core.User.kt - FinalNewline:UserDTO.kt$com.ivy.wallet.io.network.data.UserDTO.kt FinalNewline:UserDao.kt$com.ivy.wallet.io.persistence.dao.UserDao.kt FinalNewline:UserEntity.kt$com.ivy.wallet.io.persistence.data.UserEntity.kt - FinalNewline:UserStats.kt$com.ivy.wallet.ui.analytics.model.UserStats.kt - FinalNewline:UserStatsTab.kt$com.ivy.wallet.ui.analytics.tab.UserStatsTab.kt FinalNewline:UtilExt.kt$com.ivy.wallet.utils.UtilExt.kt FinalNewline:Utils.kt$com.ivy.wallet.domain.pure.util.Utils.kt FinalNewline:Utils.kt$com.ivy.wallet.ui.component.transaction.Utils.kt @@ -1357,7 +1190,6 @@ FinalNewline:WalletBalanceWidgetActions.kt$com.ivy.wallet.ui.widget.WalletBalanceWidgetActions.kt FinalNewline:WalletBalanceWidgetContent.kt$com.ivy.wallet.ui.widget.WalletBalanceWidgetContent.kt FinalNewline:WalletByBudgetBakersSteps.kt$com.ivy.wallet.ui.csvimport.flow.instructions.WalletByBudgetBakersSteps.kt - FinalNewline:WalletCategoriesResponse.kt$com.ivy.wallet.io.network.request.category.WalletCategoriesResponse.kt FinalNewline:WalletCategoryLogic.kt$com.ivy.wallet.domain.deprecated.logic.WalletCategoryLogic.kt FinalNewline:WalletCharts.kt$com.ivy.wallet.domain.pure.charts.WalletCharts.kt FinalNewline:WalletDAOs.kt$com.ivy.wallet.domain.pure.data.WalletDAOs.kt @@ -1366,7 +1198,6 @@ FinalNewline:WidgetBase.kt$com.ivy.wallet.ui.widget.WidgetBase.kt FinalNewline:WrapContentRow.kt$com.ivy.wallet.ui.theme.components.WrapContentRow.kt FinalNewline:ZipUtils.kt$com.ivy.wallet.domain.deprecated.logic.zip.ZipUtils.kt - FinalNewline:dependencies.kt$com.ivy.wallet.buildsrc.dependencies.kt FinalNewline:ivy.lint.gradle.kts$.ivy.lint.gradle.kts FinalNewline:settings.gradle.kts$.settings.gradle.kts ForbiddenComment:AmountFormatting.kt$//TODO: Review, might cause trouble when integrating crypto @@ -1379,8 +1210,6 @@ ForbiddenComment:ItemStatisticViewModel.kt$ItemStatisticViewModel$//TODO: Rework Upcoming to FP ForbiddenComment:IvyLineChart.kt$//TODO: Fix ForbiddenComment:IvyLineChart.kt$//marginFromX //TODO: FIX - ForbiddenComment:OnboardingViewModel.kt$OnboardingViewModel$// TODO: Delete this legacy code - ForbiddenComment:RestClient.kt$RestClient.Companion$//TODO: SECURITY - Considering trusting only Ivy's cert ForbiddenComment:Transaction.kt$Transaction$//TODO: Remove default values & introduce Transaction#dummy() method ForbiddenComment:TransactionCard.kt$//TODO: Optimize this ForbiddenComment:TransactionViewModel.kt$TransactionViewModel$//TODO: Handle properly transfers exchange rate @@ -1421,10 +1250,6 @@ FunctionNaming:AmountModal.kt$@Composable fun CircleNumberButton( forCalculator: Boolean, value: String, onNumberPressed: (String) -> Unit, ) FunctionNaming:AmountModal.kt$@Composable fun KeypadCircleButton( text: String, textColor: Color = UI.colors.pureInverse, testTag: String, onClick: () -> Unit ) FunctionNaming:AmountModal.kt$@Preview @Composable private fun Preview() - FunctionNaming:AnalyticsReportScreen.kt$@Composable fun BoxWithConstraintsScope.AnalyticsReport(screen: AnalyticsReport) - FunctionNaming:AnalyticsReportScreen.kt$@Composable private fun ColumnScope.Content( selectedTab: AnalyticsTab, onboardingReport: OnboardingReport, kpis: KPIs, health: Health, userStats: UserStats, setSelectedTab: (AnalyticsTab) -> Unit, ) - FunctionNaming:AnalyticsReportScreen.kt$@Composable private fun UI( selectedTab: AnalyticsTab, startDate: LocalDateTime?, endDate: LocalDateTime?, onboardingReport: OnboardingReport?, kpis: KPIs?, health: Health?, userStats: UserStats?, loading: Boolean, onRefresh: () -> Unit = {}, onSetStartDate: (LocalDateTime?) -> Unit = {}, onSetEndDate: (LocalDateTime?) -> Unit = {}, onSelectTab: (AnalyticsTab) -> Unit = {}, onNukeTestEvents: () -> Unit = {}, ) - FunctionNaming:AnalyticsReportScreen.kt$@Preview @Composable private fun Preview() FunctionNaming:AppLockedScreen.kt$@Composable fun BoxWithConstraintsScope.AppLockedScreen( onShowOSBiometricsModal: () -> Unit, onContinueWithoutAuthentication: () -> Unit ) FunctionNaming:AppLockedScreen.kt$@Preview @Composable private fun Preview_Locked() FunctionNaming:BackBottomBar.kt$@Composable fun BoxWithConstraintsScope.BackBottomBar( bottomInset: Dp = navigationBarInset().toDensityDp(), onBack: () -> Unit, PrimaryAction: @Composable () -> Unit, ) @@ -1589,7 +1414,6 @@ FunctionNaming:CustomerJourneyLogic.kt$CustomerJourneyLogic.Companion$fun didYouKnow_expensesPieChart() FunctionNaming:CustomerJourneyLogic.kt$CustomerJourneyLogic.Companion$fun didYouKnow_pinAddTransactionWidgetCard() FunctionNaming:CustomerJourneyLogic.kt$CustomerJourneyLogic.Companion$fun rateUsCard_2() - FunctionNaming:DataCircle.kt$@Composable fun DataCircle( count: Int, metric: String, circleColor: Color, parentCount: Int?, avgCount: Double? = null ) FunctionNaming:DefaultImportSteps.kt$@Composable fun DefaultImportSteps( videoUrl: String? = null, articleUrl: String? = null, onUploadClick: () -> Unit ) FunctionNaming:DeleteButton.kt$@Composable fun DeleteButton( modifier: Modifier = Modifier, hasShadow: Boolean = true, onClick: () -> Unit, ) FunctionNaming:DeleteModal.kt$@Composable fun BoxWithConstraintsScope.DeleteModal( id: UUID = UUID.randomUUID(), title: String, description: String, visible: Boolean, buttonText: String = stringResource(R.string.delete), iconStart: Int = R.drawable.ic_delete, dismiss: () -> Unit, onDelete: () -> Unit, ) @@ -1691,8 +1515,6 @@ FunctionNaming:GitHubBackupStatus.kt$@Composable fun GitHubBackupStatus( viewModel: GitHubBackupViewModel, ) FunctionNaming:GradientCut.kt$@Composable fun BoxWithConstraintsScope.GradientCutBottom( height: Dp = 96.dp, alpha: Float = 1f, zIndex: Float? = null ) FunctionNaming:GradientCut.kt$@Composable fun BoxWithConstraintsScope.GradientCutTop( modifier: Modifier = Modifier, height: Dp, ) - FunctionNaming:HealthTab.kt$@Composable fun ColumnScope.HealthTab( onboardedUsers: Int, localAccountCount: Int?, health: Health ) - FunctionNaming:HealthTab.kt$@Preview @Composable private fun Preview() FunctionNaming:HistoryDateDivider.kt$@Composable fun HistoryDateDivider( date: LocalDate, spacerTop: Dp, baseCurrency: String, income: Double, expenses: Double ) FunctionNaming:HistoryDateDivider.kt$@Preview @Composable private fun Preview_OneYear_Ago() FunctionNaming:HistoryDateDivider.kt$@Preview @Composable private fun Preview_Today() @@ -1846,12 +1668,6 @@ FunctionNaming:IvyUI.kt$@Composable fun IvyUI( design: IvyDesign, Content: @Composable BoxWithConstraintsScope.() -> Unit ) FunctionNaming:IvyViewPager.kt$@Composable fun IvyPager( state: IvyPagerState, pageContent: @Composable BoxScope.(page: Int) -> Unit ) FunctionNaming:IvyWalletSteps.kt$@Composable fun IvyWalletSteps( onUploadClick: () -> Unit ) - FunctionNaming:KPIsTab.kt$@Composable @Preview private fun Preview() - FunctionNaming:KPIsTab.kt$@Composable fun ColumnScope.KPIsTab( kpis: KPIs, activeUsersCount: Int, onboardingCompletedEventCount: Int, onboardingStartedEventCount: Int, ) - FunctionNaming:KPIsTab.kt$@Composable private fun AccountCategoryTrnPlanned(kpis: KPIs) - FunctionNaming:KPIsTab.kt$@Composable private fun BuyPlanOptions(kpis: KPIs) - FunctionNaming:KPIsTab.kt$@Composable private fun ChoosePlanOptions(kpis: KPIs) - FunctionNaming:KPIsTab.kt$@Composable private fun Paywall( kpis: KPIs, onboardingCompletedEventCount: Int ) FunctionNaming:KTWMoneyMangerSteps.kt$@Composable fun KTWMoneyManagerSteps( onUploadClick: () -> Unit ) FunctionNaming:LoanBottomBar.kt$@Composable internal fun BoxWithConstraintsScope.LoanBottomBar( onClose: () -> Unit, onAdd: () -> Unit ) FunctionNaming:LoanBottomBar.kt$@Preview @Composable private fun PreviewBottomBar() @@ -1927,10 +1743,6 @@ FunctionNaming:OnboardingPrivacyTC.kt$@Preview @Composable private fun Preview() FunctionNaming:OnboardingProgressSlider.kt$@Composable fun OnboardingProgressSlider( modifier: Modifier = Modifier, selectedStep: Int, stepsCount: Int, selectedColor: Color ) FunctionNaming:OnboardingProgressSlider.kt$@Composable private fun Line( width: Dp, color: Color ) - FunctionNaming:OnboardingReportTab.kt$@Composable fun ColumnScope.OnboardingReportTab( report: OnboardingReport ) - FunctionNaming:OnboardingReportTab.kt$@Composable private fun LoginGoogleOrLocalAccount( report: OnboardingReport ) - FunctionNaming:OnboardingReportTab.kt$@Composable private fun PrivacyTCorSetName( report: OnboardingReport ) - FunctionNaming:OnboardingReportTab.kt$@Preview @Composable private fun Preview() FunctionNaming:OnboardingScreen.kt$@ExperimentalFoundationApi @Composable fun BoxWithConstraintsScope.OnboardingScreen(screen: Onboarding) FunctionNaming:OnboardingScreen.kt$@ExperimentalFoundationApi @Composable private fun BoxWithConstraintsScope.UI( onboardingState: OnboardingState, currency: IvyCurrency, opGoogleSignIn: OpResult<Unit>?, accountSuggestions: List<CreateAccountData>, accounts: List<AccountBalance>, categorySuggestions: List<CreateCategoryData>, categories: List<Category>, onLoginWithGoogle: () -> Unit = {}, onSkip: () -> Unit = {}, onStartImport: () -> Unit = {}, onStartFresh: () -> Unit = {}, onSetCurrency: (IvyCurrency) -> Unit = {}, onCreateAccount: (CreateAccountData) -> Unit = { }, onEditAccount: (Account, Double) -> Unit = { _, _ -> }, onAddAccountsDone: () -> Unit = {}, onAddAccountsSkip: () -> Unit = {}, onCreateCategory: (CreateCategoryData) -> Unit = {}, onEditCategory: (Category) -> Unit = {}, onAddCategoryDone: () -> Unit = {}, onAddCategorySkip: () -> Unit = {}, ) FunctionNaming:OnboardingScreen.kt$@ExperimentalFoundationApi @Preview @Composable private fun PreviewOnboarding() @@ -2106,8 +1918,6 @@ FunctionNaming:TransactionSectionDivider.kt$@Preview @Composable private fun Preview_Income_Expenses() FunctionNaming:Transactions.kt$@Composable private fun LazyItemScope.NoTransactionsEmptyState( emptyStateTitle: String, emptyStateText: String, ) FunctionNaming:TransactionsDividerLine.kt$@Composable fun TransactionsDividerLine( modifier: Modifier = Modifier, paddingHorizontal: Dp = 24.dp ) - FunctionNaming:UserStatsTab.kt$@Composable fun ColumnScope.UserStatsTab( onboardedUsersGoogle: Int, userStats: UserStats ) - FunctionNaming:UserStatsTab.kt$@Preview @Composable private fun Preview() FunctionNaming:ViewPager.kt$@Composable fun Pager( state: PagerState, modifier: Modifier = Modifier, pageContent: @Composable PagerScope.() -> Unit ) FunctionNaming:WalletBalanceWidgetContent.kt$@Composable fun BalanceSection( balance: String, currency: String ) FunctionNaming:WalletBalanceWidgetContent.kt$@Composable fun ButtonsSection() @@ -2117,18 +1927,8 @@ FunctionNaming:WalletByBudgetBakersSteps.kt$@Composable fun WalletByBudgetBakersSteps( onUploadClick: () -> Unit ) FunctionNaming:WalletCharts.kt$@Composable fun BalanceChart( balanceChart: List<SingleChartPoint>, period: ChartPeriod, baseCurrencyCode: String ) FunctionNaming:WalletCharts.kt$@Composable fun ChartInfoCard( baseCurrencyCode: String, backgroundColor: Color, chartPoint: SingleChartPoint, formatValueAsCount: Boolean = false, ) - FunctionNaming:WebViewScreen.kt$@SuppressLint("SetJavaScriptEnabled") @ExperimentalFoundationApi @Composable fun BoxWithConstraintsScope.WebViewScreen(screen: IvyWebView) - FunctionNaming:WebViewScreen.kt$@SuppressLint("SetJavaScriptEnabled") @ExperimentalFoundationApi @Composable private fun BoxWithConstraintsScope.UI(url: String) FunctionNaming:WrapContentRow.kt$@Composable fun <T> WrapContentRow( modifier: Modifier = Modifier, items: List<T>, verticalMarginBetweenRows: Dp = 8.dp, horizontalMarginBetweenItems: Dp = 8.dp, ItemContent: @Composable (item: T) -> Unit ) FunctionNaming:WrapContentRow.kt$@Preview @Composable private fun PreviewWrapContentRow() - FunctionNaming:dependencies.kt$fun DependencyHandler.AndroidX() - FunctionNaming:dependencies.kt$fun DependencyHandler.Hilt( hiltVersion: String, versionX: String ) - FunctionNaming:dependencies.kt$fun DependencyHandler.HiltTesting( version: String ) - FunctionNaming:dependencies.kt$fun DependencyHandler.Lifecycle( version: String = "2.6.1" ) - FunctionNaming:dependencies.kt$fun DependencyHandler.Networking( retrofitVersion: String = "2.9.0" ) - FunctionNaming:dependencies.kt$fun DependencyHandler.RoomDB( version: String = "2.6.0-alpha03" ) - FunctionNaming:dependencies.kt$fun DependencyHandler.ThirdParty() - FunctionOnlyReturningConstant:IvySession.kt$IvySession$fun isLoggedIn(): Boolean FunctionParameterNaming:AmountModal.kt$FirstRowExtra: (@Composable RowScope.() -> Unit)? = null FunctionParameterNaming:AmountModal.kt$FourthRowExtra: (@Composable RowScope.() -> Unit)? = null FunctionParameterNaming:AmountModal.kt$Header: (@Composable () -> Unit)? = null @@ -2162,8 +1962,6 @@ FunctionParameterNaming:WrapContentRow.kt$ItemContent: @Composable (item: T) -> Unit FunctionReturnTypeSpacing:ComposeExt.kt$fun Modifier.thenIf(condition: Boolean, thanModifier: @Composable Modifier.() -> Modifier) : Modifier FunctionReturnTypeSpacing:ReportViewModel.kt$ReportViewModel$private fun calculateBalance(incomeExpenseTransferPair: IncomeExpenseTransferPair) : BigDecimal - FunctionStartOfBodySpacing:ItemStatisticViewModel.kt$ItemStatisticViewModel$fun skipTransaction(screen: ItemStatistic, transaction: Transaction) - FunctionStartOfBodySpacing:ItemStatisticViewModel.kt$ItemStatisticViewModel$fun skipTransactions(screen: ItemStatistic, transactions: List<Transaction>) FunctionStartOfBodySpacing:PlannedPaymentsLogic.kt$PlannedPaymentsLogic$suspend fun payOrGet( transactions: List<Transaction>, syncTransaction: Boolean = true, skipTransaction: Boolean = false, onUpdateUI: suspend (paidTransactions: List<Transaction>) -> Unit ) FunctionStartOfBodySpacing:ReportViewModel.kt$ReportViewModel$private fun calculateBalance(incomeExpenseTransferPair: IncomeExpenseTransferPair) : BigDecimal ImportOrdering:Accessors32ikgp1isdd8mwexzgbe6rirl.kt$import org.gradle.api.Action import org.gradle.api.Incubating import org.gradle.api.NamedDomainObjectProvider import org.gradle.api.Project import org.gradle.api.Task import org.gradle.api.artifacts.Configuration import org.gradle.api.artifacts.ConfigurablePublishArtifact import org.gradle.api.artifacts.ConfigurationContainer import org.gradle.api.artifacts.Dependency import org.gradle.api.artifacts.DependencyConstraint import org.gradle.api.artifacts.ExternalModuleDependency import org.gradle.api.artifacts.ModuleDependency import org.gradle.api.artifacts.PublishArtifact import org.gradle.api.artifacts.dsl.ArtifactHandler import org.gradle.api.artifacts.dsl.DependencyConstraintHandler import org.gradle.api.artifacts.dsl.DependencyHandler import org.gradle.api.provider.Provider import org.gradle.api.provider.ProviderConvertible import org.gradle.api.tasks.TaskContainer import org.gradle.api.tasks.TaskProvider import org.gradle.kotlin.dsl.* import org.gradle.kotlin.dsl.accessors.runtime.* @@ -2182,7 +1980,6 @@ ImportOrdering:DetektConfigurationAccessors.kt$import org.gradle.api.Action import org.gradle.api.Incubating import org.gradle.api.NamedDomainObjectProvider import org.gradle.api.Project import org.gradle.api.Task import org.gradle.api.artifacts.Configuration import org.gradle.api.artifacts.ConfigurablePublishArtifact import org.gradle.api.artifacts.ConfigurationContainer import org.gradle.api.artifacts.Dependency import org.gradle.api.artifacts.DependencyConstraint import org.gradle.api.artifacts.ExternalModuleDependency import org.gradle.api.artifacts.ModuleDependency import org.gradle.api.artifacts.PublishArtifact import org.gradle.api.artifacts.dsl.ArtifactHandler import org.gradle.api.artifacts.dsl.DependencyConstraintHandler import org.gradle.api.artifacts.dsl.DependencyHandler import org.gradle.api.provider.Provider import org.gradle.api.provider.ProviderConvertible import org.gradle.api.tasks.TaskContainer import org.gradle.api.tasks.TaskProvider import org.gradle.kotlin.dsl.* import org.gradle.kotlin.dsl.accessors.runtime.* ImportOrdering:DetektPluginsConfigurationAccessors.kt$import org.gradle.api.Action import org.gradle.api.Incubating import org.gradle.api.NamedDomainObjectProvider import org.gradle.api.Project import org.gradle.api.Task import org.gradle.api.artifacts.Configuration import org.gradle.api.artifacts.ConfigurablePublishArtifact import org.gradle.api.artifacts.ConfigurationContainer import org.gradle.api.artifacts.Dependency import org.gradle.api.artifacts.DependencyConstraint import org.gradle.api.artifacts.ExternalModuleDependency import org.gradle.api.artifacts.ModuleDependency import org.gradle.api.artifacts.PublishArtifact import org.gradle.api.artifacts.dsl.ArtifactHandler import org.gradle.api.artifacts.dsl.DependencyConstraintHandler import org.gradle.api.artifacts.dsl.DependencyHandler import org.gradle.api.provider.Provider import org.gradle.api.provider.ProviderConvertible import org.gradle.api.tasks.TaskContainer import org.gradle.api.tasks.TaskProvider import org.gradle.kotlin.dsl.* import org.gradle.kotlin.dsl.accessors.runtime.* ImportOrdering:DueTrnsInfoAct.kt$import com.ivy.frp.action.FPAction import com.ivy.frp.lambda import com.ivy.frp.then import com.ivy.wallet.domain.action.account.AccountByIdAct import com.ivy.wallet.domain.action.exchange.ExchangeAct import com.ivy.wallet.domain.action.exchange.actInput import com.ivy.wallet.domain.action.transaction.DueTrnsAct import com.ivy.wallet.domain.data.core.Transaction import com.ivy.wallet.domain.pure.data.ClosedTimeRange import com.ivy.wallet.domain.pure.data.IncomeExpensePair import com.ivy.wallet.domain.pure.exchange.ExchangeTrnArgument import com.ivy.wallet.domain.pure.exchange.exchangeInBaseCurrency import com.ivy.wallet.domain.pure.transaction.expenses import com.ivy.wallet.domain.pure.transaction.incomes import com.ivy.wallet.domain.pure.transaction.sumTrns import com.ivy.wallet.utils.dateNowUTC import java.time.LocalDate import javax.inject.Inject - Indentation:AccountSync.kt$AccountSync$ Indentation:AmountFormatting.kt$ Indentation:AmountModal.kt$ Indentation:BufferBattery.kt$ @@ -2190,7 +1987,6 @@ Indentation:CSVViewModel.kt$CSVViewModel$ Indentation:CategoriesScreen.kt$ Indentation:CategoriesViewModel.kt$CategoriesViewModel$ - Indentation:CategorySync.kt$CategorySync$ Indentation:ChoosePeriodModal.kt$ Indentation:ComposeExt.kt$ Indentation:CurrencyPicker.kt$ @@ -2204,18 +2000,13 @@ Indentation:InputField.kt$ Indentation:Insets.kt$ Indentation:ItemStatisticViewModel.kt$ItemStatisticViewModel$ - Indentation:IvySync.kt$IvySync$ - Indentation:KPIsTab.kt$ Indentation:LastNTimeRange.kt$LastNTimeRange$ Indentation:LoanRecordModal.kt$ - Indentation:LoanRecordSync.kt$LoanRecordSync$ - Indentation:LoanSync.kt$LoanSync$ Indentation:LoanTransactionsCore.kt$LoanTransactionsCore$ Indentation:MainBottomBar.kt$ Indentation:OnboardingSplashLogin.kt$ Indentation:ParseFields.kt$ Indentation:PieChartAct.kt$PieChartAct$ - Indentation:PlannedPaymentSync.kt$PlannedPaymentSync$ Indentation:PlannedPaymentsLogic.kt$PlannedPaymentsLogic$ Indentation:PlansSheet.kt$ Indentation:PrimaryAttributeColumn.kt$ @@ -2227,21 +2018,15 @@ Indentation:ServerStopScreen.kt$ Indentation:SettingsScreen.kt$ Indentation:TransactionReminderWorker.kt$TransactionReminderWorker$ - Indentation:TransactionSync.kt$TransactionSync$ Indentation:UtilExt.kt$ Indentation:ViewPager.kt$PagerState$ Indentation:WalletAccountLogic.kt$WalletAccountLogic$ - InstanceOfCheckForException:RestClient.kt$RestClient.Companion$exception is NetworkError - LargeClass:AppModuleDI.kt$AppModuleDI LongMethod:AccountModal.kt$@Composable fun BoxWithConstraintsScope.AccountModal( modal: AccountModalData?, onCreateAccount: (CreateAccountData) -> Unit, onEditAccount: (Account, balance: Double) -> Unit, dismiss: () -> Unit, ) LongMethod:AccountsTab.kt$@Composable private fun AccountHeader( accountData: AccountData, currency: String, baseCurrency: String, contrastColor: Color, onBalanceClick: () -> Unit ) LongMethod:AccountsTab.kt$@Composable private fun BoxWithConstraintsScope.UI( state: AccountState = AccountState(), onEventHandler: (AccountsEvent) -> Unit = {} ) LongMethod:AddRateModal.kt$@Composable fun BoxWithConstraintsScope.AddRateModal( visible: Boolean, baseCurrency: String, dismiss: () -> Unit, onAdd: (RatesEvent.AddRate) -> Unit, ) LongMethod:AmountModal.kt$@Composable fun AmountKeyboard( forCalculator: Boolean, ZeroRow: (@Composable RowScope.() -> Unit)? = null, FirstRowExtra: (@Composable RowScope.() -> Unit)? = null, SecondRowExtra: (@Composable RowScope.() -> Unit)? = null, ThirdRowExtra: (@Composable RowScope.() -> Unit)? = null, FourthRowExtra: (@Composable RowScope.() -> Unit)? = null, onNumberPressed: (String) -> Unit, onDecimalPoint: () -> Unit, onBackspace: () -> Unit, ) LongMethod:AmountModal.kt$@Composable fun BoxWithConstraintsScope.AmountModal( id: UUID, visible: Boolean, currency: String, initialAmount: Double?, decimalCountMax: Int = 2, Header: (@Composable () -> Unit)? = null, amountSpacerTop: Dp = 64.dp, dismiss: () -> Unit, onAmountChanged: (Double) -> Unit, ) - LongMethod:AnalyticsReportScreen.kt$@Composable private fun ColumnScope.Content( selectedTab: AnalyticsTab, onboardingReport: OnboardingReport, kpis: KPIs, health: Health, userStats: UserStats, setSelectedTab: (AnalyticsTab) -> Unit, ) - LongMethod:AnalyticsReportScreen.kt$@Composable private fun UI( selectedTab: AnalyticsTab, startDate: LocalDateTime?, endDate: LocalDateTime?, onboardingReport: OnboardingReport?, kpis: KPIs?, health: Health?, userStats: UserStats?, loading: Boolean, onRefresh: () -> Unit = {}, onSetStartDate: (LocalDateTime?) -> Unit = {}, onSetEndDate: (LocalDateTime?) -> Unit = {}, onSelectTab: (AnalyticsTab) -> Unit = {}, onNukeTestEvents: () -> Unit = {}, ) - LongMethod:AnalyticsReportViewModel.kt$AnalyticsReportViewModel$fun start( startDate: LocalDateTime? = this.startDate.value, endDate: LocalDateTime? = this.endDate.value, ) LongMethod:AppLockedScreen.kt$@Composable fun BoxWithConstraintsScope.AppLockedScreen( onShowOSBiometricsModal: () -> Unit, onContinueWithoutAuthentication: () -> Unit ) LongMethod:BalanceRow.kt$@Composable fun BalanceRow( modifier: Modifier = Modifier, currency: String, balance: Double, hiddenMode: Boolean = false, textColor: Color = UI.colors.pureInverse, decimalPaddingTop: Dp = 12.dp, spacerCurrency: Dp = 12.dp, spacerDecimal: Dp = 8.dp, currencyFontSize: TextUnit? = null, integerFontSize: TextUnit? = null, decimalFontSize: TextUnit? = null, currencyUpfront: Boolean = true, balanceAmountPrefix: String? = null, shortenBigNumbers: Boolean = false, ) LongMethod:BudgetBattery.kt$@Composable fun BudgetBattery( modifier: Modifier = Modifier, currency: String, expenses: Double, budget: Double, backgroundNotFilled: Color = UI.colors.pure, onClick: (() -> Unit)? = null, ) @@ -2303,7 +2088,6 @@ LongMethod:IvyModal.kt$@Composable fun BoxScope.IvyModal( id: UUID?, visible: Boolean, dismiss: () -> Unit, SecondaryActions: (@Composable () -> Unit)? = null, PrimaryAction: @Composable () -> Unit, scrollState: ScrollState? = rememberScrollState(), shiftIfKeyboardShown: Boolean = true, includeActionsRowPadding: Boolean = true, Content: @Composable ColumnScope.() -> Unit ) LongMethod:IvyViewPager.kt$@Composable fun IvyPager( state: IvyPagerState, pageContent: @Composable BoxScope.(page: Int) -> Unit ) LongMethod:IvyWalletDesign.kt$IvyWalletDesign$override fun typography(): IvyTypography - LongMethod:KPIsTab.kt$@Composable fun ColumnScope.KPIsTab( kpis: KPIs, activeUsersCount: Int, onboardingCompletedEventCount: Int, onboardingStartedEventCount: Int, ) LongMethod:LoanDetailsScreen.kt$@Composable private fun BoxWithConstraintsScope.UI( baseCurrency: String, loan: Loan?, displayLoanRecords: List<DisplayLoanRecord> = emptyList(), amountPaid: Double, loanAmountPaid: Double = 0.0, accounts: List<Account> = emptyList(), selectedLoanAccount: Account? = null, createLoanTransaction: Boolean = false, onCreateAccount: (CreateAccountData) -> Unit = {}, onEditLoan: (Loan, Boolean) -> Unit = { _, _ -> }, onCreateLoanRecord: (CreateLoanRecordData) -> Unit = {}, onEditLoanRecord: (EditLoanRecordData) -> Unit = {}, onDeleteLoanRecord: (LoanRecord) -> Unit = {}, onDeleteLoan: () -> Unit = {}, ) LongMethod:LoanDetailsScreen.kt$@Composable private fun LoanInfoCard( loan: Loan, baseCurrency: String, amountPaid: Double, loanAmountPaid: Double = 0.0, selectedLoanAccount: Account? = null, onAddRecord: () -> Unit ) LongMethod:LoanDetailsScreen.kt$@Composable private fun LoanRecordItem( loan: Loan, loanRecord: LoanRecord, baseCurrency: String, loanBaseCurrency: String = "", account: Account? = null, onClick: () -> Unit ) @@ -2350,22 +2134,16 @@ LongMethod:ViewPager.kt$@Composable fun Pager( state: PagerState, modifier: Modifier = Modifier, pageContent: @Composable PagerScope.() -> Unit ) LongMethod:WalletBalanceWidgetContent.kt$@Composable fun IncomeExpenseSection( income: String, expense: String, currency: String ) LongParameterList:AccountModal.kt$( account: Account?, nameTextFieldValue: TextFieldValue, currency: String, color: Color, icon: String?, amount: Double, includeInBalance: Boolean, onCreateAccount: (CreateAccountData) -> Unit, onEditAccount: (Account, balance: Double) -> Unit, dismiss: () -> Unit ) - LongParameterList:AccountsViewModel.kt$AccountsViewModel$( private val walletDAOs: WalletDAOs, private val accountDao: AccountDao, private val settingsDao: SettingsDao, private val accountSync: AccountSync, private val accountCreator: AccountCreator, private val ivyContext: IvyWalletCtx, private val sharedPrefs: SharedPrefs, private val accountsAct: AccountsAct, private val calcWalletBalanceAct: CalcWalletBalanceAct, private val baseCurrencyAct: BaseCurrencyAct, private val accountDataAct: AccountDataAct ) + LongParameterList:AccountsViewModel.kt$AccountsViewModel$( private val walletDAOs: WalletDAOs, private val accountDao: AccountDao, private val settingsDao: SettingsDao, private val accountCreator: AccountCreator, private val ivyContext: IvyWalletCtx, private val sharedPrefs: SharedPrefs, private val accountsAct: AccountsAct, private val calcWalletBalanceAct: CalcWalletBalanceAct, private val baseCurrencyAct: BaseCurrencyAct, private val accountDataAct: AccountDataAct ) LongParameterList:AmountModal.kt$( forCalculator: Boolean, ZeroRow: (@Composable RowScope.() -> Unit)? = null, FirstRowExtra: (@Composable RowScope.() -> Unit)? = null, SecondRowExtra: (@Composable RowScope.() -> Unit)? = null, ThirdRowExtra: (@Composable RowScope.() -> Unit)? = null, FourthRowExtra: (@Composable RowScope.() -> Unit)? = null, onNumberPressed: (String) -> Unit, onDecimalPoint: () -> Unit, onBackspace: () -> Unit, ) LongParameterList:AmountModal.kt$( id: UUID, visible: Boolean, currency: String, initialAmount: Double?, decimalCountMax: Int = 2, Header: (@Composable () -> Unit)? = null, amountSpacerTop: Dp = 64.dp, dismiss: () -> Unit, onAmountChanged: (Double) -> Unit, ) - LongParameterList:AnalyticsReportScreen.kt$( selectedTab: AnalyticsTab, onboardingReport: OnboardingReport, kpis: KPIs, health: Health, userStats: UserStats, setSelectedTab: (AnalyticsTab) -> Unit, ) - LongParameterList:AnalyticsReportScreen.kt$( selectedTab: AnalyticsTab, startDate: LocalDateTime?, endDate: LocalDateTime?, onboardingReport: OnboardingReport?, kpis: KPIs?, health: Health?, userStats: UserStats?, loading: Boolean, onRefresh: () -> Unit = {}, onSetStartDate: (LocalDateTime?) -> Unit = {}, onSetEndDate: (LocalDateTime?) -> Unit = {}, onSelectTab: (AnalyticsTab) -> Unit = {}, onNukeTestEvents: () -> Unit = {}, ) - LongParameterList:AppModuleDI.kt$AppModuleDI$( accountSync: AccountSync, categorySync: CategorySync, transactionSync: TransactionSync, plannedPaymentSync: PlannedPaymentSync, budgetSync: BudgetSync, loanSync: LoanSync, loanRecordSync: LoanRecordSync, ivySession: IvySession ) - LongParameterList:AppModuleDI.kt$AppModuleDI$( categoryDao: CategoryDao, transactionUploader: TransactionUploader, transactionDao: TransactionDao, ivyContext: IvyWalletCtx, loanDao: LoanDao, loanRecordDao: LoanRecordDao, exchangeRatesLogic: ExchangeRatesLogic, settingsDao: SettingsDao, accountDao: AccountDao ) - LongParameterList:AppModuleDI.kt$AppModuleDI$( ivyBilling: IvyBilling, ivyContext: IvyWalletCtx, navigation: Navigation, accountDao: AccountDao, categoryDao: CategoryDao, budgetDao: BudgetDao, loanDao: LoanDao ) - LongParameterList:AppModuleDI.kt$AppModuleDI$( plannedPaymentRuleDao: PlannedPaymentRuleDao, transactionDao: TransactionDao, transactionUploader: TransactionUploader, exchangeRatesLogic: ExchangeRatesLogic, accountDao: AccountDao, settingsDao: SettingsDao, plannedPaymentRuleUploader: PlannedPaymentRuleUploader ) LongParameterList:BackupLogic.kt$BackupLogic$( private val accountDao: AccountDao, private val budgetDao: BudgetDao, private val categoryDao: CategoryDao, private val loanRecordDao: LoanRecordDao, private val loanDao: LoanDao, private val plannedPaymentRuleDao: PlannedPaymentRuleDao, private val settingsDao: SettingsDao, private val transactionDao: TransactionDao, private val sharedPrefs: SharedPrefs, @ApplicationContext private val context: Context, ) LongParameterList:BalanceRow.kt$( modifier: Modifier = Modifier, currency: String, balance: Double, hiddenMode: Boolean = false, textColor: Color = UI.colors.pureInverse, decimalPaddingTop: Dp = 12.dp, spacerCurrency: Dp = 12.dp, spacerDecimal: Dp = 8.dp, currencyFontSize: TextUnit? = null, integerFontSize: TextUnit? = null, decimalFontSize: TextUnit? = null, currencyUpfront: Boolean = true, balanceAmountPrefix: String? = null, shortenBigNumbers: Boolean = false, ) LongParameterList:BalanceRow.kt$( modifier: Modifier = Modifier, textColor: Color = UI.colors.pureInverse, currency: String, balance: Double, balanceAmountPrefix: String? = null, currencyUpfront: Boolean = true, shortenBigNumbers: Boolean = false, hiddenMode: Boolean = false, ) LongParameterList:BalanceScreen.kt$( period: TimePeriod, baseCurrencyCode: String, currentBalance: Double, plannedPaymentsAmount: Double, balanceAfterPlannedPayments: Double, onSetPeriod: (TimePeriod) -> Unit = {}, onPreviousMonth: () -> Unit = {}, onNextMonth: () -> Unit = {} ) LongParameterList:BudgetBattery.kt$( modifier: Modifier = Modifier, currency: String, expenses: Double, budget: Double, backgroundNotFilled: Color = UI.colors.pure, onClick: (() -> Unit)? = null, ) LongParameterList:BudgetScreen.kt$( timeRange: FromToTimeRange?, baseCurrency: String, categories: List<Category>, accounts: List<Account>, displayBudgets: List<DisplayBudget>, appBudgetMax: Double, categoryBudgetsTotal: Double, onCreateBudget: (CreateBudgetData) -> Unit = {}, onEditBudget: (Budget) -> Unit = {}, onDeleteBudget: (Budget) -> Unit = {}, onReorder: (List<DisplayBudget>) -> Unit = {} ) - LongParameterList:BudgetViewModel.kt$BudgetViewModel$( private val sharedPrefs: SharedPrefs, private val settingsDao: SettingsDao, private val budgetDao: BudgetDao, private val categoryDao: CategoryDao, private val accountDao: AccountDao, private val budgetCreator: BudgetCreator, private val budgetSync: BudgetSync, private val ivyContext: IvyWalletCtx, private val accountsAct: AccountsAct, private val categoriesAct: CategoriesAct, private val budgetsAct: BudgetsAct, private val baseCurrencyAct: BaseCurrencyAct, private val historyTrnsAct: HistoryTrnsAct, private val exchangeAct: ExchangeAct ) + LongParameterList:BudgetViewModel.kt$BudgetViewModel$( private val sharedPrefs: SharedPrefs, private val budgetDao: BudgetDao, private val budgetCreator: BudgetCreator, private val ivyContext: IvyWalletCtx, private val accountsAct: AccountsAct, private val categoriesAct: CategoriesAct, private val budgetsAct: BudgetsAct, private val baseCurrencyAct: BaseCurrencyAct, private val historyTrnsAct: HistoryTrnsAct, private val exchangeAct: ExchangeAct ) LongParameterList:BufferBattery.kt$( modifier: Modifier = Modifier, buffer: Double, balance: Double, currency: String, backgroundNotFilled: Color = UI.colors.pure, onClick: (() -> Unit)? = null, ) LongParameterList:ButtonWithIcon.kt$( modifier: Modifier = Modifier, text: String, mode: Mode = Mode.WRAP_CONTENT, background: Background = Background.Solid( color = UI.colors.primary, shape = UI.shapes.rFull, padding = padding( horizontal = 24.dp, vertical = 12.dp ) ), textStyle: TextStyle = UI.typo.b1.style( color = White, textAlign = TextAlign.Center ), @DrawableRes iconLeft: Int? = null, @DrawableRes iconRight: Int? = null, iconTint: Color = White, iconPadding: Dp = 12.dp, onClick: () -> Unit ) LongParameterList:CSVImporter.kt$CSVImporter$( baseCurrency: String, accountNameString: String?, color: Int?, icon: String?, orderNum: Double?, currencyRawString: String?, ) @@ -2374,7 +2152,7 @@ LongParameterList:CategoriesScreen.kt$( modifier: Modifier = Modifier, textColor: Color = UI.colors.pureInverse, dividerColor: Color = UI.colors.medium, monthlyIncome: Double, monthlyExpenses: Double, currency: String, center: Boolean = true, dividerSpacer: Dp? = null, ) LongParameterList:CategoriesScreen.kt$( text: String, @DrawableRes icon: Int, selected: Boolean, selectedGradient: Gradient = GradientGreen, textSelectedColor: Color = White, onClick: () -> Unit ) LongParameterList:CategoriesScreen.kt$( title: String = stringResource(R.string.sort_by), items: List<SortOrder>, visible: Boolean, initialType: SortOrder, id: UUID = UUID.randomUUID(), dismiss: () -> Unit, onSortOrderChanged: (SortOrder) -> Unit ) - LongParameterList:CategoriesViewModel.kt$CategoriesViewModel$( private val categoryDao: CategoryDao, private val categorySync: CategorySync, private val categoryCreator: CategoryCreator, private val categoriesAct: CategoriesAct, private val ivyContext: IvyWalletCtx, private val sharedPrefs: SharedPrefs, private val baseCurrencyAct: BaseCurrencyAct, private val accountsAct: AccountsAct, private val trnsWithRangeAndAccFiltersAct: TrnsWithRangeAndAccFiltersAct, private val categoryIncomeWithAccountFiltersAct: CategoryIncomeWithAccountFiltersAct ) + LongParameterList:CategoriesViewModel.kt$CategoriesViewModel$( private val categoryDao: CategoryDao, private val categoryCreator: CategoryCreator, private val categoriesAct: CategoriesAct, private val ivyContext: IvyWalletCtx, private val sharedPrefs: SharedPrefs, private val baseCurrencyAct: BaseCurrencyAct, private val accountsAct: AccountsAct, private val trnsWithRangeAndAccFiltersAct: TrnsWithRangeAndAccFiltersAct, private val categoryIncomeWithAccountFiltersAct: CategoryIncomeWithAccountFiltersAct ) LongParameterList:CategoryCharts.kt$( period: ChartPeriod, baseCurrencyCode: String, categories: List<Category>, categoryExpenseValues: List<CategoryValues> = emptyList(), categoryExpenseCount: List<CategoryValues> = emptyList(), categoryIncomeValues: List<CategoryValues> = emptyList(), categoryIncomeCount: List<CategoryValues> = emptyList(), onLoadCategory: (Category) -> Unit, onRemoveCategory: (Category) -> Unit ) LongParameterList:CategoryCharts.kt$( period: ChartPeriod, title: String, titleColor: Color = UI.colors.pureInverse, baseCurrencyCode: String, categoryValues: List<CategoryValues>, countChart: Boolean, ) LongParameterList:CategoryModal.kt$( hint: String, @DrawableRes defaultIcon: Int, color: Color, icon: String?, autoFocusKeyboard: Boolean, nameTextFieldValue: TextFieldValue, setNameTextFieldValue: (TextFieldValue) -> Unit, showChooseIconModal: () -> Unit ) @@ -2400,9 +2178,9 @@ LongParameterList:EditBottomSheet.kt$( percentExpanded: Float, label: String, type: TransactionType, accounts: List<Account>, selectedAccount: Account?, toAccount: Account?, onSelectedAccountChanged: (Account) -> Unit, onToAccountChanged: (Account) -> Unit, onAddNewAccount: () -> Unit, ) LongParameterList:EditBottomSheet.kt$( type: TransactionType, amount: Double, currency: String, percentExpanded: Float, label: String, account: Account?, showConvertedAmountText: String? = null, onShowAmountModal: () -> Unit, onAccountMiniClick: () -> Unit, ) LongParameterList:EditPlannedScreen.kt$( screen: EditPlanned, startDate: LocalDateTime?, intervalN: Int?, intervalType: IntervalType?, oneTime: Boolean, type: TransactionType, currency: String, initialTitle: String?, description: String?, category: Category?, account: Account?, amount: Double, categories: List<Category>, accounts: List<Account>, onRuleChanged: (LocalDateTime, oneTime: Boolean, Int?, IntervalType?) -> Unit, onTitleChanged: (String?) -> Unit, onDescriptionChanged: (String?) -> Unit, onAmountChanged: (Double) -> Unit, onCategoryChanged: (Category?) -> Unit, onAccountChanged: (Account) -> Unit, onSetTransactionType: (TransactionType) -> Unit, onCreateCategory: (CreateCategoryData) -> Unit = {}, onSave: () -> Unit, onDelete: () -> Unit, onCreateAccount: (CreateAccountData) -> Unit = {}, ) - LongParameterList:EditPlannedViewModel.kt$EditPlannedViewModel$( private val transactionDao: TransactionDao, private val accountDao: AccountDao, private val categoryDao: CategoryDao, private val settingsDao: SettingsDao, private val ivyContext: IvyWalletCtx, private val nav: Navigation, private val transactionSync: TransactionSync, private val plannedPaymentRuleDao: PlannedPaymentRuleDao, private val plannedPaymentRuleUploader: PlannedPaymentRuleUploader, private val plannedPaymentsGenerator: PlannedPaymentsGenerator, private val categoryCreator: CategoryCreator, private val accountCreator: AccountCreator, private val accountsAct: AccountsAct, private val categoriesAct: CategoriesAct ) + LongParameterList:EditPlannedViewModel.kt$EditPlannedViewModel$( private val transactionDao: TransactionDao, private val accountDao: AccountDao, private val categoryDao: CategoryDao, private val settingsDao: SettingsDao, private val nav: Navigation, private val plannedPaymentRuleDao: PlannedPaymentRuleDao, private val plannedPaymentsGenerator: PlannedPaymentsGenerator, private val categoryCreator: CategoryCreator, private val accountCreator: AccountCreator, private val accountsAct: AccountsAct, private val categoriesAct: CategoriesAct ) LongParameterList:EditTransactionScreen.kt$( screen: EditTransaction, transactionType: TransactionType, baseCurrency: String, initialTitle: String?, titleSuggestions: Set<String>, description: String?, category: Category?, dateTime: LocalDateTime?, account: Account?, toAccount: Account?, dueDate: LocalDateTime?, amount: Double, loanData: EditTransactionDisplayLoan = EditTransactionDisplayLoan(), backgroundProcessing: Boolean = false, customExchangeRateState: CustomExchangeRateState, categories: List<Category>, accounts: List<Account>, hasChanges: Boolean = false, onTitleChanged: (String?) -> Unit, onDescriptionChanged: (String?) -> Unit, onAmountChanged: (Double) -> Unit, onCategoryChanged: (Category?) -> Unit, onAccountChanged: (Account) -> Unit, onToAccountChanged: (Account) -> Unit, onDueDateChanged: (LocalDateTime?) -> Unit, onSetDateTime: (LocalDateTime) -> Unit, onSetTransactionType: (TransactionType) -> Unit, onCreateCategory: (CreateCategoryData) -> Unit, onEditCategory: (Category) -> Unit, onPayPlannedPayment: () -> Unit, onSave: (closeScreen: Boolean) -> Unit, onSetHasChanges: (hasChanges: Boolean) -> Unit, onDelete: () -> Unit, onCreateAccount: (CreateAccountData) -> Unit, onExchangeRateChanged: (Double?) -> Unit = { } ) - LongParameterList:EditTransactionViewModel.kt$EditTransactionViewModel$( private val loanDao: LoanDao, private val transactionDao: TransactionDao, private val accountDao: AccountDao, private val categoryDao: CategoryDao, private val settingsDao: SettingsDao, private val ivyContext: IvyWalletCtx, private val nav: Navigation, private val transactionUploader: TransactionUploader, private val sharedPrefs: SharedPrefs, private val exchangeRatesLogic: ExchangeRatesLogic, private val categoryCreator: CategoryCreator, private val accountCreator: AccountCreator, private val paywallLogic: PaywallLogic, private val plannedPaymentsLogic: PlannedPaymentsLogic, private val smartTitleSuggestionsLogic: SmartTitleSuggestionsLogic, private val loanTransactionsLogic: LoanTransactionsLogic, private val accountsAct: AccountsAct, private val categoriesAct: CategoriesAct, private val trnByIdAct: TrnByIdAct, private val categoryByIdAct: CategoryByIdAct, private val accountByIdAct: AccountByIdAct ) + LongParameterList:EditTransactionViewModel.kt$EditTransactionViewModel$( private val loanDao: LoanDao, private val transactionDao: TransactionDao, private val settingsDao: SettingsDao, private val nav: Navigation, private val sharedPrefs: SharedPrefs, private val exchangeRatesLogic: ExchangeRatesLogic, private val categoryCreator: CategoryCreator, private val accountCreator: AccountCreator, private val paywallLogic: PaywallLogic, private val plannedPaymentsLogic: PlannedPaymentsLogic, private val smartTitleSuggestionsLogic: SmartTitleSuggestionsLogic, private val loanTransactionsLogic: LoanTransactionsLogic, private val accountsAct: AccountsAct, private val categoriesAct: CategoriesAct, private val trnByIdAct: TrnByIdAct, private val categoryByIdAct: CategoryByIdAct, private val accountByIdAct: AccountByIdAct ) LongParameterList:FilterOverlay.kt$( visible: Boolean, baseCurrency: String, accounts: List<Account>, categories: List<Category>, filter: ReportFilter?, onClose: () -> Unit, onSetFilter: (ReportFilter?) -> Unit ) LongParameterList:HomeHeader.kt$( @DrawableRes icon: Int, backgroundGradient: Gradient, percentVisible: Float, textColor: Color, label: String, currency: String, amount: Double, testTag: String, onClick: () -> Unit ) LongParameterList:HomeHeader.kt$( expanded: Boolean, name: String, period: TimePeriod, currency: String, balance: Double, bufferDiff: Double, hideCurrentBalance: Boolean = false, onShowMonthModal: () -> Unit, onBalanceClick: () -> Unit, onHiddenBalanceClick: () -> Unit = {}, onSelectNextMonth: () -> Unit, onSelectPreviousMonth: () -> Unit, ) @@ -2423,7 +2201,7 @@ LongParameterList:ItemStatisticScreen.kt$( itemColor: Color, contrastColor: Color, account: Account?, category: Category?, showCategoryModal: () -> Unit, showAccountModal: () -> Unit, ) LongParameterList:ItemStatisticScreen.kt$( period: TimePeriod, baseCurrency: String, currency: String, account: Account?, category: Category?, categories: List<Category>, accounts: List<Account>, balance: Double, balanceBaseCurrency: Double?, income: Double, expenses: Double, initWithTransactions: Boolean = false, treatTransfersAsIncomeExpense: Boolean = false, history: List<TransactionHistoryItem>, upcomingExpanded: Boolean = true, setUpcomingExpanded: (Boolean) -> Unit = {}, upcomingIncome: Double = 0.0, upcomingExpenses: Double = 0.0, upcoming: List<Transaction> = emptyList(), overdueExpanded: Boolean = true, setOverdueExpanded: (Boolean) -> Unit = {}, overdueIncome: Double = 0.0, overdueExpenses: Double = 0.0, overdue: List<Transaction> = emptyList(), onPreviousMonth: () -> Unit, onNextMonth: () -> Unit, onSetPeriod: (TimePeriod) -> Unit, onEditAccount: (Account, Double) -> Unit, onEditCategory: (Category) -> Unit, onDelete: () -> Unit, onPayOrGet: (Transaction) -> Unit = {}, onSkipTransaction: (Transaction) -> Unit = {}, onSkipAllTransactions: (List<Transaction>) -> Unit = {} ) LongParameterList:ItemStatisticScreen.kt$( title: String, currencyCode: String, amount: Double, transactionCount: Int, isIncome: Boolean, addButtonText: String?, itemColor: Color, onHeaderCardClicked: () -> Unit = {}, onAddClick: () -> Unit ) - LongParameterList:ItemStatisticViewModel.kt$ItemStatisticViewModel$( private val walletDAOs: WalletDAOs, private val accountDao: AccountDao, private val exchangeRateDao: ExchangeRateDao, private val transactionDao: TransactionDao, private val categoryDao: CategoryDao, private val settingsDao: SettingsDao, private val ivyContext: IvyWalletCtx, private val nav: Navigation, private val categoryUploader: CategoryUploader, private val accountUploader: AccountUploader, private val accountLogic: WalletAccountLogic, private val categoryLogic: WalletCategoryLogic, private val plannedPaymentRuleDao: PlannedPaymentRuleDao, private val categoryCreator: CategoryCreator, private val accountCreator: AccountCreator, private val plannedPaymentsLogic: PlannedPaymentsLogic, private val exchangeRatesLogic: ExchangeRatesLogic, private val sharedPrefs: SharedPrefs, private val categoriesAct: CategoriesAct, private val accountsAct: AccountsAct, private val accTrnsAct: AccTrnsAct, private val trnsWithDateDivsAct: TrnsWithDateDivsAct, private val baseCurrencyAct: BaseCurrencyAct, private val calcAccBalanceAct: CalcAccBalanceAct, private val calcAccIncomeExpenseAct: CalcAccIncomeExpenseAct, private val calcTrnsIncomeExpenseAct: CalcTrnsIncomeExpenseAct, private val exchangeAct: ExchangeAct ) + LongParameterList:ItemStatisticViewModel.kt$ItemStatisticViewModel$( private val accountDao: AccountDao, private val transactionDao: TransactionDao, private val categoryDao: CategoryDao, private val ivyContext: IvyWalletCtx, private val nav: Navigation, private val accountLogic: WalletAccountLogic, private val categoryLogic: WalletCategoryLogic, private val plannedPaymentRuleDao: PlannedPaymentRuleDao, private val categoryCreator: CategoryCreator, private val accountCreator: AccountCreator, private val plannedPaymentsLogic: PlannedPaymentsLogic, private val sharedPrefs: SharedPrefs, private val categoriesAct: CategoriesAct, private val accountsAct: AccountsAct, private val accTrnsAct: AccTrnsAct, private val trnsWithDateDivsAct: TrnsWithDateDivsAct, private val baseCurrencyAct: BaseCurrencyAct, private val calcAccBalanceAct: CalcAccBalanceAct, private val calcAccIncomeExpenseAct: CalcAccIncomeExpenseAct, private val calcTrnsIncomeExpenseAct: CalcTrnsIncomeExpenseAct, private val exchangeAct: ExchangeAct ) LongParameterList:IvyBasicTextField.kt$( modifier: Modifier = Modifier, value: TextFieldValue, textColor: Color = UI.colors.pureInverse, hint: String?, visualTransformation: VisualTransformation = VisualTransformation.None, keyboardOptions: KeyboardOptions = KeyboardOptions( autoCorrect = true, keyboardType = KeyboardType.Text, imeAction = ImeAction.Done, capitalization = KeyboardCapitalization.Sentences ), keyboardActions: KeyboardActions? = null, onValueChanged: (TextFieldValue) -> Unit ) LongParameterList:IvyBorderButton.kt$( modifier: Modifier = Modifier, text: String, textStyle: TextStyle = UI.typo.b2.style( color = UI.colors.pureInverse, fontWeight = FontWeight.Bold ), backgroundGradient: Gradient = Gradient.solid(UI.colors.mediumInverse), @DrawableRes iconStart: Int? = null, @DrawableRes iconEnd: Int? = null, iconTint: Color = UI.colors.pureInverse, enabled: Boolean = true, wrapContentMode: Boolean = true, padding: Dp = 12.dp, onClick: () -> Unit ) LongParameterList:IvyButton.kt$( modifier: Modifier = Modifier, text: String, backgroundGradient: Gradient = GradientIvy, textStyle: TextStyle = UI.typo.b2.style( color = White, fontWeight = FontWeight.Bold ), @DrawableRes iconStart: Int? = null, @DrawableRes iconEnd: Int? = null, iconTint: Color = White, enabled: Boolean = true, shadowAlpha: Float = 0.15f, wrapContentMode: Boolean = true, hasGlow: Boolean = true, padding: Dp = 12.dp, iconEdgePadding: Dp = 12.dp, iconTextPadding: Dp = 4.dp, onClick: () -> Unit ) @@ -2448,7 +2226,6 @@ LongParameterList:IvyOutlinedButton.kt$( modifier: Modifier = Modifier, text: String, @DrawableRes iconStart: Int?, solidBackground: Boolean = false, iconTint: Color = UI.colors.pureInverse, borderColor: Color = UI.colors.medium, textColor: Color = UI.colors.pureInverse, padding: Dp = 12.dp, onClick: () -> Unit, ) LongParameterList:IvyOutlinedButton.kt$( modifier: Modifier = Modifier, text: String, @DrawableRes iconStart: Int?, solidBackground: Boolean = false, iconTint: Color = UI.colors.pureInverse, borderColor: Color = UI.colors.medium, textColor: Color = UI.colors.pureInverse, padding: Dp = 16.dp, onClick: () -> Unit, ) LongParameterList:IvyOutlinedTextField.kt$( modifier: Modifier = Modifier, value: TextFieldValue, hint: String?, hintColor: Color = UI.colors.gray, backgroundColor: Color = UI.colors.primary, emptyBorderColor: Color = UI.colors.gray, textColor: Color = UI.colors.pureInverse, cursorColor: Color = UI.colors.pureInverse, visualTransformation: VisualTransformation = VisualTransformation.None, keyboardOptions: KeyboardOptions = KeyboardOptions.Default, keyboardActions: KeyboardActions = KeyboardActions.Default, validateInput: (TextFieldValue) -> Boolean = { it.text.isNotNullOrBlank() }, onValueChanged: (TextFieldValue) -> Unit ) - LongParameterList:IvySync.kt$IvySync$( private val accountSync: AccountSync, private val categorySync: CategorySync, private val budgetSync: BudgetSync, private val transactionSync: TransactionSync, private val plannedPaymentSync: PlannedPaymentSync, private val loanSync: LoanSync, private val loanRecordSync: LoanRecordSync, private val ivySession: IvySession ) LongParameterList:IvyTitleTextField.kt$( modifier: Modifier = Modifier, dividerModifier: Modifier = Modifier, value: TextFieldValue, textColor: Color = UI.colors.pureInverse, hint: String?, visualTransformation: VisualTransformation = VisualTransformation.None, keyboardOptions: KeyboardOptions = KeyboardOptions( autoCorrect = true, keyboardType = KeyboardType.Text, imeAction = ImeAction.Done, capitalization = KeyboardCapitalization.Sentences ), keyboardActions: KeyboardActions? = null, onValueChanged: (TextFieldValue) -> Unit ) LongParameterList:LoanDetailsScreen.kt$( baseCurrency: String, loan: Loan?, displayLoanRecords: List<DisplayLoanRecord> = emptyList(), amountPaid: Double, loanAmountPaid: Double = 0.0, accounts: List<Account> = emptyList(), selectedLoanAccount: Account? = null, createLoanTransaction: Boolean = false, onCreateAccount: (CreateAccountData) -> Unit = {}, onEditLoan: (Loan, Boolean) -> Unit = { _, _ -> }, onCreateLoanRecord: (CreateLoanRecordData) -> Unit = {}, onEditLoanRecord: (EditLoanRecordData) -> Unit = {}, onDeleteLoanRecord: (LoanRecord) -> Unit = {}, onDeleteLoan: () -> Unit = {}, ) LongParameterList:LoanDetailsScreen.kt$( loan: Loan, baseCurrency: String, amountPaid: Double, loanAmountPaid: Double = 0.0, itemColor: Color, selectedLoanAccount: Account? = null, onAmountClick: () -> Unit, onEditLoan: () -> Unit, onDeleteLoan: () -> Unit, onAddRecord: () -> Unit ) @@ -2464,42 +2241,39 @@ LongParameterList:LoanTransactionsCore.kt$LoanTransactionsCore$( createTransaction: Boolean, loanRecordId: UUID? = null, loanId: UUID, amount: Double, loanType: LoanType, selectedAccountId: UUID?, title: String? = null, category: Category? = null, time: LocalDateTime? = null, isLoanRecord: Boolean = false, transaction: Transaction? = null, ) LongParameterList:LoanTransactionsCore.kt$LoanTransactionsCore$( loanRecordId: UUID? = null, amount: Double, loanType: LoanType, loanId: UUID, selectedAccountId: UUID?, title: String? = null, categoryId: UUID? = null, time: LocalDateTime = timeNowUTC(), isLoanRecord: Boolean = false, transaction: Transaction? = null ) LongParameterList:LoanTransactionsCore.kt$LoanTransactionsCore$( oldLoanRecordAccountId: UUID?, oldLonRecordConvertedAmount: Double?, oldLoanRecordAmount: Double, newLoanRecordAccountID: UUID?, newLoanRecordAmount: Double, loanAccountId: UUID?, accounts: List<Account>, reCalculateLoanAmount: Boolean = false, ) - LongParameterList:LoanTransactionsCore.kt$LoanTransactionsCore$( private val categoryDao: CategoryDao, private val transactionUploader: TransactionUploader, private val transactionDao: TransactionDao, private val ivyContext: IvyWalletCtx, private val loanRecordDao: LoanRecordDao, private val loanDao: LoanDao, private val settingsDao: SettingsDao, private val accountsDao: AccountDao, private val exchangeRatesLogic: ExchangeRatesLogic ) - LongParameterList:LoanViewModel.kt$LoanViewModel$( private val loanDao: LoanDao, private val loanRecordDao: LoanRecordDao, private val settingsDao: SettingsDao, private val loanSync: LoanSync, private val loanCreator: LoanCreator, private val sharedPrefs: SharedPrefs, private val accountDao: AccountDao, private val accountCreator: AccountCreator, private val loanTransactionsLogic: LoanTransactionsLogic, private val loansAct: LoansAct, private val accountsAct: AccountsAct, private val categoriesAct: CategoriesAct ) + LongParameterList:LoanTransactionsCore.kt$LoanTransactionsCore$( private val categoryDao: CategoryDao, private val transactionDao: TransactionDao, private val ivyContext: IvyWalletCtx, private val loanRecordDao: LoanRecordDao, private val loanDao: LoanDao, private val settingsDao: SettingsDao, private val accountsDao: AccountDao, private val exchangeRatesLogic: ExchangeRatesLogic ) + LongParameterList:LoanViewModel.kt$LoanViewModel$( private val loanDao: LoanDao, private val loanRecordDao: LoanRecordDao, private val settingsDao: SettingsDao, private val loanCreator: LoanCreator, private val sharedPrefs: SharedPrefs, private val accountCreator: AccountCreator, private val loanTransactionsLogic: LoanTransactionsLogic, private val loansAct: LoansAct, private val accountsAct: AccountsAct, ) LongParameterList:MainBottomBar.kt$( buttonsShownPercent: Float, fabStartX: Float, fabStartY: Float, buttonCenterY: Float, clickAreaWidth: Int, onAddExpense: () -> Unit ) LongParameterList:MainBottomBar.kt$( buttonsShownPercent: Float, fabStartX: Float, fabStartY: Float, buttonLeftX: Float, sideButtonsY: Float, clickAreaWidth: Int, onAddIncome: () -> Unit ) LongParameterList:MainBottomBar.kt$( buttonsShownPercent: Float, fabStartX: Float, fabStartY: Float, buttonRightX: Float, sideButtonsY: Float, clickAreaWidth: Int, onAddTransfer: () -> Unit ) LongParameterList:MainBottomBar.kt$( buttonsShownPercent: Float, fabStartX: Float, fabStartY: Float, onAddIncome: () -> Unit, onAddExpense: () -> Unit, onAddTransfer: () -> Unit, onAddPlannedPayment: () -> Unit, ) LongParameterList:MainBottomBar.kt$( tab: MainTab, selectTab: (MainTab) -> Unit, onAddIncome: () -> Unit, onAddExpense: () -> Unit, onAddTransfer: () -> Unit, onAddPlannedPayment: () -> Unit, showAddAccountModal: () -> Unit, ) - LongParameterList:MainViewModel.kt$MainViewModel$( private val settingsDao: SettingsDao, private val ivyContext: IvyWalletCtx, private val nav: Navigation, private val ivySync: IvySync, private val exchangeRatesLogic: ExchangeRatesLogic, private val syncExchangeRatesAct: SyncExchangeRatesAct, private val accountCreator: AccountCreator, private val sharedPrefs: SharedPrefs, ) LongParameterList:OnboardingAccounts.kt$( baseCurrency: String, suggestions: List<CreateAccountData>, accounts: List<AccountBalance>, onCreateAccount: (CreateAccountData) -> Unit = { }, onEditAccount: (Account, Double) -> Unit = { _, _ -> }, onSkip: () -> Unit = {}, onDone: () -> Unit = {} ) LongParameterList:OnboardingCategories.kt$( suggestions: List<CreateCategoryData>, categories: List<Category>, onCreateCategory: (CreateCategoryData) -> Unit = { }, onEditCategory: (Category) -> Unit = { _ -> }, onSkip: () -> Unit = {}, onDone: () -> Unit = {} ) LongParameterList:OnboardingComponents.kt$( modifier: Modifier = Modifier, text: String, textColor: Color, backgroundGradient: Gradient, @DrawableRes iconStart: Int? = null, hasNext: Boolean = false, enabled: Boolean = true, onClick: () -> Unit ) - LongParameterList:OnboardingRouter.kt$OnboardingRouter$( private val _opGoogleSignIn: MutableLiveData<OpResult<Unit>?>, private val _state: MutableLiveData<OnboardingState>, private val _accounts: MutableLiveData<List<AccountBalance>>, private val _accountSuggestions: MutableLiveData<List<CreateAccountData>>, private val _categories: MutableLiveData<List<Category>>, private val _categorySuggestions: MutableLiveData<List<CreateCategoryData>>, private val ivyContext: IvyWalletCtx, private val nav: Navigation, private val ivyAnalytics: IvyAnalytics, private val exchangeRatesLogic: ExchangeRatesLogic, private val accountDao: AccountDao, private val sharedPrefs: SharedPrefs, private val transactionReminderLogic: TransactionReminderLogic, private val ivySync: IvySync, private val preloadDataLogic: PreloadDataLogic, private val categoryDao: CategoryDao, private val logoutLogic: LogoutLogic, private val syncExchangeRatesAct: SyncExchangeRatesAct, ) + LongParameterList:OnboardingRouter.kt$OnboardingRouter$( private val _opGoogleSignIn: MutableLiveData<OpResult<Unit>?>, private val _state: MutableLiveData<OnboardingState>, private val _accounts: MutableLiveData<List<AccountBalance>>, private val _accountSuggestions: MutableLiveData<List<CreateAccountData>>, private val _categories: MutableLiveData<List<Category>>, private val _categorySuggestions: MutableLiveData<List<CreateCategoryData>>, private val nav: Navigation, private val accountDao: AccountDao, private val sharedPrefs: SharedPrefs, private val transactionReminderLogic: TransactionReminderLogic, private val preloadDataLogic: PreloadDataLogic, private val categoryDao: CategoryDao, private val logoutLogic: LogoutLogic, private val syncExchangeRatesAct: SyncExchangeRatesAct, ) LongParameterList:OnboardingScreen.kt$( onboardingState: OnboardingState, currency: IvyCurrency, opGoogleSignIn: OpResult<Unit>?, accountSuggestions: List<CreateAccountData>, accounts: List<AccountBalance>, categorySuggestions: List<CreateCategoryData>, categories: List<Category>, onLoginWithGoogle: () -> Unit = {}, onSkip: () -> Unit = {}, onStartImport: () -> Unit = {}, onStartFresh: () -> Unit = {}, onSetCurrency: (IvyCurrency) -> Unit = {}, onCreateAccount: (CreateAccountData) -> Unit = { }, onEditAccount: (Account, Double) -> Unit = { _, _ -> }, onAddAccountsDone: () -> Unit = {}, onAddAccountsSkip: () -> Unit = {}, onCreateCategory: (CreateCategoryData) -> Unit = {}, onEditCategory: (Category) -> Unit = {}, onAddCategoryDone: () -> Unit = {}, onAddCategorySkip: () -> Unit = {}, ) LongParameterList:OnboardingSplashLogin.kt$( @DrawableRes icon: Int, text: String, textColor: Color, backgroundGradient: Gradient, hasShadow: Boolean, onClick: () -> Unit ) - LongParameterList:OnboardingViewModel.kt$OnboardingViewModel$( private val ivyContext: IvyWalletCtx, private val nav: Navigation, private val accountDao: AccountDao, private val settingsDao: SettingsDao, private val restClient: RestClient, private val session: IvySession, private val accountLogic: WalletAccountLogic, private val categoryCreator: CategoryCreator, private val categoryDao: CategoryDao, private val accountCreator: AccountCreator, private val accountsAct: AccountsAct, private val categoriesAct: CategoriesAct, private val syncExchangeRatesAct: SyncExchangeRatesAct, //Only OnboardingRouter stuff sharedPrefs: SharedPrefs, ivySync: IvySync, ivyAnalytics: IvyAnalytics, transactionReminderLogic: TransactionReminderLogic, preloadDataLogic: PreloadDataLogic, exchangeRatesLogic: ExchangeRatesLogic, logoutLogic: LogoutLogic, ) + LongParameterList:OnboardingViewModel.kt$OnboardingViewModel$( private val ivyContext: IvyWalletCtx, private val nav: Navigation, private val accountDao: AccountDao, private val settingsDao: SettingsDao, private val accountLogic: WalletAccountLogic, private val categoryCreator: CategoryCreator, private val categoryDao: CategoryDao, private val accountCreator: AccountCreator, private val accountsAct: AccountsAct, private val categoriesAct: CategoriesAct, private val syncExchangeRatesAct: SyncExchangeRatesAct, //Only OnboardingRouter stuff sharedPrefs: SharedPrefs, transactionReminderLogic: TransactionReminderLogic, preloadDataLogic: PreloadDataLogic, exchangeRatesLogic: ExchangeRatesLogic, logoutLogic: LogoutLogic, ) LongParameterList:PaywallLogic.kt$PaywallLogic$( private val ivyBilling: IvyBilling, private val ivyContext: IvyWalletCtx, private val navigation: Navigation, private val accountDao: AccountDao, private val categoryDao: CategoryDao, private val budgetDao: BudgetDao, private val loanDao: LoanDao ) LongParameterList:PaywallScreen.kt$( plans: List<Plan>, purchasedSkus: List<String>, paywallReason: PaywallReason?, accounts: List<Account>, categories: List<Category>, budgets: List<Budget>, loans: List<Loan>, onPlanSelected: (Plan?) -> Unit = {}, onBuy: (Plan) -> Unit, ) - LongParameterList:PaywallViewModel.kt$PaywallViewModel$( private val ivyBilling: IvyBilling, private val paywallLogic: PaywallLogic, private val ivyAnalytics: IvyAnalytics, private val categoriesAct: CategoriesAct, private val accountsAct: AccountsAct, private val budgetsAct: BudgetsAct, private val loansAct: LoansAct ) LongParameterList:PieChartAct.kt$PieChartAct$( showAccountTransfersCategory: Boolean, type: TransactionType, accountTransfersCategory: Category, accountIdFilterSet: Set<UUID>, @SideEffect transactions: suspend () -> List<Transaction>, @SideEffect incomeExpenseTransfer: suspend () -> IncomeExpenseTransferPair, @SideEffect categoryAmounts: suspend () -> List<CategoryAmount> ) LongParameterList:PieChartAct.kt$PieChartAct$( type: TransactionType, baseCurrency: String, addAssociatedTransToCategoryAmt: Boolean = false, @SideEffect allCategories: suspend () -> List<Category?>, @SideEffect transactions: suspend () -> List<Transaction>, @SideEffect accountsUsed: suspend () -> List<Account>, ) LongParameterList:PieChartStatisticScreen.kt$( transactionType: TransactionType, period: TimePeriod, percentExpanded: Float, currency: String, amount: Double, showCloseButtonOnly: Boolean = false, onShowMonthModal: () -> Unit, onSelectNextMonth: () -> Unit, onSelectPreviousMonth: () -> Unit, onClose: () -> Unit, onAdd: (TransactionType) -> Unit, ) LongParameterList:PieChartStatisticViewModel.kt$PieChartStatisticViewModel$( period: TimePeriod, type: TransactionType, accountIdFilterList: List<UUID>, filterExclude: Boolean, transactions: List<Transaction>, treatTransfersAsIncomeExpense: Boolean ) LongParameterList:PlannedPaymentsLazyColumn.kt$( Header: @Composable () -> Unit, currency: String, categories: List<Category>, accounts: List<Account>, listState: LazyListState = rememberLazyListState(), oneTime: List<PlannedPaymentRule>, oneTimeIncome: Double, oneTimeExpenses: Double, recurring: List<PlannedPaymentRule>, recurringIncome: Double, recurringExpenses: Double, ) LongParameterList:PlannedPaymentsLazyColumn.kt$( nav: Navigation, currency: String, categories: List<Category>, accounts: List<Account>, listState: LazyListState, oneTime: List<PlannedPaymentRule>, oneTimeIncome: Double, oneTimeExpenses: Double, oneTimeExpanded: Boolean, setOneTimeExpanded: (Boolean) -> Unit, recurring: List<PlannedPaymentRule>, recurringIncome: Double, recurringExpenses: Double, recurringExpanded: Boolean, setRecurringExpanded: (Boolean) -> Unit ) - LongParameterList:PlannedPaymentsLogic.kt$PlannedPaymentsLogic$( private val plannedPaymentRuleDao: PlannedPaymentRuleDao, private val transactionDao: TransactionDao, private val transactionUploader: TransactionUploader, private val settingsDao: SettingsDao, private val exchangeRatesLogic: ExchangeRatesLogic, private val accountDao: AccountDao, private val plannedPaymentRuleUploader: PlannedPaymentRuleUploader ) LongParameterList:PlannedPaymentsScreen.kt$( currency: String, categories: List<Category>, accounts: List<Account>, oneTime: List<PlannedPaymentRule>, oneTimeIncome: Double, oneTimeExpenses: Double, recurring: List<PlannedPaymentRule>, recurringIncome: Double, recurringExpenses: Double ) LongParameterList:ProgressModal.kt$( id: UUID = UUID.randomUUID(), title: String, description: String, visible: Boolean, color: Color = UI.colors.orange, dismiss: () -> Unit = {}, ) LongParameterList:RecurringRuleModal.kt$( startDate: LocalDateTime, intervalN: Int, intervalType: IntervalType, modalScrollState: ScrollState, onSetStartDate: (LocalDateTime) -> Unit, onSetIntervalN: (Int) -> Unit, onSetIntervalType: (IntervalType) -> Unit ) LongParameterList:ReorderModal.kt$( visible: Boolean, id: UUID = UUID.randomUUID(), TitleContent: @Composable ColumnScope.() -> Unit = { Text( modifier = Modifier.padding(start = 32.dp), text = stringResource(R.string.reorder), style = UI.typo.b1.style( UI.colors.pureInverse, FontWeight.ExtraBold ) ) }, initialItems: List<Any>, dismiss: () -> Unit, onUpdateItemOrderNum: ( itemsInNewOrder: List<Any>, item: T, newOrderNum: Double ) -> Unit = { _, _, _ -> }, onReordered: ((List<Any>) -> Unit)? = null, ItemContent: @Composable RowScope.(Int, Any) -> Unit ) LongParameterList:ReorderModal.kt$( visible: Boolean, id: UUID = UUID.randomUUID(), TitleContent: @Composable ColumnScope.() -> Unit = { Text( modifier = Modifier.padding(start = 32.dp), text = stringResource(R.string.reorder), style = UI.typo.b1.style( UI.colors.pureInverse, FontWeight.ExtraBold ) ) }, initialItems: List<T>, dismiss: () -> Unit, onUpdateItemOrderNum: (item: T, newOrderNum: Double) -> Unit = { _, _ -> }, onReordered: ((List<T>) -> Unit)? = null, ItemContent: @Composable (Int, T) -> Unit ) LongParameterList:ReportViewModel.kt$ReportViewModel$( private val plannedPaymentsLogic: PlannedPaymentsLogic, private val settingsDao: SettingsDao, private val transactionDao: TransactionDao, private val ivyContext: IvyWalletCtx, private val nav: Navigation, private val exportCSVLogic: ExportCSVLogic, private val exchangeAct: ExchangeAct, private val accountsAct: AccountsAct, private val categoriesAct: CategoriesAct, private val trnsWithDateDivsAct: TrnsWithDateDivsAct, private val calcTrnsIncomeExpenseAct: CalcTrnsIncomeExpenseAct, private val baseCurrencyAct: BaseCurrencyAct ) - LongParameterList:RootViewModel.kt$RootViewModel$( private val ivyContext: IvyWalletCtx, private val nav: Navigation, private val ivyAnalytics: IvyAnalytics, private val settingsDao: SettingsDao, private val sharedPrefs: SharedPrefs, private val ivySession: IvySession, private val ivyBilling: IvyBilling, private val paywallLogic: PaywallLogic, private val transactionReminderLogic: TransactionReminderLogic, private val migrationsManager: MigrationsManager, ) + LongParameterList:RootViewModel.kt$RootViewModel$( private val ivyContext: IvyWalletCtx, private val nav: Navigation, private val settingsDao: SettingsDao, private val sharedPrefs: SharedPrefs, private val ivyBilling: IvyBilling, private val paywallLogic: PaywallLogic, private val transactionReminderLogic: TransactionReminderLogic, private val migrationsManager: MigrationsManager, ) LongParameterList:SettingsScreen.kt$( @DrawableRes icon: Int, text: String, hasShadow: Boolean = false, backgroundGradient: Gradient = Gradient.solid(UI.colors.medium), textColor: Color = White, iconPadding: Dp = 0.dp, onClick: () -> Unit ) LongParameterList:SettingsScreen.kt$( user: User?, currencyCode: String, opSync: OpResult<Boolean>?, lockApp: Boolean, showNotifications: Boolean = true, hideCurrentBalance: Boolean = false, progressState: Boolean = false, treatTransfersAsIncomeExpense: Boolean = false, nameLocalAccount: String?, startDateOfMonth: Int = 1, onSetCurrency: (String) -> Unit, onSetName: (String) -> Unit = {}, onSync: () -> Unit, onLogout: () -> Unit, onLogin: () -> Unit, onBackupData: () -> Unit = {}, onExportToCSV: () -> Unit = {}, onSetLockApp: (Boolean) -> Unit = {}, onSetShowNotifications: (Boolean) -> Unit = {}, onSetTreatTransfersAsIncExp: (Boolean) -> Unit = {}, onSetHideCurrentBalance: (Boolean) -> Unit = {}, onSetStartDateOfMonth: (Int) -> Unit = {}, onDeleteAllUserData: () -> Unit = {}, onDeleteCloudUserData: () -> Unit = {}, ) LongParameterList:SettingsScreen.kt$( user: User?, opSync: OpResult<Boolean>?, nameLocalAccount: String?, onSync: () -> Unit, onLogout: () -> Unit, onLogin: () -> Unit, onCardClick: () -> Unit ) - LongParameterList:SettingsViewModel.kt$SettingsViewModel$( private val settingsDao: SettingsDao, private val ivySession: IvySession, private val userDao: UserDao, private val ivyContext: IvyWalletCtx, private val ivySync: IvySync, private val exportCSVLogic: ExportCSVLogic, private val restClient: RestClient, private val ivyAnalytics: IvyAnalytics, private val exchangeRatesLogic: ExchangeRatesLogic, private val logoutLogic: LogoutLogic, private val sharedPrefs: SharedPrefs, private val backupLogic: BackupLogic, private val startDayOfMonthAct: StartDayOfMonthAct, private val updateStartDayOfMonthAct: UpdateStartDayOfMonthAct, private val fetchAllTrnsFromServerAct: FetchAllTrnsFromServerAct, private val nav: Navigation, private val syncExchangeRatesAct: SyncExchangeRatesAct, ) + LongParameterList:SettingsViewModel.kt$SettingsViewModel$( private val settingsDao: SettingsDao, private val userDao: UserDao, private val ivyContext: IvyWalletCtx, private val exportCSVLogic: ExportCSVLogic, private val logoutLogic: LogoutLogic, private val sharedPrefs: SharedPrefs, private val backupLogic: BackupLogic, private val startDayOfMonthAct: StartDayOfMonthAct, private val updateStartDayOfMonthAct: UpdateStartDayOfMonthAct, private val nav: Navigation, private val syncExchangeRatesAct: SyncExchangeRatesAct, ) LongParameterList:Switch.kt$( modifier: Modifier = Modifier, enabled: Boolean, enabledColor: Color = UI.colors.green, disabledColor: Color = UI.colors.gray, animationColor: AnimationSpec<Color> = springBounce(), animationMove: AnimationSpec<Float> = springBounce(), onEnabledChange: (checked: Boolean) -> Unit ) LongParameterList:Title.kt$( type: TransactionType, titleFocus: FocusRequester, initialTransactionId: UUID?, titleTextFieldValue: TextFieldValue, setTitleTextFieldValue: (TextFieldValue) -> Unit, suggestions: Set<String>, scrollState: ScrollState? = null, onTitleChanged: (String?) -> Unit, onNext: () -> Unit, ) LongParameterList:TransactionSectionDivider.kt$( expanded: Boolean, title: String, titleColor: Color, baseCurrency: String, income: Double, expenses: Double, showIncomeExpenseRow: Boolean = true, setExpanded: (Boolean) -> Unit ) @@ -2509,7 +2283,6 @@ LoopWithTooManyJumpStatements:PieChart.kt$PieChartView$for MagicNumber:AmountFormatting.kt$0.009 MagicNumber:AmountFormatting.kt$9 - MagicNumber:AppModuleDI.kt$AppModuleDI.<no name provided>$50 MagicNumber:BackBottomBar.kt$180f MagicNumber:BackupLogic.kt$BackupLogic$0.05 MagicNumber:BackupLogic.kt$BackupLogic$0.1 @@ -2608,7 +2381,6 @@ MagicNumber:Colors.kt$3 MagicNumber:CurrencyPicker.kt$20 MagicNumber:CustomExchangeRateCard.kt$4 - MagicNumber:DataCircle.kt$100 MagicNumber:DateExt.kt$10 MagicNumber:DateExt.kt$23 MagicNumber:DateExt.kt$30 @@ -2626,19 +2398,6 @@ MagicNumber:EditBottomSheet.kt$8f MagicNumber:EditTransactionScreen.kt$0.3f MagicNumber:EditTransactionScreen.kt$12 - MagicNumber:ErrorCode.kt$ErrorCode.CATEGORY_NOT_FOUND$4041 - MagicNumber:ErrorCode.kt$ErrorCode.CUSTOM_FIELD_NOT_FOUND$4046 - MagicNumber:ErrorCode.kt$ErrorCode.EVENT_NOT_FOUND$4045 - MagicNumber:ErrorCode.kt$ErrorCode.LABEL_NOT_FOUND$4042 - MagicNumber:ErrorCode.kt$ErrorCode.NOTE_NOT_FOUND$4044 - MagicNumber:ErrorCode.kt$ErrorCode.NOT_IVY_ATTACHMENT$7404 - MagicNumber:ErrorCode.kt$ErrorCode.PARSE$2 - MagicNumber:ErrorCode.kt$ErrorCode.PERMISSION_ERROR$14 - MagicNumber:ErrorCode.kt$ErrorCode.SECURITY$13 - MagicNumber:ErrorCode.kt$ErrorCode.SERVER_EXCEPTION$666 - MagicNumber:ErrorCode.kt$ErrorCode.STATE_ERROR$7 - MagicNumber:ErrorCode.kt$ErrorCode.TASK_NOT_FOUND$4043 - MagicNumber:ErrorCode.kt$ErrorCode.UNKNOWN$666 MagicNumber:ExchangeRatesScreen.kt$1.23 MagicNumber:ExchangeRatesScreen.kt$1.85 MagicNumber:ExchangeRatesScreen.kt$1.96 @@ -2840,10 +2599,6 @@ MagicNumber:RecurringRuleModal.kt$12 MagicNumber:RecurringRuleModal.kt$200 MagicNumber:ReportScreen.kt$1000f - MagicNumber:RestClient.kt$RestClient.Companion$15 - MagicNumber:RestClient.kt$RestClient.Companion$200 - MagicNumber:RestClient.kt$RestClient.Companion$299 - MagicNumber:RestClient.kt$RestClient.Companion$5 MagicNumber:RootActivity.kt$RootActivity$100 MagicNumber:RootActivity.kt$RootActivity$12 MagicNumber:RootViewModel.kt$RootViewModel$1000 @@ -2882,9 +2637,6 @@ MaxLineLength:Accessorseessl0al0otcsbyqqruvoncpd.kt$(this as org.gradle.api.plugins.ExtensionAware).extensions.getByName("ext") as org.gradle.api.plugins.ExtraPropertiesExtension MaxLineLength:Accessorseessl0al0otcsbyqqruvoncpd.kt$fun MaxLineLength:AccountModal.kt$text = if (modal?.account != null) stringResource(R.string.edit_account) else stringResource(R.string.new_account) - MaxLineLength:AppModuleDI.kt$AppModuleDI.<no name provided>$"https://img.poki.com/cdn-cgi/image/quality=78,width=600,height=600,fit=cover,f=auto/94945631828bfdcf32a8ad0b79978913.png" - MaxLineLength:AppModuleDI.kt$AppModuleDI.<no name provided>$"https://maserati.scene7.com/is/image/maserati/maserati/regional/us/models/my22/levante/22_LV_Trofeo_PS_T1_HomePage_1920x1080.jpg?\$1920x2000\$&fit=constrain" - MaxLineLength:AppModuleDI.kt$AppModuleDI.<no name provided>$"https://stimg.cardekho.com/images/carexteriorimages/930x620/Lamborghini/Aventador/6721/Lamborghini-Aventador-SVJ/1621849426405/front-left-side-47.jpg" MaxLineLength:BalanceViewModel.kt$BalanceViewModel$plannedPaymentsLogic.plannedPaymentsAmountFor(period.toRange(ivyContext.startDayOfMonth)) //+ positive if Income > Expenses else - negative MaxLineLength:BudgetModal.kt$text = if (modal?.budget != null) stringResource(R.string.edit_budget) else stringResource(R.string.create_budget) MaxLineLength:CustomerJourneyLogic.kt$CustomerJourneyLogic.Companion$"If you haven't yet, feel free join our invite-only Ivy Telegram Community and make our app better :)" @@ -3005,7 +2757,6 @@ MaximumLineLength:Accessorseessl0al0otcsbyqqruvoncpd.kt$ MaximumLineLength:Accessorseessl0al0otcsbyqqruvoncpd.kt$fun MaximumLineLength:AccountModal.kt$ - MaximumLineLength:AppModuleDI.kt$AppModuleDI.<no name provided>$ MaximumLineLength:BalanceViewModel.kt$BalanceViewModel$ MaximumLineLength:BudgetModal.kt$ MaximumLineLength:CustomerJourneyLogic.kt$CustomerJourneyLogic.Companion$ @@ -3121,7 +2872,6 @@ ModifierMissing:CurrencyModal.kt$CurrencyModal ModifierMissing:CustomerJourney.kt$CustomerJourney ModifierMissing:CustomerJourney.kt$CustomerJourneyCard - ModifierMissing:DataCircle.kt$DataCircle ModifierMissing:DefaultImportSteps.kt$DefaultImportSteps ModifierMissing:DeleteModal.kt$DeleteModal ModifierMissing:DescriptionModal.kt$DescriptionModal @@ -3136,7 +2886,6 @@ ModifierMissing:GitHubBackupScreen.kt$GitHubBackupScreen ModifierMissing:GitHubBackupStatus.kt$GitHubBackupStatus ModifierMissing:GradientCut.kt$GradientCutBottom - ModifierMissing:HealthTab.kt$HealthTab ModifierMissing:HistoryDateDivider.kt$HistoryDateDivider ModifierMissing:HomeHeader.kt$CashFlowInfo ModifierMissing:HomeMoreMenu.kt$MoreMenu @@ -3166,7 +2915,6 @@ ModifierMissing:IvyUI.kt$IvyUI ModifierMissing:IvyViewPager.kt$IvyPager ModifierMissing:IvyWalletSteps.kt$IvyWalletSteps - ModifierMissing:KPIsTab.kt$KPIsTab ModifierMissing:LoanModal.kt$LoanModal ModifierMissing:LoanRecordModal.kt$LoanRecordModal ModifierMissing:MainBottomBar.kt$BottomBar @@ -3179,7 +2927,6 @@ ModifierMissing:OnboardingAccounts.kt$PremiumInfo ModifierMissing:OnboardingCategories.kt$OnboardingCategories ModifierMissing:OnboardingPrivacyTC.kt$OnboardingPrivacyTC - ModifierMissing:OnboardingReportTab.kt$OnboardingReportTab ModifierMissing:OnboardingSetCurrency.kt$OnboardingSetCurrency ModifierMissing:OnboardingSetName.kt$OnboardingSetName ModifierMissing:OnboardingSplashLogin.kt$OnboardingSplashLogin @@ -3212,7 +2959,6 @@ ModifierMissing:TransactionCard.kt$TypeAmountCurrency ModifierMissing:TransactionDateTime.kt$TransactionDateTime ModifierMissing:TransactionSectionDivider.kt$SectionDivider - ModifierMissing:UserStatsTab.kt$UserStatsTab ModifierMissing:WalletBalanceWidgetContent.kt$BalanceSection ModifierMissing:WalletBalanceWidgetContent.kt$ButtonsSection ModifierMissing:WalletBalanceWidgetContent.kt$IncomeExpenseSection @@ -3243,8 +2989,6 @@ MultiLineIfElse:AmountModal.kt$"key_decimal_separator" MultiLineIfElse:AmountModal.kt$initialAmount?.takeIf { it != 0.0 }?.format(currency) ?: "" MultiLineIfElse:AmountModal.kt$initialAmount?.takeIf { it != 0.0 }?.format(decimalCountMax) ?: "" - MultiLineIfElse:AnalyticsReportScreen.kt$Gradient.solid( Gray ) - MultiLineIfElse:AnalyticsReportScreen.kt$GradientIvy MultiLineIfElse:BackupLogic.kt$BackupLogic$Pair(accountsFirst.id, accountsZero.id) MultiLineIfElse:BackupLogic.kt$BackupLogic$Pair(accountsZero.id, accountsFirst.id) MultiLineIfElse:BackupLogic.kt$BackupLogic$Pair(categoryFirst.id, categoryZero.id) @@ -3387,7 +3131,6 @@ MultiLineIfElse:ReportScreen.kt$Spacer(Modifier.height(32.dp)) MultiLineIfElse:ReportScreen.kt$nav.navigateTo( PieChartStatistic( type = TransactionType.EXPENSE, transactions = state.transactions, accountList = state.accountIdFilters, treatTransfersAsIncomeExpense = state.treatTransfersAsIncExp ) ) MultiLineIfElse:ReportScreen.kt$nav.navigateTo( PieChartStatistic( type = TransactionType.INCOME, transactions = state.transactions, accountList = state.accountIdFilters, treatTransfersAsIncomeExpense = state.treatTransfersAsIncExp ) ) - MultiLineIfElse:RestClient.kt$RestClient.Companion$exception MultiLineIfElse:RootActivity.kt$RootActivity$viewModel.checkUserInactiveTimeStatus() MultiLineIfElse:RootActivity.kt$RootActivity$viewModel.startUserInactiveTimeCounter() MultiLineIfElse:TransactionCard.kt$Orange @@ -3403,8 +3146,6 @@ MultiLineIfElse:ViewPager.kt$abs(currentPageOffset) MultiLineIfElse:ViewPager.kt$currentPage MultiLineIfElse:WalletCharts.kt$accumulator - MultiLineIfElse:WebViewScreen.kt$WebSettingsCompat.FORCE_DARK_OFF - MultiLineIfElse:WebViewScreen.kt$WebSettingsCompat.FORCE_DARK_ON MultiLineIfElse:ZipUtils.kt$"$it${File.separator}" MultiLineIfElse:ZipUtils.kt$(file.parent!!).substring( file.parent!!.lastIndexOf("/") ) + "/" + file.name MultiLineIfElse:ZipUtils.kt$file.name @@ -3487,13 +3228,9 @@ NewLineAtEndOfFile:AccountEntity.kt$com.ivy.wallet.io.persistence.data.AccountEntity.kt NewLineAtEndOfFile:AccountFunctions.kt$com.ivy.wallet.domain.pure.account.AccountFunctions.kt NewLineAtEndOfFile:AccountModal.kt$com.ivy.wallet.ui.theme.modal.edit.AccountModal.kt - NewLineAtEndOfFile:AccountService.kt$com.ivy.wallet.io.network.service.AccountService.kt NewLineAtEndOfFile:AccountState.kt$com.ivy.wallet.ui.accounts.AccountState.kt - NewLineAtEndOfFile:AccountSync.kt$com.ivy.wallet.domain.deprecated.sync.item.AccountSync.kt - NewLineAtEndOfFile:AccountUploader.kt$com.ivy.wallet.domain.deprecated.sync.uploader.AccountUploader.kt NewLineAtEndOfFile:AccountsAct.kt$com.ivy.wallet.domain.action.account.AccountsAct.kt NewLineAtEndOfFile:AccountsEvent.kt$com.ivy.wallet.ui.accounts.AccountsEvent.kt - NewLineAtEndOfFile:AccountsResponse.kt$com.ivy.wallet.io.network.request.account.AccountsResponse.kt NewLineAtEndOfFile:AccountsUpdatedEvent.kt$com.ivy.wallet.domain.event.AccountsUpdatedEvent.kt NewLineAtEndOfFile:AccountsViewModel.kt$com.ivy.wallet.ui.accounts.AccountsViewModel.kt NewLineAtEndOfFile:ActivityResultExt.kt$com.ivy.wallet.utils.ActivityResultExt.kt @@ -3507,17 +3244,11 @@ NewLineAtEndOfFile:AmountCurrency.kt$com.ivy.wallet.ui.theme.wallet.AmountCurrency.kt NewLineAtEndOfFile:AmountFormatting.kt$com.ivy.wallet.utils.AmountFormatting.kt NewLineAtEndOfFile:AnalyticsEvent.kt$com.ivy.wallet.domain.data.analytics.AnalyticsEvent.kt - NewLineAtEndOfFile:AnalyticsReportResponse.kt$com.ivy.wallet.io.network.request.analytics.AnalyticsReportResponse.kt - NewLineAtEndOfFile:AnalyticsReportViewModel.kt$com.ivy.wallet.ui.analytics.AnalyticsReportViewModel.kt - NewLineAtEndOfFile:AnalyticsService.kt$com.ivy.wallet.io.network.service.AnalyticsService.kt - NewLineAtEndOfFile:AnalyticsTab.kt$com.ivy.wallet.ui.analytics.AnalyticsTab.kt NewLineAtEndOfFile:Android.kt$com.ivy.design.utils.Android.kt NewLineAtEndOfFile:Animation.kt$com.ivy.design.utils.Animation.kt NewLineAtEndOfFile:AppBaseData.kt$com.ivy.wallet.ui.data.AppBaseData.kt NewLineAtEndOfFile:AppModuleDI.kt$com.ivy.wallet.AppModuleDI.kt NewLineAtEndOfFile:AuthProviderType.kt$com.ivy.wallet.domain.data.AuthProviderType.kt - NewLineAtEndOfFile:AuthResponse.kt$com.ivy.wallet.io.network.request.auth.AuthResponse.kt - NewLineAtEndOfFile:AuthService.kt$com.ivy.wallet.io.network.service.AuthService.kt NewLineAtEndOfFile:BackBottomBar.kt$com.ivy.wallet.ui.theme.components.BackBottomBar.kt NewLineAtEndOfFile:Background.kt$com.ivy.design.l1_buildingBlocks.data.Background.kt NewLineAtEndOfFile:BackupLogic.kt$com.ivy.wallet.domain.deprecated.logic.zip.BackupLogic.kt @@ -3528,16 +3259,11 @@ NewLineAtEndOfFile:Budget.kt$com.ivy.wallet.domain.data.core.Budget.kt NewLineAtEndOfFile:BudgetBattery.kt$com.ivy.wallet.ui.theme.components.BudgetBattery.kt NewLineAtEndOfFile:BudgetCreator.kt$com.ivy.wallet.domain.deprecated.logic.BudgetCreator.kt - NewLineAtEndOfFile:BudgetDTO.kt$com.ivy.wallet.io.network.data.BudgetDTO.kt NewLineAtEndOfFile:BudgetDao.kt$com.ivy.wallet.io.persistence.dao.BudgetDao.kt NewLineAtEndOfFile:BudgetEntity.kt$com.ivy.wallet.io.persistence.data.BudgetEntity.kt NewLineAtEndOfFile:BudgetModal.kt$com.ivy.wallet.ui.theme.modal.BudgetModal.kt - NewLineAtEndOfFile:BudgetService.kt$com.ivy.wallet.io.network.service.BudgetService.kt - NewLineAtEndOfFile:BudgetSync.kt$com.ivy.wallet.domain.deprecated.sync.item.BudgetSync.kt - NewLineAtEndOfFile:BudgetUploader.kt$com.ivy.wallet.domain.deprecated.sync.uploader.BudgetUploader.kt NewLineAtEndOfFile:BudgetViewModel.kt$com.ivy.wallet.ui.budget.BudgetViewModel.kt NewLineAtEndOfFile:BudgetsAct.kt$com.ivy.wallet.domain.action.budget.BudgetsAct.kt - NewLineAtEndOfFile:BudgetsResponse.kt$com.ivy.wallet.io.network.request.budget.BudgetsResponse.kt NewLineAtEndOfFile:BufferBattery.kt$com.ivy.wallet.ui.theme.components.BufferBattery.kt NewLineAtEndOfFile:BufferInfo.kt$com.ivy.wallet.ui.data.BufferInfo.kt NewLineAtEndOfFile:BufferModal.kt$com.ivy.wallet.ui.theme.modal.BufferModal.kt @@ -3565,23 +3291,17 @@ NewLineAtEndOfFile:CategoryAmount.kt$com.ivy.wallet.ui.statistic.level1.CategoryAmount.kt NewLineAtEndOfFile:CategoryByIdAct.kt$com.ivy.wallet.domain.action.category.CategoryByIdAct.kt NewLineAtEndOfFile:CategoryCreator.kt$com.ivy.wallet.domain.deprecated.logic.CategoryCreator.kt - NewLineAtEndOfFile:CategoryDTO.kt$com.ivy.wallet.io.network.data.CategoryDTO.kt NewLineAtEndOfFile:CategoryDao.kt$com.ivy.wallet.io.persistence.dao.CategoryDao.kt NewLineAtEndOfFile:CategoryData.kt$com.ivy.wallet.ui.category.CategoryData.kt NewLineAtEndOfFile:CategoryEntity.kt$com.ivy.wallet.io.persistence.data.CategoryEntity.kt NewLineAtEndOfFile:CategoryIncomeWithAccountFiltersAct.kt$com.ivy.wallet.domain.action.category.CategoryIncomeWithAccountFiltersAct.kt NewLineAtEndOfFile:CategoryModal.kt$com.ivy.wallet.ui.theme.modal.edit.CategoryModal.kt - NewLineAtEndOfFile:CategoryService.kt$com.ivy.wallet.io.network.service.CategoryService.kt - NewLineAtEndOfFile:CategorySync.kt$com.ivy.wallet.domain.deprecated.sync.item.CategorySync.kt NewLineAtEndOfFile:CategoryTrnsBetweenAct.kt$com.ivy.wallet.domain.action.category.CategoryTrnsBetweenAct.kt - NewLineAtEndOfFile:CategoryUploader.kt$com.ivy.wallet.domain.deprecated.sync.uploader.CategoryUploader.kt NewLineAtEndOfFile:CategoryValues.kt$com.ivy.wallet.ui.charts.CategoryValues.kt NewLineAtEndOfFile:ChangeTransactionTypeModal.kt$com.ivy.wallet.ui.theme.components.ChangeTransactionTypeModal.kt NewLineAtEndOfFile:ChartPeriod.kt$com.ivy.wallet.domain.pure.charts.ChartPeriod.kt NewLineAtEndOfFile:ChartType.kt$com.ivy.wallet.ui.charts.ChartType.kt NewLineAtEndOfFile:ChartsCore.kt$com.ivy.wallet.domain.pure.charts.ChartsCore.kt - NewLineAtEndOfFile:CheckEmailRequest.kt$com.ivy.wallet.io.network.request.auth.CheckEmailRequest.kt - NewLineAtEndOfFile:CheckEmailResponse.kt$com.ivy.wallet.io.network.request.auth.CheckEmailResponse.kt NewLineAtEndOfFile:Checkbox.kt$com.ivy.design.l2_components.Checkbox.kt NewLineAtEndOfFile:ChooseCategoryModal.kt$com.ivy.wallet.ui.theme.modal.edit.ChooseCategoryModal.kt NewLineAtEndOfFile:ChoosePeriodModal.kt$com.ivy.wallet.ui.theme.modal.ChoosePeriodModal.kt @@ -3599,27 +3319,18 @@ NewLineAtEndOfFile:CreateCategoryData.kt$com.ivy.wallet.domain.deprecated.logic.model.CreateCategoryData.kt NewLineAtEndOfFile:CreateLoanData.kt$com.ivy.wallet.domain.deprecated.logic.model.CreateLoanData.kt NewLineAtEndOfFile:CreateLoanRecordData.kt$com.ivy.wallet.domain.deprecated.logic.model.CreateLoanRecordData.kt - NewLineAtEndOfFile:CrupdateBudgetRequest.kt$com.ivy.wallet.io.network.request.budget.CrupdateBudgetRequest.kt NewLineAtEndOfFile:CurrencyModal.kt$com.ivy.wallet.ui.theme.modal.CurrencyModal.kt NewLineAtEndOfFile:CurrencyPicker.kt$com.ivy.wallet.ui.theme.components.CurrencyPicker.kt NewLineAtEndOfFile:CustomExchangeRateCard.kt$com.ivy.wallet.ui.theme.components.CustomExchangeRateCard.kt NewLineAtEndOfFile:CustomExchangeRateState.kt$com.ivy.wallet.domain.data.CustomExchangeRateState.kt NewLineAtEndOfFile:CustomerJourney.kt$com.ivy.wallet.ui.home.CustomerJourney.kt NewLineAtEndOfFile:CustomerJourneyCardData.kt$com.ivy.wallet.domain.deprecated.logic.model.CustomerJourneyCardData.kt - NewLineAtEndOfFile:DataCircle.kt$com.ivy.wallet.ui.analytics.DataCircle.kt NewLineAtEndOfFile:DateExt.kt$com.ivy.wallet.utils.DateExt.kt NewLineAtEndOfFile:DefaultImportSteps.kt$com.ivy.wallet.ui.csvimport.flow.instructions.DefaultImportSteps.kt - NewLineAtEndOfFile:DeleteAccountRequest.kt$com.ivy.wallet.io.network.request.account.DeleteAccountRequest.kt NewLineAtEndOfFile:DeleteAllData.kt$com.ivy.design.l4_patterns.delete.DeleteAllData.kt - NewLineAtEndOfFile:DeleteBudgetRequest.kt$com.ivy.wallet.io.network.request.budget.DeleteBudgetRequest.kt NewLineAtEndOfFile:DeleteButton.kt$com.ivy.wallet.ui.theme.components.DeleteButton.kt NewLineAtEndOfFile:DeleteItem.kt$com.ivy.design.l4_patterns.delete.DeleteItem.kt - NewLineAtEndOfFile:DeleteLoanRecordRequest.kt$com.ivy.wallet.io.network.request.loan.DeleteLoanRecordRequest.kt - NewLineAtEndOfFile:DeleteLoanRequest.kt$com.ivy.wallet.io.network.request.loan.DeleteLoanRequest.kt NewLineAtEndOfFile:DeleteModal.kt$com.ivy.wallet.ui.theme.modal.DeleteModal.kt - NewLineAtEndOfFile:DeletePlannedPaymentRuleRequest.kt$com.ivy.wallet.io.network.request.planned.DeletePlannedPaymentRuleRequest.kt - NewLineAtEndOfFile:DeleteTransactionRequest.kt$com.ivy.wallet.io.network.request.transaction.DeleteTransactionRequest.kt - NewLineAtEndOfFile:DeleteWalletCategoryRequest.kt$com.ivy.wallet.io.network.request.category.DeleteWalletCategoryRequest.kt NewLineAtEndOfFile:Description.kt$com.ivy.wallet.ui.edit.core.Description.kt NewLineAtEndOfFile:DescriptionModal.kt$com.ivy.wallet.ui.theme.modal.edit.DescriptionModal.kt NewLineAtEndOfFile:DisplayBudget.kt$com.ivy.wallet.ui.budget.model.DisplayBudget.kt @@ -3644,24 +3355,17 @@ NewLineAtEndOfFile:EditTransactionViewModel.kt$com.ivy.wallet.ui.edit.EditTransactionViewModel.kt NewLineAtEndOfFile:EmailState.kt$com.ivy.wallet.domain.data.EmailState.kt NewLineAtEndOfFile:EncryptedSharedPrefs.kt$com.ivy.wallet.data.EncryptedSharedPrefs.kt - NewLineAtEndOfFile:ErrorCode.kt$com.ivy.wallet.io.network.error.ErrorCode.kt NewLineAtEndOfFile:ExampleInstrumentedTest.kt$com.ivy.design.ExampleInstrumentedTest.kt NewLineAtEndOfFile:Exchange.kt$com.ivy.wallet.domain.pure.exchange.Exchange.kt NewLineAtEndOfFile:ExchangeRate.kt$com.ivy.wallet.domain.data.core.ExchangeRate.kt - NewLineAtEndOfFile:ExchangeRateDTO.kt$com.ivy.wallet.io.network.data.ExchangeRateDTO.kt NewLineAtEndOfFile:ExchangeRateDao.kt$com.ivy.wallet.io.persistence.dao.ExchangeRateDao.kt NewLineAtEndOfFile:ExchangeRateEntity.kt$com.ivy.wallet.io.persistence.data.ExchangeRateEntity.kt NewLineAtEndOfFile:ExchangeRatesLogic.kt$com.ivy.wallet.domain.deprecated.logic.currency.ExchangeRatesLogic.kt - NewLineAtEndOfFile:ExchangeRatesResponse.kt$com.ivy.wallet.io.network.request.currency.ExchangeRatesResponse.kt NewLineAtEndOfFile:ExchangeRatesScreen.kt$com.ivy.wallet.ui.exchangerates.ExchangeRatesScreen.kt - NewLineAtEndOfFile:ExchangeRatesService.kt$com.ivy.wallet.io.network.service.ExchangeRatesService.kt NewLineAtEndOfFile:ExchangeRatesViewModel.kt$com.ivy.wallet.ui.exchangerates.ExchangeRatesViewModel.kt NewLineAtEndOfFile:ExchangeTrns.kt$com.ivy.wallet.domain.pure.exchange.ExchangeTrns.kt - NewLineAtEndOfFile:ExpImagesService.kt$com.ivy.wallet.io.network.service.ExpImagesService.kt NewLineAtEndOfFile:ExportCSVLogic.kt$com.ivy.wallet.domain.deprecated.logic.csv.ExportCSVLogic.kt NewLineAtEndOfFile:FAB.kt$com.ivy.design.l3_ivyComponents.button.FAB.kt - NewLineAtEndOfFile:FetchAllTrnsFromServerAct.kt$com.ivy.wallet.domain.action.transaction.FetchAllTrnsFromServerAct.kt - NewLineAtEndOfFile:FetchImagesAct.kt$com.ivy.wallet.domain.action.viewmodel.experiment.FetchImagesAct.kt NewLineAtEndOfFile:FileUtil.kt$com.ivy.wallet.utils.FileUtil.kt NewLineAtEndOfFile:FilterOverlay.kt$com.ivy.wallet.ui.reports.FilterOverlay.kt NewLineAtEndOfFile:FinancistoSteps.kt$com.ivy.wallet.ui.csvimport.flow.instructions.FinancistoSteps.kt @@ -3680,12 +3384,8 @@ NewLineAtEndOfFile:GitHubCredentials.kt$com.ivy.wallet.backup.github.GitHubCredentials.kt NewLineAtEndOfFile:GitHubPATMigration.kt$com.ivy.wallet.migrations.impl.GitHubPATMigration.kt NewLineAtEndOfFile:GitHubWorkerMigration.kt$com.ivy.wallet.migrations.impl.GitHubWorkerMigration.kt - NewLineAtEndOfFile:GoogleSignInRequest.kt$com.ivy.wallet.io.network.request.auth.GoogleSignInRequest.kt NewLineAtEndOfFile:GradientCut.kt$com.ivy.wallet.ui.theme.components.GradientCut.kt - NewLineAtEndOfFile:GsonTypeAdapters.kt$com.ivy.wallet.io.network.GsonTypeAdapters.kt NewLineAtEndOfFile:HasTrnsAct.kt$com.ivy.wallet.domain.action.viewmodel.home.HasTrnsAct.kt - NewLineAtEndOfFile:Health.kt$com.ivy.wallet.ui.analytics.model.Health.kt - NewLineAtEndOfFile:HealthTab.kt$com.ivy.wallet.ui.analytics.tab.HealthTab.kt NewLineAtEndOfFile:HistoryDateDivider.kt$com.ivy.wallet.ui.component.transaction.HistoryDateDivider.kt NewLineAtEndOfFile:HistoryTrnsAct.kt$com.ivy.wallet.domain.action.transaction.HistoryTrnsAct.kt NewLineAtEndOfFile:HistoryWithDateDivsAct.kt$com.ivy.wallet.domain.action.transaction.HistoryWithDateDivsAct.kt @@ -3704,8 +3404,6 @@ NewLineAtEndOfFile:ImportType.kt$com.ivy.wallet.domain.deprecated.logic.csv.model.ImportType.kt NewLineAtEndOfFile:ImportViewModel.kt$com.ivy.wallet.ui.csvimport.ImportViewModel.kt NewLineAtEndOfFile:IncomeExpensePair.kt$com.ivy.wallet.domain.pure.data.IncomeExpensePair.kt - NewLineAtEndOfFile:InitiateResetPasswordRequest.kt$com.ivy.wallet.io.network.request.auth.InitiateResetPasswordRequest.kt - NewLineAtEndOfFile:InitiateResetPasswordResponse.kt$com.ivy.wallet.io.network.request.auth.InitiateResetPasswordResponse.kt NewLineAtEndOfFile:InputError.kt$com.ivy.wallet.utils.InputError.kt NewLineAtEndOfFile:InputField.kt$com.ivy.design.l2_components.InputField.kt NewLineAtEndOfFile:Insets.kt$com.ivy.design.utils.Insets.kt @@ -3715,7 +3413,6 @@ NewLineAtEndOfFile:ItemIcon.kt$com.ivy.wallet.ui.theme.components.ItemIcon.kt NewLineAtEndOfFile:ItemStatisticScreen.kt$com.ivy.wallet.ui.statistic.level2.ItemStatisticScreen.kt NewLineAtEndOfFile:ItemStatisticViewModel.kt$com.ivy.wallet.ui.statistic.level2.ItemStatisticViewModel.kt - NewLineAtEndOfFile:IvyAnalytics.kt$com.ivy.wallet.io.network.IvyAnalytics.kt NewLineAtEndOfFile:IvyAndroidApp.kt$com.ivy.wallet.IvyAndroidApp.kt NewLineAtEndOfFile:IvyAnimation.kt$com.ivy.wallet.utils.IvyAnimation.kt NewLineAtEndOfFile:IvyBasicTextField.kt$com.ivy.wallet.ui.theme.components.IvyBasicTextField.kt @@ -3749,10 +3446,8 @@ NewLineAtEndOfFile:IvyOutlinedTextField.kt$com.ivy.wallet.ui.theme.components.IvyOutlinedTextField.kt NewLineAtEndOfFile:IvyPadding.kt$com.ivy.design.l1_buildingBlocks.data.IvyPadding.kt NewLineAtEndOfFile:IvyRoomDatabase.kt$com.ivy.wallet.io.persistence.IvyRoomDatabase.kt - NewLineAtEndOfFile:IvySession.kt$com.ivy.wallet.io.network.IvySession.kt NewLineAtEndOfFile:IvyShapes.kt$com.ivy.design.l0_system.IvyShapes.kt NewLineAtEndOfFile:IvySwitch.kt$com.ivy.wallet.ui.theme.components.IvySwitch.kt - NewLineAtEndOfFile:IvySync.kt$com.ivy.wallet.domain.deprecated.sync.IvySync.kt NewLineAtEndOfFile:IvyText.kt$com.ivy.design.l1_buildingBlocks.IvyText.kt NewLineAtEndOfFile:IvyTitleTextField.kt$com.ivy.wallet.ui.theme.components.IvyTitleTextField.kt NewLineAtEndOfFile:IvyToolbar.kt$com.ivy.wallet.ui.theme.components.IvyToolbar.kt @@ -3763,19 +3458,16 @@ NewLineAtEndOfFile:IvyWalletDatastore.kt$com.ivy.wallet.data.IvyWalletDatastore.kt NewLineAtEndOfFile:IvyWalletDesign.kt$com.ivy.design.api.systems.IvyWalletDesign.kt NewLineAtEndOfFile:IvyWalletSteps.kt$com.ivy.wallet.ui.csvimport.flow.instructions.IvyWalletSteps.kt - NewLineAtEndOfFile:KPIs.kt$com.ivy.wallet.ui.analytics.model.KPIs.kt - NewLineAtEndOfFile:KPIsTab.kt$com.ivy.wallet.ui.analytics.tab.KPIsTab.kt NewLineAtEndOfFile:KTWMoneyMangerSteps.kt$com.ivy.wallet.ui.csvimport.flow.instructions.KTWMoneyMangerSteps.kt NewLineAtEndOfFile:Keyboard.kt$com.ivy.design.utils.Keyboard.kt - NewLineAtEndOfFile:KtorClient.kt$com.ivy.wallet.backup.ktor.KtorClient.kt - NewLineAtEndOfFile:KtorClientModule.kt$com.ivy.wallet.backup.ktor.KtorClientModule.kt + NewLineAtEndOfFile:KtorClient.kt$com.ivy.wallet.ktor.KtorClient.kt + NewLineAtEndOfFile:KtorClientModule.kt$com.ivy.wallet.ktor.KtorClientModule.kt NewLineAtEndOfFile:LTLoanRecordMapper.kt$com.ivy.wallet.domain.deprecated.logic.loantrasactions.LTLoanRecordMapper.kt NewLineAtEndOfFile:LastNTimeRange.kt$com.ivy.wallet.ui.onboarding.model.LastNTimeRange.kt NewLineAtEndOfFile:Loan.kt$com.ivy.wallet.domain.data.core.Loan.kt NewLineAtEndOfFile:LoanBottomBar.kt$com.ivy.wallet.ui.loan.LoanBottomBar.kt NewLineAtEndOfFile:LoanByIdAct.kt$com.ivy.wallet.domain.action.loan.LoanByIdAct.kt NewLineAtEndOfFile:LoanCreator.kt$com.ivy.wallet.domain.deprecated.logic.LoanCreator.kt - NewLineAtEndOfFile:LoanDTO.kt$com.ivy.wallet.io.network.data.LoanDTO.kt NewLineAtEndOfFile:LoanDao.kt$com.ivy.wallet.io.persistence.dao.LoanDao.kt NewLineAtEndOfFile:LoanDetailsScreen.kt$com.ivy.wallet.ui.loandetails.LoanDetailsScreen.kt NewLineAtEndOfFile:LoanDetailsViewModel.kt$com.ivy.wallet.ui.loandetails.LoanDetailsViewModel.kt @@ -3783,23 +3475,14 @@ NewLineAtEndOfFile:LoanModal.kt$com.ivy.wallet.ui.theme.modal.LoanModal.kt NewLineAtEndOfFile:LoanRecord.kt$com.ivy.wallet.domain.data.core.LoanRecord.kt NewLineAtEndOfFile:LoanRecordCreator.kt$com.ivy.wallet.domain.deprecated.logic.LoanRecordCreator.kt - NewLineAtEndOfFile:LoanRecordDTO.kt$com.ivy.wallet.io.network.data.LoanRecordDTO.kt NewLineAtEndOfFile:LoanRecordDao.kt$com.ivy.wallet.io.persistence.dao.LoanRecordDao.kt NewLineAtEndOfFile:LoanRecordEntity.kt$com.ivy.wallet.io.persistence.data.LoanRecordEntity.kt NewLineAtEndOfFile:LoanRecordModal.kt$com.ivy.wallet.ui.theme.modal.LoanRecordModal.kt - NewLineAtEndOfFile:LoanRecordSync.kt$com.ivy.wallet.domain.deprecated.sync.item.LoanRecordSync.kt - NewLineAtEndOfFile:LoanRecordUploader.kt$com.ivy.wallet.domain.deprecated.sync.uploader.LoanRecordUploader.kt - NewLineAtEndOfFile:LoanRecordsResponse.kt$com.ivy.wallet.io.network.request.loan.LoanRecordsResponse.kt - NewLineAtEndOfFile:LoanService.kt$com.ivy.wallet.io.network.service.LoanService.kt - NewLineAtEndOfFile:LoanSync.kt$com.ivy.wallet.domain.deprecated.sync.item.LoanSync.kt NewLineAtEndOfFile:LoanTransactionsCore.kt$com.ivy.wallet.domain.deprecated.logic.loantrasactions.LoanTransactionsCore.kt NewLineAtEndOfFile:LoanType.kt$com.ivy.wallet.domain.data.LoanType.kt - NewLineAtEndOfFile:LoanUploader.kt$com.ivy.wallet.domain.deprecated.sync.uploader.LoanUploader.kt NewLineAtEndOfFile:LoanViewModel.kt$com.ivy.wallet.ui.loan.LoanViewModel.kt NewLineAtEndOfFile:LoansAct.kt$com.ivy.wallet.domain.action.loan.LoansAct.kt - NewLineAtEndOfFile:LoansResponse.kt$com.ivy.wallet.io.network.request.loan.LoansResponse.kt NewLineAtEndOfFile:LoansScreen.kt$com.ivy.wallet.ui.loan.LoansScreen.kt - NewLineAtEndOfFile:LogEventRequest.kt$com.ivy.wallet.io.network.request.analytics.LogEventRequest.kt NewLineAtEndOfFile:LogoutLogic.kt$com.ivy.wallet.domain.deprecated.logic.LogoutLogic.kt NewLineAtEndOfFile:MVVMExt.kt$com.ivy.wallet.utils.MVVMExt.kt NewLineAtEndOfFile:MainBottomBar.kt$com.ivy.wallet.ui.main.MainBottomBar.kt @@ -3832,17 +3515,13 @@ NewLineAtEndOfFile:MoreInfo.kt$com.ivy.design.l4_patterns.MoreInfo.kt NewLineAtEndOfFile:MoreMenu.kt$com.ivy.design.l4_patterns.MoreMenu.kt NewLineAtEndOfFile:NameModal.kt$com.ivy.wallet.ui.theme.modal.NameModal.kt - NewLineAtEndOfFile:NetworkError.kt$com.ivy.wallet.io.network.error.NetworkError.kt NewLineAtEndOfFile:NewEditScreenPref.kt$com.ivy.wallet.domain.data.preference.NewEditScreenPref.kt NewLineAtEndOfFile:NotificationService.kt$com.ivy.wallet.android.notification.NotificationService.kt - NewLineAtEndOfFile:NukeService.kt$com.ivy.wallet.io.network.service.NukeService.kt NewLineAtEndOfFile:OnboardingAccounts.kt$com.ivy.wallet.ui.onboarding.steps.OnboardingAccounts.kt NewLineAtEndOfFile:OnboardingCategories.kt$com.ivy.wallet.ui.onboarding.steps.OnboardingCategories.kt NewLineAtEndOfFile:OnboardingComponents.kt$com.ivy.wallet.ui.theme.components.OnboardingComponents.kt NewLineAtEndOfFile:OnboardingPrivacyTC.kt$com.ivy.wallet.ui.onboarding.steps.archived.OnboardingPrivacyTC.kt NewLineAtEndOfFile:OnboardingProgressSlider.kt$com.ivy.wallet.ui.onboarding.components.OnboardingProgressSlider.kt - NewLineAtEndOfFile:OnboardingReport.kt$com.ivy.wallet.ui.analytics.model.OnboardingReport.kt - NewLineAtEndOfFile:OnboardingReportTab.kt$com.ivy.wallet.ui.analytics.tab.OnboardingReportTab.kt NewLineAtEndOfFile:OnboardingRouter.kt$com.ivy.wallet.ui.onboarding.viewmodel.OnboardingRouter.kt NewLineAtEndOfFile:OnboardingScreen.kt$com.ivy.wallet.ui.onboarding.OnboardingScreen.kt NewLineAtEndOfFile:OnboardingSetCurrency.kt$com.ivy.wallet.ui.onboarding.steps.OnboardingSetCurrency.kt @@ -3854,8 +3533,6 @@ NewLineAtEndOfFile:OnboardingViewModel.kt$com.ivy.wallet.ui.onboarding.viewmodel.OnboardingViewModel.kt NewLineAtEndOfFile:OneMoneySteps.kt$com.ivy.wallet.ui.csvimport.flow.instructions.OneMoneySteps.kt NewLineAtEndOfFile:OpResult.kt$com.ivy.wallet.utils.OpResult.kt - NewLineAtEndOfFile:OpenIssueRequest.kt$com.ivy.wallet.io.network.request.github.OpenIssueRequest.kt - NewLineAtEndOfFile:OpenIssueResponse.kt$com.ivy.wallet.io.network.request.github.OpenIssueResponse.kt NewLineAtEndOfFile:OverdueAct.kt$com.ivy.wallet.domain.action.viewmodel.home.OverdueAct.kt NewLineAtEndOfFile:ParseFields.kt$com.ivy.wallet.ui.csv.domain.ParseFields.kt NewLineAtEndOfFile:ParseStatus.kt$com.ivy.wallet.ui.csv.domain.ParseStatus.kt @@ -3870,13 +3547,8 @@ NewLineAtEndOfFile:Plan.kt$com.ivy.wallet.android.billing.Plan.kt NewLineAtEndOfFile:PlanType.kt$com.ivy.wallet.android.billing.PlanType.kt NewLineAtEndOfFile:PlannedPaymentRule.kt$com.ivy.wallet.domain.data.core.PlannedPaymentRule.kt - NewLineAtEndOfFile:PlannedPaymentRuleDTO.kt$com.ivy.wallet.io.network.data.PlannedPaymentRuleDTO.kt NewLineAtEndOfFile:PlannedPaymentRuleDao.kt$com.ivy.wallet.io.persistence.dao.PlannedPaymentRuleDao.kt NewLineAtEndOfFile:PlannedPaymentRuleEntity.kt$com.ivy.wallet.io.persistence.data.PlannedPaymentRuleEntity.kt - NewLineAtEndOfFile:PlannedPaymentRuleService.kt$com.ivy.wallet.io.network.service.PlannedPaymentRuleService.kt - NewLineAtEndOfFile:PlannedPaymentRuleUploader.kt$com.ivy.wallet.domain.deprecated.sync.uploader.PlannedPaymentRuleUploader.kt - NewLineAtEndOfFile:PlannedPaymentRulesResponse.kt$com.ivy.wallet.io.network.request.planned.PlannedPaymentRulesResponse.kt - NewLineAtEndOfFile:PlannedPaymentSync.kt$com.ivy.wallet.domain.deprecated.sync.item.PlannedPaymentSync.kt NewLineAtEndOfFile:PlannedPaymentsBottomBar.kt$com.ivy.wallet.ui.planned.list.PlannedPaymentsBottomBar.kt NewLineAtEndOfFile:PlannedPaymentsGenerator.kt$com.ivy.wallet.domain.deprecated.logic.PlannedPaymentsGenerator.kt NewLineAtEndOfFile:PlannedPaymentsLazyColumn.kt$com.ivy.wallet.ui.planned.list.PlannedPaymentsLazyColumn.kt @@ -3905,9 +3577,6 @@ NewLineAtEndOfFile:ReportScreenEvent.kt$com.ivy.wallet.ui.reports.ReportScreenEvent.kt NewLineAtEndOfFile:ReportScreenState.kt$com.ivy.wallet.ui.reports.ReportScreenState.kt NewLineAtEndOfFile:ReportViewModel.kt$com.ivy.wallet.ui.reports.ReportViewModel.kt - NewLineAtEndOfFile:ResetPasswordRequest.kt$com.ivy.wallet.io.network.request.auth.ResetPasswordRequest.kt - NewLineAtEndOfFile:RestClient.kt$com.ivy.wallet.io.network.RestClient.kt - NewLineAtEndOfFile:RestError.kt$com.ivy.wallet.io.network.error.RestError.kt NewLineAtEndOfFile:RoomTypeConverters.kt$com.ivy.wallet.io.persistence.RoomTypeConverters.kt NewLineAtEndOfFile:RootActivity.kt$com.ivy.wallet.ui.RootActivity.kt NewLineAtEndOfFile:RootViewModel.kt$com.ivy.wallet.ui.RootViewModel.kt @@ -3923,7 +3592,6 @@ NewLineAtEndOfFile:SetPreferenceAct.kt$com.ivy.wallet.domain.action.settings.preference.SetPreferenceAct.kt NewLineAtEndOfFile:Settings.kt$com.ivy.wallet.domain.data.core.Settings.kt NewLineAtEndOfFile:SettingsAct.kt$com.ivy.wallet.domain.action.settings.SettingsAct.kt - NewLineAtEndOfFile:SettingsDTO.kt$com.ivy.wallet.io.network.data.SettingsDTO.kt NewLineAtEndOfFile:SettingsDao.kt$com.ivy.wallet.io.persistence.dao.SettingsDao.kt NewLineAtEndOfFile:SettingsEntity.kt$com.ivy.wallet.io.persistence.data.SettingsEntity.kt NewLineAtEndOfFile:SettingsScreen.kt$com.ivy.wallet.ui.settings.SettingsScreen.kt @@ -3932,8 +3600,6 @@ NewLineAtEndOfFile:SharedPrefs.kt$com.ivy.wallet.io.persistence.SharedPrefs.kt NewLineAtEndOfFile:ShortAmountTest.kt$com.ivy.wallet.ShortAmountTest.kt NewLineAtEndOfFile:ShouldHideBalanceAct.kt$com.ivy.wallet.domain.action.viewmodel.home.ShouldHideBalanceAct.kt - NewLineAtEndOfFile:SignInRequest.kt$com.ivy.wallet.io.network.request.auth.SignInRequest.kt - NewLineAtEndOfFile:SignUpRequest.kt$com.ivy.wallet.io.network.request.auth.SignUpRequest.kt NewLineAtEndOfFile:SmallTrnsPref.kt$com.ivy.wallet.domain.data.preference.SmallTrnsPref.kt NewLineAtEndOfFile:SmartTitleSuggestionsLogic.kt$com.ivy.wallet.domain.deprecated.logic.SmartTitleSuggestionsLogic.kt NewLineAtEndOfFile:SortOrder.kt$com.ivy.wallet.domain.data.SortOrder.kt @@ -3951,7 +3617,6 @@ NewLineAtEndOfFile:Title.kt$com.ivy.wallet.ui.edit.core.Title.kt NewLineAtEndOfFile:Transaction.kt$com.ivy.wallet.domain.data.core.Transaction.kt NewLineAtEndOfFile:TransactionCard.kt$com.ivy.wallet.ui.component.transaction.TransactionCard.kt - NewLineAtEndOfFile:TransactionDTO.kt$com.ivy.wallet.io.network.data.TransactionDTO.kt NewLineAtEndOfFile:TransactionDao.kt$com.ivy.wallet.io.persistence.dao.TransactionDao.kt NewLineAtEndOfFile:TransactionDateTime.kt$com.ivy.wallet.ui.edit.TransactionDateTime.kt NewLineAtEndOfFile:TransactionEntity.kt$com.ivy.wallet.io.persistence.data.TransactionEntity.kt @@ -3960,13 +3625,9 @@ NewLineAtEndOfFile:TransactionReminderLogic.kt$com.ivy.wallet.domain.deprecated.logic.notification.TransactionReminderLogic.kt NewLineAtEndOfFile:TransactionReminderWorker.kt$com.ivy.wallet.domain.deprecated.logic.notification.TransactionReminderWorker.kt NewLineAtEndOfFile:TransactionSectionDivider.kt$com.ivy.wallet.ui.component.transaction.TransactionSectionDivider.kt - NewLineAtEndOfFile:TransactionService.kt$com.ivy.wallet.io.network.service.TransactionService.kt - NewLineAtEndOfFile:TransactionSync.kt$com.ivy.wallet.domain.deprecated.sync.item.TransactionSync.kt NewLineAtEndOfFile:TransactionType.kt$com.ivy.wallet.domain.data.TransactionType.kt - NewLineAtEndOfFile:TransactionUploader.kt$com.ivy.wallet.domain.deprecated.sync.uploader.TransactionUploader.kt NewLineAtEndOfFile:TransactionViewModel.kt$com.ivy.wallet.ui.transaction.TransactionViewModel.kt NewLineAtEndOfFile:TransactionsDividerLine.kt$com.ivy.wallet.ui.component.transaction.TransactionsDividerLine.kt - NewLineAtEndOfFile:TransactionsResponse.kt$com.ivy.wallet.io.network.request.transaction.TransactionsResponse.kt NewLineAtEndOfFile:TrnByIdAct.kt$com.ivy.wallet.domain.action.transaction.TrnByIdAct.kt NewLineAtEndOfFile:TrnDate.kt$com.ivy.wallet.ui.transaction.data.TrnDate.kt NewLineAtEndOfFile:TrnDateDividers.kt$com.ivy.wallet.domain.pure.transaction.TrnDateDividers.kt @@ -3978,28 +3639,16 @@ NewLineAtEndOfFile:TrnsWithRangeAndAccFiltersAct.kt$com.ivy.wallet.domain.action.transaction.TrnsWithRangeAndAccFiltersAct.kt NewLineAtEndOfFile:TypographyExt.kt$com.ivy.design.l0_system.TypographyExt.kt NewLineAtEndOfFile:UIExt.kt$com.ivy.wallet.utils.UIExt.kt - NewLineAtEndOfFile:UUIDSerializer.kt$com.ivy.wallet.backup.kotlinxserilzation.UUIDSerializer.kt + NewLineAtEndOfFile:UUIDSerializer.kt$com.ivy.wallet.ktor.kotlinxserilzation.UUIDSerializer.kt NewLineAtEndOfFile:UiText.kt$com.ivy.wallet.utils.UiText.kt NewLineAtEndOfFile:UpcomingAct.kt$com.ivy.wallet.domain.action.viewmodel.home.UpcomingAct.kt NewLineAtEndOfFile:UpdateAccCacheAct.kt$com.ivy.wallet.domain.action.viewmodel.home.UpdateAccCacheAct.kt - NewLineAtEndOfFile:UpdateAccountRequest.kt$com.ivy.wallet.io.network.request.account.UpdateAccountRequest.kt NewLineAtEndOfFile:UpdateCategoriesCacheAct.kt$com.ivy.wallet.domain.action.viewmodel.home.UpdateCategoriesCacheAct.kt - NewLineAtEndOfFile:UpdateLoanRecordRequest.kt$com.ivy.wallet.io.network.request.loan.UpdateLoanRecordRequest.kt - NewLineAtEndOfFile:UpdateLoanRequest.kt$com.ivy.wallet.io.network.request.loan.UpdateLoanRequest.kt - NewLineAtEndOfFile:UpdatePlannedPaymentRuleRequest.kt$com.ivy.wallet.io.network.request.planned.UpdatePlannedPaymentRuleRequest.kt NewLineAtEndOfFile:UpdateSettingsAct.kt$com.ivy.wallet.domain.action.settings.UpdateSettingsAct.kt NewLineAtEndOfFile:UpdateStartDayOfMonthAct.kt$com.ivy.wallet.domain.action.global.UpdateStartDayOfMonthAct.kt - NewLineAtEndOfFile:UpdateTransactionRequest.kt$com.ivy.wallet.io.network.request.transaction.UpdateTransactionRequest.kt - NewLineAtEndOfFile:UpdateUserInfoRequest.kt$com.ivy.wallet.io.network.request.auth.UpdateUserInfoRequest.kt - NewLineAtEndOfFile:UpdateUserInfoResponse.kt$com.ivy.wallet.io.network.request.auth.UpdateUserInfoResponse.kt - NewLineAtEndOfFile:UpdateWalletCategoryRequest.kt$com.ivy.wallet.io.network.request.category.UpdateWalletCategoryRequest.kt - NewLineAtEndOfFile:UploadTrnToServerAct.kt$com.ivy.wallet.domain.action.viewmodel.transaction.UploadTrnToServerAct.kt NewLineAtEndOfFile:User.kt$com.ivy.wallet.domain.data.core.User.kt - NewLineAtEndOfFile:UserDTO.kt$com.ivy.wallet.io.network.data.UserDTO.kt NewLineAtEndOfFile:UserDao.kt$com.ivy.wallet.io.persistence.dao.UserDao.kt NewLineAtEndOfFile:UserEntity.kt$com.ivy.wallet.io.persistence.data.UserEntity.kt - NewLineAtEndOfFile:UserStats.kt$com.ivy.wallet.ui.analytics.model.UserStats.kt - NewLineAtEndOfFile:UserStatsTab.kt$com.ivy.wallet.ui.analytics.tab.UserStatsTab.kt NewLineAtEndOfFile:UtilExt.kt$com.ivy.wallet.utils.UtilExt.kt NewLineAtEndOfFile:Utils.kt$com.ivy.wallet.domain.pure.util.Utils.kt NewLineAtEndOfFile:Utils.kt$com.ivy.wallet.ui.component.transaction.Utils.kt @@ -4009,7 +3658,6 @@ NewLineAtEndOfFile:WalletBalanceWidgetActions.kt$com.ivy.wallet.ui.widget.WalletBalanceWidgetActions.kt NewLineAtEndOfFile:WalletBalanceWidgetContent.kt$com.ivy.wallet.ui.widget.WalletBalanceWidgetContent.kt NewLineAtEndOfFile:WalletByBudgetBakersSteps.kt$com.ivy.wallet.ui.csvimport.flow.instructions.WalletByBudgetBakersSteps.kt - NewLineAtEndOfFile:WalletCategoriesResponse.kt$com.ivy.wallet.io.network.request.category.WalletCategoriesResponse.kt NewLineAtEndOfFile:WalletCategoryLogic.kt$com.ivy.wallet.domain.deprecated.logic.WalletCategoryLogic.kt NewLineAtEndOfFile:WalletCharts.kt$com.ivy.wallet.domain.pure.charts.WalletCharts.kt NewLineAtEndOfFile:WalletDAOs.kt$com.ivy.wallet.domain.pure.data.WalletDAOs.kt @@ -4018,22 +3666,17 @@ NewLineAtEndOfFile:WidgetBase.kt$com.ivy.wallet.ui.widget.WidgetBase.kt NewLineAtEndOfFile:WrapContentRow.kt$com.ivy.wallet.ui.theme.components.WrapContentRow.kt NewLineAtEndOfFile:ZipUtils.kt$com.ivy.wallet.domain.deprecated.logic.zip.ZipUtils.kt - NewLineAtEndOfFile:dependencies.kt$com.ivy.wallet.buildsrc.dependencies.kt NewLineAtEndOfFile:ivy.lint.gradle.kts$.ivy.lint.gradle.kts NewLineAtEndOfFile:settings.gradle.kts$.settings.gradle.kts NoBlankLineBeforeRbrace:AccountCharts.kt$ NoBlankLineBeforeRbrace:AccountModal.kt$ - NoBlankLineBeforeRbrace:AccountUploader.kt$AccountUploader$ NoBlankLineBeforeRbrace:AddKeywordModal.kt$ NoBlankLineBeforeRbrace:AddPrimaryAttributeButton.kt$ NoBlankLineBeforeRbrace:AmountModal.kt$ - NoBlankLineBeforeRbrace:AppModuleDI.kt$AppModuleDI.<no name provided>$ - NoBlankLineBeforeRbrace:AuthService.kt$AuthService$ NoBlankLineBeforeRbrace:BudgetBattery.kt$ NoBlankLineBeforeRbrace:BudgetBottomBar.kt$ NoBlankLineBeforeRbrace:BudgetModal.kt$ NoBlankLineBeforeRbrace:BudgetScreen.kt$ - NoBlankLineBeforeRbrace:BudgetUploader.kt$BudgetUploader$ NoBlankLineBeforeRbrace:BufferBattery.kt$ NoBlankLineBeforeRbrace:Button.kt$ NoBlankLineBeforeRbrace:ButtonWithIcon.kt$ @@ -4047,7 +3690,6 @@ NoBlankLineBeforeRbrace:CategoryCharts.kt$ NoBlankLineBeforeRbrace:CategoryCreator.kt$CategoryCreator$ NoBlankLineBeforeRbrace:CategoryModal.kt$ - NoBlankLineBeforeRbrace:CategoryUploader.kt$CategoryUploader$ NoBlankLineBeforeRbrace:ChangeTransactionTypeModal.kt$ NoBlankLineBeforeRbrace:ChartsScreen.kt$ NoBlankLineBeforeRbrace:Checkbox.kt$ @@ -4058,7 +3700,6 @@ NoBlankLineBeforeRbrace:CircleButtons.kt$ NoBlankLineBeforeRbrace:CurrencyModal.kt$ NoBlankLineBeforeRbrace:CurrencyPicker.kt$ - NoBlankLineBeforeRbrace:DataCircle.kt$ NoBlankLineBeforeRbrace:Description.kt$ NoBlankLineBeforeRbrace:DescriptionModal.kt$ NoBlankLineBeforeRbrace:EditBottomSheet.kt$ @@ -4067,7 +3708,6 @@ NoBlankLineBeforeRbrace:GesturesExt.kt$ NoBlankLineBeforeRbrace:GitHubBackupViewModel.kt$GitHubBackupViewModel$ NoBlankLineBeforeRbrace:GitHubClient.kt$GitHubClient$ - NoBlankLineBeforeRbrace:GsonTypeAdapters.kt$ErrorCodeTypeAdapter$ NoBlankLineBeforeRbrace:HomeHeader.kt$ NoBlankLineBeforeRbrace:HomeMoreMenu.kt$ NoBlankLineBeforeRbrace:IconButton.kt$ @@ -4091,8 +3731,6 @@ NoBlankLineBeforeRbrace:LoanBottomBar.kt$ NoBlankLineBeforeRbrace:LoanModal.kt$ NoBlankLineBeforeRbrace:LoanRecordModal.kt$ - NoBlankLineBeforeRbrace:LoanRecordUploader.kt$LoanRecordUploader$ - NoBlankLineBeforeRbrace:LoanUploader.kt$LoanUploader$ NoBlankLineBeforeRbrace:LoansScreen.kt$ NoBlankLineBeforeRbrace:MainBottomBar.kt$ NoBlankLineBeforeRbrace:MainViewModel.kt$MainViewModel$ @@ -4114,12 +3752,12 @@ NoBlankLineBeforeRbrace:OnboardingToolbar.kt$ NoBlankLineBeforeRbrace:OnboardingType.kt$ NoBlankLineBeforeRbrace:PaywallLogic.kt$PaywallLogic$ + NoBlankLineBeforeRbrace:PaywallViewModel.kt$PaywallViewModel$ NoBlankLineBeforeRbrace:PeriodSelector.kt$ NoBlankLineBeforeRbrace:PieChart.kt$ NoBlankLineBeforeRbrace:PieChartStatisticScreen.kt$ NoBlankLineBeforeRbrace:Plan.kt$Plan$ NoBlankLineBeforeRbrace:PlannedPaymentCard.kt$ - NoBlankLineBeforeRbrace:PlannedPaymentRuleUploader.kt$PlannedPaymentRuleUploader$ NoBlankLineBeforeRbrace:PlannedPaymentsGenerator.kt$PlannedPaymentsGenerator$ NoBlankLineBeforeRbrace:PreloadDataLogic.kt$PreloadDataLogic$ NoBlankLineBeforeRbrace:RecurringRuleModal.kt$ @@ -4134,7 +3772,6 @@ NoBlankLineBeforeRbrace:TransactionCard.kt$ NoBlankLineBeforeRbrace:TransactionDateTime.kt$ NoBlankLineBeforeRbrace:TransactionSectionDivider.kt$ - NoBlankLineBeforeRbrace:TransactionUploader.kt$TransactionUploader$ NoBlankLineBeforeRbrace:WalletBalanceWidget.kt$WalletBalanceWidget$ NoBlankLineBeforeRbrace:WalletCategoryLogic.kt$WalletCategoryLogic$ NoBlankLineBeforeRbrace:WidgetBase.kt$WidgetBase$ @@ -4153,15 +3790,11 @@ NoConsecutiveBlankLines:Accessorsblypoh2ruc9u3bx9djsfqsntg.kt$ NoConsecutiveBlankLines:Accessorsbtc8iwv8u9b0f38ikfmodj8ns.kt$ NoConsecutiveBlankLines:Accessorseessl0al0otcsbyqqruvoncpd.kt$ - NoConsecutiveBlankLines:AccountDTO.kt$ NoConsecutiveBlankLines:AccountModal.kt$ - NoConsecutiveBlankLines:AccountUploader.kt$AccountUploader$ - NoConsecutiveBlankLines:AccountsResponse.kt$ NoConsecutiveBlankLines:AddPrimaryAttributeButton.kt$ NoConsecutiveBlankLines:AddRateModal.kt$ NoConsecutiveBlankLines:AmountCurrency.kt$ NoConsecutiveBlankLines:AnalyticsEvent.kt$AnalyticsEvent.Companion$ - NoConsecutiveBlankLines:AnalyticsReportScreen.kt$ NoConsecutiveBlankLines:AppLockedScreen.kt$ NoConsecutiveBlankLines:AppModuleDI.kt$AppModuleDI$ NoConsecutiveBlankLines:BackupLogic.kt$ @@ -4172,13 +3805,10 @@ NoConsecutiveBlankLines:BottomNavigationBar.kt$ NoConsecutiveBlankLines:Budget.kt$Budget$ NoConsecutiveBlankLines:BudgetCreator.kt$BudgetCreator$ - NoConsecutiveBlankLines:BudgetDTO.kt$BudgetDTO$ NoConsecutiveBlankLines:BudgetEntity.kt$BudgetEntity$ NoConsecutiveBlankLines:BudgetModal.kt$ NoConsecutiveBlankLines:BudgetScreen.kt$ - NoConsecutiveBlankLines:BudgetUploader.kt$BudgetUploader$ NoConsecutiveBlankLines:BudgetViewModel.kt$BudgetViewModel$ - NoConsecutiveBlankLines:BudgetsResponse.kt$ NoConsecutiveBlankLines:BufferModal.kt$ NoConsecutiveBlankLines:Button.kt$ NoConsecutiveBlankLines:ButtonBack.kt$ @@ -4196,7 +3826,6 @@ NoConsecutiveBlankLines:CategoryCharts.kt$ NoConsecutiveBlankLines:CategoryCreator.kt$CategoryCreator$ NoConsecutiveBlankLines:CategoryModal.kt$ - NoConsecutiveBlankLines:CategoryUploader.kt$CategoryUploader$ NoConsecutiveBlankLines:ChartsScreen.kt$ NoConsecutiveBlankLines:ChartsViewModel.kt$ NoConsecutiveBlankLines:ChartsViewModel.kt$ChartsViewModel$ @@ -4204,14 +3833,11 @@ NoConsecutiveBlankLines:ColorPicker.kt$ NoConsecutiveBlankLines:Colors.kt$ NoConsecutiveBlankLines:ComposeExt.kt$ - NoConsecutiveBlankLines:CrupdateBudgetRequest.kt$ NoConsecutiveBlankLines:CurrencyPicker.kt$ NoConsecutiveBlankLines:CustomExchangeRateCard.kt$ NoConsecutiveBlankLines:CustomerJourneyLogic.kt$ - NoConsecutiveBlankLines:DataCircle.kt$ NoConsecutiveBlankLines:DateExt.kt$ NoConsecutiveBlankLines:DeleteConfirmationModal.kt$ - NoConsecutiveBlankLines:DependencyHandlerExt.kt$ NoConsecutiveBlankLines:DetektConfigurationAccessors.kt$ NoConsecutiveBlankLines:DetektPluginsConfigurationAccessors.kt$ NoConsecutiveBlankLines:DonateModal.kt$ @@ -4281,9 +3907,7 @@ NoConsecutiveBlankLines:LoanModal.kt$ NoConsecutiveBlankLines:LoanRecordCreator.kt$LoanRecordCreator$ NoConsecutiveBlankLines:LoanRecordModal.kt$ - NoConsecutiveBlankLines:LoanRecordUploader.kt$LoanRecordUploader$ NoConsecutiveBlankLines:LoanTransactionsCore.kt$LoanTransactionsCore$ - NoConsecutiveBlankLines:LoanUploader.kt$LoanUploader$ NoConsecutiveBlankLines:LoansScreen.kt$ NoConsecutiveBlankLines:MainBottomBar.kt$ NoConsecutiveBlankLines:MoneyManagerPraseSteps.kt$ @@ -4295,7 +3919,6 @@ NoConsecutiveBlankLines:OnboardingCategories.kt$ NoConsecutiveBlankLines:OnboardingComponents.kt$ NoConsecutiveBlankLines:OnboardingProgressSlider.kt$ - NoConsecutiveBlankLines:OnboardingReportTab.kt$ NoConsecutiveBlankLines:OnboardingRouter.kt$OnboardingRouter$ NoConsecutiveBlankLines:OnboardingSetName.kt$ NoConsecutiveBlankLines:OnboardingSplashLogin.kt$ @@ -4308,9 +3931,6 @@ NoConsecutiveBlankLines:PieChart.kt$ NoConsecutiveBlankLines:PieChart.kt$PieChartView$ NoConsecutiveBlankLines:PieChartStatisticScreen.kt$ - NoConsecutiveBlankLines:PlannedPaymentRuleUploader.kt$PlannedPaymentRuleUploader$ - NoConsecutiveBlankLines:PlannedPaymentRulesResponse.kt$ - NoConsecutiveBlankLines:PlannedPaymentSync.kt$PlannedPaymentSync$ NoConsecutiveBlankLines:PlannedPaymentsLazyColumn.kt$ NoConsecutiveBlankLines:PlannedPaymentsLogic.kt$PlannedPaymentsLogic$ NoConsecutiveBlankLines:PlansSheet.kt$ @@ -4321,11 +3941,11 @@ NoConsecutiveBlankLines:PreviewUtils.kt$ NoConsecutiveBlankLines:PrimaryAttributeColumn.kt$ NoConsecutiveBlankLines:ProgressBar.kt$ + NoConsecutiveBlankLines:Project.kt$ NoConsecutiveBlankLines:RateItem.kt$ NoConsecutiveBlankLines:RecurringRuleModal.kt$ NoConsecutiveBlankLines:ReorderModal.kt$ NoConsecutiveBlankLines:ReorderModal.kt$<no name provided>$ - NoConsecutiveBlankLines:RestClient.kt$RestClient.Companion$ NoConsecutiveBlankLines:RootActivity.kt$ NoConsecutiveBlankLines:RootActivity.kt$RootActivity$ NoConsecutiveBlankLines:RootViewModel.kt$RootViewModel$ @@ -4340,21 +3960,15 @@ NoConsecutiveBlankLines:TransactionCard.kt$ NoConsecutiveBlankLines:TransactionDao.kt$TransactionDao$ NoConsecutiveBlankLines:TransactionDateTime.kt$ - NoConsecutiveBlankLines:TransactionService.kt$TransactionService$ - NoConsecutiveBlankLines:TransactionUploader.kt$TransactionUploader$ NoConsecutiveBlankLines:TransactionsDividerLine.kt$ - NoConsecutiveBlankLines:TransactionsResponse.kt$ NoConsecutiveBlankLines:TrnDateDividers.kt$ NoConsecutiveBlankLines:UIExt.kt$ NoConsecutiveBlankLines:WalletAccountLogic.kt$WalletAccountLogic$ NoConsecutiveBlankLines:WalletBalanceWidget.kt$WalletBalanceWidgetReceiver$ - NoConsecutiveBlankLines:WalletCategoriesResponse.kt$ NoConsecutiveBlankLines:WalletCategoryLogic.kt$WalletCategoryLogic$ NoConsecutiveBlankLines:WalletCharts.kt$ - NoConsecutiveBlankLines:WebViewScreen.kt$ NoConsecutiveBlankLines:WrapContentRow.kt$ NoConsecutiveBlankLines:build.gradle.kts$ - NoConsecutiveBlankLines:dependencies.kt$ NoConsecutiveBlankLines:ivy.lint.gradle.kts$ NoEmptyClassBody:AccountsUpdatedEvent.kt$AccountsUpdatedEvent${ } NoEmptyFirstLineInMethodBlock:AccountCharts.kt$ @@ -4363,7 +3977,6 @@ NoEmptyFirstLineInMethodBlock:AddKeywordModal.kt$ NoEmptyFirstLineInMethodBlock:AddPrimaryAttributeButton.kt$ NoEmptyFirstLineInMethodBlock:AmountModal.kt$ - NoEmptyFirstLineInMethodBlock:AnalyticsReportScreen.kt$ NoEmptyFirstLineInMethodBlock:BudgetBottomBar.kt$ NoEmptyFirstLineInMethodBlock:BudgetModal.kt$ NoEmptyFirstLineInMethodBlock:Button.kt$ @@ -4407,13 +4020,16 @@ NoEmptyFirstLineInMethodBlock:LoanTransactionsLogic.kt$LoanTransactionsLogic$ NoEmptyFirstLineInMethodBlock:LoanViewModel.kt$LoanViewModel$ NoEmptyFirstLineInMethodBlock:LoansScreen.kt$ + NoEmptyFirstLineInMethodBlock:LogoutLogic.kt$LogoutLogic$ NoEmptyFirstLineInMethodBlock:MonthPickerModal.kt$ NoEmptyFirstLineInMethodBlock:NameModal.kt$ NoEmptyFirstLineInMethodBlock:OnboardingPrivacyTC.kt$ + NoEmptyFirstLineInMethodBlock:OnboardingRouter.kt$OnboardingRouter$ NoEmptyFirstLineInMethodBlock:OnboardingSetCurrency.kt$ NoEmptyFirstLineInMethodBlock:OnboardingSetName.kt$ NoEmptyFirstLineInMethodBlock:OnboardingToolbar.kt$ NoEmptyFirstLineInMethodBlock:OnboardingType.kt$ + NoEmptyFirstLineInMethodBlock:PaywallViewModel.kt$PaywallViewModel$ NoEmptyFirstLineInMethodBlock:PeriodSelector.kt$ NoEmptyFirstLineInMethodBlock:PieChartAct.kt$PieChartAct$ NoEmptyFirstLineInMethodBlock:PlannedPaymentCard.kt$ @@ -4458,7 +4074,6 @@ NoUnusedImports:Accessorseessl0al0otcsbyqqruvoncpd.kt$gradle.kotlin.dsl.accessors._6b1cdd1e881959619ea23cf7941079a9.Accessorseessl0al0otcsbyqqruvoncpd.kt NoUnusedImports:DetektConfigurationAccessors.kt$gradle.kotlin.dsl.accessors._6b1cdd1e881959619ea23cf7941079a9.DetektConfigurationAccessors.kt NoUnusedImports:DetektPluginsConfigurationAccessors.kt$gradle.kotlin.dsl.accessors._6b1cdd1e881959619ea23cf7941079a9.DetektPluginsConfigurationAccessors.kt - NoUnusedImports:NotificationService.kt$com.ivy.wallet.android.notification.NotificationService.kt NoWildcardImports:Accessors32ikgp1isdd8mwexzgbe6rirl.kt$import org.gradle.kotlin.dsl.* NoWildcardImports:Accessors32ikgp1isdd8mwexzgbe6rirl.kt$import org.gradle.kotlin.dsl.accessors.runtime.* NoWildcardImports:Accessors46nwrg1rs44ofdqpi7vyy3pfc.kt$import org.gradle.kotlin.dsl.* @@ -4483,24 +4098,16 @@ NoWildcardImports:Accessorsbtc8iwv8u9b0f38ikfmodj8ns.kt$import org.gradle.kotlin.dsl.accessors.runtime.* NoWildcardImports:Accessorseessl0al0otcsbyqqruvoncpd.kt$import org.gradle.kotlin.dsl.* NoWildcardImports:Accessorseessl0al0otcsbyqqruvoncpd.kt$import org.gradle.kotlin.dsl.accessors.runtime.* - NoWildcardImports:AccountService.kt$import retrofit2.http.* NoWildcardImports:AppModuleDI.kt$import com.ivy.wallet.domain.deprecated.logic.* NoWildcardImports:AppModuleDI.kt$import com.ivy.wallet.domain.deprecated.logic.csv.* - NoWildcardImports:AppModuleDI.kt$import com.ivy.wallet.domain.deprecated.sync.item.* - NoWildcardImports:AppModuleDI.kt$import com.ivy.wallet.domain.deprecated.sync.uploader.* - NoWildcardImports:AppModuleDI.kt$import com.ivy.wallet.io.network.* NoWildcardImports:AppModuleDI.kt$import com.ivy.wallet.io.persistence.dao.* - NoWildcardImports:AuthService.kt$import com.ivy.wallet.io.network.request.auth.* NoWildcardImports:BackupLogic.kt$import com.google.gson.* NoWildcardImports:BackupLogic.kt$import com.ivy.wallet.io.persistence.dao.* - NoWildcardImports:BudgetService.kt$import retrofit2.http.* NoWildcardImports:BufferModal.kt$import androidx.compose.runtime.* NoWildcardImports:CSVViewModel.kt$import androidx.compose.runtime.* NoWildcardImports:CSVViewModel.kt$import com.ivy.wallet.ui.csv.domain.* - NoWildcardImports:CategoriesViewModel.kt$import kotlinx.coroutines.* NoWildcardImports:CategoryModal.kt$import androidx.compose.foundation.layout.* NoWildcardImports:CategoryModal.kt$import androidx.compose.runtime.* - NoWildcardImports:CategoryService.kt$import retrofit2.http.* NoWildcardImports:ChooseIconModal.kt$import androidx.compose.foundation.layout.* NoWildcardImports:ChooseIconModal.kt$import androidx.compose.runtime.* NoWildcardImports:ComposeExt.kt$import androidx.compose.runtime.* @@ -4510,19 +4117,14 @@ NoWildcardImports:DetektPluginsConfigurationAccessors.kt$import org.gradle.kotlin.dsl.* NoWildcardImports:DetektPluginsConfigurationAccessors.kt$import org.gradle.kotlin.dsl.accessors.runtime.* NoWildcardImports:Dividers.kt$import androidx.compose.foundation.layout.* - NoWildcardImports:EditPlannedViewModel.kt$import com.ivy.wallet.io.persistence.dao.* NoWildcardImports:ExchangeRatesViewModel.kt$import kotlinx.coroutines.flow.* NoWildcardImports:FileUtil.kt$import java.io.* NoWildcardImports:FromToTimeRange.kt$import com.ivy.wallet.utils.* - NoWildcardImports:HealthTab.kt$import androidx.compose.foundation.layout.* NoWildcardImports:HomeViewModel.kt$import com.ivy.wallet.domain.action.viewmodel.home.* NoWildcardImports:ImportType.kt$import com.ivy.wallet.ui.csvimport.flow.instructions.* NoWildcardImports:ImportType.kt$import com.ivy.wallet.ui.theme.* NoWildcardImports:InputField.kt$import com.ivy.design.l0_system.* NoWildcardImports:InputField.kt$import com.ivy.design.utils.* - NoWildcardImports:ItemStatisticViewModel.kt$import com.ivy.wallet.domain.deprecated.logic.* - NoWildcardImports:ItemStatisticViewModel.kt$import com.ivy.wallet.io.persistence.dao.* - NoWildcardImports:ItemStatisticViewModel.kt$import com.ivy.wallet.utils.* NoWildcardImports:IvyLineChart.kt$import androidx.compose.runtime.* NoWildcardImports:IvyLineChart.kt$import androidx.compose.ui.graphics.* NoWildcardImports:IvyRoomDatabase.kt$import androidx.room.* @@ -4531,41 +4133,28 @@ NoWildcardImports:IvyRoomDatabase.kt$import com.ivy.wallet.io.persistence.migration.* NoWildcardImports:IvySwitch.kt$import androidx.compose.foundation.layout.* NoWildcardImports:IvySwitch.kt$import androidx.compose.runtime.* - NoWildcardImports:IvySync.kt$import com.ivy.wallet.domain.deprecated.sync.item.* NoWildcardImports:IvyToolbar.kt$import androidx.compose.foundation.layout.* NoWildcardImports:IvyViewPager.kt$import androidx.compose.foundation.layout.* NoWildcardImports:IvyViewPager.kt$import androidx.compose.runtime.* NoWildcardImports:IvyWalletCompleteData.kt$import com.ivy.wallet.io.persistence.data.* NoWildcardImports:IvyWalletDesign.kt$import com.ivy.design.l0_system.* - NoWildcardImports:KPIsTab.kt$import androidx.compose.foundation.layout.* - NoWildcardImports:KPIsTab.kt$import com.ivy.wallet.ui.theme.* NoWildcardImports:Keyboard.kt$import androidx.compose.runtime.* NoWildcardImports:LoanDetailsViewModel.kt$import com.ivy.wallet.io.persistence.dao.* - NoWildcardImports:LoanService.kt$import com.ivy.wallet.io.network.request.loan.* - NoWildcardImports:LoanService.kt$import retrofit2.http.* - NoWildcardImports:LoanTransactionsCore.kt$import com.ivy.wallet.domain.data.core.* - NoWildcardImports:LoanTransactionsCore.kt$import com.ivy.wallet.io.persistence.dao.* NoWildcardImports:MainScreen.kt$import androidx.compose.runtime.* NoWildcardImports:MainScreen.kt$import com.ivy.wallet.ui.* - NoWildcardImports:OnboardingReportTab.kt$import androidx.compose.foundation.layout.* - NoWildcardImports:OnboardingReportTab.kt$import com.ivy.wallet.ui.theme.* NoWildcardImports:OnboardingScreen.kt$import com.ivy.wallet.ui.onboarding.steps.* NoWildcardImports:PieChart.kt$import androidx.compose.foundation.layout.* NoWildcardImports:PieChart.kt$import com.ivy.wallet.ui.theme.* - NoWildcardImports:PlannedPaymentRuleService.kt$import retrofit2.http.* NoWildcardImports:PreloadDataLogic.kt$import com.ivy.wallet.ui.theme.* NoWildcardImports:ProgressBar.kt$import com.ivy.wallet.ui.theme.* NoWildcardImports:ReorderModal.kt$import androidx.compose.foundation.layout.* NoWildcardImports:ReorderModal.kt$import androidx.compose.runtime.* NoWildcardImports:ReorderModal.kt$import androidx.recyclerview.widget.ItemTouchHelper.* NoWildcardImports:ReportViewModel.kt$import com.ivy.wallet.utils.* - NoWildcardImports:RestClient.kt$import com.ivy.wallet.io.network.service.* NoWildcardImports:Spacers.kt$import androidx.compose.foundation.layout.* NoWildcardImports:Switch.kt$import androidx.compose.foundation.layout.* NoWildcardImports:Switch.kt$import androidx.compose.runtime.* NoWildcardImports:TimePeriod.kt$import com.ivy.wallet.utils.* - NoWildcardImports:TransactionService.kt$import retrofit2.http.* - NoWildcardImports:UserStatsTab.kt$import androidx.compose.foundation.layout.* NoWildcardImports:ViewPager.kt$import androidx.compose.runtime.* NoWildcardImports:WalletBalanceWidgetContent.kt$import androidx.glance.layout.* NoWildcardImports:ZipUtils.kt$import java.io.* @@ -4626,7 +4215,7 @@ PackageName:MoreMenu.kt$package com.ivy.design.l4_patterns PackageName:Onboarding.kt$package com.ivy.design.l5_concept PackageName:PieChart.kt$package com.ivy.design.l3_ivyComponents.chart - PackageName:PluginSpecBuilders.kt$package gradle.kotlin.dsl.plugins._fe0b42ce1102c239397a785329863d5f + PackageName:PluginSpecBuilders.kt$package gradle.kotlin.dsl.plugins._d8ce7e1eb297c7048a8eb5871cef1469 PackageName:ProgressBar.kt$package com.ivy.design.l3_ivyComponents.percentage PackageName:ReorderModal.kt$package com.ivy.design.l4_patterns PackageName:ScreenTitle.kt$package com.ivy.design.l3_ivyComponents @@ -4693,7 +4282,7 @@ PackageNaming:MoreMenu.kt$package com.ivy.design.l4_patterns PackageNaming:Onboarding.kt$package com.ivy.design.l5_concept PackageNaming:PieChart.kt$package com.ivy.design.l3_ivyComponents.chart - PackageNaming:PluginSpecBuilders.kt$package gradle.kotlin.dsl.plugins._fe0b42ce1102c239397a785329863d5f + PackageNaming:PluginSpecBuilders.kt$package gradle.kotlin.dsl.plugins._d8ce7e1eb297c7048a8eb5871cef1469 PackageNaming:ProgressBar.kt$package com.ivy.design.l3_ivyComponents.percentage PackageNaming:ReorderModal.kt$package com.ivy.design.l4_patterns PackageNaming:ScreenTitle.kt$package com.ivy.design.l3_ivyComponents @@ -4711,19 +4300,12 @@ ParameterListWrapping:DetektConfigurationAccessors.kt$(constraintNotation: Any, block: DependencyConstraint.() -> Unit) ParameterListWrapping:DetektPluginsConfigurationAccessors.kt$(constraintNotation: Any, block: DependencyConstraint.() -> Unit) ParameterListWrapping:TransactionReminderWorker.kt$TransactionReminderWorker$( @Assisted appContext: Context, @Assisted params: WorkerParameters, private val transactionDao: TransactionDao, private val notificationService: NotificationService, private val sharedPrefs: SharedPrefs, ) - PrintStackTrace:AccountSync.kt$AccountSync$e - PrintStackTrace:AccountUploader.kt$AccountUploader$e PrintStackTrace:Budget.kt$Budget$e PrintStackTrace:BudgetCreator.kt$BudgetCreator$e - PrintStackTrace:BudgetDTO.kt$BudgetDTO$e PrintStackTrace:BudgetEntity.kt$BudgetEntity$e - PrintStackTrace:BudgetSync.kt$BudgetSync$e - PrintStackTrace:BudgetUploader.kt$BudgetUploader$e PrintStackTrace:CSVImporter.kt$CSVImporter$e PrintStackTrace:CSVViewModel.kt$CSVViewModel$e PrintStackTrace:CategoryCreator.kt$CategoryCreator$e - PrintStackTrace:CategorySync.kt$CategorySync$e - PrintStackTrace:CategoryUploader.kt$CategoryUploader$e PrintStackTrace:EditTransactionViewModel.kt$EditTransactionViewModel$e PrintStackTrace:ExportCSVLogic.kt$ExportCSVLogic$e PrintStackTrace:FileUtil.kt$e @@ -4732,18 +4314,10 @@ PrintStackTrace:Keyboard.kt$e PrintStackTrace:LoanCreator.kt$LoanCreator$e PrintStackTrace:LoanRecordCreator.kt$LoanRecordCreator$e - PrintStackTrace:LoanRecordSync.kt$LoanRecordSync$e - PrintStackTrace:LoanRecordUploader.kt$LoanRecordUploader$e - PrintStackTrace:LoanSync.kt$LoanSync$e - PrintStackTrace:LoanUploader.kt$LoanUploader$e PrintStackTrace:MigrationsManager.kt$MigrationsManager$e PrintStackTrace:NotificationService.kt$NotificationService$e - PrintStackTrace:PlannedPaymentRuleUploader.kt$PlannedPaymentRuleUploader$e - PrintStackTrace:PlannedPaymentSync.kt$PlannedPaymentSync$e PrintStackTrace:RootActivity.kt$RootActivity$e PrintStackTrace:SyncExchangeRatesAct.kt$SyncExchangeRatesAct$e - PrintStackTrace:TransactionSync.kt$TransactionSync$e - PrintStackTrace:TransactionUploader.kt$TransactionUploader$e PrintStackTrace:UIExt.kt$e ReturnCount:CSVImporter.kt$CSVImporter$private fun mapDate( rowMapping: RowMapping, dateString: String? ): LocalDateTime? ReturnCount:CSVImporter.kt$CSVImporter$private fun mapType( row: List<String>, rowMapping: RowMapping ): TransactionType? @@ -4778,13 +4352,11 @@ SpacingAroundComma:IvyWalletDesign.kt$IvyWalletDesign$, SpacingAroundComma:PlannedPaymentCard.kt$, SpacingAroundCurly:ItemStatisticScreen.kt${ - SpacingAroundCurly:ItemStatisticViewModel.kt$ItemStatisticViewModel${ SpacingAroundCurly:PlannedPaymentsLogic.kt$PlannedPaymentsLogic${ SpacingAroundCurly:ReportViewModel.kt$ReportViewModel${ SpacingAroundKeyword:ExportCSVLogic.kt$ExportCSVLogic$when SpacingAroundKeyword:IvyWalletDesign.kt$IvyWalletDesign$if SpacingAroundKeyword:OnboardingAccounts.kt$if - SpacingAroundParens:AppModuleDI.kt$AppModuleDI$( SpacingAroundParens:IvyBilling.kt$IvyBilling$( SpreadOperator:UiText.kt$UiText$(resId, *args) StringTemplate:AccountModal.kt$${currencyName} @@ -4810,70 +4382,46 @@ SwallowedException:CSVViewModel.kt$CSVViewModel$e: Exception SwallowedException:CalculatorModal.kt$e: Exception SwallowedException:ComposeExt.kt$e: Exception - SwallowedException:GsonTypeAdapters.kt$ErrorCodeTypeAdapter$e: Exception - SwallowedException:GsonTypeAdapters.kt$LocalDateTimeTypeAdapter$e: Exception SwallowedException:IntervalPickerRow.kt$e: Exception SwallowedException:ItemIcon.kt$e: Exception SwallowedException:Ivy_lintPlugin.kt$Ivy_lintPlugin$e: java.lang.reflect.InvocationTargetException SwallowedException:ParseFields.kt$e: Exception SwallowedException:ParseStatus.kt$e: Exception SwallowedException:Plan.kt$Plan$e: Exception - SwallowedException:RestClient.kt$RestClient.Companion$e: NoSessionException SwallowedException:RootActivity.kt$RootActivity$e: ActivityNotFoundException SwallowedException:RootViewModel.kt$RootViewModel$e: IllegalArgumentException - ThrowsCount:RestClient.kt$RestClient.Companion$private fun newRetrofit(gson: Gson, session: IvySession): Retrofit - TooGenericExceptionCaught:AccountSync.kt$AccountSync$e: Exception - TooGenericExceptionCaught:AccountUploader.kt$AccountUploader$e: Exception TooGenericExceptionCaught:AmountModal.kt$e: Exception - TooGenericExceptionCaught:AnalyticsReportViewModel.kt$AnalyticsReportViewModel$e: Exception TooGenericExceptionCaught:BackupLogic.kt$BackupLogic$e: Exception TooGenericExceptionCaught:Budget.kt$Budget$e: Exception TooGenericExceptionCaught:BudgetCreator.kt$BudgetCreator$e: Exception - TooGenericExceptionCaught:BudgetDTO.kt$BudgetDTO$e: Exception TooGenericExceptionCaught:BudgetEntity.kt$BudgetEntity$e: Exception - TooGenericExceptionCaught:BudgetSync.kt$BudgetSync$e: Exception - TooGenericExceptionCaught:BudgetUploader.kt$BudgetUploader$e: Exception TooGenericExceptionCaught:CSVImporter.kt$CSVImporter$e: Exception TooGenericExceptionCaught:CSVImporterV2.kt$CSVImporterV2$e: Exception TooGenericExceptionCaught:CSVViewModel.kt$CSVViewModel$e: Exception TooGenericExceptionCaught:CalculatorModal.kt$e: Exception TooGenericExceptionCaught:CategoryCreator.kt$CategoryCreator$e: Exception - TooGenericExceptionCaught:CategorySync.kt$CategorySync$e: Exception - TooGenericExceptionCaught:CategoryUploader.kt$CategoryUploader$e: Exception TooGenericExceptionCaught:ComposeExt.kt$e: Exception TooGenericExceptionCaught:EditPlannedViewModel.kt$EditPlannedViewModel$e: Exception TooGenericExceptionCaught:EditTransactionViewModel.kt$EditTransactionViewModel$e: Exception TooGenericExceptionCaught:ExportCSVLogic.kt$ExportCSVLogic$e: Exception TooGenericExceptionCaught:GitHubClient.kt$GitHubClient$e: Exception - TooGenericExceptionCaught:GsonTypeAdapters.kt$ErrorCodeTypeAdapter$e: Exception - TooGenericExceptionCaught:GsonTypeAdapters.kt$LocalDateTimeTypeAdapter$e: Exception TooGenericExceptionCaught:ImportViewModel.kt$ImportViewModel$e: Exception TooGenericExceptionCaught:IntervalPickerRow.kt$e: Exception TooGenericExceptionCaught:ItemIcon.kt$e: Exception - TooGenericExceptionCaught:IvyAnalytics.kt$IvyAnalytics$e: Exception TooGenericExceptionCaught:IvyBilling.kt$IvyBilling$e: Exception TooGenericExceptionCaught:IvyCurrency.kt$IvyCurrency.Companion$e: Exception TooGenericExceptionCaught:Keyboard.kt$e: Exception TooGenericExceptionCaught:LoanCreator.kt$LoanCreator$e: Exception TooGenericExceptionCaught:LoanRecordCreator.kt$LoanRecordCreator$e: Exception - TooGenericExceptionCaught:LoanRecordSync.kt$LoanRecordSync$e: Exception - TooGenericExceptionCaught:LoanRecordUploader.kt$LoanRecordUploader$e: Exception - TooGenericExceptionCaught:LoanSync.kt$LoanSync$e: Exception - TooGenericExceptionCaught:LoanUploader.kt$LoanUploader$e: Exception TooGenericExceptionCaught:MigrationsManager.kt$MigrationsManager$e: Exception TooGenericExceptionCaught:NotificationService.kt$NotificationService$e: Exception TooGenericExceptionCaught:OnboardingViewModel.kt$OnboardingViewModel$e: Exception TooGenericExceptionCaught:ParseFields.kt$e: Exception TooGenericExceptionCaught:ParseStatus.kt$e: Exception TooGenericExceptionCaught:Plan.kt$Plan$e: Exception - TooGenericExceptionCaught:PlannedPaymentRuleUploader.kt$PlannedPaymentRuleUploader$e: Exception - TooGenericExceptionCaught:PlannedPaymentSync.kt$PlannedPaymentSync$e: Exception - TooGenericExceptionCaught:RestClient.kt$RestClient.Companion$exception: Exception TooGenericExceptionCaught:RootActivity.kt$RootActivity$e: Exception TooGenericExceptionCaught:SettingsViewModel.kt$SettingsViewModel$e: Exception TooGenericExceptionCaught:SyncExchangeRatesAct.kt$SyncExchangeRatesAct$e: Exception - TooGenericExceptionCaught:TransactionSync.kt$TransactionSync$e: Exception - TooGenericExceptionCaught:TransactionUploader.kt$TransactionUploader$e: Exception TooGenericExceptionCaught:UIExt.kt$e: Exception TooManyFunctions:AmountFormatting.kt$com.ivy.wallet.utils.AmountFormatting.kt TooManyFunctions:AppModuleDI.kt$AppModuleDI @@ -5178,7 +4726,6 @@ UnusedParameter:AccountsTab.kt$onLongClick: () -> Unit UnusedParameter:AccountsTab.kt$screen: Main UnusedParameter:AccountsViewModel.kt$AccountsViewModel$event: AccountsUpdatedEvent - UnusedParameter:AnalyticsReportScreen.kt$screen: AnalyticsReport UnusedParameter:BalanceScreen.kt$screen: BalanceScreen UnusedParameter:BudgetScreen.kt$screen: BudgetScreen UnusedParameter:CategoriesScreen.kt$onLongClick: () -> Unit @@ -5210,15 +4757,17 @@ UnusedParameter:IvyLineChart.kt$cellSize: Float UnusedParameter:IvyLineChart.kt$chartWidth: Float UnusedParameter:IvyLineChart.kt$offsetRight: Float - UnusedParameter:KPIsTab.kt$activeUsersCount: Int UnusedParameter:LoanDetailsScreen.kt$baseCurrency: String = "" UnusedParameter:LoanDetailsScreen.kt$loanRecords: List<LoanRecord> = emptyList() UnusedParameter:LoansScreen.kt$screen: Loans UnusedParameter:OnboardingSplashLogin.kt$onLoginWithGoogle: () -> Unit UnusedParameter:OnboardingSplashLogin.kt$opGoogleSignIn: OpResult<Unit>? + UnusedParameter:OnboardingViewModel.kt$OnboardingViewModel$idToken: String UnusedParameter:ParseFields.kt$metadata: Unit UnusedParameter:PaywallScreen.kt$paywallReason: PaywallReason? + UnusedParameter:PaywallViewModel.kt$PaywallViewModel$plan: Plan? UnusedParameter:PlannedPaymentsLazyColumn.kt$listState: LazyListState + UnusedParameter:PlannedPaymentsLogic.kt$PlannedPaymentsLogic$syncTransaction: Boolean = true UnusedParameter:PlannedPaymentsViewModel.kt$PlannedPaymentsViewModel$screen: PlannedPayments UnusedParameter:ReportScreen.kt$screen: Report UnusedParameter:SearchScreen.kt$screen: Search @@ -5345,7 +4894,6 @@ UnusedPrivateMember:OnboardingCategories.kt$@ExperimentalFoundationApi @Preview @Composable private fun Preview_Premium() UnusedPrivateMember:OnboardingComponents.kt$@Preview @Composable private fun PreviewOnboardingButton() UnusedPrivateMember:OnboardingComponents.kt$@Preview @Composable private fun PreviewOnboardingTextField() - UnusedPrivateMember:OnboardingReportTab.kt$@Composable private fun PrivacyTCorSetName( report: OnboardingReport ) UnusedPrivateMember:OnboardingScreen.kt$@ExperimentalFoundationApi @Preview @Composable private fun PreviewOnboarding() UnusedPrivateMember:OnboardingSplashLogin.kt$@Composable private fun LoginWithGoogleExplanation() UnusedPrivateMember:PieChartStatisticBottomBar.kt$@Preview @Composable private fun PreviewBottomBar() @@ -5389,38 +4937,22 @@ UnusedPrivateMember:TransactionViewModel.kt$TransactionViewModel$private fun isEditMode(): Boolean UnusedPrivateMember:TransactionViewModel.kt$TransactionViewModel$private suspend fun createNewTransaction(state: TrnState.NewTransaction) UnusedPrivateMember:WrapContentRow.kt$@Preview @Composable private fun PreviewWrapContentRow() + UnusedPrivateProperty:AccountCreator.kt$AccountCreator$val newAccount = ioThread { val account = Account( name = name, currency = data.currency, color = data.color.toArgb(), icon = data.icon, includeInBalance = data.includeBalance, orderNum = accountDao.findMaxOrderNum().nextOrderNum(), isSynced = false ) accountDao.save(account.toEntity()) accountLogic.adjustBalance( account = account, actualBalance = 0.0, newBalance = data.balance ) account } UnusedPrivateProperty:AccountModal.kt$val context = LocalContext.current UnusedPrivateProperty:AccountsViewModel.kt$AccountsViewModel$private val settingsDao: SettingsDao UnusedPrivateProperty:AccountsViewModel.kt$AccountsViewModel$private val walletDAOs: WalletDAOs - UnusedPrivateProperty:AppModuleDI.kt$AppModuleDI.<no name provided>$i - UnusedPrivateProperty:BudgetViewModel.kt$BudgetViewModel$private val accountDao: AccountDao - UnusedPrivateProperty:BudgetViewModel.kt$BudgetViewModel$private val categoryDao: CategoryDao - UnusedPrivateProperty:BudgetViewModel.kt$BudgetViewModel$private val settingsDao: SettingsDao UnusedPrivateProperty:CategoryCharts.kt$val value = functions.getOrNull(it.functionIndex)?.values?.get(it.valueIndex) ?: return@let UnusedPrivateProperty:ChartsViewModel.kt$ChartsViewModel$private val categoryDao: CategoryDao UnusedPrivateProperty:ChartsViewModel.kt$ChartsViewModel$private val settingsDao: SettingsDao UnusedPrivateProperty:DateExt.kt$val seconds = TimeUnit.MILLISECONDS.toSeconds(timeLeftAfterCalculations) - UnusedPrivateProperty:EditPlannedViewModel.kt$EditPlannedViewModel$private val ivyContext: IvyWalletCtx - UnusedPrivateProperty:EditTransactionViewModel.kt$EditTransactionViewModel$private val accountDao: AccountDao - UnusedPrivateProperty:EditTransactionViewModel.kt$EditTransactionViewModel$private val categoryDao: CategoryDao - UnusedPrivateProperty:EditTransactionViewModel.kt$EditTransactionViewModel$private val ivyContext: IvyWalletCtx - UnusedPrivateProperty:ExchangeRatesLogic.kt$ExchangeRatesLogic$restClient: RestClient UnusedPrivateProperty:HomeTab.kt$val nav = navigation() UnusedPrivateProperty:HomeViewModel.kt$HomeViewModel$private val exchangeRatesLogic: ExchangeRatesLogic - UnusedPrivateProperty:ItemStatisticViewModel.kt$ItemStatisticViewModel$private val exchangeRateDao: ExchangeRateDao - UnusedPrivateProperty:ItemStatisticViewModel.kt$ItemStatisticViewModel$private val exchangeRatesLogic: ExchangeRatesLogic - UnusedPrivateProperty:ItemStatisticViewModel.kt$ItemStatisticViewModel$private val settingsDao: SettingsDao - UnusedPrivateProperty:ItemStatisticViewModel.kt$ItemStatisticViewModel$private val walletDAOs: WalletDAOs UnusedPrivateProperty:IvyBilling.kt$IvyBilling.Companion$private const val LIFETIME_V1 = "ivy_wallet_lifetime_v1" UnusedPrivateProperty:IvyLineChart.kt$val marginFromX = 4.dp.toPx() UnusedPrivateProperty:LoanDetailsViewModel.kt$LoanDetailsViewModel$private val accountDao: AccountDao UnusedPrivateProperty:LoanDetailsViewModel.kt$LoanDetailsViewModel$private val ivyContext: IvyWalletCtx UnusedPrivateProperty:LoanDetailsViewModel.kt$LoanDetailsViewModel$private val loanDao: LoanDao - UnusedPrivateProperty:LoanViewModel.kt$LoanViewModel$private val accountDao: AccountDao - UnusedPrivateProperty:LoanViewModel.kt$LoanViewModel$private val categoriesAct: CategoriesAct - UnusedPrivateProperty:MainViewModel.kt$MainViewModel$private val exchangeRatesLogic: ExchangeRatesLogic - UnusedPrivateProperty:OnboardingRouter.kt$OnboardingRouter$private val exchangeRatesLogic: ExchangeRatesLogic - UnusedPrivateProperty:OnboardingRouter.kt$OnboardingRouter$private val ivyContext: IvyWalletCtx + UnusedPrivateProperty:OnboardingViewModel.kt$OnboardingViewModel$exchangeRatesLogic: ExchangeRatesLogic UnusedPrivateProperty:PlannedPaymentsViewModel.kt$PlannedPaymentsViewModel$private val accountDao: AccountDao UnusedPrivateProperty:PlannedPaymentsViewModel.kt$PlannedPaymentsViewModel$private val categoryDao: CategoryDao UnusedPrivateProperty:ReportScreen.kt$val ivyContext = ivyWalletCtx() @@ -5428,12 +4960,10 @@ UnusedPrivateProperty:ReportViewModel.kt$ReportViewModel$private val settingsDao: SettingsDao UnusedPrivateProperty:SearchScreen.kt$val ivyContext = ivyWalletCtx() UnusedPrivateProperty:SearchScreen.kt$val nav = navigation() - UnusedPrivateProperty:SettingsViewModel.kt$SettingsViewModel$private val exchangeRatesLogic: ExchangeRatesLogic + UnusedPrivateProperty:SettingsViewModel.kt$SettingsViewModel$private val nav: Navigation + UnusedPrivateProperty:SettingsViewModel.kt$SettingsViewModel$private val userDao: UserDao UnusedPrivateProperty:TransactionReminderLogic.kt$TransactionReminderLogic.Companion$private const val UNIQUE_WORK_NAME_V1 = "transaction_reminder_work" UnusedPrivateProperty:TransactionViewModel.kt$TransactionViewModel$private val saveTrnLocallyAct: SaveTrnLocallyAct - UnusedPrivateProperty:UploadTrnToServerAct.kt$UploadTrnToServerAct$private val dao: TransactionDao - UnusedPrivateProperty:UploadTrnToServerAct.kt$UploadTrnToServerAct$private val ivySession: IvySession - UnusedPrivateProperty:UploadTrnToServerAct.kt$UploadTrnToServerAct$private val service = restClient.transactionService UnusedPrivateProperty:WalletAccountLogic.kt$WalletAccountLogic$private val accountDao: AccountDao UnusedPrivateProperty:WalletAccountLogic.kt$WalletAccountLogic$private val exchangeRatesLogic: ExchangeRatesLogic UnusedPrivateProperty:WalletAccountLogic.kt$WalletAccountLogic$private val settingsDao: SettingsDao @@ -5445,7 +4975,6 @@ ViewModelForwarding:GitHubBackupCard.kt$GitHubBackupStatus(viewModel) ViewModelForwarding:GitHubBackupCard.kt$LastBackup(viewModel) ViewModelInjection:AccountsTab.kt$viewModel - ViewModelInjection:AnalyticsReportScreen.kt$viewModel ViewModelInjection:BalanceScreen.kt$viewModel ViewModelInjection:BudgetScreen.kt$viewModel ViewModelInjection:CSVScreen.kt$onboardingViewModel @@ -5498,24 +5027,16 @@ WildcardImport:Accessorsbtc8iwv8u9b0f38ikfmodj8ns.kt$import org.gradle.kotlin.dsl.accessors.runtime.* WildcardImport:Accessorseessl0al0otcsbyqqruvoncpd.kt$import org.gradle.kotlin.dsl.* WildcardImport:Accessorseessl0al0otcsbyqqruvoncpd.kt$import org.gradle.kotlin.dsl.accessors.runtime.* - WildcardImport:AccountService.kt$import retrofit2.http.* WildcardImport:AppModuleDI.kt$import com.ivy.wallet.domain.deprecated.logic.* WildcardImport:AppModuleDI.kt$import com.ivy.wallet.domain.deprecated.logic.csv.* - WildcardImport:AppModuleDI.kt$import com.ivy.wallet.domain.deprecated.sync.item.* - WildcardImport:AppModuleDI.kt$import com.ivy.wallet.domain.deprecated.sync.uploader.* - WildcardImport:AppModuleDI.kt$import com.ivy.wallet.io.network.* WildcardImport:AppModuleDI.kt$import com.ivy.wallet.io.persistence.dao.* - WildcardImport:AuthService.kt$import com.ivy.wallet.io.network.request.auth.* WildcardImport:BackupLogic.kt$import com.google.gson.* WildcardImport:BackupLogic.kt$import com.ivy.wallet.io.persistence.dao.* - WildcardImport:BudgetService.kt$import retrofit2.http.* WildcardImport:BufferModal.kt$import androidx.compose.runtime.* WildcardImport:CSVViewModel.kt$import androidx.compose.runtime.* WildcardImport:CSVViewModel.kt$import com.ivy.wallet.ui.csv.domain.* - WildcardImport:CategoriesViewModel.kt$import kotlinx.coroutines.* WildcardImport:CategoryModal.kt$import androidx.compose.foundation.layout.* WildcardImport:CategoryModal.kt$import androidx.compose.runtime.* - WildcardImport:CategoryService.kt$import retrofit2.http.* WildcardImport:ChooseIconModal.kt$import androidx.compose.foundation.layout.* WildcardImport:ChooseIconModal.kt$import androidx.compose.runtime.* WildcardImport:ComposeExt.kt$import androidx.compose.runtime.* @@ -5525,19 +5046,14 @@ WildcardImport:DetektPluginsConfigurationAccessors.kt$import org.gradle.kotlin.dsl.* WildcardImport:DetektPluginsConfigurationAccessors.kt$import org.gradle.kotlin.dsl.accessors.runtime.* WildcardImport:Dividers.kt$import androidx.compose.foundation.layout.* - WildcardImport:EditPlannedViewModel.kt$import com.ivy.wallet.io.persistence.dao.* WildcardImport:ExchangeRatesViewModel.kt$import kotlinx.coroutines.flow.* WildcardImport:FileUtil.kt$import java.io.* WildcardImport:FromToTimeRange.kt$import com.ivy.wallet.utils.* - WildcardImport:HealthTab.kt$import androidx.compose.foundation.layout.* WildcardImport:HomeViewModel.kt$import com.ivy.wallet.domain.action.viewmodel.home.* WildcardImport:ImportType.kt$import com.ivy.wallet.ui.csvimport.flow.instructions.* WildcardImport:ImportType.kt$import com.ivy.wallet.ui.theme.* WildcardImport:InputField.kt$import com.ivy.design.l0_system.* WildcardImport:InputField.kt$import com.ivy.design.utils.* - WildcardImport:ItemStatisticViewModel.kt$import com.ivy.wallet.domain.deprecated.logic.* - WildcardImport:ItemStatisticViewModel.kt$import com.ivy.wallet.io.persistence.dao.* - WildcardImport:ItemStatisticViewModel.kt$import com.ivy.wallet.utils.* WildcardImport:IvyLineChart.kt$import androidx.compose.runtime.* WildcardImport:IvyLineChart.kt$import androidx.compose.ui.graphics.* WildcardImport:IvyRoomDatabase.kt$import androidx.room.* @@ -5546,41 +5062,28 @@ WildcardImport:IvyRoomDatabase.kt$import com.ivy.wallet.io.persistence.migration.* WildcardImport:IvySwitch.kt$import androidx.compose.foundation.layout.* WildcardImport:IvySwitch.kt$import androidx.compose.runtime.* - WildcardImport:IvySync.kt$import com.ivy.wallet.domain.deprecated.sync.item.* WildcardImport:IvyToolbar.kt$import androidx.compose.foundation.layout.* WildcardImport:IvyViewPager.kt$import androidx.compose.foundation.layout.* WildcardImport:IvyViewPager.kt$import androidx.compose.runtime.* WildcardImport:IvyWalletCompleteData.kt$import com.ivy.wallet.io.persistence.data.* WildcardImport:IvyWalletDesign.kt$import com.ivy.design.l0_system.* - WildcardImport:KPIsTab.kt$import androidx.compose.foundation.layout.* - WildcardImport:KPIsTab.kt$import com.ivy.wallet.ui.theme.* WildcardImport:Keyboard.kt$import androidx.compose.runtime.* WildcardImport:LoanDetailsViewModel.kt$import com.ivy.wallet.io.persistence.dao.* - WildcardImport:LoanService.kt$import com.ivy.wallet.io.network.request.loan.* - WildcardImport:LoanService.kt$import retrofit2.http.* - WildcardImport:LoanTransactionsCore.kt$import com.ivy.wallet.domain.data.core.* - WildcardImport:LoanTransactionsCore.kt$import com.ivy.wallet.io.persistence.dao.* WildcardImport:MainScreen.kt$import androidx.compose.runtime.* WildcardImport:MainScreen.kt$import com.ivy.wallet.ui.* - WildcardImport:OnboardingReportTab.kt$import androidx.compose.foundation.layout.* - WildcardImport:OnboardingReportTab.kt$import com.ivy.wallet.ui.theme.* WildcardImport:OnboardingScreen.kt$import com.ivy.wallet.ui.onboarding.steps.* WildcardImport:PieChart.kt$import androidx.compose.foundation.layout.* WildcardImport:PieChart.kt$import com.ivy.wallet.ui.theme.* - WildcardImport:PlannedPaymentRuleService.kt$import retrofit2.http.* WildcardImport:PreloadDataLogic.kt$import com.ivy.wallet.ui.theme.* WildcardImport:ProgressBar.kt$import com.ivy.wallet.ui.theme.* WildcardImport:ReorderModal.kt$import androidx.compose.foundation.layout.* WildcardImport:ReorderModal.kt$import androidx.compose.runtime.* WildcardImport:ReorderModal.kt$import androidx.recyclerview.widget.ItemTouchHelper.* WildcardImport:ReportViewModel.kt$import com.ivy.wallet.utils.* - WildcardImport:RestClient.kt$import com.ivy.wallet.io.network.service.* WildcardImport:Spacers.kt$import androidx.compose.foundation.layout.* WildcardImport:Switch.kt$import androidx.compose.foundation.layout.* WildcardImport:Switch.kt$import androidx.compose.runtime.* WildcardImport:TimePeriod.kt$import com.ivy.wallet.utils.* - WildcardImport:TransactionService.kt$import retrofit2.http.* - WildcardImport:UserStatsTab.kt$import androidx.compose.foundation.layout.* WildcardImport:ViewPager.kt$import androidx.compose.runtime.* WildcardImport:WalletBalanceWidgetContent.kt$import androidx.glance.layout.* WildcardImport:ZipUtils.kt$import java.io.* @@ -5604,7 +5107,6 @@ Wrapping:LoanModal.kt$( Wrapping:LoanRecordModal.kt$( Wrapping:PlannedPaymentsLogic.kt$PlannedPaymentsLogic$-> - Wrapping:RestClient.kt$RestClient.Companion$( Wrapping:RootActivity.kt$RootActivity$( Intent().apply { action = Intent.ACTION_SEND putExtra(Intent.EXTRA_STREAM, fileUri) type = "application/zip" }, null ) Wrapping:RootActivity.kt$RootActivity$( Intent().apply { action = Intent.ACTION_SEND putExtra(Intent.EXTRA_STREAM, fileUri) type = "text/csv" }, null ) Wrapping:RootActivity.kt$RootActivity$( Intent.EXTRA_SUBJECT, "Ivy Wallet Support Request #" + caseNumber + "0" + BuildConfig.VERSION_CODE ) diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 6e4efefb9d..5d229a0262 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -2,26 +2,15 @@ kotlin = "1.9.0" kotlin-coroutines = "1.7.3" ktor = "2.3.3" -kotlinx-serialization = "1.6.0" arrow = "1.2.0" kotest = "5.6.2" compose = "1.5.0" compose-compiler = "1.5.2" # It's used - don't delete it! compose-material3 = "1.1.1" -compose-activity = "1.7.2" -compose-viewmodel = "2.6.1" -coil = "2.4.0" glance = "1.0.0-rc01" -datastore = "1.0.0" -androidx-security = "1.0.0" -androidx-activity = "1.8.0-alpha07" -appcompat-activity = "1.7.0-alpha03" -androidx-biometrics = "1.2.0-alpha05" -google-playservices-auth = "20.7.0" -google-billing = "6.0.1" -google-play-core = "1.10.0" -google-play-core-ktx = "1.8.1" -firebase-crashlytics = "17.3.0" +hilt = "2.47" +room = "2.6.0-alpha03" +androidx-work = "2.8.1" # Linters detekt = "1.23.1" # https://detekt.dev/docs/gettingstarted/gradle/ @@ -29,53 +18,91 @@ detekt-ruleset-compiler = "0.0.2" # https://github.com/BraisGabin/detekt-compile detekt-ruleset-compose = "0.2.1" # https://github.com/mrmans0n/compose-rules/releases [libraries] +android-gradle-plugin = { module = "com.android.tools.build:gradle", version = "8.2.0-beta01" } + +# Kotlin +kotlin-gradle-plugin = { module = "org.jetbrains.kotlin:kotlin-gradle-plugin", version.ref = "kotlin" } kotlin-stdlib = { module = "org.jetbrains.kotlin:kotlin-stdlib", version.ref = "kotlin" } kotlin-coroutines-core = { module = "org.jetbrains.kotlinx:kotlinx-coroutines-core", version.ref = "kotlin-coroutines" } kotlin-coroutines-android = { module = "org.jetbrains.kotlinx:kotlinx-coroutines-android", version.ref = "kotlin-coroutines" } kotlin-coroutines-googleplay-temp = { module = "org.jetbrains.kotlinx:kotlinx-coroutines-play-services", version.ref = "kotlin-coroutines" } kotlin-coroutines-test = { module = "org.jetbrains.kotlinx:kotlinx-coroutines-test", version.ref = "kotlin-coroutines" } -kotlinx-serialization-json = { module = "org.jetbrains.kotlinx:kotlinx-serialization-json", version.ref = "kotlinx-serialization" } +kotlinx-serialization-json = { module = "org.jetbrains.kotlinx:kotlinx-serialization-json", version = "1.6.0" } + +# Ktor ktor-client-okhttp = { module = "io.ktor:ktor-client-okhttp", version.ref = "ktor" } ktor-content-negotiation = { module = "io.ktor:ktor-client-content-negotiation", version.ref = "ktor" } ktor-serialization = { module = "io.ktor:ktor-serialization-kotlinx-json", version.ref = "ktor" } ktor-client-core = { module = "io.ktor:ktor-client-core", version.ref = "ktor" } ktor-client-serialization = { module = "io.ktor:ktor-client-serialization", version.ref = "ktor" } ktor-logging = { module = "io.ktor:ktor-client-logging", version.ref = "ktor" } + +# Arrow + Kotest arrowkt-core = { module = "io.arrow-kt:arrow-core", version.ref = "arrow" } kotest-junit5 = { module = "io.kotest:kotest-runner-junit5", version.ref = "kotest" } kotest-assertions = { module = "io.kotest:kotest-assertions-core", version.ref = "kotest" } kotest-property = { module = "io.kotest:kotest-property", version.ref = "kotest" } kotest-property-arrow = { module = "io.kotest.extensions:kotest-property-arrow", version.ref = "arrow" } kotest-datatest = { module = "io.kotest:kotest-framework-datatest", version.ref = "kotest" } -ivy-frp-temp = { module = "com.github.ILIYANGERMANOV:ivy-frp", version = "0.9.5" } + +# Compose compose-animation = { module = "androidx.compose.animation:animation", version.ref = "compose" } -#compose-compiler = { module = "androidx.compose.compiler:compiler", version.ref = "compose-compiler" } compose-foundation = { module = "androidx.compose.foundation:foundation", version.ref = "compose" } compose-material3 = { module = "androidx.compose.material3:material3", version.ref = "compose-material3" } compose-material3-windowsize = { module = "androidx.compose.material3:material3-window-size-class", version.ref = "compose-material3" } compose-runtime = { module = "androidx.compose.runtime:runtime", version.ref = "compose" } compose-runtime-livedate-temp = { module = "androidx.compose.runtime:runtime-livedata", version.ref = "compose" } compose-ui = { module = "androidx.compose.ui:ui", version.ref = "compose" } -compose-activity = { module = "androidx.activity:activity-compose", version.ref = "compose-activity" } -compose-viewmodel = { module = "androidx.lifecycle:lifecycle-viewmodel-compose", version.ref = "compose-viewmodel" } +compose-activity = { module = "androidx.activity:activity-compose", version = "1.7.2" } +compose-viewmodel = { module = "androidx.lifecycle:lifecycle-viewmodel-compose", version = "2.6.1" } compose-tooling = { module = "androidx.compose.ui:ui-tooling", version.ref = "compose" } -compose-coil = { module = "io.coil-kt:coil-compose", version.ref = "coil" } +compose-coil = { module = "io.coil-kt:coil-compose", version = "2.4.0" } glance = { module = "androidx.glance:glance", version.ref = "glance" } glance-appwidget = { module = "androidx.glance:glance-appwidget", version.ref = "glance" } glance-material3 = { module = "androidx.glance:glance-material3", version.ref = "glance" } -datastore = { module = "androidx.datastore:datastore-preferences", version.ref = "datastore" } -androidx-security = { module = "androidx.security:security-crypto", version.ref = "androidx-security" } -androidx-biometrics = { module = "androidx.biometric:biometric", version.ref = "androidx-biometrics" } -androidx-activity = { module = "androidx.activity:activity-ktx", version.ref = "androidx-activity" } -appcompat-activity = { module = "androidx.appcompat:appcompat", version.ref = "appcompat-activity" } -google-playservices-auth = { module = "com.google.android.gms:play-services-auth", version.ref = "google-playservices-auth" } -google-billing = { module = "com.android.billingclient:billing-ktx", version.ref = "google-billing" } -google-play-core = { module = "com.google.android.play:core", version.ref = "google-play-core" } -google-play-core-ktx = { module = "com.google.android.play:core-ktx", version.ref = "google-play-core-ktx" } -firebase-crashlytics = { module = "com.google.firebase:firebase-crashlytics", version.ref = "firebase-crashlytics" } + +# Local persistence +datastore = { module = "androidx.datastore:datastore-preferences", version = "1.0.0" } +room-runtime = { module = "androidx.room:room-runtime", version.ref = "room" } +room-compiler = { module = "androidx.room:room-compiler", version.ref = "room" } +room-ktx = { module = "androidx.room:room-ktx", version.ref = "room" } + +# Hilt +hilt = { module = "com.google.dagger:hilt-android", version.ref = "hilt" } +hilt-work = { module = "androidx.hilt:hilt-work", version = "1.0.0" } +hilt-compiler = { module = "com.google.dagger:hilt-android-compiler", version.ref = "hilt" } +hilt-gradle-plugin = { module = "com.google.dagger:hilt-android-gradle-plugin", version.ref = "hilt" } +hilt-testing = { module = "com.google.dagger:hilt-android-testing", version.ref = "hilt" } + +# Google +google-services = { module = "com.google.gms:google-services", version = "4.3.15" } +google-playservices-auth = { module = "com.google.android.gms:play-services-auth", version = "20.7.0" } +google-billing = { module = "com.android.billingclient:billing-ktx", version = "6.0.1" } +google-play-core = { module = "com.google.android.play:core", version = "1.10.0" } +google-play-core-ktx = { module = "com.google.android.play:core-ktx", version = "1.8.1" } +firebase-crashlytics = { module = "com.google.firebase:firebase-crashlytics", version = "17.3.0" } +firebase-crashlytics-gradle-plugin = { module = "com.google.firebase:firebase-crashlytics-gradle", version = "2.9.8" } + +# AndroidX +androidx-security = { module = "androidx.security:security-crypto", version = "1.0.0" } +androidx-biometrics = { module = "androidx.biometric:biometric", version = "1.2.0-alpha05" } +androidx-activity = { module = "androidx.activity:activity-ktx", version = "1.8.0-alpha07" } +appcompat-activity = { module = "androidx.appcompat:appcompat", version = "1.7.0-alpha03" } +androidx-work = { module = "androidx.work:work-runtime-ktx", version.ref = "androidx-work" } +androidx-work-testing = { module = "androidx.work:work-testing", version.ref = "androidx-work" } +androidx-recyclerview = { module = "androidx.recyclerview:recyclerview", version = "1.2.1" } + +# Legacy +gson = { module = "com.google.code.gson:gson", version = "2.10.1" } # will be removed in favor of KotlinX serialization +timber = { module = "com.jakewharton.timber:timber", version = "4.7.1" } +eventbus = { module = "org.greenrobot:eventbus", version = "3.3.1" } # will be removed +keval = { module = "com.notkamui.libs:keval", version = "0.9.0" } +opencsv-csv = { module = "com.opencsv:opencsv", version = "5.5" } +opencsv-apache-commons = { module = "org.apache.commons:commons-lang3", version = "3.12.0" } +ivy-frp-temp = { module = "com.github.ILIYANGERMANOV:ivy-frp", version = "0.9.5" } # Linters -detekt-gradle = { module = "io.gitlab.arturbosch.detekt:detekt-gradle-plugin", version.ref = "detekt" } +detekt-gradle-plugin = { module = "io.gitlab.arturbosch.detekt:detekt-gradle-plugin", version.ref = "detekt" } detekt-ruleset-compiler = { module = "com.braisgabin.detekt:kotlin-compiler-wrapper", version.ref = "detekt-ruleset-compiler" } detekt-ruleset-ktlint = { module = "io.gitlab.arturbosch.detekt:detekt-formatting", version.ref = "detekt" } detekt-ruleset-compose = { module = "io.nlopez.compose.rules:detekt", version.ref = "detekt-ruleset-compose" } @@ -140,6 +167,18 @@ google = [ firebase = [ "firebase-crashlytics" ] +hilt = [ + "hilt", + "hilt-work" +] +room = [ + "room-runtime", + "room-ktx" +] +opencsv = [ + "opencsv-csv", + "opencsv-apache-commons" +] [plugins] gradleWrapperUpgrade = "org.gradle.wrapper-upgrade:0.11.1" diff --git a/ivy-design/build.gradle.kts b/ivy-design/build.gradle.kts index 2f577fc466..6459b34669 100644 --- a/ivy-design/build.gradle.kts +++ b/ivy-design/build.gradle.kts @@ -1,5 +1,4 @@ import com.ivy.wallet.buildsrc.Project -import com.ivy.wallet.buildsrc.ivyDesignModuleDependencies plugins { id("com.android.library") @@ -57,8 +56,6 @@ android { } dependencies { - ivyDesignModuleDependencies() - implementation(libs.bundles.arrow) implementation(libs.bundles.kotlin) implementation(libs.bundles.compose)