Skip to content

Commit

Permalink
feat(bank-sdk): Add analysis fragment to the prototype
Browse files Browse the repository at this point in the history
BSDK-23
  • Loading branch information
a-szotyori committed Dec 11, 2023
1 parent 1ece3ba commit 6241a0f
Show file tree
Hide file tree
Showing 6 changed files with 89 additions and 10 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,7 @@ class ClientCaptureFragment : Fragment(R.layout.fragment_client_capture) {
private fun startBankSDK() {
configureBankSDK()
val fragment = GiniBank.getCaptureFlowFragment()
// TODO something like: fragment.setListener(this)

requireActivity().supportFragmentManager.beginTransaction()
.replace(R.id.gc_fragment_host, fragment, "findThisFragment")
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,27 +2,36 @@ package net.gini.android.bank.sdk.capture

import android.content.Context
import android.os.Bundle
import android.util.Log
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import androidx.fragment.app.Fragment
import androidx.fragment.app.FragmentFactory
import androidx.navigation.NavController
import androidx.navigation.fragment.findNavController
import net.gini.android.bank.sdk.GiniBank
import net.gini.android.bank.sdk.R
import net.gini.android.bank.sdk.capture.digitalinvoice.DigitalInvoiceException
import net.gini.android.bank.sdk.capture.digitalinvoice.LineItemsValidator
import net.gini.android.bank.sdk.capture.digitalinvoice.toDigitalInvoiceInput
import net.gini.android.capture.Document
import net.gini.android.capture.GiniCaptureError
import net.gini.android.capture.analysis.AnalysisFragmentCompat
import net.gini.android.capture.analysis.AnalysisFragmentListener
import net.gini.android.capture.camera.CameraFragment
import net.gini.android.capture.camera.CameraFragmentDirections
import net.gini.android.capture.camera.CameraFragmentListener
import net.gini.android.capture.document.GiniCaptureMultiPageDocument
import net.gini.android.capture.document.QRCodeDocument
import net.gini.android.capture.network.model.GiniCaptureCompoundExtraction
import net.gini.android.capture.network.model.GiniCaptureReturnReason
import net.gini.android.capture.network.model.GiniCaptureSpecificExtraction
import net.gini.android.capture.review.multipage.MultiPageReviewFragment
import net.gini.android.capture.review.multipage.MultiPageReviewFragmentDirections
import net.gini.android.capture.review.multipage.MultiPageReviewFragmentListener

class CaptureFlowFragment : Fragment(), CameraFragmentListener, MultiPageReviewFragmentListener {
class CaptureFlowFragment : Fragment(), CameraFragmentListener, MultiPageReviewFragmentListener, AnalysisFragmentListener {

companion object {
fun createInstance(): CaptureFlowFragment {
Expand Down Expand Up @@ -54,7 +63,7 @@ class CaptureFlowFragment : Fragment(), CameraFragmentListener, MultiPageReviewF
}

override fun onCreate(savedInstanceState: Bundle?) {
childFragmentManager.fragmentFactory = CaptureFragmentFactory(this, this)
childFragmentManager.fragmentFactory = CaptureFragmentFactory(this, this, this)
super.onCreate(savedInstanceState)
}

Expand Down Expand Up @@ -90,7 +99,7 @@ class CaptureFlowFragment : Fragment(), CameraFragmentListener, MultiPageReviewF
//new listener onFinishedWithResult -> returns the result to the client

override fun onProceedToAnalysisScreen(document: Document) {
TODO("Not yet implemented")
navController.navigate(CameraFragmentDirections.toAnalysisFragment(document, ""))
}

override fun onProceedToMultiPageReviewScreen(
Expand Down Expand Up @@ -128,7 +137,7 @@ class CaptureFlowFragment : Fragment(), CameraFragmentListener, MultiPageReviewF
}

override fun onProceedToAnalysisScreen(document: GiniCaptureMultiPageDocument<*, *>) {
TODO("Not yet implemented")
navController.navigate(MultiPageReviewFragmentDirections.toAnalysisFragment(document, ""))
}

override fun onReturnToCameraScreenToAddPages() {
Expand All @@ -151,25 +160,60 @@ class CaptureFlowFragment : Fragment(), CameraFragmentListener, MultiPageReviewF
TODO("Not yet implemented")
}

override fun onExtractionsAvailable(
extractions: MutableMap<String, GiniCaptureSpecificExtraction>,
compoundExtractions: MutableMap<String, GiniCaptureCompoundExtraction>,
returnReasons: MutableList<GiniCaptureReturnReason>
) {
Log.d("analysis", "extractions received: $extractions")

if (GiniBank.getCaptureConfiguration()?.returnAssistantEnabled == true) {
try {
LineItemsValidator.validate(compoundExtractions)
// TODO: launch the DigitalInvoiceFragment
// digitalInvoiceLauncher.launch(result.toDigitalInvoiceInput())
} catch (notUsed: DigitalInvoiceException) {
// TODO: return extractions to the client (ClientCaptureFragment -> HostActivity -> ExtractionsActivity)
}
} else {
// TODO: return extractions to the client (ClientCaptureFragment -> HostActivity -> ExtractionsActivity)
}

}

override fun onProceedToNoExtractionsScreen(document: Document) {
// TODO("Not yet implemented")
}

override fun onDefaultPDFAppAlertDialogCancelled() {
// TODO("Not yet implemented")
}

override fun onExtractionsAvailable(extractions: MutableMap<String, GiniCaptureSpecificExtraction>) {
TODO("Not yet implemented")
// TODO("Not yet implemented")
Log.d("analysis", "extractions received: $extractions")

// TODO: return extractions to the client (ClientCaptureFragment -> HostActivity -> ExtractionsActivity)
}

override fun noExtractionsFromQRCode(qrCodeDocument: QRCodeDocument) {
TODO("Not yet implemented")
// TODO("Not yet implemented")
Log.d("analysis", "no extractions from QR code: $qrCodeDocument")
}


}

class CaptureFragmentFactory(
private val cameraListener: CameraFragmentListener,
private val multiPageReviewFragmentListener: MultiPageReviewFragmentListener
private val multiPageReviewFragmentListener: MultiPageReviewFragmentListener,
private val analysisFragmentListener: AnalysisFragmentListener
) : FragmentFactory() {
override fun instantiate(classLoader: ClassLoader, className: String): Fragment {
when (className) {
CameraFragment::class.java.name -> return CameraFragment().apply { setListener(cameraListener) }
MultiPageReviewFragment::class.java.name -> return MultiPageReviewFragment().apply { setListener(multiPageReviewFragmentListener) }
AnalysisFragmentCompat::class.java.name -> return AnalysisFragmentCompat().apply { setListener(analysisFragmentListener) }
else -> return super.instantiate(classLoader, className)
}
}
Expand Down
31 changes: 31 additions & 0 deletions bank-sdk/sdk/src/main/res/navigation/capture_flow_nav_graph.xml
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,18 @@
app:popUpToInclusive="true"/>
<!-- popUpTo and popUpToInclusive are needed to make the review screen the start destination -->
<!-- (i.e., replace the camera screen with the review screen in the back stack) -->
<action
android:id="@+id/to_analysis_fragment"
app:destination="@id/analysisFragment"
app:popUpTo="@id/cameraFragment"
app:popUpToInclusive="true">
<argument
android:name="GC_ARGS_DOCUMENT"
app:argType="net.gini.android.capture.Document" />
<argument
android:name="GC_ARGS_DOCUMENT_ANALYSIS_ERROR_MESSAGE"
app:argType="string" />
</action>
</fragment>

<fragment
Expand All @@ -34,6 +46,25 @@
app:popUpToInclusive="true"/>
<!-- popUpTo and popUpToInclusive are needed to make the camera screen the start destination again -->
<!-- (i.e., replace the review screen with the camera screen in the back stack) -->
<action
android:id="@+id/to_analysis_fragment"
app:destination="@id/analysisFragment"
app:popUpTo="@id/reviewFragment"
app:popUpToInclusive="true">
<argument
android:name="GC_ARGS_DOCUMENT"
app:argType="net.gini.android.capture.Document" />
<argument
android:name="GC_ARGS_DOCUMENT_ANALYSIS_ERROR_MESSAGE"
app:argType="string" />
</action>
</fragment>

<fragment
android:id="@+id/analysisFragment"
android:name="net.gini.android.capture.analysis.AnalysisFragmentCompat"
android:label="fragment_analysis"
tools:layout="@layout/gc_fragment_analysis">
</fragment>

</navigation>
Original file line number Diff line number Diff line change
Expand Up @@ -223,8 +223,10 @@ private void setTopBarInjectedViewContainer() {
injectedViewAdapter.setTitle(mFragment.getActivity().getResources().getString(R.string.gc_title_analysis));

injectedViewAdapter.setOnNavButtonClickListener(new IntervalClickListener(v -> {
mFragment.getActivity().setResult(Activity.RESULT_CANCELED);
mFragment.getActivity().finish();
// TODO fragments: refactor this to use the listener and not the activity directly
// mFragment.getActivity().setResult(Activity.RESULT_CANCELED);
// mFragment.getActivity().finish();
mFragment.getActivity().onBackPressed();
}));
}));
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -451,7 +451,7 @@ public void onBitmapReady(@Nullable final Bitmap bitmap,
}

private void showErrorIfAvailableAndAnalyzeDocument() {
if (mDocumentAnalysisErrorMessage != null) {
if (mDocumentAnalysisErrorMessage != null && !mDocumentAnalysisErrorMessage.isEmpty()) {
final Map<String, Object> errorDetails = new HashMap<>();
errorDetails.put(ERROR_DETAILS_MAP_KEY.MESSAGE, mDocumentAnalysisErrorMessage);

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -185,6 +185,7 @@ private void initMultiPageDocument() {
if (mMultiPageDocument.getDocuments().isEmpty()) {
final Activity activity = getActivity();
if (activity != null) {
// TODO fragments: refactor this to use the listener and not the activity
activity.finish();
}
}
Expand Down

0 comments on commit 6241a0f

Please sign in to comment.