diff --git a/packages/quick_actions/quick_actions_ios/CHANGELOG.md b/packages/quick_actions/quick_actions_ios/CHANGELOG.md index 47d7d1ddbf78..a8af40f19013 100644 --- a/packages/quick_actions/quick_actions_ios/CHANGELOG.md +++ b/packages/quick_actions/quick_actions_ios/CHANGELOG.md @@ -1,3 +1,7 @@ +## 1.1.1 + +* Updates to a newer version of Pigeon. + ## 1.1.0 * Adds Swift Package Manager compatibility. diff --git a/packages/quick_actions/quick_actions_ios/example/ios/RunnerTests/QuickActionsPluginTests.swift b/packages/quick_actions/quick_actions_ios/example/ios/RunnerTests/QuickActionsPluginTests.swift index f0dff1650b72..bf60a191ca3b 100644 --- a/packages/quick_actions/quick_actions_ios/example/ios/RunnerTests/QuickActionsPluginTests.swift +++ b/packages/quick_actions/quick_actions_ios/example/ios/RunnerTests/QuickActionsPluginTests.swift @@ -12,7 +12,7 @@ class MockFlutterApi: IOSQuickActionsFlutterApiProtocol { var launchActionCallback: ((String) -> Void)? = nil func launchAction( - action actionArg: String, completion: @escaping (Result) -> Void + action actionArg: String, completion: @escaping (Result) -> Void ) { self.launchActionCallback?(actionArg) completion(.success(Void())) diff --git a/packages/quick_actions/quick_actions_ios/ios/quick_actions_ios/Sources/quick_actions_ios/messages.g.swift b/packages/quick_actions/quick_actions_ios/ios/quick_actions_ios/Sources/quick_actions_ios/messages.g.swift index ed2b58280854..f4a4091c333e 100644 --- a/packages/quick_actions/quick_actions_ios/ios/quick_actions_ios/Sources/quick_actions_ios/messages.g.swift +++ b/packages/quick_actions/quick_actions_ios/ios/quick_actions_ios/Sources/quick_actions_ios/messages.g.swift @@ -1,7 +1,7 @@ // Copyright 2013 The Flutter Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -// Autogenerated from Pigeon (v12.0.1), do not edit directly. +// Autogenerated from Pigeon (v20.0.1), do not edit directly. // See also: https://pub.dev/packages/pigeon import Foundation @@ -14,10 +14,22 @@ import Foundation #error("Unsupported platform.") #endif -extension FlutterError: Error {} +/// Error class for passing custom error details to Dart side. +final class PigeonError: Error { + let code: String + let message: String? + let details: Any? -private func isNullish(_ value: Any?) -> Bool { - return value is NSNull || value == nil + init(code: String, message: String?, details: Any?) { + self.code = code + self.message = message + self.details = details + } + + var localizedDescription: String { + return + "PigeonError(code: \(code), message: \(message ?? ""), details: \(details ?? "")" + } } private func wrapResult(_ result: Any?) -> [Any?] { @@ -25,6 +37,13 @@ private func wrapResult(_ result: Any?) -> [Any?] { } private func wrapError(_ error: Any) -> [Any?] { + if let pigeonError = error as? PigeonError { + return [ + pigeonError.code, + pigeonError.message, + pigeonError.details, + ] + } if let flutterError = error as? FlutterError { return [ flutterError.code, @@ -39,6 +58,16 @@ private func wrapError(_ error: Any) -> [Any?] { ] } +private func createConnectionError(withChannelName channelName: String) -> PigeonError { + return PigeonError( + code: "channel-error", message: "Unable to establish connection on channel: '\(channelName)'.", + details: "") +} + +private func isNullish(_ value: Any?) -> Bool { + return value is NSNull || value == nil +} + private func nilOrValue(_ value: Any?) -> T? { if value is NSNull { return nil } return value as! T? @@ -55,10 +84,11 @@ struct ShortcutItemMessage { /// Name of native resource to be displayed as the icon for this item. var icon: String? = nil - static func fromList(_ list: [Any?]) -> ShortcutItemMessage? { - let type = list[0] as! String - let localizedTitle = list[1] as! String - let icon: String? = nilOrValue(list[2]) + // swift-format-ignore: AlwaysUseLowerCamelCase + static func fromList(_ __pigeon_list: [Any?]) -> ShortcutItemMessage? { + let type = __pigeon_list[0] as! String + let localizedTitle = __pigeon_list[1] as! String + let icon: String? = nilOrValue(__pigeon_list[2]) return ShortcutItemMessage( type: type, @@ -74,10 +104,10 @@ struct ShortcutItemMessage { ] } } -private class IOSQuickActionsApiCodecReader: FlutterStandardReader { +private class messagesPigeonCodecReader: FlutterStandardReader { override func readValue(ofType type: UInt8) -> Any? { switch type { - case 128: + case 129: return ShortcutItemMessage.fromList(self.readValue() as! [Any?]) default: return super.readValue(ofType: type) @@ -85,10 +115,10 @@ private class IOSQuickActionsApiCodecReader: FlutterStandardReader { } } -private class IOSQuickActionsApiCodecWriter: FlutterStandardWriter { +private class messagesPigeonCodecWriter: FlutterStandardWriter { override func writeValue(_ value: Any) { if let value = value as? ShortcutItemMessage { - super.writeByte(128) + super.writeByte(129) super.writeValue(value.toList()) } else { super.writeValue(value) @@ -96,18 +126,18 @@ private class IOSQuickActionsApiCodecWriter: FlutterStandardWriter { } } -private class IOSQuickActionsApiCodecReaderWriter: FlutterStandardReaderWriter { +private class messagesPigeonCodecReaderWriter: FlutterStandardReaderWriter { override func reader(with data: Data) -> FlutterStandardReader { - return IOSQuickActionsApiCodecReader(data: data) + return messagesPigeonCodecReader(data: data) } override func writer(with data: NSMutableData) -> FlutterStandardWriter { - return IOSQuickActionsApiCodecWriter(data: data) + return messagesPigeonCodecWriter(data: data) } } -class IOSQuickActionsApiCodec: FlutterStandardMessageCodec { - static let shared = IOSQuickActionsApiCodec(readerWriter: IOSQuickActionsApiCodecReaderWriter()) +class messagesPigeonCodec: FlutterStandardMessageCodec, @unchecked Sendable { + static let shared = messagesPigeonCodec(readerWriter: messagesPigeonCodecReaderWriter()) } /// Generated protocol from Pigeon that represents a handler of messages from Flutter. @@ -120,13 +150,17 @@ protocol IOSQuickActionsApi { /// Generated setup class from Pigeon to handle messages through the `binaryMessenger`. class IOSQuickActionsApiSetup { - /// The codec used by IOSQuickActionsApi. - static var codec: FlutterStandardMessageCodec { IOSQuickActionsApiCodec.shared } + static var codec: FlutterStandardMessageCodec { messagesPigeonCodec.shared } /// Sets up an instance of `IOSQuickActionsApi` to handle messages through the `binaryMessenger`. - static func setUp(binaryMessenger: FlutterBinaryMessenger, api: IOSQuickActionsApi?) { + static func setUp( + binaryMessenger: FlutterBinaryMessenger, api: IOSQuickActionsApi?, + messageChannelSuffix: String = "" + ) { + let channelSuffix = messageChannelSuffix.count > 0 ? ".\(messageChannelSuffix)" : "" /// Sets the dynamic shortcuts for the app. let setShortcutItemsChannel = FlutterBasicMessageChannel( - name: "dev.flutter.pigeon.quick_actions_ios.IOSQuickActionsApi.setShortcutItems", + name: + "dev.flutter.pigeon.quick_actions_ios.IOSQuickActionsApi.setShortcutItems\(channelSuffix)", binaryMessenger: binaryMessenger, codec: codec) if let api = api { setShortcutItemsChannel.setMessageHandler { message, reply in @@ -144,7 +178,8 @@ class IOSQuickActionsApiSetup { } /// Removes all dynamic shortcuts. let clearShortcutItemsChannel = FlutterBasicMessageChannel( - name: "dev.flutter.pigeon.quick_actions_ios.IOSQuickActionsApi.clearShortcutItems", + name: + "dev.flutter.pigeon.quick_actions_ios.IOSQuickActionsApi.clearShortcutItems\(channelSuffix)", binaryMessenger: binaryMessenger, codec: codec) if let api = api { clearShortcutItemsChannel.setMessageHandler { _, reply in @@ -164,22 +199,39 @@ class IOSQuickActionsApiSetup { protocol IOSQuickActionsFlutterApiProtocol { /// Sends a string representing a shortcut from the native platform to the app. func launchAction( - action actionArg: String, completion: @escaping (Result) -> Void) + action actionArg: String, completion: @escaping (Result) -> Void) } class IOSQuickActionsFlutterApi: IOSQuickActionsFlutterApiProtocol { private let binaryMessenger: FlutterBinaryMessenger - init(binaryMessenger: FlutterBinaryMessenger) { + private let messageChannelSuffix: String + init(binaryMessenger: FlutterBinaryMessenger, messageChannelSuffix: String = "") { self.binaryMessenger = binaryMessenger + self.messageChannelSuffix = messageChannelSuffix.count > 0 ? ".\(messageChannelSuffix)" : "" + } + var codec: messagesPigeonCodec { + return messagesPigeonCodec.shared } /// Sends a string representing a shortcut from the native platform to the app. func launchAction( - action actionArg: String, completion: @escaping (Result) -> Void + action actionArg: String, completion: @escaping (Result) -> Void ) { + let channelName: String = + "dev.flutter.pigeon.quick_actions_ios.IOSQuickActionsFlutterApi.launchAction\(messageChannelSuffix)" let channel = FlutterBasicMessageChannel( - name: "dev.flutter.pigeon.quick_actions_ios.IOSQuickActionsFlutterApi.launchAction", - binaryMessenger: binaryMessenger) - channel.sendMessage([actionArg] as [Any?]) { _ in - completion(.success(Void())) + name: channelName, binaryMessenger: binaryMessenger, codec: codec) + channel.sendMessage([actionArg] as [Any?]) { response in + guard let listResponse = response as? [Any?] else { + completion(.failure(createConnectionError(withChannelName: channelName))) + return + } + if listResponse.count > 1 { + let code: String = listResponse[0] as! String + let message: String? = nilOrValue(listResponse[1]) + let details: String? = nilOrValue(listResponse[2]) + completion(.failure(PigeonError(code: code, message: message, details: details))) + } else { + completion(.success(Void())) + } } } } diff --git a/packages/quick_actions/quick_actions_ios/lib/messages.g.dart b/packages/quick_actions/quick_actions_ios/lib/messages.g.dart index f1d644647728..199871ff803c 100644 --- a/packages/quick_actions/quick_actions_ios/lib/messages.g.dart +++ b/packages/quick_actions/quick_actions_ios/lib/messages.g.dart @@ -1,9 +1,9 @@ // Copyright 2013 The Flutter Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -// Autogenerated from Pigeon (v12.0.1), do not edit directly. +// Autogenerated from Pigeon (v20.0.1), do not edit directly. // See also: https://pub.dev/packages/pigeon -// ignore_for_file: public_member_api_docs, non_constant_identifier_names, avoid_as, unused_import, unnecessary_parenthesis, prefer_null_aware_operators, omit_local_variable_types, unused_shown_name, unnecessary_import +// ignore_for_file: public_member_api_docs, non_constant_identifier_names, avoid_as, unused_import, unnecessary_parenthesis, prefer_null_aware_operators, omit_local_variable_types, unused_shown_name, unnecessary_import, no_leading_underscores_for_local_identifiers import 'dart:async'; import 'dart:typed_data' show Float64List, Int32List, Int64List, Uint8List; @@ -11,6 +11,13 @@ import 'dart:typed_data' show Float64List, Int32List, Int64List, Uint8List; import 'package:flutter/foundation.dart' show ReadBuffer, WriteBuffer; import 'package:flutter/services.dart'; +PlatformException _createConnectionError(String channelName) { + return PlatformException( + code: 'channel-error', + message: 'Unable to establish connection on channel: "$channelName".', + ); +} + List wrapResponse( {Object? result, PlatformException? error, bool empty = false}) { if (empty) { @@ -57,12 +64,12 @@ class ShortcutItemMessage { } } -class _IOSQuickActionsApiCodec extends StandardMessageCodec { - const _IOSQuickActionsApiCodec(); +class _PigeonCodec extends StandardMessageCodec { + const _PigeonCodec(); @override void writeValue(WriteBuffer buffer, Object? value) { if (value is ShortcutItemMessage) { - buffer.putUint8(128); + buffer.putUint8(129); writeValue(buffer, value.encode()); } else { super.writeValue(buffer, value); @@ -72,7 +79,7 @@ class _IOSQuickActionsApiCodec extends StandardMessageCodec { @override Object? readValueOfType(int type, ReadBuffer buffer) { switch (type) { - case 128: + case 129: return ShortcutItemMessage.decode(readValue(buffer)!); default: return super.readValueOfType(type, buffer); @@ -84,31 +91,36 @@ class IOSQuickActionsApi { /// Constructor for [IOSQuickActionsApi]. The [binaryMessenger] named argument is /// available for dependency injection. If it is left null, the default /// BinaryMessenger will be used which routes to the host platform. - IOSQuickActionsApi({BinaryMessenger? binaryMessenger}) - : _binaryMessenger = binaryMessenger; - final BinaryMessenger? _binaryMessenger; + IOSQuickActionsApi( + {BinaryMessenger? binaryMessenger, String messageChannelSuffix = ''}) + : __pigeon_binaryMessenger = binaryMessenger, + __pigeon_messageChannelSuffix = + messageChannelSuffix.isNotEmpty ? '.$messageChannelSuffix' : ''; + final BinaryMessenger? __pigeon_binaryMessenger; + + static const MessageCodec pigeonChannelCodec = _PigeonCodec(); - static const MessageCodec codec = _IOSQuickActionsApiCodec(); + final String __pigeon_messageChannelSuffix; /// Sets the dynamic shortcuts for the app. - Future setShortcutItems( - List arg_itemsList) async { - final BasicMessageChannel channel = BasicMessageChannel( - 'dev.flutter.pigeon.quick_actions_ios.IOSQuickActionsApi.setShortcutItems', - codec, - binaryMessenger: _binaryMessenger); - final List? replyList = - await channel.send([arg_itemsList]) as List?; - if (replyList == null) { - throw PlatformException( - code: 'channel-error', - message: 'Unable to establish connection on channel.', - ); - } else if (replyList.length > 1) { + Future setShortcutItems(List itemsList) async { + final String __pigeon_channelName = + 'dev.flutter.pigeon.quick_actions_ios.IOSQuickActionsApi.setShortcutItems$__pigeon_messageChannelSuffix'; + final BasicMessageChannel __pigeon_channel = + BasicMessageChannel( + __pigeon_channelName, + pigeonChannelCodec, + binaryMessenger: __pigeon_binaryMessenger, + ); + final List? __pigeon_replyList = + await __pigeon_channel.send([itemsList]) as List?; + if (__pigeon_replyList == null) { + throw _createConnectionError(__pigeon_channelName); + } else if (__pigeon_replyList.length > 1) { throw PlatformException( - code: replyList[0]! as String, - message: replyList[1] as String?, - details: replyList[2], + code: __pigeon_replyList[0]! as String, + message: __pigeon_replyList[1] as String?, + details: __pigeon_replyList[2], ); } else { return; @@ -117,21 +129,23 @@ class IOSQuickActionsApi { /// Removes all dynamic shortcuts. Future clearShortcutItems() async { - final BasicMessageChannel channel = BasicMessageChannel( - 'dev.flutter.pigeon.quick_actions_ios.IOSQuickActionsApi.clearShortcutItems', - codec, - binaryMessenger: _binaryMessenger); - final List? replyList = await channel.send(null) as List?; - if (replyList == null) { - throw PlatformException( - code: 'channel-error', - message: 'Unable to establish connection on channel.', - ); - } else if (replyList.length > 1) { + final String __pigeon_channelName = + 'dev.flutter.pigeon.quick_actions_ios.IOSQuickActionsApi.clearShortcutItems$__pigeon_messageChannelSuffix'; + final BasicMessageChannel __pigeon_channel = + BasicMessageChannel( + __pigeon_channelName, + pigeonChannelCodec, + binaryMessenger: __pigeon_binaryMessenger, + ); + final List? __pigeon_replyList = + await __pigeon_channel.send(null) as List?; + if (__pigeon_replyList == null) { + throw _createConnectionError(__pigeon_channelName); + } else if (__pigeon_replyList.length > 1) { throw PlatformException( - code: replyList[0]! as String, - message: replyList[1] as String?, - details: replyList[2], + code: __pigeon_replyList[0]! as String, + message: __pigeon_replyList[1] as String?, + details: __pigeon_replyList[2], ); } else { return; @@ -140,22 +154,28 @@ class IOSQuickActionsApi { } abstract class IOSQuickActionsFlutterApi { - static const MessageCodec codec = StandardMessageCodec(); + static const MessageCodec pigeonChannelCodec = _PigeonCodec(); /// Sends a string representing a shortcut from the native platform to the app. void launchAction(String action); - static void setup(IOSQuickActionsFlutterApi? api, - {BinaryMessenger? binaryMessenger}) { + static void setUp( + IOSQuickActionsFlutterApi? api, { + BinaryMessenger? binaryMessenger, + String messageChannelSuffix = '', + }) { + messageChannelSuffix = + messageChannelSuffix.isNotEmpty ? '.$messageChannelSuffix' : ''; { - final BasicMessageChannel channel = BasicMessageChannel( - 'dev.flutter.pigeon.quick_actions_ios.IOSQuickActionsFlutterApi.launchAction', - codec, + final BasicMessageChannel __pigeon_channel = BasicMessageChannel< + Object?>( + 'dev.flutter.pigeon.quick_actions_ios.IOSQuickActionsFlutterApi.launchAction$messageChannelSuffix', + pigeonChannelCodec, binaryMessenger: binaryMessenger); if (api == null) { - channel.setMessageHandler(null); + __pigeon_channel.setMessageHandler(null); } else { - channel.setMessageHandler((Object? message) async { + __pigeon_channel.setMessageHandler((Object? message) async { assert(message != null, 'Argument for dev.flutter.pigeon.quick_actions_ios.IOSQuickActionsFlutterApi.launchAction was null.'); final List args = (message as List?)!; diff --git a/packages/quick_actions/quick_actions_ios/lib/quick_actions_ios.dart b/packages/quick_actions/quick_actions_ios/lib/quick_actions_ios.dart index 235591774c5b..b002e0ec136d 100644 --- a/packages/quick_actions/quick_actions_ios/lib/quick_actions_ios.dart +++ b/packages/quick_actions/quick_actions_ios/lib/quick_actions_ios.dart @@ -29,7 +29,7 @@ class QuickActionsIos extends QuickActionsPlatform { Future initialize(QuickActionHandler handler) async { final _QuickActionHandlerApi quickActionsHandlerApi = _QuickActionHandlerApi(); - IOSQuickActionsFlutterApi.setup(quickActionsHandlerApi); + IOSQuickActionsFlutterApi.setUp(quickActionsHandlerApi); _handler = handler; } diff --git a/packages/quick_actions/quick_actions_ios/pubspec.yaml b/packages/quick_actions/quick_actions_ios/pubspec.yaml index 41bfb0ceebc2..9f0abd93fe43 100644 --- a/packages/quick_actions/quick_actions_ios/pubspec.yaml +++ b/packages/quick_actions/quick_actions_ios/pubspec.yaml @@ -2,7 +2,7 @@ name: quick_actions_ios description: An implementation for the iOS platform of the Flutter `quick_actions` plugin. repository: https://github.com/flutter/packages/tree/main/packages/quick_actions/quick_actions_ios issue_tracker: https://github.com/flutter/flutter/issues?q=is%3Aissue+is%3Aopen+label%3A%22p%3A+in_app_purchase%22 -version: 1.1.0 +version: 1.1.1 environment: sdk: ^3.2.3 @@ -26,7 +26,7 @@ dev_dependencies: sdk: flutter integration_test: sdk: flutter - pigeon: ^12.0.1 + pigeon: ^20.0.1 plugin_platform_interface: ^2.1.7 topics: