From 5a7b2cfa457ad3e6dba666600bf4f782f1f8360e Mon Sep 17 00:00:00 2001 From: Edouard Marquez Date: Wed, 19 Jun 2024 09:29:42 +0200 Subject: [PATCH 1/3] Spellchecker for OCR screens --- packages/smooth_app/lib/l10n/app_en.arb | 8 +++ .../user_preferences_dev_mode.dart | 15 +++++ .../pages/product/edit_ocr/edit_ocr_page.dart | 65 +++++++++++++++---- 3 files changed, 77 insertions(+), 11 deletions(-) diff --git a/packages/smooth_app/lib/l10n/app_en.arb b/packages/smooth_app/lib/l10n/app_en.arb index f966f3943b4..dc97fabc94d 100644 --- a/packages/smooth_app/lib/l10n/app_en.arb +++ b/packages/smooth_app/lib/l10n/app_en.arb @@ -1819,6 +1819,14 @@ "@dev_mode_hide_ecoscore_title": { "description": "User dev preferences - Disable Ecoscore - Title" }, + "dev_mode_spellchecker_for_ocr_title": "Use a spellchecker for OCR screens", + "@dev_mode_spellchecker_for_ocr_title": { + "description": "User dev preferences - Enable Spellchecker on OCR screens - Title" + }, + "dev_mode_spellchecker_for_ocr_subtitle": "(Ingredients and packaging)", + "@dev_mode_spellchecker_for_ocr_subtitle": { + "description": "User dev preferences - Enable Spellchecker on OCR screens - Subtitle" + }, "search_history_item_edit_tooltip": "Reuse and edit this search", "@search_history_item_edit_tooltip": { "description": "A tooltip to explain the Pen button near a search term -> it allows to reuse the item" diff --git a/packages/smooth_app/lib/pages/preferences/user_preferences_dev_mode.dart b/packages/smooth_app/lib/pages/preferences/user_preferences_dev_mode.dart index ca57ab676a2..b8861c0ee32 100644 --- a/packages/smooth_app/lib/pages/preferences/user_preferences_dev_mode.dart +++ b/packages/smooth_app/lib/pages/preferences/user_preferences_dev_mode.dart @@ -57,6 +57,8 @@ class UserPreferencesDevMode extends AbstractUserPreferences { static const String userPreferencesFlagAccessibilityEmoji = '__accessibilityEmoji'; static const String userPreferencesFlagUserOrderedKP = '__userOrderedKP'; + static const String userPreferencesFlagSpellCheckerOnOcr = + '__spellcheckerOcr'; final TextEditingController _textFieldController = TextEditingController(); @@ -325,6 +327,19 @@ class UserPreferencesDevMode extends AbstractUserPreferences { _showSuccessMessage(); }, ), + UserPreferencesItemSwitch( + title: appLocalizations.dev_mode_spellchecker_for_ocr_title, + subtitle: appLocalizations.dev_mode_spellchecker_for_ocr_subtitle, + value: + userPreferences.getFlag(userPreferencesFlagSpellCheckerOnOcr) ?? + false, + onChanged: (bool value) async { + await userPreferences.setFlag( + userPreferencesFlagSpellCheckerOnOcr, + value, + ); + }, + ), UserPreferencesItemSection( label: appLocalizations.dev_mode_section_experimental_features, ), diff --git a/packages/smooth_app/lib/pages/product/edit_ocr/edit_ocr_page.dart b/packages/smooth_app/lib/pages/product/edit_ocr/edit_ocr_page.dart index f8862431125..2765704283b 100644 --- a/packages/smooth_app/lib/pages/product/edit_ocr/edit_ocr_page.dart +++ b/packages/smooth_app/lib/pages/product/edit_ocr/edit_ocr_page.dart @@ -1,9 +1,12 @@ +import 'dart:io'; + import 'package:flutter/material.dart'; import 'package:flutter_gen/gen_l10n/app_localizations.dart'; import 'package:openfoodfacts/openfoodfacts.dart'; import 'package:provider/provider.dart'; import 'package:shimmer/shimmer.dart'; import 'package:smooth_app/background/background_task_details.dart'; +import 'package:smooth_app/data_models/preferences/user_preferences.dart'; import 'package:smooth_app/data_models/up_to_date_mixin.dart'; import 'package:smooth_app/database/local_database.dart'; import 'package:smooth_app/database/transient_file.dart'; @@ -13,13 +16,16 @@ import 'package:smooth_app/generic_lib/loading_dialog.dart'; import 'package:smooth_app/generic_lib/widgets/picture_not_found.dart'; import 'package:smooth_app/helpers/analytics_helper.dart'; import 'package:smooth_app/helpers/product_cards_helper.dart'; +import 'package:smooth_app/helpers/provider_helper.dart'; import 'package:smooth_app/pages/image_crop_page.dart'; +import 'package:smooth_app/pages/preferences/user_preferences_dev_mode.dart'; import 'package:smooth_app/pages/product/common/product_refresher.dart'; import 'package:smooth_app/pages/product/edit_ocr/ocr_helper.dart'; import 'package:smooth_app/pages/product/explanation_widget.dart'; import 'package:smooth_app/pages/product/multilingual_helper.dart'; import 'package:smooth_app/pages/product/product_image_button.dart'; import 'package:smooth_app/themes/smooth_theme_colors.dart'; +import 'package:smooth_app/themes/theme_provider.dart'; import 'package:smooth_app/widgets/smooth_scaffold.dart'; part 'edit_ocr_main_action.dart'; @@ -295,17 +301,54 @@ class _EditOcrPageState extends State with UpToDateMixin { state: _extractState(transientFile), ), const SizedBox(height: MEDIUM_SPACE), - TextField( - controller: _controller, - decoration: InputDecoration( - fillColor: Colors.white.withOpacity(0.2), - filled: true, - enabledBorder: const OutlineInputBorder( - borderRadius: ANGULAR_BORDER_RADIUS, - ), - ), - maxLines: null, - textInputAction: TextInputAction.newline, + ConsumerFilter( + buildWhen: ( + UserPreferences? previousValue, + UserPreferences currentValue, + ) { + return previousValue?.getFlag(UserPreferencesDevMode + .userPreferencesFlagSpellCheckerOnOcr) != + currentValue.getFlag(UserPreferencesDevMode + .userPreferencesFlagSpellCheckerOnOcr); + }, + builder: ( + BuildContext context, + UserPreferences prefs, + Widget? child, + ) { + final ThemeData theme = Theme.of(context); + + return Theme( + data: theme.copyWith( + colorScheme: theme.colorScheme.copyWith( + onSurface: context + .read() + .isDarkMode(context) + ? Colors.white + : Colors.black, + ), + ), + child: TextField( + controller: _controller, + decoration: InputDecoration( + fillColor: Colors.white.withOpacity(0.2), + filled: true, + enabledBorder: const OutlineInputBorder( + borderRadius: ANGULAR_BORDER_RADIUS, + ), + ), + maxLines: null, + textInputAction: TextInputAction.newline, + spellCheckConfiguration: (prefs.getFlag( + UserPreferencesDevMode + .userPreferencesFlagSpellCheckerOnOcr) ?? + false) && + (Platform.isAndroid || Platform.isIOS) + ? const SpellCheckConfiguration() + : const SpellCheckConfiguration.disabled(), + ), + ); + }, ), const SizedBox(height: SMALL_SPACE), ExplanationWidget( From 7f8247cec144e73497f814c146f95953949ad606 Mon Sep 17 00:00:00 2001 From: Edouard Marquez Date: Wed, 19 Jun 2024 09:48:05 +0200 Subject: [PATCH 2/3] Code formatting --- .../pages/preferences/user_preferences_dev_mode.dart | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/packages/smooth_app/lib/pages/preferences/user_preferences_dev_mode.dart b/packages/smooth_app/lib/pages/preferences/user_preferences_dev_mode.dart index b8861c0ee32..e6d5df39262 100644 --- a/packages/smooth_app/lib/pages/preferences/user_preferences_dev_mode.dart +++ b/packages/smooth_app/lib/pages/preferences/user_preferences_dev_mode.dart @@ -333,12 +333,10 @@ class UserPreferencesDevMode extends AbstractUserPreferences { value: userPreferences.getFlag(userPreferencesFlagSpellCheckerOnOcr) ?? false, - onChanged: (bool value) async { - await userPreferences.setFlag( - userPreferencesFlagSpellCheckerOnOcr, - value, - ); - }, + onChanged: (bool value) => userPreferences.setFlag( + userPreferencesFlagSpellCheckerOnOcr, + value, + ), ), UserPreferencesItemSection( label: appLocalizations.dev_mode_section_experimental_features, From ce0877d31dcc98fab3017bdde9d63c4d726551a5 Mon Sep 17 00:00:00 2001 From: Edouard Marquez Date: Wed, 19 Jun 2024 10:05:18 +0200 Subject: [PATCH 3/3] Specify `async` on the callback of `onChanged` --- .../lib/pages/preferences/user_preferences_dev_mode.dart | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/smooth_app/lib/pages/preferences/user_preferences_dev_mode.dart b/packages/smooth_app/lib/pages/preferences/user_preferences_dev_mode.dart index e6d5df39262..b6b83651a91 100644 --- a/packages/smooth_app/lib/pages/preferences/user_preferences_dev_mode.dart +++ b/packages/smooth_app/lib/pages/preferences/user_preferences_dev_mode.dart @@ -333,7 +333,7 @@ class UserPreferencesDevMode extends AbstractUserPreferences { value: userPreferences.getFlag(userPreferencesFlagSpellCheckerOnOcr) ?? false, - onChanged: (bool value) => userPreferences.setFlag( + onChanged: (bool value) async => userPreferences.setFlag( userPreferencesFlagSpellCheckerOnOcr, value, ),