Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -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
}

Expand Down Expand Up @@ -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(
Expand Down Expand Up @@ -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(
Expand All @@ -358,7 +357,6 @@ private suspend fun getPhPickerResults(
): List<PHPickerResult> = suspendCoroutine { continuation ->
// Create a picker delegate
phPickerDelegate = PhPickerDelegate(onFilesPicked = continuation::resume)
phPickerDismissDelegate = PhPickerDismissDelegate(onFilesPicked = continuation::resume)

// Define configuration
val configuration = PHPickerConfiguration(sharedPhotoLibrary())
Expand Down Expand Up @@ -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(
Expand Down
Original file line number Diff line number Diff line change
@@ -1,31 +1,48 @@
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<NSURL>) -> 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))
}

override fun documentPicker(
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()
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -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<PHPickerResult>) -> Unit
) : NSObject(),
PHPickerViewControllerDelegateProtocol {
PHPickerViewControllerDelegateProtocol,
UIAdaptivePresentationControllerDelegateProtocol {
private var hasFinished = false

override fun picker(picker: PHPickerViewController, didFinishPicking: List<*>) {
Expand All @@ -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())
}
}

This file was deleted.