From 3633321d88aede14e78500b363ae3ed3bd4d5a84 Mon Sep 17 00:00:00 2001 From: Sikander Saleem Date: Wed, 23 Oct 2024 09:23:58 +0300 Subject: [PATCH] speech to text added on description field & improvements. --- android/gradle.properties | 2 +- assets/images/logo_white.png | Bin 2454 -> 12760 bytes lib/new_views/app_style/app_color.dart | 4 + .../common_widgets/app_text_form_field.dart | 122 ++++++++++++++++-- lib/new_views/pages/login_page.dart | 2 +- .../views/components/history_log_view.dart | 4 +- .../forms/spare_part/spare_part_request.dart | 1 + 7 files changed, 119 insertions(+), 16 deletions(-) diff --git a/android/gradle.properties b/android/gradle.properties index 08dfdfcb..b20905ec 100644 --- a/android/gradle.properties +++ b/android/gradle.properties @@ -1,4 +1,4 @@ org.gradle.jvmargs=-Xmx2048m android.useAndroidX=true android.enableJetifier=true -org.gradle.java.home=/Users/waseem/Library/Java/JavaVirtualMachines/jbr-17.0.12/Contents/Home + diff --git a/assets/images/logo_white.png b/assets/images/logo_white.png index 0f7acf0fd1388f64cb05264e989bc42af32f0e64..fb16b7cb1b4ec468eff28cb8ddfe9b8c554c4f87 100644 GIT binary patch literal 12760 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 Qvj6}907*qoM6N<$f(He=(*OVf diff --git a/lib/new_views/app_style/app_color.dart b/lib/new_views/app_style/app_color.dart index 8f263e2b..fb4a8f9b 100644 --- a/lib/new_views/app_style/app_color.dart +++ b/lib/new_views/app_style/app_color.dart @@ -118,6 +118,8 @@ class AppColor { return white936; case "new": return primary63; + case "open": + return primary63; case "closed": return black1E; case "completed": @@ -135,6 +137,8 @@ class AppColor { return orange30; case "new": return primary10.withOpacity(.30); + case "open": + return primary10.withOpacity(.30); case "closed": return white936.withOpacity(.30); case "completed": diff --git a/lib/new_views/common_widgets/app_text_form_field.dart b/lib/new_views/common_widgets/app_text_form_field.dart index 65440d6c..152af656 100644 --- a/lib/new_views/common_widgets/app_text_form_field.dart +++ b/lib/new_views/common_widgets/app_text_form_field.dart @@ -1,6 +1,14 @@ import 'package:flutter/material.dart'; +import 'package:fluttertoast/fluttertoast.dart'; +import 'package:provider/provider.dart'; +import 'package:speech_to_text/speech_recognition_error.dart'; +import 'package:speech_to_text/speech_recognition_result.dart'; +import 'package:speech_to_text/speech_to_text.dart'; +import 'package:test_sa/controllers/providers/settings/setting_provider.dart'; import 'package:test_sa/extensions/context_extension.dart'; import 'package:test_sa/extensions/int_extensions.dart'; +import 'package:test_sa/extensions/text_extensions.dart'; +import 'package:test_sa/extensions/widget_extensions.dart'; import 'package:test_sa/new_views/app_style/app_color.dart'; import 'package:test_sa/new_views/app_style/app_text_style.dart'; @@ -32,6 +40,7 @@ class AppTextFormField extends StatefulWidget { final EdgeInsets? contentPadding; final bool showWithoutDecoration; final VoidCallback? onTap; + final bool showSpeechToText; const AppTextFormField({ Key? key, @@ -47,6 +56,7 @@ class AppTextFormField extends StatefulWidget { this.textInputType = TextInputType.text, this.initialValue, // Provide default value this.enable = true, + this.showSpeechToText = false, this.style, this.contentPadding, this.textAlign, @@ -69,24 +79,92 @@ class AppTextFormField extends StatefulWidget { } class _AppTextFormFieldState extends State { + bool _speechEnabled = false; + final SpeechToText _speechToText = SpeechToText(); + SettingProvider? _settingProvider; + + late FocusNode _focusNode; + @override void initState() { if (widget.initialValue != null) { widget.controller?.text = widget.initialValue!; } - + _focusNode = widget.node ?? FocusNode(); + _initSpeech(); super.initState(); } + void _initSpeech() async { + _speechEnabled = await _speechToText.initialize( + onError: (SpeechRecognitionError error) async { + Fluttertoast.showToast(msg: "failed to convert text to speech"); + setState(() {}); + }, + ); + } + + void _startListening() async { + _speechEnabled = _speechToText.isAvailable; + if (_speechToText.isListening) { + Fluttertoast.showToast(msg: "Currently in use"); + return; + } + if (!_speechEnabled) return; + await _speechToText.listen( + onResult: (SpeechRecognitionResult result) { + widget.controller?.text = result.recognizedWords; + if (widget.onChange != null) widget.onChange!(result.recognizedWords); + widget.controller?.text = result.recognizedWords; + if (widget.onSaved != null) widget.onSaved!(result.recognizedWords); + _focusNode.unfocus(); + setState(() {}); + }, + localeId: _settingProvider!.speechToText); + setState(() {}); + } + + void _stopListening() async { + await _speechToText.stop(); + _focusNode.unfocus(); + setState(() {}); + + } + @override Widget build(BuildContext context) { + _settingProvider ??= Provider.of(context, listen: false); final border = UnderlineInputBorder( borderSide: BorderSide.none, borderRadius: BorderRadius.circular(10), ); + Widget speechToTextWidget = PopupMenuButton( + child: SizedBox( + height: 24.toScreenHeight, + width: 24.toScreenWidth, + child: "speech_to_text".toSvgAsset(color: context.isDark ? AppColor.neutral10 : AppColor.neutral20, height: 24, width: 24), + ), + onSelected: (String selectedLanguage) { + _settingProvider!.setSpeechToText(selectedLanguage); + _startListening(); + }, + itemBuilder: (BuildContext context) { + return [ + const PopupMenuItem( + value: 'ar', + child: Text('Arabic'), + ), + const PopupMenuItem( + value: 'en', + child: Text('English'), + ), + ]; + }, + ); + final textField = TextFormField( - focusNode: widget.node, + focusNode: _focusNode, enabled: widget.enable, onSaved: (text) { if (widget.onSaved != null && text != null) widget.onSaved!(text); @@ -110,10 +188,11 @@ class _AppTextFormFieldState extends State { focusedBorder: border, enabledBorder: border, errorBorder: border, - contentPadding: widget.contentPadding ?? EdgeInsets.symmetric(vertical: 12.toScreenHeight, horizontal: 16.toScreenWidth), constraints: const BoxConstraints(), - suffixIconConstraints: const BoxConstraints(minWidth: 0), + suffixIconConstraints: const BoxConstraints( + minWidth: 0, + ), filled: true, fillColor: widget.backgroundColor ?? (context.isDark && !widget.enable @@ -124,7 +203,7 @@ class _AppTextFormFieldState extends State { errorStyle: AppTextStyle.tiny.copyWith(color: context.isDark ? AppColor.red50 : AppColor.red60), floatingLabelStyle: AppTextStyle.body1.copyWith(fontWeight: FontWeight.w500, color: context.isDark ? null : AppColor.neutral20), hintText: widget.hintText ?? "", - labelText: widget.labelText ?? "", + labelText: (widget.showSpeechToText && _speechToText.isListening) ? "Listening..." : widget.labelText ?? "", labelStyle: widget.labelStyle, prefixIcon: widget.prefixIcon ?? (widget.prefixIconData == null @@ -134,17 +213,36 @@ class _AppTextFormFieldState extends State { size: widget.prefixIconSize == null ? 20.toScreenWidth : (widget.prefixIconSize! - 10).toScreenWidth, color: AppColor.neutral70, )), - suffixIcon: widget.suffixIcon, + suffixIcon: widget.suffixIcon ?? + (widget.showSpeechToText + ? (_speechToText.isListening + ? SizedBox( + height: 24.toScreenHeight, + width: 24.toScreenWidth, + child: const Icon( + Icons.fiber_manual_record, + color: Colors.red, + )).onPress(() { + // _focusNode.unfocus(); + _stopListening(); + }) + : speechToTextWidget) + .paddingOnly(end: 12, bottom: 50) + : null), ), ); + // + // Widget myWidget = Row( + // children: [textField.expanded, if (widget.showSpeechToText) speechToTextWidget], + // ); + if (widget.showWithoutDecoration) return textField; return Container( - decoration: BoxDecoration( - borderRadius: BorderRadius.circular(10), - boxShadow: widget.showShadow ? [BoxShadow(color: Colors.black.withOpacity(0.05), blurRadius: 10)] : null, - ), - child: textField, - ); + decoration: BoxDecoration( + borderRadius: BorderRadius.circular(10), + boxShadow: widget.showShadow ? [BoxShadow(color: Colors.black.withOpacity(0.05), blurRadius: 10)] : null, + ), + child: textField); } } diff --git a/lib/new_views/pages/login_page.dart b/lib/new_views/pages/login_page.dart index 54efe6a9..67e75d2d 100644 --- a/lib/new_views/pages/login_page.dart +++ b/lib/new_views/pages/login_page.dart @@ -219,7 +219,7 @@ class _LoginPageState extends State { SizedBox( height: 100.toScreenHeight, ), - "logo_white".toPngAsset(), + "logo_white".toPngAsset(width: 110), 25.height, context.translation.signInToYour.customHeadingText(context).custom(color: Colors.white, fontSize: 27, fontWeight: FontWeight.w500), context.translation.account.customHeadingText(context).custom(color: Colors.white, fontSize: 27, fontWeight: FontWeight.w500), diff --git a/lib/service_request_latest/views/components/history_log_view.dart b/lib/service_request_latest/views/components/history_log_view.dart index 4847767b..c589210e 100644 --- a/lib/service_request_latest/views/components/history_log_view.dart +++ b/lib/service_request_latest/views/components/history_log_view.dart @@ -97,9 +97,9 @@ class HistoryLogView extends StatelessWidget { } String statusText(String status) { - if (status == "new") { + if (status == "new" || status == "open") { return "Open Request".addTranslation; - } else if (status == "in progress") { + } else if (status == "in progress") { return "Status update to In Progress".addTranslation; } else if (status == "closed") { return "Status update to Closed".addTranslation; diff --git a/lib/service_request_latest/views/forms/spare_part/spare_part_request.dart b/lib/service_request_latest/views/forms/spare_part/spare_part_request.dart index 70dfba35..9bff42ca 100644 --- a/lib/service_request_latest/views/forms/spare_part/spare_part_request.dart +++ b/lib/service_request_latest/views/forms/spare_part/spare_part_request.dart @@ -188,6 +188,7 @@ class _SparePartRequestState extends State with TickerProvider initialValue: requestDetailProvider.sparePartHelperModel?.comment, labelStyle: AppTextStyles.textFieldLabelStyle, controller: _descriptionController, + showSpeechToText: true, backgroundColor: context.isDark ? AppColor.neutral20 : AppColor.neutral90, labelText: context.translation.description, alignLabelWithHint: true,