From 5c3286b84bd1d02ab194cafca55a6638ac993de9 Mon Sep 17 00:00:00 2001 From: Stuart Morgan Date: Thu, 6 Feb 2025 12:49:58 -0500 Subject: [PATCH] [quick_actions] Update Android Pigeon version `quick_actions_android` was still using a very old version of Pigeon; this updates to the current version. The changes are minimal, but this avoids inconsistency with other plugins (e.g., `setup` vs `setUp`), and potential issues with forcing old versions of transitive dependencies shared with `pigeon`. --- .../quick_actions_android/CHANGELOG.md | 4 + .../plugins/quickactions/Messages.java | 178 +++++++++++++----- .../plugins/quickactions/QuickActions.java | 9 +- .../quickactions/QuickActionsPlugin.java | 24 ++- .../lib/quick_actions_android.dart | 2 +- .../lib/src/messages.g.dart | 178 +++++++++++------- .../quick_actions_android/pubspec.yaml | 4 +- .../test/quick_actions_android_test.dart | 9 + 8 files changed, 275 insertions(+), 133 deletions(-) diff --git a/packages/quick_actions/quick_actions_android/CHANGELOG.md b/packages/quick_actions/quick_actions_android/CHANGELOG.md index 4ea1b250ffb..d73703d5c8b 100644 --- a/packages/quick_actions/quick_actions_android/CHANGELOG.md +++ b/packages/quick_actions/quick_actions_android/CHANGELOG.md @@ -1,3 +1,7 @@ +## 1.0.19 + +* Updates `pigeon` dependency to version 24. + ## 1.0.18 * Updates Java compatibility version to 11. diff --git a/packages/quick_actions/quick_actions_android/android/src/main/java/io/flutter/plugins/quickactions/Messages.java b/packages/quick_actions/quick_actions_android/android/src/main/java/io/flutter/plugins/quickactions/Messages.java index 2057127e815..d98a113f34f 100644 --- a/packages/quick_actions/quick_actions_android/android/src/main/java/io/flutter/plugins/quickactions/Messages.java +++ b/packages/quick_actions/quick_actions_android/android/src/main/java/io/flutter/plugins/quickactions/Messages.java @@ -1,11 +1,14 @@ // 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 (v11.0.1), do not edit directly. +// Autogenerated from Pigeon (v24.0.0), do not edit directly. // See also: https://pub.dev/packages/pigeon package io.flutter.plugins.quickactions; +import static java.lang.annotation.ElementType.METHOD; +import static java.lang.annotation.RetentionPolicy.CLASS; + import android.util.Log; import androidx.annotation.NonNull; import androidx.annotation.Nullable; @@ -14,10 +17,13 @@ import io.flutter.plugin.common.MessageCodec; import io.flutter.plugin.common.StandardMessageCodec; import java.io.ByteArrayOutputStream; +import java.lang.annotation.Retention; +import java.lang.annotation.Target; import java.nio.ByteBuffer; import java.util.ArrayList; import java.util.Collections; import java.util.List; +import java.util.Objects; /** Generated class from Pigeon. */ @SuppressWarnings({"unused", "unchecked", "CodeBlock2Expr", "RedundantSuppression", "serial"}) @@ -41,7 +47,7 @@ public FlutterError(@NonNull String code, @Nullable String message, @Nullable Ob @NonNull protected static ArrayList wrapError(@NonNull Throwable exception) { - ArrayList errorList = new ArrayList(3); + ArrayList errorList = new ArrayList<>(3); if (exception instanceof FlutterError) { FlutterError error = (FlutterError) exception; errorList.add(error.code); @@ -56,6 +62,16 @@ protected static ArrayList wrapError(@NonNull Throwable exception) { return errorList; } + @NonNull + protected static FlutterError createConnectionError(@NonNull String channelName) { + return new FlutterError( + "channel-error", "Unable to establish connection on channel: " + channelName + ".", ""); + } + + @Target(METHOD) + @Retention(CLASS) + @interface CanIgnoreReturnValue {} + /** * Home screen quick-action shortcut item. * @@ -104,10 +120,30 @@ public void setIcon(@Nullable String setterArg) { /** Constructor is non-public to enforce null safety; use Builder. */ ShortcutItemMessage() {} + @Override + public boolean equals(Object o) { + if (this == o) { + return true; + } + if (o == null || getClass() != o.getClass()) { + return false; + } + ShortcutItemMessage that = (ShortcutItemMessage) o; + return type.equals(that.type) + && localizedTitle.equals(that.localizedTitle) + && Objects.equals(icon, that.icon); + } + + @Override + public int hashCode() { + return Objects.hash(type, localizedTitle, icon); + } + public static final class Builder { private @Nullable String type; + @CanIgnoreReturnValue public @NonNull Builder setType(@NonNull String setterArg) { this.type = setterArg; return this; @@ -115,6 +151,7 @@ public static final class Builder { private @Nullable String localizedTitle; + @CanIgnoreReturnValue public @NonNull Builder setLocalizedTitle(@NonNull String setterArg) { this.localizedTitle = setterArg; return this; @@ -122,6 +159,7 @@ public static final class Builder { private @Nullable String icon; + @CanIgnoreReturnValue public @NonNull Builder setIcon(@Nullable String setterArg) { this.icon = setterArg; return this; @@ -138,41 +176,34 @@ public static final class Builder { @NonNull ArrayList toList() { - ArrayList toListResult = new ArrayList(3); + ArrayList toListResult = new ArrayList<>(3); toListResult.add(type); toListResult.add(localizedTitle); toListResult.add(icon); return toListResult; } - static @NonNull ShortcutItemMessage fromList(@NonNull ArrayList list) { + static @NonNull ShortcutItemMessage fromList(@NonNull ArrayList pigeonVar_list) { ShortcutItemMessage pigeonResult = new ShortcutItemMessage(); - Object type = list.get(0); + Object type = pigeonVar_list.get(0); pigeonResult.setType((String) type); - Object localizedTitle = list.get(1); + Object localizedTitle = pigeonVar_list.get(1); pigeonResult.setLocalizedTitle((String) localizedTitle); - Object icon = list.get(2); + Object icon = pigeonVar_list.get(2); pigeonResult.setIcon((String) icon); return pigeonResult; } } - public interface Result { - @SuppressWarnings("UnknownNullness") - void success(T result); - - void error(@NonNull Throwable error); - } + private static class PigeonCodec extends StandardMessageCodec { + public static final PigeonCodec INSTANCE = new PigeonCodec(); - private static class AndroidQuickActionsApiCodec extends StandardMessageCodec { - public static final AndroidQuickActionsApiCodec INSTANCE = new AndroidQuickActionsApiCodec(); - - private AndroidQuickActionsApiCodec() {} + private PigeonCodec() {} @Override protected Object readValueOfType(byte type, @NonNull ByteBuffer buffer) { switch (type) { - case (byte) 128: + case (byte) 129: return ShortcutItemMessage.fromList((ArrayList) readValue(buffer)); default: return super.readValueOfType(type, buffer); @@ -182,7 +213,7 @@ protected Object readValueOfType(byte type, @NonNull ByteBuffer buffer) { @Override protected void writeValue(@NonNull ByteArrayOutputStream stream, Object value) { if (value instanceof ShortcutItemMessage) { - stream.write(128); + stream.write(129); writeValue(stream, ((ShortcutItemMessage) value).toList()); } else { super.writeValue(stream, value); @@ -190,43 +221,74 @@ protected void writeValue(@NonNull ByteArrayOutputStream stream, Object value) { } } + /** Asynchronous error handling return type for non-nullable API method returns. */ + public interface Result { + /** Success case callback method for handling returns. */ + void success(@NonNull T result); + + /** Failure case callback method for handling errors. */ + void error(@NonNull Throwable error); + } + /** Asynchronous error handling return type for nullable API method returns. */ + public interface NullableResult { + /** Success case callback method for handling returns. */ + void success(@Nullable T result); + + /** Failure case callback method for handling errors. */ + void error(@NonNull Throwable error); + } + /** Asynchronous error handling return type for void API method returns. */ + public interface VoidResult { + /** Success case callback method for handling returns. */ + void success(); + + /** Failure case callback method for handling errors. */ + void error(@NonNull Throwable error); + } /** Generated interface from Pigeon that represents a handler of messages from Flutter. */ public interface AndroidQuickActionsApi { /** Checks for, and returns the action that launched the app. */ @Nullable String getLaunchAction(); /** Sets the dynamic shortcuts for the app. */ - void setShortcutItems( - @NonNull List itemsList, @NonNull Result result); + void setShortcutItems(@NonNull List itemsList, @NonNull VoidResult result); /** Removes all dynamic shortcuts. */ void clearShortcutItems(); /** The codec used by AndroidQuickActionsApi. */ static @NonNull MessageCodec getCodec() { - return AndroidQuickActionsApiCodec.INSTANCE; + return PigeonCodec.INSTANCE; } /** * Sets up an instance of `AndroidQuickActionsApi` to handle messages through the * `binaryMessenger`. */ - static void setup( + static void setUp( @NonNull BinaryMessenger binaryMessenger, @Nullable AndroidQuickActionsApi api) { + setUp(binaryMessenger, "", api); + } + + static void setUp( + @NonNull BinaryMessenger binaryMessenger, + @NonNull String messageChannelSuffix, + @Nullable AndroidQuickActionsApi api) { + messageChannelSuffix = messageChannelSuffix.isEmpty() ? "" : "." + messageChannelSuffix; { BasicMessageChannel channel = new BasicMessageChannel<>( binaryMessenger, - "dev.flutter.pigeon.quick_actions_android.AndroidQuickActionsApi.getLaunchAction", + "dev.flutter.pigeon.quick_actions_android.AndroidQuickActionsApi.getLaunchAction" + + messageChannelSuffix, getCodec()); if (api != null) { channel.setMessageHandler( (message, reply) -> { - ArrayList wrapped = new ArrayList(); + ArrayList wrapped = new ArrayList<>(); try { String output = api.getLaunchAction(); wrapped.add(0, output); } catch (Throwable exception) { - ArrayList wrappedError = wrapError(exception); - wrapped = wrappedError; + wrapped = wrapError(exception); } reply.reply(wrapped); }); @@ -238,17 +300,18 @@ static void setup( BasicMessageChannel channel = new BasicMessageChannel<>( binaryMessenger, - "dev.flutter.pigeon.quick_actions_android.AndroidQuickActionsApi.setShortcutItems", + "dev.flutter.pigeon.quick_actions_android.AndroidQuickActionsApi.setShortcutItems" + + messageChannelSuffix, getCodec()); if (api != null) { channel.setMessageHandler( (message, reply) -> { - ArrayList wrapped = new ArrayList(); + ArrayList wrapped = new ArrayList<>(); ArrayList args = (ArrayList) message; List itemsListArg = (List) args.get(0); - Result resultCallback = - new Result() { - public void success(Void result) { + VoidResult resultCallback = + new VoidResult() { + public void success() { wrapped.add(0, null); reply.reply(wrapped); } @@ -269,18 +332,18 @@ public void error(Throwable error) { BasicMessageChannel channel = new BasicMessageChannel<>( binaryMessenger, - "dev.flutter.pigeon.quick_actions_android.AndroidQuickActionsApi.clearShortcutItems", + "dev.flutter.pigeon.quick_actions_android.AndroidQuickActionsApi.clearShortcutItems" + + messageChannelSuffix, getCodec()); if (api != null) { channel.setMessageHandler( (message, reply) -> { - ArrayList wrapped = new ArrayList(); + ArrayList wrapped = new ArrayList<>(); try { api.clearShortcutItems(); wrapped.add(0, null); } catch (Throwable exception) { - ArrayList wrappedError = wrapError(exception); - wrapped = wrappedError; + wrapped = wrapError(exception); } reply.reply(wrapped); }); @@ -293,30 +356,45 @@ public void error(Throwable error) { /** Generated class from Pigeon that represents Flutter messages that can be called from Java. */ public static class AndroidQuickActionsFlutterApi { private final @NonNull BinaryMessenger binaryMessenger; + private final String messageChannelSuffix; public AndroidQuickActionsFlutterApi(@NonNull BinaryMessenger argBinaryMessenger) { - this.binaryMessenger = argBinaryMessenger; + this(argBinaryMessenger, ""); } - /** Public interface for sending reply. */ - @SuppressWarnings("UnknownNullness") - public interface Reply { - void reply(T reply); + public AndroidQuickActionsFlutterApi( + @NonNull BinaryMessenger argBinaryMessenger, @NonNull String messageChannelSuffix) { + this.binaryMessenger = argBinaryMessenger; + this.messageChannelSuffix = messageChannelSuffix.isEmpty() ? "" : "." + messageChannelSuffix; } - /** The codec used by AndroidQuickActionsFlutterApi. */ + + /** Public interface for sending reply. The codec used by AndroidQuickActionsFlutterApi. */ static @NonNull MessageCodec getCodec() { - return new StandardMessageCodec(); + return PigeonCodec.INSTANCE; } /** Sends a string representing a shortcut from the native platform to the app. */ - public void launchAction(@NonNull String actionArg, @NonNull Reply callback) { + public void launchAction(@NonNull String actionArg, @NonNull VoidResult result) { + final String channelName = + "dev.flutter.pigeon.quick_actions_android.AndroidQuickActionsFlutterApi.launchAction" + + messageChannelSuffix; BasicMessageChannel channel = - new BasicMessageChannel<>( - binaryMessenger, - "dev.flutter.pigeon.quick_actions_android.AndroidQuickActionsFlutterApi.launchAction", - getCodec()); + new BasicMessageChannel<>(binaryMessenger, channelName, getCodec()); channel.send( - new ArrayList(Collections.singletonList(actionArg)), - channelReply -> callback.reply(null)); + new ArrayList<>(Collections.singletonList(actionArg)), + channelReply -> { + if (channelReply instanceof List) { + List listReply = (List) channelReply; + if (listReply.size() > 1) { + result.error( + new FlutterError( + (String) listReply.get(0), (String) listReply.get(1), listReply.get(2))); + } else { + result.success(); + } + } else { + result.error(createConnectionError(channelName)); + } + }); } } } diff --git a/packages/quick_actions/quick_actions_android/android/src/main/java/io/flutter/plugins/quickactions/QuickActions.java b/packages/quick_actions/quick_actions_android/android/src/main/java/io/flutter/plugins/quickactions/QuickActions.java index 1c124ae3515..9064ee182b2 100644 --- a/packages/quick_actions/quick_actions_android/android/src/main/java/io/flutter/plugins/quickactions/QuickActions.java +++ b/packages/quick_actions/quick_actions_android/android/src/main/java/io/flutter/plugins/quickactions/QuickActions.java @@ -20,7 +20,6 @@ import androidx.core.graphics.drawable.IconCompat; import io.flutter.plugins.quickactions.Messages.AndroidQuickActionsApi; import io.flutter.plugins.quickactions.Messages.FlutterError; -import io.flutter.plugins.quickactions.Messages.Result; import io.flutter.plugins.quickactions.Messages.ShortcutItemMessage; import java.util.ArrayList; import java.util.List; @@ -30,7 +29,7 @@ import java.util.concurrent.TimeUnit; final class QuickActions implements AndroidQuickActionsApi { - protected static final String EXTRA_ACTION = "some unique action key"; + static final String EXTRA_ACTION = "some unique action key"; private final Context context; private Activity activity; @@ -56,9 +55,9 @@ boolean isVersionAllowed() { @Override public void setShortcutItems( - @NonNull List itemsList, @NonNull Result result) { + @NonNull List itemsList, @NonNull Messages.VoidResult result) { if (!isVersionAllowed()) { - result.success(null); + result.success(); return; } List shortcuts = shortcutItemMessageToShortcutInfo(itemsList); @@ -82,7 +81,7 @@ public void setShortcutItems( uiThreadExecutor.execute( () -> { if (didSucceed) { - result.success(null); + result.success(); } else { result.error( new FlutterError( diff --git a/packages/quick_actions/quick_actions_android/android/src/main/java/io/flutter/plugins/quickactions/QuickActionsPlugin.java b/packages/quick_actions/quick_actions_android/android/src/main/java/io/flutter/plugins/quickactions/QuickActionsPlugin.java index 9dd701054ad..19821b936d1 100644 --- a/packages/quick_actions/quick_actions_android/android/src/main/java/io/flutter/plugins/quickactions/QuickActionsPlugin.java +++ b/packages/quick_actions/quick_actions_android/android/src/main/java/io/flutter/plugins/quickactions/QuickActionsPlugin.java @@ -46,13 +46,13 @@ public QuickActionsPlugin() { @Override public void onAttachedToEngine(@NonNull FlutterPluginBinding binding) { this.quickActions = new QuickActions(binding.getApplicationContext()); - Messages.AndroidQuickActionsApi.setup(binding.getBinaryMessenger(), quickActions); + Messages.AndroidQuickActionsApi.setUp(binding.getBinaryMessenger(), quickActions); this.quickActionsFlutterApi = new AndroidQuickActionsFlutterApi(binding.getBinaryMessenger()); } @Override public void onDetachedFromEngine(@NonNull FlutterPluginBinding binding) { - Messages.AndroidQuickActionsApi.setup(binding.getBinaryMessenger(), null); + Messages.AndroidQuickActionsApi.setUp(binding.getBinaryMessenger(), null); this.quickActions = null; } @@ -96,12 +96,20 @@ public boolean onNewIntent(@NonNull Intent intent) { if (intent.hasExtra(QuickActions.EXTRA_ACTION) && activity != null) { Context context = activity.getApplicationContext(); String shortcutId = intent.getStringExtra(QuickActions.EXTRA_ACTION); - quickActionsFlutterApi.launchAction( - shortcutId, - value -> { - // noop - }); - ShortcutManagerCompat.reportShortcutUsed(context, shortcutId); + if (shortcutId != null) { + quickActionsFlutterApi.launchAction( + shortcutId, + new Messages.VoidResult() { + @Override + public void success() {} + + @Override + public void error(@NonNull Throwable error) { + Log.e(TAG, "Failed to handle launch action: " + error.getMessage()); + } + }); + ShortcutManagerCompat.reportShortcutUsed(context, shortcutId); + } } return false; } diff --git a/packages/quick_actions/quick_actions_android/lib/quick_actions_android.dart b/packages/quick_actions/quick_actions_android/lib/quick_actions_android.dart index 811f7ffed86..7adafe74306 100644 --- a/packages/quick_actions/quick_actions_android/lib/quick_actions_android.dart +++ b/packages/quick_actions/quick_actions_android/lib/quick_actions_android.dart @@ -29,7 +29,7 @@ class QuickActionsAndroid extends QuickActionsPlatform { Future initialize(QuickActionHandler handler) async { final _QuickActionHandlerApi quickActionsHandlerApi = _QuickActionHandlerApi(); - AndroidQuickActionsFlutterApi.setup(quickActionsHandlerApi); + AndroidQuickActionsFlutterApi.setUp(quickActionsHandlerApi); _handler = handler; final String? action = await _hostApi.getLaunchAction(); if (action != null) { diff --git a/packages/quick_actions/quick_actions_android/lib/src/messages.g.dart b/packages/quick_actions/quick_actions_android/lib/src/messages.g.dart index 2e4fa9a188e..3e50ffa9513 100644 --- a/packages/quick_actions/quick_actions_android/lib/src/messages.g.dart +++ b/packages/quick_actions/quick_actions_android/lib/src/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 (v11.0.1), do not edit directly. +// Autogenerated from Pigeon (v24.0.0), 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,24 @@ 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) { + return []; + } + if (error == null) { + return [result]; + } + return [error.code, error.message, error.details]; +} + /// Home screen quick-action shortcut item. class ShortcutItemMessage { ShortcutItemMessage({ @@ -46,12 +64,15 @@ class ShortcutItemMessage { } } -class _AndroidQuickActionsApiCodec extends StandardMessageCodec { - const _AndroidQuickActionsApiCodec(); +class _PigeonCodec extends StandardMessageCodec { + const _PigeonCodec(); @override void writeValue(WriteBuffer buffer, Object? value) { - if (value is ShortcutItemMessage) { - buffer.putUint8(128); + if (value is int) { + buffer.putUint8(4); + buffer.putInt64(value); + } else if (value is ShortcutItemMessage) { + buffer.putUint8(129); writeValue(buffer, value.encode()); } else { super.writeValue(buffer, value); @@ -61,7 +82,7 @@ class _AndroidQuickActionsApiCodec 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); @@ -73,54 +94,61 @@ class AndroidQuickActionsApi { /// Constructor for [AndroidQuickActionsApi]. 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. - AndroidQuickActionsApi({BinaryMessenger? binaryMessenger}) - : _binaryMessenger = binaryMessenger; - final BinaryMessenger? _binaryMessenger; + AndroidQuickActionsApi( + {BinaryMessenger? binaryMessenger, String messageChannelSuffix = ''}) + : pigeonVar_binaryMessenger = binaryMessenger, + pigeonVar_messageChannelSuffix = + messageChannelSuffix.isNotEmpty ? '.$messageChannelSuffix' : ''; + final BinaryMessenger? pigeonVar_binaryMessenger; - static const MessageCodec codec = _AndroidQuickActionsApiCodec(); + static const MessageCodec pigeonChannelCodec = _PigeonCodec(); + + final String pigeonVar_messageChannelSuffix; /// Checks for, and returns the action that launched the app. Future getLaunchAction() async { - final BasicMessageChannel channel = BasicMessageChannel( - 'dev.flutter.pigeon.quick_actions_android.AndroidQuickActionsApi.getLaunchAction', - 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 pigeonVar_channelName = + 'dev.flutter.pigeon.quick_actions_android.AndroidQuickActionsApi.getLaunchAction$pigeonVar_messageChannelSuffix'; + final BasicMessageChannel pigeonVar_channel = + BasicMessageChannel( + pigeonVar_channelName, + pigeonChannelCodec, + binaryMessenger: pigeonVar_binaryMessenger, + ); + final List? pigeonVar_replyList = + await pigeonVar_channel.send(null) as List?; + if (pigeonVar_replyList == null) { + throw _createConnectionError(pigeonVar_channelName); + } else if (pigeonVar_replyList.length > 1) { throw PlatformException( - code: replyList[0]! as String, - message: replyList[1] as String?, - details: replyList[2], + code: pigeonVar_replyList[0]! as String, + message: pigeonVar_replyList[1] as String?, + details: pigeonVar_replyList[2], ); } else { - return (replyList[0] as String?); + return (pigeonVar_replyList[0] as String?); } } /// Sets the dynamic shortcuts for the app. - Future setShortcutItems( - List arg_itemsList) async { - final BasicMessageChannel channel = BasicMessageChannel( - 'dev.flutter.pigeon.quick_actions_android.AndroidQuickActionsApi.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 pigeonVar_channelName = + 'dev.flutter.pigeon.quick_actions_android.AndroidQuickActionsApi.setShortcutItems$pigeonVar_messageChannelSuffix'; + final BasicMessageChannel pigeonVar_channel = + BasicMessageChannel( + pigeonVar_channelName, + pigeonChannelCodec, + binaryMessenger: pigeonVar_binaryMessenger, + ); + final List? pigeonVar_replyList = + await pigeonVar_channel.send([itemsList]) as List?; + if (pigeonVar_replyList == null) { + throw _createConnectionError(pigeonVar_channelName); + } else if (pigeonVar_replyList.length > 1) { throw PlatformException( - code: replyList[0]! as String, - message: replyList[1] as String?, - details: replyList[2], + code: pigeonVar_replyList[0]! as String, + message: pigeonVar_replyList[1] as String?, + details: pigeonVar_replyList[2], ); } else { return; @@ -129,21 +157,23 @@ class AndroidQuickActionsApi { /// Removes all dynamic shortcuts. Future clearShortcutItems() async { - final BasicMessageChannel channel = BasicMessageChannel( - 'dev.flutter.pigeon.quick_actions_android.AndroidQuickActionsApi.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 pigeonVar_channelName = + 'dev.flutter.pigeon.quick_actions_android.AndroidQuickActionsApi.clearShortcutItems$pigeonVar_messageChannelSuffix'; + final BasicMessageChannel pigeonVar_channel = + BasicMessageChannel( + pigeonVar_channelName, + pigeonChannelCodec, + binaryMessenger: pigeonVar_binaryMessenger, + ); + final List? pigeonVar_replyList = + await pigeonVar_channel.send(null) as List?; + if (pigeonVar_replyList == null) { + throw _createConnectionError(pigeonVar_channelName); + } else if (pigeonVar_replyList.length > 1) { throw PlatformException( - code: replyList[0]! as String, - message: replyList[1] as String?, - details: replyList[2], + code: pigeonVar_replyList[0]! as String, + message: pigeonVar_replyList[1] as String?, + details: pigeonVar_replyList[2], ); } else { return; @@ -152,30 +182,44 @@ class AndroidQuickActionsApi { } abstract class AndroidQuickActionsFlutterApi { - 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(AndroidQuickActionsFlutterApi? api, - {BinaryMessenger? binaryMessenger}) { + static void setUp( + AndroidQuickActionsFlutterApi? api, { + BinaryMessenger? binaryMessenger, + String messageChannelSuffix = '', + }) { + messageChannelSuffix = + messageChannelSuffix.isNotEmpty ? '.$messageChannelSuffix' : ''; { - final BasicMessageChannel channel = BasicMessageChannel( - 'dev.flutter.pigeon.quick_actions_android.AndroidQuickActionsFlutterApi.launchAction', - codec, + final BasicMessageChannel< + Object?> pigeonVar_channel = BasicMessageChannel< + Object?>( + 'dev.flutter.pigeon.quick_actions_android.AndroidQuickActionsFlutterApi.launchAction$messageChannelSuffix', + pigeonChannelCodec, binaryMessenger: binaryMessenger); if (api == null) { - channel.setMessageHandler(null); + pigeonVar_channel.setMessageHandler(null); } else { - channel.setMessageHandler((Object? message) async { + pigeonVar_channel.setMessageHandler((Object? message) async { assert(message != null, 'Argument for dev.flutter.pigeon.quick_actions_android.AndroidQuickActionsFlutterApi.launchAction was null.'); final List args = (message as List?)!; final String? arg_action = (args[0] as String?); assert(arg_action != null, 'Argument for dev.flutter.pigeon.quick_actions_android.AndroidQuickActionsFlutterApi.launchAction was null, expected non-null String.'); - api.launchAction(arg_action!); - return; + try { + api.launchAction(arg_action!); + return wrapResponse(empty: true); + } on PlatformException catch (e) { + return wrapResponse(error: e); + } catch (e) { + return wrapResponse( + error: PlatformException(code: 'error', message: e.toString())); + } }); } } diff --git a/packages/quick_actions/quick_actions_android/pubspec.yaml b/packages/quick_actions/quick_actions_android/pubspec.yaml index cf6cb0fbb5c..c5e8b167892 100644 --- a/packages/quick_actions/quick_actions_android/pubspec.yaml +++ b/packages/quick_actions/quick_actions_android/pubspec.yaml @@ -2,7 +2,7 @@ name: quick_actions_android description: An implementation for the Android platform of the Flutter `quick_actions` plugin. repository: https://github.com/flutter/packages/tree/main/packages/quick_actions/quick_actions_android issue_tracker: https://github.com/flutter/flutter/issues?q=is%3Aissue+is%3Aopen+label%3A%22p%3A+in_app_purchase%22 -version: 1.0.18 +version: 1.0.19 environment: sdk: ^3.5.0 @@ -27,7 +27,7 @@ dev_dependencies: sdk: flutter integration_test: sdk: flutter - pigeon: ^11.0.1 + pigeon: ^24.0.0 plugin_platform_interface: ^2.1.7 topics: diff --git a/packages/quick_actions/quick_actions_android/test/quick_actions_android_test.dart b/packages/quick_actions/quick_actions_android/test/quick_actions_android_test.dart index f0adcfe3a62..a0ba35568f4 100644 --- a/packages/quick_actions/quick_actions_android/test/quick_actions_android_test.dart +++ b/packages/quick_actions/quick_actions_android/test/quick_actions_android_test.dart @@ -4,6 +4,7 @@ import 'dart:async'; +import 'package:flutter/src/services/binary_messenger.dart'; import 'package:flutter_test/flutter_test.dart'; import 'package:quick_actions_android/quick_actions_android.dart'; import 'package:quick_actions_android/src/messages.g.dart'; @@ -104,4 +105,12 @@ class _FakeQuickActionsApi implements AndroidQuickActionsApi { items.add(shortcutItemMessageToShortcutItem(element!)); } } + + @override + // ignore: non_constant_identifier_names + BinaryMessenger? get pigeonVar_binaryMessenger => null; + + @override + // ignore: non_constant_identifier_names + String get pigeonVar_messageChannelSuffix => ''; }