diff --git a/packages/quick_actions/quick_actions/CHANGELOG.md b/packages/quick_actions/quick_actions/CHANGELOG.md index c9b4308251b..c0249a26b07 100644 --- a/packages/quick_actions/quick_actions/CHANGELOG.md +++ b/packages/quick_actions/quick_actions/CHANGELOG.md @@ -1,5 +1,6 @@ ## NEXT +* Add localizedSubtitle field for iOS * Updates minimum supported SDK version to Flutter 3.16/Dart 3.2. ## 1.0.7 diff --git a/packages/quick_actions/quick_actions/README.md b/packages/quick_actions/quick_actions/README.md index ad9b2a8c3b9..6175f1fd9e6 100644 --- a/packages/quick_actions/quick_actions/README.md +++ b/packages/quick_actions/quick_actions/README.md @@ -34,7 +34,7 @@ Finally, manage the app's quick actions, for instance: ```dart quickActions.setShortcutItems([ const ShortcutItem(type: 'action_main', localizedTitle: 'Main view', icon: 'icon_main'), - const ShortcutItem(type: 'action_help', localizedTitle: 'Help', icon: 'icon_help') + const ShortcutItem(type: 'action_help', localizedTitle: 'Help', localizedSubtitle: 'Tap to get help', icon: 'icon_help') ]); ``` diff --git a/packages/quick_actions/quick_actions/example/lib/main.dart b/packages/quick_actions/quick_actions/example/lib/main.dart index 14429284c62..31a3a4a94e2 100644 --- a/packages/quick_actions/quick_actions/example/lib/main.dart +++ b/packages/quick_actions/quick_actions/example/lib/main.dart @@ -53,14 +53,16 @@ class _MyHomePageState extends State { const ShortcutItem( type: 'action_one', localizedTitle: 'Action one', - icon: 'AppIcon', + localizedSubtitle: 'Action one subtitle', + icon: 'icon_help', ), // NOTE: This second action icon will only work on Android. // In a real world project keep the same file name for both platforms. const ShortcutItem( - type: 'action_two', - localizedTitle: 'Action two', - icon: 'ic_launcher'), + type: 'action_two', + localizedTitle: 'Action two', + icon: 'ic_launcher', + ), ]).then((void _) { setState(() { if (shortcut == 'no action set') { diff --git a/packages/quick_actions/quick_actions/example/pubspec.yaml b/packages/quick_actions/quick_actions/example/pubspec.yaml index e6ade3d47da..1dc4fe2b14e 100644 --- a/packages/quick_actions/quick_actions/example/pubspec.yaml +++ b/packages/quick_actions/quick_actions/example/pubspec.yaml @@ -16,6 +16,16 @@ dependencies: # The example app is bundled with the plugin so we use a path dependency on # the parent directory to use the current plugin's version. path: ../ + + +# FOR TESTING AND INITIAL REVIEW ONLY. DO NOT MERGE. +# See https://github.com/flutter/flutter/blob/master/docs/ecosystem/contributing/README.md#changing-federated-plugins +dependency_overrides: + + quick_actions_platform_interface: + path: ../../../quick_actions/quick_actions_platform_interface + quick_actions_ios: + path: ../../../quick_actions/quick_actions_ios dev_dependencies: espresso: ^0.2.0 diff --git a/packages/quick_actions/quick_actions/pubspec.yaml b/packages/quick_actions/quick_actions/pubspec.yaml index cf76b5061c5..7ac65066d3a 100644 --- a/packages/quick_actions/quick_actions/pubspec.yaml +++ b/packages/quick_actions/quick_actions/pubspec.yaml @@ -35,3 +35,8 @@ dev_dependencies: topics: - quick-actions - os-integration + +# FOR TESTING AND INITIAL REVIEW ONLY. DO NOT MERGE. +# See https://github.com/flutter/flutter/blob/master/docs/ecosystem/contributing/README.md#changing-federated-plugins +dependency_overrides: + {quick_actions_ios: {path: ../../quick_actions/quick_actions_ios}, quick_actions_platform_interface: {path: ../../quick_actions/quick_actions_platform_interface}} diff --git a/packages/quick_actions/quick_actions_android/example/pubspec.yaml b/packages/quick_actions/quick_actions_android/example/pubspec.yaml index 632624f697f..d56cf47d3f4 100644 --- a/packages/quick_actions/quick_actions_android/example/pubspec.yaml +++ b/packages/quick_actions/quick_actions_android/example/pubspec.yaml @@ -26,3 +26,8 @@ dev_dependencies: flutter: uses-material-design: true + +# FOR TESTING AND INITIAL REVIEW ONLY. DO NOT MERGE. +# See https://github.com/flutter/flutter/blob/master/docs/ecosystem/contributing/README.md#changing-federated-plugins +dependency_overrides: + {quick_actions_platform_interface: {path: ../../../quick_actions/quick_actions_platform_interface}} diff --git a/packages/quick_actions/quick_actions_android/pubspec.yaml b/packages/quick_actions/quick_actions_android/pubspec.yaml index 9571e8bc3a8..71df57ff5c1 100644 --- a/packages/quick_actions/quick_actions_android/pubspec.yaml +++ b/packages/quick_actions/quick_actions_android/pubspec.yaml @@ -33,3 +33,8 @@ dev_dependencies: topics: - quick-actions - os-integration + +# FOR TESTING AND INITIAL REVIEW ONLY. DO NOT MERGE. +# See https://github.com/flutter/flutter/blob/master/docs/ecosystem/contributing/README.md#changing-federated-plugins +dependency_overrides: + {quick_actions_platform_interface: {path: ../../quick_actions/quick_actions_platform_interface}} diff --git a/packages/quick_actions/quick_actions_ios/CHANGELOG.md b/packages/quick_actions/quick_actions_ios/CHANGELOG.md index a8af40f1901..d70aed3c26a 100644 --- a/packages/quick_actions/quick_actions_ios/CHANGELOG.md +++ b/packages/quick_actions/quick_actions_ios/CHANGELOG.md @@ -1,3 +1,7 @@ +## NEXT + +* Add localizedSubtitle field + ## 1.1.1 * Updates to a newer version of Pigeon. diff --git a/packages/quick_actions/quick_actions_ios/example/pubspec.yaml b/packages/quick_actions/quick_actions_ios/example/pubspec.yaml index b67fbd8dba5..1365fabd777 100644 --- a/packages/quick_actions/quick_actions_ios/example/pubspec.yaml +++ b/packages/quick_actions/quick_actions_ios/example/pubspec.yaml @@ -25,3 +25,8 @@ dev_dependencies: flutter: uses-material-design: true + +# FOR TESTING AND INITIAL REVIEW ONLY. DO NOT MERGE. +# See https://github.com/flutter/flutter/blob/master/docs/ecosystem/contributing/README.md#changing-federated-plugins +dependency_overrides: + {quick_actions_ios: {path: ../../../quick_actions/quick_actions_ios}, quick_actions_platform_interface: {path: ../../../quick_actions/quick_actions_platform_interface}} diff --git a/packages/quick_actions/quick_actions_ios/ios/quick_actions_ios/Sources/quick_actions_ios/QuickActionsPlugin.swift b/packages/quick_actions/quick_actions_ios/ios/quick_actions_ios/Sources/quick_actions_ios/QuickActionsPlugin.swift index dc8ffb812f3..e75f8284b7e 100644 --- a/packages/quick_actions/quick_actions_ios/ios/quick_actions_ios/Sources/quick_actions_ios/QuickActionsPlugin.swift +++ b/packages/quick_actions/quick_actions_ios/ios/quick_actions_ios/Sources/quick_actions_ios/QuickActionsPlugin.swift @@ -92,6 +92,7 @@ public final class QuickActionsPlugin: NSObject, FlutterPlugin, IOSQuickActionsA let type = shortcut.type let localizedTitle = shortcut.localizedTitle + let localizedSubtitle = shortcut.localizedSubtitle let icon = (shortcut.icon).map { UIApplicationShortcutIcon(templateImageName: $0) @@ -101,7 +102,7 @@ public final class QuickActionsPlugin: NSObject, FlutterPlugin, IOSQuickActionsA return UIApplicationShortcutItem( type: type, localizedTitle: localizedTitle, - localizedSubtitle: nil, + localizedSubtitle: localizedSubtitle, icon: icon, userInfo: nil) } 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 f4a4091c333..c406dadd2db 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 @@ -29,7 +29,7 @@ final class PigeonError: Error { var localizedDescription: String { return "PigeonError(code: \(code), message: \(message ?? ""), details: \(details ?? "")" - } + } } private func wrapResult(_ result: Any?) -> [Any?] { @@ -59,9 +59,7 @@ 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: "") + return PigeonError(code: "channel-error", message: "Unable to establish connection on channel: '\(channelName)'.", details: "") } private func isNullish(_ value: Any?) -> Bool { @@ -81,6 +79,8 @@ struct ShortcutItemMessage { var type: String /// Localized title of the item. var localizedTitle: String + /// Localized subtitle of the item. + var localizedSubtitle: String? = nil /// Name of native resource to be displayed as the icon for this item. var icon: String? = nil @@ -88,11 +88,13 @@ struct ShortcutItemMessage { 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]) + let localizedSubtitle: String? = nilOrValue(__pigeon_list[2]) + let icon: String? = nilOrValue(__pigeon_list[3]) return ShortcutItemMessage( type: type, localizedTitle: localizedTitle, + localizedSubtitle: localizedSubtitle, icon: icon ) } @@ -100,6 +102,7 @@ struct ShortcutItemMessage { return [ type, localizedTitle, + localizedSubtitle, icon, ] } @@ -152,16 +155,10 @@ protocol IOSQuickActionsApi { class IOSQuickActionsApiSetup { 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?, - messageChannelSuffix: String = "" - ) { + 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\(channelSuffix)", - binaryMessenger: binaryMessenger, codec: codec) + let setShortcutItemsChannel = FlutterBasicMessageChannel(name: "dev.flutter.pigeon.quick_actions_ios.IOSQuickActionsApi.setShortcutItems\(channelSuffix)", binaryMessenger: binaryMessenger, codec: codec) if let api = api { setShortcutItemsChannel.setMessageHandler { message, reply in let args = message as! [Any?] @@ -177,10 +174,7 @@ class IOSQuickActionsApiSetup { setShortcutItemsChannel.setMessageHandler(nil) } /// Removes all dynamic shortcuts. - let clearShortcutItemsChannel = FlutterBasicMessageChannel( - name: - "dev.flutter.pigeon.quick_actions_ios.IOSQuickActionsApi.clearShortcutItems\(channelSuffix)", - binaryMessenger: binaryMessenger, codec: codec) + let clearShortcutItemsChannel = FlutterBasicMessageChannel(name: "dev.flutter.pigeon.quick_actions_ios.IOSQuickActionsApi.clearShortcutItems\(channelSuffix)", binaryMessenger: binaryMessenger, codec: codec) if let api = api { clearShortcutItemsChannel.setMessageHandler { _, reply in do { @@ -198,8 +192,7 @@ class IOSQuickActionsApiSetup { /// Generated protocol from Pigeon that represents Flutter messages that can be called from Swift. protocol IOSQuickActionsFlutterApiProtocol { /// Sends a string representing a shortcut from the native platform to the app. - func launchAction( - action actionArg: String, completion: @escaping (Result) -> Void) + func launchAction(action actionArg: String, completion: @escaping (Result) -> Void) } class IOSQuickActionsFlutterApi: IOSQuickActionsFlutterApiProtocol { private let binaryMessenger: FlutterBinaryMessenger @@ -212,13 +205,9 @@ class IOSQuickActionsFlutterApi: IOSQuickActionsFlutterApiProtocol { 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 - ) { - let channelName: String = - "dev.flutter.pigeon.quick_actions_ios.IOSQuickActionsFlutterApi.launchAction\(messageChannelSuffix)" - let channel = FlutterBasicMessageChannel( - name: channelName, binaryMessenger: binaryMessenger, codec: codec) + func launchAction(action actionArg: String, completion: @escaping (Result) -> Void) { + let channelName: String = "dev.flutter.pigeon.quick_actions_ios.IOSQuickActionsFlutterApi.launchAction\(messageChannelSuffix)" + let channel = FlutterBasicMessageChannel(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))) 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 199871ff803..3fec7bbd2d0 100644 --- a/packages/quick_actions/quick_actions_ios/lib/messages.g.dart +++ b/packages/quick_actions/quick_actions_ios/lib/messages.g.dart @@ -18,8 +18,7 @@ PlatformException _createConnectionError(String channelName) { ); } -List wrapResponse( - {Object? result, PlatformException? error, bool empty = false}) { +List wrapResponse({Object? result, PlatformException? error, bool empty = false}) { if (empty) { return []; } @@ -34,6 +33,7 @@ class ShortcutItemMessage { ShortcutItemMessage({ required this.type, required this.localizedTitle, + this.localizedSubtitle, this.icon, }); @@ -43,6 +43,9 @@ class ShortcutItemMessage { /// Localized title of the item. String localizedTitle; + /// Localized subtitle of the item. + String? localizedSubtitle; + /// Name of native resource to be displayed as the icon for this item. String? icon; @@ -50,6 +53,7 @@ class ShortcutItemMessage { return [ type, localizedTitle, + localizedSubtitle, icon, ]; } @@ -59,11 +63,13 @@ class ShortcutItemMessage { return ShortcutItemMessage( type: result[0]! as String, localizedTitle: result[1]! as String, - icon: result[2] as String?, + localizedSubtitle: result[2] as String?, + icon: result[3] as String?, ); } } + class _PigeonCodec extends StandardMessageCodec { const _PigeonCodec(); @override @@ -79,7 +85,7 @@ class _PigeonCodec extends StandardMessageCodec { @override Object? readValueOfType(int type, ReadBuffer buffer) { switch (type) { - case 129: + case 129: return ShortcutItemMessage.decode(readValue(buffer)!); default: return super.readValueOfType(type, buffer); @@ -91,11 +97,9 @@ 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, String messageChannelSuffix = ''}) + IOSQuickActionsApi({BinaryMessenger? binaryMessenger, String messageChannelSuffix = ''}) : __pigeon_binaryMessenger = binaryMessenger, - __pigeon_messageChannelSuffix = - messageChannelSuffix.isNotEmpty ? '.$messageChannelSuffix' : ''; + __pigeon_messageChannelSuffix = messageChannelSuffix.isNotEmpty ? '.$messageChannelSuffix' : ''; final BinaryMessenger? __pigeon_binaryMessenger; static const MessageCodec pigeonChannelCodec = _PigeonCodec(); @@ -104,10 +108,8 @@ class IOSQuickActionsApi { /// Sets the dynamic shortcuts for the app. Future setShortcutItems(List itemsList) async { - final String __pigeon_channelName = - 'dev.flutter.pigeon.quick_actions_ios.IOSQuickActionsApi.setShortcutItems$__pigeon_messageChannelSuffix'; - final BasicMessageChannel __pigeon_channel = - BasicMessageChannel( + 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, @@ -129,10 +131,8 @@ class IOSQuickActionsApi { /// Removes all dynamic shortcuts. Future clearShortcutItems() async { - final String __pigeon_channelName = - 'dev.flutter.pigeon.quick_actions_ios.IOSQuickActionsApi.clearShortcutItems$__pigeon_messageChannelSuffix'; - final BasicMessageChannel __pigeon_channel = - BasicMessageChannel( + 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, @@ -159,25 +159,18 @@ abstract class IOSQuickActionsFlutterApi { /// Sends a string representing a shortcut from the native platform to the app. void launchAction(String action); - static void setUp( - IOSQuickActionsFlutterApi? api, { - BinaryMessenger? binaryMessenger, - String messageChannelSuffix = '', - }) { - messageChannelSuffix = - messageChannelSuffix.isNotEmpty ? '.$messageChannelSuffix' : ''; + static void setUp(IOSQuickActionsFlutterApi? api, {BinaryMessenger? binaryMessenger, String messageChannelSuffix = '',}) { + messageChannelSuffix = messageChannelSuffix.isNotEmpty ? '.$messageChannelSuffix' : ''; { - final BasicMessageChannel __pigeon_channel = BasicMessageChannel< - Object?>( - 'dev.flutter.pigeon.quick_actions_ios.IOSQuickActionsFlutterApi.launchAction$messageChannelSuffix', - pigeonChannelCodec, + final BasicMessageChannel __pigeon_channel = BasicMessageChannel( + 'dev.flutter.pigeon.quick_actions_ios.IOSQuickActionsFlutterApi.launchAction$messageChannelSuffix', pigeonChannelCodec, binaryMessenger: binaryMessenger); if (api == null) { __pigeon_channel.setMessageHandler(null); } else { __pigeon_channel.setMessageHandler((Object? message) async { assert(message != null, - 'Argument for dev.flutter.pigeon.quick_actions_ios.IOSQuickActionsFlutterApi.launchAction was null.'); + 'Argument for dev.flutter.pigeon.quick_actions_ios.IOSQuickActionsFlutterApi.launchAction was null.'); final List args = (message as List?)!; final String? arg_action = (args[0] as String?); assert(arg_action != null, @@ -187,9 +180,8 @@ abstract class IOSQuickActionsFlutterApi { return wrapResponse(empty: true); } on PlatformException catch (e) { return wrapResponse(error: e); - } catch (e) { - return wrapResponse( - error: PlatformException(code: 'error', message: e.toString())); + } catch (e) { + return wrapResponse(error: PlatformException(code: 'error', message: e.toString())); } }); } 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 b002e0ec136..e90b68333ed 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 @@ -47,6 +47,7 @@ class QuickActionsIos extends QuickActionsPlatform { return ShortcutItemMessage( type: item.type, localizedTitle: item.localizedTitle, + localizedSubtitle: item.localizedSubtitle, icon: item.icon, ); } diff --git a/packages/quick_actions/quick_actions_ios/pigeons/messages.dart b/packages/quick_actions/quick_actions_ios/pigeons/messages.dart index 7cf7d20d587..043d4ba7cc3 100644 --- a/packages/quick_actions/quick_actions_ios/pigeons/messages.dart +++ b/packages/quick_actions/quick_actions_ios/pigeons/messages.dart @@ -15,6 +15,7 @@ class ShortcutItemMessage { ShortcutItemMessage( this.type, this.localizedTitle, + this.localizedSubtitle, this.icon, ); @@ -24,6 +25,9 @@ class ShortcutItemMessage { /// Localized title of the item. String localizedTitle; + /// Localized subtitle of the item. + String? localizedSubtitle; + /// Name of native resource to be displayed as the icon for this item. String? icon; } diff --git a/packages/quick_actions/quick_actions_ios/pubspec.yaml b/packages/quick_actions/quick_actions_ios/pubspec.yaml index 9f0abd93fe4..e7a82a9ef11 100644 --- a/packages/quick_actions/quick_actions_ios/pubspec.yaml +++ b/packages/quick_actions/quick_actions_ios/pubspec.yaml @@ -21,6 +21,14 @@ dependencies: sdk: flutter quick_actions_platform_interface: ^1.0.0 + +# FOR TESTING AND INITIAL REVIEW ONLY. DO NOT MERGE. +# See https://github.com/flutter/flutter/blob/master/docs/ecosystem/contributing/README.md#changing-federated-plugins +dependency_overrides: + + quick_actions_platform_interface: + path: ../../quick_actions/quick_actions_platform_interface + dev_dependencies: flutter_test: sdk: flutter diff --git a/packages/quick_actions/quick_actions_ios/test/quick_actions_ios_test.dart b/packages/quick_actions/quick_actions_ios/test/quick_actions_ios_test.dart index eff84081274..b53137dcc9d 100644 --- a/packages/quick_actions/quick_actions_ios/test/quick_actions_ios_test.dart +++ b/packages/quick_actions/quick_actions_ios/test/quick_actions_ios_test.dart @@ -26,19 +26,28 @@ void main() { test('setShortcutItems', () async { await quickActions.initialize((String type) {}); - const ShortcutItem item = - ShortcutItem(type: 'test', localizedTitle: 'title', icon: 'icon.svg'); + const ShortcutItem item = ShortcutItem( + type: 'test', + localizedTitle: 'title', + localizedSubtitle: 'subtitle', + icon: 'icon.svg', + ); await quickActions.setShortcutItems([item]); expect(api.items.first.type, item.type); expect(api.items.first.localizedTitle, item.localizedTitle); + expect(api.items.first.localizedSubtitle, item.localizedSubtitle); expect(api.items.first.icon, item.icon); }); test('clearShortCutItems', () { quickActions.initialize((String type) {}); - const ShortcutItem item = - ShortcutItem(type: 'test', localizedTitle: 'title', icon: 'icon.svg'); + const ShortcutItem item = ShortcutItem( + type: 'test', + localizedTitle: 'title', + localizedSubtitle: 'subtitle', + icon: 'icon.svg', + ); quickActions.setShortcutItems([item]); quickActions.clearShortcutItems(); @@ -48,13 +57,19 @@ void main() { test('Shortcut item can be constructed', () { const String type = 'type'; const String localizedTitle = 'title'; + const String localizedSubtitle = 'subtitle'; const String icon = 'foo'; - const ShortcutItem item = - ShortcutItem(type: type, localizedTitle: localizedTitle, icon: icon); + const ShortcutItem item = ShortcutItem( + type: type, + localizedTitle: localizedTitle, + localizedSubtitle: localizedSubtitle, + icon: icon, + ); expect(item.type, type); expect(item.localizedTitle, localizedTitle); + expect(item.localizedSubtitle, localizedSubtitle); expect(item.icon, icon); }); } @@ -83,6 +98,7 @@ ShortcutItem shortcutItemMessageToShortcutItem(ShortcutItemMessage item) { return ShortcutItem( type: item.type, localizedTitle: item.localizedTitle, + localizedSubtitle: item.localizedSubtitle, icon: item.icon, ); } diff --git a/packages/quick_actions/quick_actions_platform_interface/CHANGELOG.md b/packages/quick_actions/quick_actions_platform_interface/CHANGELOG.md index 67914343eb9..607ba275f8f 100644 --- a/packages/quick_actions/quick_actions_platform_interface/CHANGELOG.md +++ b/packages/quick_actions/quick_actions_platform_interface/CHANGELOG.md @@ -1,5 +1,6 @@ ## NEXT +* Add localizedSubtitle field for iOS * Updates minimum supported SDK version to Flutter 3.16/Dart 3.2. ## 1.0.6 diff --git a/packages/quick_actions/quick_actions_platform_interface/lib/method_channel/method_channel_quick_actions.dart b/packages/quick_actions/quick_actions_platform_interface/lib/method_channel/method_channel_quick_actions.dart index 0f936db870c..2d5b6874344 100644 --- a/packages/quick_actions/quick_actions_platform_interface/lib/method_channel/method_channel_quick_actions.dart +++ b/packages/quick_actions/quick_actions_platform_interface/lib/method_channel/method_channel_quick_actions.dart @@ -45,6 +45,8 @@ class MethodChannelQuickActions extends QuickActionsPlatform { return { 'type': item.type, 'localizedTitle': item.localizedTitle, + if (item.localizedSubtitle != null) + 'localizedSubtitle': item.localizedSubtitle, 'icon': item.icon, }; } diff --git a/packages/quick_actions/quick_actions_platform_interface/lib/types/shortcut_item.dart b/packages/quick_actions/quick_actions_platform_interface/lib/types/shortcut_item.dart index 1d84e16ac99..50753a58898 100644 --- a/packages/quick_actions/quick_actions_platform_interface/lib/types/shortcut_item.dart +++ b/packages/quick_actions/quick_actions_platform_interface/lib/types/shortcut_item.dart @@ -11,6 +11,7 @@ class ShortcutItem { const ShortcutItem({ required this.type, required this.localizedTitle, + this.localizedSubtitle, this.icon, }); @@ -20,6 +21,11 @@ class ShortcutItem { /// Localized title of the item. final String localizedTitle; + /// Localized subtitle of the item. + /// + /// This is ignored on Android, since it's not supported. + final String? localizedSubtitle; + /// Name of native resource (xcassets etc; NOT a Flutter asset) to be /// displayed as the icon for this item. final String? icon; diff --git a/packages/quick_actions/quick_actions_platform_interface/test/method_channel_quick_actions_test.dart b/packages/quick_actions/quick_actions_platform_interface/test/method_channel_quick_actions_test.dart index 41e2ed4e724..0005fda5228 100644 --- a/packages/quick_actions/quick_actions_platform_interface/test/method_channel_quick_actions_test.dart +++ b/packages/quick_actions/quick_actions_platform_interface/test/method_channel_quick_actions_test.dart @@ -61,7 +61,38 @@ void main() { quickActions.initialize((String type) {}); quickActions.setShortcutItems([ const ShortcutItem( - type: 'test', localizedTitle: 'title', icon: 'icon.svg') + type: 'test', + localizedTitle: 'title', + localizedSubtitle: 'subtitle', + icon: 'icon.svg', + ) + ]); + + expect( + log, + [ + isMethodCall('getLaunchAction', arguments: null), + isMethodCall('setShortcutItems', arguments: >[ + { + 'type': 'test', + 'localizedTitle': 'title', + 'localizedSubtitle': 'subtitle', + 'icon': 'icon.svg', + } + ]), + ], + ); + }); + + test('passes shortcutItem through channel with null localizedSubtitle', + () { + quickActions.initialize((String type) {}); + quickActions.setShortcutItems([ + const ShortcutItem( + type: 'test', + localizedTitle: 'title', + icon: 'icon.svg', + ) ]); expect( @@ -82,10 +113,15 @@ void main() { test('setShortcutItems with demo data', () async { const String type = 'type'; const String localizedTitle = 'localizedTitle'; + const String localizedSubtitle = 'localizedSubtitle'; const String icon = 'icon'; await quickActions.setShortcutItems( const [ - ShortcutItem(type: type, localizedTitle: localizedTitle, icon: icon) + ShortcutItem( + type: type, + localizedTitle: localizedTitle, + localizedSubtitle: localizedSubtitle, + icon: icon) ], ); expect( @@ -97,6 +133,7 @@ void main() { { 'type': type, 'localizedTitle': localizedTitle, + 'localizedSubtitle': localizedSubtitle, 'icon': icon, } ], @@ -138,13 +175,19 @@ void main() { test('Shortcut item can be constructed', () { const String type = 'type'; const String localizedTitle = 'title'; + const String localizedSubtitle = 'subtitle'; const String icon = 'foo'; - const ShortcutItem item = - ShortcutItem(type: type, localizedTitle: localizedTitle, icon: icon); + const ShortcutItem item = ShortcutItem( + type: type, + localizedTitle: localizedTitle, + localizedSubtitle: localizedSubtitle, + icon: icon, + ); expect(item.type, type); expect(item.localizedTitle, localizedTitle); + expect(item.localizedSubtitle, localizedSubtitle); expect(item.icon, icon); }); });