From dde61b4236ac13e07d4c219bc864993091405729 Mon Sep 17 00:00:00 2001 From: Seungsoo Lee Date: Wed, 17 Jun 2026 16:04:54 +0900 Subject: [PATCH 1/4] [flutter_tts] Return a bool from isLanguageAvailable on Tizen isLanguageAvailable returned the integer 1/0 on Tizen, whereas other platforms return a boolean. Return true/false instead so the result type matches the flutter_tts API contract across platforms. Bump the version accordingly. Co-Authored-By: Claude Opus 4.8 --- packages/flutter_tts/CHANGELOG.md | 4 ++++ packages/flutter_tts/README.md | 2 +- packages/flutter_tts/pubspec.yaml | 2 +- packages/flutter_tts/tizen/src/flutter_tts_tizen_plugin.cc | 4 ++-- 4 files changed, 8 insertions(+), 4 deletions(-) diff --git a/packages/flutter_tts/CHANGELOG.md b/packages/flutter_tts/CHANGELOG.md index 3d5ded215..0fc6af6ce 100644 --- a/packages/flutter_tts/CHANGELOG.md +++ b/packages/flutter_tts/CHANGELOG.md @@ -1,3 +1,7 @@ +## 1.6.1 + +* Return a boolean from `isLanguageAvailable` to match the behavior of other platforms. + ## 1.6.0 * Update flutter_tts 4.2.0 to 4.2.5. diff --git a/packages/flutter_tts/README.md b/packages/flutter_tts/README.md index 29cd20eb8..0a9c329d7 100644 --- a/packages/flutter_tts/README.md +++ b/packages/flutter_tts/README.md @@ -11,7 +11,7 @@ This package is not an _endorsed_ implementation of `flutter_tts`. Therefore, yo ```yaml dependencies: flutter_tts: ^4.2.5 - flutter_tts_tizen: ^1.6.0 + flutter_tts_tizen: ^1.6.1 ``` Then you can import `flutter_tts` in your Dart code: diff --git a/packages/flutter_tts/pubspec.yaml b/packages/flutter_tts/pubspec.yaml index c4333f2d5..76f1f3d98 100644 --- a/packages/flutter_tts/pubspec.yaml +++ b/packages/flutter_tts/pubspec.yaml @@ -2,7 +2,7 @@ name: flutter_tts_tizen description: The Tizen implementation of flutter_tts plugin. homepage: https://github.com/flutter-tizen/plugins repository: https://github.com/flutter-tizen/plugins/tree/master/packages/flutter_tts -version: 1.6.0 +version: 1.6.1 environment: sdk: ">=3.1.0 <4.0.0" diff --git a/packages/flutter_tts/tizen/src/flutter_tts_tizen_plugin.cc b/packages/flutter_tts/tizen/src/flutter_tts_tizen_plugin.cc index 9c4dd5d29..af1c50084 100644 --- a/packages/flutter_tts/tizen/src/flutter_tts_tizen_plugin.cc +++ b/packages/flutter_tts/tizen/src/flutter_tts_tizen_plugin.cc @@ -298,11 +298,11 @@ class FlutterTtsTizenPlugin : public flutter::Plugin { if (std::holds_alternative(arguments)) { std::string language = std::move(std::get(arguments)); if (!language.empty() && tts_->IsLanguageAvailable(language)) { - SendResult(flutter::EncodableValue(1)); + SendResult(flutter::EncodableValue(true)); return; } } - SendResult(flutter::EncodableValue(0)); + SendResult(flutter::EncodableValue(false)); } void SendResult(const flutter::EncodableValue &result) { From b269aa5bcebc65fb79baeb1c6ed4dd449344ae17 Mon Sep 17 00:00:00 2001 From: Seungsoo Lee Date: Wed, 17 Jun 2026 16:05:15 +0900 Subject: [PATCH 2/4] [flutter_tts] Add integration tests for the supported TTS APIs flutter_tts has no integration tests upstream, so add regression tests covering the Tizen-supported parts of the flutter_tts v4.2.5 API (per the plugin's "Supported APIs"): - speak / stop / pause return 1 - getLanguages returns a non-empty list - isLanguageAvailable is true for a supported language - setLanguage returns 1 for a supported language - getVoices returns a non-empty list - getDefaultVoice returns a voice - setVoice returns 1 - setSpeechRate returns 1 - setVolume returns 1 - getMaxSpeechInputLength is positive (calls stop() first so the engine is in the ready state that tts_get_max_text_size requires) The isLanguageAvailable test passes thanks to the boolean-return fix in the previous commit. Validated on a Tizen TV (10.0) and Raspberry Pi 4: all tests pass (12 passed, 0 skipped, 0 failed). Co-Authored-By: Claude Opus 4.8 --- packages/flutter_tts/CHANGELOG.md | 1 + .../integration_test/flutter_tts_test.dart | 87 ++++++++++++++++++- 2 files changed, 84 insertions(+), 4 deletions(-) diff --git a/packages/flutter_tts/CHANGELOG.md b/packages/flutter_tts/CHANGELOG.md index 0fc6af6ce..1ef4ea653 100644 --- a/packages/flutter_tts/CHANGELOG.md +++ b/packages/flutter_tts/CHANGELOG.md @@ -1,6 +1,7 @@ ## 1.6.1 * Return a boolean from `isLanguageAvailable` to match the behavior of other platforms. +* Add integration tests for the supported TTS APIs. ## 1.6.0 diff --git a/packages/flutter_tts/example/integration_test/flutter_tts_test.dart b/packages/flutter_tts/example/integration_test/flutter_tts_test.dart index 29c5d4e32..fdc282a76 100644 --- a/packages/flutter_tts/example/integration_test/flutter_tts_test.dart +++ b/packages/flutter_tts/example/integration_test/flutter_tts_test.dart @@ -5,10 +5,89 @@ import 'package:integration_test/integration_test.dart'; void main() { IntegrationTestWidgetsFlutterBinding.ensureInitialized(); - testWidgets('Can speak', (WidgetTester tester) async { - final flutterTts = FlutterTts(); + late FlutterTts flutterTts; + + setUp(() async { + flutterTts = FlutterTts(); + // Give the native TTS engine time to initialize. await Future.delayed(const Duration(seconds: 2)); - var result = await flutterTts.speak('Hello, world!'); - expect(result, 1); + }); + + testWidgets('speak returns 1', (WidgetTester tester) async { + expect(await flutterTts.speak('Hello, world!'), 1); + }); + + testWidgets('stop returns 1', (WidgetTester tester) async { + await flutterTts.speak('Hello, world!'); + expect(await flutterTts.stop(), 1); + }); + + testWidgets('pause returns 1', (WidgetTester tester) async { + await flutterTts.speak('Hello, world!'); + expect(await flutterTts.pause(), 1); + }); + + testWidgets('getLanguages returns a non-empty list', ( + WidgetTester tester, + ) async { + final languages = await flutterTts.getLanguages; + expect(languages, isNotNull); + expect(languages, isNotEmpty); + }); + + testWidgets('isLanguageAvailable is true for a supported language', ( + WidgetTester tester, + ) async { + final languages = (await flutterTts.getLanguages as List).cast(); + expect(await flutterTts.isLanguageAvailable(languages.first), isTrue); + }); + + testWidgets('setLanguage returns 1 for a supported language', ( + WidgetTester tester, + ) async { + final languages = (await flutterTts.getLanguages as List).cast(); + expect(await flutterTts.setLanguage(languages.first), 1); + }); + + testWidgets('getVoices returns a non-empty list', ( + WidgetTester tester, + ) async { + final voices = await flutterTts.getVoices; + expect(voices, isNotNull); + expect(voices, isNotEmpty); + }); + + testWidgets('getDefaultVoice returns a voice', (WidgetTester tester) async { + expect(await flutterTts.getDefaultVoice, isNotNull); + }); + + testWidgets('setVoice returns 1', (WidgetTester tester) async { + final voices = (await flutterTts.getVoices as List).cast(); + final voice = voices.first; + expect( + await flutterTts.setVoice({ + 'name': voice['name'].toString(), + 'locale': voice['locale'].toString(), + }), + 1, + ); + }); + + testWidgets('setSpeechRate returns 1', (WidgetTester tester) async { + expect(await flutterTts.setSpeechRate(0.5), 1); + }); + + testWidgets('setVolume returns 1', (WidgetTester tester) async { + expect(await flutterTts.setVolume(1), 1); + }); + + testWidgets('getMaxSpeechInputLength is positive', ( + WidgetTester tester, + ) async { + // tts_get_max_text_size requires the ready state; stop() ensures it. + await flutterTts.stop(); + final maxLength = await flutterTts.getMaxSpeechInputLength; + expect(maxLength, isNotNull); + expect(maxLength, greaterThan(0)); }); } From 3df5b4e6cce5764c596c422e91447502641a22ad Mon Sep 17 00:00:00 2001 From: Seungsoo Lee Date: Wed, 17 Jun 2026 20:31:22 +0900 Subject: [PATCH 3/4] [flutter_tts] Address review feedback on integration tests MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Use setUpAll instead of setUp to initialize the TTS engine once, reducing total test time by ~22 seconds (12 tests × 2s delay) - Add tearDown to call stop() after each test to reset engine state - Add explicit isNotEmpty assertions before accessing list elements in isLanguageAvailable, setLanguage, and setVoice tests Co-Authored-By: Claude Sonnet 4.6 --- .../example/integration_test/flutter_tts_test.dart | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/packages/flutter_tts/example/integration_test/flutter_tts_test.dart b/packages/flutter_tts/example/integration_test/flutter_tts_test.dart index fdc282a76..90142f67e 100644 --- a/packages/flutter_tts/example/integration_test/flutter_tts_test.dart +++ b/packages/flutter_tts/example/integration_test/flutter_tts_test.dart @@ -7,12 +7,16 @@ void main() { late FlutterTts flutterTts; - setUp(() async { + setUpAll(() async { flutterTts = FlutterTts(); // Give the native TTS engine time to initialize. await Future.delayed(const Duration(seconds: 2)); }); + tearDown(() async { + await flutterTts.stop(); + }); + testWidgets('speak returns 1', (WidgetTester tester) async { expect(await flutterTts.speak('Hello, world!'), 1); }); @@ -39,6 +43,7 @@ void main() { WidgetTester tester, ) async { final languages = (await flutterTts.getLanguages as List).cast(); + expect(languages, isNotEmpty); expect(await flutterTts.isLanguageAvailable(languages.first), isTrue); }); @@ -46,6 +51,7 @@ void main() { WidgetTester tester, ) async { final languages = (await flutterTts.getLanguages as List).cast(); + expect(languages, isNotEmpty); expect(await flutterTts.setLanguage(languages.first), 1); }); @@ -63,6 +69,7 @@ void main() { testWidgets('setVoice returns 1', (WidgetTester tester) async { final voices = (await flutterTts.getVoices as List).cast(); + expect(voices, isNotEmpty); final voice = voices.first; expect( await flutterTts.setVoice({ From 4f36aa829d3069866d34cb61cf1262fe2403400a Mon Sep 17 00:00:00 2001 From: Seungsoo Lee Date: Mon, 22 Jun 2026 12:03:15 +0900 Subject: [PATCH 4/4] [flutter_tts] Address review feedback - Remove speak() call before stop() test: speak() returns as soon as tts_speak() is queued, so PLAYING state is not guaranteed when stop() is called; stop() is valid from any non-NONE state regardless - Remove pause() test: tts_pause() only works from PLAYING state and there is no reliable way to wait for that transition in an integration test - Bump version to 1.7.0: isLanguageAvailable return type changed from int to bool, which is an interface-level change Co-Authored-By: Claude Sonnet 4.6 --- packages/flutter_tts/CHANGELOG.md | 2 +- packages/flutter_tts/README.md | 2 +- .../example/integration_test/flutter_tts_test.dart | 6 ------ packages/flutter_tts/pubspec.yaml | 2 +- 4 files changed, 3 insertions(+), 9 deletions(-) diff --git a/packages/flutter_tts/CHANGELOG.md b/packages/flutter_tts/CHANGELOG.md index 1ef4ea653..3654b605f 100644 --- a/packages/flutter_tts/CHANGELOG.md +++ b/packages/flutter_tts/CHANGELOG.md @@ -1,4 +1,4 @@ -## 1.6.1 +## 1.7.0 * Return a boolean from `isLanguageAvailable` to match the behavior of other platforms. * Add integration tests for the supported TTS APIs. diff --git a/packages/flutter_tts/README.md b/packages/flutter_tts/README.md index 0a9c329d7..4625c0a80 100644 --- a/packages/flutter_tts/README.md +++ b/packages/flutter_tts/README.md @@ -11,7 +11,7 @@ This package is not an _endorsed_ implementation of `flutter_tts`. Therefore, yo ```yaml dependencies: flutter_tts: ^4.2.5 - flutter_tts_tizen: ^1.6.1 + flutter_tts_tizen: ^1.7.0 ``` Then you can import `flutter_tts` in your Dart code: diff --git a/packages/flutter_tts/example/integration_test/flutter_tts_test.dart b/packages/flutter_tts/example/integration_test/flutter_tts_test.dart index 90142f67e..f843e313d 100644 --- a/packages/flutter_tts/example/integration_test/flutter_tts_test.dart +++ b/packages/flutter_tts/example/integration_test/flutter_tts_test.dart @@ -22,15 +22,9 @@ void main() { }); testWidgets('stop returns 1', (WidgetTester tester) async { - await flutterTts.speak('Hello, world!'); expect(await flutterTts.stop(), 1); }); - testWidgets('pause returns 1', (WidgetTester tester) async { - await flutterTts.speak('Hello, world!'); - expect(await flutterTts.pause(), 1); - }); - testWidgets('getLanguages returns a non-empty list', ( WidgetTester tester, ) async { diff --git a/packages/flutter_tts/pubspec.yaml b/packages/flutter_tts/pubspec.yaml index 76f1f3d98..e59b6999e 100644 --- a/packages/flutter_tts/pubspec.yaml +++ b/packages/flutter_tts/pubspec.yaml @@ -2,7 +2,7 @@ name: flutter_tts_tizen description: The Tizen implementation of flutter_tts plugin. homepage: https://github.com/flutter-tizen/plugins repository: https://github.com/flutter-tizen/plugins/tree/master/packages/flutter_tts -version: 1.6.1 +version: 1.7.0 environment: sdk: ">=3.1.0 <4.0.0"