diff --git a/bank-sdk/example-app/src/main/java/net/gini/android/bank/sdk/exampleapp/ui/CaptureSdkStandAloneActivity.kt b/bank-sdk/example-app/src/main/java/net/gini/android/bank/sdk/exampleapp/ui/CaptureSdkStandAloneActivity.kt index 50c6c604d..296809373 100644 --- a/bank-sdk/example-app/src/main/java/net/gini/android/bank/sdk/exampleapp/ui/CaptureSdkStandAloneActivity.kt +++ b/bank-sdk/example-app/src/main/java/net/gini/android/bank/sdk/exampleapp/ui/CaptureSdkStandAloneActivity.kt @@ -4,39 +4,83 @@ import android.content.Context import android.content.Intent import android.os.Bundle import androidx.appcompat.app.AppCompatActivity +import androidx.fragment.app.Fragment +import androidx.fragment.app.FragmentFactory import dagger.hilt.android.AndroidEntryPoint -import net.gini.android.bank.sdk.di.BankSdkIsolatedKoinContext import net.gini.android.bank.sdk.exampleapp.R import net.gini.android.bank.sdk.exampleapp.core.ExampleUtil.isIntentActionViewOrSend import net.gini.android.bank.sdk.exampleapp.ui.util.CaptureResultListener +import net.gini.android.capture.Document +import net.gini.android.capture.GiniCaptureFragment +import net.gini.android.capture.GiniCaptureFragmentListener @AndroidEntryPoint class CaptureSdkStandAloneActivity : AppCompatActivity() { + private var listener: CaptureResultListener? = null + override fun onCreate(savedInstanceState: Bundle?) { - BankSdkIsolatedKoinContext.init(this) + listener = CaptureResultListener(this) + supportFragmentManager.fragmentFactory = + ClientCaptureSDKFragmentFactory(listener!!, null) super.onCreate(savedInstanceState) - // same view is required for both Bank SDK and Capture SDK, no need to create a separate xml - setContentView(R.layout.activity_capture_flow_host) + setContentView(R.layout.activity_stand_alone_capture_flow) if (savedInstanceState == null) { if (intent != null && isIntentActionViewOrSend(intent)) { ClientCaptureSDKFragment().startCaptureSDKForIntent( this, intent, - CaptureResultListener(this) + listener!! ) - } else { - // start simple capture SDK - val giniCaptureFragment = ClientCaptureSDKFragment() - this.supportFragmentManager.beginTransaction() - .replace(R.id.fragment_host, giniCaptureFragment, "fragment_host") - .addToBackStack(null).commit() + val clientCaptureSDK = ClientCaptureSDKFragment() + supportFragmentManager.beginTransaction() + .replace( + R.id.fragment_host, + clientCaptureSDK, + ClientCaptureSDKFragment::class.java.name + ) + .addToBackStack(null) + .commit() + clientCaptureSDK.setListener(listener = listener!!) } + } else { + restoreFragmentListener() } } companion object { fun newIntent(context: Context) = Intent(context, CaptureSdkStandAloneActivity::class.java) } + + private fun restoreFragmentListener() { + val fragment = + supportFragmentManager.findFragmentByTag(ClientCaptureSDKFragment::class.java.name) as? ClientCaptureSDKFragment? + listener?.let { fragment?.setListener(it) } + } + + override fun onDestroy() { + super.onDestroy() + listener = null + } +} + +class ClientCaptureSDKFragmentFactory( + private val giniCaptureFragmentListener: GiniCaptureFragmentListener, + private var openWithDocument: Document? = null +) : FragmentFactory() { + override fun instantiate(classLoader: ClassLoader, className: String): Fragment { + return when (className) { + GiniCaptureFragment::class.java.name -> GiniCaptureFragment.createInstance( + openWithDocument + ) { openWithDocument = null } + .apply { + setListener( + giniCaptureFragmentListener + ) + } + + else -> super.instantiate(classLoader, className) + } + } } \ No newline at end of file diff --git a/bank-sdk/example-app/src/main/java/net/gini/android/bank/sdk/exampleapp/ui/ClientCaptureSDKFragment.kt b/bank-sdk/example-app/src/main/java/net/gini/android/bank/sdk/exampleapp/ui/ClientCaptureSDKFragment.kt index 111833286..fd01de375 100644 --- a/bank-sdk/example-app/src/main/java/net/gini/android/bank/sdk/exampleapp/ui/ClientCaptureSDKFragment.kt +++ b/bank-sdk/example-app/src/main/java/net/gini/android/bank/sdk/exampleapp/ui/ClientCaptureSDKFragment.kt @@ -9,10 +9,8 @@ import androidx.appcompat.app.AppCompatActivity import androidx.fragment.app.Fragment import androidx.lifecycle.lifecycleScope import kotlinx.coroutines.launch -import net.gini.android.bank.sdk.capture.ResultError import net.gini.android.bank.sdk.exampleapp.R import net.gini.android.bank.sdk.exampleapp.core.PermissionHandler -import net.gini.android.capture.Amount import net.gini.android.capture.CaptureSDKResult import net.gini.android.capture.DocumentImportEnabledFileTypes import net.gini.android.capture.GiniCapture @@ -27,6 +25,7 @@ class ClientCaptureSDKFragment : GiniCaptureFragmentListener { private lateinit var permissionHandler: PermissionHandler + private var captureFragmentListener: GiniCaptureFragmentListener? = null override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) @@ -93,6 +92,10 @@ class ClientCaptureSDKFragment : private var mFileImportCancellationToken: CancellationToken? = null + fun setListener(listener: GiniCaptureFragmentListener) { + this.captureFragmentListener = listener + } + fun startCaptureSDKForIntent( context: AppCompatActivity, openWithIntent: Intent, @@ -114,7 +117,6 @@ class ClientCaptureSDKFragment : // Set the listener to receive the Gini Bank SDK's results result.fragment.setListener(listener) - // Show the CaptureFlowFragment for example via // the fragment manager: context.supportFragmentManager.beginTransaction() @@ -153,82 +155,20 @@ class ClientCaptureSDKFragment : } - fun stopGiniCaptureSDKWithTransferSummary(paymentRecipient: String, - paymentReference: String, - paymentPurpose: String, - iban: String, - bic: String, - amount: Amount - ) { - // After the user has seen and potentially corrected the extractions, send the final - // transfer summary values to Gini which will be used to improve the future - // extraction accuracy: - GiniCapture.sendTransferSummary( - paymentRecipient, - paymentReference, - paymentPurpose, - iban, - bic, - amount, - null - ) - - // cleanup the capture SDK after sending the transfer summary - GiniCapture.cleanup(requireActivity()) - } - override fun onFinishedWithResult(result: CaptureSDKResult) { - when (result) { - is CaptureSDKResult.Success -> { - startActivity( - ExtractionsActivity.getStartIntent( - requireContext(), - result.specificExtractions - ) - ) - requireActivity().finish() - } - - is CaptureSDKResult.Error -> { - - Toast.makeText( - requireContext(), - "Error: ${(result.value as ResultError.FileImport).code} " + - "${(result.value as ResultError.FileImport).message}", - Toast.LENGTH_LONG - ).show() - - requireActivity().finish() - } - - CaptureSDKResult.Empty -> { - requireActivity().finish() - } - - CaptureSDKResult.Cancel -> { - requireActivity().finish() - } + finishWithResult(result) + } - CaptureSDKResult.EnterManually -> { - Toast.makeText( - requireContext(), - "Scan exited for manual enter mode", - Toast.LENGTH_SHORT - ).show() - requireActivity().finish() - } - } + private fun finishWithResult(result: CaptureSDKResult) { + captureFragmentListener?.onFinishedWithResult(result) } override fun onDestroy() { super.onDestroy() + captureFragmentListener = null if (mFileImportCancellationToken != null) { mFileImportCancellationToken!!.cancel() mFileImportCancellationToken = null } } - - } - - diff --git a/bank-sdk/example-app/src/main/java/net/gini/android/bank/sdk/exampleapp/ui/util/CaptureResultListener.kt b/bank-sdk/example-app/src/main/java/net/gini/android/bank/sdk/exampleapp/ui/util/CaptureResultListener.kt index 552ec3d99..3cb38446b 100644 --- a/bank-sdk/example-app/src/main/java/net/gini/android/bank/sdk/exampleapp/ui/util/CaptureResultListener.kt +++ b/bank-sdk/example-app/src/main/java/net/gini/android/bank/sdk/exampleapp/ui/util/CaptureResultListener.kt @@ -46,7 +46,8 @@ class CaptureResultListener(val context: Activity) : GiniCaptureFragmentListener context.startActivity( ExtractionsActivity.getStartIntent( context, - result.specificExtractions + result.specificExtractions, + true ) ) context.finish() diff --git a/bank-sdk/example-app/src/main/res/layout/activity_stand_alone_capture_flow.xml b/bank-sdk/example-app/src/main/res/layout/activity_stand_alone_capture_flow.xml new file mode 100644 index 000000000..f0fa5e7b3 --- /dev/null +++ b/bank-sdk/example-app/src/main/res/layout/activity_stand_alone_capture_flow.xml @@ -0,0 +1,18 @@ + + + + + + + \ No newline at end of file diff --git a/capture-sdk/sdk/src/main/java/net/gini/android/capture/GiniCaptureFragment.kt b/capture-sdk/sdk/src/main/java/net/gini/android/capture/GiniCaptureFragment.kt index c5dd638da..6d5726ea1 100644 --- a/capture-sdk/sdk/src/main/java/net/gini/android/capture/GiniCaptureFragment.kt +++ b/capture-sdk/sdk/src/main/java/net/gini/android/capture/GiniCaptureFragment.kt @@ -49,7 +49,7 @@ class GiniCaptureFragment( CancelListener { private lateinit var navController: NavController - private lateinit var giniCaptureFragmentListener: GiniCaptureFragmentListener + private var giniCaptureFragmentListener: GiniCaptureFragmentListener? = null private lateinit var oncePerInstallEventStore: OncePerInstallEventStore /** @@ -207,8 +207,9 @@ class GiniCaptureFragment( override fun onDestroy() { super.onDestroy() if (!didFinishWithResult && !willBeRestored) { - giniCaptureFragmentListener.onFinishedWithResult(CaptureSDKResult.Cancel) + giniCaptureFragmentListener?.onFinishedWithResult(CaptureSDKResult.Cancel) } + giniCaptureFragmentListener = null if (willBeRestored) { UserAnalytics.flushEvents() } @@ -242,12 +243,12 @@ class GiniCaptureFragment( document: Document, callback: CameraFragmentListener.DocumentCheckResultCallback ) { - giniCaptureFragmentListener.onCheckImportedDocument(document, callback) + giniCaptureFragmentListener?.onCheckImportedDocument(document, callback) } override fun onError(error: GiniCaptureError) { didFinishWithResult = true - giniCaptureFragmentListener.onFinishedWithResult(CaptureSDKResult.Error(error)) + giniCaptureFragmentListener?.onFinishedWithResult(CaptureSDKResult.Error(error)) } override fun onExtractionsAvailable( @@ -257,7 +258,7 @@ class GiniCaptureFragment( ) { didFinishWithResult = true lastExtractionsProvider.update(extractions) - giniCaptureFragmentListener.onFinishedWithResult( + giniCaptureFragmentListener?.onFinishedWithResult( CaptureSDKResult.Success( extractions, compoundExtractions, @@ -280,7 +281,7 @@ class GiniCaptureFragment( override fun onExtractionsAvailable(extractions: MutableMap) { didFinishWithResult = true lastExtractionsProvider.update(extractions) - giniCaptureFragmentListener.onFinishedWithResult( + giniCaptureFragmentListener?.onFinishedWithResult( CaptureSDKResult.Success( extractions, emptyMap(), @@ -291,7 +292,7 @@ class GiniCaptureFragment( override fun onEnterManuallyPressed() { didFinishWithResult = true - giniCaptureFragmentListener.onFinishedWithResult(CaptureSDKResult.EnterManually) + giniCaptureFragmentListener?.onFinishedWithResult(CaptureSDKResult.EnterManually) } override fun onCancelFlow() { @@ -300,7 +301,7 @@ class GiniCaptureFragment( private fun finishWithCancel() { didFinishWithResult = true - giniCaptureFragmentListener.onFinishedWithResult(CaptureSDKResult.Cancel) + giniCaptureFragmentListener?.onFinishedWithResult(CaptureSDKResult.Cancel) } private fun setAnalyticsEntryPointProperty(isOpenWithDocumentExists: Boolean) {