diff --git a/.dart_tool/package_config.json b/.dart_tool/package_config.json index c21300c..5e278e8 100644 --- a/.dart_tool/package_config.json +++ b/.dart_tool/package_config.json @@ -1,18 +1,96 @@ { "configVersion": 2, "packages": [ + { + "name": "_fe_analyzer_shared", + "rootUri": "file:///Users/rodydavis/.pub-cache/hosted/pub.dev/_fe_analyzer_shared-92.0.0", + "packageUri": "lib/", + "languageVersion": "3.9" + }, + { + "name": "analyzer", + "rootUri": "file:///Users/rodydavis/.pub-cache/hosted/pub.dev/analyzer-9.0.0", + "packageUri": "lib/", + "languageVersion": "3.9" + }, + { + "name": "args", + "rootUri": "file:///Users/rodydavis/.pub-cache/hosted/pub.dev/args-2.7.0", + "packageUri": "lib/", + "languageVersion": "3.3" + }, + { + "name": "async", + "rootUri": "file:///Users/rodydavis/.pub-cache/hosted/pub.dev/async-2.13.0", + "packageUri": "lib/", + "languageVersion": "3.4" + }, + { + "name": "boolean_selector", + "rootUri": "file:///Users/rodydavis/.pub-cache/hosted/pub.dev/boolean_selector-2.1.2", + "packageUri": "lib/", + "languageVersion": "3.1" + }, + { + "name": "built_collection", + "rootUri": "file:///Users/rodydavis/.pub-cache/hosted/pub.dev/built_collection-5.1.1", + "packageUri": "lib/", + "languageVersion": "2.12" + }, + { + "name": "built_value", + "rootUri": "file:///Users/rodydavis/.pub-cache/hosted/pub.dev/built_value-8.12.2", + "packageUri": "lib/", + "languageVersion": "3.0" + }, { "name": "characters", "rootUri": "file:///Users/rodydavis/.pub-cache/hosted/pub.dev/characters-1.4.0", "packageUri": "lib/", "languageVersion": "3.4" }, + { + "name": "code_builder", + "rootUri": "file:///Users/rodydavis/.pub-cache/hosted/pub.dev/code_builder-4.11.1", + "packageUri": "lib/", + "languageVersion": "3.7" + }, { "name": "collection", "rootUri": "file:///Users/rodydavis/.pub-cache/hosted/pub.dev/collection-1.19.1", "packageUri": "lib/", "languageVersion": "3.4" }, + { + "name": "convert", + "rootUri": "file:///Users/rodydavis/.pub-cache/hosted/pub.dev/convert-3.1.2", + "packageUri": "lib/", + "languageVersion": "3.4" + }, + { + "name": "crypto", + "rootUri": "file:///Users/rodydavis/.pub-cache/hosted/pub.dev/crypto-3.0.7", + "packageUri": "lib/", + "languageVersion": "3.4" + }, + { + "name": "dart_style", + "rootUri": "file:///Users/rodydavis/.pub-cache/hosted/pub.dev/dart_style-3.1.3", + "packageUri": "lib/", + "languageVersion": "3.9" + }, + { + "name": "file", + "rootUri": "file:///Users/rodydavis/.pub-cache/hosted/pub.dev/file-7.0.1", + "packageUri": "lib/", + "languageVersion": "3.0" + }, + { + "name": "fixnum", + "rootUri": "file:///Users/rodydavis/.pub-cache/hosted/pub.dev/fixnum-1.1.1", + "packageUri": "lib/", + "languageVersion": "3.1" + }, { "name": "flutter", "rootUri": "file:///opt/homebrew/Caskroom/flutter/2.10.4/flutter/packages/flutter", @@ -25,12 +103,30 @@ "packageUri": "lib/", "languageVersion": "3.5" }, + { + "name": "glob", + "rootUri": "file:///Users/rodydavis/.pub-cache/hosted/pub.dev/glob-2.1.3", + "packageUri": "lib/", + "languageVersion": "3.3" + }, + { + "name": "graphs", + "rootUri": "file:///Users/rodydavis/.pub-cache/hosted/pub.dev/graphs-2.3.2", + "packageUri": "lib/", + "languageVersion": "3.4" + }, { "name": "lints", "rootUri": "file:///Users/rodydavis/.pub-cache/hosted/pub.dev/lints-5.1.1", "packageUri": "lib/", "languageVersion": "3.6" }, + { + "name": "matcher", + "rootUri": "file:///Users/rodydavis/.pub-cache/hosted/pub.dev/matcher-0.12.18", + "packageUri": "lib/", + "languageVersion": "3.7" + }, { "name": "material_color_utilities", "rootUri": "file:///Users/rodydavis/.pub-cache/hosted/pub.dev/material_color_utilities-0.11.1", @@ -43,18 +139,96 @@ "packageUri": "lib/", "languageVersion": "3.5" }, + { + "name": "package_config", + "rootUri": "file:///Users/rodydavis/.pub-cache/hosted/pub.dev/package_config-2.2.0", + "packageUri": "lib/", + "languageVersion": "3.4" + }, + { + "name": "path", + "rootUri": "file:///Users/rodydavis/.pub-cache/hosted/pub.dev/path-1.9.1", + "packageUri": "lib/", + "languageVersion": "3.4" + }, + { + "name": "pigeon", + "rootUri": "file:///Users/rodydavis/.pub-cache/hosted/pub.dev/pigeon-26.1.5", + "packageUri": "lib/", + "languageVersion": "3.9" + }, + { + "name": "pub_semver", + "rootUri": "file:///Users/rodydavis/.pub-cache/hosted/pub.dev/pub_semver-2.2.0", + "packageUri": "lib/", + "languageVersion": "3.4" + }, { "name": "sky_engine", "rootUri": "file:///opt/homebrew/Caskroom/flutter/2.10.4/flutter/bin/cache/pkg/sky_engine", "packageUri": "lib/", "languageVersion": "3.8" }, + { + "name": "source_span", + "rootUri": "file:///Users/rodydavis/.pub-cache/hosted/pub.dev/source_span-1.10.1", + "packageUri": "lib/", + "languageVersion": "3.1" + }, + { + "name": "stack_trace", + "rootUri": "file:///Users/rodydavis/.pub-cache/hosted/pub.dev/stack_trace-1.12.1", + "packageUri": "lib/", + "languageVersion": "3.4" + }, + { + "name": "stream_channel", + "rootUri": "file:///Users/rodydavis/.pub-cache/hosted/pub.dev/stream_channel-2.1.4", + "packageUri": "lib/", + "languageVersion": "3.3" + }, + { + "name": "string_scanner", + "rootUri": "file:///Users/rodydavis/.pub-cache/hosted/pub.dev/string_scanner-1.4.1", + "packageUri": "lib/", + "languageVersion": "3.1" + }, + { + "name": "term_glyph", + "rootUri": "file:///Users/rodydavis/.pub-cache/hosted/pub.dev/term_glyph-1.2.2", + "packageUri": "lib/", + "languageVersion": "3.1" + }, + { + "name": "test_api", + "rootUri": "file:///Users/rodydavis/.pub-cache/hosted/pub.dev/test_api-0.7.9", + "packageUri": "lib/", + "languageVersion": "3.7" + }, + { + "name": "typed_data", + "rootUri": "file:///Users/rodydavis/.pub-cache/hosted/pub.dev/typed_data-1.4.0", + "packageUri": "lib/", + "languageVersion": "3.5" + }, { "name": "vector_math", "rootUri": "file:///Users/rodydavis/.pub-cache/hosted/pub.dev/vector_math-2.2.0", "packageUri": "lib/", "languageVersion": "3.1" }, + { + "name": "watcher", + "rootUri": "file:///Users/rodydavis/.pub-cache/hosted/pub.dev/watcher-1.2.1", + "packageUri": "lib/", + "languageVersion": "3.4" + }, + { + "name": "yaml", + "rootUri": "file:///Users/rodydavis/.pub-cache/hosted/pub.dev/yaml-3.1.3", + "packageUri": "lib/", + "languageVersion": "3.4" + }, { "name": "packages_dart_rodydavis", "rootUri": "../", diff --git a/.dart_tool/package_graph.json b/.dart_tool/package_graph.json index 8377e38..bcb19d9 100644 --- a/.dart_tool/package_graph.json +++ b/.dart_tool/package_graph.json @@ -17,7 +17,24 @@ "flutter" ], "devDependencies": [ - "flutter_lints" + "flutter_lints", + "pigeon" + ] + }, + { + "name": "pigeon", + "version": "26.1.5", + "dependencies": [ + "analyzer", + "args", + "code_builder", + "collection", + "dart_style", + "graphs", + "meta", + "path", + "pub_semver", + "yaml" ] }, { @@ -39,6 +56,92 @@ "vector_math" ] }, + { + "name": "yaml", + "version": "3.1.3", + "dependencies": [ + "collection", + "source_span", + "string_scanner" + ] + }, + { + "name": "pub_semver", + "version": "2.2.0", + "dependencies": [ + "collection" + ] + }, + { + "name": "path", + "version": "1.9.1", + "dependencies": [] + }, + { + "name": "meta", + "version": "1.17.0", + "dependencies": [] + }, + { + "name": "graphs", + "version": "2.3.2", + "dependencies": [ + "collection" + ] + }, + { + "name": "dart_style", + "version": "3.1.3", + "dependencies": [ + "analyzer", + "args", + "collection", + "package_config", + "path", + "pub_semver", + "source_span", + "yaml" + ] + }, + { + "name": "collection", + "version": "1.19.1", + "dependencies": [] + }, + { + "name": "code_builder", + "version": "4.11.1", + "dependencies": [ + "built_collection", + "built_value", + "collection", + "matcher", + "meta" + ] + }, + { + "name": "args", + "version": "2.7.0", + "dependencies": [] + }, + { + "name": "analyzer", + "version": "9.0.0", + "dependencies": [ + "_fe_analyzer_shared", + "collection", + "convert", + "crypto", + "glob", + "meta", + "package_config", + "path", + "pub_semver", + "source_span", + "watcher", + "yaml" + ] + }, { "name": "lints", "version": "5.1.1", @@ -54,11 +157,6 @@ "version": "2.2.0", "dependencies": [] }, - { - "name": "meta", - "version": "1.17.0", - "dependencies": [] - }, { "name": "material_color_utilities", "version": "0.11.1", @@ -66,15 +164,169 @@ "collection" ] }, - { - "name": "collection", - "version": "1.19.1", - "dependencies": [] - }, { "name": "characters", "version": "1.4.0", "dependencies": [] + }, + { + "name": "string_scanner", + "version": "1.4.1", + "dependencies": [ + "source_span" + ] + }, + { + "name": "source_span", + "version": "1.10.1", + "dependencies": [ + "collection", + "path", + "term_glyph" + ] + }, + { + "name": "package_config", + "version": "2.2.0", + "dependencies": [ + "path" + ] + }, + { + "name": "matcher", + "version": "0.12.18", + "dependencies": [ + "async", + "meta", + "stack_trace", + "term_glyph", + "test_api" + ] + }, + { + "name": "built_value", + "version": "8.12.2", + "dependencies": [ + "built_collection", + "collection", + "fixnum", + "meta" + ] + }, + { + "name": "built_collection", + "version": "5.1.1", + "dependencies": [] + }, + { + "name": "watcher", + "version": "1.2.1", + "dependencies": [ + "async", + "path" + ] + }, + { + "name": "glob", + "version": "2.1.3", + "dependencies": [ + "async", + "collection", + "file", + "path", + "string_scanner" + ] + }, + { + "name": "crypto", + "version": "3.0.7", + "dependencies": [ + "typed_data" + ] + }, + { + "name": "convert", + "version": "3.1.2", + "dependencies": [ + "typed_data" + ] + }, + { + "name": "_fe_analyzer_shared", + "version": "92.0.0", + "dependencies": [ + "meta" + ] + }, + { + "name": "term_glyph", + "version": "1.2.2", + "dependencies": [] + }, + { + "name": "test_api", + "version": "0.7.9", + "dependencies": [ + "async", + "boolean_selector", + "collection", + "meta", + "source_span", + "stack_trace", + "stream_channel", + "string_scanner", + "term_glyph" + ] + }, + { + "name": "stack_trace", + "version": "1.12.1", + "dependencies": [ + "path" + ] + }, + { + "name": "async", + "version": "2.13.0", + "dependencies": [ + "collection", + "meta" + ] + }, + { + "name": "fixnum", + "version": "1.1.1", + "dependencies": [] + }, + { + "name": "file", + "version": "7.0.1", + "dependencies": [ + "meta", + "path" + ] + }, + { + "name": "typed_data", + "version": "1.4.0", + "dependencies": [ + "collection" + ] + }, + { + "name": "stream_channel", + "version": "2.1.4", + "dependencies": [ + "async" + ] + }, + { + "name": "boolean_selector", + "version": "2.1.2", + "dependencies": [ + "source_span", + "string_scanner" + ] } ], "configVersion": 1 diff --git a/packages/flutter_vibrate/android/src/main/java/flutter/plugins/vibrate/Messages.java b/packages/flutter_vibrate/android/src/main/java/flutter/plugins/vibrate/Messages.java new file mode 100644 index 0000000..785f159 --- /dev/null +++ b/packages/flutter_vibrate/android/src/main/java/flutter/plugins/vibrate/Messages.java @@ -0,0 +1,330 @@ +// Autogenerated from Pigeon (v26.1.5), do not edit directly. +// See also: https://pub.dev/packages/pigeon + +package flutter.plugins.vibrate; + +import android.util.Log; +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; +import io.flutter.plugin.common.BasicMessageChannel; +import io.flutter.plugin.common.BinaryMessenger; +import io.flutter.plugin.common.MessageCodec; +import io.flutter.plugin.common.StandardMessageCodec; +import java.io.ByteArrayOutputStream; +import java.nio.ByteBuffer; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collections; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Objects; + +/** Generated class from Pigeon. */ +@SuppressWarnings({"unused", "unchecked", "CodeBlock2Expr", "RedundantSuppression", "serial"}) +public class Messages { + + /** Error class for passing custom error details to Flutter via a thrown PlatformException. */ + public static class FlutterError extends RuntimeException { + + /** The error code. */ + public final String code; + + /** The error details. Must be a datatype supported by the api codec. */ + public final Object details; + + public FlutterError(@NonNull String code, @Nullable String message, @Nullable Object details) + { + super(message); + this.code = code; + this.details = details; + } + } + + @NonNull + protected static ArrayList wrapError(@NonNull Throwable exception) { + ArrayList errorList = new ArrayList<>(3); + if (exception instanceof FlutterError) { + FlutterError error = (FlutterError) exception; + errorList.add(error.code); + errorList.add(error.getMessage()); + errorList.add(error.details); + } else { + errorList.add(exception.toString()); + errorList.add(exception.getClass().getSimpleName()); + errorList.add( + "Cause: " + exception.getCause() + ", Stacktrace: " + Log.getStackTraceString(exception)); + } + return errorList; + } + + private static class PigeonCodec extends StandardMessageCodec { + public static final PigeonCodec INSTANCE = new PigeonCodec(); + + private PigeonCodec() {} + + @Override + protected Object readValueOfType(byte type, @NonNull ByteBuffer buffer) { + switch (type) { + default: + return super.readValueOfType(type, buffer); + } + } + + @Override + protected void writeValue(@NonNull ByteArrayOutputStream stream, Object value) { + { + super.writeValue(stream, value); + } + } + } + + /** Generated interface from Pigeon that represents a handler of messages from Flutter. */ + public interface VibrateApi { + + @NonNull + Boolean canVibrate(); + + void vibrate(@NonNull Long duration); + + void impact(); + + void selection(); + + void success(); + + void warning(); + + void error(); + + void heavy(); + + void medium(); + + void light(); + + /** The codec used by VibrateApi. */ + static @NonNull MessageCodec getCodec() { + return PigeonCodec.INSTANCE; + } + /**Sets up an instance of `VibrateApi` to handle messages through the `binaryMessenger`. */ + static void setUp(@NonNull BinaryMessenger binaryMessenger, @Nullable VibrateApi api) { + setUp(binaryMessenger, "", api); + } + static void setUp(@NonNull BinaryMessenger binaryMessenger, @NonNull String messageChannelSuffix, @Nullable VibrateApi api) { + messageChannelSuffix = messageChannelSuffix.isEmpty() ? "" : "." + messageChannelSuffix; + { + BasicMessageChannel channel = + new BasicMessageChannel<>( + binaryMessenger, "dev.flutter.pigeon.flutter_vibrate.VibrateApi.canVibrate" + messageChannelSuffix, getCodec()); + if (api != null) { + channel.setMessageHandler( + (message, reply) -> { + ArrayList wrapped = new ArrayList<>(); + try { + Boolean output = api.canVibrate(); + wrapped.add(0, output); + } + catch (Throwable exception) { + wrapped = wrapError(exception); + } + reply.reply(wrapped); + }); + } else { + channel.setMessageHandler(null); + } + } + { + BasicMessageChannel channel = + new BasicMessageChannel<>( + binaryMessenger, "dev.flutter.pigeon.flutter_vibrate.VibrateApi.vibrate" + messageChannelSuffix, getCodec()); + if (api != null) { + channel.setMessageHandler( + (message, reply) -> { + ArrayList wrapped = new ArrayList<>(); + ArrayList args = (ArrayList) message; + Long durationArg = (Long) args.get(0); + try { + api.vibrate(durationArg); + wrapped.add(0, null); + } + catch (Throwable exception) { + wrapped = wrapError(exception); + } + reply.reply(wrapped); + }); + } else { + channel.setMessageHandler(null); + } + } + { + BasicMessageChannel channel = + new BasicMessageChannel<>( + binaryMessenger, "dev.flutter.pigeon.flutter_vibrate.VibrateApi.impact" + messageChannelSuffix, getCodec()); + if (api != null) { + channel.setMessageHandler( + (message, reply) -> { + ArrayList wrapped = new ArrayList<>(); + try { + api.impact(); + wrapped.add(0, null); + } + catch (Throwable exception) { + wrapped = wrapError(exception); + } + reply.reply(wrapped); + }); + } else { + channel.setMessageHandler(null); + } + } + { + BasicMessageChannel channel = + new BasicMessageChannel<>( + binaryMessenger, "dev.flutter.pigeon.flutter_vibrate.VibrateApi.selection" + messageChannelSuffix, getCodec()); + if (api != null) { + channel.setMessageHandler( + (message, reply) -> { + ArrayList wrapped = new ArrayList<>(); + try { + api.selection(); + wrapped.add(0, null); + } + catch (Throwable exception) { + wrapped = wrapError(exception); + } + reply.reply(wrapped); + }); + } else { + channel.setMessageHandler(null); + } + } + { + BasicMessageChannel channel = + new BasicMessageChannel<>( + binaryMessenger, "dev.flutter.pigeon.flutter_vibrate.VibrateApi.success" + messageChannelSuffix, getCodec()); + if (api != null) { + channel.setMessageHandler( + (message, reply) -> { + ArrayList wrapped = new ArrayList<>(); + try { + api.success(); + wrapped.add(0, null); + } + catch (Throwable exception) { + wrapped = wrapError(exception); + } + reply.reply(wrapped); + }); + } else { + channel.setMessageHandler(null); + } + } + { + BasicMessageChannel channel = + new BasicMessageChannel<>( + binaryMessenger, "dev.flutter.pigeon.flutter_vibrate.VibrateApi.warning" + messageChannelSuffix, getCodec()); + if (api != null) { + channel.setMessageHandler( + (message, reply) -> { + ArrayList wrapped = new ArrayList<>(); + try { + api.warning(); + wrapped.add(0, null); + } + catch (Throwable exception) { + wrapped = wrapError(exception); + } + reply.reply(wrapped); + }); + } else { + channel.setMessageHandler(null); + } + } + { + BasicMessageChannel channel = + new BasicMessageChannel<>( + binaryMessenger, "dev.flutter.pigeon.flutter_vibrate.VibrateApi.error" + messageChannelSuffix, getCodec()); + if (api != null) { + channel.setMessageHandler( + (message, reply) -> { + ArrayList wrapped = new ArrayList<>(); + try { + api.error(); + wrapped.add(0, null); + } + catch (Throwable exception) { + wrapped = wrapError(exception); + } + reply.reply(wrapped); + }); + } else { + channel.setMessageHandler(null); + } + } + { + BasicMessageChannel channel = + new BasicMessageChannel<>( + binaryMessenger, "dev.flutter.pigeon.flutter_vibrate.VibrateApi.heavy" + messageChannelSuffix, getCodec()); + if (api != null) { + channel.setMessageHandler( + (message, reply) -> { + ArrayList wrapped = new ArrayList<>(); + try { + api.heavy(); + wrapped.add(0, null); + } + catch (Throwable exception) { + wrapped = wrapError(exception); + } + reply.reply(wrapped); + }); + } else { + channel.setMessageHandler(null); + } + } + { + BasicMessageChannel channel = + new BasicMessageChannel<>( + binaryMessenger, "dev.flutter.pigeon.flutter_vibrate.VibrateApi.medium" + messageChannelSuffix, getCodec()); + if (api != null) { + channel.setMessageHandler( + (message, reply) -> { + ArrayList wrapped = new ArrayList<>(); + try { + api.medium(); + wrapped.add(0, null); + } + catch (Throwable exception) { + wrapped = wrapError(exception); + } + reply.reply(wrapped); + }); + } else { + channel.setMessageHandler(null); + } + } + { + BasicMessageChannel channel = + new BasicMessageChannel<>( + binaryMessenger, "dev.flutter.pigeon.flutter_vibrate.VibrateApi.light" + messageChannelSuffix, getCodec()); + if (api != null) { + channel.setMessageHandler( + (message, reply) -> { + ArrayList wrapped = new ArrayList<>(); + try { + api.light(); + wrapped.add(0, null); + } + catch (Throwable exception) { + wrapped = wrapError(exception); + } + reply.reply(wrapped); + }); + } else { + channel.setMessageHandler(null); + } + } + } + } +} diff --git a/packages/flutter_vibrate/android/src/main/java/flutter/plugins/vibrate/VibrateMethodCallHandler.java b/packages/flutter_vibrate/android/src/main/java/flutter/plugins/vibrate/VibrateMethodCallHandler.java index 4743382..e777ee4 100644 --- a/packages/flutter_vibrate/android/src/main/java/flutter/plugins/vibrate/VibrateMethodCallHandler.java +++ b/packages/flutter_vibrate/android/src/main/java/flutter/plugins/vibrate/VibrateMethodCallHandler.java @@ -5,10 +5,7 @@ import android.os.Vibrator; import android.os.VibrationEffect; import android.view.HapticFeedbackConstants; -import io.flutter.plugin.common.MethodCall; -import io.flutter.plugin.common.MethodChannel; - -class VibrateMethodCallHandler implements MethodChannel.MethodCallHandler { +public class VibrateMethodCallHandler implements Messages.VibrateApi { private final Vibrator vibrator; private final boolean hasVibrator; private final boolean legacyVibrator; @@ -26,88 +23,77 @@ class VibrateMethodCallHandler implements MethodChannel.MethodCallHandler { } @SuppressWarnings("deprecation") - private void vibrate(int duration) { + @Override + public void vibrate(Long duration) { if (hasVibrator) { if (legacyVibrator) { - vibrator.vibrate(duration); + vibrator.vibrate(duration.intValue()); // Deprecated method takes int } else { vibrator.vibrate(VibrationEffect.createOneShot(duration, VibrationEffect.DEFAULT_AMPLITUDE)); } } } + @Override + public Boolean canVibrate() { + return hasVibrator; + } + private void feedback(int feedbackConstant) { if (activity != null) { activity.getWindow().getDecorView().performHapticFeedback(feedbackConstant); - } else { - // Fallback to vibrator if no activity/view (though unlikely in a running app) - // or just ignore if strictly view-based. - // For now, let's fallback to the old vibration logic for consistency if View is not ready, - // although the user specifically wants View feedback. - // Actually, the old logic was calling vibrate(int) for specific types. - // We can map some to vibrate(int) if really needed, but let's assume Activity is there. } } @Override - public void onMethodCall(MethodCall call, MethodChannel.Result result) { - switch (call.method) { - case "canVibrate": - result.success(hasVibrator); - break; - case "vibrate": - final int duration = call.argument("duration"); - vibrate(d); - result.success(null); - break; - case "impact": - feedback(HapticFeedbackConstants.VIRTUAL_KEY); - result.success(null); - break; - case "selection": - feedback(HapticFeedbackConstants.KEYBOARD_TAP); - result.success(null); - break; - case "success": - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) { - feedback(HapticFeedbackConstants.CONFIRM); - } else { - vibrate(50); - } - result.success(null); - break; - case "warning": - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) { - feedback(HapticFeedbackConstants.REJECT); - } else { - vibrate(250); - } - result.success(null); - break; - case "error": - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) { - feedback(HapticFeedbackConstants.REJECT); - } else { - vibrate(500); - } - result.success(null); - break; - case "heavy": - feedback(HapticFeedbackConstants.LONG_PRESS); - result.success(null); - break; - case "medium": - feedback(HapticFeedbackConstants.VIRTUAL_KEY); - result.success(null); - break; - case "light": - feedback(HapticFeedbackConstants.CLOCK_TICK); - result.success(null); - break; - default: - result.notImplemented(); - break; - } + public void impact() { + feedback(HapticFeedbackConstants.VIRTUAL_KEY); + } + @Override + public void selection() { + feedback(HapticFeedbackConstants.KEYBOARD_TAP); + } + + @Override + public void success() { + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) { + feedback(HapticFeedbackConstants.CONFIRM); + } else { + vibrate(50L); + } + } + + @Override + public void warning() { + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) { + feedback(HapticFeedbackConstants.REJECT); + } else { + vibrate(250L); + } + } + + @Override + public void error() { + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) { + feedback(HapticFeedbackConstants.REJECT); + } else { + vibrate(500L); + } + } + + @Override + public void heavy() { + feedback(HapticFeedbackConstants.LONG_PRESS); + } + + @Override + public void medium() { + feedback(HapticFeedbackConstants.VIRTUAL_KEY); + } + + @Override + public void light() { + feedback(HapticFeedbackConstants.CLOCK_TICK); } } diff --git a/packages/flutter_vibrate/android/src/main/java/flutter/plugins/vibrate/VibratePlugin.java b/packages/flutter_vibrate/android/src/main/java/flutter/plugins/vibrate/VibratePlugin.java index 5dc2536..57ff87f 100644 --- a/packages/flutter_vibrate/android/src/main/java/flutter/plugins/vibrate/VibratePlugin.java +++ b/packages/flutter_vibrate/android/src/main/java/flutter/plugins/vibrate/VibratePlugin.java @@ -8,7 +8,6 @@ import io.flutter.plugin.common.BinaryMessenger; import io.flutter.plugin.common.MethodChannel; public class VibratePlugin implements FlutterPlugin, io.flutter.embedding.engine.plugins.activity.ActivityAware { - private MethodChannel methodChannel; private VibrateMethodCallHandler methodCallHandler; @Override @@ -18,14 +17,12 @@ public class VibratePlugin implements FlutterPlugin, io.flutter.embedding.engine final Vibrator vibrator = (Vibrator) context.getSystemService(Context.VIBRATOR_SERVICE); methodCallHandler = new VibrateMethodCallHandler(vibrator); - this.methodChannel = new MethodChannel(messenger, "vibrate"); - this.methodChannel.setMethodCallHandler(methodCallHandler); + Messages.VibrateApi.setUp(messenger, methodCallHandler); } @Override public void onDetachedFromEngine(FlutterPluginBinding binding) { - this.methodChannel.setMethodCallHandler(null); - this.methodChannel = null; + Messages.VibrateApi.setUp(binding.getBinaryMessenger(), null); this.methodCallHandler = null; } diff --git a/packages/flutter_vibrate/android/src/main/kotlin/flutter/plugins/vibrate/Messages.g.kt b/packages/flutter_vibrate/android/src/main/kotlin/flutter/plugins/vibrate/Messages.g.kt new file mode 100644 index 0000000..36dea7a --- /dev/null +++ b/packages/flutter_vibrate/android/src/main/kotlin/flutter/plugins/vibrate/Messages.g.kt @@ -0,0 +1,244 @@ +// Autogenerated from Pigeon (v26.1.5), do not edit directly. +// See also: https://pub.dev/packages/pigeon +@file:Suppress("UNCHECKED_CAST", "ArrayInDataClass") + +package flutter.plugins.vibrate + +import android.util.Log +import io.flutter.plugin.common.BasicMessageChannel +import io.flutter.plugin.common.BinaryMessenger +import io.flutter.plugin.common.EventChannel +import io.flutter.plugin.common.MessageCodec +import io.flutter.plugin.common.StandardMethodCodec +import io.flutter.plugin.common.StandardMessageCodec +import java.io.ByteArrayOutputStream +import java.nio.ByteBuffer +private object MessagesPigeonUtils { + + fun wrapResult(result: Any?): List { + return listOf(result) + } + + fun wrapError(exception: Throwable): List { + return if (exception is FlutterError) { + listOf( + exception.code, + exception.message, + exception.details + ) + } else { + listOf( + exception.javaClass.simpleName, + exception.toString(), + "Cause: " + exception.cause + ", Stacktrace: " + Log.getStackTraceString(exception) + ) + } + } +} + +/** + * Error class for passing custom error details to Flutter via a thrown PlatformException. + * @property code The error code. + * @property message The error message. + * @property details The error details. Must be a datatype supported by the api codec. + */ +class FlutterError ( + val code: String, + override val message: String? = null, + val details: Any? = null +) : Throwable() +private open class MessagesPigeonCodec : StandardMessageCodec() { + override fun readValueOfType(type: Byte, buffer: ByteBuffer): Any? { + return super.readValueOfType(type, buffer) + } + override fun writeValue(stream: ByteArrayOutputStream, value: Any?) { + super.writeValue(stream, value) + } +} + +/** Generated interface from Pigeon that represents a handler of messages from Flutter. */ +interface VibrateApi { + fun canVibrate(): Boolean + fun vibrate(duration: Long) + fun impact() + fun selection() + fun success() + fun warning() + fun error() + fun heavy() + fun medium() + fun light() + + companion object { + /** The codec used by VibrateApi. */ + val codec: MessageCodec by lazy { + MessagesPigeonCodec() + } + /** Sets up an instance of `VibrateApi` to handle messages through the `binaryMessenger`. */ + @JvmOverloads + fun setUp(binaryMessenger: BinaryMessenger, api: VibrateApi?, messageChannelSuffix: String = "") { + val separatedMessageChannelSuffix = if (messageChannelSuffix.isNotEmpty()) ".$messageChannelSuffix" else "" + run { + val channel = BasicMessageChannel(binaryMessenger, "dev.flutter.pigeon.flutter_vibrate.VibrateApi.canVibrate$separatedMessageChannelSuffix", codec) + if (api != null) { + channel.setMessageHandler { _, reply -> + val wrapped: List = try { + listOf(api.canVibrate()) + } catch (exception: Throwable) { + MessagesPigeonUtils.wrapError(exception) + } + reply.reply(wrapped) + } + } else { + channel.setMessageHandler(null) + } + } + run { + val channel = BasicMessageChannel(binaryMessenger, "dev.flutter.pigeon.flutter_vibrate.VibrateApi.vibrate$separatedMessageChannelSuffix", codec) + if (api != null) { + channel.setMessageHandler { message, reply -> + val args = message as List + val durationArg = args[0] as Long + val wrapped: List = try { + api.vibrate(durationArg) + listOf(null) + } catch (exception: Throwable) { + MessagesPigeonUtils.wrapError(exception) + } + reply.reply(wrapped) + } + } else { + channel.setMessageHandler(null) + } + } + run { + val channel = BasicMessageChannel(binaryMessenger, "dev.flutter.pigeon.flutter_vibrate.VibrateApi.impact$separatedMessageChannelSuffix", codec) + if (api != null) { + channel.setMessageHandler { _, reply -> + val wrapped: List = try { + api.impact() + listOf(null) + } catch (exception: Throwable) { + MessagesPigeonUtils.wrapError(exception) + } + reply.reply(wrapped) + } + } else { + channel.setMessageHandler(null) + } + } + run { + val channel = BasicMessageChannel(binaryMessenger, "dev.flutter.pigeon.flutter_vibrate.VibrateApi.selection$separatedMessageChannelSuffix", codec) + if (api != null) { + channel.setMessageHandler { _, reply -> + val wrapped: List = try { + api.selection() + listOf(null) + } catch (exception: Throwable) { + MessagesPigeonUtils.wrapError(exception) + } + reply.reply(wrapped) + } + } else { + channel.setMessageHandler(null) + } + } + run { + val channel = BasicMessageChannel(binaryMessenger, "dev.flutter.pigeon.flutter_vibrate.VibrateApi.success$separatedMessageChannelSuffix", codec) + if (api != null) { + channel.setMessageHandler { _, reply -> + val wrapped: List = try { + api.success() + listOf(null) + } catch (exception: Throwable) { + MessagesPigeonUtils.wrapError(exception) + } + reply.reply(wrapped) + } + } else { + channel.setMessageHandler(null) + } + } + run { + val channel = BasicMessageChannel(binaryMessenger, "dev.flutter.pigeon.flutter_vibrate.VibrateApi.warning$separatedMessageChannelSuffix", codec) + if (api != null) { + channel.setMessageHandler { _, reply -> + val wrapped: List = try { + api.warning() + listOf(null) + } catch (exception: Throwable) { + MessagesPigeonUtils.wrapError(exception) + } + reply.reply(wrapped) + } + } else { + channel.setMessageHandler(null) + } + } + run { + val channel = BasicMessageChannel(binaryMessenger, "dev.flutter.pigeon.flutter_vibrate.VibrateApi.error$separatedMessageChannelSuffix", codec) + if (api != null) { + channel.setMessageHandler { _, reply -> + val wrapped: List = try { + api.error() + listOf(null) + } catch (exception: Throwable) { + MessagesPigeonUtils.wrapError(exception) + } + reply.reply(wrapped) + } + } else { + channel.setMessageHandler(null) + } + } + run { + val channel = BasicMessageChannel(binaryMessenger, "dev.flutter.pigeon.flutter_vibrate.VibrateApi.heavy$separatedMessageChannelSuffix", codec) + if (api != null) { + channel.setMessageHandler { _, reply -> + val wrapped: List = try { + api.heavy() + listOf(null) + } catch (exception: Throwable) { + MessagesPigeonUtils.wrapError(exception) + } + reply.reply(wrapped) + } + } else { + channel.setMessageHandler(null) + } + } + run { + val channel = BasicMessageChannel(binaryMessenger, "dev.flutter.pigeon.flutter_vibrate.VibrateApi.medium$separatedMessageChannelSuffix", codec) + if (api != null) { + channel.setMessageHandler { _, reply -> + val wrapped: List = try { + api.medium() + listOf(null) + } catch (exception: Throwable) { + MessagesPigeonUtils.wrapError(exception) + } + reply.reply(wrapped) + } + } else { + channel.setMessageHandler(null) + } + } + run { + val channel = BasicMessageChannel(binaryMessenger, "dev.flutter.pigeon.flutter_vibrate.VibrateApi.light$separatedMessageChannelSuffix", codec) + if (api != null) { + channel.setMessageHandler { _, reply -> + val wrapped: List = try { + api.light() + listOf(null) + } catch (exception: Throwable) { + MessagesPigeonUtils.wrapError(exception) + } + reply.reply(wrapped) + } + } else { + channel.setMessageHandler(null) + } + } + } + } +} diff --git a/packages/flutter_vibrate/example/ios/Podfile.lock b/packages/flutter_vibrate/example/ios/Podfile.lock new file mode 100644 index 0000000..f1baefb --- /dev/null +++ b/packages/flutter_vibrate/example/ios/Podfile.lock @@ -0,0 +1,22 @@ +PODS: + - Flutter (1.0.0) + - flutter_vibrate (0.0.1): + - Flutter + +DEPENDENCIES: + - Flutter (from `Flutter`) + - flutter_vibrate (from `.symlinks/plugins/flutter_vibrate/ios`) + +EXTERNAL SOURCES: + Flutter: + :path: Flutter + flutter_vibrate: + :path: ".symlinks/plugins/flutter_vibrate/ios" + +SPEC CHECKSUMS: + Flutter: cabc95a1d2626b1b06e7179b784ebcf0c0cde467 + flutter_vibrate: 207bbbeb62dd5638b479846c8e46168d7229f14a + +PODFILE CHECKSUM: 3c63482e143d1b91d2d2560aee9fb04ecc74ac7e + +COCOAPODS: 1.16.2 diff --git a/packages/flutter_vibrate/example/ios/Runner.xcodeproj/project.pbxproj b/packages/flutter_vibrate/example/ios/Runner.xcodeproj/project.pbxproj index 90722f1..9052e80 100644 --- a/packages/flutter_vibrate/example/ios/Runner.xcodeproj/project.pbxproj +++ b/packages/flutter_vibrate/example/ios/Runner.xcodeproj/project.pbxproj @@ -10,10 +10,12 @@ 1498D2341E8E89220040F4C2 /* GeneratedPluginRegistrant.m in Sources */ = {isa = PBXBuildFile; fileRef = 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */; }; 331C808B294A63AB00263BE5 /* RunnerTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 331C807B294A618700263BE5 /* RunnerTests.swift */; }; 3B3967161E833CAA004F5970 /* AppFrameworkInfo.plist in Resources */ = {isa = PBXBuildFile; fileRef = 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */; }; + 6348BF6B581A40ABDE55F40C /* Pods_Runner.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 95DBC198F30E9B09BA296CBC /* Pods_Runner.framework */; }; 74858FAF1ED2DC5600515810 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 74858FAE1ED2DC5600515810 /* AppDelegate.swift */; }; 97C146FC1CF9000F007C117D /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FA1CF9000F007C117D /* Main.storyboard */; }; 97C146FE1CF9000F007C117D /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FD1CF9000F007C117D /* Assets.xcassets */; }; 97C147011CF9000F007C117D /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */; }; + DE826AAA24A8EE8E713185AC /* Pods_RunnerTests.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 3DB8CA973040D417DE6FDEE2 /* Pods_RunnerTests.framework */; }; /* End PBXBuildFile section */ /* Begin PBXContainerItemProxy section */ @@ -42,12 +44,18 @@ /* Begin PBXFileReference section */ 1498D2321E8E86230040F4C2 /* GeneratedPluginRegistrant.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = GeneratedPluginRegistrant.h; sourceTree = ""; }; 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GeneratedPluginRegistrant.m; sourceTree = ""; }; + 242ED6E63FC99E037173DF0E /* Pods-Runner.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.profile.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.profile.xcconfig"; sourceTree = ""; }; + 2602CE9E7407245235BC1FB6 /* Pods-RunnerTests.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.profile.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.profile.xcconfig"; sourceTree = ""; }; 331C807B294A618700263BE5 /* RunnerTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RunnerTests.swift; sourceTree = ""; }; 331C8081294A63A400263BE5 /* RunnerTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = RunnerTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = AppFrameworkInfo.plist; path = Flutter/AppFrameworkInfo.plist; sourceTree = ""; }; + 3DB8CA973040D417DE6FDEE2 /* Pods_RunnerTests.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_RunnerTests.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + 702D47985890C14AEB2ED99A /* Pods-Runner.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.release.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig"; sourceTree = ""; }; 74858FAD1ED2DC5600515810 /* Runner-Bridging-Header.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "Runner-Bridging-Header.h"; sourceTree = ""; }; 74858FAE1ED2DC5600515810 /* AppDelegate.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; 7AFA3C8E1D35360C0083082E /* Release.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; name = Release.xcconfig; path = Flutter/Release.xcconfig; sourceTree = ""; }; + 8943475507912D4E61FC2A7B /* Pods-RunnerTests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.release.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.release.xcconfig"; sourceTree = ""; }; + 95DBC198F30E9B09BA296CBC /* Pods_Runner.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Runner.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 9740EEB21CF90195004384FC /* Debug.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = Debug.xcconfig; path = Flutter/Debug.xcconfig; sourceTree = ""; }; 9740EEB31CF90195004384FC /* Generated.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = Generated.xcconfig; path = Flutter/Generated.xcconfig; sourceTree = ""; }; 97C146EE1CF9000F007C117D /* Runner.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = Runner.app; sourceTree = BUILT_PRODUCTS_DIR; }; @@ -55,13 +63,24 @@ 97C146FD1CF9000F007C117D /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; 97C147001CF9000F007C117D /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = ""; }; 97C147021CF9000F007C117D /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; + C71D38146FA248107005AC30 /* Pods-Runner.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.debug.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig"; sourceTree = ""; }; + E8BF3F93E3D7F66D3C022697 /* Pods-RunnerTests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.debug.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.debug.xcconfig"; sourceTree = ""; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ + 7FD5F2B3D8C3AEDEDF139E56 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + DE826AAA24A8EE8E713185AC /* Pods_RunnerTests.framework in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; 97C146EB1CF9000F007C117D /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( + 6348BF6B581A40ABDE55F40C /* Pods_Runner.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -76,6 +95,20 @@ path = RunnerTests; sourceTree = ""; }; + 414C54571D55CE6D089CBD0C /* Pods */ = { + isa = PBXGroup; + children = ( + C71D38146FA248107005AC30 /* Pods-Runner.debug.xcconfig */, + 702D47985890C14AEB2ED99A /* Pods-Runner.release.xcconfig */, + 242ED6E63FC99E037173DF0E /* Pods-Runner.profile.xcconfig */, + E8BF3F93E3D7F66D3C022697 /* Pods-RunnerTests.debug.xcconfig */, + 8943475507912D4E61FC2A7B /* Pods-RunnerTests.release.xcconfig */, + 2602CE9E7407245235BC1FB6 /* Pods-RunnerTests.profile.xcconfig */, + ); + name = Pods; + path = Pods; + sourceTree = ""; + }; 9740EEB11CF90186004384FC /* Flutter */ = { isa = PBXGroup; children = ( @@ -94,6 +127,8 @@ 97C146F01CF9000F007C117D /* Runner */, 97C146EF1CF9000F007C117D /* Products */, 331C8082294A63A400263BE5 /* RunnerTests */, + 414C54571D55CE6D089CBD0C /* Pods */, + FC7EA846FA2678DB67E9416B /* Frameworks */, ); sourceTree = ""; }; @@ -121,6 +156,15 @@ path = Runner; sourceTree = ""; }; + FC7EA846FA2678DB67E9416B /* Frameworks */ = { + isa = PBXGroup; + children = ( + 95DBC198F30E9B09BA296CBC /* Pods_Runner.framework */, + 3DB8CA973040D417DE6FDEE2 /* Pods_RunnerTests.framework */, + ); + name = Frameworks; + sourceTree = ""; + }; /* End PBXGroup section */ /* Begin PBXNativeTarget section */ @@ -128,8 +172,10 @@ isa = PBXNativeTarget; buildConfigurationList = 331C8087294A63A400263BE5 /* Build configuration list for PBXNativeTarget "RunnerTests" */; buildPhases = ( + BD97A1FBC6041F379666F751 /* [CP] Check Pods Manifest.lock */, 331C807D294A63A400263BE5 /* Sources */, 331C807F294A63A400263BE5 /* Resources */, + 7FD5F2B3D8C3AEDEDF139E56 /* Frameworks */, ); buildRules = ( ); @@ -145,12 +191,14 @@ isa = PBXNativeTarget; buildConfigurationList = 97C147051CF9000F007C117D /* Build configuration list for PBXNativeTarget "Runner" */; buildPhases = ( + 38BE058BD373AE4A582D9BAC /* [CP] Check Pods Manifest.lock */, 9740EEB61CF901F6004384FC /* Run Script */, 97C146EA1CF9000F007C117D /* Sources */, 97C146EB1CF9000F007C117D /* Frameworks */, 97C146EC1CF9000F007C117D /* Resources */, 9705A1C41CF9048500538489 /* Embed Frameworks */, 3B06AD1E1E4923F5004D2608 /* Thin Binary */, + 8C1966B24B8E55A701A50160 /* [CP] Embed Pods Frameworks */, ); buildRules = ( ); @@ -222,6 +270,28 @@ /* End PBXResourcesBuildPhase section */ /* Begin PBXShellScriptBuildPhase section */ + 38BE058BD373AE4A582D9BAC /* [CP] Check Pods Manifest.lock */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputFileListPaths = ( + ); + inputPaths = ( + "${PODS_PODFILE_DIR_PATH}/Podfile.lock", + "${PODS_ROOT}/Manifest.lock", + ); + name = "[CP] Check Pods Manifest.lock"; + outputFileListPaths = ( + ); + outputPaths = ( + "$(DERIVED_FILE_DIR)/Pods-Runner-checkManifestLockResult.txt", + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; + showEnvVarsInLog = 0; + }; 3B06AD1E1E4923F5004D2608 /* Thin Binary */ = { isa = PBXShellScriptBuildPhase; alwaysOutOfDate = 1; @@ -238,6 +308,23 @@ shellPath = /bin/sh; shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" embed_and_thin"; }; + 8C1966B24B8E55A701A50160 /* [CP] Embed Pods Frameworks */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputFileListPaths = ( + "${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks-${CONFIGURATION}-input-files.xcfilelist", + ); + name = "[CP] Embed Pods Frameworks"; + outputFileListPaths = ( + "${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks-${CONFIGURATION}-output-files.xcfilelist", + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks.sh\"\n"; + showEnvVarsInLog = 0; + }; 9740EEB61CF901F6004384FC /* Run Script */ = { isa = PBXShellScriptBuildPhase; alwaysOutOfDate = 1; @@ -253,6 +340,28 @@ shellPath = /bin/sh; shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" build"; }; + BD97A1FBC6041F379666F751 /* [CP] Check Pods Manifest.lock */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputFileListPaths = ( + ); + inputPaths = ( + "${PODS_PODFILE_DIR_PATH}/Podfile.lock", + "${PODS_ROOT}/Manifest.lock", + ); + name = "[CP] Check Pods Manifest.lock"; + outputFileListPaths = ( + ); + outputPaths = ( + "$(DERIVED_FILE_DIR)/Pods-RunnerTests-checkManifestLockResult.txt", + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; + showEnvVarsInLog = 0; + }; /* End PBXShellScriptBuildPhase section */ /* Begin PBXSourcesBuildPhase section */ @@ -379,6 +488,7 @@ }; 331C8088294A63A400263BE5 /* Debug */ = { isa = XCBuildConfiguration; + baseConfigurationReference = E8BF3F93E3D7F66D3C022697 /* Pods-RunnerTests.debug.xcconfig */; buildSettings = { BUNDLE_LOADER = "$(TEST_HOST)"; CODE_SIGN_STYLE = Automatic; @@ -396,6 +506,7 @@ }; 331C8089294A63A400263BE5 /* Release */ = { isa = XCBuildConfiguration; + baseConfigurationReference = 8943475507912D4E61FC2A7B /* Pods-RunnerTests.release.xcconfig */; buildSettings = { BUNDLE_LOADER = "$(TEST_HOST)"; CODE_SIGN_STYLE = Automatic; @@ -411,6 +522,7 @@ }; 331C808A294A63A400263BE5 /* Profile */ = { isa = XCBuildConfiguration; + baseConfigurationReference = 2602CE9E7407245235BC1FB6 /* Pods-RunnerTests.profile.xcconfig */; buildSettings = { BUNDLE_LOADER = "$(TEST_HOST)"; CODE_SIGN_STYLE = Automatic; diff --git a/packages/flutter_vibrate/example/ios/Runner.xcworkspace/contents.xcworkspacedata b/packages/flutter_vibrate/example/ios/Runner.xcworkspace/contents.xcworkspacedata index 1d526a1..21a3cc1 100644 --- a/packages/flutter_vibrate/example/ios/Runner.xcworkspace/contents.xcworkspacedata +++ b/packages/flutter_vibrate/example/ios/Runner.xcworkspace/contents.xcworkspacedata @@ -4,4 +4,7 @@ + + diff --git a/packages/flutter_vibrate/example/lib/main.dart b/packages/flutter_vibrate/example/lib/main.dart index fcb25a8..7d1a463 100644 --- a/packages/flutter_vibrate/example/lib/main.dart +++ b/packages/flutter_vibrate/example/lib/main.dart @@ -195,8 +195,8 @@ class _DeviceabilityHeader extends StatelessWidget { : 'This device does not support vibration.', style: Theme.of(context).textTheme.bodyMedium?.copyWith( color: canVibrate - ? colorScheme.onPrimaryContainer.withOpacity(0.8) - : colorScheme.onErrorContainer.withOpacity(0.8), + ? colorScheme.onPrimaryContainer.withValues(alpha: 0.8) + : colorScheme.onErrorContainer.withValues(alpha: 0.8), ), ), ], @@ -352,8 +352,8 @@ class _FeedbackTileState extends State<_FeedbackTile> Transform.scale(scale: _scaleAnimation.value, child: child), child: Material( color: - widget.item.color?.withOpacity(0.15) ?? - colorScheme.secondaryContainer.withOpacity(0.4), + widget.item.color?.withValues(alpha: 0.15) ?? + colorScheme.secondaryContainer.withValues(alpha: 0.4), borderRadius: BorderRadius.circular(16), child: InkWell( borderRadius: BorderRadius.circular(16), diff --git a/packages/flutter_vibrate/ios/Classes/Messages.g.swift b/packages/flutter_vibrate/ios/Classes/Messages.g.swift new file mode 100644 index 0000000..085220e --- /dev/null +++ b/packages/flutter_vibrate/ios/Classes/Messages.g.swift @@ -0,0 +1,241 @@ +// Autogenerated from Pigeon (v26.1.5), do not edit directly. +// See also: https://pub.dev/packages/pigeon + +import Foundation + +#if os(iOS) + import Flutter +#elseif os(macOS) + import FlutterMacOS +#else + #error("Unsupported platform.") +#endif + +/// Error class for passing custom error details to Dart side. +final class PigeonError: Error { + let code: String + let message: String? + let details: Sendable? + + init(code: String, message: String?, details: Sendable?) { + 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?] { + return [result] +} + +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, + flutterError.message, + flutterError.details, + ] + } + return [ + "\(error)", + "\(type(of: error))", + "Stacktrace: \(Thread.callStackSymbols)", + ] +} + +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? +} + + +private class MessagesPigeonCodecReader: FlutterStandardReader { +} + +private class MessagesPigeonCodecWriter: FlutterStandardWriter { +} + +private class MessagesPigeonCodecReaderWriter: FlutterStandardReaderWriter { + override func reader(with data: Data) -> FlutterStandardReader { + return MessagesPigeonCodecReader(data: data) + } + + override func writer(with data: NSMutableData) -> FlutterStandardWriter { + return MessagesPigeonCodecWriter(data: data) + } +} + +class MessagesPigeonCodec: FlutterStandardMessageCodec, @unchecked Sendable { + static let shared = MessagesPigeonCodec(readerWriter: MessagesPigeonCodecReaderWriter()) +} + +/// Generated protocol from Pigeon that represents a handler of messages from Flutter. +protocol VibrateApi { + func canVibrate() throws -> Bool + func vibrate(duration: Int64) throws + func impact() throws + func selection() throws + func success() throws + func warning() throws + func error() throws + func heavy() throws + func medium() throws + func light() throws +} + +/// Generated setup class from Pigeon to handle messages through the `binaryMessenger`. +class VibrateApiSetup { + static var codec: FlutterStandardMessageCodec { MessagesPigeonCodec.shared } + /// Sets up an instance of `VibrateApi` to handle messages through the `binaryMessenger`. + static func setUp(binaryMessenger: FlutterBinaryMessenger, api: VibrateApi?, messageChannelSuffix: String = "") { + let channelSuffix = messageChannelSuffix.count > 0 ? ".\(messageChannelSuffix)" : "" + let canVibrateChannel = FlutterBasicMessageChannel(name: "dev.flutter.pigeon.flutter_vibrate.VibrateApi.canVibrate\(channelSuffix)", binaryMessenger: binaryMessenger, codec: codec) + if let api = api { + canVibrateChannel.setMessageHandler { _, reply in + do { + let result = try api.canVibrate() + reply(wrapResult(result)) + } catch { + reply(wrapError(error)) + } + } + } else { + canVibrateChannel.setMessageHandler(nil) + } + let vibrateChannel = FlutterBasicMessageChannel(name: "dev.flutter.pigeon.flutter_vibrate.VibrateApi.vibrate\(channelSuffix)", binaryMessenger: binaryMessenger, codec: codec) + if let api = api { + vibrateChannel.setMessageHandler { message, reply in + let args = message as! [Any?] + let durationArg = args[0] as! Int64 + do { + try api.vibrate(duration: durationArg) + reply(wrapResult(nil)) + } catch { + reply(wrapError(error)) + } + } + } else { + vibrateChannel.setMessageHandler(nil) + } + let impactChannel = FlutterBasicMessageChannel(name: "dev.flutter.pigeon.flutter_vibrate.VibrateApi.impact\(channelSuffix)", binaryMessenger: binaryMessenger, codec: codec) + if let api = api { + impactChannel.setMessageHandler { _, reply in + do { + try api.impact() + reply(wrapResult(nil)) + } catch { + reply(wrapError(error)) + } + } + } else { + impactChannel.setMessageHandler(nil) + } + let selectionChannel = FlutterBasicMessageChannel(name: "dev.flutter.pigeon.flutter_vibrate.VibrateApi.selection\(channelSuffix)", binaryMessenger: binaryMessenger, codec: codec) + if let api = api { + selectionChannel.setMessageHandler { _, reply in + do { + try api.selection() + reply(wrapResult(nil)) + } catch { + reply(wrapError(error)) + } + } + } else { + selectionChannel.setMessageHandler(nil) + } + let successChannel = FlutterBasicMessageChannel(name: "dev.flutter.pigeon.flutter_vibrate.VibrateApi.success\(channelSuffix)", binaryMessenger: binaryMessenger, codec: codec) + if let api = api { + successChannel.setMessageHandler { _, reply in + do { + try api.success() + reply(wrapResult(nil)) + } catch { + reply(wrapError(error)) + } + } + } else { + successChannel.setMessageHandler(nil) + } + let warningChannel = FlutterBasicMessageChannel(name: "dev.flutter.pigeon.flutter_vibrate.VibrateApi.warning\(channelSuffix)", binaryMessenger: binaryMessenger, codec: codec) + if let api = api { + warningChannel.setMessageHandler { _, reply in + do { + try api.warning() + reply(wrapResult(nil)) + } catch { + reply(wrapError(error)) + } + } + } else { + warningChannel.setMessageHandler(nil) + } + let errorChannel = FlutterBasicMessageChannel(name: "dev.flutter.pigeon.flutter_vibrate.VibrateApi.error\(channelSuffix)", binaryMessenger: binaryMessenger, codec: codec) + if let api = api { + errorChannel.setMessageHandler { _, reply in + do { + try api.error() + reply(wrapResult(nil)) + } catch { + reply(wrapError(error)) + } + } + } else { + errorChannel.setMessageHandler(nil) + } + let heavyChannel = FlutterBasicMessageChannel(name: "dev.flutter.pigeon.flutter_vibrate.VibrateApi.heavy\(channelSuffix)", binaryMessenger: binaryMessenger, codec: codec) + if let api = api { + heavyChannel.setMessageHandler { _, reply in + do { + try api.heavy() + reply(wrapResult(nil)) + } catch { + reply(wrapError(error)) + } + } + } else { + heavyChannel.setMessageHandler(nil) + } + let mediumChannel = FlutterBasicMessageChannel(name: "dev.flutter.pigeon.flutter_vibrate.VibrateApi.medium\(channelSuffix)", binaryMessenger: binaryMessenger, codec: codec) + if let api = api { + mediumChannel.setMessageHandler { _, reply in + do { + try api.medium() + reply(wrapResult(nil)) + } catch { + reply(wrapError(error)) + } + } + } else { + mediumChannel.setMessageHandler(nil) + } + let lightChannel = FlutterBasicMessageChannel(name: "dev.flutter.pigeon.flutter_vibrate.VibrateApi.light\(channelSuffix)", binaryMessenger: binaryMessenger, codec: codec) + if let api = api { + lightChannel.setMessageHandler { _, reply in + do { + try api.light() + reply(wrapResult(nil)) + } catch { + reply(wrapError(error)) + } + } + } else { + lightChannel.setMessageHandler(nil) + } + } +} diff --git a/packages/flutter_vibrate/ios/Classes/SwiftVibratePlugin.swift b/packages/flutter_vibrate/ios/Classes/SwiftVibratePlugin.swift index 83ba6c7..630676a 100644 --- a/packages/flutter_vibrate/ios/Classes/SwiftVibratePlugin.swift +++ b/packages/flutter_vibrate/ios/Classes/SwiftVibratePlugin.swift @@ -2,100 +2,84 @@ import Flutter import UIKit import AudioToolbox -private let isDevice = TARGET_OS_SIMULATOR == 0 - -public class SwiftVibratePlugin: NSObject, FlutterPlugin { +public class SwiftVibratePlugin: NSObject, FlutterPlugin, VibrateApi { + private let isDevice = TARGET_OS_SIMULATOR == 0 + public static func register(with registrar: FlutterPluginRegistrar) { - let channel = FlutterMethodChannel(name: "vibrate", binaryMessenger: registrar.messenger()) - let instance = SwiftVibratePlugin() - registrar.addMethodCallDelegate(instance, channel: channel) + let messenger : FlutterBinaryMessenger = registrar.messenger() + let api : VibrateApi & NSObjectProtocol = SwiftVibratePlugin() + VibrateApiSetup.setUp(binaryMessenger: messenger, api: api) } - public func handle(_ call: FlutterMethodCall, result: @escaping FlutterResult) { - switch (call.method) { - case "canVibrate": - if isDevice { - result(true) - } else { - result(false) - } - case "vibrate": - AudioServicesPlaySystemSound(kSystemSoundID_Vibrate) - // Feedback - case "impact": - if #available(iOS 10.0, *) { - let impact = UIImpactFeedbackGenerator() - impact.prepare() - impact.impactOccurred() - } else { - // Fallback on earlier versions - AudioServicesPlaySystemSound(kSystemSoundID_Vibrate) - } - case "selection": - if #available(iOS 10.0, *) { - let selection = UISelectionFeedbackGenerator() - selection.prepare() - selection.selectionChanged() - } else { - // Fallback on earlier versions - AudioServicesPlaySystemSound(kSystemSoundID_Vibrate) - } - case "success": - if #available(iOS 10.0, *) { - let notification = UINotificationFeedbackGenerator() - notification.prepare() - notification.notificationOccurred(.success) - } else { - // Fallback on earlier versions - AudioServicesPlaySystemSound(kSystemSoundID_Vibrate) - } - case "warning": - if #available(iOS 10.0, *) { - let notification = UINotificationFeedbackGenerator() - notification.prepare() - notification.notificationOccurred(.warning) - } else { - // Fallback on earlier versions - AudioServicesPlaySystemSound(kSystemSoundID_Vibrate) - } - case "error": - if #available(iOS 10.0, *) { - let notification = UINotificationFeedbackGenerator() - notification.prepare() - notification.notificationOccurred(.error) - } else { - // Fallback on earlier versions - AudioServicesPlaySystemSound(kSystemSoundID_Vibrate) - } - case "heavy": - if #available(iOS 10.0, *) { - let generator = UIImpactFeedbackGenerator(style: .heavy) - generator.prepare() - generator.impactOccurred() - } else { - // Fallback on earlier versions - AudioServicesPlaySystemSound(kSystemSoundID_Vibrate) - } - case "medium": - if #available(iOS 10.0, *) { - let generator = UIImpactFeedbackGenerator(style: .medium) - generator.prepare() - generator.impactOccurred() - } else { - // Fallback on earlier versions - AudioServicesPlaySystemSound(kSystemSoundID_Vibrate) - } - case "light": - if #available(iOS 10.0, *) { - let generator = UIImpactFeedbackGenerator(style: .light) - generator.prepare() - generator.impactOccurred() - } else { - // Fallback on earlier versions - AudioServicesPlaySystemSound(kSystemSoundID_Vibrate) - } - default: - result(FlutterMethodNotImplemented) + func canVibrate() throws -> Bool { + return isDevice + } + + func vibrate(duration: Int64) throws { + AudioServicesPlaySystemSound(kSystemSoundID_Vibrate) + } + + func impact() throws { + if #available(iOS 10.0, *) { + let generator = UIImpactFeedbackGenerator(style: .medium) + generator.prepare() + generator.impactOccurred() } - } + } + + func selection() throws { + if #available(iOS 10.0, *) { + let generator = UISelectionFeedbackGenerator() + generator.prepare() + generator.selectionChanged() + } + } + + func success() throws { + if #available(iOS 10.0, *) { + let generator = UINotificationFeedbackGenerator() + generator.prepare() + generator.notificationOccurred(.success) + } + } + + func warning() throws { + if #available(iOS 10.0, *) { + let generator = UINotificationFeedbackGenerator() + generator.prepare() + generator.notificationOccurred(.warning) + } + } + + func error() throws { + if #available(iOS 10.0, *) { + let generator = UINotificationFeedbackGenerator() + generator.prepare() + generator.notificationOccurred(.error) + } + } + + func heavy() throws { + if #available(iOS 10.0, *) { + let generator = UIImpactFeedbackGenerator(style: .heavy) + generator.prepare() + generator.impactOccurred() + } + } + + func medium() throws { + if #available(iOS 10.0, *) { + let generator = UIImpactFeedbackGenerator(style: .medium) + generator.prepare() + generator.impactOccurred() + } + } + + func light() throws { + if #available(iOS 10.0, *) { + let generator = UIImpactFeedbackGenerator(style: .light) + generator.prepare() + generator.impactOccurred() + } + } } diff --git a/packages/flutter_vibrate/lib/flutter_vibrate.dart b/packages/flutter_vibrate/lib/flutter_vibrate.dart index d45d22f..aba4e84 100644 --- a/packages/flutter_vibrate/lib/flutter_vibrate.dart +++ b/packages/flutter_vibrate/lib/flutter_vibrate.dart @@ -1,6 +1,8 @@ import 'dart:async'; -import 'package:flutter/services.dart'; +import 'src/messages.g.dart'; + +export 'src/messages.g.dart' show VibrateApi; enum FeedbackType { success, @@ -14,61 +16,60 @@ enum FeedbackType { } class Vibrate { - static const MethodChannel _channel = MethodChannel('vibrate'); - static const Duration defaultVibrationDuration = Duration(milliseconds: 500); + static final VibrateApi _api = VibrateApi(); + static const Duration _defaultVibrationDuration = Duration(milliseconds: 500); /// Vibrate for 500ms on Android, and for the default time on iOS (about 500ms as well) - static Future vibrate() => _channel.invokeMethod('vibrate', { - 'duration': defaultVibrationDuration.inMilliseconds, - }); + static Future vibrate() async { + await _api.vibrate(500); + } /// Whether the device can actually vibrate or not static Future get canVibrate async { - final bool isOn = await _channel.invokeMethod('canVibrate'); - return isOn; - } - - static void feedback(FeedbackType type) { - switch (type) { - case FeedbackType.impact: - _channel.invokeMethod('impact'); - break; - case FeedbackType.error: - _channel.invokeMethod('error'); - break; - case FeedbackType.success: - _channel.invokeMethod('success'); - break; - case FeedbackType.warning: - _channel.invokeMethod('warning'); - break; - case FeedbackType.selection: - _channel.invokeMethod('selection'); - break; - case FeedbackType.heavy: - _channel.invokeMethod('heavy'); - break; - case FeedbackType.medium: - _channel.invokeMethod('medium'); - break; - case FeedbackType.light: - _channel.invokeMethod('light'); - break; - } + return _api.canVibrate(); } /// Vibrates with [pauses] in between each vibration /// Will always vibrate once before the first pause /// and once after the last pause - - static Future vibrateWithPauses(Iterable pauses) async { + static Future vibrateWithPauses(Iterable pauses) async { for (final Duration d in pauses) { await vibrate(); - //Because the native vibration is not awaited, we need to wait for - //the vibration to end before launching another one - await Future.delayed(defaultVibrationDuration); + // Because the native vibration is not awaited (fire-and-forget in some impls, + // though Pigeon calls are async, the vibration itself happens on hardware), + // we need to wait for the vibration to end before launching another one. + await Future.delayed(_defaultVibrationDuration); await Future.delayed(d); } await vibrate(); } + + static Future feedback(FeedbackType type) async { + switch (type) { + case FeedbackType.impact: + await _api.impact(); + break; + case FeedbackType.selection: + await _api.selection(); + break; + case FeedbackType.success: + await _api.success(); + break; + case FeedbackType.warning: + await _api.warning(); + break; + case FeedbackType.error: + await _api.error(); + break; + case FeedbackType.heavy: + await _api.heavy(); + break; + case FeedbackType.medium: + await _api.medium(); + break; + case FeedbackType.light: + await _api.light(); + break; + } + } } diff --git a/packages/flutter_vibrate/lib/src/messages.g.dart b/packages/flutter_vibrate/lib/src/messages.g.dart new file mode 100644 index 0000000..f94e64f --- /dev/null +++ b/packages/flutter_vibrate/lib/src/messages.g.dart @@ -0,0 +1,277 @@ +// Autogenerated from Pigeon (v26.1.5), 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, omit_obvious_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; + +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".', + ); +} + + +class _PigeonCodec extends StandardMessageCodec { + const _PigeonCodec(); + @override + void writeValue(WriteBuffer buffer, Object? value) { + if (value is int) { + buffer.putUint8(4); + buffer.putInt64(value); + } else { + super.writeValue(buffer, value); + } + } + + @override + Object? readValueOfType(int type, ReadBuffer buffer) { + switch (type) { + default: + return super.readValueOfType(type, buffer); + } + } +} + +class VibrateApi { + /// Constructor for [VibrateApi]. 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. + VibrateApi({BinaryMessenger? binaryMessenger, String messageChannelSuffix = ''}) + : pigeonVar_binaryMessenger = binaryMessenger, + pigeonVar_messageChannelSuffix = messageChannelSuffix.isNotEmpty ? '.$messageChannelSuffix' : ''; + final BinaryMessenger? pigeonVar_binaryMessenger; + + static const MessageCodec pigeonChannelCodec = _PigeonCodec(); + + final String pigeonVar_messageChannelSuffix; + + Future canVibrate() async { + final pigeonVar_channelName = 'dev.flutter.pigeon.flutter_vibrate.VibrateApi.canVibrate$pigeonVar_messageChannelSuffix'; + final pigeonVar_channel = BasicMessageChannel( + pigeonVar_channelName, + pigeonChannelCodec, + binaryMessenger: pigeonVar_binaryMessenger, + ); + final Future pigeonVar_sendFuture = pigeonVar_channel.send(null); + final pigeonVar_replyList = await pigeonVar_sendFuture as List?; + if (pigeonVar_replyList == null) { + throw _createConnectionError(pigeonVar_channelName); + } else if (pigeonVar_replyList.length > 1) { + throw PlatformException( + code: pigeonVar_replyList[0]! as String, + message: pigeonVar_replyList[1] as String?, + details: pigeonVar_replyList[2], + ); + } else if (pigeonVar_replyList[0] == null) { + throw PlatformException( + code: 'null-error', + message: 'Host platform returned null value for non-null return value.', + ); + } else { + return (pigeonVar_replyList[0] as bool?)!; + } + } + + Future vibrate(int duration) async { + final pigeonVar_channelName = 'dev.flutter.pigeon.flutter_vibrate.VibrateApi.vibrate$pigeonVar_messageChannelSuffix'; + final pigeonVar_channel = BasicMessageChannel( + pigeonVar_channelName, + pigeonChannelCodec, + binaryMessenger: pigeonVar_binaryMessenger, + ); + final Future pigeonVar_sendFuture = pigeonVar_channel.send([duration]); + final pigeonVar_replyList = await pigeonVar_sendFuture as List?; + if (pigeonVar_replyList == null) { + throw _createConnectionError(pigeonVar_channelName); + } else if (pigeonVar_replyList.length > 1) { + throw PlatformException( + code: pigeonVar_replyList[0]! as String, + message: pigeonVar_replyList[1] as String?, + details: pigeonVar_replyList[2], + ); + } else { + return; + } + } + + Future impact() async { + final pigeonVar_channelName = 'dev.flutter.pigeon.flutter_vibrate.VibrateApi.impact$pigeonVar_messageChannelSuffix'; + final pigeonVar_channel = BasicMessageChannel( + pigeonVar_channelName, + pigeonChannelCodec, + binaryMessenger: pigeonVar_binaryMessenger, + ); + final Future pigeonVar_sendFuture = pigeonVar_channel.send(null); + final pigeonVar_replyList = await pigeonVar_sendFuture as List?; + if (pigeonVar_replyList == null) { + throw _createConnectionError(pigeonVar_channelName); + } else if (pigeonVar_replyList.length > 1) { + throw PlatformException( + code: pigeonVar_replyList[0]! as String, + message: pigeonVar_replyList[1] as String?, + details: pigeonVar_replyList[2], + ); + } else { + return; + } + } + + Future selection() async { + final pigeonVar_channelName = 'dev.flutter.pigeon.flutter_vibrate.VibrateApi.selection$pigeonVar_messageChannelSuffix'; + final pigeonVar_channel = BasicMessageChannel( + pigeonVar_channelName, + pigeonChannelCodec, + binaryMessenger: pigeonVar_binaryMessenger, + ); + final Future pigeonVar_sendFuture = pigeonVar_channel.send(null); + final pigeonVar_replyList = await pigeonVar_sendFuture as List?; + if (pigeonVar_replyList == null) { + throw _createConnectionError(pigeonVar_channelName); + } else if (pigeonVar_replyList.length > 1) { + throw PlatformException( + code: pigeonVar_replyList[0]! as String, + message: pigeonVar_replyList[1] as String?, + details: pigeonVar_replyList[2], + ); + } else { + return; + } + } + + Future success() async { + final pigeonVar_channelName = 'dev.flutter.pigeon.flutter_vibrate.VibrateApi.success$pigeonVar_messageChannelSuffix'; + final pigeonVar_channel = BasicMessageChannel( + pigeonVar_channelName, + pigeonChannelCodec, + binaryMessenger: pigeonVar_binaryMessenger, + ); + final Future pigeonVar_sendFuture = pigeonVar_channel.send(null); + final pigeonVar_replyList = await pigeonVar_sendFuture as List?; + if (pigeonVar_replyList == null) { + throw _createConnectionError(pigeonVar_channelName); + } else if (pigeonVar_replyList.length > 1) { + throw PlatformException( + code: pigeonVar_replyList[0]! as String, + message: pigeonVar_replyList[1] as String?, + details: pigeonVar_replyList[2], + ); + } else { + return; + } + } + + Future warning() async { + final pigeonVar_channelName = 'dev.flutter.pigeon.flutter_vibrate.VibrateApi.warning$pigeonVar_messageChannelSuffix'; + final pigeonVar_channel = BasicMessageChannel( + pigeonVar_channelName, + pigeonChannelCodec, + binaryMessenger: pigeonVar_binaryMessenger, + ); + final Future pigeonVar_sendFuture = pigeonVar_channel.send(null); + final pigeonVar_replyList = await pigeonVar_sendFuture as List?; + if (pigeonVar_replyList == null) { + throw _createConnectionError(pigeonVar_channelName); + } else if (pigeonVar_replyList.length > 1) { + throw PlatformException( + code: pigeonVar_replyList[0]! as String, + message: pigeonVar_replyList[1] as String?, + details: pigeonVar_replyList[2], + ); + } else { + return; + } + } + + Future error() async { + final pigeonVar_channelName = 'dev.flutter.pigeon.flutter_vibrate.VibrateApi.error$pigeonVar_messageChannelSuffix'; + final pigeonVar_channel = BasicMessageChannel( + pigeonVar_channelName, + pigeonChannelCodec, + binaryMessenger: pigeonVar_binaryMessenger, + ); + final Future pigeonVar_sendFuture = pigeonVar_channel.send(null); + final pigeonVar_replyList = await pigeonVar_sendFuture as List?; + if (pigeonVar_replyList == null) { + throw _createConnectionError(pigeonVar_channelName); + } else if (pigeonVar_replyList.length > 1) { + throw PlatformException( + code: pigeonVar_replyList[0]! as String, + message: pigeonVar_replyList[1] as String?, + details: pigeonVar_replyList[2], + ); + } else { + return; + } + } + + Future heavy() async { + final pigeonVar_channelName = 'dev.flutter.pigeon.flutter_vibrate.VibrateApi.heavy$pigeonVar_messageChannelSuffix'; + final pigeonVar_channel = BasicMessageChannel( + pigeonVar_channelName, + pigeonChannelCodec, + binaryMessenger: pigeonVar_binaryMessenger, + ); + final Future pigeonVar_sendFuture = pigeonVar_channel.send(null); + final pigeonVar_replyList = await pigeonVar_sendFuture as List?; + if (pigeonVar_replyList == null) { + throw _createConnectionError(pigeonVar_channelName); + } else if (pigeonVar_replyList.length > 1) { + throw PlatformException( + code: pigeonVar_replyList[0]! as String, + message: pigeonVar_replyList[1] as String?, + details: pigeonVar_replyList[2], + ); + } else { + return; + } + } + + Future medium() async { + final pigeonVar_channelName = 'dev.flutter.pigeon.flutter_vibrate.VibrateApi.medium$pigeonVar_messageChannelSuffix'; + final pigeonVar_channel = BasicMessageChannel( + pigeonVar_channelName, + pigeonChannelCodec, + binaryMessenger: pigeonVar_binaryMessenger, + ); + final Future pigeonVar_sendFuture = pigeonVar_channel.send(null); + final pigeonVar_replyList = await pigeonVar_sendFuture as List?; + if (pigeonVar_replyList == null) { + throw _createConnectionError(pigeonVar_channelName); + } else if (pigeonVar_replyList.length > 1) { + throw PlatformException( + code: pigeonVar_replyList[0]! as String, + message: pigeonVar_replyList[1] as String?, + details: pigeonVar_replyList[2], + ); + } else { + return; + } + } + + Future light() async { + final pigeonVar_channelName = 'dev.flutter.pigeon.flutter_vibrate.VibrateApi.light$pigeonVar_messageChannelSuffix'; + final pigeonVar_channel = BasicMessageChannel( + pigeonVar_channelName, + pigeonChannelCodec, + binaryMessenger: pigeonVar_binaryMessenger, + ); + final Future pigeonVar_sendFuture = pigeonVar_channel.send(null); + final pigeonVar_replyList = await pigeonVar_sendFuture as List?; + if (pigeonVar_replyList == null) { + throw _createConnectionError(pigeonVar_channelName); + } else if (pigeonVar_replyList.length > 1) { + throw PlatformException( + code: pigeonVar_replyList[0]! as String, + message: pigeonVar_replyList[1] as String?, + details: pigeonVar_replyList[2], + ); + } else { + return; + } + } +} diff --git a/packages/flutter_vibrate/pigeons/messages.dart b/packages/flutter_vibrate/pigeons/messages.dart new file mode 100644 index 0000000..e90f789 --- /dev/null +++ b/packages/flutter_vibrate/pigeons/messages.dart @@ -0,0 +1,30 @@ +import 'package:pigeon/pigeon.dart'; + +@ConfigurePigeon( + PigeonOptions( + dartOut: 'lib/src/messages.g.dart', + dartPackageName: 'flutter_vibrate', + dartOptions: DartOptions(), + kotlinOut: 'android/src/main/kotlin/flutter/plugins/vibrate/Messages.g.kt', + kotlinOptions: KotlinOptions(package: 'flutter.plugins.vibrate'), + // We're keeping the Java implementation as per plan, but Pigeon prefers Kotlin by default + // or specific Java options. The plan said Java. Let's configure for Java since existing code is Java. + javaOut: 'android/src/main/java/flutter/plugins/vibrate/Messages.java', + javaOptions: JavaOptions(package: 'flutter.plugins.vibrate'), + swiftOut: 'ios/Classes/Messages.g.swift', + swiftOptions: SwiftOptions(), + ), +) +@HostApi() +abstract class VibrateApi { + bool canVibrate(); + void vibrate(int duration); + void impact(); + void selection(); + void success(); + void warning(); + void error(); + void heavy(); + void medium(); + void light(); +} diff --git a/packages/flutter_vibrate/pubspec.yaml b/packages/flutter_vibrate/pubspec.yaml index 3657282..5cb5d80 100644 --- a/packages/flutter_vibrate/pubspec.yaml +++ b/packages/flutter_vibrate/pubspec.yaml @@ -15,6 +15,7 @@ dependencies: dev_dependencies: flutter_lints: ^5.0.0 + pigeon: ^26.1.5 flutter: plugin: diff --git a/pubspec.lock b/pubspec.lock index 1dfb824..9029c5a 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -1,6 +1,62 @@ # Generated by pub # See https://dart.dev/tools/pub/glossary#lockfile packages: + _fe_analyzer_shared: + dependency: transitive + description: + name: _fe_analyzer_shared + sha256: "5b7468c326d2f8a4f630056404ca0d291ade42918f4a3c6233618e724f39da8e" + url: "https://pub.dev" + source: hosted + version: "92.0.0" + analyzer: + dependency: transitive + description: + name: analyzer + sha256: "70e4b1ef8003c64793a9e268a551a82869a8a96f39deb73dea28084b0e8bf75e" + url: "https://pub.dev" + source: hosted + version: "9.0.0" + args: + dependency: transitive + description: + name: args + sha256: d0481093c50b1da8910eb0bb301626d4d8eb7284aa739614d2b394ee09e3ea04 + url: "https://pub.dev" + source: hosted + version: "2.7.0" + async: + dependency: transitive + description: + name: async + sha256: "758e6d74e971c3e5aceb4110bfd6698efc7f501675bcfe0c775459a8140750eb" + url: "https://pub.dev" + source: hosted + version: "2.13.0" + boolean_selector: + dependency: transitive + description: + name: boolean_selector + sha256: "8aab1771e1243a5063b8b0ff68042d67334e3feab9e95b9490f9a6ebf73b42ea" + url: "https://pub.dev" + source: hosted + version: "2.1.2" + built_collection: + dependency: transitive + description: + name: built_collection + sha256: "376e3dd27b51ea877c28d525560790aee2e6fbb5f20e2f85d5081027d94e2100" + url: "https://pub.dev" + source: hosted + version: "5.1.1" + built_value: + dependency: transitive + description: + name: built_value + sha256: "120df83d4a4ce6bed06ad653c0a3e85737e0f66664f31e17a55136ff5a738cde" + url: "https://pub.dev" + source: hosted + version: "8.12.2" characters: dependency: transitive description: @@ -9,6 +65,14 @@ packages: url: "https://pub.dev" source: hosted version: "1.4.0" + code_builder: + dependency: transitive + description: + name: code_builder + sha256: "6a6cab2ba4680d6423f34a9b972a4c9a94ebe1b62ecec4e1a1f2cba91fd1319d" + url: "https://pub.dev" + source: hosted + version: "4.11.1" collection: dependency: transitive description: @@ -17,6 +81,46 @@ packages: url: "https://pub.dev" source: hosted version: "1.19.1" + convert: + dependency: transitive + description: + name: convert + sha256: b30acd5944035672bc15c6b7a8b47d773e41e2f17de064350988c5d02adb1c68 + url: "https://pub.dev" + source: hosted + version: "3.1.2" + crypto: + dependency: transitive + description: + name: crypto + sha256: c8ea0233063ba03258fbcf2ca4d6dadfefe14f02fab57702265467a19f27fadf + url: "https://pub.dev" + source: hosted + version: "3.0.7" + dart_style: + dependency: transitive + description: + name: dart_style + sha256: a9c30492da18ff84efe2422ba2d319a89942d93e58eb0b73d32abe822ef54b7b + url: "https://pub.dev" + source: hosted + version: "3.1.3" + file: + dependency: transitive + description: + name: file + sha256: a3b4f84adafef897088c160faf7dfffb7696046cb13ae90b508c2cbc95d3b8d4 + url: "https://pub.dev" + source: hosted + version: "7.0.1" + fixnum: + dependency: transitive + description: + name: fixnum + sha256: b6dc7065e46c974bc7c5f143080a6764ec7a4be6da1285ececdc37be96de53be + url: "https://pub.dev" + source: hosted + version: "1.1.1" flutter: dependency: transitive description: flutter @@ -30,6 +134,22 @@ packages: url: "https://pub.dev" source: hosted version: "5.0.0" + glob: + dependency: transitive + description: + name: glob + sha256: c3f1ee72c96f8f78935e18aa8cecced9ab132419e8625dc187e1c2408efc20de + url: "https://pub.dev" + source: hosted + version: "2.1.3" + graphs: + dependency: transitive + description: + name: graphs + sha256: "741bbf84165310a68ff28fe9e727332eef1407342fca52759cb21ad8177bb8d0" + url: "https://pub.dev" + source: hosted + version: "2.3.2" lints: dependency: transitive description: @@ -38,6 +158,14 @@ packages: url: "https://pub.dev" source: hosted version: "5.1.1" + matcher: + dependency: transitive + description: + name: matcher + sha256: "12956d0ad8390bbcc63ca2e1469c0619946ccb52809807067a7020d57e647aa6" + url: "https://pub.dev" + source: hosted + version: "0.12.18" material_color_utilities: dependency: transitive description: @@ -54,11 +182,99 @@ packages: url: "https://pub.dev" source: hosted version: "1.17.0" + package_config: + dependency: transitive + description: + name: package_config + sha256: f096c55ebb7deb7e384101542bfba8c52696c1b56fca2eb62827989ef2353bbc + url: "https://pub.dev" + source: hosted + version: "2.2.0" + path: + dependency: transitive + description: + name: path + sha256: "75cca69d1490965be98c73ceaea117e8a04dd21217b37b292c9ddbec0d955bc5" + url: "https://pub.dev" + source: hosted + version: "1.9.1" + pigeon: + dependency: transitive + description: + name: pigeon + sha256: fcfee18cf18dae434a149879e6876214c1b57c8d2d5d0cc55a5ba0c85278b886 + url: "https://pub.dev" + source: hosted + version: "26.1.5" + pub_semver: + dependency: transitive + description: + name: pub_semver + sha256: "5bfcf68ca79ef689f8990d1160781b4bad40a3bd5e5218ad4076ddb7f4081585" + url: "https://pub.dev" + source: hosted + version: "2.2.0" sky_engine: dependency: transitive description: flutter source: sdk version: "0.0.0" + source_span: + dependency: transitive + description: + name: source_span + sha256: "254ee5351d6cb365c859e20ee823c3bb479bf4a293c22d17a9f1bf144ce86f7c" + url: "https://pub.dev" + source: hosted + version: "1.10.1" + stack_trace: + dependency: transitive + description: + name: stack_trace + sha256: "8b27215b45d22309b5cddda1aa2b19bdfec9df0e765f2de506401c071d38d1b1" + url: "https://pub.dev" + source: hosted + version: "1.12.1" + stream_channel: + dependency: transitive + description: + name: stream_channel + sha256: "969e04c80b8bcdf826f8f16579c7b14d780458bd97f56d107d3950fdbeef059d" + url: "https://pub.dev" + source: hosted + version: "2.1.4" + string_scanner: + dependency: transitive + description: + name: string_scanner + sha256: "921cd31725b72fe181906c6a94d987c78e3b98c2e205b397ea399d4054872b43" + url: "https://pub.dev" + source: hosted + version: "1.4.1" + term_glyph: + dependency: transitive + description: + name: term_glyph + sha256: "7f554798625ea768a7518313e58f83891c7f5024f88e46e7182a4558850a4b8e" + url: "https://pub.dev" + source: hosted + version: "1.2.2" + test_api: + dependency: transitive + description: + name: test_api + sha256: "93167629bfc610f71560ab9312acdda4959de4df6fac7492c89ff0d3886f6636" + url: "https://pub.dev" + source: hosted + version: "0.7.9" + typed_data: + dependency: transitive + description: + name: typed_data + sha256: f9049c039ebfeb4cf7a7104a675823cd72dba8297f264b6637062516699fa006 + url: "https://pub.dev" + source: hosted + version: "1.4.0" vector_math: dependency: transitive description: @@ -67,6 +283,22 @@ packages: url: "https://pub.dev" source: hosted version: "2.2.0" + watcher: + dependency: transitive + description: + name: watcher + sha256: "1398c9f081a753f9226febe8900fce8f7d0a67163334e1c94a2438339d79d635" + url: "https://pub.dev" + source: hosted + version: "1.2.1" + yaml: + dependency: transitive + description: + name: yaml + sha256: b9da305ac7c39faa3f030eccd175340f968459dae4af175130b3fc47e40d76ce + url: "https://pub.dev" + source: hosted + version: "3.1.3" sdks: dart: ">=3.10.4 <4.0.0" flutter: ">=3.38.5 <4.0.0"