Skip to content

Commit

Permalink
Recover logic to use PHPicker if the type is image
Browse files Browse the repository at this point in the history
  • Loading branch information
iruizmar committed Jan 4, 2024
1 parent 6cec0de commit a074474
Showing 1 changed file with 79 additions and 3 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -4,9 +4,7 @@ import androidx.compose.runtime.Composable
import androidx.compose.runtime.remember
import com.mohamedrejeb.calf.io.KmpFile
import kotlinx.cinterop.BetaInteropApi
import platform.Foundation.NSData
import platform.Foundation.NSURL
import platform.Foundation.dataWithContentsOfURL
import platform.Photos.PHPhotoLibrary
import platform.PhotosUI.PHPickerConfiguration
import platform.PhotosUI.PHPickerConfigurationAssetRepresentationModeCurrent
Expand All @@ -24,7 +22,6 @@ import platform.UniformTypeIdentifiers.UTTypeAudio
import platform.UniformTypeIdentifiers.UTTypeData
import platform.UniformTypeIdentifiers.UTTypeFolder
import platform.UniformTypeIdentifiers.UTTypeImage
import platform.UniformTypeIdentifiers.UTTypeMovie
import platform.UniformTypeIdentifiers.UTTypeText
import platform.UniformTypeIdentifiers.UTTypeVideo
import platform.darwin.NSObject
Expand All @@ -35,6 +32,18 @@ actual fun rememberFilePickerLauncher(
type: FilePickerFileType,
selectionMode: FilePickerSelectionMode,
onResult: (List<KmpFile>) -> Unit,
): FilePickerLauncher =
if (type == FilePickerFileType.Image) {
rememberImagePickerLauncher(type, selectionMode, onResult)
} else {
rememberDocumentPickerLauncher(type, selectionMode, onResult)
}

@Composable
private fun rememberDocumentPickerLauncher(
type: FilePickerFileType,
selectionMode: FilePickerSelectionMode,
onResult: (List<KmpFile>) -> Unit,
): FilePickerLauncher {
val delegate = remember {
object : NSObject(), UIDocumentPickerDelegateProtocol {
Expand Down Expand Up @@ -78,6 +87,52 @@ actual fun rememberFilePickerLauncher(
}
}

@Composable
private fun rememberImagePickerLauncher(
type: FilePickerFileType,
selectionMode: FilePickerSelectionMode,
onResult: (List<KmpFile>) -> Unit,
): FilePickerLauncher {
val pickerDelegate = remember {
object : NSObject(), PHPickerViewControllerDelegateProtocol {
override fun picker(picker: PHPickerViewController, didFinishPicking: List<*>) {
picker.dismissViewControllerAnimated(true, null)
println("didFinishPicking: $didFinishPicking")
didFinishPicking.forEach {
val result = it as? PHPickerResult ?: return@forEach
result.itemProvider.loadFileRepresentationForTypeIdentifier(
typeIdentifier = UTTypeImage.identifier,
) { url, error ->
if (error != null) {
println("Error: $error")
return@loadFileRepresentationForTypeIdentifier
}
onResult(listOfNotNull(url))
}
}
}
}
}

return remember {
FilePickerLauncher(
type = type,
selectionMode = selectionMode,
onLaunch = {
val imagePicker = createPHPickerViewController(
delegate = pickerDelegate,
selectionMode = selectionMode,
)
UIApplication.sharedApplication.keyWindow?.rootViewController?.presentViewController(
imagePicker,
true,
null
)
}
)
}
}

private fun createUIDocumentPickerViewController(
delegate: UIDocumentPickerDelegateProtocol,
type: FilePickerFileType,
Expand Down Expand Up @@ -105,6 +160,27 @@ private fun createUIDocumentPickerViewController(
return pickerController
}

private fun createPHPickerViewController(
delegate: PHPickerViewControllerDelegateProtocol,
selectionMode: FilePickerSelectionMode,
): PHPickerViewController {
val configuration = PHPickerConfiguration(PHPhotoLibrary.sharedPhotoLibrary())
val newFilter = PHPickerFilter.anyFilterMatchingSubfilters(
listOf(
PHPickerFilter.imagesFilter(),
)
)
configuration.filter = newFilter
configuration.preferredAssetRepresentationMode =
PHPickerConfigurationAssetRepresentationModeCurrent
configuration.selection = PHPickerConfigurationSelectionOrdered
configuration.selectionLimit = if (selectionMode == FilePickerSelectionMode.Multiple) 0 else 1
configuration.preselectedAssetIdentifiers = listOf<Nothing>()
val picker = PHPickerViewController(configuration)
picker.delegate = delegate
return picker
}

actual class FilePickerLauncher actual constructor(
type: FilePickerFileType,
selectionMode: FilePickerSelectionMode,
Expand Down

0 comments on commit a074474

Please sign in to comment.