From 7dffe882c44576f4ae84943075399a8010a3e77a Mon Sep 17 00:00:00 2001 From: Niko Date: Wed, 18 Sep 2024 21:01:29 +0200 Subject: [PATCH] feature(bank-sdk): Transaction List. Invoice Preview integration. Attach Invoice from PP PP-747 --- bank-sdk/example-app/build.gradle.kts | 3 + .../example-app/src/main/AndroidManifest.xml | 78 ++++++++++--------- .../sdk/exampleapp/ui/ExtractionsActivity.kt | 13 +++- .../exampleapp/ui/InvoicePreviewActivity.kt | 36 +++++++++ .../res/layout/activity_invoice_preview.xml | 24 ++++++ .../main/res/layout/item_transaction_docs.xml | 1 + .../net/gini/android/bank/sdk/GiniBank.kt | 14 +++- .../skonto/DigitalInvoiceSkontoFragment.kt | 17 ++-- .../DigitalInvoiceSkontoScreenModule.kt | 3 +- .../skonto/DigitalInvoiceSkontoScreenState.kt | 4 +- .../skonto/DigitalInvoiceSkontoViewModel.kt | 4 + .../bank/sdk/capture/skonto/SkontoFragment.kt | 12 +-- .../capture/skonto/SkontoFragmentContract.kt | 1 + .../capture/skonto/SkontoFragmentViewModel.kt | 7 +- .../sdk/capture/skonto/SkontoScreenModule.kt | 3 +- .../sdk/invoice/InvoicePreviewFragment.kt | 16 +++- .../invoice/InvoicePreviewFragmentState.kt | 2 +- .../bank/sdk/invoice/InvoicePreviewModule.kt | 15 ++-- .../bank/sdk/invoice/InvoicePreviewScreen.kt | 72 ++++++----------- .../sdk/invoice/InvoicePreviewViewModel.kt | 20 +++-- .../image/InvoicePreviewPageImageProcessor.kt | 9 +-- .../sdk/transactiondocs/TransactionDocs.kt | 4 +- .../di/TransactionListModule.kt | 2 +- .../internal/GiniBankTransactionDocs.kt | 43 +++++----- ...xtractionDocument.kt => TransactionDoc.kt} | 4 +- .../ui/extractions/TransactionDocs.kt | 16 ++-- .../ui/extractions/TransactionDocsContent.kt | 26 +++---- .../extractions/view/TransactionDocsView.kt | 17 +++- .../src/main/res/navigation/gbs_nav_graph.xml | 12 ++- .../GiniCaptureDefaultNetworkService.kt | 5 +- .../GiniCaptureNetworkServiceStub.java | 6 +- .../network/NetworkRequestsManagerTest.java | 4 +- .../capture/analysis/AnalysisInteractor.java | 8 +- .../analysis/AnalysisScreenPresenter.java | 13 +--- .../AnalysisScreenPresenterExtension.kt | 2 +- .../LastAnalyzedDocumentIdProvider.kt | 16 ---- .../analysis/LastAnalyzedDocumentProvider.kt | 26 +++++++ .../gini/android/capture/di/ProviderModule.kt | 9 ++- .../network/AnalysisNetworkRequestResult.java | 3 +- .../network/NetworkRequestResult.java | 12 ++- .../network/NetworkRequestsManager.java | 14 +++- .../capture/network/AnalysisResult.java | 22 +++--- .../gini/android/capture/network/Result.java | 8 +- .../analysis/AnalysisInteractorTest.java | 5 +- 44 files changed, 388 insertions(+), 243 deletions(-) create mode 100644 bank-sdk/example-app/src/main/java/net/gini/android/bank/sdk/exampleapp/ui/InvoicePreviewActivity.kt create mode 100644 bank-sdk/example-app/src/main/res/layout/activity_invoice_preview.xml rename bank-sdk/sdk/src/main/java/net/gini/android/bank/sdk/transactiondocs/model/extractions/{ExtractionDocument.kt => TransactionDoc.kt} (66%) delete mode 100644 capture-sdk/sdk/src/main/java/net/gini/android/capture/analysis/LastAnalyzedDocumentIdProvider.kt create mode 100644 capture-sdk/sdk/src/main/java/net/gini/android/capture/analysis/LastAnalyzedDocumentProvider.kt diff --git a/bank-sdk/example-app/build.gradle.kts b/bank-sdk/example-app/build.gradle.kts index 3a66abc467..a336193d1c 100644 --- a/bank-sdk/example-app/build.gradle.kts +++ b/bank-sdk/example-app/build.gradle.kts @@ -189,6 +189,9 @@ dependencies { implementation(libs.hilt.library) implementation(libs.navigation.fragment.ktx) implementation(libs.navigation.ui.ktx) + implementation(libs.material) + implementation(libs.androidx.activity) + implementation(libs.androidx.constraintlayout) kapt(libs.hilt.compiler) implementation(libs.androidx.lifecycle.runtime.ktx) diff --git a/bank-sdk/example-app/src/main/AndroidManifest.xml b/bank-sdk/example-app/src/main/AndroidManifest.xml index 0761fff595..a47ea7e1b1 100644 --- a/bank-sdk/example-app/src/main/AndroidManifest.xml +++ b/bank-sdk/example-app/src/main/AndroidManifest.xml @@ -2,6 +2,36 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -44,11 +79,9 @@ - - @@ -62,11 +95,10 @@ android:scheme="@string/gini_pay_connect_scheme" /> - + android:exported="true" + android:launchMode="singleTask"> @@ -75,6 +107,7 @@ + + - - + + @@ -120,34 +156,6 @@ android:name="android.support.FILE_PROVIDER_PATHS" android:resource="@xml/filepaths" /> - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/bank-sdk/example-app/src/main/java/net/gini/android/bank/sdk/exampleapp/ui/ExtractionsActivity.kt b/bank-sdk/example-app/src/main/java/net/gini/android/bank/sdk/exampleapp/ui/ExtractionsActivity.kt index 7a73a3af32..057530788e 100644 --- a/bank-sdk/example-app/src/main/java/net/gini/android/bank/sdk/exampleapp/ui/ExtractionsActivity.kt +++ b/bank-sdk/example-app/src/main/java/net/gini/android/bank/sdk/exampleapp/ui/ExtractionsActivity.kt @@ -24,6 +24,7 @@ import net.gini.android.bank.sdk.exampleapp.R import net.gini.android.bank.sdk.exampleapp.core.di.GiniCaptureNetworkServiceDebugDisabled import net.gini.android.bank.sdk.exampleapp.core.di.GiniCaptureNetworkServiceDebugEnabled import net.gini.android.bank.sdk.exampleapp.databinding.ActivityExtractionsBinding +import net.gini.android.bank.sdk.transactiondocs.ui.extractions.view.TransactionDocsView import net.gini.android.capture.Amount import net.gini.android.capture.AmountCurrency import net.gini.android.capture.network.GiniCaptureDefaultNetworkService @@ -220,7 +221,15 @@ private class ExtractionsAdapter( ExtractionsDocsViewHolder( LayoutInflater.from(parent.context) .inflate(R.layout.item_transaction_docs, parent, false) - ) + ).apply { + this.transactionDocView.onDocumentClick { + this.itemView.context.startActivity( + InvoicePreviewActivity.newIntent( + this.itemView.context, it.giniApiDocumentId + ) + ) + } + } } else -> error("Unknown view type") @@ -260,5 +269,5 @@ private class ExtractionsViewHolder(itemView: View) : ViewHolder(itemView) { } private class ExtractionsDocsViewHolder(itemView: View) : ViewHolder(itemView) { - + val transactionDocView: TransactionDocsView = itemView.findViewById(R.id.transaction_docs_view) } diff --git a/bank-sdk/example-app/src/main/java/net/gini/android/bank/sdk/exampleapp/ui/InvoicePreviewActivity.kt b/bank-sdk/example-app/src/main/java/net/gini/android/bank/sdk/exampleapp/ui/InvoicePreviewActivity.kt new file mode 100644 index 0000000000..299b34299a --- /dev/null +++ b/bank-sdk/example-app/src/main/java/net/gini/android/bank/sdk/exampleapp/ui/InvoicePreviewActivity.kt @@ -0,0 +1,36 @@ +package net.gini.android.bank.sdk.exampleapp.ui + +import android.content.Context +import android.content.Intent +import android.os.Bundle +import androidx.activity.enableEdgeToEdge +import androidx.appcompat.app.AppCompatActivity +import androidx.core.view.ViewCompat +import androidx.core.view.WindowInsetsCompat +import net.gini.android.bank.sdk.GiniBank +import net.gini.android.bank.sdk.exampleapp.R + +class InvoicePreviewActivity : AppCompatActivity() { + + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + setContentView(R.layout.activity_invoice_preview) + val documentId = + intent.getStringExtra(EXTRA_DOCUMENT_ID) ?: error("Missing $EXTRA_DOCUMENT_ID extra") + + val fragment = GiniBank.createInvoicePreviewFragment(documentId) + + supportFragmentManager.beginTransaction().replace(R.id.container, fragment).commit() + } + + companion object { + + private const val EXTRA_DOCUMENT_ID = "document_id" + + fun newIntent(context: Context, documentId: String): Intent { + return Intent(context, InvoicePreviewActivity::class.java).apply { + putExtra(EXTRA_DOCUMENT_ID, documentId) + } + } + } +} \ No newline at end of file diff --git a/bank-sdk/example-app/src/main/res/layout/activity_invoice_preview.xml b/bank-sdk/example-app/src/main/res/layout/activity_invoice_preview.xml new file mode 100644 index 0000000000..b07645b2ee --- /dev/null +++ b/bank-sdk/example-app/src/main/res/layout/activity_invoice_preview.xml @@ -0,0 +1,24 @@ + + + + + + + \ No newline at end of file diff --git a/bank-sdk/example-app/src/main/res/layout/item_transaction_docs.xml b/bank-sdk/example-app/src/main/res/layout/item_transaction_docs.xml index 6d9f5fa54a..339f59690e 100644 --- a/bank-sdk/example-app/src/main/res/layout/item_transaction_docs.xml +++ b/bank-sdk/example-app/src/main/res/layout/item_transaction_docs.xml @@ -6,6 +6,7 @@ android:padding="10dp"> diff --git a/bank-sdk/sdk/src/main/java/net/gini/android/bank/sdk/GiniBank.kt b/bank-sdk/sdk/src/main/java/net/gini/android/bank/sdk/GiniBank.kt index 6473b5b6f1..102c4fdfa5 100644 --- a/bank-sdk/sdk/src/main/java/net/gini/android/bank/sdk/GiniBank.kt +++ b/bank-sdk/sdk/src/main/java/net/gini/android/bank/sdk/GiniBank.kt @@ -30,11 +30,12 @@ import net.gini.android.bank.sdk.capture.skonto.SkontoNavigationBarBottomAdapter import net.gini.android.bank.sdk.capture.skonto.help.SkontoHelpNavigationBarBottomAdapter import net.gini.android.bank.sdk.di.BankSdkIsolatedKoinContext import net.gini.android.bank.sdk.error.AmountParsingException +import net.gini.android.bank.sdk.invoice.InvoicePreviewFragment import net.gini.android.bank.sdk.pay.getBusinessIntent import net.gini.android.bank.sdk.pay.getRequestId import net.gini.android.bank.sdk.transactiondocs.TransactionDocs import net.gini.android.bank.sdk.transactiondocs.TransactionDocsConfiguration -import net.gini.android.bank.sdk.transactionlist.internal.GiniBankTransactionDocs +import net.gini.android.bank.sdk.transactiondocs.internal.GiniBankTransactionDocs import net.gini.android.bank.sdk.transactionlist.internal.GiniTransactionDocsSettings import net.gini.android.bank.sdk.util.parseAmountToBackendFormat import net.gini.android.capture.* @@ -540,6 +541,16 @@ object GiniBank { return CaptureFlowFragment.createInstance(document) } + fun createInvoicePreviewFragment(giniApiDocumentId: String) : InvoicePreviewFragment { + check(giniApiDocumentId.isNotBlank() && giniApiDocumentId.isNotEmpty()) { + "Gini Api Document Id should not be empty or blank" } + return InvoicePreviewFragment.createInstance(giniApiDocumentId) + } + + fun startInvoicePreview() { + + } + fun initializeTransactionDocsFeature( context: Context, @@ -550,7 +561,6 @@ object GiniBank { this.giniBankTransactionDocs = GiniBankTransactionDocs( configuration = transactionDocsConfiguration, transactionDocsSettings = transactionDocsSettings, - backgroundDispatcher = Dispatchers.IO ) } diff --git a/bank-sdk/sdk/src/main/java/net/gini/android/bank/sdk/capture/digitalinvoice/skonto/DigitalInvoiceSkontoFragment.kt b/bank-sdk/sdk/src/main/java/net/gini/android/bank/sdk/capture/digitalinvoice/skonto/DigitalInvoiceSkontoFragment.kt index d039479a73..9ecb45a7b2 100644 --- a/bank-sdk/sdk/src/main/java/net/gini/android/bank/sdk/capture/digitalinvoice/skonto/DigitalInvoiceSkontoFragment.kt +++ b/bank-sdk/sdk/src/main/java/net/gini/android/bank/sdk/capture/digitalinvoice/skonto/DigitalInvoiceSkontoFragment.kt @@ -162,12 +162,14 @@ class DigitalInvoiceSkontoFragment : Fragment() { ) findNavController().popBackStack() }, - navigateToInvoiceScreen = { data -> + navigateToInvoiceScreen = { documentId, data -> findNavController() .navigate( DigitalInvoiceSkontoFragmentDirections.toInvoicePreviewFragment( - skontoData = data, - invoiceHighlights = args.data.invoiceHighlights.toTypedArray(), + documentId = documentId, + highlightBoxes = args.data.invoiceHighlights.flatMap { it.getExistBoxes() } + .toTypedArray(), + infoTextLines = arrayOf() // TODO Add lines ) ) }, @@ -205,7 +207,7 @@ private fun ScreenContent( isBottomNavigationBarEnabled: Boolean, navigateBack: () -> Unit, navigateToHelpScreen: () -> Unit, - navigateToInvoiceScreen: (skontoData: SkontoData) -> Unit, + navigateToInvoiceScreen: (documentId: String, skontoData: SkontoData) -> Unit, viewModel: DigitalInvoiceSkontoViewModel, customBottomNavBarAdapter: InjectedViewAdapterInstance?, modifier: Modifier = Modifier, @@ -218,8 +220,11 @@ private fun ScreenContent( viewModel.collectSideEffect { when (it) { - is DigitalInvoiceSkontoSideEffect.OpenInvoiceScreen -> navigateToInvoiceScreen(it.skontoData) - DigitalInvoiceSkontoSideEffect.OpenHelpScreen -> navigateToHelpScreen() + is DigitalInvoiceSkontoSideEffect.OpenInvoiceScreen -> + navigateToInvoiceScreen(it.documentId, it.skontoData) + + DigitalInvoiceSkontoSideEffect.OpenHelpScreen -> + navigateToHelpScreen() } } diff --git a/bank-sdk/sdk/src/main/java/net/gini/android/bank/sdk/capture/digitalinvoice/skonto/DigitalInvoiceSkontoScreenModule.kt b/bank-sdk/sdk/src/main/java/net/gini/android/bank/sdk/capture/digitalinvoice/skonto/DigitalInvoiceSkontoScreenModule.kt index 0be98113d2..8ddff3179f 100644 --- a/bank-sdk/sdk/src/main/java/net/gini/android/bank/sdk/capture/digitalinvoice/skonto/DigitalInvoiceSkontoScreenModule.kt +++ b/bank-sdk/sdk/src/main/java/net/gini/android/bank/sdk/capture/digitalinvoice/skonto/DigitalInvoiceSkontoScreenModule.kt @@ -10,7 +10,8 @@ val digitalInvoiceSkontoScreenModule = module { args = data, getSkontoDiscountPercentageUseCase = get(), getSkontoEdgeCaseUseCase = get(), - getSkontoRemainingDaysUseCase = get() + getSkontoRemainingDaysUseCase = get(), + lastAnalyzedDocumentProvider = get(), ) } } diff --git a/bank-sdk/sdk/src/main/java/net/gini/android/bank/sdk/capture/digitalinvoice/skonto/DigitalInvoiceSkontoScreenState.kt b/bank-sdk/sdk/src/main/java/net/gini/android/bank/sdk/capture/digitalinvoice/skonto/DigitalInvoiceSkontoScreenState.kt index 730d7b3e6f..a973117ee1 100644 --- a/bank-sdk/sdk/src/main/java/net/gini/android/bank/sdk/capture/digitalinvoice/skonto/DigitalInvoiceSkontoScreenState.kt +++ b/bank-sdk/sdk/src/main/java/net/gini/android/bank/sdk/capture/digitalinvoice/skonto/DigitalInvoiceSkontoScreenState.kt @@ -22,7 +22,9 @@ internal sealed class DigitalInvoiceSkontoScreenState { } internal sealed interface DigitalInvoiceSkontoSideEffect { - data class OpenInvoiceScreen(val skontoData: SkontoData) : DigitalInvoiceSkontoSideEffect + data class OpenInvoiceScreen(val documentId: String, val skontoData: SkontoData) : + DigitalInvoiceSkontoSideEffect + object OpenHelpScreen : DigitalInvoiceSkontoSideEffect } diff --git a/bank-sdk/sdk/src/main/java/net/gini/android/bank/sdk/capture/digitalinvoice/skonto/DigitalInvoiceSkontoViewModel.kt b/bank-sdk/sdk/src/main/java/net/gini/android/bank/sdk/capture/digitalinvoice/skonto/DigitalInvoiceSkontoViewModel.kt index 42be5af56b..78bf681a1f 100644 --- a/bank-sdk/sdk/src/main/java/net/gini/android/bank/sdk/capture/digitalinvoice/skonto/DigitalInvoiceSkontoViewModel.kt +++ b/bank-sdk/sdk/src/main/java/net/gini/android/bank/sdk/capture/digitalinvoice/skonto/DigitalInvoiceSkontoViewModel.kt @@ -11,11 +11,13 @@ import net.gini.android.bank.sdk.capture.skonto.model.SkontoData import net.gini.android.bank.sdk.capture.skonto.usecase.GetSkontoDiscountPercentageUseCase import net.gini.android.bank.sdk.capture.skonto.usecase.GetSkontoEdgeCaseUseCase import net.gini.android.bank.sdk.capture.skonto.usecase.GetSkontoRemainingDaysUseCase +import net.gini.android.capture.analysis.LastAnalyzedDocumentProvider import java.math.BigDecimal import java.time.LocalDate internal class DigitalInvoiceSkontoViewModel( args: DigitalInvoiceSkontoArgs, + private val lastAnalyzedDocumentProvider: LastAnalyzedDocumentProvider, private val getSkontoDiscountPercentageUseCase: GetSkontoDiscountPercentageUseCase, private val getSkontoEdgeCaseUseCase: GetSkontoEdgeCaseUseCase, private val getSkontoRemainingDaysUseCase: GetSkontoRemainingDaysUseCase, @@ -151,7 +153,9 @@ internal class DigitalInvoiceSkontoViewModel( fun onInvoiceClicked() = viewModelScope.launch { val currentState = stateFlow.value as? DigitalInvoiceSkontoScreenState.Ready ?: return@launch + val documentId = lastAnalyzedDocumentProvider.provide()?.first ?: return@launch sideEffectFlow.emit(DigitalInvoiceSkontoSideEffect.OpenInvoiceScreen( + documentId, SkontoData( skontoAmountToPay = currentState.skontoAmount, skontoDueDate = currentState.discountDueDate, diff --git a/bank-sdk/sdk/src/main/java/net/gini/android/bank/sdk/capture/skonto/SkontoFragment.kt b/bank-sdk/sdk/src/main/java/net/gini/android/bank/sdk/capture/skonto/SkontoFragment.kt index 84a460e4bf..9f7f40eda8 100644 --- a/bank-sdk/sdk/src/main/java/net/gini/android/bank/sdk/capture/skonto/SkontoFragment.kt +++ b/bank-sdk/sdk/src/main/java/net/gini/android/bank/sdk/capture/skonto/SkontoFragment.kt @@ -164,12 +164,14 @@ class SkontoFragment : Fragment() { findNavController() .navigate(SkontoFragmentDirections.toCaptureFragment()) }, - navigateToInvoiceScreen = { + navigateToInvoiceScreen = { documentId, data -> findNavController() .navigate( SkontoFragmentDirections.toInvoicePreviewFragment( - it, - args.invoiceHighlights + documentId = documentId, + highlightBoxes = args.invoiceHighlights.flatMap { it.getExistBoxes() } + .toTypedArray(), + infoTextLines = arrayOf() // TODO Add lines ) ) }, @@ -209,7 +211,7 @@ private fun ScreenContent( screenColorScheme: SkontoScreenColors = SkontoScreenColors.colors(), isBottomNavigationBarEnabled: Boolean, customBottomNavBarAdapter: InjectedViewAdapterInstance?, - navigateToInvoiceScreen: (SkontoData) -> Unit, + navigateToInvoiceScreen: (documentId: String, data: SkontoData) -> Unit, ) { BackHandler { navigateBack() } @@ -219,7 +221,7 @@ private fun ScreenContent( viewModel.collectSideEffect { when (it) { is SkontoFragmentContract.SideEffect.OpenInvoiceScreen -> - navigateToInvoiceScreen(it.skontoData) + navigateToInvoiceScreen(it.documentId, it.skontoData) } } diff --git a/bank-sdk/sdk/src/main/java/net/gini/android/bank/sdk/capture/skonto/SkontoFragmentContract.kt b/bank-sdk/sdk/src/main/java/net/gini/android/bank/sdk/capture/skonto/SkontoFragmentContract.kt index 8e06401158..e9ccddd938 100644 --- a/bank-sdk/sdk/src/main/java/net/gini/android/bank/sdk/capture/skonto/SkontoFragmentContract.kt +++ b/bank-sdk/sdk/src/main/java/net/gini/android/bank/sdk/capture/skonto/SkontoFragmentContract.kt @@ -26,6 +26,7 @@ internal object SkontoFragmentContract { sealed interface SideEffect { data class OpenInvoiceScreen( + val documentId: String, val skontoData: SkontoData ) : SideEffect } diff --git a/bank-sdk/sdk/src/main/java/net/gini/android/bank/sdk/capture/skonto/SkontoFragmentViewModel.kt b/bank-sdk/sdk/src/main/java/net/gini/android/bank/sdk/capture/skonto/SkontoFragmentViewModel.kt index c2863c0613..96592460ca 100644 --- a/bank-sdk/sdk/src/main/java/net/gini/android/bank/sdk/capture/skonto/SkontoFragmentViewModel.kt +++ b/bank-sdk/sdk/src/main/java/net/gini/android/bank/sdk/capture/skonto/SkontoFragmentViewModel.kt @@ -5,9 +5,6 @@ import androidx.lifecycle.viewModelScope import kotlinx.coroutines.flow.MutableSharedFlow import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.launch -import net.gini.android.bank.sdk.capture.digitalinvoice.skonto.DigitalInvoiceSkontoScreenState -import net.gini.android.bank.sdk.capture.digitalinvoice.skonto.DigitalInvoiceSkontoSideEffect -import net.gini.android.bank.sdk.capture.extractions.skonto.SkontoDataExtractor import net.gini.android.bank.sdk.capture.extractions.skonto.SkontoExtractionsHandler import net.gini.android.bank.sdk.capture.skonto.model.SkontoData import net.gini.android.bank.sdk.capture.skonto.usecase.GetSkontoAmountUseCase @@ -17,6 +14,7 @@ import net.gini.android.bank.sdk.capture.skonto.usecase.GetSkontoEdgeCaseUseCase import net.gini.android.bank.sdk.capture.skonto.usecase.GetSkontoRemainingDaysUseCase import net.gini.android.bank.sdk.capture.skonto.usecase.GetSkontoSavedAmountUseCase import net.gini.android.capture.Amount +import net.gini.android.capture.analysis.LastAnalyzedDocumentProvider import java.math.BigDecimal import java.time.LocalDate @@ -29,6 +27,7 @@ internal class SkontoFragmentViewModel( private val getSkontoRemainingDaysUseCase: GetSkontoRemainingDaysUseCase, private val getSkontoDefaultSelectionStateUseCase: GetSkontoDefaultSelectionStateUseCase, private val skontoExtractionsHandler: SkontoExtractionsHandler, + private val lastAnalyzedDocumentProvider: LastAnalyzedDocumentProvider, ) : ViewModel() { val stateFlow: MutableStateFlow = @@ -210,8 +209,10 @@ internal class SkontoFragmentViewModel( fun onInvoiceClicked() = viewModelScope.launch { val currentState = stateFlow.value as? SkontoFragmentContract.State.Ready ?: return@launch + val documentId = lastAnalyzedDocumentProvider.provide()?.first ?: return@launch sideEffectFlow.emit( SkontoFragmentContract.SideEffect.OpenInvoiceScreen( + documentId, SkontoData( skontoAmountToPay = currentState.skontoAmount, skontoDueDate = currentState.discountDueDate, diff --git a/bank-sdk/sdk/src/main/java/net/gini/android/bank/sdk/capture/skonto/SkontoScreenModule.kt b/bank-sdk/sdk/src/main/java/net/gini/android/bank/sdk/capture/skonto/SkontoScreenModule.kt index ca0dc1aaaf..00cb24163d 100644 --- a/bank-sdk/sdk/src/main/java/net/gini/android/bank/sdk/capture/skonto/SkontoScreenModule.kt +++ b/bank-sdk/sdk/src/main/java/net/gini/android/bank/sdk/capture/skonto/SkontoScreenModule.kt @@ -14,7 +14,8 @@ val skontoScreenModule = module { getSkontoSavedAmountUseCase = get(), getSkontoRemainingDaysUseCase = get(), getSkontoDefaultSelectionStateUseCase = get(), - skontoExtractionsHandler = get() + skontoExtractionsHandler = get(), + lastAnalyzedDocumentProvider = get() ) } } \ No newline at end of file diff --git a/bank-sdk/sdk/src/main/java/net/gini/android/bank/sdk/invoice/InvoicePreviewFragment.kt b/bank-sdk/sdk/src/main/java/net/gini/android/bank/sdk/invoice/InvoicePreviewFragment.kt index 2b59cbf9cd..0600683c50 100644 --- a/bank-sdk/sdk/src/main/java/net/gini/android/bank/sdk/invoice/InvoicePreviewFragment.kt +++ b/bank-sdk/sdk/src/main/java/net/gini/android/bank/sdk/invoice/InvoicePreviewFragment.kt @@ -23,7 +23,7 @@ class InvoicePreviewFragment : Fragment() { private val args: InvoicePreviewFragmentArgs by navArgs() private val viewModel: InvoicePreviewViewModel by getGiniBankKoin().inject { - parametersOf(args.skontoData, args.invoiceHighlights) + parametersOf(args.documentId, args.infoTextLines, args.highlightBoxes) } override fun onCreate(savedInstanceState: Bundle?) { @@ -49,11 +49,23 @@ class InvoicePreviewFragment : Fragment() { modifier = Modifier, viewModel = viewModel, navigateBack = { - findNavController().popBackStack() + findNavController().navigateUp() } ) } } } } + + companion object { + fun createInstance(documentId: String): InvoicePreviewFragment { + return InvoicePreviewFragment().apply { + arguments = InvoicePreviewFragmentArgs( + documentId = documentId, + infoTextLines = arrayOf(), + highlightBoxes = arrayOf() + ).toBundle() + } + } + } } diff --git a/bank-sdk/sdk/src/main/java/net/gini/android/bank/sdk/invoice/InvoicePreviewFragmentState.kt b/bank-sdk/sdk/src/main/java/net/gini/android/bank/sdk/invoice/InvoicePreviewFragmentState.kt index e2385660c4..6db48325f4 100644 --- a/bank-sdk/sdk/src/main/java/net/gini/android/bank/sdk/invoice/InvoicePreviewFragmentState.kt +++ b/bank-sdk/sdk/src/main/java/net/gini/android/bank/sdk/invoice/InvoicePreviewFragmentState.kt @@ -6,5 +6,5 @@ import net.gini.android.bank.sdk.capture.skonto.model.SkontoData data class InvoicePreviewFragmentState( val isLoading: Boolean, val images: List, - val skontoData: SkontoData?, + val infoTextLines: List, ) diff --git a/bank-sdk/sdk/src/main/java/net/gini/android/bank/sdk/invoice/InvoicePreviewModule.kt b/bank-sdk/sdk/src/main/java/net/gini/android/bank/sdk/invoice/InvoicePreviewModule.kt index 1acebc2f15..540ced135b 100644 --- a/bank-sdk/sdk/src/main/java/net/gini/android/bank/sdk/invoice/InvoicePreviewModule.kt +++ b/bank-sdk/sdk/src/main/java/net/gini/android/bank/sdk/invoice/InvoicePreviewModule.kt @@ -5,11 +5,10 @@ import net.gini.android.capture.GiniCapture import net.gini.android.bank.sdk.invoice.network.InvoicePreviewDocumentLayoutNetworkService import net.gini.android.bank.sdk.invoice.network.InvoicePreviewDocumentPagesNetworkService import net.gini.android.bank.sdk.invoice.network.InvoicePreviewFileNetworkService -import net.gini.android.bank.sdk.capture.skonto.model.SkontoData -import net.gini.android.bank.sdk.capture.skonto.model.SkontoInvoiceHighlightBoxes -import net.gini.android.capture.analysis.LastAnalyzedDocumentIdProvider +import net.gini.android.capture.analysis.LastAnalyzedDocumentProvider import net.gini.android.capture.di.getGiniCaptureKoin import net.gini.android.capture.network.GiniCaptureNetworkService +import net.gini.android.capture.network.model.GiniCaptureBox import org.koin.androidx.viewmodel.dsl.viewModel import org.koin.dsl.module @@ -38,13 +37,13 @@ val invoicePreviewScreenModule = module { } // Bridge between GiniCapture and GiniBank - factory { getGiniCaptureKoin().get() } + factory { getGiniCaptureKoin().get() } - viewModel { (skontoData: SkontoData, highlights: Array) -> + viewModel { (documentId: String, infoTextLines: Array, highlights: Array) -> InvoicePreviewViewModel( - documentId = get().provide(), - skontoData = skontoData, - skontoInvoiceHighlights = highlights.toList(), + documentId = documentId, + infoTextLines = infoTextLines.toList(), + highlightBoxes = highlights.toList(), invoicePreviewDocumentPagesNetworkService = get(), invoicePreviewDocumentLayoutNetworkService = get(), invoicePreviewFileNetworkService = get(), diff --git a/bank-sdk/sdk/src/main/java/net/gini/android/bank/sdk/invoice/InvoicePreviewScreen.kt b/bank-sdk/sdk/src/main/java/net/gini/android/bank/sdk/invoice/InvoicePreviewScreen.kt index c49520ef04..798728a954 100644 --- a/bank-sdk/sdk/src/main/java/net/gini/android/bank/sdk/invoice/InvoicePreviewScreen.kt +++ b/bank-sdk/sdk/src/main/java/net/gini/android/bank/sdk/invoice/InvoicePreviewScreen.kt @@ -36,25 +36,18 @@ import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.dp import net.gini.android.bank.sdk.R import net.gini.android.bank.sdk.capture.skonto.formatter.AmountFormatter -import net.gini.android.bank.sdk.invoice.colors.SkontoInvoicePreviewScreenColors -import net.gini.android.bank.sdk.invoice.colors.section.SkontoInvoicePreviewScreenFooterColors -import net.gini.android.bank.sdk.capture.skonto.model.SkontoData import net.gini.android.bank.sdk.capture.util.currencyFormatterWithoutSymbol import net.gini.android.bank.sdk.di.getGiniBankKoin -import net.gini.android.capture.Amount -import net.gini.android.capture.AmountCurrency +import net.gini.android.bank.sdk.invoice.colors.SkontoInvoicePreviewScreenColors +import net.gini.android.bank.sdk.invoice.colors.section.SkontoInvoicePreviewScreenFooterColors import net.gini.android.capture.ui.components.list.ZoomableLazyColumn import net.gini.android.capture.ui.components.topbar.GiniTopBar import net.gini.android.capture.ui.theme.GiniTheme -import java.math.BigDecimal -import java.time.LocalDate -import java.time.format.DateTimeFormatter @Composable internal fun InvoicePreviewScreen( navigateBack: () -> Unit, viewModel: InvoicePreviewViewModel, - amountFormatter: AmountFormatter = getGiniBankKoin().get(), modifier: Modifier = Modifier, colors: SkontoInvoicePreviewScreenColors = SkontoInvoicePreviewScreenColors.colors() ) { @@ -65,7 +58,6 @@ internal fun InvoicePreviewScreen( state = state, onCloseClicked = navigateBack, colors = colors, - amountFormatter = amountFormatter, ) } @@ -74,7 +66,6 @@ private const val INTERFACE_VISIBILITY_ZOOM_THRESHOLD = 1.5f @Composable private fun SkontoInvoiceScreenContent( - amountFormatter: AmountFormatter, state: InvoicePreviewFragmentState, onCloseClicked: () -> Unit, modifier: Modifier = Modifier, @@ -148,19 +139,14 @@ private fun SkontoInvoiceScreenContent( ) } - state.skontoData?.let { data -> - AnimatedVisibility( - modifier = Modifier.align(Alignment.BottomCenter), - visible = isInterfaceVisible - ) { - Footer( - expireDate = data.skontoDueDate, - finalAmount = data.skontoAmountToPay, - fullAmount = data.fullAmountToPay, - colors = colors.footerColors, - amountFormatter = amountFormatter - ) - } + AnimatedVisibility( + modifier = Modifier.align(Alignment.BottomCenter), + visible = isInterfaceVisible + ) { + Footer( + infoTextLines = state.infoTextLines, + colors = colors.footerColors, + ) } } } @@ -190,14 +176,10 @@ private fun CloseScreenButton( @Composable private fun Footer( - amountFormatter: AmountFormatter, - expireDate: LocalDate, - finalAmount: Amount, - fullAmount: Amount, + infoTextLines: List, modifier: Modifier = Modifier, colors: SkontoInvoicePreviewScreenFooterColors, ) { - val dateFormatter = DateTimeFormatter.ofPattern("dd.MM.yyyy") Column( modifier = modifier @@ -207,7 +189,14 @@ private fun Footer( .padding(bottom = 16.dp), verticalArrangement = Arrangement.spacedBy(4.dp), ) { - Text( + infoTextLines.forEach { + Text( + text = it, + style = GiniTheme.typography.caption1, + color = colors.contentColor + ) + } + /*Text( text = stringResource( id = R.string.gbs_skonto_invoice_preview_expire_date, dateFormatter.format(expireDate) @@ -230,7 +219,7 @@ private fun Footer( ), style = GiniTheme.typography.caption1, color = colors.contentColor - ) + )*/ } } @@ -268,11 +257,10 @@ private fun SkontoInvoiceScreenContentPreviewZoomOut() { state = InvoicePreviewFragmentState( isLoading = true, images = emptyList(), - skontoData = previewSkontoData, + infoTextLines = listOf("Line 1", "Line 2"), ), onCloseClicked = {}, interfaceVisible = false, - amountFormatter = AmountFormatter(currencyFormatterWithoutSymbol()) ) } } @@ -285,24 +273,10 @@ private fun SkontoInvoiceScreenContentPreviewZoomIn() { state = InvoicePreviewFragmentState( isLoading = true, images = emptyList(), - skontoData = previewSkontoData, + infoTextLines = listOf("Line 1", "Line 2"), ), onCloseClicked = {}, interfaceVisible = true, - amountFormatter = AmountFormatter(currencyFormatterWithoutSymbol()) ) } -} - -private val previewSkontoData = SkontoData( - skontoPercentageDiscounted = BigDecimal.TEN, - skontoPaymentMethod = SkontoData.SkontoPaymentMethod.Unspecified, - skontoAmountToPay = Amount( - value = BigDecimal.TEN, - currency = AmountCurrency.EUR - ), fullAmountToPay = Amount( - value = BigDecimal.TEN, - currency = AmountCurrency.EUR - ), skontoRemainingDays = 51, - skontoDueDate = LocalDate.now() -) +} \ No newline at end of file diff --git a/bank-sdk/sdk/src/main/java/net/gini/android/bank/sdk/invoice/InvoicePreviewViewModel.kt b/bank-sdk/sdk/src/main/java/net/gini/android/bank/sdk/invoice/InvoicePreviewViewModel.kt index 09ae21025a..44d2c03377 100644 --- a/bank-sdk/sdk/src/main/java/net/gini/android/bank/sdk/invoice/InvoicePreviewViewModel.kt +++ b/bank-sdk/sdk/src/main/java/net/gini/android/bank/sdk/invoice/InvoicePreviewViewModel.kt @@ -10,12 +10,12 @@ import net.gini.android.bank.sdk.invoice.network.InvoicePreviewDocumentLayoutNet import net.gini.android.bank.sdk.invoice.network.InvoicePreviewDocumentPagesNetworkService import net.gini.android.bank.sdk.invoice.network.InvoicePreviewFileNetworkService import net.gini.android.bank.sdk.capture.skonto.model.SkontoData -import net.gini.android.bank.sdk.capture.skonto.model.SkontoInvoiceHighlightBoxes +import net.gini.android.capture.network.model.GiniCaptureBox internal class InvoicePreviewViewModel( - private val documentId: String?, - private val skontoInvoiceHighlights: List, - private val skontoData: SkontoData?, + private val documentId: String, + private val highlightBoxes: List, + private val infoTextLines: List, private val invoicePreviewDocumentLayoutNetworkService: InvoicePreviewDocumentLayoutNetworkService, private val invoicePreviewDocumentPagesNetworkService: InvoicePreviewDocumentPagesNetworkService, private val invoicePreviewFileNetworkService: InvoicePreviewFileNetworkService, @@ -29,7 +29,7 @@ internal class InvoicePreviewViewModel( InvoicePreviewFragmentState( isLoading = true, images = emptyList(), - skontoData = skontoData, + infoTextLines = infoTextLines, ) init { @@ -37,17 +37,15 @@ internal class InvoicePreviewViewModel( } private fun init() = viewModelScope.launch { - requireNotNull(documentId) val layout = invoicePreviewDocumentLayoutNetworkService.getLayout(documentId) val pages = invoicePreviewDocumentPagesNetworkService.getDocumentPages(documentId) val bitmaps = pages.map { documentPage -> - val bitmapBytes = invoicePreviewFileNetworkService.getFile(documentPage.getSmallestImage()!!) + val bitmapBytes = + invoicePreviewFileNetworkService.getFile(documentPage.getSmallestImage()!!) val bitmap = BitmapFactory.decodeByteArray(bitmapBytes, 0, bitmapBytes.size) - val pageHighlights = skontoInvoiceHighlights.find { - it.getExistBoxes().all { it.pageNumber == documentPage.pageNumber } - } + val pageHighlights = highlightBoxes.filter { it.pageNumber == documentPage.pageNumber } val skontoPageLayout = layout.pages.find { documentPage.pageNumber == it.number } @@ -55,7 +53,7 @@ internal class InvoicePreviewViewModel( pageHighlights?.let { invoicePreviewPageImageProcessor.processImage( image = bitmap, - skontoInvoiceHighlightBoxes = pageHighlights, + highlightBoxes = pageHighlights, skontoPageLayout = skontoPageLayout ?: error("Layout for page #$${documentPage.pageNumber} not found") ) diff --git a/bank-sdk/sdk/src/main/java/net/gini/android/bank/sdk/invoice/image/InvoicePreviewPageImageProcessor.kt b/bank-sdk/sdk/src/main/java/net/gini/android/bank/sdk/invoice/image/InvoicePreviewPageImageProcessor.kt index 0e9e81464e..3a7dd0280d 100644 --- a/bank-sdk/sdk/src/main/java/net/gini/android/bank/sdk/invoice/image/InvoicePreviewPageImageProcessor.kt +++ b/bank-sdk/sdk/src/main/java/net/gini/android/bank/sdk/invoice/image/InvoicePreviewPageImageProcessor.kt @@ -4,7 +4,6 @@ import android.graphics.Bitmap import android.graphics.Canvas import android.graphics.Paint import android.graphics.RectF -import net.gini.android.bank.sdk.capture.skonto.model.SkontoInvoiceHighlightBoxes import net.gini.android.capture.internal.network.model.DocumentLayout import net.gini.android.capture.network.model.GiniCaptureBox import org.slf4j.Logger @@ -21,7 +20,7 @@ class InvoicePreviewPageImageProcessor { suspend fun processImage( image: Bitmap, skontoPageLayout: DocumentLayout.Page, - skontoInvoiceHighlightBoxes: SkontoInvoiceHighlightBoxes, + highlightBoxes: List, color: Int = 0xAAFFFF00.toInt(), ): Bitmap = suspendCoroutine { continuation -> @@ -32,9 +31,7 @@ class InvoicePreviewPageImageProcessor { val canvas = Canvas(finalBitmap) - val boxes = skontoInvoiceHighlightBoxes.getExistBoxes() - - val scaledBoxes = boxes.map { it.scale(scaleX, scaleY) } + val scaledBoxes = highlightBoxes.map { it.scale(scaleX, scaleY) } val scaledRectList = scaledBoxes.map { it.toRect() } @@ -45,7 +42,7 @@ class InvoicePreviewPageImageProcessor { if (scaledRectList.isNotEmpty()) { canvas.drawHighlightRect(scaledRectList.unionAll(), paint) } else { - LOG.error("No boxes to highlight detected") + LOG.debug("No boxes to highlight detected") } continuation.resume(finalBitmap) diff --git a/bank-sdk/sdk/src/main/java/net/gini/android/bank/sdk/transactiondocs/TransactionDocs.kt b/bank-sdk/sdk/src/main/java/net/gini/android/bank/sdk/transactiondocs/TransactionDocs.kt index a07f81db99..58e4702b1d 100644 --- a/bank-sdk/sdk/src/main/java/net/gini/android/bank/sdk/transactiondocs/TransactionDocs.kt +++ b/bank-sdk/sdk/src/main/java/net/gini/android/bank/sdk/transactiondocs/TransactionDocs.kt @@ -1,7 +1,7 @@ package net.gini.android.bank.sdk.transactiondocs import kotlinx.coroutines.flow.Flow -import net.gini.android.bank.sdk.transactionlist.model.extractions.ExtractionDocument +import net.gini.android.bank.sdk.transactiondocs.model.extractions.TransactionDoc interface TransactionDocs { @@ -9,6 +9,6 @@ interface TransactionDocs { val transactionDocsSettings: TransactionDocsSettings - val extractionDocumentsFlow: Flow> + val extractionDocumentsFlow: Flow> } diff --git a/bank-sdk/sdk/src/main/java/net/gini/android/bank/sdk/transactiondocs/di/TransactionListModule.kt b/bank-sdk/sdk/src/main/java/net/gini/android/bank/sdk/transactiondocs/di/TransactionListModule.kt index f85643f2a4..a5a0a37622 100644 --- a/bank-sdk/sdk/src/main/java/net/gini/android/bank/sdk/transactiondocs/di/TransactionListModule.kt +++ b/bank-sdk/sdk/src/main/java/net/gini/android/bank/sdk/transactiondocs/di/TransactionListModule.kt @@ -1,7 +1,7 @@ package net.gini.android.bank.sdk.transactiondocs.di import net.gini.android.bank.sdk.GiniBank -import net.gini.android.bank.sdk.transactionlist.internal.GiniBankTransactionDocs +import net.gini.android.bank.sdk.transactiondocs.internal.GiniBankTransactionDocs import org.koin.dsl.module internal val transactionListModule = module { diff --git a/bank-sdk/sdk/src/main/java/net/gini/android/bank/sdk/transactiondocs/internal/GiniBankTransactionDocs.kt b/bank-sdk/sdk/src/main/java/net/gini/android/bank/sdk/transactiondocs/internal/GiniBankTransactionDocs.kt index aafbe35eb8..6653527172 100644 --- a/bank-sdk/sdk/src/main/java/net/gini/android/bank/sdk/transactiondocs/internal/GiniBankTransactionDocs.kt +++ b/bank-sdk/sdk/src/main/java/net/gini/android/bank/sdk/transactiondocs/internal/GiniBankTransactionDocs.kt @@ -1,34 +1,33 @@ -package net.gini.android.bank.sdk.transactionlist.internal +package net.gini.android.bank.sdk.transactiondocs.internal -import kotlinx.coroutines.CoroutineDispatcher -import kotlinx.coroutines.CoroutineScope -import kotlinx.coroutines.flow.MutableStateFlow -import kotlinx.coroutines.launch +import kotlinx.coroutines.flow.filterNotNull +import kotlinx.coroutines.flow.map import net.gini.android.bank.sdk.transactiondocs.TransactionDocs import net.gini.android.bank.sdk.transactiondocs.TransactionDocsConfiguration -import net.gini.android.bank.sdk.transactionlist.model.extractions.ExtractionDocument +import net.gini.android.bank.sdk.transactiondocs.model.extractions.TransactionDoc +import net.gini.android.bank.sdk.transactionlist.internal.GiniTransactionDocsSettings +import net.gini.android.capture.analysis.LastAnalyzedDocumentProvider +import net.gini.android.capture.di.getGiniCaptureKoin internal class GiniBankTransactionDocs internal constructor( override val configuration: TransactionDocsConfiguration, override val transactionDocsSettings: GiniTransactionDocsSettings, - backgroundDispatcher: CoroutineDispatcher, + private val lastAnalyzedDocumentProvider: LastAnalyzedDocumentProvider = getGiniCaptureKoin().get(), ) : TransactionDocs { - private val coroutineScope = CoroutineScope(backgroundDispatcher) - - override val extractionDocumentsFlow: MutableStateFlow> = - MutableStateFlow(listOf( - ExtractionDocument("id", "document1.jpg"), - ExtractionDocument("id", "document2.jpg"), - ExtractionDocument("id", "document3.pdf"), - ExtractionDocument("id", "document4.pdf"), - )) - - internal suspend fun updateExtractionDocumentsBlocking(documents: List) { - extractionDocumentsFlow.emit(documents) + fun deleteDocument(document: TransactionDoc) { + lastAnalyzedDocumentProvider.clear() } - fun updateExtractionDocuments(documents: List) = coroutineScope.launch { - extractionDocumentsFlow.emit(documents) - } + override val extractionDocumentsFlow = lastAnalyzedDocumentProvider + .data + .filterNotNull() + .map { + listOf( + TransactionDoc( + giniApiDocumentId = it.first, + it.second + ) + ) + } } \ No newline at end of file diff --git a/bank-sdk/sdk/src/main/java/net/gini/android/bank/sdk/transactiondocs/model/extractions/ExtractionDocument.kt b/bank-sdk/sdk/src/main/java/net/gini/android/bank/sdk/transactiondocs/model/extractions/TransactionDoc.kt similarity index 66% rename from bank-sdk/sdk/src/main/java/net/gini/android/bank/sdk/transactiondocs/model/extractions/ExtractionDocument.kt rename to bank-sdk/sdk/src/main/java/net/gini/android/bank/sdk/transactiondocs/model/extractions/TransactionDoc.kt index 29d418d95d..9009406f54 100644 --- a/bank-sdk/sdk/src/main/java/net/gini/android/bank/sdk/transactiondocs/model/extractions/ExtractionDocument.kt +++ b/bank-sdk/sdk/src/main/java/net/gini/android/bank/sdk/transactiondocs/model/extractions/TransactionDoc.kt @@ -1,6 +1,6 @@ -package net.gini.android.bank.sdk.transactionlist.model.extractions +package net.gini.android.bank.sdk.transactiondocs.model.extractions -data class ExtractionDocument( +data class TransactionDoc( /** * Unique ID of the document **provided by Gini API**. */ diff --git a/bank-sdk/sdk/src/main/java/net/gini/android/bank/sdk/transactiondocs/ui/extractions/TransactionDocs.kt b/bank-sdk/sdk/src/main/java/net/gini/android/bank/sdk/transactiondocs/ui/extractions/TransactionDocs.kt index 61ddd41946..c7f98dced1 100644 --- a/bank-sdk/sdk/src/main/java/net/gini/android/bank/sdk/transactiondocs/ui/extractions/TransactionDocs.kt +++ b/bank-sdk/sdk/src/main/java/net/gini/android/bank/sdk/transactiondocs/ui/extractions/TransactionDocs.kt @@ -14,13 +14,15 @@ import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.dp import net.gini.android.bank.sdk.GiniBank import net.gini.android.bank.sdk.transactiondocs.ui.extractions.colors.TransactionDocsWidgetColors -import net.gini.android.bank.sdk.transactionlist.internal.GiniBankTransactionDocs +import net.gini.android.bank.sdk.transactiondocs.internal.GiniBankTransactionDocs +import net.gini.android.bank.sdk.transactiondocs.model.extractions.TransactionDoc import net.gini.android.capture.ui.theme.GiniTheme @Composable fun TransactionDocs( modifier: Modifier = Modifier, - colors: TransactionDocsWidgetColors = TransactionDocsWidgetColors.colors() + colors: TransactionDocsWidgetColors = TransactionDocsWidgetColors.colors(), + onDocumentClick: (TransactionDoc) -> Unit = {}, ) { val transactionDocs: GiniBankTransactionDocs? = remember { GiniBank.giniBankTransactionDocs } @@ -35,16 +37,12 @@ fun TransactionDocs( style = GiniTheme.typography.headline6, ) } else { - val documents by transactionDocs.extractionDocumentsFlow.collectAsState() + val documents by transactionDocs.extractionDocumentsFlow.collectAsState(listOf()) TransactionDocsContent( documents = documents, colors = colors, - onDocumentDelete = { - transactionDocs.updateExtractionDocuments(documents.minus(it)) - }, - onDocumentClick = { - - } + onDocumentDelete = transactionDocs::deleteDocument, + onDocumentClick = onDocumentClick ) } } diff --git a/bank-sdk/sdk/src/main/java/net/gini/android/bank/sdk/transactiondocs/ui/extractions/TransactionDocsContent.kt b/bank-sdk/sdk/src/main/java/net/gini/android/bank/sdk/transactiondocs/ui/extractions/TransactionDocsContent.kt index 6b0f7a95fc..ec8eaefe01 100644 --- a/bank-sdk/sdk/src/main/java/net/gini/android/bank/sdk/transactiondocs/ui/extractions/TransactionDocsContent.kt +++ b/bank-sdk/sdk/src/main/java/net/gini/android/bank/sdk/transactiondocs/ui/extractions/TransactionDocsContent.kt @@ -30,7 +30,7 @@ import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.dp import net.gini.android.bank.sdk.R import net.gini.android.bank.sdk.transactiondocs.ui.extractions.colors.TransactionDocsWidgetColors -import net.gini.android.bank.sdk.transactionlist.model.extractions.ExtractionDocument +import net.gini.android.bank.sdk.transactiondocs.model.extractions.TransactionDoc import net.gini.android.capture.ui.components.menu.context.GiniDropdownMenu import net.gini.android.capture.ui.components.menu.context.GiniDropdownMenuItem import net.gini.android.capture.ui.theme.GiniTheme @@ -39,11 +39,11 @@ private val imageExtensions = listOf(".jpg", ".jpeg", ".png", ".gif") @Composable internal fun TransactionDocsContent( - documents: List, + documents: List, modifier: Modifier = Modifier, colors: TransactionDocsWidgetColors = TransactionDocsWidgetColors.colors(), - onDocumentClick: (ExtractionDocument) -> Unit = {}, - onDocumentDelete: (ExtractionDocument) -> Unit = {}, + onDocumentClick: (TransactionDoc) -> Unit = {}, + onDocumentDelete: (TransactionDoc) -> Unit = {}, ) { Card( @@ -72,9 +72,9 @@ internal fun TransactionDocsContent( @Composable private fun DocumentList( - documents: List, - onDocumentClick: (ExtractionDocument) -> Unit, - onDocumentDelete: (ExtractionDocument) -> Unit, + documents: List, + onDocumentClick: (TransactionDoc) -> Unit, + onDocumentDelete: (TransactionDoc) -> Unit, modifier: Modifier = Modifier, colors: TransactionDocsWidgetColors = TransactionDocsWidgetColors.colors(), ) { @@ -95,9 +95,9 @@ private fun DocumentList( @Composable private fun Document( - document: ExtractionDocument, - onDocumentClick: (ExtractionDocument) -> Unit, - onDocumentDelete: (ExtractionDocument) -> Unit, + document: TransactionDoc, + onDocumentClick: (TransactionDoc) -> Unit, + onDocumentDelete: (TransactionDoc) -> Unit, modifier: Modifier = Modifier, colors: TransactionDocsWidgetColors.DocumentItemColors = TransactionDocsWidgetColors.DocumentItemColors.colors(), @@ -244,9 +244,9 @@ private fun PreviewContent() { Surface(modifier = Modifier.fillMaxSize()) { DocumentList( documents = listOf( - ExtractionDocument("id", "document1.jpg"), - ExtractionDocument("id", "document2.jpg"), - ExtractionDocument("id", "document3.pdf"), + TransactionDoc("id", "document1.jpg"), + TransactionDoc("id", "document2.jpg"), + TransactionDoc("id", "document3.pdf"), ), onDocumentClick = {}, onDocumentDelete = {}, diff --git a/bank-sdk/sdk/src/main/java/net/gini/android/bank/sdk/transactiondocs/ui/extractions/view/TransactionDocsView.kt b/bank-sdk/sdk/src/main/java/net/gini/android/bank/sdk/transactiondocs/ui/extractions/view/TransactionDocsView.kt index dccb8e2ae3..cc2dee21d7 100644 --- a/bank-sdk/sdk/src/main/java/net/gini/android/bank/sdk/transactiondocs/ui/extractions/view/TransactionDocsView.kt +++ b/bank-sdk/sdk/src/main/java/net/gini/android/bank/sdk/transactiondocs/ui/extractions/view/TransactionDocsView.kt @@ -3,24 +3,39 @@ package net.gini.android.bank.sdk.transactiondocs.ui.extractions.view import android.content.Context import android.util.AttributeSet import android.widget.FrameLayout +import androidx.compose.runtime.getValue +import androidx.compose.runtime.mutableStateOf +import androidx.compose.runtime.remember import androidx.compose.ui.platform.ComposeView import net.gini.android.bank.sdk.transactiondocs.ui.extractions.TransactionDocs +import net.gini.android.bank.sdk.transactiondocs.model.extractions.TransactionDoc import net.gini.android.capture.ui.theme.GiniTheme class TransactionDocsView @JvmOverloads constructor( context: Context, attrs: AttributeSet? = null ) : FrameLayout(context, attrs) { + private var openInvoicePreview: (TransactionDoc) -> Unit = {} + init { val composeView = ComposeView(context, attrs) composeView.layoutParams = LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT) addView(composeView) + composeView.setContent { + val onDocumentClick by remember { mutableStateOf(openInvoicePreview) } + GiniTheme { - TransactionDocs() + TransactionDocs( + onDocumentClick = onDocumentClick + ) } } } + + fun onDocumentClick(action: (TransactionDoc) -> Unit) { + openInvoicePreview = action + } } \ No newline at end of file diff --git a/bank-sdk/sdk/src/main/res/navigation/gbs_nav_graph.xml b/bank-sdk/sdk/src/main/res/navigation/gbs_nav_graph.xml index f5716975c0..721c0e0d13 100644 --- a/bank-sdk/sdk/src/main/res/navigation/gbs_nav_graph.xml +++ b/bank-sdk/sdk/src/main/res/navigation/gbs_nav_graph.xml @@ -152,13 +152,17 @@ android:label="SkontoInvoiceFragment"> + + + android:name="highlight_boxes" + app:argType="net.gini.android.capture.network.model.GiniCaptureBox[]" /> diff --git a/capture-sdk/default-network/src/main/java/net/gini/android/capture/network/GiniCaptureDefaultNetworkService.kt b/capture-sdk/default-network/src/main/java/net/gini/android/capture/network/GiniCaptureDefaultNetworkService.kt index 9a7506ce4f..1c5fbf67c0 100644 --- a/capture-sdk/default-network/src/main/java/net/gini/android/capture/network/GiniCaptureDefaultNetworkService.kt +++ b/capture-sdk/default-network/src/main/java/net/gini/android/capture/network/GiniCaptureDefaultNetworkService.kt @@ -230,7 +230,7 @@ class GiniCaptureDefaultNetworkService( apiDocument ) giniApiDocuments[apiDocument.id] = apiDocument - callback.success(Result(apiDocument.id)) + callback.success(Result(apiDocument.id, apiDocument.filename)) } is Resource.Error -> { @@ -273,7 +273,7 @@ class GiniCaptureDefaultNetworkService( when (deleteResource) { is Resource.Success -> { LOG.debug("Document deletion success for api id {}", giniApiDocumentId) - callback.success(Result(giniApiDocumentId)) + callback.success(Result(giniApiDocumentId, null)) } is Resource.Error -> { @@ -362,6 +362,7 @@ class GiniCaptureDefaultNetworkService( callback.success( AnalysisResult( compositeDocument.id, + compositeDocument.filename, extractions, compoundExtractions, returnReasons diff --git a/capture-sdk/sdk/src/androidTest/java/net/gini/android/capture/internal/network/GiniCaptureNetworkServiceStub.java b/capture-sdk/sdk/src/androidTest/java/net/gini/android/capture/internal/network/GiniCaptureNetworkServiceStub.java index b85df828ca..6c6b1187ec 100644 --- a/capture-sdk/sdk/src/androidTest/java/net/gini/android/capture/internal/network/GiniCaptureNetworkServiceStub.java +++ b/capture-sdk/sdk/src/androidTest/java/net/gini/android/capture/internal/network/GiniCaptureNetworkServiceStub.java @@ -26,18 +26,19 @@ public class GiniCaptureNetworkServiceStub implements GiniCaptureNetworkService { public static final String DEFAULT_DOCUMENT_ID = "ABCD-EFGH"; + public static final String DEFAULT_DOCUMENT_FILENAME = "Doc"; @Override public CancellationToken upload(@NonNull final Document document, @NonNull final GiniCaptureNetworkCallback callback) { - callback.success(new Result(DEFAULT_DOCUMENT_ID)); + callback.success(new Result(DEFAULT_DOCUMENT_ID, DEFAULT_DOCUMENT_FILENAME)); return new CallbackCancellationToken(callback); } @Override public CancellationToken delete(@NonNull final String giniApiDocumentId, @NonNull final GiniCaptureNetworkCallback callback) { - callback.success(new Result(DEFAULT_DOCUMENT_ID)); + callback.success(new Result(DEFAULT_DOCUMENT_ID, DEFAULT_DOCUMENT_FILENAME)); return new CallbackCancellationToken(callback); } @@ -66,6 +67,7 @@ public void cleanup() { @NonNull protected AnalysisResult createAnalysisResult() { return new AnalysisResult(DEFAULT_DOCUMENT_ID, + DEFAULT_DOCUMENT_FILENAME, Collections.singletonMap("amountToPay", new GiniCaptureSpecificExtraction("amountToPay", "1:00EUR", "amountToPay", diff --git a/capture-sdk/sdk/src/androidTest/java/net/gini/android/capture/internal/network/NetworkRequestsManagerTest.java b/capture-sdk/sdk/src/androidTest/java/net/gini/android/capture/internal/network/NetworkRequestsManagerTest.java index 3d1b413cd3..b39847aae0 100644 --- a/capture-sdk/sdk/src/androidTest/java/net/gini/android/capture/internal/network/NetworkRequestsManagerTest.java +++ b/capture-sdk/sdk/src/androidTest/java/net/gini/android/capture/internal/network/NetworkRequestsManagerTest.java @@ -265,7 +265,7 @@ public void run() { uploadCompletionRunnables.add(new Runnable() { @Override public void run() { - callback.success(new Result(DEFAULT_DOCUMENT_ID)); + callback.success(new Result(DEFAULT_DOCUMENT_ID, DEFAULT_DOCUMENT_FILENAME)); } }); } catch (final InterruptedException e) { @@ -384,7 +384,7 @@ public void run() { uploadCompletionRunnables.add(new Runnable() { @Override public void run() { - callback.success(new Result(DEFAULT_DOCUMENT_ID)); + callback.success(new Result(DEFAULT_DOCUMENT_ID, DEFAULT_DOCUMENT_FILENAME)); } }); } catch (final InterruptedException e) { diff --git a/capture-sdk/sdk/src/main/java/net/gini/android/capture/analysis/AnalysisInteractor.java b/capture-sdk/sdk/src/main/java/net/gini/android/capture/analysis/AnalysisInteractor.java index e169480ca6..b8361c6110 100644 --- a/capture-sdk/sdk/src/main/java/net/gini/android/capture/analysis/AnalysisInteractor.java +++ b/capture-sdk/sdk/src/main/java/net/gini/android/capture/analysis/AnalysisInteractor.java @@ -174,11 +174,11 @@ public static final class ResultHolder { private final List mReturnReasons; private final String mDocumentId; - ResultHolder(@NonNull final Result result, final String documentId) { + ResultHolder(@NonNull final Result result, final String giniApiDocumentId) { this(result, Collections.emptyMap(), Collections.emptyMap(), Collections.emptyList(), - documentId); + giniApiDocumentId); } ResultHolder( @@ -186,12 +186,12 @@ public static final class ResultHolder { @NonNull final Map extractions, @NonNull final Map compoundExtractions, @NonNull final List returnReasons, - final String documentId) { + final String giniApiDocumentId) { mResult = result; mExtractions = extractions; mCompoundExtractions = compoundExtractions; mReturnReasons = returnReasons; - mDocumentId = documentId; + mDocumentId = giniApiDocumentId; } @NonNull diff --git a/capture-sdk/sdk/src/main/java/net/gini/android/capture/analysis/AnalysisScreenPresenter.java b/capture-sdk/sdk/src/main/java/net/gini/android/capture/analysis/AnalysisScreenPresenter.java index ee01d2e8da..56ee0a6391 100644 --- a/capture-sdk/sdk/src/main/java/net/gini/android/capture/analysis/AnalysisScreenPresenter.java +++ b/capture-sdk/sdk/src/main/java/net/gini/android/capture/analysis/AnalysisScreenPresenter.java @@ -1,7 +1,6 @@ package net.gini.android.capture.analysis; import android.app.Activity; -import android.net.Uri; import androidx.annotation.NonNull; import androidx.annotation.Nullable; @@ -11,7 +10,6 @@ import net.gini.android.capture.Document; import net.gini.android.capture.GiniCapture; import net.gini.android.capture.GiniCaptureError; -import net.gini.android.capture.di.CaptureSdkIsolatedKoinContextKt; import net.gini.android.capture.document.DocumentFactory; import net.gini.android.capture.document.GiniCaptureDocument; import net.gini.android.capture.document.GiniCaptureDocumentError; @@ -31,7 +29,6 @@ import net.gini.android.capture.network.model.GiniCaptureSpecificExtraction; import net.gini.android.capture.tracking.AnalysisScreenEvent; import net.gini.android.capture.tracking.AnalysisScreenEvent.ERROR_DETAILS_MAP_KEY; -import net.gini.android.capture.util.UriHelper; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -43,9 +40,7 @@ import java.util.Random; import jersey.repackaged.jsr166e.CompletableFuture; -import kotlin.Lazy; -import static net.gini.android.capture.GiniCaptureError.ErrorCode.MISSING_GINI_CAPTURE_INSTANCE; import static net.gini.android.capture.internal.util.NullabilityHelper.getListOrEmpty; import static net.gini.android.capture.internal.util.NullabilityHelper.getMapOrEmpty; import static net.gini.android.capture.tracking.EventTrackingHelper.trackAnalysisScreenEvent; @@ -306,16 +301,16 @@ public Void apply(final AnalysisInteractor.ResultHolder resultHolder, switch (result) { case SUCCESS_NO_EXTRACTIONS: mAnalysisCompleted = true; - analysisScreenPresenterExtension.getLastAnalyzedDocumentIdProvider() - .update(resultHolder.getDocumentId()); + analysisScreenPresenterExtension.getLastAnalyzedDocumentProvider() + .update(resultHolder.getDocumentId(), "AAAA"); trackAnalysisScreenEvent(AnalysisScreenEvent.NO_RESULTS); getAnalysisFragmentListenerOrNoOp() .onProceedToNoExtractionsScreen(mMultiPageDocument); break; case SUCCESS_WITH_EXTRACTIONS: mAnalysisCompleted = true; - analysisScreenPresenterExtension.getLastAnalyzedDocumentIdProvider() - .update(resultHolder.getDocumentId()); + analysisScreenPresenterExtension.getLastAnalyzedDocumentProvider() + .update(resultHolder.getDocumentId(), "AAAA"); if (resultHolder.getExtractions().isEmpty()) { trackAnalysisScreenEvent(AnalysisScreenEvent.NO_RESULTS); getAnalysisFragmentListenerOrNoOp() diff --git a/capture-sdk/sdk/src/main/java/net/gini/android/capture/analysis/AnalysisScreenPresenterExtension.kt b/capture-sdk/sdk/src/main/java/net/gini/android/capture/analysis/AnalysisScreenPresenterExtension.kt index b52231cbca..248949d828 100644 --- a/capture-sdk/sdk/src/main/java/net/gini/android/capture/analysis/AnalysisScreenPresenterExtension.kt +++ b/capture-sdk/sdk/src/main/java/net/gini/android/capture/analysis/AnalysisScreenPresenterExtension.kt @@ -4,7 +4,7 @@ import net.gini.android.capture.di.getGiniCaptureKoin open class AnalysisScreenPresenterExtension { - val lastAnalyzedDocumentIdProvider: LastAnalyzedDocumentIdProvider by + val lastAnalyzedDocumentProvider: LastAnalyzedDocumentProvider by getGiniCaptureKoin().inject() } diff --git a/capture-sdk/sdk/src/main/java/net/gini/android/capture/analysis/LastAnalyzedDocumentIdProvider.kt b/capture-sdk/sdk/src/main/java/net/gini/android/capture/analysis/LastAnalyzedDocumentIdProvider.kt deleted file mode 100644 index 80d3bbc934..0000000000 --- a/capture-sdk/sdk/src/main/java/net/gini/android/capture/analysis/LastAnalyzedDocumentIdProvider.kt +++ /dev/null @@ -1,16 +0,0 @@ -package net.gini.android.capture.analysis - -class LastAnalyzedDocumentIdProvider { - - private var lastAnalyzedDocumentId: String? = null - - fun provide(): String? = lastAnalyzedDocumentId - - fun update(documentId: String) { - lastAnalyzedDocumentId = documentId - } - - fun clear() { - lastAnalyzedDocumentId = null - } -} diff --git a/capture-sdk/sdk/src/main/java/net/gini/android/capture/analysis/LastAnalyzedDocumentProvider.kt b/capture-sdk/sdk/src/main/java/net/gini/android/capture/analysis/LastAnalyzedDocumentProvider.kt new file mode 100644 index 0000000000..97abe150c5 --- /dev/null +++ b/capture-sdk/sdk/src/main/java/net/gini/android/capture/analysis/LastAnalyzedDocumentProvider.kt @@ -0,0 +1,26 @@ +package net.gini.android.capture.analysis + +import kotlinx.coroutines.CoroutineDispatcher +import kotlinx.coroutines.CoroutineScope +import kotlinx.coroutines.flow.MutableStateFlow +import kotlinx.coroutines.launch +import net.gini.android.capture.document.GiniCaptureDocument + +class LastAnalyzedDocumentProvider( + backgroundDispatcher: CoroutineDispatcher +) { + + private val coroutineScope = CoroutineScope(backgroundDispatcher) + + val data: MutableStateFlow?> = MutableStateFlow(null) + + fun provide(): Pair? = data.value + + fun update(giniDocumentApiId: String, filename: String) { + coroutineScope.launch { data.emit(giniDocumentApiId to filename) } + } + + fun clear() { + coroutineScope.launch { data.emit(null) } + } +} diff --git a/capture-sdk/sdk/src/main/java/net/gini/android/capture/di/ProviderModule.kt b/capture-sdk/sdk/src/main/java/net/gini/android/capture/di/ProviderModule.kt index 5d86fdd65b..3fe4487fb7 100644 --- a/capture-sdk/sdk/src/main/java/net/gini/android/capture/di/ProviderModule.kt +++ b/capture-sdk/sdk/src/main/java/net/gini/android/capture/di/ProviderModule.kt @@ -1,8 +1,13 @@ package net.gini.android.capture.di -import net.gini.android.capture.analysis.LastAnalyzedDocumentIdProvider +import kotlinx.coroutines.Dispatchers +import net.gini.android.capture.analysis.LastAnalyzedDocumentProvider import org.koin.dsl.module internal val providerModule = module { - single { LastAnalyzedDocumentIdProvider() } + single { + LastAnalyzedDocumentProvider( + backgroundDispatcher = Dispatchers.IO + ) + } } diff --git a/capture-sdk/sdk/src/main/java/net/gini/android/capture/internal/network/AnalysisNetworkRequestResult.java b/capture-sdk/sdk/src/main/java/net/gini/android/capture/internal/network/AnalysisNetworkRequestResult.java index 55992af141..25b3039c1d 100644 --- a/capture-sdk/sdk/src/main/java/net/gini/android/capture/internal/network/AnalysisNetworkRequestResult.java +++ b/capture-sdk/sdk/src/main/java/net/gini/android/capture/internal/network/AnalysisNetworkRequestResult.java @@ -23,8 +23,9 @@ public class AnalysisNetworkRequestResult public AnalysisNetworkRequestResult(@NonNull final T giniCaptureDocument, @NonNull final String apiDocumentId, + @NonNull final String apiDocumentFilename, @NonNull final AnalysisResult analysisResult) { - super(giniCaptureDocument, apiDocumentId); + super(giniCaptureDocument, apiDocumentId, apiDocumentFilename); mAnalysisResult = analysisResult; } diff --git a/capture-sdk/sdk/src/main/java/net/gini/android/capture/internal/network/NetworkRequestResult.java b/capture-sdk/sdk/src/main/java/net/gini/android/capture/internal/network/NetworkRequestResult.java index cb3878116c..2229307a1a 100644 --- a/capture-sdk/sdk/src/main/java/net/gini/android/capture/internal/network/NetworkRequestResult.java +++ b/capture-sdk/sdk/src/main/java/net/gini/android/capture/internal/network/NetworkRequestResult.java @@ -6,7 +6,7 @@ /** * Created by Alpar Szotyori on 16.04.2018. - * + *

* Copyright (c) 2018 Gini GmbH. */ @@ -19,11 +19,14 @@ public class NetworkRequestResult { private final T mGiniCaptureDocument; private final String mApiDocumentId; + private final String mApiDocumentFilename; public NetworkRequestResult(@NonNull final T giniCaptureDocument, - @NonNull final String apiDocumentId) { + @NonNull final String apiDocumentId, + @NonNull final String apiDocumentFilename) { mGiniCaptureDocument = giniCaptureDocument; mApiDocumentId = apiDocumentId; + mApiDocumentFilename = apiDocumentFilename; } @NonNull @@ -35,4 +38,9 @@ public T getGiniCaptureDocument() { public String getApiDocumentId() { return mApiDocumentId; } + + @NonNull + public String getApiDocumentFilename() { + return mApiDocumentFilename; + } } diff --git a/capture-sdk/sdk/src/main/java/net/gini/android/capture/internal/network/NetworkRequestsManager.java b/capture-sdk/sdk/src/main/java/net/gini/android/capture/internal/network/NetworkRequestsManager.java index 151bb252e4..95b7d3d246 100644 --- a/capture-sdk/sdk/src/main/java/net/gini/android/capture/internal/network/NetworkRequestsManager.java +++ b/capture-sdk/sdk/src/main/java/net/gini/android/capture/internal/network/NetworkRequestsManager.java @@ -233,7 +233,8 @@ public void success(final Result result) { mApiDocumentIds.put(document.getId(), result.getGiniApiDocumentId()); future.complete(new NetworkRequestResult<>(document, - result.getGiniApiDocumentId())); + result.getGiniApiDocumentId(), + result.getGiniApiDocumentFilename())); } @Override @@ -404,7 +405,8 @@ public void success(final Result result) { document.getId()); future.complete( new NetworkRequestResult<>(document, - result.getGiniApiDocumentId())); + result.getGiniApiDocumentId(), + result.getGiniApiDocumentFilename())); } @Override @@ -519,8 +521,12 @@ public void success( mApiDocumentIds.put(multiPageDocument.getId(), result.getGiniApiDocumentId()); future.complete( - new AnalysisNetworkRequestResult<>(multiPageDocument, - result.getGiniApiDocumentId(), result)); + new AnalysisNetworkRequestResult<>( + multiPageDocument, + result.getGiniApiDocumentId(), + result.getGiniApiDocumentFilename(), + result) + ); } @Override diff --git a/capture-sdk/sdk/src/main/java/net/gini/android/capture/network/AnalysisResult.java b/capture-sdk/sdk/src/main/java/net/gini/android/capture/network/AnalysisResult.java index 0cabf37915..597dfb77d5 100644 --- a/capture-sdk/sdk/src/main/java/net/gini/android/capture/network/AnalysisResult.java +++ b/capture-sdk/sdk/src/main/java/net/gini/android/capture/network/AnalysisResult.java @@ -12,7 +12,7 @@ /** * Created by Alpar Szotyori on 29.01.2018. - * + *

* Copyright (c) 2018 Gini GmbH. */ @@ -31,9 +31,11 @@ public class AnalysisResult extends Result { * @param giniApiDocumentId the id of a document in the Gini API * @param extractions the extractions from the Gini API */ - public AnalysisResult(@NonNull final String giniApiDocumentId, + public AnalysisResult( + @NonNull final String giniApiDocumentId, + @NonNull final String giniApiDocumentFilename, @NonNull final Map extractions) { - super(giniApiDocumentId); + super(giniApiDocumentId, giniApiDocumentFilename); this.extractions = extractions; this.compoundExtractions = Collections.emptyMap(); this.returnReasons = Collections.emptyList(); @@ -42,14 +44,15 @@ public AnalysisResult(@NonNull final String giniApiDocumentId, /** * Create a new analysis result for a Gini API document id. * - * @param giniApiDocumentId the id of a document in the Gini API - * @param extractions the extractions from the Gini API + * @param giniApiDocumentId the id of a document in the Gini API + * @param extractions the extractions from the Gini API * @param compoundExtractions the compound extractions from the Gini API */ public AnalysisResult(@NonNull final String giniApiDocumentId, + @NonNull final String giniApiDocumentFilename, @NonNull final Map extractions, @NonNull final Map compoundExtractions) { - super(giniApiDocumentId); + super(giniApiDocumentId, giniApiDocumentFilename); this.extractions = extractions; this.compoundExtractions = compoundExtractions; this.returnReasons = Collections.emptyList(); @@ -58,15 +61,16 @@ public AnalysisResult(@NonNull final String giniApiDocumentId, /** * Create a new analysis result for a Gini API document id. * - * @param giniApiDocumentId the id of a document in the Gini API - * @param extractions the extractions from the Gini API + * @param giniApiDocumentId the id of a document in the Gini API + * @param extractions the extractions from the Gini API * @param compoundExtractions the compound extractions from the Gini API */ public AnalysisResult(@NonNull final String giniApiDocumentId, + @NonNull final String giniApiDocumentFilename, @NonNull final Map extractions, @NonNull final Map compoundExtractions, @NonNull final List returnReasons) { - super(giniApiDocumentId); + super(giniApiDocumentId, giniApiDocumentFilename); this.extractions = extractions; this.compoundExtractions = compoundExtractions; this.returnReasons = returnReasons; diff --git a/capture-sdk/sdk/src/main/java/net/gini/android/capture/network/Result.java b/capture-sdk/sdk/src/main/java/net/gini/android/capture/network/Result.java index 7efd8a0edb..13639d9103 100644 --- a/capture-sdk/sdk/src/main/java/net/gini/android/capture/network/Result.java +++ b/capture-sdk/sdk/src/main/java/net/gini/android/capture/network/Result.java @@ -12,14 +12,16 @@ public class Result { private final String giniApiDocumentId; + private final String giniApiDocumentFilename; /** * Create a new result with a Gini API document id. * * @param giniApiDocumentId the id of a document in the Gini API */ - public Result(final String giniApiDocumentId) { + public Result(final String giniApiDocumentId, final String giniApiDocumentFilename) { this.giniApiDocumentId = giniApiDocumentId; + this.giniApiDocumentFilename = giniApiDocumentFilename; } /** @@ -28,4 +30,8 @@ public Result(final String giniApiDocumentId) { public String getGiniApiDocumentId() { return giniApiDocumentId; } + + public String getGiniApiDocumentFilename() { + return giniApiDocumentFilename; + } } diff --git a/capture-sdk/sdk/src/test/java/net/gini/android/capture/analysis/AnalysisInteractorTest.java b/capture-sdk/sdk/src/test/java/net/gini/android/capture/analysis/AnalysisInteractorTest.java index 828b68bfe5..81f0304f99 100644 --- a/capture-sdk/sdk/src/test/java/net/gini/android/capture/analysis/AnalysisInteractorTest.java +++ b/capture-sdk/sdk/src/test/java/net/gini/android/capture/analysis/AnalysisInteractorTest.java @@ -221,7 +221,9 @@ public void should_completeWithNoExtractions_whenAnalysisSucceeded_withoutExtrac final GiniCaptureMultiPageDocument multiPageDocument = mock(GiniCaptureMultiPageDocument.class); - final AnalysisResult analysisResult = new AnalysisResult("apiDocumentId", + final AnalysisResult analysisResult = new AnalysisResult( + "apiDocumentId", + "apiDocumentFilename", Collections.emptyMap()); final NetworkRequestsManager networkRequestsManager = createtNetworkRequestsManager( @@ -272,6 +274,7 @@ public void should_completeWithExtractions_whenAnalysisSucceeded_withExtractions extractions.put("paymentReference", mock(GiniCaptureSpecificExtraction.class)); final AnalysisResult analysisResult = new AnalysisResult("apiDocumentId", + "apiDocumentFilename", extractions); final NetworkRequestsManager networkRequestsManager = createtNetworkRequestsManager(