From 9ec1491665e01d8885fa9f78217b8ab60e12994e Mon Sep 17 00:00:00 2001 From: jackkray Date: Thu, 4 Jul 2024 15:14:50 +0200 Subject: [PATCH 1/2] feat(capture-sdk): Migrate to registerForActivityResult Remove deprecated startActivityForResult and implement registerForActivityResult PP-197 --- .../fileimport/FileChooserFragment.kt | 104 ++++++++---------- 1 file changed, 46 insertions(+), 58 deletions(-) diff --git a/capture-sdk/sdk/src/main/java/net/gini/android/capture/internal/fileimport/FileChooserFragment.kt b/capture-sdk/sdk/src/main/java/net/gini/android/capture/internal/fileimport/FileChooserFragment.kt index fb81eefdf7..996a41d5f0 100644 --- a/capture-sdk/sdk/src/main/java/net/gini/android/capture/internal/fileimport/FileChooserFragment.kt +++ b/capture-sdk/sdk/src/main/java/net/gini/android/capture/internal/fileimport/FileChooserFragment.kt @@ -6,7 +6,6 @@ import android.app.Activity.RESULT_OK import android.app.Dialog import android.content.Context import android.content.Intent -import android.content.pm.PackageManager import android.content.pm.ResolveInfo import android.os.Build import android.os.Bundle @@ -15,6 +14,8 @@ import android.provider.MediaStore import android.view.LayoutInflater import android.view.View import android.view.ViewGroup +import androidx.activity.result.ActivityResultLauncher +import androidx.activity.result.contract.ActivityResultContracts import androidx.fragment.app.setFragmentResult import androidx.navigation.fragment.findNavController import androidx.recyclerview.widget.GridLayoutManager @@ -43,7 +44,6 @@ import net.gini.android.capture.internal.util.getLayoutInflaterWithGiniCaptureTh private const val ARG_DOCUMENT_IMPORT_FILE_TYPES = "GC_EXTRA_IN_DOCUMENT_IMPORT_FILE_TYPES" private const val GRID_SPAN_COUNT_PHONE = 3 private const val GRID_SPAN_COUNT_TABLET = 6 -private const val REQ_CODE_CHOOSE_FILE = 1 /** * Internal use only. @@ -51,6 +51,7 @@ private const val REQ_CODE_CHOOSE_FILE = 1 class FileChooserFragment : BottomSheetDialogFragment() { private var docImportEnabledFileTypes: DocumentImportEnabledFileTypes? = null private var binding: GcFragmentFileChooserBinding by autoCleared() + private var chooseFileLauncher: ActivityResultLauncher? = null override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) @@ -61,6 +62,7 @@ class FileChooserFragment : BottomSheetDialogFragment() { it.getSerializable(ARG_DOCUMENT_IMPORT_FILE_TYPES) as? DocumentImportEnabledFileTypes } } + setupFileChooserListener() } override fun onGetLayoutInflater(savedInstanceState: Bundle?): LayoutInflater { @@ -98,6 +100,47 @@ class FileChooserFragment : BottomSheetDialogFragment() { binding.gcFileProviders.layoutManager = GridLayoutManager(requireContext(), getGridSpanCount()) } + private fun setupFileChooserListener() { + chooseFileLauncher = registerForActivityResult(ActivityResultContracts.StartActivityForResult()) { result -> + findNavController().popBackStack() + when (result.resultCode) { + RESULT_OK -> { + result.data?.let { data -> + setFragmentResult(REQUEST_KEY, Bundle().apply { + putParcelable(RESULT_KEY, FileChooserResult.FilesSelected(data)) + }) + } ?: run { + setFragmentResult(REQUEST_KEY, Bundle().apply { + putParcelable( + RESULT_KEY, FileChooserResult.Error( + GiniCaptureError( + GiniCaptureError.ErrorCode.DOCUMENT_IMPORT, + "Activity result data was null." + ) + ) + ) + }) + } + } + + RESULT_CANCELED -> setFragmentResult(REQUEST_KEY, Bundle().apply { + putParcelable(RESULT_KEY, FileChooserResult.Cancelled) + }) + + else -> setFragmentResult(REQUEST_KEY, Bundle().apply { + putParcelable( + RESULT_KEY, FileChooserResult.Error( + GiniCaptureError( + GiniCaptureError.ErrorCode.DOCUMENT_IMPORT, + "Unexpected result code for activity result." + ) + ) + ) + }) + } + } + } + private fun getGridSpanCount(): Int = if (ContextHelper.isTablet(requireContext())) GRID_SPAN_COUNT_TABLET else GRID_SPAN_COUNT_PHONE @@ -137,62 +180,7 @@ class FileChooserFragment : BottomSheetDialogFragment() { item.resolveInfo.activityInfo.packageName, item.resolveInfo.activityInfo.name ) - startActivityForResult(item.intent, REQ_CODE_CHOOSE_FILE) - } - - override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) { - super.onActivityResult(requestCode, resultCode, data) - - findNavController().popBackStack() - - if (requestCode == REQ_CODE_CHOOSE_FILE) { - when (resultCode) { - RESULT_OK -> { - if (data != null) { - setFragmentResult(REQUEST_KEY, Bundle().apply { - putParcelable(RESULT_KEY, FileChooserResult.FilesSelected(data)) - }) - } else { - setFragmentResult(REQUEST_KEY, Bundle().apply { - putParcelable( - RESULT_KEY, FileChooserResult.Error( - GiniCaptureError( - GiniCaptureError.ErrorCode.DOCUMENT_IMPORT, - "Activity result data was null." - ) - ) - ) - }) - } - } - - RESULT_CANCELED -> setFragmentResult(REQUEST_KEY, Bundle().apply { - putParcelable(RESULT_KEY, FileChooserResult.Cancelled) - }) - - else -> setFragmentResult(REQUEST_KEY, Bundle().apply { - putParcelable( - RESULT_KEY, FileChooserResult.Error( - GiniCaptureError( - GiniCaptureError.ErrorCode.DOCUMENT_IMPORT, - "Unexpected result code for activity result." - ) - ) - ) - }) - } - } else { - setFragmentResult(REQUEST_KEY, Bundle().apply { - putParcelable( - RESULT_KEY, FileChooserResult.Error( - GiniCaptureError( - GiniCaptureError.ErrorCode.DOCUMENT_IMPORT, - "Unexpected request code for activity result." - ) - ) - ) - }) - } + chooseFileLauncher?.launch(item.intent) } private fun getImageProviderItems( From 019d3b22a1489e2ff3a4bafcae0b2b375c109545 Mon Sep 17 00:00:00 2001 From: jackkray Date: Thu, 4 Jul 2024 19:51:24 +0200 Subject: [PATCH 2/2] feat(bank-sdk): Migrate to registerForActivityResult PP-197 --- .../bank/sdk/exampleapp/ui/MainActivity.kt | 62 +++++++++---------- 1 file changed, 30 insertions(+), 32 deletions(-) diff --git a/bank-sdk/example-app/src/main/java/net/gini/android/bank/sdk/exampleapp/ui/MainActivity.kt b/bank-sdk/example-app/src/main/java/net/gini/android/bank/sdk/exampleapp/ui/MainActivity.kt index 3857d3c798..967e2f8d6a 100644 --- a/bank-sdk/example-app/src/main/java/net/gini/android/bank/sdk/exampleapp/ui/MainActivity.kt +++ b/bank-sdk/example-app/src/main/java/net/gini/android/bank/sdk/exampleapp/ui/MainActivity.kt @@ -5,6 +5,8 @@ import android.annotation.SuppressLint import android.content.Intent import android.os.Bundle import android.widget.Toast +import androidx.activity.result.ActivityResultLauncher +import androidx.activity.result.contract.ActivityResultContracts import androidx.activity.viewModels import androidx.appcompat.app.AppCompatActivity import androidx.core.content.IntentCompat @@ -43,12 +45,14 @@ class MainActivity : AppCompatActivity() { private var cancellationToken: CancellationToken? = null // should be kept across configuration changes private val permissionHandler = PermissionHandler(this) + private var configurationActivityLauncher: ActivityResultLauncher? = null override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) binding = ActivityMainBinding.inflate(layoutInflater) setContentView(binding.root) addInputHandlers() + setupActivityResultLauncher() showVersions() if (savedInstanceState == null) { if (isIntentActionViewOrSend(intent)) { @@ -89,6 +93,29 @@ class MainActivity : AppCompatActivity() { } + private fun setupActivityResultLauncher() { + configurationActivityLauncher = + registerForActivityResult(ActivityResultContracts.StartActivityForResult()) { result -> + when (result.resultCode) { + RESULT_CANCELED -> {} + RESULT_OK -> { + val configurationResult: Configuration? = result.data?.getParcelableExtra( + CONFIGURATION_BUNDLE + ) + if (configurationResult != null) { + configurationViewModel.setConfiguration(configurationResult) + } + + configurationViewModel.disableCameraPermission( + result.data?.getBooleanExtra( + CAMERA_PERMISSION_BUNDLE, false + ) ?: false + ) + } + } + } + } + private fun addInputHandlers() { binding.buttonStartScanner.setOnClickListener { checkIfAppShouldAskForCameraPermission(EntryPoint.BUTTON) @@ -105,10 +132,8 @@ class MainActivity : AppCompatActivity() { } binding.textGiniBankVersion.setOnClickListener { - startActivityForResult( - Intent( - this, ConfigurationActivity::class.java - ) + configurationActivityLauncher?.launch( + Intent(this, ConfigurationActivity::class.java) .putExtra( CONFIGURATION_BUNDLE, configurationViewModel.configurationFlow.value @@ -116,11 +141,9 @@ class MainActivity : AppCompatActivity() { .putExtra( CAMERA_PERMISSION_BUNDLE, configurationViewModel.disableCameraPermissionFlow.value - ), - REQUEST_CONFIGURATION + ) ) } - } private fun checkIfAppShouldAskForCameraPermission(entryPoint: EntryPoint) { @@ -226,31 +249,6 @@ class MainActivity : AppCompatActivity() { ) } - override fun onActivityResult( - requestCode: Int, resultCode: Int, data: Intent? - ) { - super.onActivityResult(requestCode, resultCode, data) - if (requestCode == REQUEST_CONFIGURATION) { - when (resultCode) { - RESULT_CANCELED -> {} - RESULT_OK -> { - var configurationResult: Configuration? = data?.getParcelableExtra( - CONFIGURATION_BUNDLE - ) - if (configurationResult != null) { - configurationViewModel.setConfiguration(configurationResult) - } - - configurationViewModel.disableCameraPermission( - data?.getBooleanExtra( - CAMERA_PERMISSION_BUNDLE, false - ) ?: false - ) - } - } - } - } - companion object { const val CONFIGURATION_BUNDLE = "CONFIGURATION_BUNDLE"