From 256e2adf62f118bff595ee29029d6a60d2c0706b Mon Sep 17 00:00:00 2001 From: naresh chocha Date: Tue, 9 Sep 2025 14:10:25 +0530 Subject: [PATCH 1/5] build: update Kotlin, AGP, and target JVM version This commit updates the following: - Kotlin version to 2.2.10 - Android Gradle Plugin to version 8.13.0 - Compose BOM to version 2025.08.01 - JDK version to 24 in `gradle/libs.versions.toml` - JVM target to 24 in `sample/build.gradle.kts` and `filepickerlibrary/build.gradle.kts` --- filepickerlibrary/build.gradle.kts | 2 +- gradle/libs.versions.toml | 8 ++++---- sample/build.gradle.kts | 2 +- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/filepickerlibrary/build.gradle.kts b/filepickerlibrary/build.gradle.kts index a2564c5..e7578be 100644 --- a/filepickerlibrary/build.gradle.kts +++ b/filepickerlibrary/build.gradle.kts @@ -47,7 +47,7 @@ android { } kotlin { compilerOptions { - jvmTarget.set(JvmTarget.JVM_21) + jvmTarget.set(JvmTarget.JVM_24) } } } diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index d11a880..4b23223 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -1,21 +1,21 @@ [versions] -agp = "8.12.0" +agp = "8.13.0" mavenPublish = "0.34.0" -kotlin = "2.2.0" +kotlin = "2.2.10" detekt = "1.23.8" # build config compileSdk = "36" targetSdk = "36" minSdk = "21" -jdkVersion = "VERSION_21" +jdkVersion = "VERSION_24" # core core-splashscreen="1.0.1" # compose activityCompose = "1.10.1" -composeBom = "2025.07.00" +composeBom = "2025.08.01" [libraries] # core diff --git a/sample/build.gradle.kts b/sample/build.gradle.kts index dbb4ba7..f39e0f2 100644 --- a/sample/build.gradle.kts +++ b/sample/build.gradle.kts @@ -63,7 +63,7 @@ android { } kotlin { compilerOptions { - jvmTarget.set(JvmTarget.JVM_21) + jvmTarget.set(JvmTarget.JVM_24) } } } From 00698713fbbae5f716ef6f497e534f5721bc2164 Mon Sep 17 00:00:00 2001 From: naresh chocha Date: Thu, 11 Sep 2025 12:02:22 +0530 Subject: [PATCH 2/5] feat: add configType to result intents This commit introduces a `configType` parameter to the `setSuccessResult` functions in `FilePickerResultHandler.kt`. This allows passing configuration type information within the result Intent. - Added `CONFIG_TYPE` constant in `Const.kt`. - Updated single and multiple URI `setSuccessResult` functions to include `configType` in the result Intent extras. --- .../utilities/FilePickerResultHandler.kt | 8 ++++++-- .../filepickerlibrary/utilities/appConst/Const.kt | 3 +++ 2 files changed, 9 insertions(+), 2 deletions(-) diff --git a/filepickerlibrary/src/main/java/com/nareshchocha/filepickerlibrary/utilities/FilePickerResultHandler.kt b/filepickerlibrary/src/main/java/com/nareshchocha/filepickerlibrary/utilities/FilePickerResultHandler.kt index 408a897..859794d 100644 --- a/filepickerlibrary/src/main/java/com/nareshchocha/filepickerlibrary/utilities/FilePickerResultHandler.kt +++ b/filepickerlibrary/src/main/java/com/nareshchocha/filepickerlibrary/utilities/FilePickerResultHandler.kt @@ -33,7 +33,8 @@ internal fun List.getFilePathList(context: Context): ArrayList { internal fun Activity.setSuccessResult( fileUri: Uri?, filePath: String? = null, - isFromCapture: Boolean = false + isFromCapture: Boolean = false, + configType: String? = null ) { log("File Uri : $fileUri", LogPriority.INFO_LOG, Const.LogTag.FILE_PICKER_RESULT) log("filePath : $filePath", LogPriority.INFO_LOG, Const.LogTag.FILE_PICKER_RESULT) @@ -49,6 +50,7 @@ internal fun Activity.setSuccessResult( fileUri?.let { data = it } if (isFromCapture) putExtra(Const.BundleExtras.FROM_CAPTURE, true) filePath?.let { putExtra(Const.BundleExtras.FILE_PATH, it) } + configType?.let { putExtra(Const.BundleExtras.CONFIG_TYPE, it) } } ) finish() @@ -57,7 +59,8 @@ internal fun Activity.setSuccessResult( internal fun Activity.setSuccessResult( fileUri: List?, filePath: ArrayList? = null, - isFromCapture: Boolean = false + isFromCapture: Boolean = false, + configType: String? = null ) { log("File Uri : $fileUri", LogPriority.INFO_LOG, Const.LogTag.FILE_PICKER_RESULT) log("filePath : $filePath", LogPriority.INFO_LOG, Const.LogTag.FILE_PICKER_RESULT) @@ -77,6 +80,7 @@ internal fun Activity.setSuccessResult( clipData = mClipData filePath?.let { putStringArrayListExtra(Const.BundleExtras.FILE_PATH_LIST, it) } } + configType?.let { putExtra(Const.BundleExtras.CONFIG_TYPE, it) } } ) finish() diff --git a/filepickerlibrary/src/main/java/com/nareshchocha/filepickerlibrary/utilities/appConst/Const.kt b/filepickerlibrary/src/main/java/com/nareshchocha/filepickerlibrary/utilities/appConst/Const.kt index 3546f8f..69fd311 100644 --- a/filepickerlibrary/src/main/java/com/nareshchocha/filepickerlibrary/utilities/appConst/Const.kt +++ b/filepickerlibrary/src/main/java/com/nareshchocha/filepickerlibrary/utilities/appConst/Const.kt @@ -95,5 +95,8 @@ internal object Const { /** Key for error messages. */ const val ERROR = "ERROR" + + /** Key for the configuration type. */ + const val CONFIG_TYPE = "CONFIG_TYPE" } } From b8c7f214b90e2cf552cfdc3d5c6119166cd5c672 Mon Sep 17 00:00:00 2001 From: naresh chocha Date: Thu, 11 Sep 2025 12:02:48 +0530 Subject: [PATCH 3/5] refactor: vertically center items in PopupItem This commit updates the `PopupItem` composable to vertically center its content within the `Row`. - Modified `Row` in `PopupItem.kt` to include `verticalAlignment = Alignment.CenterVertically`. --- .../filepickerlibrary/ui/components/item/PopupItem.kt | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/filepickerlibrary/src/main/java/com/nareshchocha/filepickerlibrary/ui/components/item/PopupItem.kt b/filepickerlibrary/src/main/java/com/nareshchocha/filepickerlibrary/ui/components/item/PopupItem.kt index 3cb9221..33ce297 100644 --- a/filepickerlibrary/src/main/java/com/nareshchocha/filepickerlibrary/ui/components/item/PopupItem.kt +++ b/filepickerlibrary/src/main/java/com/nareshchocha/filepickerlibrary/ui/components/item/PopupItem.kt @@ -7,6 +7,7 @@ import androidx.compose.foundation.layout.padding import androidx.compose.material3.Text import androidx.compose.material3.TextButton import androidx.compose.runtime.Composable +import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.res.painterResource import androidx.compose.ui.unit.dp @@ -26,7 +27,9 @@ internal fun PopupItem( onClick = { onItemClick(item) }, modifier = modifier ) { - Row { + Row( + verticalAlignment = Alignment.CenterVertically + ) { val iconRes = item.popUpIcon if (iconRes != null && iconRes != 0) { Image( From e38ed337575e22909e1b2b1f3b274824d3432364 Mon Sep 17 00:00:00 2001 From: naresh chocha Date: Thu, 11 Sep 2025 12:03:07 +0530 Subject: [PATCH 4/5] refactor: pass config type in success results and improve PopUpActivity This commit introduces the following changes: - Passes the specific config class name (`PickMediaConfig`, `DocumentFilePickerConfig`, `ImageCaptureConfig`, `VideoCaptureConfig`) in the `setSuccessResult` function calls within their respective activities. This allows for better identification of the originating picker type. - In `PopUpActivity`: - Refactors the result handling from `FilePickerResultContracts.AnyFilePicker()` to simplify the conditions for setting success or canceled results. - Sets a specific error message "User dismissed the popup" when the dialog or bottom sheet is dismissed. - Extracts common UI logic for dialog and bottom sheet content into a new composable function `PopupContent`. - Replaces `Row` with `horizontalScroll` and `Column` with `verticalScroll` with `LazyRow` and `LazyColumn` respectively in the `ItemList` composable for improved performance with lists of items. --- .../activitys/DocumentFilePickerActivity.kt | 18 +++- .../ui/activitys/ImageCaptureActivity.kt | 7 +- .../ui/activitys/MediaFilePickerActivity.kt | 18 +++- .../ui/activitys/PopUpActivity.kt | 94 +++++++++---------- .../ui/activitys/VideoCaptureActivity.kt | 7 +- 5 files changed, 84 insertions(+), 60 deletions(-) diff --git a/filepickerlibrary/src/main/java/com/nareshchocha/filepickerlibrary/ui/activitys/DocumentFilePickerActivity.kt b/filepickerlibrary/src/main/java/com/nareshchocha/filepickerlibrary/ui/activitys/DocumentFilePickerActivity.kt index 91c0941..5e4e484 100644 --- a/filepickerlibrary/src/main/java/com/nareshchocha/filepickerlibrary/ui/activitys/DocumentFilePickerActivity.kt +++ b/filepickerlibrary/src/main/java/com/nareshchocha/filepickerlibrary/ui/activitys/DocumentFilePickerActivity.kt @@ -48,15 +48,27 @@ internal class DocumentFilePickerActivity : ComponentActivity() { if (mDocumentFilePickerConfig?.allowMultiple == true && result.data?.clipData != null) { val uris = result.data?.getClipDataUris() val filePaths = uris?.getFilePathList(this) - setSuccessResult(uris, filePath = filePaths) + setSuccessResult( + fileUri = uris, + filePath = filePaths, + configType = DocumentFilePickerConfig::class.java.name + ) } else if (result.data?.data != null) { val data = result.data?.data val filePath = data?.let { FileUtils.getRealPath(this, it) } - setSuccessResult(data, filePath) + setSuccessResult( + fileUri = data, + filePath = filePath, + configType = DocumentFilePickerConfig::class.java.name + ) } else if (result.data?.clipData != null) { val uri = result.data?.getClipDataUris()?.firstOrNull() val filePath = uri?.let { FileUtils.getRealPath(this, it) } - setSuccessResult(uri, filePath) + setSuccessResult( + fileUri = uri, + filePath = filePath, + configType = DocumentFilePickerConfig::class.java.name + ) } else { setCanceledResult(getString(R.string.document_file_picker_no_data_error)) } diff --git a/filepickerlibrary/src/main/java/com/nareshchocha/filepickerlibrary/ui/activitys/ImageCaptureActivity.kt b/filepickerlibrary/src/main/java/com/nareshchocha/filepickerlibrary/ui/activitys/ImageCaptureActivity.kt index e5f30e9..777a75f 100644 --- a/filepickerlibrary/src/main/java/com/nareshchocha/filepickerlibrary/ui/activitys/ImageCaptureActivity.kt +++ b/filepickerlibrary/src/main/java/com/nareshchocha/filepickerlibrary/ui/activitys/ImageCaptureActivity.kt @@ -67,7 +67,12 @@ internal class ImageCaptureActivity : ComponentActivity() { ActivityResultContracts.StartActivityForResult() ) { result -> if (result.resultCode == RESULT_OK) { - setSuccessResult(imageFileUri, imageFile?.absolutePath, true) + setSuccessResult( + fileUri = imageFileUri, + filePath = imageFile?.absolutePath, + isFromCapture = true, + configType = ImageCaptureConfig::class.java.name + ) } else { imageFile?.delete() setCanceledResult("File Picker Result Error: ${result.resultCode}") diff --git a/filepickerlibrary/src/main/java/com/nareshchocha/filepickerlibrary/ui/activitys/MediaFilePickerActivity.kt b/filepickerlibrary/src/main/java/com/nareshchocha/filepickerlibrary/ui/activitys/MediaFilePickerActivity.kt index f33d4ac..8bab07a 100644 --- a/filepickerlibrary/src/main/java/com/nareshchocha/filepickerlibrary/ui/activitys/MediaFilePickerActivity.kt +++ b/filepickerlibrary/src/main/java/com/nareshchocha/filepickerlibrary/ui/activitys/MediaFilePickerActivity.kt @@ -49,15 +49,27 @@ internal class MediaFilePickerActivity : ComponentActivity() { if (mPickMediaConfig?.allowMultiple == true && result.data?.clipData != null) { val uris = result.data?.getClipDataUris() val filePaths = uris?.getFilePathList(this) - setSuccessResult(uris, filePath = filePaths) + setSuccessResult( + fileUri = uris, + filePath = filePaths, + configType = PickMediaConfig::class.java.name + ) } else if (result.data?.data != null) { val data = result.data?.data val filePath = data?.let { FileUtils.getRealPath(this, it) } - setSuccessResult(data, filePath) + setSuccessResult( + fileUri = data, + filePath = filePath, + configType = PickMediaConfig::class.java.name + ) } else if (result.data?.clipData != null) { val uri = result.data?.getClipDataUris()?.firstOrNull() val filePath = uri?.let { FileUtils.getRealPath(this, it) } - setSuccessResult(uri, filePath) + setSuccessResult( + fileUri = uri, + filePath = filePath, + configType = PickMediaConfig::class.java.name + ) } else { setCanceledResult(getString(R.string.media_file_picker_no_data_error)) } diff --git a/filepickerlibrary/src/main/java/com/nareshchocha/filepickerlibrary/ui/activitys/PopUpActivity.kt b/filepickerlibrary/src/main/java/com/nareshchocha/filepickerlibrary/ui/activitys/PopUpActivity.kt index 4abafbe..dd53fc2 100644 --- a/filepickerlibrary/src/main/java/com/nareshchocha/filepickerlibrary/ui/activitys/PopUpActivity.kt +++ b/filepickerlibrary/src/main/java/com/nareshchocha/filepickerlibrary/ui/activitys/PopUpActivity.kt @@ -7,14 +7,13 @@ import androidx.activity.ComponentActivity import androidx.activity.compose.setContent import androidx.activity.enableEdgeToEdge import androidx.compose.foundation.background -import androidx.compose.foundation.horizontalScroll import androidx.compose.foundation.layout.Column -import androidx.compose.foundation.layout.Row import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.padding -import androidx.compose.foundation.rememberScrollState +import androidx.compose.foundation.lazy.LazyColumn +import androidx.compose.foundation.lazy.LazyRow +import androidx.compose.foundation.lazy.items import androidx.compose.foundation.shape.RoundedCornerShape -import androidx.compose.foundation.verticalScroll import androidx.compose.material3.ExperimentalMaterial3Api import androidx.compose.material3.MaterialTheme import androidx.compose.material3.ModalBottomSheet @@ -48,17 +47,15 @@ internal class PopUpActivity : ComponentActivity() { private val intentResultLauncher = registerForActivityResult(FilePickerResultContracts.AnyFilePicker()) { result -> - when { - !result.selectedFileUris.isNullOrEmpty() && !result.selectedFilePaths.isNullOrEmpty() -> - setSuccessResult( - result.selectedFileUris, - result.selectedFilePaths.toArrayList() - ) - - result.selectedFileUri != null && result.selectedFilePath != null -> - setSuccessResult(result.selectedFileUri, result.selectedFilePath) - - else -> setCanceledResult(result.errorMessage) + if (!result.selectedFileUris.isNullOrEmpty()) { + setSuccessResult( + result.selectedFileUris, + result?.selectedFilePaths?.toArrayList() + ) + } else if (result.selectedFileUri != null) { + setSuccessResult(result.selectedFileUri, result.selectedFilePath) + } else { + setCanceledResult(result.errorMessage) } finish() } @@ -89,7 +86,6 @@ internal class PopUpActivity : ComponentActivity() { items: List, onItemClick: (BaseConfig) -> Unit ) { - val title = config.chooserTitle ?: stringResource(R.string.str_choose_option) AppDialog( modifier = Modifier.background( @@ -97,23 +93,11 @@ internal class PopUpActivity : ComponentActivity() { shape = RoundedCornerShape(config.cornerSize.dp) ), onDismissRequest = { - setCanceledResult() + setCanceledResult("User dismissed the popup") finish() } ) { - Column { - config.title?.invoke(title) ?: Text( - text = title, - style = MaterialTheme.typography.titleLarge, - modifier = Modifier.padding(16.dp) - ) - ItemList( - orientation = config.mOrientation ?: Orientation.VERTICAL, - items = items, - itemView = config.item, - onItemClick = onItemClick - ) - } + PopupContent(config, items, onItemClick) } } @@ -125,10 +109,9 @@ internal class PopUpActivity : ComponentActivity() { onItemClick: (BaseConfig) -> Unit ) { val sheetState = androidx.compose.material3.rememberModalBottomSheetState() - val title = config.chooserTitle ?: stringResource(R.string.str_choose_option) ModalBottomSheet( onDismissRequest = { - setCanceledResult() + setCanceledResult("User dismissed the popup") finish() }, dragHandle = null, @@ -139,19 +122,7 @@ internal class PopUpActivity : ComponentActivity() { topEnd = config.cornerSize.dp ) ) { - Column { - config.title?.invoke(title) ?: Text( - text = title, - style = MaterialTheme.typography.titleLarge, - modifier = Modifier.padding(16.dp) - ) - ItemList( - orientation = config.mOrientation ?: Orientation.VERTICAL, - items = items, - itemView = config.item, - onItemClick = onItemClick - ) - } + PopupContent(config, items, onItemClick) } } @@ -167,6 +138,28 @@ internal class PopUpActivity : ComponentActivity() { } } +@Composable +private fun PopupContent( + config: PopUpConfig, + items: List, + onItemClick: (BaseConfig) -> Unit +) { + val title = config.chooserTitle ?: stringResource(R.string.str_choose_option) + Column { + config.title?.invoke(title) ?: Text( + text = title, + style = MaterialTheme.typography.titleLarge, + modifier = Modifier.padding(16.dp) + ) + ItemList( + orientation = config.mOrientation ?: Orientation.VERTICAL, + items = items, + itemView = config.item, + onItemClick = onItemClick + ) + } +} + @Composable private fun ItemList( orientation: Orientation, @@ -174,16 +167,14 @@ private fun ItemList( itemView: @Composable ((BaseConfig) -> Unit)? = null, onItemClick: (BaseConfig) -> Unit ) { - val scrollState = rememberScrollState() if (orientation.isHorizontal()) { - Row( + LazyRow( modifier = Modifier .fillMaxWidth() .padding(bottom = 6.dp) - .horizontalScroll(scrollState) ) { - items.forEach { + items(items) { PopupItem( item = it, itemView = itemView, @@ -192,14 +183,13 @@ private fun ItemList( } } } else { - Column( + LazyColumn( modifier = Modifier .fillMaxWidth() .padding(horizontal = 6.dp) - .verticalScroll(scrollState) ) { - items.forEach { + items(items) { PopupItem( item = it, itemView = itemView, diff --git a/filepickerlibrary/src/main/java/com/nareshchocha/filepickerlibrary/ui/activitys/VideoCaptureActivity.kt b/filepickerlibrary/src/main/java/com/nareshchocha/filepickerlibrary/ui/activitys/VideoCaptureActivity.kt index bae1240..1bbf40e 100644 --- a/filepickerlibrary/src/main/java/com/nareshchocha/filepickerlibrary/ui/activitys/VideoCaptureActivity.kt +++ b/filepickerlibrary/src/main/java/com/nareshchocha/filepickerlibrary/ui/activitys/VideoCaptureActivity.kt @@ -65,7 +65,12 @@ internal class VideoCaptureActivity : ComponentActivity() { ActivityResultContracts.StartActivityForResult() ) { result -> if (result.resultCode == RESULT_OK) { - setSuccessResult(videoFileUri, videoFile?.absolutePath, true) + setSuccessResult( + fileUri = videoFileUri, + filePath = videoFile?.absolutePath, + isFromCapture = true, + configType = VideoCaptureConfig::class.java.name + ) } else { videoFile?.delete() setCanceledResult("File Picker Result Error: ${result.resultCode}") From 91526c6b38f6d05668246dd4d32087e7d8d40819 Mon Sep 17 00:00:00 2001 From: naresh chocha Date: Thu, 11 Sep 2025 12:03:23 +0530 Subject: [PATCH 5/5] refactor: centralize result parsing in FilePickerResultContracts This commit introduces a private `parsePickerResult` function to consolidate the logic for parsing results from file picker activities. This function is now used by `PickMedia`, `PickDocumentFile`, and `FilePicker` contracts, reducing code duplication. Additionally, the `AnyFilePicker` contract has been updated: - It no longer stores `baseConfig` as a class property. - It determines the configuration type from the intent extras (`Const.BundleExtras.CONFIG_TYPE`) in `parseResult` to correctly delegate to the appropriate specific file picker's `parseResult` method. --- .../FilePickerResultContracts.kt | 124 +++++++----------- 1 file changed, 47 insertions(+), 77 deletions(-) diff --git a/filepickerlibrary/src/main/java/com/nareshchocha/filepickerlibrary/FilePickerResultContracts.kt b/filepickerlibrary/src/main/java/com/nareshchocha/filepickerlibrary/FilePickerResultContracts.kt index 5e41b93..3a05c9a 100644 --- a/filepickerlibrary/src/main/java/com/nareshchocha/filepickerlibrary/FilePickerResultContracts.kt +++ b/filepickerlibrary/src/main/java/com/nareshchocha/filepickerlibrary/FilePickerResultContracts.kt @@ -19,6 +19,28 @@ import com.nareshchocha.filepickerlibrary.ui.activitys.VideoCaptureActivity import com.nareshchocha.filepickerlibrary.utilities.appConst.Const import com.nareshchocha.filepickerlibrary.utilities.getClipDataUris +private fun parsePickerResult( + resultCode: Int, + intent: Intent? +): FilePickerResult = + if (intent == null || resultCode != Activity.RESULT_OK) { + FilePickerResult(errorMessage = "File selection failed or cancelled") + } else { + if (intent.clipData != null) { + FilePickerResult( + selectedFileUris = intent.getClipDataUris(), + selectedFilePaths = intent.getStringArrayListExtra(Const.BundleExtras.FILE_PATH_LIST) + ) + } else if (intent.data != null) { + FilePickerResult( + selectedFileUri = intent.data, + selectedFilePath = intent.getStringExtra(Const.BundleExtras.FILE_PATH) + ) + } else { + FilePickerResult(errorMessage = "No file selected") + } + } + /** * A collection of ActivityResultContracts for different file picking operations. * This class provides various contracts for capturing images, videos, selecting media, @@ -93,24 +115,7 @@ class FilePickerResultContracts private constructor() { override fun parseResult( resultCode: Int, intent: Intent? - ): FilePickerResult = - if (intent == null || resultCode != Activity.RESULT_OK) { - FilePickerResult(errorMessage = "Media selection failed or cancelled") - } else { - if (intent.clipData != null) { - FilePickerResult( - selectedFileUris = intent.getClipDataUris(), - selectedFilePaths = intent.getStringArrayListExtra(Const.BundleExtras.FILE_PATH_LIST) - ) - } else if (intent.data != null) { - FilePickerResult( - selectedFileUri = intent.data, - selectedFilePath = intent.getStringExtra(Const.BundleExtras.FILE_PATH) - ) - } else { - FilePickerResult(errorMessage = "No file selected") - } - } + ): FilePickerResult = parsePickerResult(resultCode, intent) } /** @@ -126,24 +131,7 @@ class FilePickerResultContracts private constructor() { override fun parseResult( resultCode: Int, intent: Intent? - ): FilePickerResult = - if (intent == null || resultCode != Activity.RESULT_OK) { - FilePickerResult(errorMessage = "Document selection failed or cancelled") - } else { - if (intent.clipData != null) { - FilePickerResult( - selectedFileUris = intent.getClipDataUris(), - selectedFilePaths = intent.getStringArrayListExtra(Const.BundleExtras.FILE_PATH_LIST) - ) - } else if (intent.data != null) { - FilePickerResult( - selectedFileUri = intent.data, - selectedFilePath = intent.getStringExtra(Const.BundleExtras.FILE_PATH) - ) - } else { - FilePickerResult(errorMessage = "No file selected") - } - } + ): FilePickerResult = parsePickerResult(resultCode, intent) } /** @@ -171,24 +159,7 @@ class FilePickerResultContracts private constructor() { override fun parseResult( resultCode: Int, intent: Intent? - ): FilePickerResult = - if (intent == null || resultCode != Activity.RESULT_OK) { - FilePickerResult(errorMessage = "File selection failed or cancelled") - } else { - if (intent.clipData != null) { - FilePickerResult( - selectedFileUris = intent.getClipDataUris(), - selectedFilePaths = intent.getStringArrayListExtra(Const.BundleExtras.FILE_PATH_LIST) - ) - } else if (intent.data != null) { - FilePickerResult( - selectedFileUri = intent.data, - selectedFilePath = intent.getStringExtra(Const.BundleExtras.FILE_PATH) - ) - } else { - FilePickerResult(errorMessage = "No file selected") - } - } + ): FilePickerResult = parsePickerResult(resultCode, intent) } /** @@ -197,41 +168,40 @@ class FilePickerResultContracts private constructor() { * Returns a FilePickerResult based on the selected file(s). */ class AnyFilePicker : ActivityResultContract() { - private var baseConfig: BaseConfig? = null - override fun createIntent( context: Context, input: BaseConfig? ): Intent { - baseConfig = input ?: ImageCaptureConfig() - return when (input) { - is ImageCaptureConfig -> ImageCapture().createIntent(context, input) - is VideoCaptureConfig -> VideoCapture().createIntent(context, input) - is PickMediaConfig -> PickMedia().createIntent(context, input) - is DocumentFilePickerConfig -> PickDocumentFile().createIntent(context, input) - else -> ImageCapture().createIntent(context, ImageCaptureConfig()) + val picker = input ?: ImageCaptureConfig() + return when (picker) { + is ImageCaptureConfig -> ImageCapture().createIntent(context, picker) + is VideoCaptureConfig -> VideoCapture().createIntent(context, picker) + is PickMediaConfig -> PickMedia().createIntent(context, picker) + is DocumentFilePickerConfig -> PickDocumentFile().createIntent(context, picker) } } override fun parseResult( resultCode: Int, intent: Intent? - ): FilePickerResult = + ): FilePickerResult { if (intent == null || resultCode != Activity.RESULT_OK) { - FilePickerResult(errorMessage = "File selection failed or cancelled") - } else { - when (baseConfig) { - is ImageCaptureConfig -> ImageCapture().parseResult(resultCode, intent) - is VideoCaptureConfig -> VideoCapture().parseResult(resultCode, intent) - is PickMediaConfig -> PickMedia().parseResult(resultCode, intent) - is DocumentFilePickerConfig -> - PickDocumentFile().parseResult( - resultCode, - intent - ) + return FilePickerResult(errorMessage = "File selection failed or cancelled") + } - else -> FilePickerResult(errorMessage = "Unknown file type") - } + val configType = intent.getStringExtra(Const.BundleExtras.CONFIG_TYPE) + return when (configType) { + ImageCaptureConfig::class.java.name -> ImageCapture().parseResult(resultCode, intent) + VideoCaptureConfig::class.java.name -> VideoCapture().parseResult(resultCode, intent) + PickMediaConfig::class.java.name -> PickMedia().parseResult(resultCode, intent) + DocumentFilePickerConfig::class.java.name -> + PickDocumentFile().parseResult( + resultCode, + intent + ) + + else -> FilePickerResult(errorMessage = "Unknown file type") } + } } }