diff --git a/packages/file_selector/file_selector_ios/CHANGELOG.md b/packages/file_selector/file_selector_ios/CHANGELOG.md index aaa69ae3571..d8adf3d2072 100644 --- a/packages/file_selector/file_selector_ios/CHANGELOG.md +++ b/packages/file_selector/file_selector_ios/CHANGELOG.md @@ -1,3 +1,8 @@ +## 0.5.3+4 + +* Improves compatibility with `UIScene`. +* Updates minimum supported SDK version to Flutter 3.38/Dart 3.10. + ## 0.5.3+3 * Updates minimum supported version to iOS 13. diff --git a/packages/file_selector/file_selector_ios/example/ios/RunnerTests/FileSelectorTests.swift b/packages/file_selector/file_selector_ios/example/ios/RunnerTests/FileSelectorTests.swift index 0b5ebc9db65..6b6efd8dee4 100644 --- a/packages/file_selector/file_selector_ios/example/ios/RunnerTests/FileSelectorTests.swift +++ b/packages/file_selector/file_selector_ios/example/ios/RunnerTests/FileSelectorTests.swift @@ -2,6 +2,7 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. +import Flutter import XCTest @testable import file_selector_ios @@ -16,13 +17,21 @@ final class TestViewPresenter: ViewPresenter { } } +final class StubViewPresenterProvider: ViewPresenterProvider { + var viewPresenter: ViewPresenter? + + init(viewPresenter: ViewPresenter?) { + self.viewPresenter = viewPresenter + } +} + class FileSelectorTests: XCTestCase { func testPickerPresents() throws { - let plugin = FileSelectorPlugin() - let picker = UIDocumentPickerViewController(documentTypes: [], in: UIDocumentPickerMode.import) let presenter = TestViewPresenter() + let plugin = FileSelectorPlugin( + viewPresenterProvider: StubViewPresenterProvider(viewPresenter: presenter)) + let picker = UIDocumentPickerViewController(documentTypes: [], in: UIDocumentPickerMode.import) plugin.documentPickerViewControllerOverride = picker - plugin.viewPresenterOverride = presenter plugin.openFile( config: FileSelectorConfig(utis: [], allowMultiSelection: false) @@ -34,10 +43,10 @@ class FileSelectorTests: XCTestCase { } func testReturnsPickedFiles() throws { - let plugin = FileSelectorPlugin() + let plugin = FileSelectorPlugin( + viewPresenterProvider: StubViewPresenterProvider(viewPresenter: TestViewPresenter())) let picker = UIDocumentPickerViewController(documentTypes: [], in: UIDocumentPickerMode.import) plugin.documentPickerViewControllerOverride = picker - plugin.viewPresenterOverride = TestViewPresenter() let completionWasCalled = expectation(description: "completion") plugin.openFile( @@ -60,10 +69,10 @@ class FileSelectorTests: XCTestCase { } func testCancellingPickerReturnsEmptyList() throws { - let plugin = FileSelectorPlugin() + let plugin = FileSelectorPlugin( + viewPresenterProvider: StubViewPresenterProvider(viewPresenter: TestViewPresenter())) let picker = UIDocumentPickerViewController(documentTypes: [], in: UIDocumentPickerMode.import) plugin.documentPickerViewControllerOverride = picker - plugin.viewPresenterOverride = TestViewPresenter() let completionWasCalled = expectation(description: "completion") plugin.openFile( diff --git a/packages/file_selector/file_selector_ios/example/pubspec.yaml b/packages/file_selector/file_selector_ios/example/pubspec.yaml index 68c190da3fd..928cbc3def6 100644 --- a/packages/file_selector/file_selector_ios/example/pubspec.yaml +++ b/packages/file_selector/file_selector_ios/example/pubspec.yaml @@ -4,8 +4,8 @@ publish_to: 'none' version: 1.0.0 environment: - sdk: ^3.9.0 - flutter: ">=3.35.0" + sdk: ^3.10.0 + flutter: ">=3.38.0" dependencies: # The following adds the Cupertino Icons font to your application. diff --git a/packages/file_selector/file_selector_ios/ios/file_selector_ios/Sources/file_selector_ios/FileSelectorPlugin.swift b/packages/file_selector/file_selector_ios/ios/file_selector_ios/Sources/file_selector_ios/FileSelectorPlugin.swift index e7d6f170379..5b9f5d7c229 100644 --- a/packages/file_selector/file_selector_ios/ios/file_selector_ios/Sources/file_selector_ios/FileSelectorPlugin.swift +++ b/packages/file_selector/file_selector_ios/ios/file_selector_ios/Sources/file_selector_ios/FileSelectorPlugin.swift @@ -45,14 +45,19 @@ public class FileSelectorPlugin: NSObject, FlutterPlugin, FileSelectorApi { var pendingCompletions: Set = [] /// Overridden document picker, for testing. var documentPickerViewControllerOverride: UIDocumentPickerViewController? - /// Overridden view presenter, for testing. - var viewPresenterOverride: ViewPresenter? + /// The view controller provider, for showing the document picker. + let viewPresenterProvider: ViewPresenterProvider public static func register(with registrar: FlutterPluginRegistrar) { - let instance = FileSelectorPlugin() + let instance = FileSelectorPlugin( + viewPresenterProvider: DefaultViewPresenterProvider(registrar: registrar)) FileSelectorApiSetup.setUp(binaryMessenger: registrar.messenger(), api: instance) } + init(viewPresenterProvider: ViewPresenterProvider) { + self.viewPresenterProvider = viewPresenterProvider + } + func openFile(config: FileSelectorConfig, completion: @escaping (Result<[String], Error>) -> Void) { let completionBridge = PickerCompletionBridge(completion: completion, owner: self) @@ -64,14 +69,12 @@ public class FileSelectorPlugin: NSObject, FlutterPlugin, FileSelectorApi { documentPicker.allowsMultipleSelection = config.allowMultiSelection documentPicker.delegate = completionBridge - let presenter = - self.viewPresenterOverride ?? UIApplication.shared.delegate?.window??.rootViewController - if let presenter = presenter { + if let presenter = viewPresenterProvider.viewPresenter { pendingCompletions.insert(completionBridge) presenter.present(documentPicker, animated: true, completion: nil) } else { completion( - .failure(PigeonError(code: "error", message: "Missing root view controller.", details: nil)) + .failure(PigeonError(code: "error", message: "No view controller available.", details: nil)) ) } } diff --git a/packages/file_selector/file_selector_ios/ios/file_selector_ios/Sources/file_selector_ios/ViewPresenter.swift b/packages/file_selector/file_selector_ios/ios/file_selector_ios/Sources/file_selector_ios/ViewPresenter.swift index e817b645588..a0c6a5230f4 100644 --- a/packages/file_selector/file_selector_ios/ios/file_selector_ios/Sources/file_selector_ios/ViewPresenter.swift +++ b/packages/file_selector/file_selector_ios/ios/file_selector_ios/Sources/file_selector_ios/ViewPresenter.swift @@ -2,6 +2,7 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. +import Flutter import UIKit /// Protocol for UIViewController methods relating to presenting a controller. @@ -18,3 +19,26 @@ protocol ViewPresenter { /// ViewPresenter is intentionally a direct passthroguh to UIViewController. extension UIViewController: ViewPresenter {} + +/// Protocol for FlutterPluginRegistrar method for accessing the view controller. +/// +/// This is necessary because Swift doesn't allow for only partially implementing a protocol, so +/// a stub implementation of FlutterPluginRegistrar for tests would break any time something was +/// added to that protocol. +protocol ViewPresenterProvider { + /// Returns the view controller associated with the Flutter content. + var viewPresenter: ViewPresenter? { get } +} + +/// Non-test implementation of ViewPresenterProvider that forwards to the plugin registrar. +final class DefaultViewPresenterProvider: ViewPresenterProvider { + private let registrar: FlutterPluginRegistrar + + init(registrar: FlutterPluginRegistrar) { + self.registrar = registrar + } + + var viewPresenter: ViewPresenter? { + registrar.viewController + } +} diff --git a/packages/file_selector/file_selector_ios/pubspec.yaml b/packages/file_selector/file_selector_ios/pubspec.yaml index 42a3c85ae78..85303e2a30e 100644 --- a/packages/file_selector/file_selector_ios/pubspec.yaml +++ b/packages/file_selector/file_selector_ios/pubspec.yaml @@ -2,11 +2,11 @@ name: file_selector_ios description: iOS implementation of the file_selector plugin. repository: https://github.com/flutter/packages/tree/main/packages/file_selector/file_selector_ios issue_tracker: https://github.com/flutter/flutter/issues?q=is%3Aissue+is%3Aopen+label%3A%22p%3A+file_selector%22 -version: 0.5.3+3 +version: 0.5.3+4 environment: - sdk: ^3.9.0 - flutter: ">=3.35.0" + sdk: ^3.10.0 + flutter: ">=3.38.0" flutter: plugin: