diff --git a/filekit-dialogs/src/iosMain/kotlin/io/github/vinceglb/filekit/dialogs/FileKit.ios.kt b/filekit-dialogs/src/iosMain/kotlin/io/github/vinceglb/filekit/dialogs/FileKit.ios.kt index fb2966c9..6335b6a6 100644 --- a/filekit-dialogs/src/iosMain/kotlin/io/github/vinceglb/filekit/dialogs/FileKit.ios.kt +++ b/filekit-dialogs/src/iosMain/kotlin/io/github/vinceglb/filekit/dialogs/FileKit.ios.kt @@ -5,11 +5,9 @@ import io.github.vinceglb.filekit.PlatformFile import io.github.vinceglb.filekit.dialogs.FileKitDialog.cameraControllerDelegate import io.github.vinceglb.filekit.dialogs.FileKitDialog.documentPickerDelegate import io.github.vinceglb.filekit.dialogs.FileKitDialog.phPickerDelegate -import io.github.vinceglb.filekit.dialogs.FileKitDialog.phPickerDismissDelegate import io.github.vinceglb.filekit.dialogs.util.CameraControllerDelegate import io.github.vinceglb.filekit.dialogs.util.DocumentPickerDelegate import io.github.vinceglb.filekit.dialogs.util.PhPickerDelegate -import io.github.vinceglb.filekit.dialogs.util.PhPickerDismissDelegate import io.github.vinceglb.filekit.path import io.github.vinceglb.filekit.startAccessingSecurityScopedResource import io.github.vinceglb.filekit.stopAccessingSecurityScopedResource @@ -67,7 +65,6 @@ private object FileKitDialog { // Create a reference to the picker delegate to prevent it from being garbage collected lateinit var documentPickerDelegate: DocumentPickerDelegate lateinit var phPickerDelegate: PhPickerDelegate - lateinit var phPickerDismissDelegate: PhPickerDismissDelegate lateinit var cameraControllerDelegate: CameraControllerDelegate } @@ -180,6 +177,7 @@ public actual suspend fun FileKit.openFileSaver( // Assign the delegate to the picker controller pickerController.delegate = documentPickerDelegate + pickerController.presentationController?.delegate = documentPickerDelegate // Present the picker controller UIApplication.sharedApplication.topMostViewController()?.presentViewController( @@ -342,6 +340,7 @@ private suspend fun callPicker( // Assign the delegate to the picker controller pickerController.delegate = documentPickerDelegate + pickerController.presentationController?.delegate = documentPickerDelegate // Present the picker controller UIApplication.sharedApplication.topMostViewController()?.presentViewController( @@ -358,7 +357,6 @@ private suspend fun getPhPickerResults( ): List = suspendCoroutine { continuation -> // Create a picker delegate phPickerDelegate = PhPickerDelegate(onFilesPicked = continuation::resume) - phPickerDismissDelegate = PhPickerDismissDelegate(onFilesPicked = continuation::resume) // Define configuration val configuration = PHPickerConfiguration(sharedPhotoLibrary()) @@ -386,7 +384,7 @@ private suspend fun getPhPickerResults( // Create a picker controller val controller = PHPickerViewController(configuration = configuration) controller.delegate = phPickerDelegate - controller.presentationController?.delegate = phPickerDismissDelegate + controller.presentationController?.delegate = phPickerDelegate // Present the picker controller UIApplication.sharedApplication.topMostViewController()?.presentViewController( diff --git a/filekit-dialogs/src/iosMain/kotlin/io/github/vinceglb/filekit/dialogs/util/DocumentPickerDelegate.kt b/filekit-dialogs/src/iosMain/kotlin/io/github/vinceglb/filekit/dialogs/util/DocumentPickerDelegate.kt index 532d40dc..54c18fd1 100644 --- a/filekit-dialogs/src/iosMain/kotlin/io/github/vinceglb/filekit/dialogs/util/DocumentPickerDelegate.kt +++ b/filekit-dialogs/src/iosMain/kotlin/io/github/vinceglb/filekit/dialogs/util/DocumentPickerDelegate.kt @@ -1,19 +1,26 @@ package io.github.vinceglb.filekit.dialogs.util import platform.Foundation.NSURL +import platform.UIKit.UIAdaptivePresentationControllerDelegateProtocol import platform.UIKit.UIDocumentPickerDelegateProtocol import platform.UIKit.UIDocumentPickerViewController +import platform.UIKit.UIPresentationController import platform.darwin.NSObject internal class DocumentPickerDelegate( private val onFilesPicked: (List) -> Unit, private val onPickerCancelled: () -> Unit ) : NSObject(), - UIDocumentPickerDelegateProtocol { + UIDocumentPickerDelegateProtocol, + UIAdaptivePresentationControllerDelegateProtocol { + + private var hasFinished = false override fun documentPicker( controller: UIDocumentPickerViewController, didPickDocumentAtURL: NSURL ) { + if (hasFinished) return + hasFinished = true onFilesPicked(listOf(didPickDocumentAtURL)) } @@ -21,11 +28,21 @@ internal class DocumentPickerDelegate( controller: UIDocumentPickerViewController, didPickDocumentsAtURLs: List<*> ) { + if (hasFinished) return + hasFinished = true val res = didPickDocumentsAtURLs.mapNotNull { it as? NSURL } onFilesPicked(res) } override fun documentPickerWasCancelled(controller: UIDocumentPickerViewController) { + if (hasFinished) return + hasFinished = true + onPickerCancelled() + } + + override fun presentationControllerDidDismiss(presentationController: UIPresentationController) { + if (hasFinished) return + hasFinished = true onPickerCancelled() } } diff --git a/filekit-dialogs/src/iosMain/kotlin/io/github/vinceglb/filekit/dialogs/util/PhPickerDelegate.kt b/filekit-dialogs/src/iosMain/kotlin/io/github/vinceglb/filekit/dialogs/util/PhPickerDelegate.kt index 1f313bde..9d994d1a 100644 --- a/filekit-dialogs/src/iosMain/kotlin/io/github/vinceglb/filekit/dialogs/util/PhPickerDelegate.kt +++ b/filekit-dialogs/src/iosMain/kotlin/io/github/vinceglb/filekit/dialogs/util/PhPickerDelegate.kt @@ -3,12 +3,15 @@ package io.github.vinceglb.filekit.dialogs.util import platform.PhotosUI.PHPickerResult import platform.PhotosUI.PHPickerViewController import platform.PhotosUI.PHPickerViewControllerDelegateProtocol +import platform.UIKit.UIAdaptivePresentationControllerDelegateProtocol +import platform.UIKit.UIPresentationController import platform.darwin.NSObject internal class PhPickerDelegate( private val onFilesPicked: (List) -> Unit ) : NSObject(), - PHPickerViewControllerDelegateProtocol { + PHPickerViewControllerDelegateProtocol, + UIAdaptivePresentationControllerDelegateProtocol { private var hasFinished = false override fun picker(picker: PHPickerViewController, didFinishPicking: List<*>) { @@ -22,4 +25,10 @@ internal class PhPickerDelegate( val res = didFinishPicking.mapNotNull { it as? PHPickerResult } onFilesPicked(res) } + + override fun presentationControllerDidDismiss(presentationController: UIPresentationController) { + if (hasFinished) return + hasFinished = true + onFilesPicked(listOf()) + } } diff --git a/filekit-dialogs/src/iosMain/kotlin/io/github/vinceglb/filekit/dialogs/util/PhPickerDismissDelegate.kt b/filekit-dialogs/src/iosMain/kotlin/io/github/vinceglb/filekit/dialogs/util/PhPickerDismissDelegate.kt deleted file mode 100644 index 84e9b9b9..00000000 --- a/filekit-dialogs/src/iosMain/kotlin/io/github/vinceglb/filekit/dialogs/util/PhPickerDismissDelegate.kt +++ /dev/null @@ -1,15 +0,0 @@ -package io.github.vinceglb.filekit.dialogs.util - -import platform.PhotosUI.PHPickerResult -import platform.UIKit.UIAdaptivePresentationControllerDelegateProtocol -import platform.UIKit.UIPresentationController -import platform.darwin.NSObject - -internal class PhPickerDismissDelegate( - private val onFilesPicked: (List) -> Unit -) : NSObject(), - UIAdaptivePresentationControllerDelegateProtocol { - override fun presentationControllerDidDismiss(presentationController: UIPresentationController) { - onFilesPicked(listOf()) - } -}