From abb57a9311590d6a52cc3c04131385ce3ad2de34 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ma=C3=ABl=20Chiotti?= <44336112+maelchiotti@users.noreply.github.com> Date: Sun, 4 Feb 2024 13:22:56 +0100 Subject: [PATCH] Add all files and adapt them for local use --- .github/workflows/dart.yaml | 38 + .gitignore | 48 + .metadata | 30 + LICENSE | 661 +++++++++ README.md | 49 + analysis_options.yaml | 7 + android/.gitignore | 13 + android/app/build.gradle | 77 ++ android/app/src/debug/AndroidManifest.xml | 7 + android/app/src/main/AndroidManifest.xml | 41 + .../app/FlutterMultiDexApplication.java | 25 + .../localmaterialnotes/MainActivity.kt | 6 + .../res/drawable-hdpi/android12splash.png | Bin 0 -> 11314 bytes .../app/src/main/res/drawable-hdpi/splash.png | Bin 0 -> 11314 bytes .../res/drawable-mdpi/android12splash.png | Bin 0 -> 6944 bytes .../app/src/main/res/drawable-mdpi/splash.png | Bin 0 -> 6944 bytes .../drawable-night-hdpi/android12splash.png | Bin 0 -> 11314 bytes .../main/res/drawable-night-hdpi/splash.png | Bin 0 -> 11314 bytes .../drawable-night-mdpi/android12splash.png | Bin 0 -> 6944 bytes .../main/res/drawable-night-mdpi/splash.png | Bin 0 -> 6944 bytes .../res/drawable-night-v21/background.png | Bin 0 -> 69 bytes .../drawable-night-v21/launch_background.xml | 9 + .../drawable-night-xhdpi/android12splash.png | Bin 0 -> 11728 bytes .../main/res/drawable-night-xhdpi/splash.png | Bin 0 -> 11728 bytes .../drawable-night-xxhdpi/android12splash.png | Bin 0 -> 18624 bytes .../main/res/drawable-night-xxhdpi/splash.png | Bin 0 -> 18624 bytes .../android12splash.png | Bin 0 -> 18956 bytes .../res/drawable-night-xxxhdpi/splash.png | Bin 0 -> 18956 bytes .../main/res/drawable-night/background.png | Bin 0 -> 69 bytes .../res/drawable-night/launch_background.xml | 9 + .../src/main/res/drawable-v21/background.png | Bin 0 -> 69 bytes .../res/drawable-v21/launch_background.xml | 9 + .../res/drawable-xhdpi/android12splash.png | Bin 0 -> 11728 bytes .../src/main/res/drawable-xhdpi/splash.png | Bin 0 -> 11728 bytes .../res/drawable-xxhdpi/android12splash.png | Bin 0 -> 18624 bytes .../src/main/res/drawable-xxhdpi/splash.png | Bin 0 -> 18624 bytes .../res/drawable-xxxhdpi/android12splash.png | Bin 0 -> 18956 bytes .../src/main/res/drawable-xxxhdpi/splash.png | Bin 0 -> 18956 bytes .../app/src/main/res/drawable/background.png | Bin 0 -> 69 bytes .../main/res/drawable/launch_background.xml | 9 + .../main/res/mipmap-hdpi/launcher_icon.png | Bin 0 -> 2151 bytes .../main/res/mipmap-mdpi/launcher_icon.png | Bin 0 -> 1465 bytes .../main/res/mipmap-xhdpi/launcher_icon.png | Bin 0 -> 2821 bytes .../main/res/mipmap-xxhdpi/launcher_icon.png | Bin 0 -> 4441 bytes .../main/res/mipmap-xxxhdpi/launcher_icon.png | Bin 0 -> 5965 bytes .../src/main/res/values-night-v31/styles.xml | 21 + .../app/src/main/res/values-night/styles.xml | 22 + .../app/src/main/res/values-v31/styles.xml | 21 + android/app/src/main/res/values/styles.xml | 22 + android/app/src/profile/AndroidManifest.xml | 7 + android/build.gradle | 30 + android/gradle.properties | 3 + .../gradle/wrapper/gradle-wrapper.properties | 5 + android/settings.gradle | 29 + assets/logos/icon.ico | Bin 0 -> 5274 bytes assets/logos/icon.png | Bin 0 -> 40336 bytes assets/logos/icon.svg | 16 + assets/logos/icon_full.png | Bin 0 -> 28287 bytes assets/logos/icon_full.svg | 16 + build.yaml | 7 + flutter_launcher_icons.yaml | 10 + flutter_native_splash.yaml | 16 + l10n.yaml | 6 + lib/app.dart | 82 ++ lib/common/actions/add.dart | 25 + lib/common/actions/back.dart | 16 + lib/common/actions/delete.dart | 98 ++ lib/common/actions/pin.dart | 18 + lib/common/actions/restore.dart | 45 + lib/common/actions/select.dart | 19 + lib/common/dialogs/confirmation_dialog.dart | 48 + lib/common/dialogs/information_dialog.dart | 24 + lib/common/fabs/fab_add_note.dart | 22 + lib/common/fabs/fab_empty_bin.dart | 20 + .../navigation/app_bars/back_app_bar.dart | 16 + .../app_bars/back_menu_app_bar.dart | 109 ++ .../navigation/app_bars/empty_app_bar.dart | 15 + .../navigation/app_bars/menu_options.dart | 44 + .../app_bars/search_sort_app_bar.dart | 139 ++ .../app_bars/selection_app_bar.dart | 117 ++ lib/common/navigation/side_navigation.dart | 97 ++ lib/common/navigation/top_navigation.dart | 57 + .../placeholders/empty_placeholder.dart | 51 + .../placeholders/error_placeholder.dart | 15 + .../placeholders/loading_placeholder.dart | 14 + lib/common/routing/router.dart | 105 ++ lib/common/routing/router_route.dart | 49 + lib/common/widgets/input_decorations.dart | 37 + lib/common/widgets/note_tile.dart | 189 +++ lib/l10n/app_en.arb | 134 ++ lib/l10n/app_fr.arb | 134 ++ lib/l10n/app_localizations.g.dart | 919 +++++++++++++ lib/l10n/app_localizations_en.g.dart | 449 ++++++ lib/l10n/app_localizations_fr.g.dart | 449 ++++++ lib/l10n/untranslated.txt | 1 + lib/main.dart | 33 + lib/models/note/note.dart | 107 ++ lib/models/note/note.g.dart | 1028 ++++++++++++++ lib/pages/bin/bin_page.dart | 51 + lib/pages/editor/about_sheet.dart | 39 + lib/pages/editor/editor_page.dart | 97 ++ lib/pages/notes/notes_page.dart | 59 + lib/pages/settings/interactions.dart | 164 +++ lib/pages/settings/settings_page.dart | 118 ++ lib/pages/settings/shortcut.dart | 29 + lib/providers/base_provider.dart | 5 + lib/providers/bin/bin_provider.dart | 109 ++ lib/providers/bin/bin_provider.g.dart | 24 + .../current_note/current_note_provider.dart | 22 + .../current_note/current_note_provider.g.dart | 24 + .../editor_controller_provider.dart | 22 + .../editor_controller_provider.g.dart | 26 + lib/providers/notes/notes_provider.dart | 110 ++ lib/providers/notes/notes_provider.g.dart | 25 + .../selection_mode_provider.dart | 19 + .../selection_mode_provider.g.dart | 25 + lib/utils/asset.dart | 12 + lib/utils/constants/constants.dart | 21 + lib/utils/constants/paddings.dart | 52 + lib/utils/constants/radiuses.dart | 18 + lib/utils/constants/separators.dart | 35 + lib/utils/constants/sizes.dart | 27 + lib/utils/database_manager.dart | 66 + .../extensions/date_time_extensions.dart | 15 + lib/utils/extensions/go_router_extension.dart | 12 + lib/utils/extensions/string_extension.dart | 7 + .../validators/string_validators.dart | 22 + lib/utils/locale_manager.dart | 42 + lib/utils/package_info_manager.dart | 19 + lib/utils/platform_manager.dart | 11 + lib/utils/preferences/confirmations.dart | 55 + lib/utils/preferences/preference_key.dart | 14 + .../preferences/preferences_manager.dart | 40 + lib/utils/preferences/sort_method.dart | 31 + lib/utils/quick_actions_manager.dart | 27 + lib/utils/share_manager.dart | 38 + lib/utils/snack_bar_manager.dart | 18 + lib/utils/theme_manager.dart | 132 ++ pubspec.lock | 1223 +++++++++++++++++ pubspec.yaml | 58 + test/starter_test.dart | 7 + 141 files changed, 8964 insertions(+) create mode 100644 .github/workflows/dart.yaml create mode 100644 .gitignore create mode 100644 .metadata create mode 100644 LICENSE create mode 100644 README.md create mode 100644 analysis_options.yaml create mode 100644 android/.gitignore create mode 100644 android/app/build.gradle create mode 100644 android/app/src/debug/AndroidManifest.xml create mode 100644 android/app/src/main/AndroidManifest.xml create mode 100644 android/app/src/main/java/io/flutter/app/FlutterMultiDexApplication.java create mode 100644 android/app/src/main/kotlin/com/maelchiotti/localmaterialnotes/MainActivity.kt create mode 100644 android/app/src/main/res/drawable-hdpi/android12splash.png create mode 100644 android/app/src/main/res/drawable-hdpi/splash.png create mode 100644 android/app/src/main/res/drawable-mdpi/android12splash.png create mode 100644 android/app/src/main/res/drawable-mdpi/splash.png create mode 100644 android/app/src/main/res/drawable-night-hdpi/android12splash.png create mode 100644 android/app/src/main/res/drawable-night-hdpi/splash.png create mode 100644 android/app/src/main/res/drawable-night-mdpi/android12splash.png create mode 100644 android/app/src/main/res/drawable-night-mdpi/splash.png create mode 100644 android/app/src/main/res/drawable-night-v21/background.png create mode 100644 android/app/src/main/res/drawable-night-v21/launch_background.xml create mode 100644 android/app/src/main/res/drawable-night-xhdpi/android12splash.png create mode 100644 android/app/src/main/res/drawable-night-xhdpi/splash.png create mode 100644 android/app/src/main/res/drawable-night-xxhdpi/android12splash.png create mode 100644 android/app/src/main/res/drawable-night-xxhdpi/splash.png create mode 100644 android/app/src/main/res/drawable-night-xxxhdpi/android12splash.png create mode 100644 android/app/src/main/res/drawable-night-xxxhdpi/splash.png create mode 100644 android/app/src/main/res/drawable-night/background.png create mode 100644 android/app/src/main/res/drawable-night/launch_background.xml create mode 100644 android/app/src/main/res/drawable-v21/background.png create mode 100644 android/app/src/main/res/drawable-v21/launch_background.xml create mode 100644 android/app/src/main/res/drawable-xhdpi/android12splash.png create mode 100644 android/app/src/main/res/drawable-xhdpi/splash.png create mode 100644 android/app/src/main/res/drawable-xxhdpi/android12splash.png create mode 100644 android/app/src/main/res/drawable-xxhdpi/splash.png create mode 100644 android/app/src/main/res/drawable-xxxhdpi/android12splash.png create mode 100644 android/app/src/main/res/drawable-xxxhdpi/splash.png create mode 100644 android/app/src/main/res/drawable/background.png create mode 100644 android/app/src/main/res/drawable/launch_background.xml create mode 100644 android/app/src/main/res/mipmap-hdpi/launcher_icon.png create mode 100644 android/app/src/main/res/mipmap-mdpi/launcher_icon.png create mode 100644 android/app/src/main/res/mipmap-xhdpi/launcher_icon.png create mode 100644 android/app/src/main/res/mipmap-xxhdpi/launcher_icon.png create mode 100644 android/app/src/main/res/mipmap-xxxhdpi/launcher_icon.png create mode 100644 android/app/src/main/res/values-night-v31/styles.xml create mode 100644 android/app/src/main/res/values-night/styles.xml create mode 100644 android/app/src/main/res/values-v31/styles.xml create mode 100644 android/app/src/main/res/values/styles.xml create mode 100644 android/app/src/profile/AndroidManifest.xml create mode 100644 android/build.gradle create mode 100644 android/gradle.properties create mode 100644 android/gradle/wrapper/gradle-wrapper.properties create mode 100644 android/settings.gradle create mode 100644 assets/logos/icon.ico create mode 100644 assets/logos/icon.png create mode 100644 assets/logos/icon.svg create mode 100644 assets/logos/icon_full.png create mode 100644 assets/logos/icon_full.svg create mode 100644 build.yaml create mode 100644 flutter_launcher_icons.yaml create mode 100644 flutter_native_splash.yaml create mode 100644 l10n.yaml create mode 100644 lib/app.dart create mode 100644 lib/common/actions/add.dart create mode 100644 lib/common/actions/back.dart create mode 100644 lib/common/actions/delete.dart create mode 100644 lib/common/actions/pin.dart create mode 100644 lib/common/actions/restore.dart create mode 100644 lib/common/actions/select.dart create mode 100644 lib/common/dialogs/confirmation_dialog.dart create mode 100644 lib/common/dialogs/information_dialog.dart create mode 100644 lib/common/fabs/fab_add_note.dart create mode 100644 lib/common/fabs/fab_empty_bin.dart create mode 100644 lib/common/navigation/app_bars/back_app_bar.dart create mode 100644 lib/common/navigation/app_bars/back_menu_app_bar.dart create mode 100644 lib/common/navigation/app_bars/empty_app_bar.dart create mode 100644 lib/common/navigation/app_bars/menu_options.dart create mode 100644 lib/common/navigation/app_bars/search_sort_app_bar.dart create mode 100644 lib/common/navigation/app_bars/selection_app_bar.dart create mode 100644 lib/common/navigation/side_navigation.dart create mode 100644 lib/common/navigation/top_navigation.dart create mode 100644 lib/common/placeholders/empty_placeholder.dart create mode 100644 lib/common/placeholders/error_placeholder.dart create mode 100644 lib/common/placeholders/loading_placeholder.dart create mode 100644 lib/common/routing/router.dart create mode 100644 lib/common/routing/router_route.dart create mode 100644 lib/common/widgets/input_decorations.dart create mode 100644 lib/common/widgets/note_tile.dart create mode 100644 lib/l10n/app_en.arb create mode 100644 lib/l10n/app_fr.arb create mode 100644 lib/l10n/app_localizations.g.dart create mode 100644 lib/l10n/app_localizations_en.g.dart create mode 100644 lib/l10n/app_localizations_fr.g.dart create mode 100644 lib/l10n/untranslated.txt create mode 100644 lib/main.dart create mode 100644 lib/models/note/note.dart create mode 100644 lib/models/note/note.g.dart create mode 100644 lib/pages/bin/bin_page.dart create mode 100644 lib/pages/editor/about_sheet.dart create mode 100644 lib/pages/editor/editor_page.dart create mode 100644 lib/pages/notes/notes_page.dart create mode 100644 lib/pages/settings/interactions.dart create mode 100644 lib/pages/settings/settings_page.dart create mode 100644 lib/pages/settings/shortcut.dart create mode 100644 lib/providers/base_provider.dart create mode 100644 lib/providers/bin/bin_provider.dart create mode 100644 lib/providers/bin/bin_provider.g.dart create mode 100644 lib/providers/current_note/current_note_provider.dart create mode 100644 lib/providers/current_note/current_note_provider.g.dart create mode 100644 lib/providers/editor_controller/editor_controller_provider.dart create mode 100644 lib/providers/editor_controller/editor_controller_provider.g.dart create mode 100644 lib/providers/notes/notes_provider.dart create mode 100644 lib/providers/notes/notes_provider.g.dart create mode 100644 lib/providers/selection_mode/selection_mode_provider.dart create mode 100644 lib/providers/selection_mode/selection_mode_provider.g.dart create mode 100644 lib/utils/asset.dart create mode 100644 lib/utils/constants/constants.dart create mode 100644 lib/utils/constants/paddings.dart create mode 100644 lib/utils/constants/radiuses.dart create mode 100644 lib/utils/constants/separators.dart create mode 100644 lib/utils/constants/sizes.dart create mode 100644 lib/utils/database_manager.dart create mode 100644 lib/utils/extensions/date_time_extensions.dart create mode 100644 lib/utils/extensions/go_router_extension.dart create mode 100644 lib/utils/extensions/string_extension.dart create mode 100644 lib/utils/extensions/validators/string_validators.dart create mode 100644 lib/utils/locale_manager.dart create mode 100644 lib/utils/package_info_manager.dart create mode 100644 lib/utils/platform_manager.dart create mode 100644 lib/utils/preferences/confirmations.dart create mode 100644 lib/utils/preferences/preference_key.dart create mode 100644 lib/utils/preferences/preferences_manager.dart create mode 100644 lib/utils/preferences/sort_method.dart create mode 100644 lib/utils/quick_actions_manager.dart create mode 100644 lib/utils/share_manager.dart create mode 100644 lib/utils/snack_bar_manager.dart create mode 100644 lib/utils/theme_manager.dart create mode 100644 pubspec.lock create mode 100644 pubspec.yaml create mode 100644 test/starter_test.dart diff --git a/.github/workflows/dart.yaml b/.github/workflows/dart.yaml new file mode 100644 index 00000000..807be7ab --- /dev/null +++ b/.github/workflows/dart.yaml @@ -0,0 +1,38 @@ +name: Dart + +on: [ push, pull_request ] + +permissions: read-all + +jobs: + lint: + name: Lint + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v3 + - uses: subosito/flutter-action@v2 + with: + channel: 'stable' + - run: | + flutter pub get + dart analyze --fatal-infos + + format: + name: Format + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v3 + - uses: subosito/flutter-action@v2 + with: + channel: 'stable' + - run: dart format -l 120 --set-exit-if-changed ./lib ./test + + test: + name: Test + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v3 + - uses: subosito/flutter-action@v2 + with: + channel: 'stable' + - run: flutter test diff --git a/.gitignore b/.gitignore new file mode 100644 index 00000000..24adcb22 --- /dev/null +++ b/.gitignore @@ -0,0 +1,48 @@ +# Miscellaneous +*.class +*.log +*.pyc +*.swp +.DS_Store +.atom/ +.buildlog/ +.history +.svn/ +migrate_working_dir/ + +# IntelliJ related +*.iml +*.ipr +*.iws +.idea/ + +# The .vscode folder contains launch configuration and tasks you configure in +# VS Code which you may wish to be included in version control, so this line +# is commented out by default. +#.vscode/ + +# Flutter/Dart/Pub related +**/doc/api/ +**/ios/Flutter/.last_build_id +.dart_tool/ +.flutter-plugins +.flutter-plugins-dependencies +.packages +.pub-cache/ +.pub/ +/build/ + +# Symbolication related +app.*.symbols + +# Obfuscation related +app.*.map.json + +# Android Studio will place build artifacts here +/android/app/debug +/android/app/profile +/android/app/release + +# Distribution +*.iss +/dist/ \ No newline at end of file diff --git a/.metadata b/.metadata new file mode 100644 index 00000000..5014a98d --- /dev/null +++ b/.metadata @@ -0,0 +1,30 @@ +# This file tracks properties of this Flutter project. +# Used by Flutter tool to assess capabilities and perform upgrades etc. +# +# This file should be version controlled and should not be manually edited. + +version: + revision: "2e9cb0aa71a386a91f73f7088d115c0d96654829" + channel: "stable" + +project_type: app + +# Tracks metadata for the flutter migrate command +migration: + platforms: + - platform: root + create_revision: 2e9cb0aa71a386a91f73f7088d115c0d96654829 + base_revision: 2e9cb0aa71a386a91f73f7088d115c0d96654829 + - platform: web + create_revision: 2e9cb0aa71a386a91f73f7088d115c0d96654829 + base_revision: 2e9cb0aa71a386a91f73f7088d115c0d96654829 + + # User provided section + + # List of Local paths (relative to this file) that should be + # ignored by the migrate tool. + # + # Files that are not part of the templates will be ignored by default. + unmanaged_files: + - 'lib/main.dart' + - 'ios/Runner.xcodeproj/project.pbxproj' diff --git a/LICENSE b/LICENSE new file mode 100644 index 00000000..0ad25db4 --- /dev/null +++ b/LICENSE @@ -0,0 +1,661 @@ + GNU AFFERO GENERAL PUBLIC LICENSE + Version 3, 19 November 2007 + + Copyright (C) 2007 Free Software Foundation, Inc. + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The GNU Affero General Public License is a free, copyleft license for +software and other kinds of works, specifically designed to ensure +cooperation with the community in the case of network server software. + + The licenses for most software and other practical works are designed +to take away your freedom to share and change the works. By contrast, +our General Public Licenses are intended to guarantee your freedom to +share and change all versions of a program--to make sure it remains free +software for all its users. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +them if you wish), that you receive source code or can get it if you +want it, that you can change the software or use pieces of it in new +free programs, and that you know you can do these things. + + Developers that use our General Public Licenses protect your rights +with two steps: (1) assert copyright on the software, and (2) offer +you this License which gives you legal permission to copy, distribute +and/or modify the software. + + A secondary benefit of defending all users' freedom is that +improvements made in alternate versions of the program, if they +receive widespread use, become available for other developers to +incorporate. Many developers of free software are heartened and +encouraged by the resulting cooperation. However, in the case of +software used on network servers, this result may fail to come about. +The GNU General Public License permits making a modified version and +letting the public access it on a server without ever releasing its +source code to the public. + + The GNU Affero General Public License is designed specifically to +ensure that, in such cases, the modified source code becomes available +to the community. It requires the operator of a network server to +provide the source code of the modified version running there to the +users of that server. Therefore, public use of a modified version, on +a publicly accessible server, gives the public access to the source +code of the modified version. + + An older license, called the Affero General Public License and +published by Affero, was designed to accomplish similar goals. This is +a different license, not a version of the Affero GPL, but Affero has +released a new version of the Affero GPL which permits relicensing under +this license. + + The precise terms and conditions for copying, distribution and +modification follow. + + TERMS AND CONDITIONS + + 0. Definitions. + + "This License" refers to version 3 of the GNU Affero General Public License. + + "Copyright" also means copyright-like laws that apply to other kinds of +works, such as semiconductor masks. + + "The Program" refers to any copyrightable work licensed under this +License. Each licensee is addressed as "you". "Licensees" and +"recipients" may be individuals or organizations. + + To "modify" a work means to copy from or adapt all or part of the work +in a fashion requiring copyright permission, other than the making of an +exact copy. The resulting work is called a "modified version" of the +earlier work or a work "based on" the earlier work. + + A "covered work" means either the unmodified Program or a work based +on the Program. + + To "propagate" a work means to do anything with it that, without +permission, would make you directly or secondarily liable for +infringement under applicable copyright law, except executing it on a +computer or modifying a private copy. Propagation includes copying, +distribution (with or without modification), making available to the +public, and in some countries other activities as well. + + To "convey" a work means any kind of propagation that enables other +parties to make or receive copies. Mere interaction with a user through +a computer network, with no transfer of a copy, is not conveying. + + An interactive user interface displays "Appropriate Legal Notices" +to the extent that it includes a convenient and prominently visible +feature that (1) displays an appropriate copyright notice, and (2) +tells the user that there is no warranty for the work (except to the +extent that warranties are provided), that licensees may convey the +work under this License, and how to view a copy of this License. If +the interface presents a list of user commands or options, such as a +menu, a prominent item in the list meets this criterion. + + 1. Source Code. + + The "source code" for a work means the preferred form of the work +for making modifications to it. "Object code" means any non-source +form of a work. + + A "Standard Interface" means an interface that either is an official +standard defined by a recognized standards body, or, in the case of +interfaces specified for a particular programming language, one that +is widely used among developers working in that language. + + The "System Libraries" of an executable work include anything, other +than the work as a whole, that (a) is included in the normal form of +packaging a Major Component, but which is not part of that Major +Component, and (b) serves only to enable use of the work with that +Major Component, or to implement a Standard Interface for which an +implementation is available to the public in source code form. A +"Major Component", in this context, means a major essential component +(kernel, window system, and so on) of the specific operating system +(if any) on which the executable work runs, or a compiler used to +produce the work, or an object code interpreter used to run it. + + The "Corresponding Source" for a work in object code form means all +the source code needed to generate, install, and (for an executable +work) run the object code and to modify the work, including scripts to +control those activities. However, it does not include the work's +System Libraries, or general-purpose tools or generally available free +programs which are used unmodified in performing those activities but +which are not part of the work. For example, Corresponding Source +includes interface definition files associated with source files for +the work, and the source code for shared libraries and dynamically +linked subprograms that the work is specifically designed to require, +such as by intimate data communication or control flow between those +subprograms and other parts of the work. + + The Corresponding Source need not include anything that users +can regenerate automatically from other parts of the Corresponding +Source. + + The Corresponding Source for a work in source code form is that +same work. + + 2. Basic Permissions. + + All rights granted under this License are granted for the term of +copyright on the Program, and are irrevocable provided the stated +conditions are met. This License explicitly affirms your unlimited +permission to run the unmodified Program. The output from running a +covered work is covered by this License only if the output, given its +content, constitutes a covered work. This License acknowledges your +rights of fair use or other equivalent, as provided by copyright law. + + You may make, run and propagate covered works that you do not +convey, without conditions so long as your license otherwise remains +in force. You may convey covered works to others for the sole purpose +of having them make modifications exclusively for you, or provide you +with facilities for running those works, provided that you comply with +the terms of this License in conveying all material for which you do +not control copyright. Those thus making or running the covered works +for you must do so exclusively on your behalf, under your direction +and control, on terms that prohibit them from making any copies of +your copyrighted material outside their relationship with you. + + Conveying under any other circumstances is permitted solely under +the conditions stated below. Sublicensing is not allowed; section 10 +makes it unnecessary. + + 3. Protecting Users' Legal Rights From Anti-Circumvention Law. + + No covered work shall be deemed part of an effective technological +measure under any applicable law fulfilling obligations under article +11 of the WIPO copyright treaty adopted on 20 December 1996, or +similar laws prohibiting or restricting circumvention of such +measures. + + When you convey a covered work, you waive any legal power to forbid +circumvention of technological measures to the extent such circumvention +is effected by exercising rights under this License with respect to +the covered work, and you disclaim any intention to limit operation or +modification of the work as a means of enforcing, against the work's +users, your or third parties' legal rights to forbid circumvention of +technological measures. + + 4. Conveying Verbatim Copies. + + You may convey verbatim copies of the Program's source code as you +receive it, in any medium, provided that you conspicuously and +appropriately publish on each copy an appropriate copyright notice; +keep intact all notices stating that this License and any +non-permissive terms added in accord with section 7 apply to the code; +keep intact all notices of the absence of any warranty; and give all +recipients a copy of this License along with the Program. + + You may charge any price or no price for each copy that you convey, +and you may offer support or warranty protection for a fee. + + 5. Conveying Modified Source Versions. + + You may convey a work based on the Program, or the modifications to +produce it from the Program, in the form of source code under the +terms of section 4, provided that you also meet all of these conditions: + + a) The work must carry prominent notices stating that you modified + it, and giving a relevant date. + + b) The work must carry prominent notices stating that it is + released under this License and any conditions added under section + 7. This requirement modifies the requirement in section 4 to + "keep intact all notices". + + c) You must license the entire work, as a whole, under this + License to anyone who comes into possession of a copy. This + License will therefore apply, along with any applicable section 7 + additional terms, to the whole of the work, and all its parts, + regardless of how they are packaged. This License gives no + permission to license the work in any other way, but it does not + invalidate such permission if you have separately received it. + + d) If the work has interactive user interfaces, each must display + Appropriate Legal Notices; however, if the Program has interactive + interfaces that do not display Appropriate Legal Notices, your + work need not make them do so. + + A compilation of a covered work with other separate and independent +works, which are not by their nature extensions of the covered work, +and which are not combined with it such as to form a larger program, +in or on a volume of a storage or distribution medium, is called an +"aggregate" if the compilation and its resulting copyright are not +used to limit the access or legal rights of the compilation's users +beyond what the individual works permit. Inclusion of a covered work +in an aggregate does not cause this License to apply to the other +parts of the aggregate. + + 6. Conveying Non-Source Forms. + + You may convey a covered work in object code form under the terms +of sections 4 and 5, provided that you also convey the +machine-readable Corresponding Source under the terms of this License, +in one of these ways: + + a) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by the + Corresponding Source fixed on a durable physical medium + customarily used for software interchange. + + b) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by a + written offer, valid for at least three years and valid for as + long as you offer spare parts or customer support for that product + model, to give anyone who possesses the object code either (1) a + copy of the Corresponding Source for all the software in the + product that is covered by this License, on a durable physical + medium customarily used for software interchange, for a price no + more than your reasonable cost of physically performing this + conveying of source, or (2) access to copy the + Corresponding Source from a network server at no charge. + + c) Convey individual copies of the object code with a copy of the + written offer to provide the Corresponding Source. This + alternative is allowed only occasionally and noncommercially, and + only if you received the object code with such an offer, in accord + with subsection 6b. + + d) Convey the object code by offering access from a designated + place (gratis or for a charge), and offer equivalent access to the + Corresponding Source in the same way through the same place at no + further charge. You need not require recipients to copy the + Corresponding Source along with the object code. If the place to + copy the object code is a network server, the Corresponding Source + may be on a different server (operated by you or a third party) + that supports equivalent copying facilities, provided you maintain + clear directions next to the object code saying where to find the + Corresponding Source. Regardless of what server hosts the + Corresponding Source, you remain obligated to ensure that it is + available for as long as needed to satisfy these requirements. + + e) Convey the object code using peer-to-peer transmission, provided + you inform other peers where the object code and Corresponding + Source of the work are being offered to the general public at no + charge under subsection 6d. + + A separable portion of the object code, whose source code is excluded +from the Corresponding Source as a System Library, need not be +included in conveying the object code work. + + A "User Product" is either (1) a "consumer product", which means any +tangible personal property which is normally used for personal, family, +or household purposes, or (2) anything designed or sold for incorporation +into a dwelling. In determining whether a product is a consumer product, +doubtful cases shall be resolved in favor of coverage. For a particular +product received by a particular user, "normally used" refers to a +typical or common use of that class of product, regardless of the status +of the particular user or of the way in which the particular user +actually uses, or expects or is expected to use, the product. A product +is a consumer product regardless of whether the product has substantial +commercial, industrial or non-consumer uses, unless such uses represent +the only significant mode of use of the product. + + "Installation Information" for a User Product means any methods, +procedures, authorization keys, or other information required to install +and execute modified versions of a covered work in that User Product from +a modified version of its Corresponding Source. The information must +suffice to ensure that the continued functioning of the modified object +code is in no case prevented or interfered with solely because +modification has been made. + + If you convey an object code work under this section in, or with, or +specifically for use in, a User Product, and the conveying occurs as +part of a transaction in which the right of possession and use of the +User Product is transferred to the recipient in perpetuity or for a +fixed term (regardless of how the transaction is characterized), the +Corresponding Source conveyed under this section must be accompanied +by the Installation Information. But this requirement does not apply +if neither you nor any third party retains the ability to install +modified object code on the User Product (for example, the work has +been installed in ROM). + + The requirement to provide Installation Information does not include a +requirement to continue to provide support service, warranty, or updates +for a work that has been modified or installed by the recipient, or for +the User Product in which it has been modified or installed. Access to a +network may be denied when the modification itself materially and +adversely affects the operation of the network or violates the rules and +protocols for communication across the network. + + Corresponding Source conveyed, and Installation Information provided, +in accord with this section must be in a format that is publicly +documented (and with an implementation available to the public in +source code form), and must require no special password or key for +unpacking, reading or copying. + + 7. Additional Terms. + + "Additional permissions" are terms that supplement the terms of this +License by making exceptions from one or more of its conditions. +Additional permissions that are applicable to the entire Program shall +be treated as though they were included in this License, to the extent +that they are valid under applicable law. If additional permissions +apply only to part of the Program, that part may be used separately +under those permissions, but the entire Program remains governed by +this License without regard to the additional permissions. + + When you convey a copy of a covered work, you may at your option +remove any additional permissions from that copy, or from any part of +it. (Additional permissions may be written to require their own +removal in certain cases when you modify the work.) You may place +additional permissions on material, added by you to a covered work, +for which you have or can give appropriate copyright permission. + + Notwithstanding any other provision of this License, for material you +add to a covered work, you may (if authorized by the copyright holders of +that material) supplement the terms of this License with terms: + + a) Disclaiming warranty or limiting liability differently from the + terms of sections 15 and 16 of this License; or + + b) Requiring preservation of specified reasonable legal notices or + author attributions in that material or in the Appropriate Legal + Notices displayed by works containing it; or + + c) Prohibiting misrepresentation of the origin of that material, or + requiring that modified versions of such material be marked in + reasonable ways as different from the original version; or + + d) Limiting the use for publicity purposes of names of licensors or + authors of the material; or + + e) Declining to grant rights under trademark law for use of some + trade names, trademarks, or service marks; or + + f) Requiring indemnification of licensors and authors of that + material by anyone who conveys the material (or modified versions of + it) with contractual assumptions of liability to the recipient, for + any liability that these contractual assumptions directly impose on + those licensors and authors. + + All other non-permissive additional terms are considered "further +restrictions" within the meaning of section 10. If the Program as you +received it, or any part of it, contains a notice stating that it is +governed by this License along with a term that is a further +restriction, you may remove that term. If a license document contains +a further restriction but permits relicensing or conveying under this +License, you may add to a covered work material governed by the terms +of that license document, provided that the further restriction does +not survive such relicensing or conveying. + + If you add terms to a covered work in accord with this section, you +must place, in the relevant source files, a statement of the +additional terms that apply to those files, or a notice indicating +where to find the applicable terms. + + Additional terms, permissive or non-permissive, may be stated in the +form of a separately written license, or stated as exceptions; +the above requirements apply either way. + + 8. Termination. + + You may not propagate or modify a covered work except as expressly +provided under this License. Any attempt otherwise to propagate or +modify it is void, and will automatically terminate your rights under +this License (including any patent licenses granted under the third +paragraph of section 11). + + However, if you cease all violation of this License, then your +license from a particular copyright holder is reinstated (a) +provisionally, unless and until the copyright holder explicitly and +finally terminates your license, and (b) permanently, if the copyright +holder fails to notify you of the violation by some reasonable means +prior to 60 days after the cessation. + + Moreover, your license from a particular copyright holder is +reinstated permanently if the copyright holder notifies you of the +violation by some reasonable means, this is the first time you have +received notice of violation of this License (for any work) from that +copyright holder, and you cure the violation prior to 30 days after +your receipt of the notice. + + Termination of your rights under this section does not terminate the +licenses of parties who have received copies or rights from you under +this License. If your rights have been terminated and not permanently +reinstated, you do not qualify to receive new licenses for the same +material under section 10. + + 9. Acceptance Not Required for Having Copies. + + You are not required to accept this License in order to receive or +run a copy of the Program. Ancillary propagation of a covered work +occurring solely as a consequence of using peer-to-peer transmission +to receive a copy likewise does not require acceptance. However, +nothing other than this License grants you permission to propagate or +modify any covered work. These actions infringe copyright if you do +not accept this License. Therefore, by modifying or propagating a +covered work, you indicate your acceptance of this License to do so. + + 10. Automatic Licensing of Downstream Recipients. + + Each time you convey a covered work, the recipient automatically +receives a license from the original licensors, to run, modify and +propagate that work, subject to this License. You are not responsible +for enforcing compliance by third parties with this License. + + An "entity transaction" is a transaction transferring control of an +organization, or substantially all assets of one, or subdividing an +organization, or merging organizations. If propagation of a covered +work results from an entity transaction, each party to that +transaction who receives a copy of the work also receives whatever +licenses to the work the party's predecessor in interest had or could +give under the previous paragraph, plus a right to possession of the +Corresponding Source of the work from the predecessor in interest, if +the predecessor has it or can get it with reasonable efforts. + + You may not impose any further restrictions on the exercise of the +rights granted or affirmed under this License. For example, you may +not impose a license fee, royalty, or other charge for exercise of +rights granted under this License, and you may not initiate litigation +(including a cross-claim or counterclaim in a lawsuit) alleging that +any patent claim is infringed by making, using, selling, offering for +sale, or importing the Program or any portion of it. + + 11. Patents. + + A "contributor" is a copyright holder who authorizes use under this +License of the Program or a work on which the Program is based. The +work thus licensed is called the contributor's "contributor version". + + A contributor's "essential patent claims" are all patent claims +owned or controlled by the contributor, whether already acquired or +hereafter acquired, that would be infringed by some manner, permitted +by this License, of making, using, or selling its contributor version, +but do not include claims that would be infringed only as a +consequence of further modification of the contributor version. For +purposes of this definition, "control" includes the right to grant +patent sublicenses in a manner consistent with the requirements of +this License. + + Each contributor grants you a non-exclusive, worldwide, royalty-free +patent license under the contributor's essential patent claims, to +make, use, sell, offer for sale, import and otherwise run, modify and +propagate the contents of its contributor version. + + In the following three paragraphs, a "patent license" is any express +agreement or commitment, however denominated, not to enforce a patent +(such as an express permission to practice a patent or covenant not to +sue for patent infringement). To "grant" such a patent license to a +party means to make such an agreement or commitment not to enforce a +patent against the party. + + If you convey a covered work, knowingly relying on a patent license, +and the Corresponding Source of the work is not available for anyone +to copy, free of charge and under the terms of this License, through a +publicly available network server or other readily accessible means, +then you must either (1) cause the Corresponding Source to be so +available, or (2) arrange to deprive yourself of the benefit of the +patent license for this particular work, or (3) arrange, in a manner +consistent with the requirements of this License, to extend the patent +license to downstream recipients. "Knowingly relying" means you have +actual knowledge that, but for the patent license, your conveying the +covered work in a country, or your recipient's use of the covered work +in a country, would infringe one or more identifiable patents in that +country that you have reason to believe are valid. + + If, pursuant to or in connection with a single transaction or +arrangement, you convey, or propagate by procuring conveyance of, a +covered work, and grant a patent license to some of the parties +receiving the covered work authorizing them to use, propagate, modify +or convey a specific copy of the covered work, then the patent license +you grant is automatically extended to all recipients of the covered +work and works based on it. + + A patent license is "discriminatory" if it does not include within +the scope of its coverage, prohibits the exercise of, or is +conditioned on the non-exercise of one or more of the rights that are +specifically granted under this License. You may not convey a covered +work if you are a party to an arrangement with a third party that is +in the business of distributing software, under which you make payment +to the third party based on the extent of your activity of conveying +the work, and under which the third party grants, to any of the +parties who would receive the covered work from you, a discriminatory +patent license (a) in connection with copies of the covered work +conveyed by you (or copies made from those copies), or (b) primarily +for and in connection with specific products or compilations that +contain the covered work, unless you entered into that arrangement, +or that patent license was granted, prior to 28 March 2007. + + Nothing in this License shall be construed as excluding or limiting +any implied license or other defenses to infringement that may +otherwise be available to you under applicable patent law. + + 12. No Surrender of Others' Freedom. + + If conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot convey a +covered work so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you may +not convey it at all. For example, if you agree to terms that obligate you +to collect a royalty for further conveying from those to whom you convey +the Program, the only way you could satisfy both those terms and this +License would be to refrain entirely from conveying the Program. + + 13. Remote Network Interaction; Use with the GNU General Public License. + + Notwithstanding any other provision of this License, if you modify the +Program, your modified version must prominently offer all users +interacting with it remotely through a computer network (if your version +supports such interaction) an opportunity to receive the Corresponding +Source of your version by providing access to the Corresponding Source +from a network server at no charge, through some standard or customary +means of facilitating copying of software. This Corresponding Source +shall include the Corresponding Source for any work covered by version 3 +of the GNU General Public License that is incorporated pursuant to the +following paragraph. + + Notwithstanding any other provision of this License, you have +permission to link or combine any covered work with a work licensed +under version 3 of the GNU General Public License into a single +combined work, and to convey the resulting work. The terms of this +License will continue to apply to the part which is the covered work, +but the work with which it is combined will remain governed by version +3 of the GNU General Public License. + + 14. Revised Versions of this License. + + The Free Software Foundation may publish revised and/or new versions of +the GNU Affero General Public License from time to time. Such new versions +will be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + + Each version is given a distinguishing version number. If the +Program specifies that a certain numbered version of the GNU Affero General +Public License "or any later version" applies to it, you have the +option of following the terms and conditions either of that numbered +version or of any later version published by the Free Software +Foundation. If the Program does not specify a version number of the +GNU Affero General Public License, you may choose any version ever published +by the Free Software Foundation. + + If the Program specifies that a proxy can decide which future +versions of the GNU Affero General Public License can be used, that proxy's +public statement of acceptance of a version permanently authorizes you +to choose that version for the Program. + + Later license versions may give you additional or different +permissions. However, no additional obligations are imposed on any +author or copyright holder as a result of your choosing to follow a +later version. + + 15. Disclaimer of Warranty. + + THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY +APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT +HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY +OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, +THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM +IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF +ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + + 16. Limitation of Liability. + + IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS +THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY +GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE +USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF +DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD +PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), +EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF +SUCH DAMAGES. + + 17. Interpretation of Sections 15 and 16. + + If the disclaimer of warranty and limitation of liability provided +above cannot be given local legal effect according to their terms, +reviewing courts shall apply local law that most closely approximates +an absolute waiver of all civil liability in connection with the +Program, unless a warranty or assumption of liability accompanies a +copy of the Program in return for a fee. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Programs + + If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + + To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +state the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + + Copyright (C) + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU Affero General Public License as published + by the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU Affero General Public License for more details. + + You should have received a copy of the GNU Affero General Public License + along with this program. If not, see . + +Also add information on how to contact you by electronic and paper mail. + + If your software can interact with users remotely through a computer +network, you should also make sure that it provides a way for users to +get its source. For example, if your program is a web application, its +interface could display a "Source" link that leads users to an archive +of the code. There are many ways you could offer source, and different +solutions will be better for different programs; see section 13 for the +specific requirements. + + You should also get your employer (if you work as a programmer) or school, +if any, to sign a "copyright disclaimer" for the program, if necessary. +For more information on this, and how to apply and follow the GNU AGPL, see +. diff --git a/README.md b/README.md new file mode 100644 index 00000000..58d2e0e1 --- /dev/null +++ b/README.md @@ -0,0 +1,49 @@ +
+ +![Platforms](https://img.shields.io/badge/Platforms-Android-blue) +[![Style](https://img.shields.io/badge/Style-lint-blue)](https://pub.dev/packages/lint) + +[![License](https://img.shields.io/github/license/maelchiotti/LocalMaterialNotes)](https://github.com/maelchiotti/LocalMaterialNotes/blob/main/LICENSE) +[![Releases](https://img.shields.io/github/v/release/maelchiotti/LocalMaterialNotes)](https://github.com/maelchiotti/LocalMaterialNotes/releases) +[![Issues](https://img.shields.io/github/issues/maelchiotti/LocalMaterialNotes)](https://github.com/maelchiotti/LocalMaterialNotes/issues) + +
+ +# Local Material Notes + +Simple, local, material design notes. + +## Features + +### Take notes + +- Write text notes (title + content) +- Add checklists along the normal text +- Use the quick action from your home screen to quickly add a note +- Share text from other applications to add it directly to a note +- Share your notes as text + +### Organize + +- Search though your notes +- Sort your notes by date or title, in ascending or descending order +- Pin your notes +- Recover your deleted notes from the bin + +### Customize + +- Choose your theme (light, dark or black) +- Choose if you want your theme to be dynamic (use colors from your system, if supported) +- Choose your language (see the [supported ones](#supported-languages)) + +## Supported languages + +- English: 100% +- French: 100% + +--- + +## Enhancements + +- Highlight search terms in the title/content of the list tiles in the search view: [Highlightable](https://pub.dev/packages/highlightable) could work great for this, but if the text to highlight isn't in the first 3 lines then it is not shown. +- Better search: Improve the search to be more effective than the current `contains()`. diff --git a/analysis_options.yaml b/analysis_options.yaml new file mode 100644 index 00000000..dc072a0f --- /dev/null +++ b/analysis_options.yaml @@ -0,0 +1,7 @@ +include: package:lint/strict.yaml + +analyzer: + exclude: + - '**.g.dart' + plugins: + - custom_lint \ No newline at end of file diff --git a/android/.gitignore b/android/.gitignore new file mode 100644 index 00000000..6f568019 --- /dev/null +++ b/android/.gitignore @@ -0,0 +1,13 @@ +gradle-wrapper.jar +/.gradle +/captures/ +/gradlew +/gradlew.bat +/local.properties +GeneratedPluginRegistrant.java + +# Remember to never publicly share your keystore. +# See https://flutter.dev/docs/deployment/android#reference-the-keystore-from-the-app +key.properties +**/*.keystore +**/*.jks diff --git a/android/app/build.gradle b/android/app/build.gradle new file mode 100644 index 00000000..4f3355a6 --- /dev/null +++ b/android/app/build.gradle @@ -0,0 +1,77 @@ +plugins { + id "com.android.application" + id "kotlin-android" + id "dev.flutter.flutter-gradle-plugin" +} + +def localProperties = new Properties() +def localPropertiesFile = rootProject.file('local.properties') +if (localPropertiesFile.exists()) { + localPropertiesFile.withReader('UTF-8') { reader -> + localProperties.load(reader) + } +} + +def keystoreProperties = new Properties() +def keystorePropertiesFile = rootProject.file('key.properties') +if (keystorePropertiesFile.exists()) { + keystoreProperties.load(new FileInputStream(keystorePropertiesFile)) +} + +def flutterVersionCode = localProperties.getProperty('flutter.versionCode') +if (flutterVersionCode == null) { + flutterVersionCode = '1' +} + +def flutterVersionName = localProperties.getProperty('flutter.versionName') +if (flutterVersionName == null) { + flutterVersionName = '1.0' +} + +android { + namespace "com.maelchiotti.localmaterialnotes" + compileSdkVersion 34 + ndkVersion flutter.ndkVersion + + compileOptions { + sourceCompatibility JavaVersion.VERSION_1_8 + targetCompatibility JavaVersion.VERSION_1_8 + } + + kotlinOptions { + jvmTarget = '1.8' + } + + sourceSets { + main.java.srcDirs += 'src/main/kotlin' + } + + defaultConfig { + applicationId "com.maelchiotti.localmaterialnotes" + minSdkVersion flutter.minSdkVersion + targetSdkVersion flutter.targetSdkVersion + versionCode flutterVersionCode.toInteger() + versionName flutterVersionName + } + + signingConfigs { + release { + keyAlias keystoreProperties['keyAlias'] + keyPassword keystoreProperties['keyPassword'] + storeFile keystoreProperties['storeFile'] ? file(keystoreProperties['storeFile']) : null + storePassword keystoreProperties['storePassword'] + } + } + + buildTypes { + release { + signingConfig signingConfigs.release + } + } +} + +flutter { + source '../..' +} + +dependencies {} diff --git a/android/app/src/debug/AndroidManifest.xml b/android/app/src/debug/AndroidManifest.xml new file mode 100644 index 00000000..399f6981 --- /dev/null +++ b/android/app/src/debug/AndroidManifest.xml @@ -0,0 +1,7 @@ + + + + diff --git a/android/app/src/main/AndroidManifest.xml b/android/app/src/main/AndroidManifest.xml new file mode 100644 index 00000000..75fce53c --- /dev/null +++ b/android/app/src/main/AndroidManifest.xml @@ -0,0 +1,41 @@ + + + + + + + + + + + + + + + + + + + + + + + diff --git a/android/app/src/main/java/io/flutter/app/FlutterMultiDexApplication.java b/android/app/src/main/java/io/flutter/app/FlutterMultiDexApplication.java new file mode 100644 index 00000000..752fc185 --- /dev/null +++ b/android/app/src/main/java/io/flutter/app/FlutterMultiDexApplication.java @@ -0,0 +1,25 @@ +// Generated file. +// +// If you wish to remove Flutter's multidex support, delete this entire file. +// +// Modifications to this file should be done in a copy under a different name +// as this file may be regenerated. + +package io.flutter.app; + +import android.app.Application; +import android.content.Context; +import androidx.annotation.CallSuper; +import androidx.multidex.MultiDex; + +/** + * Extension of {@link android.app.Application}, adding multidex support. + */ +public class FlutterMultiDexApplication extends Application { + @Override + @CallSuper + protected void attachBaseContext(Context base) { + super.attachBaseContext(base); + MultiDex.install(this); + } +} diff --git a/android/app/src/main/kotlin/com/maelchiotti/localmaterialnotes/MainActivity.kt b/android/app/src/main/kotlin/com/maelchiotti/localmaterialnotes/MainActivity.kt new file mode 100644 index 00000000..3a88d8e1 --- /dev/null +++ b/android/app/src/main/kotlin/com/maelchiotti/localmaterialnotes/MainActivity.kt @@ -0,0 +1,6 @@ +package com.maelchiotti.localmaterialnotes + +import io.flutter.embedding.android.FlutterActivity + +class MainActivity : FlutterActivity() { +} diff --git a/android/app/src/main/res/drawable-hdpi/android12splash.png b/android/app/src/main/res/drawable-hdpi/android12splash.png new file mode 100644 index 0000000000000000000000000000000000000000..de99f94b590df99945a41a1cb31edb9da45cab00 GIT binary patch literal 11314 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 Ju}r}-=zl4#cQXJ0 literal 0 HcmV?d00001 diff --git a/android/app/src/main/res/drawable-hdpi/splash.png b/android/app/src/main/res/drawable-hdpi/splash.png new file mode 100644 index 0000000000000000000000000000000000000000..de99f94b590df99945a41a1cb31edb9da45cab00 GIT binary patch literal 11314 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 Ju}r}-=zl4#cQXJ0 literal 0 HcmV?d00001 diff --git a/android/app/src/main/res/drawable-mdpi/android12splash.png b/android/app/src/main/res/drawable-mdpi/android12splash.png new file mode 100644 index 0000000000000000000000000000000000000000..7ebdcbbab7954baa2db003548f2f7d0e0bf6c000 GIT binary patch literal 6944 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 Ju}r}-=zl4#cQXJ0 literal 0 HcmV?d00001 diff --git a/android/app/src/main/res/drawable-night-hdpi/splash.png b/android/app/src/main/res/drawable-night-hdpi/splash.png new file mode 100644 index 0000000000000000000000000000000000000000..de99f94b590df99945a41a1cb31edb9da45cab00 GIT binary patch literal 11314 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 Ju}r}-=zl4#cQXJ0 literal 0 HcmV?d00001 diff --git a/android/app/src/main/res/drawable-night-mdpi/android12splash.png b/android/app/src/main/res/drawable-night-mdpi/android12splash.png new file mode 100644 index 0000000000000000000000000000000000000000..7ebdcbbab7954baa2db003548f2f7d0e0bf6c000 GIT binary patch literal 6944 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 + + + + + + + + diff --git a/android/app/src/main/res/drawable-night-xhdpi/android12splash.png b/android/app/src/main/res/drawable-night-xhdpi/android12splash.png new file mode 100644 index 0000000000000000000000000000000000000000..0e686e5c39136f7ba1b1eb235d573e4c581b7e57 GIT binary patch literal 11728 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

OTFidz94LokrIrgbLbS)In;cJ4q@#)ZG1jKbw|q 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 IYxVH|0MDH5*8l(j literal 0 HcmV?d00001 diff --git a/android/app/src/main/res/drawable-night-xxhdpi/splash.png b/android/app/src/main/res/drawable-night-xxhdpi/splash.png new file mode 100644 index 0000000000000000000000000000000000000000..2747f848b70fe4b0be600ea10c148fa8e032e839 GIT binary patch literal 18624 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

OTFidz94LokrIrgbLbS)In;cJ4q@#)ZG1jKbw|q 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 IYxVH|0MDH5*8l(j literal 0 HcmV?d00001 diff --git a/android/app/src/main/res/drawable-night-xxxhdpi/android12splash.png b/android/app/src/main/res/drawable-night-xxxhdpi/android12splash.png new file mode 100644 index 0000000000000000000000000000000000000000..425061fe2275da989b51ce3612bfc956acf4205e GIT binary patch literal 18956 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 + + + + + + + + diff --git a/android/app/src/main/res/drawable-v21/background.png b/android/app/src/main/res/drawable-v21/background.png new file mode 100644 index 0000000000000000000000000000000000000000..3107d37fa533216ce211fdcdd7c9b8633fab4cc4 GIT binary patch literal 69 zcmeAS@N?(olHy`uVBq!ia0vp^j3CUx1SBVv2j2ryJf1F&Ar*|tKmY%?XJF%FW@0Ma R`v54;;OXk;vd$@?2>`rk4}t&y literal 0 HcmV?d00001 diff --git a/android/app/src/main/res/drawable-v21/launch_background.xml b/android/app/src/main/res/drawable-v21/launch_background.xml new file mode 100644 index 00000000..3cc4948a --- /dev/null +++ b/android/app/src/main/res/drawable-v21/launch_background.xml @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/android/app/src/main/res/drawable-xhdpi/android12splash.png b/android/app/src/main/res/drawable-xhdpi/android12splash.png new file mode 100644 index 0000000000000000000000000000000000000000..0e686e5c39136f7ba1b1eb235d573e4c581b7e57 GIT binary patch literal 11728 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

OTFidz94LokrIrgbLbS)In;cJ4q@#)ZG1jKbw|q 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 IYxVH|0MDH5*8l(j literal 0 HcmV?d00001 diff --git a/android/app/src/main/res/drawable-xxhdpi/splash.png b/android/app/src/main/res/drawable-xxhdpi/splash.png new file mode 100644 index 0000000000000000000000000000000000000000..2747f848b70fe4b0be600ea10c148fa8e032e839 GIT binary patch literal 18624 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

OTFidz94LokrIrgbLbS)In;cJ4q@#)ZG1jKbw|q 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 IYxVH|0MDH5*8l(j literal 0 HcmV?d00001 diff --git a/android/app/src/main/res/drawable-xxxhdpi/android12splash.png b/android/app/src/main/res/drawable-xxxhdpi/android12splash.png new file mode 100644 index 0000000000000000000000000000000000000000..425061fe2275da989b51ce3612bfc956acf4205e GIT binary patch literal 18956 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 literal 0 HcmV?d00001 diff --git a/android/app/src/main/res/drawable/launch_background.xml b/android/app/src/main/res/drawable/launch_background.xml new file mode 100644 index 00000000..3cc4948a --- /dev/null +++ b/android/app/src/main/res/drawable/launch_background.xml @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/android/app/src/main/res/mipmap-hdpi/launcher_icon.png b/android/app/src/main/res/mipmap-hdpi/launcher_icon.png new file mode 100644 index 0000000000000000000000000000000000000000..fb3f1ad7b0153fa30638b7679bebb743ddf4f804 GIT binary patch literal 2151 zcmV-t2$=VYP)TfYk;fzsAfx*9mW9Q1mntJ7=@!bSmQKoPF}WM+ zs$HfV*BcFGmz~uYN*xtv3Y}G@=LnD6!&k^;s81k^h>KPCPn#O{&@*YOgvZB86&hUt z-4t{?Jznyt-h;#Xj7{@>Ksl{-_M0buvt2t@&~W+Sk1o^oTOkZTGzLjzN>ZIXb($t+ z_Iy>s=m`>ul(X|l73!Gq#MEhc=~6$+wwIqeYAM~7V>zFn=W*E_T%E@!P7RVOwc*;4 z^A~7GyuL`L)+cZ|b~}=(dW}rQEBfgVR-22rWt)mNt)pyp^<15R6N4nAO0FH5z94dR z#{06c=$>4R$y72`RF9}9-u{G+;~nFPbt~&nZd~Va*`2|T8?-@TiK*js6S6ka_lo3T z$Kpa#rA8O?)O%~R!{#l#eRx@B!=(cUgBg#tK@x>prF(Y8s)&@AG7wiVL4-o2HZH0A z^eqRhfA9agwqQvnWjC5xjl-ssyjya=?lW@o<5dp+D^_MYRlKfn93^?cr5MtzwyRu7)}qW<}{ z-_lQQ1+x%^my}d#^pn5Lqo1_t=Hi@ff%Xg7popP!XX++q?dXc;_(adgWV-Pyw$NtD zOobb^2GS=WgYeDi>gM7tiad-8shCT8Wj?M4GV z4LHSiBbLEqcTSaHuYuBzpnCIY8-j$wKOeGe%U9 z^2>8mN6^a?lfO3Y8iYw;7ntV+Ei$4rR&ZLZ(X{T;;ep=pMEUr60QZH{`- zj6CawAKJ{3+8Bg|C)QSk2$v6`lrD97wyo^fUnqyk((-s4gRm+W%fgdS$<+Gz$T4p% zHXK>8yyfv$1|gq=lm)+`iATs|)fa8fc3Z0Ie8*ZDgk+ac`5ZAwDi4p09F?)C?(nh? zeaD&&LYfo~3KN=m6ftzpLgVq(S@cZXiucV1sgtKpXPPEmJW)f8PLy*UBd0ol%S9~T z7kDZNId9D)v*ys3+9tejHi&j^KGTyY#mb0B`-*##?V_0XiAb3}zm-AQno-7&8qaNL zT~`YIz{lkJf&Ch5E?)5(gncV6w`T4EN!0x(&oI_pT;(+dn|f?Uxl!jP&XqTE8yd&D zTH|8X51!CBYuX@*RDvB(HiLY6(9(IME-GcuVPhona3zVo@&LDk?<+~9GNrP|u;C;M z34{(ttWtCzGJ-^vh0uYBRrJ$r2#FFDp#u@C$f&+aB|&*iR5dYah>C4@Ui8<$PGa^Z1FODLrACX1qO#ML z_pcNWmKU7}2BFAE+)Hxd)JUS56vdKkdguP$Kop$gyeyDY)mm8OJDNl}t@R{IZP^-h z@){PZ;$ExBAYxTx?WGGO z%KL>5M67aDm7XHOKA^lG*?ge`5|ccX+u^7vK1Biy0sDZ`ex`#gounbgB=IwaGTSL) z-c}mBc>t+3nl?eb#Q$9vCA?J-}$83r%>r8|unye#%UzuN}Xiw`&l- zZon8p>H$UzS%d=0L%AH)``?)5wp7-%*QUd5A26Q47(wa*A>uwn;pFj9?%IN-uh_30 zJKj;dPWQ#YcmiVtsdo>V0Q*4I2V! z9PrL67*Ak~AoaQ`V28^J-<&|rff#K)gYg8$2vQF)8uJi^6K=@3=LB+DwG`vMc`%;9 z7(wa*Mq}Dv2)P?>msjt9b5>_JWPf5+ya2`%7$ZnMz-Vm7;7gbUVxH5{qr4-ruI>Qi z35*e>9$+-^R&2)#g|N25^5Op(GW&m66?FLvFh-DifYCq;0VxW0%wU9+1y2m z6oHxn7y|YI<^8B&_ZDfR4mmPD0o9}^m?Z90x;3JB3H3QBK|z%T3JDxlrNxel;v(#L dhB|Ja{sX|!T4Y~n>J9(^002ovPDHLkV1flK2*dyY literal 0 HcmV?d00001 diff --git a/android/app/src/main/res/mipmap-mdpi/launcher_icon.png b/android/app/src/main/res/mipmap-mdpi/launcher_icon.png new file mode 100644 index 0000000000000000000000000000000000000000..24f9b0b1246b9b167b586b514c5771b0b03478bb GIT binary patch literal 1465 zcmV;q1xEUbP)-)aF z=XZVI_xF3B2ZmArv~h(+SGJ`_XRWrg#T9EG4r+@=9ND z?Dy`#)nD8ES6aUd`-Vs5-kV8xV3y95XIy=+!?@}$hqk0@qehcO3-#5|tbxfbS&5hK zT6+yuU0cWVd?Yy9eQB!ai<922Qzs(+ahECq(8iKt)5f}|jaBzOoW<&M)43_2ArWV< zSYyYlV9PTN-tJG1OrCFgE$qEIl*;!=4}jLPg!ohW_Px&$;>MI2CxM2^Hsq~)pw3u% z&o0lULyePd&5b-a6Ob}iQUI)Fm92RD!IN5xZM{6I$&tnCjHXSGzihB=-!b~-BRhk` zoxh2V5e>j#yW>vt?ajyKOqW!_7G7U@jpKBi^KAWYU)QORll4s+K<@encNN|G>ifwS z=u&}9s~q#T<`!CSHoGsr_l{6M!2o8-H++D_wloyQfqNHj-G6|Oa3RkxhYuy{lP~~G zo7pFyIr8(MDXe+%-SD*2Io0#orwbbw1%L&MIiHDXBLr}$w0>9w?n*mja}&(wR0rvCsMSV|#EN4Io;Wk=iEN zz_KEm(y!FEzW*1CRdcp>Z?8H)yhs#0v>Htoo#)|IjfQ%#INM>y)X zrg6b`{0g~MJ8Mbt_r`1hq$E~_nSwA7&d~sH7(qQRHekdPrUoX|$!kMy;pr2Dw&;c` z##CO);3Op_Y3*roD?&~|Xmq8Uw=y^eW|~R5$hNM%k--@@(?rsR)@)nN-~gU!BI$z3 zFD+-F9!Tlzu5EXuewr5TN9Pn;n3(h-hPyZDRm}rZ0wCOT(w0@03mAw_ z&~3yze$_QYb^H@jgA+C870&|z;qGUkm_cw7>wKhD{3lf#VgJM!1G!I10Lu}ad!V0z zRvDH1{)Y%TFZVDITA@{DnoK$f40T*&pb|r96;mJ%-k(oZSmke8-*g42#&3PHzlVVL z51jvjfy51!7$R%3-X(c7In>Axpvb7qP8M?Y_HeG={wO0z++qPNH~0u={EY?xeI61w zRAQk4`#$$j2Ce)f<@i)Y_IL0RF6iz2=qTPt1Aw^zeI63G(4fo1oa`Gbg{ePIx5Rve zxk(Lk0s1^7?#xjW2g$wx*SR-eiCxbHfQVo&K%dVHHEHm)A3H!6Z(r;>Zd-vf0&@ZS zy!zC{!MO+jcD249_kiO9fUN^(1m*(td3EU}2U)m*u``c4_@HlU{^yG}cGx;_Mqn;1 z6M3CNq8&f`>_anyKVMkbmM}BH)`2qubAeo{BgYAYpFG!C@9k_kk*HBHwZhhcGXirV zQ(gg{JjjzB@-3l0NoxbxI&el{EF`N;Y3()5waYH4B&`PDgTk$A~QB|TaOZ9&wVo1Bdhq(ZG zJ1TLT%FA@6n{UasuDwZXwpBtggXjd^CdxD%^5X!GGc1mQI7#6!f_gsP`^WGf(h^m^ TU2QH100000NkvXXu0mjf7ev4Q literal 0 HcmV?d00001 diff --git a/android/app/src/main/res/mipmap-xhdpi/launcher_icon.png b/android/app/src/main/res/mipmap-xhdpi/launcher_icon.png new file mode 100644 index 0000000000000000000000000000000000000000..6dc25c7494321a634b656882720a53e60fe3f7ba GIT binary patch literal 2821 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 literal 0 HcmV?d00001 diff --git a/android/app/src/main/res/mipmap-xxxhdpi/launcher_icon.png b/android/app/src/main/res/mipmap-xxxhdpi/launcher_icon.png new file mode 100644 index 0000000000000000000000000000000000000000..1900900a2166d706977b385a912ef86829fef6f9 GIT binary patch literal 5965 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 + + + + + + diff --git a/android/app/src/main/res/values-night/styles.xml b/android/app/src/main/res/values-night/styles.xml new file mode 100644 index 00000000..dbc9ea9f --- /dev/null +++ b/android/app/src/main/res/values-night/styles.xml @@ -0,0 +1,22 @@ + + + + + + + diff --git a/android/app/src/main/res/values-v31/styles.xml b/android/app/src/main/res/values-v31/styles.xml new file mode 100644 index 00000000..0864e8ca --- /dev/null +++ b/android/app/src/main/res/values-v31/styles.xml @@ -0,0 +1,21 @@ + + + + + + + diff --git a/android/app/src/main/res/values/styles.xml b/android/app/src/main/res/values/styles.xml new file mode 100644 index 00000000..0d1fa8fc --- /dev/null +++ b/android/app/src/main/res/values/styles.xml @@ -0,0 +1,22 @@ + + + + + + + diff --git a/android/app/src/profile/AndroidManifest.xml b/android/app/src/profile/AndroidManifest.xml new file mode 100644 index 00000000..399f6981 --- /dev/null +++ b/android/app/src/profile/AndroidManifest.xml @@ -0,0 +1,7 @@ + + + + diff --git a/android/build.gradle b/android/build.gradle new file mode 100644 index 00000000..e83fb5da --- /dev/null +++ b/android/build.gradle @@ -0,0 +1,30 @@ +buildscript { + ext.kotlin_version = '1.7.10' + repositories { + google() + mavenCentral() + } + + dependencies { + classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version" + } +} + +allprojects { + repositories { + google() + mavenCentral() + } +} + +rootProject.buildDir = '../build' +subprojects { + project.buildDir = "${rootProject.buildDir}/${project.name}" +} +subprojects { + project.evaluationDependsOn(':app') +} + +tasks.register("clean", Delete) { + delete rootProject.buildDir +} diff --git a/android/gradle.properties b/android/gradle.properties new file mode 100644 index 00000000..598d13fe --- /dev/null +++ b/android/gradle.properties @@ -0,0 +1,3 @@ +org.gradle.jvmargs=-Xmx4G +android.useAndroidX=true +android.enableJetifier=true diff --git a/android/gradle/wrapper/gradle-wrapper.properties b/android/gradle/wrapper/gradle-wrapper.properties new file mode 100644 index 00000000..3c472b99 --- /dev/null +++ b/android/gradle/wrapper/gradle-wrapper.properties @@ -0,0 +1,5 @@ +distributionBase=GRADLE_USER_HOME +distributionPath=wrapper/dists +zipStoreBase=GRADLE_USER_HOME +zipStorePath=wrapper/dists +distributionUrl=https\://services.gradle.org/distributions/gradle-7.5-all.zip diff --git a/android/settings.gradle b/android/settings.gradle new file mode 100644 index 00000000..7cd71285 --- /dev/null +++ b/android/settings.gradle @@ -0,0 +1,29 @@ +pluginManagement { + def flutterSdkPath = { + def properties = new Properties() + file("local.properties").withInputStream { properties.load(it) } + def flutterSdkPath = properties.getProperty("flutter.sdk") + assert flutterSdkPath != null, "flutter.sdk not set in local.properties" + return flutterSdkPath + } + settings.ext.flutterSdkPath = flutterSdkPath() + + includeBuild("${settings.ext.flutterSdkPath}/packages/flutter_tools/gradle") + + repositories { + google() + mavenCentral() + gradlePluginPortal() + } + + plugins { + id "dev.flutter.flutter-gradle-plugin" version "1.0.0" apply false + } +} + +plugins { + id "dev.flutter.flutter-plugin-loader" version "1.0.0" + id "com.android.application" version "7.3.0" apply false +} + +include ":app" diff --git a/assets/logos/icon.ico b/assets/logos/icon.ico new file mode 100644 index 0000000000000000000000000000000000000000..5425926d0e1d8474335a36038a80bed29b88d961 GIT binary patch literal 5274 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 literal 0 HcmV?d00001 diff --git a/assets/logos/icon.png b/assets/logos/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..139bce143085f3f9a131029747b5bc9c1189a361 GIT binary patch literal 40336 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 + + + + + + + + + + diff --git a/assets/logos/icon_full.png b/assets/logos/icon_full.png new file mode 100644 index 0000000000000000000000000000000000000000..21abd00fdb1ecadedb5f2dec5bd8ffdbda6fbf4c GIT binary patch literal 28287 zcmeHQTS!xJ9R9Cusq@k-%}tRFvhbnhjaCunCTbH>Q-qk6&YmO;M-l{C=@46yXo?V& zGFhpWF2bT-hMQV1zrllfo2jaB9{G+^TvGhVJQ0^4rAx+z&MxRclmw4bMBr^ zKkd&8Bgs>gV;=P-$Nz;EFqaQwMg|e6s-@VMj`Z9EDkq|LSO_FC{e>`cH zvq-czM;G@oE62Y7NQFq3`(tF=T=5eXlq4`%V$W-tl?s*7wosI(?Npv@F)WjqbeTkgoOnfJ?6aU5lh#K%6%oP|J;)rmF!Oe`bxm##{aDN7bhdMqkKmo)T=UKMm-lNrrRF-HmlN4tz8`oMTz z3hNDFvnd=i3jO=Wlt)k5&j7l*s2`WYcDfYsUx1oGO}C(?3sRyE?vUDZNmyA?x)LztHbhFUSLN^QDEOfKb&Du&gi`qGaPq?;(LG9D3!wcGOLwWCw zz^Qva(|rz!{#-JvG|F-8=aY!GC7^fDSdkxie!f<63j?pb_{cK zm>F~$4I67YW+~U^NNuhYsx2~OLolN>?$nexp$;$z0|o{R3>X+NTQ^`HR2q$|S%A&r z1#ti{RWMaBRgYk*HrnzN6ONfJ86EkjJd@AQ(*)0q`xR>14w+6G>-Le`!r~JFruv95 z=5VYgYWRhg57oar`5d$FWJlDadCTAhe(Mjjx~Y69f7fFBTyLvBk`Qa{7(K}p^sKH% zj+PoZ{mjG0){GqBqWjJr?h_nqa1d}1a1d}1q?V9cLTU-AC1@(l;9~|KJ_58Mv>~*i z$7;ig`TANy0{oeG1gt#M9{~Ua01yB`0Kg*x0H8mhKcGJzOMmbhBfP>1qgmj);JfR5 Zmrc@G$I=bec}nVzk<{e$BtxP~^B+6>z#jkr literal 0 HcmV?d00001 diff --git a/assets/logos/icon_full.svg b/assets/logos/icon_full.svg new file mode 100644 index 00000000..60b2e191 --- /dev/null +++ b/assets/logos/icon_full.svg @@ -0,0 +1,16 @@ + + + + + + + + + + + diff --git a/build.yaml b/build.yaml new file mode 100644 index 00000000..d439bddb --- /dev/null +++ b/build.yaml @@ -0,0 +1,7 @@ +targets: + $default: + builders: + json_serializable: + options: + explicit_to_json: true + field_rename: snake \ No newline at end of file diff --git a/flutter_launcher_icons.yaml b/flutter_launcher_icons.yaml new file mode 100644 index 00000000..e77cd8fa --- /dev/null +++ b/flutter_launcher_icons.yaml @@ -0,0 +1,10 @@ +# dart run flutter_launcher_icons +flutter_launcher_icons: + image_path: "assets/logos/icon.png" + android: "launcher_icon" + min_sdk_android: 21 + ios: false + web: + generate: true + windows: + generate: true \ No newline at end of file diff --git a/flutter_native_splash.yaml b/flutter_native_splash.yaml new file mode 100644 index 00000000..112dd9dc --- /dev/null +++ b/flutter_native_splash.yaml @@ -0,0 +1,16 @@ +# dart run flutter_native_splash:create +flutter_native_splash: + color: "#ffffff" + image: "assets/logos/icon.png" + + color_dark: "#181c1f" + image_dark: "assets/logos/icon.png" + + android_12: + image: "assets/logos/icon.png" + color: "#42a5f5" + + image_dark: "assets/logos/icon.png" + color_dark: "#042a49" + + ios: false \ No newline at end of file diff --git a/l10n.yaml b/l10n.yaml new file mode 100644 index 00000000..3300d554 --- /dev/null +++ b/l10n.yaml @@ -0,0 +1,6 @@ +arb-dir: lib/l10n +template-arb-file: app_en.arb +synthetic-package: false +use-escaping: true +output-localization-file: app_localizations.g.dart +untranslated-messages-file: lib/l10n/untranslated.txt \ No newline at end of file diff --git a/lib/app.dart b/lib/app.dart new file mode 100644 index 00000000..08c92d5a --- /dev/null +++ b/lib/app.dart @@ -0,0 +1,82 @@ +import 'dart:async'; + +import 'package:dynamic_color/dynamic_color.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter_riverpod/flutter_riverpod.dart'; +import 'package:localmaterialnotes/common/routing/router.dart'; +import 'package:localmaterialnotes/l10n/app_localizations.g.dart'; +import 'package:localmaterialnotes/utils/constants/constants.dart'; +import 'package:localmaterialnotes/utils/locale_manager.dart'; +import 'package:localmaterialnotes/utils/platform_manager.dart'; +import 'package:localmaterialnotes/utils/share_manager.dart'; +import 'package:localmaterialnotes/utils/theme_manager.dart'; + +class App extends ConsumerStatefulWidget { + @override + ConsumerState createState() => _AppState(); +} + +class _AppState extends ConsumerState { + late StreamSubscription _stream; + + @override + void initState() { + super.initState(); + + if (kIsAndroidApp) { + readSharedData(ref); + _stream = listenSharedData(ref); + } + } + + @override + void dispose() { + if (kIsAndroidApp) { + _stream.cancel(); + } + + super.dispose(); + } + + @override + Widget build(BuildContext context) { + return DynamicColorBuilder( + builder: (lightDynamic, darkDynamic) { + return ValueListenableBuilder( + valueListenable: dynamicThemingNotifier, + builder: (_, __, ___) { + return ValueListenableBuilder( + valueListenable: blackThemingNotifier, + builder: (_, __, ___) { + return ValueListenableBuilder( + valueListenable: themeModeNotifier, + builder: (_, themeMode, ___) { + final useDynamicTheming = ThemeManager().useDynamicTheming; + + return MaterialApp.router( + title: 'Material Notes', + theme: useDynamicTheming + ? ThemeManager().getLightDynamicTheme(lightDynamic) + : ThemeManager().getLightCustomTheme, + darkTheme: useDynamicTheming + ? ThemeManager().getDarkDynamicTheme(darkDynamic) + : ThemeManager().getDarkCustomTheme, + themeMode: themeMode, + localizationsDelegates: const [ + ...AppLocalizations.localizationsDelegates, + ], + supportedLocales: AppLocalizations.supportedLocales, + locale: LocaleManager().locale, + routerConfig: router, + debugShowCheckedModeBanner: false, + ); + }, + ); + }, + ); + }, + ); + }, + ); + } +} diff --git a/lib/common/actions/add.dart b/lib/common/actions/add.dart new file mode 100644 index 00000000..0674aed8 --- /dev/null +++ b/lib/common/actions/add.dart @@ -0,0 +1,25 @@ +import 'package:flutter/material.dart'; +import 'package:flutter_riverpod/flutter_riverpod.dart'; +import 'package:go_router/go_router.dart'; +import 'package:localmaterialnotes/common/routing/router.dart'; +import 'package:localmaterialnotes/common/routing/router_route.dart'; +import 'package:localmaterialnotes/models/note/note.dart'; +import 'package:localmaterialnotes/providers/current_note/current_note_provider.dart'; +import 'package:localmaterialnotes/providers/notes/notes_provider.dart'; + +Future addNote(BuildContext context, WidgetRef ref, {String? content}) async { + final note = content == null ? Note.empty() : Note.content(content); + + ref.read(currentNoteProvider.notifier).set(note); + await ref.read(notesProvider.notifier).add(note); + + if (context.mounted) { + context.push( + RouterRoute.editor.fullPath!, + extra: EditorParameters.from({ + 'readonly': false, + 'autofocus': true, + }), + ); + } +} diff --git a/lib/common/actions/back.dart b/lib/common/actions/back.dart new file mode 100644 index 00000000..a9e2aa52 --- /dev/null +++ b/lib/common/actions/back.dart @@ -0,0 +1,16 @@ +import 'package:flutter/material.dart'; +import 'package:flutter_riverpod/flutter_riverpod.dart'; +import 'package:go_router/go_router.dart'; +import 'package:localmaterialnotes/providers/current_note/current_note_provider.dart'; +import 'package:localmaterialnotes/providers/editor_controller/editor_controller_provider.dart'; + +void back(BuildContext context) { + context.pop(); +} + +void backFromEditor(BuildContext context, WidgetRef ref) { + ref.read(currentNoteProvider.notifier).reset(); + ref.read(editorControllerProvider.notifier).unset(); + + context.pop(); +} diff --git a/lib/common/actions/delete.dart b/lib/common/actions/delete.dart new file mode 100644 index 00000000..96850c7a --- /dev/null +++ b/lib/common/actions/delete.dart @@ -0,0 +1,98 @@ +import 'package:flutter/material.dart'; +import 'package:flutter_riverpod/flutter_riverpod.dart'; +import 'package:go_router/go_router.dart'; +import 'package:localmaterialnotes/common/dialogs/confirmation_dialog.dart'; +import 'package:localmaterialnotes/models/note/note.dart'; +import 'package:localmaterialnotes/providers/bin/bin_provider.dart'; +import 'package:localmaterialnotes/providers/current_note/current_note_provider.dart'; +import 'package:localmaterialnotes/providers/notes/notes_provider.dart'; +import 'package:localmaterialnotes/providers/selection_mode/selection_mode_provider.dart'; +import 'package:localmaterialnotes/utils/constants/constants.dart'; + +Future deleteNote(BuildContext context, WidgetRef ref, Note? note) async { + if (note == null) return false; + + if (await showConfirmationDialog( + false, + context, + localizations.dialog_delete, + localizations.dialog_delete_body_single, + localizations.dialog_delete, + )) { + ref.read(currentNoteProvider.notifier).reset(); + await ref.read(notesProvider.notifier).delete(note); + + if (context.mounted && context.canPop()) { + context.pop(); + } + + return true; + } + + return false; +} + +Future deleteNotes(BuildContext context, WidgetRef ref, List notes) async { + if (await showConfirmationDialog( + false, + context, + localizations.dialog_delete, + localizations.dialog_delete_body(notes.length), + localizations.dialog_delete, + )) { + for (final note in notes) { + await ref.read(notesProvider.notifier).delete(note); + } + } +} + +Future permanentlyDeleteNote(BuildContext context, WidgetRef ref, Note? note) async { + if (note == null) return false; + + if (await showConfirmationDialog( + true, + context, + localizations.dialog_permanently_delete, + localizations.dialog_permanently_delete_body_single, + localizations.dialog_permanently_delete, + )) { + ref.read(currentNoteProvider.notifier).reset(); + await ref.read(binProvider.notifier).permanentlyDelete(note); + + if (context.mounted && context.canPop()) { + context.pop(); + } + + return true; + } + + return false; +} + +Future permanentlyDeleteNotes(BuildContext context, WidgetRef ref, List notes) async { + if (await showConfirmationDialog( + true, + context, + localizations.dialog_permanently_delete, + localizations.dialog_permanently_delete_body(notes.length), + localizations.dialog_permanently_delete, + )) { + for (final note in notes) { + await ref.read(binProvider.notifier).permanentlyDelete(note); + } + } +} + +Future emptyBin(BuildContext context, WidgetRef ref) async { + if (await showConfirmationDialog( + true, + context, + localizations.dialog_empty_bin, + localizations.dialog_empty_bin_body, + localizations.dialog_empty_bin, + )) { + await ref.read(binProvider.notifier).empty(); + + ref.read(selectionModeProvider.notifier).exitSelectionMode(); + } +} diff --git a/lib/common/actions/pin.dart b/lib/common/actions/pin.dart new file mode 100644 index 00000000..e160d3f6 --- /dev/null +++ b/lib/common/actions/pin.dart @@ -0,0 +1,18 @@ +import 'package:flutter/material.dart'; +import 'package:flutter_riverpod/flutter_riverpod.dart'; +import 'package:localmaterialnotes/models/note/note.dart'; +import 'package:localmaterialnotes/providers/notes/notes_provider.dart'; + +Future togglePinNote(BuildContext context, WidgetRef ref, Note? note) async { + if (note == null) return false; + + await ref.read(notesProvider.notifier).togglePin(note); + + return false; +} + +Future togglePinNotes(BuildContext context, WidgetRef ref, List notes) async { + for (final note in notes) { + await ref.read(notesProvider.notifier).togglePin(note); + } +} diff --git a/lib/common/actions/restore.dart b/lib/common/actions/restore.dart new file mode 100644 index 00000000..ddd75a2d --- /dev/null +++ b/lib/common/actions/restore.dart @@ -0,0 +1,45 @@ +import 'package:flutter/material.dart'; +import 'package:flutter_riverpod/flutter_riverpod.dart'; +import 'package:go_router/go_router.dart'; +import 'package:localmaterialnotes/common/dialogs/confirmation_dialog.dart'; +import 'package:localmaterialnotes/models/note/note.dart'; +import 'package:localmaterialnotes/providers/bin/bin_provider.dart'; +import 'package:localmaterialnotes/providers/current_note/current_note_provider.dart'; +import 'package:localmaterialnotes/utils/constants/constants.dart'; + +Future restoreNote(BuildContext context, WidgetRef ref, Note? note) async { + if (note == null) return false; + + if (await showConfirmationDialog( + false, + context, + localizations.dialog_restore, + localizations.dialog_restore_body_single, + localizations.dialog_restore, + )) { + ref.read(currentNoteProvider.notifier).reset(); + await ref.read(binProvider.notifier).restore(note); + + if (context.mounted && context.canPop()) { + context.pop(); + } + + return true; + } + + return false; +} + +Future restoreNotes(BuildContext context, WidgetRef ref, List notes) async { + if (await showConfirmationDialog( + false, + context, + localizations.dialog_restore, + localizations.dialog_restore_body(notes.length), + localizations.dialog_restore, + )) { + for (final note in notes.where((note) => note.selected)) { + await ref.read(binProvider.notifier).restore(note); + } + } +} diff --git a/lib/common/actions/select.dart b/lib/common/actions/select.dart new file mode 100644 index 00000000..6843b902 --- /dev/null +++ b/lib/common/actions/select.dart @@ -0,0 +1,19 @@ +import 'package:flutter_riverpod/flutter_riverpod.dart'; +import 'package:localmaterialnotes/common/routing/router_route.dart'; +import 'package:localmaterialnotes/providers/bin/bin_provider.dart'; +import 'package:localmaterialnotes/providers/notes/notes_provider.dart'; +import 'package:localmaterialnotes/providers/selection_mode/selection_mode_provider.dart'; + +void selectAll(WidgetRef ref) { + RouterRoute.isBin ? ref.read(binProvider.notifier).selectAll() : ref.read(notesProvider.notifier).selectAll(); +} + +void unselectAll(WidgetRef ref) { + RouterRoute.isBin ? ref.read(binProvider.notifier).unselectAll() : ref.read(notesProvider.notifier).unselectAll(); +} + +void exitSelectionMode(WidgetRef ref) { + unselectAll(ref); + + ref.read(selectionModeProvider.notifier).exitSelectionMode(); +} diff --git a/lib/common/dialogs/confirmation_dialog.dart b/lib/common/dialogs/confirmation_dialog.dart new file mode 100644 index 00000000..cb743006 --- /dev/null +++ b/lib/common/dialogs/confirmation_dialog.dart @@ -0,0 +1,48 @@ +import 'package:flutter/material.dart'; +import 'package:localmaterialnotes/utils/constants/constants.dart'; +import 'package:localmaterialnotes/utils/preferences/confirmations.dart'; + +Future showConfirmationDialog( + bool irreversible, + BuildContext context, + String title, + String body, + String confirmText, +) async { + final confirmationsSetting = Confirmations.fromPreferences(); + if (confirmationsSetting == Confirmations.none || + (confirmationsSetting == Confirmations.irreversible && !irreversible)) { + return true; + } + + return await showAdaptiveDialog( + context: context, + builder: (context) { + return AlertDialog( + title: Text(title), + content: SingleChildScrollView( + child: Column( + children: [ + Text(body), + ], + ), + ), + actions: [ + TextButton( + onPressed: () { + Navigator.pop(context, false); + }, + child: Text(localizations.button_cancel), + ), + TextButton( + onPressed: () { + Navigator.pop(context, true); + }, + child: Text(confirmText), + ), + ], + ); + }, + ) ?? + false; +} diff --git a/lib/common/dialogs/information_dialog.dart b/lib/common/dialogs/information_dialog.dart new file mode 100644 index 00000000..9b48e539 --- /dev/null +++ b/lib/common/dialogs/information_dialog.dart @@ -0,0 +1,24 @@ +import 'package:flutter/material.dart'; +import 'package:localmaterialnotes/utils/constants/constants.dart'; + +Future showInformationDialog( + BuildContext context, + String title, + String body, +) async { + showAdaptiveDialog( + context: context, + builder: (context) { + return AlertDialog.adaptive( + title: Text(title), + content: Text(body), + actions: [ + TextButton( + onPressed: () => Navigator.of(context).pop(), + child: Text(localizations.button_close), + ), + ], + ); + }, + ); +} diff --git a/lib/common/fabs/fab_add_note.dart b/lib/common/fabs/fab_add_note.dart new file mode 100644 index 00000000..21a15d60 --- /dev/null +++ b/lib/common/fabs/fab_add_note.dart @@ -0,0 +1,22 @@ +import 'package:flutter/material.dart'; +import 'package:flutter_riverpod/flutter_riverpod.dart'; +import 'package:localmaterialnotes/common/actions/add.dart'; +import 'package:localmaterialnotes/utils/constants/constants.dart'; + +class FabAddNote extends ConsumerStatefulWidget { + const FabAddNote({super.key}); + + @override + ConsumerState createState() => _FabAddNoteState(); +} + +class _FabAddNoteState extends ConsumerState { + @override + Widget build(BuildContext context) { + return FloatingActionButton( + tooltip: localizations.tooltip_fab_add_note, + onPressed: () => addNote(context, ref), + child: const Icon(Icons.add), + ); + } +} diff --git a/lib/common/fabs/fab_empty_bin.dart b/lib/common/fabs/fab_empty_bin.dart new file mode 100644 index 00000000..0151b279 --- /dev/null +++ b/lib/common/fabs/fab_empty_bin.dart @@ -0,0 +1,20 @@ +import 'package:flutter/material.dart'; +import 'package:flutter_riverpod/flutter_riverpod.dart'; +import 'package:localmaterialnotes/common/actions/delete.dart'; +import 'package:localmaterialnotes/providers/bin/bin_provider.dart'; +import 'package:localmaterialnotes/utils/constants/constants.dart'; + +class FabEmptyBin extends ConsumerWidget { + const FabEmptyBin({super.key}); + + @override + Widget build(BuildContext context, WidgetRef ref) { + final deletedNotesCount = ref.watch(binProvider).value?.length ?? 0; + + return FloatingActionButton( + tooltip: localizations.tooltip_fab_empty_bin, + onPressed: deletedNotesCount > 0 ? () => emptyBin(context, ref) : null, + child: const Icon(Icons.delete_forever), + ); + } +} diff --git a/lib/common/navigation/app_bars/back_app_bar.dart b/lib/common/navigation/app_bars/back_app_bar.dart new file mode 100644 index 00000000..1359faa1 --- /dev/null +++ b/lib/common/navigation/app_bars/back_app_bar.dart @@ -0,0 +1,16 @@ +import 'package:flutter/material.dart'; +import 'package:flutter_riverpod/flutter_riverpod.dart'; +import 'package:localmaterialnotes/common/actions/back.dart'; + +class BackAppBar extends ConsumerWidget { + const BackAppBar(); + + @override + Widget build(BuildContext context, WidgetRef ref) { + return AppBar( + leading: BackButton( + onPressed: () => back(context), + ), + ); + } +} diff --git a/lib/common/navigation/app_bars/back_menu_app_bar.dart b/lib/common/navigation/app_bars/back_menu_app_bar.dart new file mode 100644 index 00000000..d2531a39 --- /dev/null +++ b/lib/common/navigation/app_bars/back_menu_app_bar.dart @@ -0,0 +1,109 @@ +import 'package:fleather/fleather.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter_riverpod/flutter_riverpod.dart'; +import 'package:localmaterialnotes/common/actions/back.dart'; +import 'package:localmaterialnotes/common/actions/delete.dart'; +import 'package:localmaterialnotes/common/actions/pin.dart'; +import 'package:localmaterialnotes/common/actions/restore.dart'; +import 'package:localmaterialnotes/common/navigation/app_bars/menu_options.dart'; +import 'package:localmaterialnotes/models/note/note.dart'; +import 'package:localmaterialnotes/pages/editor/about_sheet.dart'; +import 'package:localmaterialnotes/providers/current_note/current_note_provider.dart'; +import 'package:localmaterialnotes/providers/editor_controller/editor_controller_provider.dart'; +import 'package:localmaterialnotes/utils/constants/constants.dart'; +import 'package:localmaterialnotes/utils/constants/paddings.dart'; +import 'package:share_plus/share_plus.dart'; + +class BackMenuAppBar extends ConsumerStatefulWidget { + const BackMenuAppBar(); + + @override + ConsumerState createState() => _BackAppBarState(); +} + +class _BackAppBarState extends ConsumerState { + Future _onMenuOptionSelected(MenuOption menuOption) async { + final note = ref.read(currentNoteProvider); + + if (note == null) return; + + switch (menuOption) { + case MenuOption.togglePin: + await togglePinNote(context, ref, note); + case MenuOption.share: + await _shareNote(note); + case MenuOption.delete: + await deleteNote(context, ref, note); + case MenuOption.restore: + await restoreNote(context, ref, note); + case MenuOption.deletePermanently: + await permanentlyDeleteNote(context, ref, note); + case MenuOption.about: + showModalBottomSheet( + context: context, + clipBehavior: Clip.hardEdge, + showDragHandle: true, + isScrollControlled: true, + useSafeArea: true, + builder: (context) => const AboutSheet(), + ); + } + } + + void _toggleChecklist() { + final editorController = ref.read(editorControllerProvider); + + if (editorController == null) return; + + final isToggled = editorController.getSelectionStyle().containsSame(ParchmentAttribute.block.checkList); + editorController.formatSelection( + isToggled ? ParchmentAttribute.block.checkList.unset : ParchmentAttribute.block.checkList, + ); + } + + Future _shareNote(Note note) async { + await Share.share(note.shareText, subject: note.title); + } + + @override + Widget build(BuildContext context) { + final note = ref.read(currentNoteProvider); + + return AppBar( + leading: BackButton( + onPressed: () => backFromEditor(context, ref), + ), + actions: note == null + ? null + : [ + if (!note.deleted) + IconButton( + icon: const Icon(Icons.checklist), + tooltip: localizations.tooltip_toggle_checkbox, + onPressed: _toggleChecklist, + ), + PopupMenuButton( + itemBuilder: (context) { + return (note.deleted + ? [ + MenuOption.restore.popupMenuItem(), + MenuOption.deletePermanently.popupMenuItem(), + ] + : [ + MenuOption.togglePin.popupMenuItem(note.pinned), + MenuOption.share.popupMenuItem(), + MenuOption.delete.popupMenuItem(), + ]) + ..addAll( + [ + MenuOption.about.popupMenuItem(), + ], + ); + }, + onSelected: _onMenuOptionSelected, + ), + Padding(padding: Paddings.custom.appBarActionsEnd), + ], + ); + } +} diff --git a/lib/common/navigation/app_bars/empty_app_bar.dart b/lib/common/navigation/app_bars/empty_app_bar.dart new file mode 100644 index 00000000..97159968 --- /dev/null +++ b/lib/common/navigation/app_bars/empty_app_bar.dart @@ -0,0 +1,15 @@ +import 'package:flutter/material.dart'; + +// ignore: always_use_package_imports +import '../../routing/router_route.dart'; + +class EmptyAppBar extends StatelessWidget { + const EmptyAppBar(); + + @override + Widget build(BuildContext context) { + return AppBar( + title: Text(RouterRoute.currentRoute.title), + ); + } +} diff --git a/lib/common/navigation/app_bars/menu_options.dart b/lib/common/navigation/app_bars/menu_options.dart new file mode 100644 index 00000000..194d18f1 --- /dev/null +++ b/lib/common/navigation/app_bars/menu_options.dart @@ -0,0 +1,44 @@ +import 'package:flutter/material.dart'; +import 'package:localmaterialnotes/utils/constants/constants.dart'; + +enum MenuOption { + togglePin(Icons.push_pin, alternativeIcon: Icons.push_pin_outlined), + share(Icons.share), + delete(Icons.delete), + restore(Icons.restore_from_trash), + deletePermanently(Icons.delete_forever), + about(Icons.info), + ; + + final IconData icon; + final IconData? alternativeIcon; + + const MenuOption(this.icon, {this.alternativeIcon}); + + String title([bool alternative = false]) { + switch (this) { + case MenuOption.togglePin: + return alternative ? localizations.menu_unpin : localizations.menu_pin; + case MenuOption.share: + return localizations.menu_share; + case MenuOption.delete: + return localizations.menu_delete; + case MenuOption.restore: + return localizations.menu_restore; + case MenuOption.deletePermanently: + return localizations.menu_delete_permanently; + case MenuOption.about: + return localizations.menu_about; + } + } + + PopupMenuItem popupMenuItem([bool alternative = false]) { + return PopupMenuItem( + value: this, + child: ListTile( + leading: Icon(alternative ? alternativeIcon : icon), + title: Text(title(alternative)), + ), + ); + } +} diff --git a/lib/common/navigation/app_bars/search_sort_app_bar.dart b/lib/common/navigation/app_bars/search_sort_app_bar.dart new file mode 100644 index 00000000..6a4817ed --- /dev/null +++ b/lib/common/navigation/app_bars/search_sort_app_bar.dart @@ -0,0 +1,139 @@ +import 'package:flutter/material.dart'; +import 'package:flutter_riverpod/flutter_riverpod.dart'; +import 'package:go_router/go_router.dart'; +import 'package:localmaterialnotes/common/placeholders/empty_placeholder.dart'; +import 'package:localmaterialnotes/common/routing/router_route.dart'; +import 'package:localmaterialnotes/common/widgets/note_tile.dart'; +import 'package:localmaterialnotes/models/note/note.dart'; +import 'package:localmaterialnotes/providers/bin/bin_provider.dart'; +import 'package:localmaterialnotes/providers/notes/notes_provider.dart'; +import 'package:localmaterialnotes/utils/constants/constants.dart'; +import 'package:localmaterialnotes/utils/constants/paddings.dart'; +import 'package:localmaterialnotes/utils/preferences/preference_key.dart'; +import 'package:localmaterialnotes/utils/preferences/preferences_manager.dart'; +import 'package:localmaterialnotes/utils/preferences/sort_method.dart'; + +class SearchSortAppBar extends ConsumerStatefulWidget { + const SearchSortAppBar({super.key}); + + @override + ConsumerState createState() => _SearchAppBarState(); +} + +class _SearchAppBarState extends ConsumerState { + final provider = RouterRoute.currentRoute == RouterRoute.notes ? notesProvider : binProvider; + + SortMethod sortMethod = SortMethod.methodFromPreferences(); + bool sortAscending = SortMethod.ascendingFromPreferences; + + List _filterNotes(String? search, List notes) { + if (search == null || search.isEmpty) return []; + + return notes.where((note) { + return note.containsText(search); + }).map((note) { + return NoteTile.searchView(note); + }).toList(); + } + + void _sort(SortMethod sort) { + if (sort == SortMethod.ascending) { + PreferencesManager().set(PreferenceKey.sortAscending.name, !sortAscending); + setState(() { + sortAscending = !sortAscending; + }); + } else { + PreferencesManager().set(PreferenceKey.sortMethod.name, sort.name); + setState(() { + sortMethod = sort; + }); + } + + if (RouterRoute.currentRoute == RouterRoute.notes) { + ref.read(notesProvider.notifier).sort(); + } else if (RouterRoute.currentRoute == RouterRoute.bin) { + ref.read(binProvider.notifier).sort(); + } + } + + @override + Widget build(BuildContext context) { + final searchButtonPlaceholder = IconButton( + onPressed: null, + icon: const Icon(Icons.search), + tooltip: localizations.tooltip_search, + ); + + return AppBar( + leading: DrawerButton( + onPressed: () => drawerKey.currentState!.openDrawer(), + ), + title: Text(RouterRoute.currentRoute.title), + actions: [ + PopupMenuButton( + icon: const Icon(Icons.sort), + tooltip: localizations.tooltip_sort, + itemBuilder: (context) { + return [ + PopupMenuItem( + value: SortMethod.date, + child: ListTile( + selected: sortMethod == SortMethod.date, + leading: const Icon(Icons.calendar_month), + title: Text(localizations.sort_date), + ), + ), + PopupMenuItem( + value: SortMethod.title, + child: ListTile( + selected: sortMethod == SortMethod.title, + leading: const Icon(Icons.sort_by_alpha), + title: Text(localizations.sort_title), + ), + ), + const PopupMenuDivider(), + PopupMenuItem( + value: SortMethod.ascending, + child: ListTile( + title: Text(localizations.sort_ascending), + trailing: Checkbox( + value: sortAscending, + onChanged: (_) { + _sort(SortMethod.ascending); + context.pop(); + }, + ), + ), + ), + ]; + }, + onSelected: (sort) => _sort(sort), + ), + ref.watch(provider).when( + data: (notes) { + if (notes.isEmpty) return searchButtonPlaceholder; + + return SearchAnchor( + viewHintText: localizations.tooltip_search, + builder: (context, controller) { + return IconButton( + onPressed: () => controller.openView(), + icon: const Icon(Icons.search), + tooltip: localizations.tooltip_search, + ); + }, + suggestionsBuilder: (_, controller) => _filterNotes(controller.text, notes), + ); + }, + error: (error, stackTrace) { + return const EmptyPlaceholder(); + }, + loading: () { + return searchButtonPlaceholder; + }, + ), + Padding(padding: Paddings.custom.appBarActionsEnd), + ], + ); + } +} diff --git a/lib/common/navigation/app_bars/selection_app_bar.dart b/lib/common/navigation/app_bars/selection_app_bar.dart new file mode 100644 index 00000000..8126c1b4 --- /dev/null +++ b/lib/common/navigation/app_bars/selection_app_bar.dart @@ -0,0 +1,117 @@ +import 'package:flutter/material.dart'; +import 'package:flutter_riverpod/flutter_riverpod.dart'; +import 'package:localmaterialnotes/common/actions/delete.dart'; +import 'package:localmaterialnotes/common/actions/pin.dart'; +import 'package:localmaterialnotes/common/actions/restore.dart'; +import 'package:localmaterialnotes/common/actions/select.dart'; +import 'package:localmaterialnotes/common/placeholders/empty_placeholder.dart'; +import 'package:localmaterialnotes/common/placeholders/error_placeholder.dart'; +import 'package:localmaterialnotes/common/placeholders/loading_placeholder.dart'; +import 'package:localmaterialnotes/common/routing/router_route.dart'; +import 'package:localmaterialnotes/models/note/note.dart'; +import 'package:localmaterialnotes/providers/bin/bin_provider.dart'; +import 'package:localmaterialnotes/providers/notes/notes_provider.dart'; +import 'package:localmaterialnotes/utils/constants/constants.dart'; +import 'package:localmaterialnotes/utils/constants/paddings.dart'; +import 'package:localmaterialnotes/utils/constants/separators.dart'; + +class SelectionAppBar extends ConsumerStatefulWidget { + const SelectionAppBar(); + + @override + ConsumerState createState() => _SelectionAppBarState(); +} + +class _SelectionAppBarState extends ConsumerState { + Future _togglePin(List selectedNotes) async { + await togglePinNotes(context, ref, selectedNotes); + exitSelectionMode(ref); + } + + Future _restore(List selectedNotes) async { + await restoreNotes(context, ref, selectedNotes); + exitSelectionMode(ref); + } + + Future _delete(List selectedNotes) async { + await deleteNotes(context, ref, selectedNotes); + exitSelectionMode(ref); + } + + Future _permanentlyDelete(List selectedNotes) async { + await permanentlyDeleteNotes(context, ref, selectedNotes); + exitSelectionMode(ref); + } + + AppBar _buildAppBar(List selectedNotes, int totalNotesCount) { + final allSelected = selectedNotes.length == totalNotesCount; + + return AppBar( + leading: BackButton( + onPressed: () => exitSelectionMode(ref), + ), + title: Text('${selectedNotes.length}'), + actions: [ + IconButton( + icon: Icon(allSelected ? Icons.deselect : Icons.select_all), + tooltip: allSelected ? localizations.tooltip_unselect_all : localizations.tooltip_select_all, + onPressed: () => allSelected ? unselectAll(ref) : selectAll(ref), + ), + Padding(padding: Paddings.custom.appBarActionsEnd), + Separator.divider1indent16.vertical, + Padding(padding: Paddings.custom.appBarActionsEnd), + if (RouterRoute.isBin) ...[ + IconButton( + icon: const Icon(Icons.restore_from_trash), + tooltip: localizations.tooltip_restore, + onPressed: selectedNotes.isNotEmpty ? () => _restore(selectedNotes) : null, + ), + IconButton( + icon: const Icon(Icons.delete_forever), + tooltip: localizations.tooltip_permanently_delete, + onPressed: selectedNotes.isNotEmpty ? () => _permanentlyDelete(selectedNotes) : null, + ), + ] else ...[ + IconButton( + icon: const Icon(Icons.push_pin), + tooltip: localizations.tooltip_toggle_pins, + onPressed: selectedNotes.isNotEmpty ? () => _togglePin(selectedNotes) : null, + ), + IconButton( + icon: const Icon(Icons.delete), + tooltip: localizations.tooltip_delete, + onPressed: selectedNotes.isNotEmpty ? () => _delete(selectedNotes) : null, + ), + ], + Padding(padding: Paddings.custom.appBarActionsEnd), + ], + ); + } + + @override + Widget build(BuildContext context) { + return RouterRoute.isBin + ? ref.watch(binProvider).when( + data: (notes) { + return _buildAppBar(notes.where((note) => note.selected).toList(), notes.length); + }, + error: (error, stackTrace) { + return const ErrorPlaceholder(); + }, + loading: () { + return const LoadingPlaceholder(); + }, + ) + : ref.watch(notesProvider).when( + data: (notes) { + return _buildAppBar(notes.where((note) => note.selected).toList(), notes.length); + }, + error: (error, stackTrace) { + return const EmptyPlaceholder(); + }, + loading: () { + return const EmptyPlaceholder(); + }, + ); + } +} diff --git a/lib/common/navigation/side_navigation.dart b/lib/common/navigation/side_navigation.dart new file mode 100644 index 00000000..d2d2c496 --- /dev/null +++ b/lib/common/navigation/side_navigation.dart @@ -0,0 +1,97 @@ +import 'package:flutter/material.dart'; +import 'package:go_router/go_router.dart'; +import 'package:localmaterialnotes/common/routing/router_route.dart'; +import 'package:localmaterialnotes/utils/asset.dart'; +import 'package:localmaterialnotes/utils/constants/constants.dart'; +import 'package:localmaterialnotes/utils/constants/paddings.dart'; +import 'package:localmaterialnotes/utils/constants/sizes.dart'; + +class SideNavigation extends StatefulWidget { + const SideNavigation(); + + @override + State createState() => _SideNavigationState(); +} + +class _SideNavigationState extends State { + late int index; + + @override + void initState() { + super.initState(); + + switch (RouterRoute.currentRoute) { + case RouterRoute.notes: + case RouterRoute.editor: + index = 0; + case RouterRoute.bin: + index = 1; + case RouterRoute.settings: + index = 2; + default: + throw Exception(); + } + } + + void _navigate(int newIndex) { + setState(() { + index = newIndex; + }); + + switch (index) { + case 0: + context.go(RouterRoute.notes.path); + case 1: + context.go(RouterRoute.bin.path); + case 2: + context.go(RouterRoute.settings.path); + default: + throw Exception(); + } + + context.pop(); + } + + @override + Widget build(BuildContext context) { + return NavigationDrawer( + onDestinationSelected: _navigate, + selectedIndex: index, + children: [ + DrawerHeader( + child: Column( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Image.asset( + Asset.icon.path, + filterQuality: FilterQuality.medium, + fit: BoxFit.fitWidth, + width: Sizes.size64.size, + ), + Padding(padding: Paddings.padding8.vertical), + Text( + localizations.app_name, + style: Theme.of(context).textTheme.headlineSmall, + ), + ], + ), + ), + NavigationDrawerDestination( + icon: const Icon(Icons.notes_outlined), + selectedIcon: const Icon(Icons.notes), + label: Text(localizations.navigation_notes), + ), + NavigationDrawerDestination( + icon: const Icon(Icons.delete_outline), + selectedIcon: const Icon(Icons.delete), + label: Text(localizations.navigation_bin), + ), + NavigationDrawerDestination( + icon: const Icon(Icons.settings_outlined), + selectedIcon: const Icon(Icons.settings), + label: Text(localizations.navigation_settings), + ), + ], + ); + } +} diff --git a/lib/common/navigation/top_navigation.dart b/lib/common/navigation/top_navigation.dart new file mode 100644 index 00000000..f393ac08 --- /dev/null +++ b/lib/common/navigation/top_navigation.dart @@ -0,0 +1,57 @@ +import 'package:flutter/material.dart'; +import 'package:flutter_riverpod/flutter_riverpod.dart'; +import 'package:localmaterialnotes/common/navigation/app_bars/back_app_bar.dart'; +import 'package:localmaterialnotes/common/navigation/app_bars/back_menu_app_bar.dart'; +import 'package:localmaterialnotes/common/navigation/app_bars/empty_app_bar.dart'; +import 'package:localmaterialnotes/common/navigation/app_bars/search_sort_app_bar.dart'; +import 'package:localmaterialnotes/common/navigation/app_bars/selection_app_bar.dart'; +import 'package:localmaterialnotes/providers/selection_mode/selection_mode_provider.dart'; +import 'package:localmaterialnotes/utils/constants/sizes.dart'; + +enum TopNavigationStyle { + empty, + back, + backMenu, + searchSort, +} + +class TopNavigation extends ConsumerWidget implements PreferredSizeWidget { + const TopNavigation.empty() : topNavigationStyle = TopNavigationStyle.empty; + + const TopNavigation.back() : topNavigationStyle = TopNavigationStyle.back; + + const TopNavigation.backMenu() : topNavigationStyle = TopNavigationStyle.backMenu; + + const TopNavigation.searchSort({super.key}) : topNavigationStyle = TopNavigationStyle.searchSort; + + final TopNavigationStyle topNavigationStyle; + + @override + Size get preferredSize { + var height = kToolbarHeight; + + if (topNavigationStyle == TopNavigationStyle.searchSort) { + height += Sizes.custom.searchAppBar; + } + + return Size.fromHeight(height); + } + + @override + Widget build(BuildContext context, WidgetRef ref) { + if (ref.watch(selectionModeProvider)) { + return const SelectionAppBar(); + } + + switch (topNavigationStyle) { + case TopNavigationStyle.empty: + return const EmptyAppBar(); + case TopNavigationStyle.back: + return const BackAppBar(); + case TopNavigationStyle.backMenu: + return const BackMenuAppBar(); + case TopNavigationStyle.searchSort: + return SearchSortAppBar(key: super.key); + } + } +} diff --git a/lib/common/placeholders/empty_placeholder.dart b/lib/common/placeholders/empty_placeholder.dart new file mode 100644 index 00000000..dd3cac14 --- /dev/null +++ b/lib/common/placeholders/empty_placeholder.dart @@ -0,0 +1,51 @@ +import 'package:flutter/material.dart'; +import 'package:localmaterialnotes/utils/constants/constants.dart'; +import 'package:localmaterialnotes/utils/constants/paddings.dart'; +import 'package:localmaterialnotes/utils/constants/sizes.dart'; + +class EmptyPlaceholder extends StatelessWidget { + const EmptyPlaceholder() + : icon = null, + text = null; + + EmptyPlaceholder.notes() + : icon = Icons.notes, + text = localizations.placeholder_notes; + + EmptyPlaceholder.bin() + : icon = Icons.delete_outline, + text = localizations.placeholder_bin; + + final IconData? icon; + final String? text; + + @override + Widget build(BuildContext context) { + if (icon == null || text == null) return Container(); + + return Center( + child: Padding( + padding: Paddings.custom.page, + child: SingleChildScrollView( + child: Column( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Icon( + icon, + size: Sizes.size64.size, + color: Theme.of(context).colorScheme.onSurfaceVariant, + ), + Padding(padding: Paddings.padding16.vertical), + Text( + text!, + style: Theme.of(context).textTheme.headlineSmall?.copyWith( + color: Theme.of(context).colorScheme.onSurfaceVariant, + ), + ), + ], + ), + ), + ), + ); + } +} diff --git a/lib/common/placeholders/error_placeholder.dart b/lib/common/placeholders/error_placeholder.dart new file mode 100644 index 00000000..e1236a81 --- /dev/null +++ b/lib/common/placeholders/error_placeholder.dart @@ -0,0 +1,15 @@ +import 'package:flutter/material.dart'; +import 'package:localmaterialnotes/utils/constants/constants.dart'; + +class ErrorPlaceholder extends StatelessWidget { + const ErrorPlaceholder(); + + @override + Widget build(BuildContext context) { + return Center( + child: SingleChildScrollView( + child: Text(localizations.error_error), + ), + ); + } +} diff --git a/lib/common/placeholders/loading_placeholder.dart b/lib/common/placeholders/loading_placeholder.dart new file mode 100644 index 00000000..b33292e2 --- /dev/null +++ b/lib/common/placeholders/loading_placeholder.dart @@ -0,0 +1,14 @@ +import 'package:flutter/material.dart'; + +class LoadingPlaceholder extends StatelessWidget { + const LoadingPlaceholder(); + + @override + Widget build(BuildContext context) { + return const Center( + child: SingleChildScrollView( + child: CircularProgressIndicator(), + ), + ); + } +} diff --git a/lib/common/routing/router.dart b/lib/common/routing/router.dart new file mode 100644 index 00000000..b76ac062 --- /dev/null +++ b/lib/common/routing/router.dart @@ -0,0 +1,105 @@ +import 'package:flutter/material.dart'; +import 'package:go_router/go_router.dart'; +import 'package:localmaterialnotes/common/fabs/fab_add_note.dart'; +import 'package:localmaterialnotes/common/fabs/fab_empty_bin.dart'; +import 'package:localmaterialnotes/common/navigation/side_navigation.dart'; +import 'package:localmaterialnotes/common/navigation/top_navigation.dart'; +import 'package:localmaterialnotes/common/routing/router_route.dart'; +import 'package:localmaterialnotes/pages/bin/bin_page.dart'; +import 'package:localmaterialnotes/pages/editor/editor_page.dart'; +import 'package:localmaterialnotes/pages/notes/notes_page.dart'; +import 'package:localmaterialnotes/pages/settings/settings_page.dart'; +import 'package:localmaterialnotes/utils/constants/constants.dart'; + +typedef EditorParameters = Map?; + +CustomTransitionPage _getCustomTransitionPage(GoRouterState state, Widget child) { + return CustomTransitionPage( + key: state.pageKey, + child: child, + transitionsBuilder: (context, animation, secondaryAnimation, child) { + return FadeTransition(opacity: animation, child: child); + }, + ); +} + +Page Function(BuildContext, GoRouterState) _defaultPageBuilder(Widget child) { + return (BuildContext context, GoRouterState state) { + return _getCustomTransitionPage(state, child); + }; +} + +PreferredSizeWidget? _getAppBar(BuildContext context) { + switch (RouterRoute.currentRoute) { + case RouterRoute.notes: + case RouterRoute.bin: + return TopNavigation.searchSort(key: UniqueKey()); + case RouterRoute.editor: + return const TopNavigation.backMenu(); + case RouterRoute.settings: + return const TopNavigation.empty(); + default: + return null; + } +} + +Widget? _getFloatingActionButton(BuildContext context) { + switch (RouterRoute.currentRoute) { + case RouterRoute.notes: + return const FabAddNote(); + case RouterRoute.bin: + return const FabEmptyBin(); + default: + return null; + } +} + +final router = GoRouter( + navigatorKey: navigatorKey, + initialLocation: RouterRoute.notes.path, + routes: [ + ShellRoute( + builder: (context, state, child) { + return SafeArea( + child: Scaffold( + key: drawerKey, + appBar: _getAppBar(context), + drawer: const SideNavigation(), + body: child, + floatingActionButton: _getFloatingActionButton(context), + ), + ); + }, + routes: [ + GoRoute( + path: RouterRoute.notes.path, + pageBuilder: _defaultPageBuilder(const NotesPage()), + routes: [ + GoRoute( + path: RouterRoute.editor.path, + pageBuilder: (context, state) { + final parameters = state.extra as EditorParameters; + + return _getCustomTransitionPage( + state, + EditorPage( + readOnly: parameters?['readonly'] ?? false, + autofocus: parameters?['autofocus'] ?? false, + ), + ); + }, + ), + ], + ), + GoRoute( + path: RouterRoute.bin.path, + pageBuilder: _defaultPageBuilder(const BinPage()), + ), + GoRoute( + path: RouterRoute.settings.path, + pageBuilder: _defaultPageBuilder(const SettingsPage()), + ), + ], + ), + ], +); diff --git a/lib/common/routing/router_route.dart b/lib/common/routing/router_route.dart new file mode 100644 index 00000000..38aa5552 --- /dev/null +++ b/lib/common/routing/router_route.dart @@ -0,0 +1,49 @@ +import 'package:go_router/go_router.dart'; +import 'package:localmaterialnotes/utils/constants/constants.dart'; +import 'package:localmaterialnotes/utils/extensions/go_router_extension.dart'; + +enum RouterRoute { + login('/login'), + signup('/signup'), + notes('/notes'), + editor('editor', '/notes/editor'), + bin('/bin'), + settings('/settings'), + ; + + final String path; + final String? fullPath; + + const RouterRoute(this.path, [this.fullPath]); + + String get title { + switch (this) { + case RouterRoute.notes: + return localizations.navigation_notes; + case RouterRoute.bin: + return localizations.navigation_bin; + case RouterRoute.settings: + return localizations.navigation_settings; + default: + throw Exception('Unexpected route: $this'); + } + } + + static RouterRoute get currentRoute { + final location = GoRouter.of(navigatorKey.currentContext!).location(); + + if (location == RouterRoute.notes.path) { + return RouterRoute.notes; + } else if (location.contains(RouterRoute.editor.path)) { + return RouterRoute.editor; + } else if (location == RouterRoute.bin.path) { + return RouterRoute.bin; + } else if (location == RouterRoute.settings.path) { + return RouterRoute.settings; + } else { + return RouterRoute.notes; + } + } + + static bool get isBin => RouterRoute.currentRoute == RouterRoute.bin; +} diff --git a/lib/common/widgets/input_decorations.dart b/lib/common/widgets/input_decorations.dart new file mode 100644 index 00000000..9e78d5e3 --- /dev/null +++ b/lib/common/widgets/input_decorations.dart @@ -0,0 +1,37 @@ +import 'package:flutter/material.dart'; +import 'package:localmaterialnotes/utils/constants/radiuses.dart'; + +InputDecoration authenticationTextFormFieldDecoration( + BuildContext context, + IconData icon, + String hint, [ + Widget? suffixIcon, +]) { + return InputDecoration( + prefixIcon: Icon(icon), + suffixIcon: suffixIcon, + hintText: hint, + filled: true, + fillColor: Theme.of(context).colorScheme.secondaryContainer, + border: OutlineInputBorder( + borderRadius: Radiuses.radius64.circular, + borderSide: BorderSide.none, + ), + focusedBorder: OutlineInputBorder( + borderRadius: Radiuses.radius64.circular, + borderSide: BorderSide( + color: Theme.of(context).colorScheme.secondary, + ), + ), + errorBorder: OutlineInputBorder( + borderRadius: Radiuses.radius64.circular, + borderSide: BorderSide.none, + ), + focusedErrorBorder: OutlineInputBorder( + borderRadius: Radiuses.radius64.circular, + borderSide: BorderSide( + color: Theme.of(context).colorScheme.error, + ), + ), + ); +} diff --git a/lib/common/widgets/note_tile.dart b/lib/common/widgets/note_tile.dart new file mode 100644 index 00000000..4425b1cd --- /dev/null +++ b/lib/common/widgets/note_tile.dart @@ -0,0 +1,189 @@ +import 'package:flutter/material.dart'; +import 'package:flutter_riverpod/flutter_riverpod.dart'; +import 'package:go_router/go_router.dart'; +import 'package:localmaterialnotes/common/actions/delete.dart'; +import 'package:localmaterialnotes/common/actions/pin.dart'; +import 'package:localmaterialnotes/common/actions/restore.dart'; +import 'package:localmaterialnotes/common/routing/router.dart'; +import 'package:localmaterialnotes/common/routing/router_route.dart'; +import 'package:localmaterialnotes/models/note/note.dart'; +import 'package:localmaterialnotes/providers/bin/bin_provider.dart'; +import 'package:localmaterialnotes/providers/current_note/current_note_provider.dart'; +import 'package:localmaterialnotes/providers/notes/notes_provider.dart'; +import 'package:localmaterialnotes/providers/selection_mode/selection_mode_provider.dart'; +import 'package:localmaterialnotes/utils/constants/constants.dart'; +import 'package:localmaterialnotes/utils/constants/paddings.dart'; +import 'package:localmaterialnotes/utils/constants/sizes.dart'; + +class NoteTile extends ConsumerStatefulWidget { + const NoteTile(this.note) : searchView = false; + + const NoteTile.searchView(this.note) : searchView = true; + + final Note note; + final bool searchView; + + @override + ConsumerState createState() => _NoteTileState(); +} + +class _NoteTileState extends ConsumerState { + void _enterSelectionMode() { + ref.read(selectionModeProvider.notifier).enterSelectionMode(); + widget.note.deleted + ? ref.read(binProvider.notifier).select(widget.note) + : ref.read(notesProvider.notifier).select(widget.note); + } + + void _openOrSelect() { + if (ref.watch(selectionModeProvider)) { + if (widget.note.deleted) { + widget.note.selected + ? ref.read(binProvider.notifier).unselect(widget.note) + : ref.read(binProvider.notifier).select(widget.note); + } else { + widget.note.selected + ? ref.read(notesProvider.notifier).unselect(widget.note) + : ref.read(notesProvider.notifier).select(widget.note); + } + } else { + ref.read(currentNoteProvider.notifier).set(widget.note); + + context.push( + RouterRoute.editor.fullPath!, + extra: EditorParameters.from({ + 'readonly': widget.note.deleted, + 'autofocus': false, + }), + ); + + if (widget.searchView) context.pop(); + } + } + + Future _dismiss(DismissDirection direction) { + switch (direction) { + case DismissDirection.startToEnd: + return widget.note.deleted + ? permanentlyDeleteNote(context, ref, widget.note) + : deleteNote(context, ref, widget.note); + case DismissDirection.endToStart: + return widget.note.deleted ? restoreNote(context, ref, widget.note) : togglePinNote(context, ref, widget.note); + default: + return Future.value(false); + } + } + + @override + Widget build(BuildContext context) { + Color? backgroundColor; + if (widget.note.selected) { + backgroundColor = Theme.of(context).colorScheme.surfaceVariant; + } + + final isTitleEmpty = widget.note.title.isEmpty; + + return Dismissible( + key: Key(widget.note.id.toString()), + background: widget.note.deleted + ? ColoredBox( + color: Colors.red, + child: Row( + children: [ + Padding(padding: Paddings.padding8.horizontal), + const Icon(Icons.delete_forever), + Padding(padding: Paddings.padding4.horizontal), + Text( + localizations.dismiss_permanently_delete, + style: Theme.of(context).textTheme.titleMedium, + ), + ], + ), + ) + : ColoredBox( + color: Colors.red, + child: Row( + children: [ + Padding(padding: Paddings.padding8.horizontal), + const Icon(Icons.delete), + Padding(padding: Paddings.padding4.horizontal), + Text( + localizations.dismiss_delete, + style: Theme.of(context).textTheme.titleMedium, + ), + ], + ), + ), + secondaryBackground: widget.note.deleted + ? ColoredBox( + color: Colors.blue, + child: Row( + mainAxisAlignment: MainAxisAlignment.end, + children: [ + const Icon(Icons.restore_from_trash), + Padding(padding: Paddings.padding4.horizontal), + Text( + localizations.dismiss_restore, + style: Theme.of(context).textTheme.titleMedium, + ), + Padding(padding: Paddings.padding8.horizontal), + ], + ), + ) + : ColoredBox( + color: Colors.blue, + child: Row( + mainAxisAlignment: MainAxisAlignment.end, + children: [ + Icon( + widget.note.pinned ? Icons.push_pin_outlined : Icons.push_pin, + ), + Padding(padding: Paddings.padding4.horizontal), + Text( + widget.note.pinned ? localizations.dismiss_unpin : localizations.dismiss_pin, + style: Theme.of(context).textTheme.titleMedium, + ), + Padding(padding: Paddings.padding8.horizontal), + ], + ), + ), + confirmDismiss: _dismiss, + child: ListTile( + contentPadding: Paddings.padding16.horizontal.add(Paddings.padding8.vertical), + tileColor: !widget.searchView ? backgroundColor : null, + title: Row( + children: [ + Expanded( + child: Text( + isTitleEmpty ? localizations.notes_untitled : widget.note.title, + maxLines: 1, + overflow: TextOverflow.ellipsis, + style: Theme.of(context).textTheme.titleMedium?.copyWith( + fontStyle: isTitleEmpty ? FontStyle.italic : null, + ), + ), + ), + Padding(padding: Paddings.padding4.horizontal), + if (widget.note.pinned && !widget.note.deleted) + Icon( + Icons.push_pin, + size: Sizes.size16.size, + ), + ], + ), + subtitle: widget.note.contentDisplay.isNotEmpty + ? Text( + widget.note.contentDisplay, + maxLines: 3, + overflow: TextOverflow.ellipsis, + style: Theme.of(context).textTheme.bodyMedium?.copyWith( + color: Theme.of(context).textTheme.bodyMedium?.color?.withAlpha(175), + ), + ) + : null, + onTap: _openOrSelect, + onLongPress: widget.searchView ? null : _enterSelectionMode, + ), + ); + } +} diff --git a/lib/l10n/app_en.arb b/lib/l10n/app_en.arb new file mode 100644 index 00000000..b26f7f0b --- /dev/null +++ b/lib/l10n/app_en.arb @@ -0,0 +1,134 @@ +{ + "app_name": "Material Notes", + "navigation_notes": "Notes", + "navigation_bin": "Bin", + "navigation_settings": "Settings", + "error_error": "Error", + "error_wrong_email_password": "Wrong username or password.", + "error_confirm_email": "Please confirm your email and then try again.", + "error_invalid_email": "Invalid email", + "error_required": "Required", + "error_password_requirements": "Requirements:\n• 12 characters\n• 1 lower case\n• 1 upper case\n• 1 number\n• 1 special character (!@#$&%*^\"''`<>+=-;:~,._;/\\|()[]'{}')", + "error_password_do_not_match": "Passwords do not match", + "login_email": "Email", + "login_password": "Password", + "login_log_in": "Log in", + "login_log_out": "Log out", + "signup_sign_up": "Sign up", + "signup_email": "Email", + "signup_password": "Password", + "signup_password_confirmation": "Confirm your password", + "signup_confirm_email": "Please confirm your email before signing in.", + "settings_account": "Account", + "settings_user": "User", + "settings_log_out": "Log out", + "settings_log_out_description": "Log out of {appName}", + "settings_change_password": "Change my password", + "settings_change_password_description": "Change my password for {appName}", + "settings_change_password_success": "Your password has been changed, please log back in.", + "settings_appearance": "Appearance", + "settings_theme": "Theme", + "settings_theme_system": "System", + "settings_theme_light": "Light", + "settings_theme_dark": "Dark", + "settings_dynamic_theming": "Dynamic theming", + "settings_dynamic_theming_description": "Generate colors from your system", + "settings_black_theming": "Black theming", + "settings_black_theming_description": "Use a black background in dark mode", + "settings_language": "Language", + "settings_language_restart": "Please restart the app for the changes to take effect.", + "settings_behavior": "Behavior", + "settings_confirmations": "Show confirmation dialogs", + "settings_shortcuts": "Shortcuts", + "settings_shortcuts_description": "Show all shortcuts available in the text editor", + "settings_about": "About", + "settings_github": "GitHub", + "settings_github_description": "Take a look at the source code", + "settings_licence": "License", + "settings_licence_description": "AGPL-3.0", + "shortcut_bold": "Bold", + "shortcut_italic": "Italic", + "shortcut_underline": "Underline", + "shortcut_undo": "Undo", + "shortcut_redo": "Redo", + "action_add_note": "Add a note", + "label_old_password": "Old password", + "label_new_password": "New password", + "label_new_password_confirmation": "Confirm new password", + "hint_email": "Email", + "hint_password": "Password", + "hint_password_confirmation": "Confirm password", + "hint_old_password": "myOldPassword", + "hint_new_password": "myNewPassword", + "hint_new_password_confirmation": "myNewPassword", + "hint_title": "Title", + "hint_collaborator_email": "collaborator@example.com", + "tooltip_fab_add_note": "Add a note", + "tooltip_fab_empty_bin": "Empty the bin", + "tooltip_fab_add_collaborator": "Add a collaborator", + "tooltip_sort": "Sort the notes", + "tooltip_search": "Search the notes", + "tooltip_toggle_checkbox": "Toggle checkbox", + "tooltip_select_all": "Select all", + "tooltip_unselect_all": "Unselect all", + "tooltip_delete": "Delete", + "tooltip_permanently_delete": "Permanently delete", + "tooltip_restore": "Restore", + "tooltip_toggle_pins": "Toggle pins", + "button_close": "Close", + "button_cancel": "Cancel", + "button_refresh": "Refresh", + "button_add": "Add", + "dialog_log_out": "Log out", + "dialog_log_out_body": "Do you really want to log out?", + "dialog_delete": "Delete", + "dialog_delete_body": "Do you really want to delete {count} {count, plural, zero{} one{note} other{notes}}? You can restore {count, plural, zero{} one{it} other{them}} from the bin.", + "dialog_delete_body_single": "Do you really want to delete this note? You can restore it from the bin.", + "dialog_permanently_delete": "Delete permanently", + "dialog_permanently_delete_body": "Do you really want to permanently delete {count} {count, plural, zero{} one{note} other{notes}}? You will not be able to restore {count, plural, zero{} one{it} other{them}}.", + "dialog_permanently_delete_body_single": "Do you really want to permanently delete this note? You will not be able to restore it.", + "dialog_restore": "Restore", + "dialog_restore_body": "Do you really want to restore {count} {count, plural, zero{} one{note} other{notes}}?", + "dialog_restore_body_single": "Do you really want to restore this note?", + "dialog_empty_bin": "Empty the bin", + "dialog_empty_bin_body": "Do you really want to permanently empty the bin? You will not be able to restore the notes it contains.", + "dialog_add_collaborator": "Add a collaborator", + "dialog_remove_collaborator": "Remove this collaborator", + "dialog_remove_collaborator_body": "Do you really want to remove this collaborator?", + "sort_date": "Date", + "sort_title": "Title", + "sort_ascending": "Ascending", + "placeholder_notes": "No notes", + "placeholder_bin": "The bin is empty", + "placeholder_collaborators": "No collaborators", + "menu_pin": "Pin", + "menu_share": "Share", + "menu_unpin": "Unpin", + "menu_collaborate": "Collaborate", + "menu_delete": "Delete", + "menu_restore": "Restore", + "menu_delete_permanently": "Delete permanently", + "menu_about": "About", + "notes_untitled": "Untitled note", + "confirmations_title_none": "Never", + "confirmations_title_irreversible": "Irreversible actions only", + "confirmations_title_all": "Always", + "confirmations_description_none": "Never ask for a confirmation", + "confirmations_description_irreversible": "Only ask for a confirmation for actions that are not reversible (such as permanently deleting notes from the bin)", + "confirmations_description_all": "Always ask for a confirmation for all important actions even if they can be reversed (such as deleting or restoring a note)", + "dismiss_pin": "Pin", + "dismiss_unpin": "Unpin", + "dismiss_delete": "Delete", + "dismiss_permanently_delete": "Permanently delete", + "dismiss_restore": "Restore", + "collaborators_collaborators": "Collaborators", + "collaborators_owner": "Owner", + "collaborators_guest": "Guest", + "collaborators_owner_description": "You are the owner of this note.\n\nYou can add or remove collaborators. If you delete this note, all collaborators will loose access to it. They will gain access back if you restore it.\n\nLimitations:\n- You cannot remove yourself from the collaborators.\n- The pinned state is shared among every collaborator.", + "collaborators_guest_description": "You were invited as a collaborator to this note.\n\nYou cannot add or remove collaborators, only the owner can.\n\nLimitations:\n- You cannot remove yourself from the collaborators.\n- The pinned state is shared among every collaborator.", + "about_last_edited": "Last edited", + "about_created": "Created", + "about_words": "Words", + "about_characters": "Characters", + "time_at": "at" +} \ No newline at end of file diff --git a/lib/l10n/app_fr.arb b/lib/l10n/app_fr.arb new file mode 100644 index 00000000..b304afd3 --- /dev/null +++ b/lib/l10n/app_fr.arb @@ -0,0 +1,134 @@ +{ + "app_name": "Material Notes", + "navigation_notes": "Notes", + "navigation_bin": "Corbeille", + "navigation_settings": "Paramètres", + "error_error": "Erreur", + "error_wrong_email_password": "Mauvais email ou mot de passe.", + "error_confirm_email": "Merci de confirmer votre email et de réessayer.", + "error_invalid_email": "Email invalide", + "error_required": "Requis", + "error_password_requirements": "Requis:\n• 12 caractères\n• 1 minuscule\n• 1 majuscule\n• 1 nombre\n• 1 caractère spécial (!@#$&%*^\"''`<>+=-;:~,._;/\\|()[]'{}')", + "error_password_do_not_match": "Les mots de passe ne correspondent pas", + "login_email": "Email", + "login_password": "Mot de passe", + "login_log_in": "Se connecter", + "login_log_out": "Se déconnecter", + "signup_sign_up": "S''inscrire", + "signup_email": "Email", + "signup_password": "Mot de passe", + "signup_password_confirmation": "Confirmer mot de passe", + "signup_confirm_email": "Merci de confirmer votre email avant de vous connecter.", + "settings_account": "Compte", + "settings_user": "Utilisateur", + "settings_log_out": "Se déconnecter", + "settings_log_out_description": "Se déconnecter de {appName}", + "settings_change_password": "Changer mon mot de passe", + "settings_change_password_description": "Changer mon mot de passe pour {appName}", + "settings_change_password_success": "Votre mot de passe a été changé, veuillez vous reconnecter.", + "settings_appearance": "Apparence", + "settings_theme": "Thème", + "settings_theme_system": "Système", + "settings_theme_light": "Clair", + "settings_theme_dark": "Sombre", + "settings_dynamic_theming": "Thème dynamique", + "settings_dynamic_theming_description": "Génère des couleurs depuis votre système", + "settings_black_theming": "Thème noir", + "settings_black_theming_description": "Utilise un fond noir pour le thème sombre", + "settings_language": "Langue", + "settings_language_restart": "Merci de recharger l''application pour que les changements prennent effet.", + "settings_behavior": "Comportement", + "settings_shortcuts": "Raccourcis", + "settings_shortcuts_description": "Lister tous les raccourcis disponibles dans l''éditeur de texte", + "settings_confirmations": "Afficher les dialogues de confirmation", + "settings_about": "À propos", + "settings_github": "GitHub", + "settings_github_description": "Jeter un coup d''œil au code source", + "settings_licence": "License", + "shortcut_bold": "Gras", + "shortcut_italic": "Italique", + "shortcut_underline": "Souligné", + "shortcut_undo": "Annuler", + "shortcut_redo": "Rétablir", + "action_add_note": "Ajouter une note", + "settings_licence_description": "AGPL-3.0", + "label_old_password": "Ancien mot de passe", + "label_new_password": "Nouveau mot de passe", + "label_new_password_confirmation": "Confirmer nouveau mot de passe", + "hint_email": "Email", + "hint_password": "Mot de passe", + "hint_password_confirmation": "Confirmer mot de passe", + "hint_old_password": "monAncienMotDePasse", + "hint_new_password": "monNouveauMotDePasse", + "hint_new_password_confirmation": "monNouveauMotDePasse", + "hint_title": "Titre", + "hint_collaborator_email": "collaborateur@exemple.com", + "tooltip_fab_add_note": "Ajouter une note", + "tooltip_fab_empty_bin": "Vider la corbeille", + "tooltip_fab_add_collaborator": "Ajouter un collaborateur", + "tooltip_sort": "Trier les notes", + "tooltip_search": "Rechercher parmi les notes", + "tooltip_toggle_checkbox": "Basculer la case à cocher", + "tooltip_select_all": "Tout sélectionner", + "tooltip_unselect_all": "Tout déselectionner", + "tooltip_delete": "Supprimer", + "tooltip_permanently_delete": "Supprimer définitivement", + "tooltip_restore": "Restaurer", + "tooltip_toggle_pins": "Basculer les épingles", + "button_close": "Fermer", + "button_cancel": "Annuler", + "button_refresh": "Rafraîchir", + "button_add": "Ajouter", + "dialog_log_out": "Se déconnecter", + "dialog_log_out_body": "Voulez-vous vraiment vous déconnecter ?", + "dialog_delete": "Supprimer", + "dialog_delete_body": "Voulez-vous vraiment supprimer {count} {count, plural, zero{} one{note} other{notes}} ? Vous pouvez {count, plural, zero{} one{la} other{les}} restaurer depuis la corbeille.", + "dialog_delete_body_single": "Voulez-vous vraiment supprimer cette note ? Vous pouvez la restaurer depuis la corbeille.", + "dialog_permanently_delete": "Supprimer définitivement", + "dialog_permanently_delete_body": "Voulez-vous vraiment supprimer définitivement {count} {count, plural, zero{} one{note} other{notes}} ? Vous ne pourrez pas {count, plural, zero{} one{la} other{les}} restaurer.", + "dialog_permanently_delete_body_single": "Voulez-vous vraiment supprimer définitivement cette note ? Vous ne pourrez pas la restaurer.", + "dialog_restore": "Restaurer", + "dialog_restore_body": "Voulez-vous vraiment restaurer {count} {count, plural, zero{} one{note} other{notes}} ?", + "dialog_restore_body_single": "Voulez-vous vraiment restaurer cette note ?", + "dialog_empty_bin": "Vider la corbeille", + "dialog_empty_bin_body": "Voulez-vous vraiment vider définitivement la corbeille ? Vous ne pourrez pas restaurer les notes qu''elle contient.", + "dialog_add_collaborator": "Ajouter un collaborateur", + "dialog_remove_collaborator": "Retirer ce collaborateur", + "dialog_remove_collaborator_body": "Voulez-vous vraiment retirer ce collaborateur ?", + "sort_date": "Date", + "sort_title": "Titre", + "sort_ascending": "Croissant", + "placeholder_notes": "Pas de notes", + "placeholder_bin": "La corbeille est vide", + "placeholder_collaborators": "Pas de collaborateurs", + "menu_pin": "Épingler", + "menu_share": "Partager", + "menu_unpin": "Désépingler", + "menu_collaborate": "Collaborer", + "menu_delete": "Supprimer", + "menu_restore": "Restaurer", + "menu_delete_permanently": "Supprimer définitivement", + "menu_about": "À propos", + "notes_untitled": "Note sans titre", + "confirmations_title_none": "Jamais", + "confirmations_title_irreversible": "Actions irréversibles uniquement", + "confirmations_title_all": "Toujours", + "confirmations_description_none": "Ne jamais demander de confirmation", + "confirmations_description_irreversible": "Ne demander de confirmation que pour les actions qui ne sont pas réversibles (comme supprimer définitivement des notes de la corbeille)", + "confirmations_description_all": "Toujours demander une confirmation pour les actions importantes même si elles peuvent être annulées (comme supprimer ou restaurer une note)", + "dismiss_pin": "Épingler", + "dismiss_unpin": "Désépingler", + "dismiss_delete": "Supprimer", + "dismiss_permanently_delete": "Supprimer définitivement", + "dismiss_restore": "Restaurer", + "collaborators_collaborators": "Collaborateurs", + "collaborators_owner": "Propriétaire", + "collaborators_guest": "Invité", + "collaborators_owner_description": "Vous êtes le propriétaire de cette note.\n\nVous pouvez ajouter ou retirer des collaborateurs. Si vous supprimez cette note, tous les collaborateurs en perdront l''accès. Ils le regagneront si vous la restaurez.\n\nLimitations:\n- Vous ne pouvez pas vous retirer vous-mêmes des collaborateurs.\n- L''état d''épingle est partagé entre tous les collaborateurs.", + "collaborators_guest_description": "Vous avez été invité en tant que collaborateur sur cette note.\n\nVous ne pouvez pas ajouter ni retirer des collaborateurs, seul le propriétaire le peut.\n\nLimitations:\n- Vous ne pouvez pas vous retirer vous-mêmes des collaborateurs.\n- L''état d''épingle est partagé entre tous les collaborateurs.", + "about_last_edited": "Dernière modification", + "about_created": "Création", + "about_words": "Mots", + "about_characters": "Caractères", + "time_at": "à" +} \ No newline at end of file diff --git a/lib/l10n/app_localizations.g.dart b/lib/l10n/app_localizations.g.dart new file mode 100644 index 00000000..b5ac177c --- /dev/null +++ b/lib/l10n/app_localizations.g.dart @@ -0,0 +1,919 @@ +import 'dart:async'; + +import 'package:flutter/foundation.dart'; +import 'package:flutter/widgets.dart'; +import 'package:flutter_localizations/flutter_localizations.dart'; +import 'package:intl/intl.dart' as intl; + +import 'app_localizations_en.g.dart'; +import 'app_localizations_fr.g.dart'; + +/// Callers can lookup localized strings with an instance of AppLocalizations +/// returned by `AppLocalizations.of(context)`. +/// +/// Applications need to include `AppLocalizations.delegate()` in their app's +/// `localizationDelegates` list, and the locales they support in the app's +/// `supportedLocales` list. For example: +/// +/// ```dart +/// import 'l10n/app_localizations.g.dart'; +/// +/// return MaterialApp( +/// localizationsDelegates: AppLocalizations.localizationsDelegates, +/// supportedLocales: AppLocalizations.supportedLocales, +/// home: MyApplicationHome(), +/// ); +/// ``` +/// +/// ## Update pubspec.yaml +/// +/// Please make sure to update your pubspec.yaml to include the following +/// packages: +/// +/// ```yaml +/// dependencies: +/// # Internationalization support. +/// flutter_localizations: +/// sdk: flutter +/// intl: any # Use the pinned version from flutter_localizations +/// +/// # Rest of dependencies +/// ``` +/// +/// ## iOS Applications +/// +/// iOS applications define key application metadata, including supported +/// locales, in an Info.plist file that is built into the application bundle. +/// To configure the locales supported by your app, you’ll need to edit this +/// file. +/// +/// First, open your project’s ios/Runner.xcworkspace Xcode workspace file. +/// Then, in the Project Navigator, open the Info.plist file under the Runner +/// project’s Runner folder. +/// +/// Next, select the Information Property List item, select Add Item from the +/// Editor menu, then select Localizations from the pop-up menu. +/// +/// Select and expand the newly-created Localizations item then, for each +/// locale your application supports, add a new item and select the locale +/// you wish to add from the pop-up menu in the Value field. This list should +/// be consistent with the languages listed in the AppLocalizations.supportedLocales +/// property. +abstract class AppLocalizations { + AppLocalizations(String locale) : localeName = intl.Intl.canonicalizedLocale(locale.toString()); + + final String localeName; + + static AppLocalizations? of(BuildContext context) { + return Localizations.of(context, AppLocalizations); + } + + static const LocalizationsDelegate delegate = _AppLocalizationsDelegate(); + + /// A list of this localizations delegate along with the default localizations + /// delegates. + /// + /// Returns a list of localizations delegates containing this delegate along with + /// GlobalMaterialLocalizations.delegate, GlobalCupertinoLocalizations.delegate, + /// and GlobalWidgetsLocalizations.delegate. + /// + /// Additional delegates can be added by appending to this list in + /// MaterialApp. This list does not have to be used at all if a custom list + /// of delegates is preferred or required. + static const List> localizationsDelegates = >[ + delegate, + GlobalMaterialLocalizations.delegate, + GlobalCupertinoLocalizations.delegate, + GlobalWidgetsLocalizations.delegate, + ]; + + /// A list of this localizations delegate's supported locales. + static const List supportedLocales = [ + Locale('en'), + Locale('fr') + ]; + + /// No description provided for @app_name. + /// + /// In en, this message translates to: + /// **'Material Notes'** + String get app_name; + + /// No description provided for @navigation_notes. + /// + /// In en, this message translates to: + /// **'Notes'** + String get navigation_notes; + + /// No description provided for @navigation_bin. + /// + /// In en, this message translates to: + /// **'Bin'** + String get navigation_bin; + + /// No description provided for @navigation_settings. + /// + /// In en, this message translates to: + /// **'Settings'** + String get navigation_settings; + + /// No description provided for @error_error. + /// + /// In en, this message translates to: + /// **'Error'** + String get error_error; + + /// No description provided for @error_wrong_email_password. + /// + /// In en, this message translates to: + /// **'Wrong username or password.'** + String get error_wrong_email_password; + + /// No description provided for @error_confirm_email. + /// + /// In en, this message translates to: + /// **'Please confirm your email and then try again.'** + String get error_confirm_email; + + /// No description provided for @error_invalid_email. + /// + /// In en, this message translates to: + /// **'Invalid email'** + String get error_invalid_email; + + /// No description provided for @error_required. + /// + /// In en, this message translates to: + /// **'Required'** + String get error_required; + + /// No description provided for @error_password_requirements. + /// + /// In en, this message translates to: + /// **'Requirements:\n• 12 characters\n• 1 lower case\n• 1 upper case\n• 1 number\n• 1 special character (!@#\$&%*^\"\'\'`<>+=-;:~,._;/\\|()[]\'{}\')'** + String get error_password_requirements; + + /// No description provided for @error_password_do_not_match. + /// + /// In en, this message translates to: + /// **'Passwords do not match'** + String get error_password_do_not_match; + + /// No description provided for @login_email. + /// + /// In en, this message translates to: + /// **'Email'** + String get login_email; + + /// No description provided for @login_password. + /// + /// In en, this message translates to: + /// **'Password'** + String get login_password; + + /// No description provided for @login_log_in. + /// + /// In en, this message translates to: + /// **'Log in'** + String get login_log_in; + + /// No description provided for @login_log_out. + /// + /// In en, this message translates to: + /// **'Log out'** + String get login_log_out; + + /// No description provided for @signup_sign_up. + /// + /// In en, this message translates to: + /// **'Sign up'** + String get signup_sign_up; + + /// No description provided for @signup_email. + /// + /// In en, this message translates to: + /// **'Email'** + String get signup_email; + + /// No description provided for @signup_password. + /// + /// In en, this message translates to: + /// **'Password'** + String get signup_password; + + /// No description provided for @signup_password_confirmation. + /// + /// In en, this message translates to: + /// **'Confirm your password'** + String get signup_password_confirmation; + + /// No description provided for @signup_confirm_email. + /// + /// In en, this message translates to: + /// **'Please confirm your email before signing in.'** + String get signup_confirm_email; + + /// No description provided for @settings_account. + /// + /// In en, this message translates to: + /// **'Account'** + String get settings_account; + + /// No description provided for @settings_user. + /// + /// In en, this message translates to: + /// **'User'** + String get settings_user; + + /// No description provided for @settings_log_out. + /// + /// In en, this message translates to: + /// **'Log out'** + String get settings_log_out; + + /// No description provided for @settings_log_out_description. + /// + /// In en, this message translates to: + /// **'Log out of {appName}'** + String settings_log_out_description(Object appName); + + /// No description provided for @settings_change_password. + /// + /// In en, this message translates to: + /// **'Change my password'** + String get settings_change_password; + + /// No description provided for @settings_change_password_description. + /// + /// In en, this message translates to: + /// **'Change my password for {appName}'** + String settings_change_password_description(Object appName); + + /// No description provided for @settings_change_password_success. + /// + /// In en, this message translates to: + /// **'Your password has been changed, please log back in.'** + String get settings_change_password_success; + + /// No description provided for @settings_appearance. + /// + /// In en, this message translates to: + /// **'Appearance'** + String get settings_appearance; + + /// No description provided for @settings_theme. + /// + /// In en, this message translates to: + /// **'Theme'** + String get settings_theme; + + /// No description provided for @settings_theme_system. + /// + /// In en, this message translates to: + /// **'System'** + String get settings_theme_system; + + /// No description provided for @settings_theme_light. + /// + /// In en, this message translates to: + /// **'Light'** + String get settings_theme_light; + + /// No description provided for @settings_theme_dark. + /// + /// In en, this message translates to: + /// **'Dark'** + String get settings_theme_dark; + + /// No description provided for @settings_dynamic_theming. + /// + /// In en, this message translates to: + /// **'Dynamic theming'** + String get settings_dynamic_theming; + + /// No description provided for @settings_dynamic_theming_description. + /// + /// In en, this message translates to: + /// **'Generate colors from your system'** + String get settings_dynamic_theming_description; + + /// No description provided for @settings_black_theming. + /// + /// In en, this message translates to: + /// **'Black theming'** + String get settings_black_theming; + + /// No description provided for @settings_black_theming_description. + /// + /// In en, this message translates to: + /// **'Use a black background in dark mode'** + String get settings_black_theming_description; + + /// No description provided for @settings_language. + /// + /// In en, this message translates to: + /// **'Language'** + String get settings_language; + + /// No description provided for @settings_language_restart. + /// + /// In en, this message translates to: + /// **'Please restart the app for the changes to take effect.'** + String get settings_language_restart; + + /// No description provided for @settings_behavior. + /// + /// In en, this message translates to: + /// **'Behavior'** + String get settings_behavior; + + /// No description provided for @settings_confirmations. + /// + /// In en, this message translates to: + /// **'Show confirmation dialogs'** + String get settings_confirmations; + + /// No description provided for @settings_shortcuts. + /// + /// In en, this message translates to: + /// **'Shortcuts'** + String get settings_shortcuts; + + /// No description provided for @settings_shortcuts_description. + /// + /// In en, this message translates to: + /// **'Show all shortcuts available in the text editor'** + String get settings_shortcuts_description; + + /// No description provided for @settings_about. + /// + /// In en, this message translates to: + /// **'About'** + String get settings_about; + + /// No description provided for @settings_github. + /// + /// In en, this message translates to: + /// **'GitHub'** + String get settings_github; + + /// No description provided for @settings_github_description. + /// + /// In en, this message translates to: + /// **'Take a look at the source code'** + String get settings_github_description; + + /// No description provided for @settings_licence. + /// + /// In en, this message translates to: + /// **'License'** + String get settings_licence; + + /// No description provided for @settings_licence_description. + /// + /// In en, this message translates to: + /// **'AGPL-3.0'** + String get settings_licence_description; + + /// No description provided for @shortcut_bold. + /// + /// In en, this message translates to: + /// **'Bold'** + String get shortcut_bold; + + /// No description provided for @shortcut_italic. + /// + /// In en, this message translates to: + /// **'Italic'** + String get shortcut_italic; + + /// No description provided for @shortcut_underline. + /// + /// In en, this message translates to: + /// **'Underline'** + String get shortcut_underline; + + /// No description provided for @shortcut_undo. + /// + /// In en, this message translates to: + /// **'Undo'** + String get shortcut_undo; + + /// No description provided for @shortcut_redo. + /// + /// In en, this message translates to: + /// **'Redo'** + String get shortcut_redo; + + /// No description provided for @action_add_note. + /// + /// In en, this message translates to: + /// **'Add a note'** + String get action_add_note; + + /// No description provided for @label_old_password. + /// + /// In en, this message translates to: + /// **'Old password'** + String get label_old_password; + + /// No description provided for @label_new_password. + /// + /// In en, this message translates to: + /// **'New password'** + String get label_new_password; + + /// No description provided for @label_new_password_confirmation. + /// + /// In en, this message translates to: + /// **'Confirm new password'** + String get label_new_password_confirmation; + + /// No description provided for @hint_email. + /// + /// In en, this message translates to: + /// **'Email'** + String get hint_email; + + /// No description provided for @hint_password. + /// + /// In en, this message translates to: + /// **'Password'** + String get hint_password; + + /// No description provided for @hint_password_confirmation. + /// + /// In en, this message translates to: + /// **'Confirm password'** + String get hint_password_confirmation; + + /// No description provided for @hint_old_password. + /// + /// In en, this message translates to: + /// **'myOldPassword'** + String get hint_old_password; + + /// No description provided for @hint_new_password. + /// + /// In en, this message translates to: + /// **'myNewPassword'** + String get hint_new_password; + + /// No description provided for @hint_new_password_confirmation. + /// + /// In en, this message translates to: + /// **'myNewPassword'** + String get hint_new_password_confirmation; + + /// No description provided for @hint_title. + /// + /// In en, this message translates to: + /// **'Title'** + String get hint_title; + + /// No description provided for @hint_collaborator_email. + /// + /// In en, this message translates to: + /// **'collaborator@example.com'** + String get hint_collaborator_email; + + /// No description provided for @tooltip_fab_add_note. + /// + /// In en, this message translates to: + /// **'Add a note'** + String get tooltip_fab_add_note; + + /// No description provided for @tooltip_fab_empty_bin. + /// + /// In en, this message translates to: + /// **'Empty the bin'** + String get tooltip_fab_empty_bin; + + /// No description provided for @tooltip_fab_add_collaborator. + /// + /// In en, this message translates to: + /// **'Add a collaborator'** + String get tooltip_fab_add_collaborator; + + /// No description provided for @tooltip_sort. + /// + /// In en, this message translates to: + /// **'Sort the notes'** + String get tooltip_sort; + + /// No description provided for @tooltip_search. + /// + /// In en, this message translates to: + /// **'Search the notes'** + String get tooltip_search; + + /// No description provided for @tooltip_toggle_checkbox. + /// + /// In en, this message translates to: + /// **'Toggle checkbox'** + String get tooltip_toggle_checkbox; + + /// No description provided for @tooltip_select_all. + /// + /// In en, this message translates to: + /// **'Select all'** + String get tooltip_select_all; + + /// No description provided for @tooltip_unselect_all. + /// + /// In en, this message translates to: + /// **'Unselect all'** + String get tooltip_unselect_all; + + /// No description provided for @tooltip_delete. + /// + /// In en, this message translates to: + /// **'Delete'** + String get tooltip_delete; + + /// No description provided for @tooltip_permanently_delete. + /// + /// In en, this message translates to: + /// **'Permanently delete'** + String get tooltip_permanently_delete; + + /// No description provided for @tooltip_restore. + /// + /// In en, this message translates to: + /// **'Restore'** + String get tooltip_restore; + + /// No description provided for @tooltip_toggle_pins. + /// + /// In en, this message translates to: + /// **'Toggle pins'** + String get tooltip_toggle_pins; + + /// No description provided for @button_close. + /// + /// In en, this message translates to: + /// **'Close'** + String get button_close; + + /// No description provided for @button_cancel. + /// + /// In en, this message translates to: + /// **'Cancel'** + String get button_cancel; + + /// No description provided for @button_refresh. + /// + /// In en, this message translates to: + /// **'Refresh'** + String get button_refresh; + + /// No description provided for @button_add. + /// + /// In en, this message translates to: + /// **'Add'** + String get button_add; + + /// No description provided for @dialog_log_out. + /// + /// In en, this message translates to: + /// **'Log out'** + String get dialog_log_out; + + /// No description provided for @dialog_log_out_body. + /// + /// In en, this message translates to: + /// **'Do you really want to log out?'** + String get dialog_log_out_body; + + /// No description provided for @dialog_delete. + /// + /// In en, this message translates to: + /// **'Delete'** + String get dialog_delete; + + /// No description provided for @dialog_delete_body. + /// + /// In en, this message translates to: + /// **'Do you really want to delete {count} {count, plural, zero{} one{note} other{notes}}? You can restore {count, plural, zero{} one{it} other{them}} from the bin.'** + String dialog_delete_body(num count); + + /// No description provided for @dialog_delete_body_single. + /// + /// In en, this message translates to: + /// **'Do you really want to delete this note? You can restore it from the bin.'** + String get dialog_delete_body_single; + + /// No description provided for @dialog_permanently_delete. + /// + /// In en, this message translates to: + /// **'Delete permanently'** + String get dialog_permanently_delete; + + /// No description provided for @dialog_permanently_delete_body. + /// + /// In en, this message translates to: + /// **'Do you really want to permanently delete {count} {count, plural, zero{} one{note} other{notes}}? You will not be able to restore {count, plural, zero{} one{it} other{them}}.'** + String dialog_permanently_delete_body(num count); + + /// No description provided for @dialog_permanently_delete_body_single. + /// + /// In en, this message translates to: + /// **'Do you really want to permanently delete this note? You will not be able to restore it.'** + String get dialog_permanently_delete_body_single; + + /// No description provided for @dialog_restore. + /// + /// In en, this message translates to: + /// **'Restore'** + String get dialog_restore; + + /// No description provided for @dialog_restore_body. + /// + /// In en, this message translates to: + /// **'Do you really want to restore {count} {count, plural, zero{} one{note} other{notes}}?'** + String dialog_restore_body(num count); + + /// No description provided for @dialog_restore_body_single. + /// + /// In en, this message translates to: + /// **'Do you really want to restore this note?'** + String get dialog_restore_body_single; + + /// No description provided for @dialog_empty_bin. + /// + /// In en, this message translates to: + /// **'Empty the bin'** + String get dialog_empty_bin; + + /// No description provided for @dialog_empty_bin_body. + /// + /// In en, this message translates to: + /// **'Do you really want to permanently empty the bin? You will not be able to restore the notes it contains.'** + String get dialog_empty_bin_body; + + /// No description provided for @dialog_add_collaborator. + /// + /// In en, this message translates to: + /// **'Add a collaborator'** + String get dialog_add_collaborator; + + /// No description provided for @dialog_remove_collaborator. + /// + /// In en, this message translates to: + /// **'Remove this collaborator'** + String get dialog_remove_collaborator; + + /// No description provided for @dialog_remove_collaborator_body. + /// + /// In en, this message translates to: + /// **'Do you really want to remove this collaborator?'** + String get dialog_remove_collaborator_body; + + /// No description provided for @sort_date. + /// + /// In en, this message translates to: + /// **'Date'** + String get sort_date; + + /// No description provided for @sort_title. + /// + /// In en, this message translates to: + /// **'Title'** + String get sort_title; + + /// No description provided for @sort_ascending. + /// + /// In en, this message translates to: + /// **'Ascending'** + String get sort_ascending; + + /// No description provided for @placeholder_notes. + /// + /// In en, this message translates to: + /// **'No notes'** + String get placeholder_notes; + + /// No description provided for @placeholder_bin. + /// + /// In en, this message translates to: + /// **'The bin is empty'** + String get placeholder_bin; + + /// No description provided for @placeholder_collaborators. + /// + /// In en, this message translates to: + /// **'No collaborators'** + String get placeholder_collaborators; + + /// No description provided for @menu_pin. + /// + /// In en, this message translates to: + /// **'Pin'** + String get menu_pin; + + /// No description provided for @menu_share. + /// + /// In en, this message translates to: + /// **'Share'** + String get menu_share; + + /// No description provided for @menu_unpin. + /// + /// In en, this message translates to: + /// **'Unpin'** + String get menu_unpin; + + /// No description provided for @menu_collaborate. + /// + /// In en, this message translates to: + /// **'Collaborate'** + String get menu_collaborate; + + /// No description provided for @menu_delete. + /// + /// In en, this message translates to: + /// **'Delete'** + String get menu_delete; + + /// No description provided for @menu_restore. + /// + /// In en, this message translates to: + /// **'Restore'** + String get menu_restore; + + /// No description provided for @menu_delete_permanently. + /// + /// In en, this message translates to: + /// **'Delete permanently'** + String get menu_delete_permanently; + + /// No description provided for @menu_about. + /// + /// In en, this message translates to: + /// **'About'** + String get menu_about; + + /// No description provided for @notes_untitled. + /// + /// In en, this message translates to: + /// **'Untitled note'** + String get notes_untitled; + + /// No description provided for @confirmations_title_none. + /// + /// In en, this message translates to: + /// **'Never'** + String get confirmations_title_none; + + /// No description provided for @confirmations_title_irreversible. + /// + /// In en, this message translates to: + /// **'Irreversible actions only'** + String get confirmations_title_irreversible; + + /// No description provided for @confirmations_title_all. + /// + /// In en, this message translates to: + /// **'Always'** + String get confirmations_title_all; + + /// No description provided for @confirmations_description_none. + /// + /// In en, this message translates to: + /// **'Never ask for a confirmation'** + String get confirmations_description_none; + + /// No description provided for @confirmations_description_irreversible. + /// + /// In en, this message translates to: + /// **'Only ask for a confirmation for actions that are not reversible (such as permanently deleting notes from the bin)'** + String get confirmations_description_irreversible; + + /// No description provided for @confirmations_description_all. + /// + /// In en, this message translates to: + /// **'Always ask for a confirmation for all important actions even if they can be reversed (such as deleting or restoring a note)'** + String get confirmations_description_all; + + /// No description provided for @dismiss_pin. + /// + /// In en, this message translates to: + /// **'Pin'** + String get dismiss_pin; + + /// No description provided for @dismiss_unpin. + /// + /// In en, this message translates to: + /// **'Unpin'** + String get dismiss_unpin; + + /// No description provided for @dismiss_delete. + /// + /// In en, this message translates to: + /// **'Delete'** + String get dismiss_delete; + + /// No description provided for @dismiss_permanently_delete. + /// + /// In en, this message translates to: + /// **'Permanently delete'** + String get dismiss_permanently_delete; + + /// No description provided for @dismiss_restore. + /// + /// In en, this message translates to: + /// **'Restore'** + String get dismiss_restore; + + /// No description provided for @collaborators_collaborators. + /// + /// In en, this message translates to: + /// **'Collaborators'** + String get collaborators_collaborators; + + /// No description provided for @collaborators_owner. + /// + /// In en, this message translates to: + /// **'Owner'** + String get collaborators_owner; + + /// No description provided for @collaborators_guest. + /// + /// In en, this message translates to: + /// **'Guest'** + String get collaborators_guest; + + /// No description provided for @collaborators_owner_description. + /// + /// In en, this message translates to: + /// **'You are the owner of this note.\n\nYou can add or remove collaborators. If you delete this note, all collaborators will loose access to it. They will gain access back if you restore it.\n\nLimitations:\n- You cannot remove yourself from the collaborators.\n- The pinned state is shared among every collaborator.'** + String get collaborators_owner_description; + + /// No description provided for @collaborators_guest_description. + /// + /// In en, this message translates to: + /// **'You were invited as a collaborator to this note.\n\nYou cannot add or remove collaborators, only the owner can.\n\nLimitations:\n- You cannot remove yourself from the collaborators.\n- The pinned state is shared among every collaborator.'** + String get collaborators_guest_description; + + /// No description provided for @about_last_edited. + /// + /// In en, this message translates to: + /// **'Last edited'** + String get about_last_edited; + + /// No description provided for @about_created. + /// + /// In en, this message translates to: + /// **'Created'** + String get about_created; + + /// No description provided for @about_words. + /// + /// In en, this message translates to: + /// **'Words'** + String get about_words; + + /// No description provided for @about_characters. + /// + /// In en, this message translates to: + /// **'Characters'** + String get about_characters; + + /// No description provided for @time_at. + /// + /// In en, this message translates to: + /// **'at'** + String get time_at; +} + +class _AppLocalizationsDelegate extends LocalizationsDelegate { + const _AppLocalizationsDelegate(); + + @override + Future load(Locale locale) { + return SynchronousFuture(lookupAppLocalizations(locale)); + } + + @override + bool isSupported(Locale locale) => ['en', 'fr'].contains(locale.languageCode); + + @override + bool shouldReload(_AppLocalizationsDelegate old) => false; +} + +AppLocalizations lookupAppLocalizations(Locale locale) { + + + // Lookup logic when only language code is specified. + switch (locale.languageCode) { + case 'en': return AppLocalizationsEn(); + case 'fr': return AppLocalizationsFr(); + } + + throw FlutterError( + 'AppLocalizations.delegate failed to load unsupported locale "$locale". This is likely ' + 'an issue with the localizations generation tool. Please file an issue ' + 'on GitHub with a reproducible sample app and the gen-l10n configuration ' + 'that was used.' + ); +} diff --git a/lib/l10n/app_localizations_en.g.dart b/lib/l10n/app_localizations_en.g.dart new file mode 100644 index 00000000..fa058f19 --- /dev/null +++ b/lib/l10n/app_localizations_en.g.dart @@ -0,0 +1,449 @@ +import 'package:intl/intl.dart' as intl; + +import 'app_localizations.g.dart'; + +/// The translations for English (`en`). +class AppLocalizationsEn extends AppLocalizations { + AppLocalizationsEn([String locale = 'en']) : super(locale); + + @override + String get app_name => 'Material Notes'; + + @override + String get navigation_notes => 'Notes'; + + @override + String get navigation_bin => 'Bin'; + + @override + String get navigation_settings => 'Settings'; + + @override + String get error_error => 'Error'; + + @override + String get error_wrong_email_password => 'Wrong username or password.'; + + @override + String get error_confirm_email => 'Please confirm your email and then try again.'; + + @override + String get error_invalid_email => 'Invalid email'; + + @override + String get error_required => 'Required'; + + @override + String get error_password_requirements => 'Requirements:\n• 12 characters\n• 1 lower case\n• 1 upper case\n• 1 number\n• 1 special character (!@#\$&%*^\"\'`<>+=-;:~,._;/\\|()[]{})'; + + @override + String get error_password_do_not_match => 'Passwords do not match'; + + @override + String get login_email => 'Email'; + + @override + String get login_password => 'Password'; + + @override + String get login_log_in => 'Log in'; + + @override + String get login_log_out => 'Log out'; + + @override + String get signup_sign_up => 'Sign up'; + + @override + String get signup_email => 'Email'; + + @override + String get signup_password => 'Password'; + + @override + String get signup_password_confirmation => 'Confirm your password'; + + @override + String get signup_confirm_email => 'Please confirm your email before signing in.'; + + @override + String get settings_account => 'Account'; + + @override + String get settings_user => 'User'; + + @override + String get settings_log_out => 'Log out'; + + @override + String settings_log_out_description(Object appName) { + return 'Log out of $appName'; + } + + @override + String get settings_change_password => 'Change my password'; + + @override + String settings_change_password_description(Object appName) { + return 'Change my password for $appName'; + } + + @override + String get settings_change_password_success => 'Your password has been changed, please log back in.'; + + @override + String get settings_appearance => 'Appearance'; + + @override + String get settings_theme => 'Theme'; + + @override + String get settings_theme_system => 'System'; + + @override + String get settings_theme_light => 'Light'; + + @override + String get settings_theme_dark => 'Dark'; + + @override + String get settings_dynamic_theming => 'Dynamic theming'; + + @override + String get settings_dynamic_theming_description => 'Generate colors from your system'; + + @override + String get settings_black_theming => 'Black theming'; + + @override + String get settings_black_theming_description => 'Use a black background in dark mode'; + + @override + String get settings_language => 'Language'; + + @override + String get settings_language_restart => 'Please restart the app for the changes to take effect.'; + + @override + String get settings_behavior => 'Behavior'; + + @override + String get settings_confirmations => 'Show confirmation dialogs'; + + @override + String get settings_shortcuts => 'Shortcuts'; + + @override + String get settings_shortcuts_description => 'Show all shortcuts available in the text editor'; + + @override + String get settings_about => 'About'; + + @override + String get settings_github => 'GitHub'; + + @override + String get settings_github_description => 'Take a look at the source code'; + + @override + String get settings_licence => 'License'; + + @override + String get settings_licence_description => 'AGPL-3.0'; + + @override + String get shortcut_bold => 'Bold'; + + @override + String get shortcut_italic => 'Italic'; + + @override + String get shortcut_underline => 'Underline'; + + @override + String get shortcut_undo => 'Undo'; + + @override + String get shortcut_redo => 'Redo'; + + @override + String get action_add_note => 'Add a note'; + + @override + String get label_old_password => 'Old password'; + + @override + String get label_new_password => 'New password'; + + @override + String get label_new_password_confirmation => 'Confirm new password'; + + @override + String get hint_email => 'Email'; + + @override + String get hint_password => 'Password'; + + @override + String get hint_password_confirmation => 'Confirm password'; + + @override + String get hint_old_password => 'myOldPassword'; + + @override + String get hint_new_password => 'myNewPassword'; + + @override + String get hint_new_password_confirmation => 'myNewPassword'; + + @override + String get hint_title => 'Title'; + + @override + String get hint_collaborator_email => 'collaborator@example.com'; + + @override + String get tooltip_fab_add_note => 'Add a note'; + + @override + String get tooltip_fab_empty_bin => 'Empty the bin'; + + @override + String get tooltip_fab_add_collaborator => 'Add a collaborator'; + + @override + String get tooltip_sort => 'Sort the notes'; + + @override + String get tooltip_search => 'Search the notes'; + + @override + String get tooltip_toggle_checkbox => 'Toggle checkbox'; + + @override + String get tooltip_select_all => 'Select all'; + + @override + String get tooltip_unselect_all => 'Unselect all'; + + @override + String get tooltip_delete => 'Delete'; + + @override + String get tooltip_permanently_delete => 'Permanently delete'; + + @override + String get tooltip_restore => 'Restore'; + + @override + String get tooltip_toggle_pins => 'Toggle pins'; + + @override + String get button_close => 'Close'; + + @override + String get button_cancel => 'Cancel'; + + @override + String get button_refresh => 'Refresh'; + + @override + String get button_add => 'Add'; + + @override + String get dialog_log_out => 'Log out'; + + @override + String get dialog_log_out_body => 'Do you really want to log out?'; + + @override + String get dialog_delete => 'Delete'; + + @override + String dialog_delete_body(num count) { + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'notes', + one: 'note', + zero: '', + ); + String _temp1 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'them', + one: 'it', + zero: '', + ); + return 'Do you really want to delete $count $_temp0? You can restore $_temp1 from the bin.'; + } + + @override + String get dialog_delete_body_single => 'Do you really want to delete this note? You can restore it from the bin.'; + + @override + String get dialog_permanently_delete => 'Delete permanently'; + + @override + String dialog_permanently_delete_body(num count) { + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'notes', + one: 'note', + zero: '', + ); + String _temp1 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'them', + one: 'it', + zero: '', + ); + return 'Do you really want to permanently delete $count $_temp0? You will not be able to restore $_temp1.'; + } + + @override + String get dialog_permanently_delete_body_single => 'Do you really want to permanently delete this note? You will not be able to restore it.'; + + @override + String get dialog_restore => 'Restore'; + + @override + String dialog_restore_body(num count) { + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'notes', + one: 'note', + zero: '', + ); + return 'Do you really want to restore $count $_temp0?'; + } + + @override + String get dialog_restore_body_single => 'Do you really want to restore this note?'; + + @override + String get dialog_empty_bin => 'Empty the bin'; + + @override + String get dialog_empty_bin_body => 'Do you really want to permanently empty the bin? You will not be able to restore the notes it contains.'; + + @override + String get dialog_add_collaborator => 'Add a collaborator'; + + @override + String get dialog_remove_collaborator => 'Remove this collaborator'; + + @override + String get dialog_remove_collaborator_body => 'Do you really want to remove this collaborator?'; + + @override + String get sort_date => 'Date'; + + @override + String get sort_title => 'Title'; + + @override + String get sort_ascending => 'Ascending'; + + @override + String get placeholder_notes => 'No notes'; + + @override + String get placeholder_bin => 'The bin is empty'; + + @override + String get placeholder_collaborators => 'No collaborators'; + + @override + String get menu_pin => 'Pin'; + + @override + String get menu_share => 'Share'; + + @override + String get menu_unpin => 'Unpin'; + + @override + String get menu_collaborate => 'Collaborate'; + + @override + String get menu_delete => 'Delete'; + + @override + String get menu_restore => 'Restore'; + + @override + String get menu_delete_permanently => 'Delete permanently'; + + @override + String get menu_about => 'About'; + + @override + String get notes_untitled => 'Untitled note'; + + @override + String get confirmations_title_none => 'Never'; + + @override + String get confirmations_title_irreversible => 'Irreversible actions only'; + + @override + String get confirmations_title_all => 'Always'; + + @override + String get confirmations_description_none => 'Never ask for a confirmation'; + + @override + String get confirmations_description_irreversible => 'Only ask for a confirmation for actions that are not reversible (such as permanently deleting notes from the bin)'; + + @override + String get confirmations_description_all => 'Always ask for a confirmation for all important actions even if they can be reversed (such as deleting or restoring a note)'; + + @override + String get dismiss_pin => 'Pin'; + + @override + String get dismiss_unpin => 'Unpin'; + + @override + String get dismiss_delete => 'Delete'; + + @override + String get dismiss_permanently_delete => 'Permanently delete'; + + @override + String get dismiss_restore => 'Restore'; + + @override + String get collaborators_collaborators => 'Collaborators'; + + @override + String get collaborators_owner => 'Owner'; + + @override + String get collaborators_guest => 'Guest'; + + @override + String get collaborators_owner_description => 'You are the owner of this note.\n\nYou can add or remove collaborators. If you delete this note, all collaborators will loose access to it. They will gain access back if you restore it.\n\nLimitations:\n- You cannot remove yourself from the collaborators.\n- The pinned state is shared among every collaborator.'; + + @override + String get collaborators_guest_description => 'You were invited as a collaborator to this note.\n\nYou cannot add or remove collaborators, only the owner can.\n\nLimitations:\n- You cannot remove yourself from the collaborators.\n- The pinned state is shared among every collaborator.'; + + @override + String get about_last_edited => 'Last edited'; + + @override + String get about_created => 'Created'; + + @override + String get about_words => 'Words'; + + @override + String get about_characters => 'Characters'; + + @override + String get time_at => 'at'; +} diff --git a/lib/l10n/app_localizations_fr.g.dart b/lib/l10n/app_localizations_fr.g.dart new file mode 100644 index 00000000..0f751ad7 --- /dev/null +++ b/lib/l10n/app_localizations_fr.g.dart @@ -0,0 +1,449 @@ +import 'package:intl/intl.dart' as intl; + +import 'app_localizations.g.dart'; + +/// The translations for French (`fr`). +class AppLocalizationsFr extends AppLocalizations { + AppLocalizationsFr([String locale = 'fr']) : super(locale); + + @override + String get app_name => 'Material Notes'; + + @override + String get navigation_notes => 'Notes'; + + @override + String get navigation_bin => 'Corbeille'; + + @override + String get navigation_settings => 'Paramètres'; + + @override + String get error_error => 'Erreur'; + + @override + String get error_wrong_email_password => 'Mauvais email ou mot de passe.'; + + @override + String get error_confirm_email => 'Merci de confirmer votre email et de réessayer.'; + + @override + String get error_invalid_email => 'Email invalide'; + + @override + String get error_required => 'Requis'; + + @override + String get error_password_requirements => 'Requis:\n• 12 caractères\n• 1 minuscule\n• 1 majuscule\n• 1 nombre\n• 1 caractère spécial (!@#\$&%*^\"\'`<>+=-;:~,._;/\\|()[]{})'; + + @override + String get error_password_do_not_match => 'Les mots de passe ne correspondent pas'; + + @override + String get login_email => 'Email'; + + @override + String get login_password => 'Mot de passe'; + + @override + String get login_log_in => 'Se connecter'; + + @override + String get login_log_out => 'Se déconnecter'; + + @override + String get signup_sign_up => 'S\'inscrire'; + + @override + String get signup_email => 'Email'; + + @override + String get signup_password => 'Mot de passe'; + + @override + String get signup_password_confirmation => 'Confirmer mot de passe'; + + @override + String get signup_confirm_email => 'Merci de confirmer votre email avant de vous connecter.'; + + @override + String get settings_account => 'Compte'; + + @override + String get settings_user => 'Utilisateur'; + + @override + String get settings_log_out => 'Se déconnecter'; + + @override + String settings_log_out_description(Object appName) { + return 'Se déconnecter de $appName'; + } + + @override + String get settings_change_password => 'Changer mon mot de passe'; + + @override + String settings_change_password_description(Object appName) { + return 'Changer mon mot de passe pour $appName'; + } + + @override + String get settings_change_password_success => 'Votre mot de passe a été changé, veuillez vous reconnecter.'; + + @override + String get settings_appearance => 'Apparence'; + + @override + String get settings_theme => 'Thème'; + + @override + String get settings_theme_system => 'Système'; + + @override + String get settings_theme_light => 'Clair'; + + @override + String get settings_theme_dark => 'Sombre'; + + @override + String get settings_dynamic_theming => 'Thème dynamique'; + + @override + String get settings_dynamic_theming_description => 'Génère des couleurs depuis votre système'; + + @override + String get settings_black_theming => 'Thème noir'; + + @override + String get settings_black_theming_description => 'Utilise un fond noir pour le thème sombre'; + + @override + String get settings_language => 'Langue'; + + @override + String get settings_language_restart => 'Merci de recharger l\'application pour que les changements prennent effet.'; + + @override + String get settings_behavior => 'Comportement'; + + @override + String get settings_confirmations => 'Afficher les dialogues de confirmation'; + + @override + String get settings_shortcuts => 'Raccourcis'; + + @override + String get settings_shortcuts_description => 'Lister tous les raccourcis disponibles dans l\'éditeur de texte'; + + @override + String get settings_about => 'À propos'; + + @override + String get settings_github => 'GitHub'; + + @override + String get settings_github_description => 'Jeter un coup d\'œil au code source'; + + @override + String get settings_licence => 'License'; + + @override + String get settings_licence_description => 'AGPL-3.0'; + + @override + String get shortcut_bold => 'Gras'; + + @override + String get shortcut_italic => 'Italique'; + + @override + String get shortcut_underline => 'Souligné'; + + @override + String get shortcut_undo => 'Annuler'; + + @override + String get shortcut_redo => 'Rétablir'; + + @override + String get action_add_note => 'Ajouter une note'; + + @override + String get label_old_password => 'Ancien mot de passe'; + + @override + String get label_new_password => 'Nouveau mot de passe'; + + @override + String get label_new_password_confirmation => 'Confirmer nouveau mot de passe'; + + @override + String get hint_email => 'Email'; + + @override + String get hint_password => 'Mot de passe'; + + @override + String get hint_password_confirmation => 'Confirmer mot de passe'; + + @override + String get hint_old_password => 'monAncienMotDePasse'; + + @override + String get hint_new_password => 'monNouveauMotDePasse'; + + @override + String get hint_new_password_confirmation => 'monNouveauMotDePasse'; + + @override + String get hint_title => 'Titre'; + + @override + String get hint_collaborator_email => 'collaborateur@exemple.com'; + + @override + String get tooltip_fab_add_note => 'Ajouter une note'; + + @override + String get tooltip_fab_empty_bin => 'Vider la corbeille'; + + @override + String get tooltip_fab_add_collaborator => 'Ajouter un collaborateur'; + + @override + String get tooltip_sort => 'Trier les notes'; + + @override + String get tooltip_search => 'Rechercher parmi les notes'; + + @override + String get tooltip_toggle_checkbox => 'Basculer la case à cocher'; + + @override + String get tooltip_select_all => 'Tout sélectionner'; + + @override + String get tooltip_unselect_all => 'Tout déselectionner'; + + @override + String get tooltip_delete => 'Supprimer'; + + @override + String get tooltip_permanently_delete => 'Supprimer définitivement'; + + @override + String get tooltip_restore => 'Restaurer'; + + @override + String get tooltip_toggle_pins => 'Basculer les épingles'; + + @override + String get button_close => 'Fermer'; + + @override + String get button_cancel => 'Annuler'; + + @override + String get button_refresh => 'Rafraîchir'; + + @override + String get button_add => 'Ajouter'; + + @override + String get dialog_log_out => 'Se déconnecter'; + + @override + String get dialog_log_out_body => 'Voulez-vous vraiment vous déconnecter ?'; + + @override + String get dialog_delete => 'Supprimer'; + + @override + String dialog_delete_body(num count) { + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'notes', + one: 'note', + zero: '', + ); + String _temp1 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'les', + one: 'la', + zero: '', + ); + return 'Voulez-vous vraiment supprimer $count $_temp0 ? Vous pouvez $_temp1 restaurer depuis la corbeille.'; + } + + @override + String get dialog_delete_body_single => 'Voulez-vous vraiment supprimer cette note ? Vous pouvez la restaurer depuis la corbeille.'; + + @override + String get dialog_permanently_delete => 'Supprimer définitivement'; + + @override + String dialog_permanently_delete_body(num count) { + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'notes', + one: 'note', + zero: '', + ); + String _temp1 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'les', + one: 'la', + zero: '', + ); + return 'Voulez-vous vraiment supprimer définitivement $count $_temp0 ? Vous ne pourrez pas $_temp1 restaurer.'; + } + + @override + String get dialog_permanently_delete_body_single => 'Voulez-vous vraiment supprimer définitivement cette note ? Vous ne pourrez pas la restaurer.'; + + @override + String get dialog_restore => 'Restaurer'; + + @override + String dialog_restore_body(num count) { + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'notes', + one: 'note', + zero: '', + ); + return 'Voulez-vous vraiment restaurer $count $_temp0 ?'; + } + + @override + String get dialog_restore_body_single => 'Voulez-vous vraiment restaurer cette note ?'; + + @override + String get dialog_empty_bin => 'Vider la corbeille'; + + @override + String get dialog_empty_bin_body => 'Voulez-vous vraiment vider définitivement la corbeille ? Vous ne pourrez pas restaurer les notes qu\'elle contient.'; + + @override + String get dialog_add_collaborator => 'Ajouter un collaborateur'; + + @override + String get dialog_remove_collaborator => 'Retirer ce collaborateur'; + + @override + String get dialog_remove_collaborator_body => 'Voulez-vous vraiment retirer ce collaborateur ?'; + + @override + String get sort_date => 'Date'; + + @override + String get sort_title => 'Titre'; + + @override + String get sort_ascending => 'Croissant'; + + @override + String get placeholder_notes => 'Pas de notes'; + + @override + String get placeholder_bin => 'La corbeille est vide'; + + @override + String get placeholder_collaborators => 'Pas de collaborateurs'; + + @override + String get menu_pin => 'Épingler'; + + @override + String get menu_share => 'Partager'; + + @override + String get menu_unpin => 'Désépingler'; + + @override + String get menu_collaborate => 'Collaborer'; + + @override + String get menu_delete => 'Supprimer'; + + @override + String get menu_restore => 'Restaurer'; + + @override + String get menu_delete_permanently => 'Supprimer définitivement'; + + @override + String get menu_about => 'À propos'; + + @override + String get notes_untitled => 'Note sans titre'; + + @override + String get confirmations_title_none => 'Jamais'; + + @override + String get confirmations_title_irreversible => 'Actions irréversibles uniquement'; + + @override + String get confirmations_title_all => 'Toujours'; + + @override + String get confirmations_description_none => 'Ne jamais demander de confirmation'; + + @override + String get confirmations_description_irreversible => 'Ne demander de confirmation que pour les actions qui ne sont pas réversibles (comme supprimer définitivement des notes de la corbeille)'; + + @override + String get confirmations_description_all => 'Toujours demander une confirmation pour les actions importantes même si elles peuvent être annulées (comme supprimer ou restaurer une note)'; + + @override + String get dismiss_pin => 'Épingler'; + + @override + String get dismiss_unpin => 'Désépingler'; + + @override + String get dismiss_delete => 'Supprimer'; + + @override + String get dismiss_permanently_delete => 'Supprimer définitivement'; + + @override + String get dismiss_restore => 'Restaurer'; + + @override + String get collaborators_collaborators => 'Collaborateurs'; + + @override + String get collaborators_owner => 'Propriétaire'; + + @override + String get collaborators_guest => 'Invité'; + + @override + String get collaborators_owner_description => 'Vous êtes le propriétaire de cette note.\n\nVous pouvez ajouter ou retirer des collaborateurs. Si vous supprimez cette note, tous les collaborateurs en perdront l\'accès. Ils le regagneront si vous la restaurez.\n\nLimitations:\n- Vous ne pouvez pas vous retirer vous-mêmes des collaborateurs.\n- L\'état d\'épingle est partagé entre tous les collaborateurs.'; + + @override + String get collaborators_guest_description => 'Vous avez été invité en tant que collaborateur sur cette note.\n\nVous ne pouvez pas ajouter ni retirer des collaborateurs, seul le propriétaire le peut.\n\nLimitations:\n- Vous ne pouvez pas vous retirer vous-mêmes des collaborateurs.\n- L\'état d\'épingle est partagé entre tous les collaborateurs.'; + + @override + String get about_last_edited => 'Dernière modification'; + + @override + String get about_created => 'Création'; + + @override + String get about_words => 'Mots'; + + @override + String get about_characters => 'Caractères'; + + @override + String get time_at => 'à'; +} diff --git a/lib/l10n/untranslated.txt b/lib/l10n/untranslated.txt new file mode 100644 index 00000000..9e26dfee --- /dev/null +++ b/lib/l10n/untranslated.txt @@ -0,0 +1 @@ +{} \ No newline at end of file diff --git a/lib/main.dart b/lib/main.dart new file mode 100644 index 00000000..17eef061 --- /dev/null +++ b/lib/main.dart @@ -0,0 +1,33 @@ +import 'package:flutter/material.dart'; +import 'package:flutter/services.dart'; +import 'package:flutter_native_splash/flutter_native_splash.dart'; +import 'package:flutter_riverpod/flutter_riverpod.dart'; +import 'package:flutter_web_plugins/url_strategy.dart'; // ignore: depend_on_referenced_packages +import 'package:localmaterialnotes/app.dart'; +import 'package:localmaterialnotes/utils/database_manager.dart'; +import 'package:localmaterialnotes/utils/package_info_manager.dart'; +import 'package:localmaterialnotes/utils/preferences/preferences_manager.dart'; +import 'package:localmaterialnotes/utils/theme_manager.dart'; + +Future main() async { + final widgetsBinding = WidgetsFlutterBinding.ensureInitialized(); + + SystemChrome.setEnabledSystemUIMode(SystemUiMode.edgeToEdge); + + FlutterNativeSplash.preserve(widgetsBinding: widgetsBinding); + + await PreferencesManager().init(); + await PackageInfoManager().init(); + await ThemeManager().init(); + await DatabaseManager().init(); + + usePathUrlStrategy(); + + FlutterNativeSplash.remove(); + + runApp( + ProviderScope( + child: App(), + ), + ); +} diff --git a/lib/models/note/note.dart b/lib/models/note/note.dart new file mode 100644 index 00000000..4282cbec --- /dev/null +++ b/lib/models/note/note.dart @@ -0,0 +1,107 @@ +import 'dart:convert'; + +import 'package:equatable/equatable.dart'; +import 'package:fleather/fleather.dart'; +import 'package:isar/isar.dart'; +import 'package:json_annotation/json_annotation.dart'; + +part 'note.g.dart'; + +// ignore_for_file: must_be_immutable + +@Collection(inheritance: false) +class Note extends Equatable { + Id id = Isar.autoIncrement; + @Index() + late bool deleted; + @Index() + late bool pinned; + late DateTime createdTime; + late DateTime editedTime; + late String title; + late String content; + @JsonKey(includeFromJson: false, includeToJson: false) + @ignore + late bool selected = false; + + Note({ + required this.deleted, + required this.pinned, + required this.createdTime, + required this.editedTime, + required this.title, + required this.content, + }); + + factory Note.empty() => Note( + deleted: false, + pinned: false, + createdTime: DateTime.now(), + editedTime: DateTime.now(), + title: '', + content: '[{"insert":"\\n"}]', + ); + + factory Note.content(String content) => Note( + deleted: false, + pinned: false, + createdTime: DateTime.now(), + editedTime: DateTime.now(), + title: '', + content: content, + ); + + @ignore + String get plainText { + return document.toPlainText(); + } + + @ignore + String get contentDisplay { + var content = ''; + + for (final child in document.root.children) { + final operations = child.toDelta().toList(); + + for (var i = 0; i < operations.length; i++) { + final operation = operations[i]; + final nextOperation = i == operations.length - 1 ? null : operations[i + 1]; + + final checklist = nextOperation != null && + nextOperation.attributes != null && + nextOperation.attributes!.containsKey('block') && + nextOperation.attributes!['block'] == 'cl'; + + if (checklist) { + final checked = nextOperation.attributes!.containsKey('checked'); + + content += '${checked ? '✅' : '⬜'} ${operation.value}'; + } else { + content += operation.value.toString(); + } + } + } + + return content.trim(); + } + + @ignore + String get shareText { + return '$title\n\n$contentDisplay'; + } + + @ignore + ParchmentDocument get document { + return ParchmentDocument.fromJson(jsonDecode(content) as List); + } + + bool containsText(String search) { + final searchCleaned = search.toLowerCase().trim(); + + return title.toLowerCase().contains(searchCleaned) || plainText.toLowerCase().contains(searchCleaned); + } + + @override + @ignore + List get props => [id]; +} diff --git a/lib/models/note/note.g.dart b/lib/models/note/note.g.dart new file mode 100644 index 00000000..45db8aa5 --- /dev/null +++ b/lib/models/note/note.g.dart @@ -0,0 +1,1028 @@ +// GENERATED CODE - DO NOT MODIFY BY HAND + +part of 'note.dart'; + +// ************************************************************************** +// IsarCollectionGenerator +// ************************************************************************** + +// coverage:ignore-file +// ignore_for_file: duplicate_ignore, non_constant_identifier_names, constant_identifier_names, invalid_use_of_protected_member, unnecessary_cast, prefer_const_constructors, lines_longer_than_80_chars, require_trailing_commas, inference_failure_on_function_invocation, unnecessary_parenthesis, unnecessary_raw_strings, unnecessary_null_checks, join_return_with_assignment, prefer_final_locals, avoid_js_rounded_ints, avoid_positional_boolean_parameters, always_specify_types + +extension GetNoteCollection on Isar { + IsarCollection get notes => this.collection(); +} + +const NoteSchema = CollectionSchema( + name: r'Note', + id: 6284318083599466921, + properties: { + r'content': PropertySchema( + id: 0, + name: r'content', + type: IsarType.string, + ), + r'createdTime': PropertySchema( + id: 1, + name: r'createdTime', + type: IsarType.dateTime, + ), + r'deleted': PropertySchema( + id: 2, + name: r'deleted', + type: IsarType.bool, + ), + r'editedTime': PropertySchema( + id: 3, + name: r'editedTime', + type: IsarType.dateTime, + ), + r'pinned': PropertySchema( + id: 4, + name: r'pinned', + type: IsarType.bool, + ), + r'title': PropertySchema( + id: 5, + name: r'title', + type: IsarType.string, + ) + }, + estimateSize: _noteEstimateSize, + serialize: _noteSerialize, + deserialize: _noteDeserialize, + deserializeProp: _noteDeserializeProp, + idName: r'id', + indexes: { + r'deleted': IndexSchema( + id: 2416515181749931262, + name: r'deleted', + unique: false, + replace: false, + properties: [ + IndexPropertySchema( + name: r'deleted', + type: IndexType.value, + caseSensitive: false, + ) + ], + ), + r'pinned': IndexSchema( + id: -8913717909547348198, + name: r'pinned', + unique: false, + replace: false, + properties: [ + IndexPropertySchema( + name: r'pinned', + type: IndexType.value, + caseSensitive: false, + ) + ], + ) + }, + links: {}, + embeddedSchemas: {}, + getId: _noteGetId, + getLinks: _noteGetLinks, + attach: _noteAttach, + version: '3.1.0+1', +); + +int _noteEstimateSize( + Note object, + List offsets, + Map> allOffsets, +) { + var bytesCount = offsets.last; + bytesCount += 3 + object.content.length * 3; + bytesCount += 3 + object.title.length * 3; + return bytesCount; +} + +void _noteSerialize( + Note object, + IsarWriter writer, + List offsets, + Map> allOffsets, +) { + writer.writeString(offsets[0], object.content); + writer.writeDateTime(offsets[1], object.createdTime); + writer.writeBool(offsets[2], object.deleted); + writer.writeDateTime(offsets[3], object.editedTime); + writer.writeBool(offsets[4], object.pinned); + writer.writeString(offsets[5], object.title); +} + +Note _noteDeserialize( + Id id, + IsarReader reader, + List offsets, + Map> allOffsets, +) { + final object = Note( + content: reader.readString(offsets[0]), + createdTime: reader.readDateTime(offsets[1]), + deleted: reader.readBool(offsets[2]), + editedTime: reader.readDateTime(offsets[3]), + pinned: reader.readBool(offsets[4]), + title: reader.readString(offsets[5]), + ); + object.id = id; + return object; +} + +P _noteDeserializeProp

( + IsarReader reader, + int propertyId, + int offset, + Map> allOffsets, +) { + switch (propertyId) { + case 0: + return (reader.readString(offset)) as P; + case 1: + return (reader.readDateTime(offset)) as P; + case 2: + return (reader.readBool(offset)) as P; + case 3: + return (reader.readDateTime(offset)) as P; + case 4: + return (reader.readBool(offset)) as P; + case 5: + return (reader.readString(offset)) as P; + default: + throw IsarError('Unknown property with id $propertyId'); + } +} + +Id _noteGetId(Note object) { + return object.id; +} + +List> _noteGetLinks(Note object) { + return []; +} + +void _noteAttach(IsarCollection col, Id id, Note object) { + object.id = id; +} + +extension NoteQueryWhereSort on QueryBuilder { + QueryBuilder anyId() { + return QueryBuilder.apply(this, (query) { + return query.addWhereClause(const IdWhereClause.any()); + }); + } + + QueryBuilder anyDeleted() { + return QueryBuilder.apply(this, (query) { + return query.addWhereClause( + const IndexWhereClause.any(indexName: r'deleted'), + ); + }); + } + + QueryBuilder anyPinned() { + return QueryBuilder.apply(this, (query) { + return query.addWhereClause( + const IndexWhereClause.any(indexName: r'pinned'), + ); + }); + } +} + +extension NoteQueryWhere on QueryBuilder { + QueryBuilder idEqualTo(Id id) { + return QueryBuilder.apply(this, (query) { + return query.addWhereClause(IdWhereClause.between( + lower: id, + upper: id, + )); + }); + } + + QueryBuilder idNotEqualTo(Id id) { + return QueryBuilder.apply(this, (query) { + if (query.whereSort == Sort.asc) { + return query + .addWhereClause( + IdWhereClause.lessThan(upper: id, includeUpper: false), + ) + .addWhereClause( + IdWhereClause.greaterThan(lower: id, includeLower: false), + ); + } else { + return query + .addWhereClause( + IdWhereClause.greaterThan(lower: id, includeLower: false), + ) + .addWhereClause( + IdWhereClause.lessThan(upper: id, includeUpper: false), + ); + } + }); + } + + QueryBuilder idGreaterThan(Id id, + {bool include = false}) { + return QueryBuilder.apply(this, (query) { + return query.addWhereClause( + IdWhereClause.greaterThan(lower: id, includeLower: include), + ); + }); + } + + QueryBuilder idLessThan(Id id, + {bool include = false}) { + return QueryBuilder.apply(this, (query) { + return query.addWhereClause( + IdWhereClause.lessThan(upper: id, includeUpper: include), + ); + }); + } + + QueryBuilder idBetween( + Id lowerId, + Id upperId, { + bool includeLower = true, + bool includeUpper = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.addWhereClause(IdWhereClause.between( + lower: lowerId, + includeLower: includeLower, + upper: upperId, + includeUpper: includeUpper, + )); + }); + } + + QueryBuilder deletedEqualTo(bool deleted) { + return QueryBuilder.apply(this, (query) { + return query.addWhereClause(IndexWhereClause.equalTo( + indexName: r'deleted', + value: [deleted], + )); + }); + } + + QueryBuilder deletedNotEqualTo(bool deleted) { + return QueryBuilder.apply(this, (query) { + if (query.whereSort == Sort.asc) { + return query + .addWhereClause(IndexWhereClause.between( + indexName: r'deleted', + lower: [], + upper: [deleted], + includeUpper: false, + )) + .addWhereClause(IndexWhereClause.between( + indexName: r'deleted', + lower: [deleted], + includeLower: false, + upper: [], + )); + } else { + return query + .addWhereClause(IndexWhereClause.between( + indexName: r'deleted', + lower: [deleted], + includeLower: false, + upper: [], + )) + .addWhereClause(IndexWhereClause.between( + indexName: r'deleted', + lower: [], + upper: [deleted], + includeUpper: false, + )); + } + }); + } + + QueryBuilder pinnedEqualTo(bool pinned) { + return QueryBuilder.apply(this, (query) { + return query.addWhereClause(IndexWhereClause.equalTo( + indexName: r'pinned', + value: [pinned], + )); + }); + } + + QueryBuilder pinnedNotEqualTo(bool pinned) { + return QueryBuilder.apply(this, (query) { + if (query.whereSort == Sort.asc) { + return query + .addWhereClause(IndexWhereClause.between( + indexName: r'pinned', + lower: [], + upper: [pinned], + includeUpper: false, + )) + .addWhereClause(IndexWhereClause.between( + indexName: r'pinned', + lower: [pinned], + includeLower: false, + upper: [], + )); + } else { + return query + .addWhereClause(IndexWhereClause.between( + indexName: r'pinned', + lower: [pinned], + includeLower: false, + upper: [], + )) + .addWhereClause(IndexWhereClause.between( + indexName: r'pinned', + lower: [], + upper: [pinned], + includeUpper: false, + )); + } + }); + } +} + +extension NoteQueryFilter on QueryBuilder { + QueryBuilder contentEqualTo( + String value, { + bool caseSensitive = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.equalTo( + property: r'content', + value: value, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder contentGreaterThan( + String value, { + bool include = false, + bool caseSensitive = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.greaterThan( + include: include, + property: r'content', + value: value, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder contentLessThan( + String value, { + bool include = false, + bool caseSensitive = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.lessThan( + include: include, + property: r'content', + value: value, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder contentBetween( + String lower, + String upper, { + bool includeLower = true, + bool includeUpper = true, + bool caseSensitive = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.between( + property: r'content', + lower: lower, + includeLower: includeLower, + upper: upper, + includeUpper: includeUpper, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder contentStartsWith( + String value, { + bool caseSensitive = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.startsWith( + property: r'content', + value: value, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder contentEndsWith( + String value, { + bool caseSensitive = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.endsWith( + property: r'content', + value: value, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder contentContains(String value, + {bool caseSensitive = true}) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.contains( + property: r'content', + value: value, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder contentMatches(String pattern, + {bool caseSensitive = true}) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.matches( + property: r'content', + wildcard: pattern, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder contentIsEmpty() { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.equalTo( + property: r'content', + value: '', + )); + }); + } + + QueryBuilder contentIsNotEmpty() { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.greaterThan( + property: r'content', + value: '', + )); + }); + } + + QueryBuilder createdTimeEqualTo( + DateTime value) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.equalTo( + property: r'createdTime', + value: value, + )); + }); + } + + QueryBuilder createdTimeGreaterThan( + DateTime value, { + bool include = false, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.greaterThan( + include: include, + property: r'createdTime', + value: value, + )); + }); + } + + QueryBuilder createdTimeLessThan( + DateTime value, { + bool include = false, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.lessThan( + include: include, + property: r'createdTime', + value: value, + )); + }); + } + + QueryBuilder createdTimeBetween( + DateTime lower, + DateTime upper, { + bool includeLower = true, + bool includeUpper = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.between( + property: r'createdTime', + lower: lower, + includeLower: includeLower, + upper: upper, + includeUpper: includeUpper, + )); + }); + } + + QueryBuilder deletedEqualTo(bool value) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.equalTo( + property: r'deleted', + value: value, + )); + }); + } + + QueryBuilder editedTimeEqualTo( + DateTime value) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.equalTo( + property: r'editedTime', + value: value, + )); + }); + } + + QueryBuilder editedTimeGreaterThan( + DateTime value, { + bool include = false, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.greaterThan( + include: include, + property: r'editedTime', + value: value, + )); + }); + } + + QueryBuilder editedTimeLessThan( + DateTime value, { + bool include = false, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.lessThan( + include: include, + property: r'editedTime', + value: value, + )); + }); + } + + QueryBuilder editedTimeBetween( + DateTime lower, + DateTime upper, { + bool includeLower = true, + bool includeUpper = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.between( + property: r'editedTime', + lower: lower, + includeLower: includeLower, + upper: upper, + includeUpper: includeUpper, + )); + }); + } + + QueryBuilder idEqualTo(Id value) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.equalTo( + property: r'id', + value: value, + )); + }); + } + + QueryBuilder idGreaterThan( + Id value, { + bool include = false, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.greaterThan( + include: include, + property: r'id', + value: value, + )); + }); + } + + QueryBuilder idLessThan( + Id value, { + bool include = false, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.lessThan( + include: include, + property: r'id', + value: value, + )); + }); + } + + QueryBuilder idBetween( + Id lower, + Id upper, { + bool includeLower = true, + bool includeUpper = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.between( + property: r'id', + lower: lower, + includeLower: includeLower, + upper: upper, + includeUpper: includeUpper, + )); + }); + } + + QueryBuilder pinnedEqualTo(bool value) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.equalTo( + property: r'pinned', + value: value, + )); + }); + } + + QueryBuilder titleEqualTo( + String value, { + bool caseSensitive = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.equalTo( + property: r'title', + value: value, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder titleGreaterThan( + String value, { + bool include = false, + bool caseSensitive = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.greaterThan( + include: include, + property: r'title', + value: value, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder titleLessThan( + String value, { + bool include = false, + bool caseSensitive = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.lessThan( + include: include, + property: r'title', + value: value, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder titleBetween( + String lower, + String upper, { + bool includeLower = true, + bool includeUpper = true, + bool caseSensitive = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.between( + property: r'title', + lower: lower, + includeLower: includeLower, + upper: upper, + includeUpper: includeUpper, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder titleStartsWith( + String value, { + bool caseSensitive = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.startsWith( + property: r'title', + value: value, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder titleEndsWith( + String value, { + bool caseSensitive = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.endsWith( + property: r'title', + value: value, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder titleContains(String value, + {bool caseSensitive = true}) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.contains( + property: r'title', + value: value, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder titleMatches(String pattern, + {bool caseSensitive = true}) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.matches( + property: r'title', + wildcard: pattern, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder titleIsEmpty() { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.equalTo( + property: r'title', + value: '', + )); + }); + } + + QueryBuilder titleIsNotEmpty() { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.greaterThan( + property: r'title', + value: '', + )); + }); + } +} + +extension NoteQueryObject on QueryBuilder {} + +extension NoteQueryLinks on QueryBuilder {} + +extension NoteQuerySortBy on QueryBuilder { + QueryBuilder sortByContent() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'content', Sort.asc); + }); + } + + QueryBuilder sortByContentDesc() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'content', Sort.desc); + }); + } + + QueryBuilder sortByCreatedTime() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'createdTime', Sort.asc); + }); + } + + QueryBuilder sortByCreatedTimeDesc() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'createdTime', Sort.desc); + }); + } + + QueryBuilder sortByDeleted() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'deleted', Sort.asc); + }); + } + + QueryBuilder sortByDeletedDesc() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'deleted', Sort.desc); + }); + } + + QueryBuilder sortByEditedTime() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'editedTime', Sort.asc); + }); + } + + QueryBuilder sortByEditedTimeDesc() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'editedTime', Sort.desc); + }); + } + + QueryBuilder sortByPinned() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'pinned', Sort.asc); + }); + } + + QueryBuilder sortByPinnedDesc() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'pinned', Sort.desc); + }); + } + + QueryBuilder sortByTitle() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'title', Sort.asc); + }); + } + + QueryBuilder sortByTitleDesc() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'title', Sort.desc); + }); + } +} + +extension NoteQuerySortThenBy on QueryBuilder { + QueryBuilder thenByContent() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'content', Sort.asc); + }); + } + + QueryBuilder thenByContentDesc() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'content', Sort.desc); + }); + } + + QueryBuilder thenByCreatedTime() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'createdTime', Sort.asc); + }); + } + + QueryBuilder thenByCreatedTimeDesc() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'createdTime', Sort.desc); + }); + } + + QueryBuilder thenByDeleted() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'deleted', Sort.asc); + }); + } + + QueryBuilder thenByDeletedDesc() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'deleted', Sort.desc); + }); + } + + QueryBuilder thenByEditedTime() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'editedTime', Sort.asc); + }); + } + + QueryBuilder thenByEditedTimeDesc() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'editedTime', Sort.desc); + }); + } + + QueryBuilder thenById() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'id', Sort.asc); + }); + } + + QueryBuilder thenByIdDesc() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'id', Sort.desc); + }); + } + + QueryBuilder thenByPinned() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'pinned', Sort.asc); + }); + } + + QueryBuilder thenByPinnedDesc() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'pinned', Sort.desc); + }); + } + + QueryBuilder thenByTitle() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'title', Sort.asc); + }); + } + + QueryBuilder thenByTitleDesc() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'title', Sort.desc); + }); + } +} + +extension NoteQueryWhereDistinct on QueryBuilder { + QueryBuilder distinctByContent( + {bool caseSensitive = true}) { + return QueryBuilder.apply(this, (query) { + return query.addDistinctBy(r'content', caseSensitive: caseSensitive); + }); + } + + QueryBuilder distinctByCreatedTime() { + return QueryBuilder.apply(this, (query) { + return query.addDistinctBy(r'createdTime'); + }); + } + + QueryBuilder distinctByDeleted() { + return QueryBuilder.apply(this, (query) { + return query.addDistinctBy(r'deleted'); + }); + } + + QueryBuilder distinctByEditedTime() { + return QueryBuilder.apply(this, (query) { + return query.addDistinctBy(r'editedTime'); + }); + } + + QueryBuilder distinctByPinned() { + return QueryBuilder.apply(this, (query) { + return query.addDistinctBy(r'pinned'); + }); + } + + QueryBuilder distinctByTitle( + {bool caseSensitive = true}) { + return QueryBuilder.apply(this, (query) { + return query.addDistinctBy(r'title', caseSensitive: caseSensitive); + }); + } +} + +extension NoteQueryProperty on QueryBuilder { + QueryBuilder idProperty() { + return QueryBuilder.apply(this, (query) { + return query.addPropertyName(r'id'); + }); + } + + QueryBuilder contentProperty() { + return QueryBuilder.apply(this, (query) { + return query.addPropertyName(r'content'); + }); + } + + QueryBuilder createdTimeProperty() { + return QueryBuilder.apply(this, (query) { + return query.addPropertyName(r'createdTime'); + }); + } + + QueryBuilder deletedProperty() { + return QueryBuilder.apply(this, (query) { + return query.addPropertyName(r'deleted'); + }); + } + + QueryBuilder editedTimeProperty() { + return QueryBuilder.apply(this, (query) { + return query.addPropertyName(r'editedTime'); + }); + } + + QueryBuilder pinnedProperty() { + return QueryBuilder.apply(this, (query) { + return query.addPropertyName(r'pinned'); + }); + } + + QueryBuilder titleProperty() { + return QueryBuilder.apply(this, (query) { + return query.addPropertyName(r'title'); + }); + } +} diff --git a/lib/pages/bin/bin_page.dart b/lib/pages/bin/bin_page.dart new file mode 100644 index 00000000..8736a9b3 --- /dev/null +++ b/lib/pages/bin/bin_page.dart @@ -0,0 +1,51 @@ +import 'package:flutter/material.dart'; +import 'package:flutter_riverpod/flutter_riverpod.dart'; +import 'package:localmaterialnotes/common/placeholders/empty_placeholder.dart'; +import 'package:localmaterialnotes/common/placeholders/error_placeholder.dart'; +import 'package:localmaterialnotes/common/placeholders/loading_placeholder.dart'; +import 'package:localmaterialnotes/common/widgets/note_tile.dart'; +import 'package:localmaterialnotes/providers/bin/bin_provider.dart'; +import 'package:localmaterialnotes/utils/constants/constants.dart'; + +class BinPage extends ConsumerStatefulWidget { + const BinPage(); + + @override + ConsumerState createState() => _BinPageState(); +} + +class _BinPageState extends ConsumerState { + Future _refresh() async { + await ref.read(binProvider.notifier).get(); + } + + @override + Widget build(BuildContext context) { + return RefreshIndicator( + onRefresh: _refresh, + child: ScrollConfiguration( + behavior: scrollBehavior, + child: ref.watch(binProvider).when( + data: (notes) { + if (notes.isEmpty) { + return EmptyPlaceholder.bin(); + } + + return ListView.builder( + itemCount: notes.length, + itemBuilder: (context, index) { + return NoteTile(notes[index]); + }, + ); + }, + error: (error, stackTrace) { + return const ErrorPlaceholder(); + }, + loading: () { + return const LoadingPlaceholder(); + }, + ), + ), + ); + } +} diff --git a/lib/pages/editor/about_sheet.dart b/lib/pages/editor/about_sheet.dart new file mode 100644 index 00000000..1a3dd56f --- /dev/null +++ b/lib/pages/editor/about_sheet.dart @@ -0,0 +1,39 @@ +import 'package:flutter/material.dart'; +import 'package:flutter_riverpod/flutter_riverpod.dart'; +import 'package:localmaterialnotes/common/placeholders/error_placeholder.dart'; +import 'package:localmaterialnotes/providers/current_note/current_note_provider.dart'; +import 'package:localmaterialnotes/utils/constants/constants.dart'; +import 'package:localmaterialnotes/utils/extensions/date_time_extensions.dart'; + +class AboutSheet extends ConsumerWidget { + const AboutSheet(); + + @override + Widget build(BuildContext context, WidgetRef ref) { + final note = ref.watch(currentNoteProvider); + + if (note == null) return const ErrorPlaceholder(); + + return ListView( + shrinkWrap: true, + children: [ + ListTile( + title: Text(localizations.about_created), + trailing: Text(note.createdTime.yMMMMd_at_Hm), + ), + ListTile( + title: Text(localizations.about_last_edited), + trailing: Text(note.editedTime.yMMMMd_at_Hm), + ), + ListTile( + title: Text(localizations.about_words), + trailing: Text(RegExp(r'[\w-]+').allMatches(note.contentDisplay).length.toString()), + ), + ListTile( + title: Text(localizations.about_characters), + trailing: Text(note.contentDisplay.length.toString()), + ), + ], + ); + } +} diff --git a/lib/pages/editor/editor_page.dart b/lib/pages/editor/editor_page.dart new file mode 100644 index 00000000..b18c5184 --- /dev/null +++ b/lib/pages/editor/editor_page.dart @@ -0,0 +1,97 @@ +import 'dart:convert'; + +import 'package:fleather/fleather.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter/services.dart'; +import 'package:flutter_riverpod/flutter_riverpod.dart'; +import 'package:localmaterialnotes/common/placeholders/loading_placeholder.dart'; +import 'package:localmaterialnotes/models/note/note.dart'; +import 'package:localmaterialnotes/providers/current_note/current_note_provider.dart'; +import 'package:localmaterialnotes/providers/editor_controller/editor_controller_provider.dart'; +import 'package:localmaterialnotes/providers/notes/notes_provider.dart'; +import 'package:localmaterialnotes/utils/constants/constants.dart'; +import 'package:localmaterialnotes/utils/constants/paddings.dart'; +import 'package:url_launcher/url_launcher_string.dart'; + +class EditorPage extends ConsumerStatefulWidget { + const EditorPage({ + this.readOnly = false, + this.autofocus = false, + }); + + final bool readOnly; + final bool autofocus; + + @override + ConsumerState createState() => _EditorState(); +} + +class _EditorState extends ConsumerState { + final titleController = TextEditingController(); + late FleatherController fleatherController; + final fleatherFocusNode = FocusNode(); + + void _synchronizeTitle(Note note, String? newTitle) { + if (newTitle == null) return; + + ref.read(notesProvider.notifier).edit(note..title = newTitle); + } + + void _synchronizeContent(Note note) { + note.content = jsonEncode(fleatherController.document.toDelta().toJson()); + ref.read(notesProvider.notifier).edit(note); + } + + void _launchUrl(String? url) { + if (url == null) return; + + launchUrlString(url); + } + + @override + Widget build(BuildContext context) { + final note = ref.watch(currentNoteProvider); + + if (note == null) return const LoadingPlaceholder(); + + titleController.text = note.title; + fleatherController = FleatherController(document: note.document); + fleatherController.addListener(() => _synchronizeContent(note)); + + Future(() { + ref.read(editorControllerProvider.notifier).set(fleatherController); + }); + + return Padding( + padding: Paddings.custom.pageButBottom, + child: Column( + children: [ + TextField( + readOnly: widget.readOnly, + autofocus: widget.autofocus, + textInputAction: TextInputAction.next, + style: Theme.of(context).textTheme.titleLarge, + decoration: InputDecoration.collapsed( + hintText: localizations.hint_title, + ), + controller: titleController, + onChanged: (text) => _synchronizeTitle(note, text), + ), + Padding(padding: Paddings.padding8.vertical), + Expanded( + child: FleatherEditor( + controller: fleatherController, + focusNode: fleatherFocusNode, + readOnly: widget.readOnly, + expands: true, + onLaunchUrl: _launchUrl, + spellCheckConfiguration: SpellCheckConfiguration( + spellCheckService: DefaultSpellCheckService(), + ), + ), + ), + ], + ), + ); + } +} diff --git a/lib/pages/notes/notes_page.dart b/lib/pages/notes/notes_page.dart new file mode 100644 index 00000000..8e46f9c1 --- /dev/null +++ b/lib/pages/notes/notes_page.dart @@ -0,0 +1,59 @@ +import 'dart:async'; + +import 'package:flutter/material.dart'; +import 'package:flutter_riverpod/flutter_riverpod.dart'; +import 'package:localmaterialnotes/common/placeholders/empty_placeholder.dart'; +import 'package:localmaterialnotes/common/placeholders/error_placeholder.dart'; +import 'package:localmaterialnotes/common/placeholders/loading_placeholder.dart'; +import 'package:localmaterialnotes/common/widgets/note_tile.dart'; +import 'package:localmaterialnotes/providers/notes/notes_provider.dart'; +import 'package:localmaterialnotes/utils/constants/constants.dart'; +import 'package:localmaterialnotes/utils/platform_manager.dart'; +import 'package:localmaterialnotes/utils/quick_actions_manager.dart'; + +class NotesPage extends ConsumerStatefulWidget { + const NotesPage(); + + @override + ConsumerState createState() => _NotesPageState(); +} + +class _NotesPageState extends ConsumerState { + Future _refresh() async { + await ref.read(notesProvider.notifier).get(); + } + + @override + Widget build(BuildContext context) { + if (kIsAndroidApp) { + QuickActionsManager().init(context, ref); + } + + return RefreshIndicator( + onRefresh: _refresh, + child: ScrollConfiguration( + behavior: scrollBehavior, + child: ref.watch(notesProvider).when( + data: (notes) { + if (notes.isEmpty) { + return EmptyPlaceholder.notes(); + } + + return ListView.builder( + itemCount: notes.length, + itemBuilder: (context, index) { + return NoteTile(notes[index]); + }, + ); + }, + error: (error, stackTrace) { + return const ErrorPlaceholder(); + }, + loading: () { + return const LoadingPlaceholder(); + }, + ), + ), + ); + } +} diff --git a/lib/pages/settings/interactions.dart b/lib/pages/settings/interactions.dart new file mode 100644 index 00000000..82831f0b --- /dev/null +++ b/lib/pages/settings/interactions.dart @@ -0,0 +1,164 @@ +import 'package:flutter/material.dart'; +import 'package:go_router/go_router.dart'; +import 'package:locale_names/locale_names.dart'; +import 'package:localmaterialnotes/l10n/app_localizations.g.dart'; +import 'package:localmaterialnotes/pages/settings/shortcut.dart'; +import 'package:localmaterialnotes/utils/asset.dart'; +import 'package:localmaterialnotes/utils/constants/constants.dart'; +import 'package:localmaterialnotes/utils/constants/sizes.dart'; +import 'package:localmaterialnotes/utils/extensions/string_extension.dart'; +import 'package:localmaterialnotes/utils/locale_manager.dart'; +import 'package:localmaterialnotes/utils/package_info_manager.dart'; +import 'package:localmaterialnotes/utils/preferences/confirmations.dart'; +import 'package:localmaterialnotes/utils/preferences/preference_key.dart'; +import 'package:localmaterialnotes/utils/preferences/preferences_manager.dart'; +import 'package:localmaterialnotes/utils/theme_manager.dart'; +import 'package:url_launcher/url_launcher_string.dart'; + +class Interactions { + Future selectTheme(BuildContext context) async { + await showAdaptiveDialog( + context: context, + builder: (context) { + return SimpleDialog( + clipBehavior: Clip.hardEdge, + title: Text(localizations.settings_theme), + children: [ + ListTile( + leading: const Icon(Icons.smartphone), + selected: ThemeManager().themeMode == ThemeMode.system, + title: Text(localizations.settings_theme_system), + onTap: () => context.pop(ThemeMode.system), + ), + ListTile( + leading: const Icon(Icons.light_mode), + selected: ThemeManager().themeMode == ThemeMode.light, + title: Text(localizations.settings_theme_light), + onTap: () => context.pop(ThemeMode.light), + ), + ListTile( + leading: const Icon(Icons.dark_mode), + selected: ThemeManager().themeMode == ThemeMode.dark, + title: Text(localizations.settings_theme_dark), + onTap: () => context.pop(ThemeMode.dark), + ), + ], + ); + }, + ).then((themeMode) { + if (themeMode == null) return; + + ThemeManager().setThemeMode(themeMode); + }); + } + + void toggleDynamicTheming(bool? value) { + if (value == null) return; + + PreferencesManager().set(PreferenceKey.dynamicTheming.name, value); + dynamicThemingNotifier.value = value; + } + + void toggleBlackTheming(bool? value) { + if (value == null) return; + + PreferencesManager().set(PreferenceKey.blackTheming.name, value); + blackThemingNotifier.value = value; + } + + Future selectLanguage(BuildContext context) async { + await showAdaptiveDialog( + context: context, + builder: (context) { + return SimpleDialog( + clipBehavior: Clip.hardEdge, + title: Text(localizations.settings_language), + children: AppLocalizations.supportedLocales.map((locale) { + return ListTile( + selected: locale == Localizations.localeOf(context), + title: Text(locale.nativeDisplayLanguage.capitalized), + onTap: () => context.pop(locale), + ); + }).toList(), + ); + }, + ).then((locale) { + if (locale == null) return; + + LocaleManager().setLocale(locale); + }); + } + + Future selectConfirmations(BuildContext context) async { + await showAdaptiveDialog( + context: context, + builder: (context) { + return SimpleDialog( + clipBehavior: Clip.hardEdge, + title: Text(localizations.settings_confirmations), + children: Confirmations.values.map((confirmationsValue) { + return ListTile( + title: Text(confirmationsValue.title), + selected: Confirmations.fromPreferences() == confirmationsValue, + onTap: () => context.pop(confirmationsValue), + ); + }).toList(), + ); + }, + ).then((confirmationsValue) { + if (confirmationsValue == null) return; + + PreferencesManager().set(PreferenceKey.confirmations.name, confirmationsValue.name); + }); + } + + Future showShortcuts(BuildContext context) async { + await showAdaptiveDialog( + context: context, + builder: (context) { + return AlertDialog.adaptive( + clipBehavior: Clip.hardEdge, + title: Text(localizations.settings_shortcuts), + content: SingleChildScrollView( + child: ListBody( + children: Shortcut.values.map((shortcut) { + return ListTile( + title: Text(shortcut.title), + trailing: Text(shortcut.keys), + ); + }).toList(), + ), + ), + actions: [ + TextButton( + onPressed: () => Navigator.of(context).pop(), + child: Text(localizations.button_close), + ), + ], + ); + }, + ); + } + + Future showAbout(BuildContext context) async { + showAboutDialog( + context: context, + applicationName: localizations.app_name, + applicationVersion: PackageInfoManager().version, + applicationIcon: Image.asset( + Asset.icon.path, + width: Sizes.size64.size, + height: Sizes.size64.size, + ), + applicationLegalese: localizations.settings_licence_description, + ); + } + + void openGitHub(_) { + launchUrlString('https://github.com/maelchiotti/MaterialNotes'); + } + + void openLicense(_) { + launchUrlString('https://github.com/maelchiotti/MaterialNotes/blob/main/LICENSE'); + } +} diff --git a/lib/pages/settings/settings_page.dart b/lib/pages/settings/settings_page.dart new file mode 100644 index 00000000..cddeac05 --- /dev/null +++ b/lib/pages/settings/settings_page.dart @@ -0,0 +1,118 @@ +import 'package:flutter/material.dart'; +import 'package:flutter_riverpod/flutter_riverpod.dart'; +import 'package:flutter_settings_ui/flutter_settings_ui.dart'; +import 'package:locale_names/locale_names.dart'; +import 'package:localmaterialnotes/pages/settings/interactions.dart'; +import 'package:localmaterialnotes/utils/constants/constants.dart'; +import 'package:localmaterialnotes/utils/extensions/string_extension.dart'; +import 'package:localmaterialnotes/utils/package_info_manager.dart'; +import 'package:localmaterialnotes/utils/preferences/confirmations.dart'; +import 'package:localmaterialnotes/utils/theme_manager.dart'; +import 'package:simple_icons/simple_icons.dart'; + +class SettingsPage extends ConsumerStatefulWidget { + const SettingsPage(); + + @override + ConsumerState createState() => _SettingsPageState(); +} + +class _SettingsPageState extends ConsumerState { + final interactions = Interactions(); + + @override + Widget build(BuildContext context) { + return SettingsList( + platform: DevicePlatform.android, + lightTheme: SettingsThemeData( + settingsListBackground: Theme.of(context).colorScheme.background, + ), + darkTheme: SettingsThemeData( + settingsListBackground: Theme.of(context).colorScheme.background, + ), + sections: [ + SettingsSection( + title: Text(localizations.settings_appearance), + tiles: [ + SettingsTile.navigation( + leading: const Icon(Icons.palette), + title: Text(localizations.settings_theme), + value: Text(ThemeManager().themeModeName), + onPressed: (context) async { + await interactions.selectTheme(context); + setState(() {}); + }, + ), + if (ThemeManager().isDynamicThemingAvailable) + SettingsTile.switchTile( + leading: const Icon(Icons.bolt), + title: Text(localizations.settings_dynamic_theming), + description: Text(localizations.settings_dynamic_theming_description), + initialValue: ThemeManager().useDynamicTheming, + onToggle: interactions.toggleDynamicTheming, + ), + SettingsTile.switchTile( + leading: const Icon(Icons.nightlight), + title: Text(localizations.settings_black_theming), + description: Text(localizations.settings_black_theming_description), + initialValue: ThemeManager().useBlackTheming, + onToggle: (toggled) { + interactions.toggleBlackTheming(toggled); + setState(() {}); + }, + ), + SettingsTile.navigation( + leading: const Icon(Icons.language), + title: Text(localizations.settings_language), + value: Text(Localizations.localeOf(context).nativeDisplayLanguage.capitalized), + onPressed: interactions.selectLanguage, + ), + ], + ), + SettingsSection( + title: Text(localizations.settings_behavior), + tiles: [ + SettingsTile.navigation( + leading: const Icon(Icons.warning), + title: Text(localizations.settings_confirmations), + value: Text(Confirmations.fromPreferences().title), + onPressed: (context) async { + await interactions.selectConfirmations(context); + setState(() {}); + }, + ), + SettingsTile.navigation( + leading: const Icon(Icons.keyboard), + title: Text(localizations.settings_shortcuts), + value: Text(localizations.settings_shortcuts_description), + onPressed: interactions.showShortcuts, + ), + ], + ), + SettingsSection( + title: Text(localizations.settings_about), + tiles: [ + SettingsTile( + leading: const Icon(Icons.info), + title: Text(localizations.app_name), + value: Text(PackageInfoManager().version), + onPressed: interactions.showAbout, + ), + SettingsTile( + leading: const Icon(SimpleIcons.github), + title: Text(localizations.settings_github), + value: Text(localizations.settings_github_description), + onPressed: interactions.openGitHub, + ), + SettingsTile( + leading: const Icon(Icons.balance), + title: Text(localizations.settings_licence), + value: Text(localizations.settings_licence_description), + onPressed: interactions.openLicense, + ), + ], + ), + ], + ); + } +} diff --git a/lib/pages/settings/shortcut.dart b/lib/pages/settings/shortcut.dart new file mode 100644 index 00000000..448fcff9 --- /dev/null +++ b/lib/pages/settings/shortcut.dart @@ -0,0 +1,29 @@ +import 'package:localmaterialnotes/utils/constants/constants.dart'; + +enum Shortcut { + bold('CTRL+B'), + italic('CTRL+I'), + underline('CTRL+U'), + undo('CTRL+Z'), + redo('CTRL+MAJ+Z'), + ; + + final String keys; + + const Shortcut(this.keys); + + String get title { + switch (this) { + case Shortcut.bold: + return localizations.shortcut_bold; + case Shortcut.italic: + return localizations.shortcut_italic; + case Shortcut.underline: + return localizations.shortcut_underline; + case Shortcut.undo: + return localizations.shortcut_undo; + case Shortcut.redo: + return localizations.shortcut_redo; + } + } +} diff --git a/lib/providers/base_provider.dart b/lib/providers/base_provider.dart new file mode 100644 index 00000000..cfaac85b --- /dev/null +++ b/lib/providers/base_provider.dart @@ -0,0 +1,5 @@ +import 'package:localmaterialnotes/utils/database_manager.dart'; + +mixin BaseProvider { + late final databaseManager = DatabaseManager(); +} diff --git a/lib/providers/bin/bin_provider.dart b/lib/providers/bin/bin_provider.dart new file mode 100644 index 00000000..bd30ee79 --- /dev/null +++ b/lib/providers/bin/bin_provider.dart @@ -0,0 +1,109 @@ +import 'dart:developer'; + +import 'package:localmaterialnotes/models/note/note.dart'; +import 'package:localmaterialnotes/providers/base_provider.dart'; +import 'package:riverpod_annotation/riverpod_annotation.dart'; + +part 'bin_provider.g.dart'; + +@riverpod +class Bin extends _$Bin with BaseProvider { + @override + FutureOr> build() { + return get(); + } + + Future> get() async { + state = const AsyncLoading(); + + List notes = []; + + try { + notes = await databaseManager.getAll(deleted: true); + } on Exception catch (exception, stackTrace) { + log(exception.toString(), stackTrace: stackTrace); + } + + state = AsyncData(notes); + + return notes; + } + + Future sort() async { + await get(); + } + + Future empty() async { + try { + await databaseManager.deleteAll(); + } catch (exception, stackTrace) { + log(exception.toString(), stackTrace: stackTrace); + return false; + } + + await get(); + + return true; + } + + Future permanentlyDelete(Note noteToPermanentlyDelete) async { + try { + await databaseManager.delete(noteToPermanentlyDelete.id); + } catch (exception, stackTrace) { + log(exception.toString(), stackTrace: stackTrace); + return false; + } + + + await get(); + + return true; + } + + Future restore(Note noteToRestore) async { + state = const AsyncLoading(); + + noteToRestore.deleted = false; + + try { + await databaseManager.edit(noteToRestore); + } on Exception catch (exception, stackTrace) { + log(exception.toString(), stackTrace: stackTrace); + return false; + } + + await get(); + + return true; + } + + void select(Note noteToSelect) { + state = AsyncData([ + for (final Note note in state.value ?? []) note == noteToSelect ? (noteToSelect..selected = true) : note, + ]); + } + + void unselect(Note noteToUnselect) { + state = AsyncData([ + for (final Note note in state.value ?? []) note == noteToUnselect ? (noteToUnselect..selected = false) : note, + ]); + } + + void selectAll() { + state = AsyncData([ + ...?state.value + ?..forEach((note) { + note.selected = true; + }), + ]); + } + + void unselectAll() { + state = AsyncData([ + ...?state.value + ?..forEach((note) { + note.selected = false; + }), + ]); + } +} diff --git a/lib/providers/bin/bin_provider.g.dart b/lib/providers/bin/bin_provider.g.dart new file mode 100644 index 00000000..85f583b9 --- /dev/null +++ b/lib/providers/bin/bin_provider.g.dart @@ -0,0 +1,24 @@ +// GENERATED CODE - DO NOT MODIFY BY HAND + +part of 'bin_provider.dart'; + +// ************************************************************************** +// RiverpodGenerator +// ************************************************************************** + +String _$binHash() => r'2c3a9b4540ccfaf9e5b0ac3b6ec3659742b7a8e0'; + +/// See also [Bin]. +@ProviderFor(Bin) +final binProvider = AutoDisposeAsyncNotifierProvider>.internal( + Bin.new, + name: r'binProvider', + debugGetCreateSourceHash: + const bool.fromEnvironment('dart.vm.product') ? null : _$binHash, + dependencies: null, + allTransitiveDependencies: null, +); + +typedef _$Bin = AutoDisposeAsyncNotifier>; +// ignore_for_file: type=lint +// ignore_for_file: subtype_of_sealed_class, invalid_use_of_internal_member, invalid_use_of_visible_for_testing_member diff --git a/lib/providers/current_note/current_note_provider.dart b/lib/providers/current_note/current_note_provider.dart new file mode 100644 index 00000000..6c8a7ec9 --- /dev/null +++ b/lib/providers/current_note/current_note_provider.dart @@ -0,0 +1,22 @@ +import 'package:localmaterialnotes/models/note/note.dart'; +import 'package:riverpod_annotation/riverpod_annotation.dart'; + +part 'current_note_provider.g.dart'; + +// ignore_for_file: use_setters_to_change_properties + +@Riverpod(keepAlive: true) +class CurrentNote extends _$CurrentNote { + @override + Note? build() { + return null; + } + + void set(Note note) { + state = note; + } + + void reset() { + state = null; + } +} diff --git a/lib/providers/current_note/current_note_provider.g.dart b/lib/providers/current_note/current_note_provider.g.dart new file mode 100644 index 00000000..f7432337 --- /dev/null +++ b/lib/providers/current_note/current_note_provider.g.dart @@ -0,0 +1,24 @@ +// GENERATED CODE - DO NOT MODIFY BY HAND + +part of 'current_note_provider.dart'; + +// ************************************************************************** +// RiverpodGenerator +// ************************************************************************** + +String _$currentNoteHash() => r'3820bcba7cfe8a1bd751d7fce008658a598e4b8f'; + +/// See also [CurrentNote]. +@ProviderFor(CurrentNote) +final currentNoteProvider = NotifierProvider.internal( + CurrentNote.new, + name: r'currentNoteProvider', + debugGetCreateSourceHash: + const bool.fromEnvironment('dart.vm.product') ? null : _$currentNoteHash, + dependencies: null, + allTransitiveDependencies: null, +); + +typedef _$CurrentNote = Notifier; +// ignore_for_file: type=lint +// ignore_for_file: subtype_of_sealed_class, invalid_use_of_internal_member, invalid_use_of_visible_for_testing_member diff --git a/lib/providers/editor_controller/editor_controller_provider.dart b/lib/providers/editor_controller/editor_controller_provider.dart new file mode 100644 index 00000000..a5b19b38 --- /dev/null +++ b/lib/providers/editor_controller/editor_controller_provider.dart @@ -0,0 +1,22 @@ +import 'package:fleather/fleather.dart'; +import 'package:riverpod_annotation/riverpod_annotation.dart'; + +part 'editor_controller_provider.g.dart'; + +// ignore_for_file: use_setters_to_change_properties + +@Riverpod(keepAlive: true) +class EditorController extends _$EditorController { + @override + Raw? build() { + return null; + } + + void set(FleatherController fleatherController) { + state = fleatherController; + } + + void unset() { + state = null; + } +} diff --git a/lib/providers/editor_controller/editor_controller_provider.g.dart b/lib/providers/editor_controller/editor_controller_provider.g.dart new file mode 100644 index 00000000..f38a7e88 --- /dev/null +++ b/lib/providers/editor_controller/editor_controller_provider.g.dart @@ -0,0 +1,26 @@ +// GENERATED CODE - DO NOT MODIFY BY HAND + +part of 'editor_controller_provider.dart'; + +// ************************************************************************** +// RiverpodGenerator +// ************************************************************************** + +String _$editorControllerHash() => r'daa52f679eec2218957f51064145f708efcbad46'; + +/// See also [EditorController]. +@ProviderFor(EditorController) +final editorControllerProvider = + NotifierProvider.internal( + EditorController.new, + name: r'editorControllerProvider', + debugGetCreateSourceHash: const bool.fromEnvironment('dart.vm.product') + ? null + : _$editorControllerHash, + dependencies: null, + allTransitiveDependencies: null, +); + +typedef _$EditorController = Notifier; +// ignore_for_file: type=lint +// ignore_for_file: subtype_of_sealed_class, invalid_use_of_internal_member, invalid_use_of_visible_for_testing_member diff --git a/lib/providers/notes/notes_provider.dart b/lib/providers/notes/notes_provider.dart new file mode 100644 index 00000000..7c1f307e --- /dev/null +++ b/lib/providers/notes/notes_provider.dart @@ -0,0 +1,110 @@ +import 'dart:developer'; + +import 'package:localmaterialnotes/models/note/note.dart'; +import 'package:localmaterialnotes/providers/base_provider.dart'; +import 'package:riverpod_annotation/riverpod_annotation.dart'; + +part 'notes_provider.g.dart'; + +@riverpod +class Notes extends _$Notes with BaseProvider { + @override + FutureOr> build() { + return get(); + } + + Future> get() async { + state = const AsyncLoading(); + + List notes = []; + + try { + notes = await databaseManager.getAll(); + } on Exception catch (exception, stackTrace) { + log(exception.toString(), stackTrace: stackTrace); + } + + state = AsyncData(notes); + + return notes; + } + + Future sort() async { + await get(); + } + + Future add(Note newNote) async { + state = const AsyncLoading(); + + try { + await databaseManager.add(newNote); + } on Exception catch (exception, stackTrace) { + log(exception.toString(), stackTrace: stackTrace); + return false; + } + + await get(); + + return true; + } + + Future edit(Note editedNote) async { + state = const AsyncLoading(); + + editedNote.editedTime = DateTime.now(); + + try { + await databaseManager.edit(editedNote); + } on Exception catch (exception, stackTrace) { + log(exception.toString(), stackTrace: stackTrace); + return false; + } + + await get(); + + return true; + } + + Future togglePin(Note noteToPin) async { + noteToPin.pinned = !noteToPin.pinned; + + return await edit(noteToPin); + } + + Future delete(Note noteToDelete) async { + noteToDelete.pinned = false; + noteToDelete.deleted = true; + + return await edit(noteToDelete); + } + + void select(Note noteToSelect) { + state = AsyncData([ + for (final Note note in state.value ?? []) note == noteToSelect ? (noteToSelect..selected = true) : note, + ]); + } + + void unselect(Note noteToUnselect) { + state = AsyncData([ + for (final Note note in state.value ?? []) note == noteToUnselect ? (noteToUnselect..selected = false) : note, + ]); + } + + void selectAll() { + state = AsyncData([ + ...?state.value + ?..forEach((note) { + note.selected = true; + }), + ]); + } + + void unselectAll() { + state = AsyncData([ + ...?state.value + ?..forEach((note) { + note.selected = false; + }), + ]); + } +} diff --git a/lib/providers/notes/notes_provider.g.dart b/lib/providers/notes/notes_provider.g.dart new file mode 100644 index 00000000..331911be --- /dev/null +++ b/lib/providers/notes/notes_provider.g.dart @@ -0,0 +1,25 @@ +// GENERATED CODE - DO NOT MODIFY BY HAND + +part of 'notes_provider.dart'; + +// ************************************************************************** +// RiverpodGenerator +// ************************************************************************** + +String _$notesHash() => r'b8e744a80700bcb1d12839e0860e7fe6dbf9252b'; + +/// See also [Notes]. +@ProviderFor(Notes) +final notesProvider = + AutoDisposeAsyncNotifierProvider>.internal( + Notes.new, + name: r'notesProvider', + debugGetCreateSourceHash: + const bool.fromEnvironment('dart.vm.product') ? null : _$notesHash, + dependencies: null, + allTransitiveDependencies: null, +); + +typedef _$Notes = AutoDisposeAsyncNotifier>; +// ignore_for_file: type=lint +// ignore_for_file: subtype_of_sealed_class, invalid_use_of_internal_member, invalid_use_of_visible_for_testing_member diff --git a/lib/providers/selection_mode/selection_mode_provider.dart b/lib/providers/selection_mode/selection_mode_provider.dart new file mode 100644 index 00000000..2c157a2d --- /dev/null +++ b/lib/providers/selection_mode/selection_mode_provider.dart @@ -0,0 +1,19 @@ +import 'package:riverpod_annotation/riverpod_annotation.dart'; + +part 'selection_mode_provider.g.dart'; + +@Riverpod(keepAlive: true) +class SelectionMode extends _$SelectionMode { + @override + bool build() { + return false; + } + + void enterSelectionMode() { + state = true; + } + + void exitSelectionMode() { + state = false; + } +} diff --git a/lib/providers/selection_mode/selection_mode_provider.g.dart b/lib/providers/selection_mode/selection_mode_provider.g.dart new file mode 100644 index 00000000..0c5ae7c8 --- /dev/null +++ b/lib/providers/selection_mode/selection_mode_provider.g.dart @@ -0,0 +1,25 @@ +// GENERATED CODE - DO NOT MODIFY BY HAND + +part of 'selection_mode_provider.dart'; + +// ************************************************************************** +// RiverpodGenerator +// ************************************************************************** + +String _$selectionModeHash() => r'ee4c15832eab0b67a50069888fbe232ed711b98f'; + +/// See also [SelectionMode]. +@ProviderFor(SelectionMode) +final selectionModeProvider = NotifierProvider.internal( + SelectionMode.new, + name: r'selectionModeProvider', + debugGetCreateSourceHash: const bool.fromEnvironment('dart.vm.product') + ? null + : _$selectionModeHash, + dependencies: null, + allTransitiveDependencies: null, +); + +typedef _$SelectionMode = Notifier; +// ignore_for_file: type=lint +// ignore_for_file: subtype_of_sealed_class, invalid_use_of_internal_member, invalid_use_of_visible_for_testing_member diff --git a/lib/utils/asset.dart b/lib/utils/asset.dart new file mode 100644 index 00000000..1a9862b9 --- /dev/null +++ b/lib/utils/asset.dart @@ -0,0 +1,12 @@ +enum Asset { + icon('logos/icon.png'), + ; + + final _basePath = 'assets'; + + final String _filePath; + + const Asset(this._filePath); + + String get path => '$_basePath/$_filePath'; +} diff --git a/lib/utils/constants/constants.dart b/lib/utils/constants/constants.dart new file mode 100644 index 00000000..d21a98ab --- /dev/null +++ b/lib/utils/constants/constants.dart @@ -0,0 +1,21 @@ +import 'dart:ui'; + +import 'package:flutter/material.dart'; +import 'package:localmaterialnotes/l10n/app_localizations.g.dart'; +import 'package:localmaterialnotes/utils/theme_manager.dart'; + +final themeModeNotifier = ValueNotifier(ThemeManager().themeMode); +final dynamicThemingNotifier = ValueNotifier(ThemeManager().useDynamicTheming); +final blackThemingNotifier = ValueNotifier(ThemeManager().useBlackTheming); + +final navigatorKey = GlobalKey(debugLabel: 'Root navigator key'); +final drawerKey = GlobalKey(debugLabel: 'Drawer key'); + +final localizations = AppLocalizations.of(navigatorKey.currentContext!)!; + +final scrollBehavior = ScrollConfiguration.of(navigatorKey.currentContext!).copyWith( + dragDevices: { + PointerDeviceKind.touch, + PointerDeviceKind.mouse, + }, +); diff --git a/lib/utils/constants/paddings.dart b/lib/utils/constants/paddings.dart new file mode 100644 index 00000000..c5f741c6 --- /dev/null +++ b/lib/utils/constants/paddings.dart @@ -0,0 +1,52 @@ +import 'package:flutter/material.dart'; + +enum Paddings { + custom(0), + padding2(2), + padding4(4), + padding8(8), + padding16(16), + padding32(32), + padding64(64), + ; + + EdgeInsets get zero => EdgeInsets.zero; + + EdgeInsets get all => EdgeInsets.all(_padding); + + EdgeInsets get horizontal => EdgeInsets.symmetric(horizontal: _padding); + + EdgeInsets get vertical => EdgeInsets.symmetric(vertical: _padding); + + EdgeInsets get left => EdgeInsets.only(left: _padding); + + EdgeInsets get right => EdgeInsets.only(right: _padding); + + EdgeInsets get top => EdgeInsets.only(top: _padding); + + EdgeInsets get bottom => EdgeInsets.only(bottom: _padding); + + EdgeInsets get fab => const EdgeInsets.only(bottom: kFloatingActionButtonMargin + 64); + + EdgeInsets get miniFab => const EdgeInsets.only(bottom: kFloatingActionButtonMargin + 48); + + EdgeInsets get page => const EdgeInsets.all(16); + + EdgeInsets get pageButBottom => const EdgeInsets.only(top: 16, left: 16, right: 16); + + EdgeInsets get pageHorizontal => const EdgeInsets.symmetric(horizontal: 16); + + EdgeInsets get pageVertical => const EdgeInsets.symmetric(vertical: 16); + + EdgeInsets get drawer => const EdgeInsets.all(8); + + EdgeInsets get editorDesktop => const EdgeInsets.all(16); + + EdgeInsets get editorMobile => const EdgeInsets.all(4); + + EdgeInsets get appBarActionsEnd => const EdgeInsets.only(right: 8); + + final double _padding; + + const Paddings(this._padding); +} diff --git a/lib/utils/constants/radiuses.dart b/lib/utils/constants/radiuses.dart new file mode 100644 index 00000000..e588f2a5 --- /dev/null +++ b/lib/utils/constants/radiuses.dart @@ -0,0 +1,18 @@ +import 'package:flutter/material.dart'; + +enum Radiuses { + custom(0), + radius2(2), + radius4(4), + radius8(8), + radius16(16), + radius32(32), + radius64(64), + ; + + final double radius; + + BorderRadius get circular => BorderRadius.circular(radius); + + const Radiuses(this.radius); +} diff --git a/lib/utils/constants/separators.dart b/lib/utils/constants/separators.dart new file mode 100644 index 00000000..b481052e --- /dev/null +++ b/lib/utils/constants/separators.dart @@ -0,0 +1,35 @@ +import 'package:flutter/material.dart'; + +enum Separator { + divider1(1, 1, 0, 0), + divider1indent16(1, 1, 16, 16), + divider2(2, 2, 0, 0), + divider2indent16(2, 2, 16, 16), + ; + + final double _size; + final double _thickness; + final double _indent; + final double _endIndent; + + Divider get horizontal => Divider( + height: _size, + thickness: _thickness, + indent: _indent, + endIndent: _endIndent, + ); + + VerticalDivider get vertical => VerticalDivider( + width: _size, + thickness: _thickness, + indent: _indent, + endIndent: _endIndent, + ); + + const Separator( + this._size, + this._thickness, + this._indent, + this._endIndent, + ); +} diff --git a/lib/utils/constants/sizes.dart b/lib/utils/constants/sizes.dart new file mode 100644 index 00000000..99ed0041 --- /dev/null +++ b/lib/utils/constants/sizes.dart @@ -0,0 +1,27 @@ +enum Sizes { + custom(0), + size2(2), + size4(4), + size8(8), + size16(16), + size32(32), + size64(64), + size128(128), + size256(256), + size512(512), + size1024(1024), + size2048(2048), + ; + + final double size; + + double get zero => 0; + + double get infinity => double.infinity; + + double get searchAppBar => 8; + + double get searchBar => 48; + + const Sizes(this.size); +} diff --git a/lib/utils/database_manager.dart b/lib/utils/database_manager.dart new file mode 100644 index 00000000..fef9ad4b --- /dev/null +++ b/lib/utils/database_manager.dart @@ -0,0 +1,66 @@ +import 'package:isar/isar.dart'; +import 'package:localmaterialnotes/models/note/note.dart'; +import 'package:localmaterialnotes/utils/preferences/sort_method.dart'; +import 'package:path_provider/path_provider.dart'; + +class DatabaseManager { + static final DatabaseManager _singleton = DatabaseManager._internal(); + + factory DatabaseManager() { + return _singleton; + } + + DatabaseManager._internal(); + + late Isar database; + + Future init() async { + final directory = await getApplicationDocumentsDirectory(); + database = await Isar.open( + [NoteSchema], + directory: directory.path, + ); + } + + Future> getAll({bool deleted = false}) async { + final sortMethod = SortMethod.methodFromPreferences(); + final sortAscending = SortMethod.ascendingFromPreferences; + + final sortedByPinned = database.notes.where().deletedEqualTo(deleted).sortByPinnedDesc(); + + switch (sortMethod) { + case SortMethod.date: + return sortAscending + ? await sortedByPinned.thenByEditedTime().findAll() + : await sortedByPinned.thenByEditedTimeDesc().findAll(); + case SortMethod.title: + return sortAscending + ? await sortedByPinned.thenByTitle().findAll() + : await sortedByPinned.thenByTitleDesc().findAll(); + default: + throw Exception(); + } + } + + Future add(Note note) async { + await database.writeTxn(() async { + await database.notes.put(note); + }); + } + + Future edit(Note note) async { + await add(note); + } + + Future delete(Id id) async { + await database.writeTxn(() async { + await database.notes.delete(id); + }); + } + + Future deleteAll() async { + await database.writeTxn(() async { + await database.notes.where().deletedEqualTo(true).deleteAll(); + }); + } +} diff --git a/lib/utils/extensions/date_time_extensions.dart b/lib/utils/extensions/date_time_extensions.dart new file mode 100644 index 00000000..ecf3d05f --- /dev/null +++ b/lib/utils/extensions/date_time_extensions.dart @@ -0,0 +1,15 @@ +// ignore_for_file: non_constant_identifier_names + +import 'package:intl/intl.dart'; +import 'package:localmaterialnotes/utils/constants/constants.dart'; + +extension DateTimeExtensions on DateTime { + String get yMMMMd_at_Hm { + final localeName = localizations.localeName; + + final date = DateFormat.yMMMMd(localeName).format(this); + final time = DateFormat.Hm(localeName).format(this); + + return '$date ${localizations.time_at} $time'; + } +} diff --git a/lib/utils/extensions/go_router_extension.dart b/lib/utils/extensions/go_router_extension.dart new file mode 100644 index 00000000..acf7a942 --- /dev/null +++ b/lib/utils/extensions/go_router_extension.dart @@ -0,0 +1,12 @@ +import 'package:go_router/go_router.dart'; + +extension GoRouterExtension on GoRouter { + String location() { + final RouteMatch lastMatch = routerDelegate.currentConfiguration.last; + final RouteMatchList matchList = + lastMatch is ImperativeRouteMatch ? lastMatch.matches : routerDelegate.currentConfiguration; + final String location = matchList.uri.toString(); + + return location; + } +} diff --git a/lib/utils/extensions/string_extension.dart b/lib/utils/extensions/string_extension.dart new file mode 100644 index 00000000..68d13878 --- /dev/null +++ b/lib/utils/extensions/string_extension.dart @@ -0,0 +1,7 @@ +import 'package:intl/intl.dart'; + +extension StringExtension on String { + String get capitalized { + return toBeginningOfSentenceCase(this) ?? this; + } +} diff --git a/lib/utils/extensions/validators/string_validators.dart b/lib/utils/extensions/validators/string_validators.dart new file mode 100644 index 00000000..b34a0bf3 --- /dev/null +++ b/lib/utils/extensions/validators/string_validators.dart @@ -0,0 +1,22 @@ +extension StringValidators on String { + bool get isValidEmail { + return RegExp( + r'^(([^<>()[\]\\.,;:\s@"]+(\.[^<>()[\]\\.,;:\s@"]+)*)|(".+"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$', + ).hasMatch(this); + } + + bool get isStrongPassword { + return RegExp(r'''^(?=.*?[A-Z])(?=.*?[a-z])(?=.*?[0-9])(?=.*?[!@#\$&*~`)\%\-(_+=;:,.<>/?"'[{\]}\|^]).{12,}$''') + .hasMatch(this); + } + + bool get isValidPhone { + return RegExp( + r'^(?:[+0][1-9])?[0-9]{10,12}$', + ).hasMatch(this); + } + + bool get isOpenableUrl { + return isNotEmpty && Uri.tryParse(this)!.isAbsolute; + } +} diff --git a/lib/utils/locale_manager.dart b/lib/utils/locale_manager.dart new file mode 100644 index 00000000..0929a4b8 --- /dev/null +++ b/lib/utils/locale_manager.dart @@ -0,0 +1,42 @@ +import 'dart:io'; + +import 'package:flutter/foundation.dart'; +import 'package:flutter/material.dart'; +import 'package:localmaterialnotes/l10n/app_localizations.g.dart'; +import 'package:localmaterialnotes/utils/constants/constants.dart'; +import 'package:localmaterialnotes/utils/preferences/preference_key.dart'; +import 'package:localmaterialnotes/utils/preferences/preferences_manager.dart'; + +class LocaleManager { + Locale get locale { + final preferredLocaleLanguageCode = PreferencesManager().get(PreferenceKey.locale); + + if (preferredLocaleLanguageCode != null) { + return Locale(preferredLocaleLanguageCode); + } else { + if (kIsWeb) return const Locale('en'); + + final deviceLocale = Platform.localeName; + for (final locale in AppLocalizations.supportedLocales) { + if (deviceLocale.split('_').first == locale.languageCode) { + return locale; + } + } + + return const Locale('en'); + } + } + + void setLocale(Locale? locale) { + if (locale == null) return; + + PreferencesManager().set(PreferenceKey.locale.name, locale.languageCode); + + ScaffoldMessenger.of(navigatorKey.currentContext!).showSnackBar( + SnackBar( + content: Text(localizations.settings_language_restart), + behavior: SnackBarBehavior.floating, + ), + ); + } +} diff --git a/lib/utils/package_info_manager.dart b/lib/utils/package_info_manager.dart new file mode 100644 index 00000000..355bcde8 --- /dev/null +++ b/lib/utils/package_info_manager.dart @@ -0,0 +1,19 @@ +import 'package:package_info_plus/package_info_plus.dart'; + +class PackageInfoManager { + static final PackageInfoManager _singleton = PackageInfoManager._internal(); + + factory PackageInfoManager() { + return _singleton; + } + + PackageInfoManager._internal(); + + late final PackageInfo _packageInfo; + + Future init() async { + _packageInfo = await PackageInfo.fromPlatform(); + } + + String get version => _packageInfo.version; +} diff --git a/lib/utils/platform_manager.dart b/lib/utils/platform_manager.dart new file mode 100644 index 00000000..a5b640a1 --- /dev/null +++ b/lib/utils/platform_manager.dart @@ -0,0 +1,11 @@ +import 'dart:io'; + +import 'package:flutter/foundation.dart'; + +final bool kIsMobile = kIsWeb + ? defaultTargetPlatform == TargetPlatform.android || defaultTargetPlatform == TargetPlatform.iOS + : Platform.isAndroid || Platform.isIOS; + +final bool kIsDesktop = !kIsWeb && (Platform.isWindows || Platform.isLinux || Platform.isMacOS); + +final bool kIsAndroidApp = !kIsWeb && Platform.isAndroid; diff --git a/lib/utils/preferences/confirmations.dart b/lib/utils/preferences/confirmations.dart new file mode 100644 index 00000000..8a59c51a --- /dev/null +++ b/lib/utils/preferences/confirmations.dart @@ -0,0 +1,55 @@ +import 'package:localmaterialnotes/utils/constants/constants.dart'; +import 'package:localmaterialnotes/utils/preferences/preference_key.dart'; +import 'package:localmaterialnotes/utils/preferences/preferences_manager.dart'; + +enum Confirmations { + none('none'), + irreversible('irreversible'), + all('all'), + ; + + final String name; + + const Confirmations(this.name); + + factory Confirmations.fromPreferences() { + final method = PreferencesManager().get(PreferenceKey.confirmations) ?? + PreferenceKey.confirmations.defaultValue! as String; + + if (method == Confirmations.none.name) { + return Confirmations.none; + } else if (method == Confirmations.irreversible.name) { + return Confirmations.irreversible; + } else if (method == Confirmations.all.name) { + return Confirmations.all; + } else { + return Confirmations.irreversible; + } + } + + String get title { + switch (this) { + case Confirmations.none: + return localizations.confirmations_title_none; + case Confirmations.irreversible: + return localizations.confirmations_title_irreversible; + case Confirmations.all: + return localizations.confirmations_title_all; + default: + throw Exception(); + } + } + + String get description { + switch (this) { + case Confirmations.none: + return localizations.confirmations_description_none; + case Confirmations.irreversible: + return localizations.confirmations_description_irreversible; + case Confirmations.all: + return localizations.confirmations_description_all; + default: + throw Exception(); + } + } +} diff --git a/lib/utils/preferences/preference_key.dart b/lib/utils/preferences/preference_key.dart new file mode 100644 index 00000000..baf701ac --- /dev/null +++ b/lib/utils/preferences/preference_key.dart @@ -0,0 +1,14 @@ +enum PreferenceKey { + locale, + theme, + dynamicTheming(true), + blackTheming(false), + sortMethod('date'), + sortAscending(false), + confirmations('irreversible'), + ; + + final Object? defaultValue; + + const PreferenceKey([this.defaultValue]); +} diff --git a/lib/utils/preferences/preferences_manager.dart b/lib/utils/preferences/preferences_manager.dart new file mode 100644 index 00000000..23e1dc87 --- /dev/null +++ b/lib/utils/preferences/preferences_manager.dart @@ -0,0 +1,40 @@ +import 'package:localmaterialnotes/utils/preferences/preference_key.dart'; +import 'package:shared_preferences/shared_preferences.dart'; + +class PreferencesManager { + static final PreferencesManager _singleton = PreferencesManager._internal(); + + factory PreferencesManager() { + return _singleton; + } + + PreferencesManager._internal(); + + late final SharedPreferences _preferences; + + Future init() async { + _preferences = await SharedPreferences.getInstance(); + } + + void set(String key, T value) { + if (T == dynamic) throw ArgumentError('The type T is required.'); + + if (T == bool) { + _preferences.setBool(key, value as bool); + } else if (T == int) { + _preferences.setInt(key, value as int); + } else if (T == double) { + _preferences.setDouble(key, value as double); + } else if (T == String) { + _preferences.setString(key, value as String); + } else if (T == List) { + _preferences.setStringList(key, value as List); + } + } + + T? get(PreferenceKey preferenceKey) { + if (T == dynamic) throw ArgumentError('The type T is required.'); + + return _preferences.get(preferenceKey.name) as T?; + } +} diff --git a/lib/utils/preferences/sort_method.dart b/lib/utils/preferences/sort_method.dart new file mode 100644 index 00000000..773ca811 --- /dev/null +++ b/lib/utils/preferences/sort_method.dart @@ -0,0 +1,31 @@ +import 'package:localmaterialnotes/utils/preferences/preference_key.dart'; +import 'package:localmaterialnotes/utils/preferences/preferences_manager.dart'; + +enum SortMethod { + date('date'), + title('title'), + ascending('ascending'), + ; + + final String name; + + const SortMethod(this.name); + + factory SortMethod.methodFromPreferences() { + final method = + PreferencesManager().get(PreferenceKey.sortMethod) ?? PreferenceKey.sortMethod.defaultValue! as String; + + if (method == SortMethod.date.name) { + return SortMethod.date; + } else if (method == SortMethod.title.name) { + return SortMethod.title; + } else { + return SortMethod.date; + } + } + + static bool get ascendingFromPreferences { + return PreferencesManager().get(PreferenceKey.sortAscending) ?? + PreferenceKey.sortAscending.defaultValue! as bool; + } +} diff --git a/lib/utils/quick_actions_manager.dart b/lib/utils/quick_actions_manager.dart new file mode 100644 index 00000000..1bbe9135 --- /dev/null +++ b/lib/utils/quick_actions_manager.dart @@ -0,0 +1,27 @@ +import 'package:flutter/cupertino.dart'; +import 'package:flutter_riverpod/flutter_riverpod.dart'; +import 'package:localmaterialnotes/common/actions/add.dart'; +import 'package:localmaterialnotes/l10n/app_localizations.g.dart'; +import 'package:quick_actions/quick_actions.dart'; + +class QuickActionsManager { + late final QuickActions quickActions; + + void init(BuildContext context, WidgetRef ref) { + quickActions = const QuickActions(); + + quickActions.initialize((action) { + if (action == 'add_note') { + addNote(context, ref); + } + }); + + quickActions.setShortcutItems([ + ShortcutItem( + type: 'add_note', + localizedTitle: AppLocalizations.of(context)!.action_add_note, + icon: 'launcher_icon', + ), + ]); + } +} diff --git a/lib/utils/share_manager.dart b/lib/utils/share_manager.dart new file mode 100644 index 00000000..00a2caa1 --- /dev/null +++ b/lib/utils/share_manager.dart @@ -0,0 +1,38 @@ +import 'dart:async'; +import 'dart:convert'; + +import 'package:flutter_riverpod/flutter_riverpod.dart'; +import 'package:localmaterialnotes/common/actions/add.dart'; +import 'package:localmaterialnotes/utils/constants/constants.dart'; +import 'package:parchment_delta/parchment_delta.dart'; // ignore: depend_on_referenced_packages +import 'package:receive_sharing_intent/receive_sharing_intent.dart'; + +StreamSubscription listenSharedData(WidgetRef ref) { + return ReceiveSharingIntent.getMediaStream().listen((data) { + _processSharedData(ref, data); + }); +} + +void readSharedData(WidgetRef ref) { + ReceiveSharingIntent.getInitialMedia().then((data) { + _processSharedData(ref, data); + + ReceiveSharingIntent.reset(); + }); +} + +void _processSharedData(WidgetRef ref, List data) { + if (navigatorKey.currentContext == null || + data.isEmpty || + data.first.type != SharedMediaType.text || + data.first.path.isEmpty) { + return; + } + + final delta = Delta(); + for (final line in data.first.path.split('\n')) { + delta.insert('$line\n'); + } + + addNote(navigatorKey.currentContext!, ref, content: jsonEncode(delta)); +} diff --git a/lib/utils/snack_bar_manager.dart b/lib/utils/snack_bar_manager.dart new file mode 100644 index 00000000..a0eb92af --- /dev/null +++ b/lib/utils/snack_bar_manager.dart @@ -0,0 +1,18 @@ +import 'package:flutter/material.dart'; +import 'package:localmaterialnotes/utils/constants/constants.dart'; + +class SnackBarManager { + SnackBarManager.info(String message) : text = message; + + SnackBarManager.error(String error) : text = '${localizations.error_error}: $error'; + + final String text; + + void show() { + ScaffoldMessenger.of(navigatorKey.currentContext!).showSnackBar( + SnackBar( + content: Text(text), + ), + ); + } +} diff --git a/lib/utils/theme_manager.dart b/lib/utils/theme_manager.dart new file mode 100644 index 00000000..2d3f71ee --- /dev/null +++ b/lib/utils/theme_manager.dart @@ -0,0 +1,132 @@ +import 'package:dynamic_color/dynamic_color.dart'; +import 'package:flutter/material.dart'; +import 'package:localmaterialnotes/utils/constants/constants.dart'; +import 'package:localmaterialnotes/utils/preferences/preference_key.dart'; +import 'package:localmaterialnotes/utils/preferences/preferences_manager.dart'; + +const _customPrimaryColor = Color(0xFF2278e9); + +class ThemeManager { + static final ThemeManager _singleton = ThemeManager._internal(); + + factory ThemeManager() { + return _singleton; + } + + ThemeManager._internal(); + + late final bool isDynamicThemingAvailable; + + Future init() async { + isDynamicThemingAvailable = + await DynamicColorPlugin.getCorePalette() != null || await DynamicColorPlugin.getAccentColor() != null; + } + + ColorScheme get _customLightColorScheme { + return ColorScheme.fromSeed( + seedColor: _customPrimaryColor, + ); + } + + ColorScheme get _customDarkColorScheme { + return ColorScheme.fromSeed( + brightness: Brightness.dark, + seedColor: _customPrimaryColor, + background: useBlackTheming ? Colors.black : null, + surface: useBlackTheming ? Colors.black : null, + ); + } + + bool get useDynamicTheming { + return PreferencesManager().get(PreferenceKey.dynamicTheming) ?? + PreferenceKey.dynamicTheming.defaultValue! as bool; + } + + bool get useBlackTheming { + return PreferencesManager().get(PreferenceKey.blackTheming) ?? + PreferenceKey.blackTheming.defaultValue! as bool; + } + + ThemeMode get themeMode { + final themeModePreference = PreferencesManager().get(PreferenceKey.theme); + + if (themeModePreference != null) { + switch (themeModePreference) { + case 0: + return ThemeMode.system; + case 1: + return ThemeMode.light; + case 2: + return ThemeMode.dark; + } + } + + return ThemeMode.system; + } + + String get themeModeName { + final themeModePreference = PreferencesManager().get(PreferenceKey.theme); + + if (themeModePreference != null) { + switch (themeModePreference) { + case 0: + return localizations.settings_theme_system; + case 1: + return localizations.settings_theme_light; + case 2: + return localizations.settings_theme_dark; + } + } + + return localizations.settings_theme_system; + } + + void setThemeMode(ThemeMode? themeMode) { + if (themeMode == null) return; + + int value; + switch (themeMode) { + case ThemeMode.system: + value = 0; + case ThemeMode.light: + value = 1; + case ThemeMode.dark: + value = 2; + } + PreferencesManager().set(PreferenceKey.theme.name, value); + + themeModeNotifier.value = themeMode; + } + + ThemeData getLightDynamicTheme([ColorScheme? lightDynamicColorScheme]) { + return ThemeData( + useMaterial3: true, + colorScheme: lightDynamicColorScheme != null ? lightDynamicColorScheme.harmonized() : _customLightColorScheme, + ); + } + + ThemeData getDarkDynamicTheme([ColorScheme? darkDynamicColorScheme]) { + return ThemeData( + useMaterial3: true, + colorScheme: darkDynamicColorScheme?.copyWith( + background: useBlackTheming ? Colors.black : null, + surface: useBlackTheming ? Colors.black : null, + ) ?? + _customDarkColorScheme, + ); + } + + ThemeData get getLightCustomTheme { + return ThemeData( + useMaterial3: true, + colorScheme: _customLightColorScheme, + ); + } + + ThemeData get getDarkCustomTheme { + return ThemeData( + useMaterial3: true, + colorScheme: _customDarkColorScheme, + ); + } +} diff --git a/pubspec.lock b/pubspec.lock new file mode 100644 index 00000000..912d4c0c --- /dev/null +++ b/pubspec.lock @@ -0,0 +1,1223 @@ +# Generated by pub +# See https://dart.dev/tools/pub/glossary#lockfile +packages: + _fe_analyzer_shared: + dependency: transitive + description: + name: _fe_analyzer_shared + sha256: ae92f5d747aee634b87f89d9946000c2de774be1d6ac3e58268224348cd0101a + url: "https://pub.dev" + source: hosted + version: "61.0.0" + analyzer: + dependency: transitive + description: + name: analyzer + sha256: ea3d8652bda62982addfd92fdc2d0214e5f82e43325104990d4f4c4a2a313562 + url: "https://pub.dev" + source: hosted + version: "5.13.0" + analyzer_plugin: + dependency: transitive + description: + name: analyzer_plugin + sha256: c1d5f167683de03d5ab6c3b53fc9aeefc5d59476e7810ba7bbddff50c6f4392d + url: "https://pub.dev" + source: hosted + version: "0.11.2" + ansicolor: + dependency: transitive + description: + name: ansicolor + sha256: "8bf17a8ff6ea17499e40a2d2542c2f481cd7615760c6d34065cb22bfd22e6880" + url: "https://pub.dev" + source: hosted + version: "2.0.2" + archive: + dependency: transitive + description: + name: archive + sha256: "7b875fd4a20b165a3084bd2d210439b22ebc653f21cea4842729c0c30c82596b" + url: "https://pub.dev" + source: hosted + version: "3.4.9" + args: + dependency: transitive + description: + name: args + sha256: eef6c46b622e0494a36c5a12d10d77fb4e855501a91c1b9ef9339326e58f0596 + url: "https://pub.dev" + source: hosted + version: "2.4.2" + async: + dependency: transitive + description: + name: async + sha256: "947bfcf187f74dbc5e146c9eb9c0f10c9f8b30743e341481c1e2ed3ecc18c20c" + url: "https://pub.dev" + source: hosted + version: "2.11.0" + boolean_selector: + dependency: transitive + description: + name: boolean_selector + sha256: "6cfb5af12253eaf2b368f07bacc5a80d1301a071c73360d746b7f2e32d762c66" + url: "https://pub.dev" + source: hosted + version: "2.1.1" + build: + dependency: transitive + description: + name: build + sha256: "80184af8b6cb3e5c1c4ec6d8544d27711700bc3e6d2efad04238c7b5290889f0" + url: "https://pub.dev" + source: hosted + version: "2.4.1" + build_config: + dependency: transitive + description: + name: build_config + sha256: bf80fcfb46a29945b423bd9aad884590fb1dc69b330a4d4700cac476af1708d1 + url: "https://pub.dev" + source: hosted + version: "1.1.1" + build_daemon: + dependency: transitive + description: + name: build_daemon + sha256: "0343061a33da9c5810b2d6cee51945127d8f4c060b7fbdd9d54917f0a3feaaa1" + url: "https://pub.dev" + source: hosted + version: "4.0.1" + build_resolvers: + dependency: transitive + description: + name: build_resolvers + sha256: "339086358431fa15d7eca8b6a36e5d783728cf025e559b834f4609a1fcfb7b0a" + url: "https://pub.dev" + source: hosted + version: "2.4.2" + build_runner: + dependency: "direct dev" + description: + name: build_runner + sha256: "581bacf68f89ec8792f5e5a0b2c4decd1c948e97ce659dc783688c8a88fbec21" + url: "https://pub.dev" + source: hosted + version: "2.4.8" + build_runner_core: + dependency: transitive + description: + name: build_runner_core + sha256: c9e32d21dd6626b5c163d48b037ce906bbe428bc23ab77bcd77bb21e593b6185 + url: "https://pub.dev" + source: hosted + version: "7.2.11" + 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: c9aabae0718ec394e5bc3c7272e6bb0dc0b32201a08fe185ec1d8401d3e39309 + url: "https://pub.dev" + source: hosted + version: "8.8.1" + characters: + dependency: transitive + description: + name: characters + sha256: "04a925763edad70e8443c99234dc3328f442e811f1d8fd1a72f1c8ad0f69a605" + url: "https://pub.dev" + source: hosted + version: "1.3.0" + checked_yaml: + dependency: transitive + description: + name: checked_yaml + sha256: feb6bed21949061731a7a75fc5d2aa727cf160b91af9a3e464c5e3a32e28b5ff + url: "https://pub.dev" + source: hosted + version: "2.0.3" + ci: + dependency: transitive + description: + name: ci + sha256: "145d095ce05cddac4d797a158bc4cf3b6016d1fe63d8c3d2fbd7212590adca13" + url: "https://pub.dev" + source: hosted + version: "0.1.0" + cli_util: + dependency: transitive + description: + name: cli_util + sha256: c05b7406fdabc7a49a3929d4af76bcaccbbffcbcdcf185b082e1ae07da323d19 + url: "https://pub.dev" + source: hosted + version: "0.4.1" + clock: + dependency: transitive + description: + name: clock + sha256: cb6d7f03e1de671e34607e909a7213e31d7752be4fb66a86d29fe1eb14bfb5cf + url: "https://pub.dev" + source: hosted + version: "1.1.1" + code_builder: + dependency: transitive + description: + name: code_builder + sha256: feee43a5c05e7b3199bb375a86430b8ada1b04104f2923d0e03cc01ca87b6d84 + url: "https://pub.dev" + source: hosted + version: "4.9.0" + collection: + dependency: "direct main" + description: + name: collection + sha256: ee67cb0715911d28db6bf4af1026078bd6f0128b07a5f66fb2ed94ec6783c09a + url: "https://pub.dev" + source: hosted + version: "1.18.0" + convert: + dependency: transitive + description: + name: convert + sha256: "0f08b14755d163f6e2134cb58222dd25ea2a2ee8a195e53983d57c075324d592" + url: "https://pub.dev" + source: hosted + version: "3.1.1" + cross_file: + dependency: transitive + description: + name: cross_file + sha256: fedaadfa3a6996f75211d835aaeb8fede285dae94262485698afd832371b9a5e + url: "https://pub.dev" + source: hosted + version: "0.3.3+8" + crypto: + dependency: transitive + description: + name: crypto + sha256: ff625774173754681d66daaf4a448684fb04b78f902da9cb3d308c19cc5e8bab + url: "https://pub.dev" + source: hosted + version: "3.0.3" + csslib: + dependency: transitive + description: + name: csslib + sha256: "706b5707578e0c1b4b7550f64078f0a0f19dec3f50a178ffae7006b0a9ca58fb" + url: "https://pub.dev" + source: hosted + version: "1.0.0" + cupertino_icons: + dependency: "direct main" + description: + name: cupertino_icons + sha256: d57953e10f9f8327ce64a508a355f0b1ec902193f66288e8cb5070e7c47eeb2d + url: "https://pub.dev" + source: hosted + version: "1.0.6" + custom_lint: + dependency: "direct dev" + description: + name: custom_lint + sha256: "22bd87a362f433ba6aae127a7bac2838645270737f3721b180916d7c5946cb5d" + url: "https://pub.dev" + source: hosted + version: "0.5.11" + custom_lint_builder: + dependency: transitive + description: + name: custom_lint_builder + sha256: "0d48e002438950f9582e574ef806b2bea5719d8d14c0f9f754fbad729bcf3b19" + url: "https://pub.dev" + source: hosted + version: "0.5.14" + custom_lint_core: + dependency: transitive + description: + name: custom_lint_core + sha256: "2952837953022de610dacb464f045594854ced6506ac7f76af28d4a6490e189b" + url: "https://pub.dev" + source: hosted + version: "0.5.14" + dart_style: + dependency: transitive + description: + name: dart_style + sha256: "1efa911ca7086affd35f463ca2fc1799584fb6aa89883cf0af8e3664d6a02d55" + url: "https://pub.dev" + source: hosted + version: "2.3.2" + dartx: + dependency: transitive + description: + name: dartx + sha256: "8b25435617027257d43e6508b5fe061012880ddfdaa75a71d607c3de2a13d244" + url: "https://pub.dev" + source: hosted + version: "1.2.0" + diff_match_patch: + dependency: transitive + description: + name: diff_match_patch + sha256: "2efc9e6e8f449d0abe15be240e2c2a3bcd977c8d126cfd70598aee60af35c0a4" + url: "https://pub.dev" + source: hosted + version: "0.4.1" + dynamic_color: + dependency: "direct main" + description: + name: dynamic_color + sha256: a866f1f8947bfdaf674d7928e769eac7230388a2e7a2542824fad4bb5b87be3b + url: "https://pub.dev" + source: hosted + version: "1.6.9" + equatable: + dependency: "direct main" + description: + name: equatable + sha256: c2b87cb7756efdf69892005af546c56c0b5037f54d2a88269b4f347a505e3ca2 + url: "https://pub.dev" + source: hosted + version: "2.0.5" + fake_async: + dependency: transitive + description: + name: fake_async + sha256: "511392330127add0b769b75a987850d136345d9227c6b94c96a04cf4a391bf78" + url: "https://pub.dev" + source: hosted + version: "1.3.1" + ffi: + dependency: transitive + description: + name: ffi + sha256: "7bf0adc28a23d395f19f3f1eb21dd7cfd1dd9f8e1c50051c069122e6853bc878" + url: "https://pub.dev" + source: hosted + version: "2.1.0" + file: + dependency: transitive + description: + name: file + sha256: "5fc22d7c25582e38ad9a8515372cd9a93834027aacf1801cf01164dac0ffa08c" + url: "https://pub.dev" + source: hosted + version: "7.0.0" + fixnum: + dependency: transitive + description: + name: fixnum + sha256: "25517a4deb0c03aa0f32fd12db525856438902d9c16536311e76cdc57b31d7d1" + url: "https://pub.dev" + source: hosted + version: "1.1.0" + fleather: + dependency: "direct main" + description: + name: fleather + sha256: "4e5260e136c4d371bffd870148a838671599f08b564fd831112a9e664bd909e9" + url: "https://pub.dev" + source: hosted + version: "1.14.1" + flutter: + dependency: "direct main" + description: flutter + source: sdk + version: "0.0.0" + flutter_hooks: + dependency: "direct main" + description: + name: flutter_hooks + sha256: "09f64db63fee3b2ab8b9038a1346be7d8986977fae3fec601275bf32455ccfc0" + url: "https://pub.dev" + source: hosted + version: "0.20.4" + flutter_launcher_icons: + dependency: "direct dev" + description: + name: flutter_launcher_icons + sha256: "526faf84284b86a4cb36d20a5e45147747b7563d921373d4ee0559c54fcdbcea" + url: "https://pub.dev" + source: hosted + version: "0.13.1" + flutter_localizations: + dependency: "direct main" + description: flutter + source: sdk + version: "0.0.0" + flutter_native_splash: + dependency: "direct main" + description: + name: flutter_native_splash + sha256: "558f10070f03ee71f850a78f7136ab239a67636a294a44a06b6b7345178edb1e" + url: "https://pub.dev" + source: hosted + version: "2.3.10" + flutter_riverpod: + dependency: "direct main" + description: + name: flutter_riverpod + sha256: "4bce556b7ecbfea26109638d5237684538d4abc509d253e6c5c4c5733b360098" + url: "https://pub.dev" + source: hosted + version: "2.4.10" + flutter_settings_ui: + dependency: "direct main" + description: + name: flutter_settings_ui + sha256: aa371acae2f99b3348bf4e1a155f715dc146ac4cd410834f5bc44c3c12955a10 + url: "https://pub.dev" + source: hosted + version: "3.0.0" + flutter_test: + dependency: "direct dev" + description: flutter + source: sdk + version: "0.0.0" + flutter_web_plugins: + dependency: transitive + description: flutter + source: sdk + version: "0.0.0" + freezed_annotation: + dependency: transitive + description: + name: freezed_annotation + sha256: c3fd9336eb55a38cc1bbd79ab17573113a8deccd0ecbbf926cca3c62803b5c2d + url: "https://pub.dev" + source: hosted + version: "2.4.1" + frontend_server_client: + dependency: transitive + description: + name: frontend_server_client + sha256: "408e3ca148b31c20282ad6f37ebfa6f4bdc8fede5b74bc2f08d9d92b55db3612" + url: "https://pub.dev" + source: hosted + version: "3.2.0" + glob: + dependency: transitive + description: + name: glob + sha256: "0e7014b3b7d4dac1ca4d6114f82bf1782ee86745b9b42a92c9289c23d8a0ab63" + url: "https://pub.dev" + source: hosted + version: "2.1.2" + go_router: + dependency: "direct main" + description: + name: go_router + sha256: "07ee2436909f749d606f53521dc1725dd738dc5196e5ff815bc254253c594075" + url: "https://pub.dev" + source: hosted + version: "13.1.0" + graphs: + dependency: transitive + description: + name: graphs + sha256: aedc5a15e78fc65a6e23bcd927f24c64dd995062bcd1ca6eda65a3cff92a4d19 + url: "https://pub.dev" + source: hosted + version: "2.3.1" + hotreloader: + dependency: transitive + description: + name: hotreloader + sha256: "94ee21a60ea2836500799f3af035dc3212b1562027f1e0031c14e087f0231449" + url: "https://pub.dev" + source: hosted + version: "4.1.0" + html: + dependency: transitive + description: + name: html + sha256: "3a7812d5bcd2894edf53dfaf8cd640876cf6cef50a8f238745c8b8120ea74d3a" + url: "https://pub.dev" + source: hosted + version: "0.15.4" + http: + dependency: transitive + description: + name: http + sha256: d4872660c46d929f6b8a9ef4e7a7eff7e49bbf0c4ec3f385ee32df5119175139 + url: "https://pub.dev" + source: hosted + version: "1.1.2" + http_multi_server: + dependency: transitive + description: + name: http_multi_server + sha256: "97486f20f9c2f7be8f514851703d0119c3596d14ea63227af6f7a481ef2b2f8b" + url: "https://pub.dev" + source: hosted + version: "3.2.1" + http_parser: + dependency: transitive + description: + name: http_parser + sha256: "2aa08ce0341cc9b354a498388e30986515406668dbcc4f7c950c3e715496693b" + url: "https://pub.dev" + source: hosted + version: "4.0.2" + image: + dependency: transitive + description: + name: image + sha256: "028f61960d56f26414eb616b48b04eb37d700cbe477b7fb09bf1d7ce57fd9271" + url: "https://pub.dev" + source: hosted + version: "4.1.3" + intl: + dependency: "direct main" + description: + name: intl + sha256: "3bc132a9dbce73a7e4a21a17d06e1878839ffbf975568bc875c60537824b0c4d" + url: "https://pub.dev" + source: hosted + version: "0.18.1" + io: + dependency: transitive + description: + name: io + sha256: "2ec25704aba361659e10e3e5f5d672068d332fc8ac516421d483a11e5cbd061e" + url: "https://pub.dev" + source: hosted + version: "1.0.4" + isar: + dependency: "direct main" + description: + name: isar + sha256: "99165dadb2cf2329d3140198363a7e7bff9bbd441871898a87e26914d25cf1ea" + url: "https://pub.dev" + source: hosted + version: "3.1.0+1" + isar_flutter_libs: + dependency: "direct main" + description: + name: isar_flutter_libs + sha256: bc6768cc4b9c61aabff77152e7f33b4b17d2fc93134f7af1c3dd51500fe8d5e8 + url: "https://pub.dev" + source: hosted + version: "3.1.0+1" + isar_generator: + dependency: "direct dev" + description: + name: isar_generator + sha256: "76c121e1295a30423604f2f819bc255bc79f852f3bc8743a24017df6068ad133" + url: "https://pub.dev" + source: hosted + version: "3.1.0+1" + js: + dependency: transitive + description: + name: js + sha256: f2c445dce49627136094980615a031419f7f3eb393237e4ecd97ac15dea343f3 + url: "https://pub.dev" + source: hosted + version: "0.6.7" + json_annotation: + dependency: "direct main" + description: + name: json_annotation + sha256: b10a7b2ff83d83c777edba3c6a0f97045ddadd56c944e1a23a3fdf43a1bf4467 + url: "https://pub.dev" + source: hosted + version: "4.8.1" + json_serializable: + dependency: "direct dev" + description: + name: json_serializable + sha256: aa1f5a8912615733e0fdc7a02af03308933c93235bdc8d50d0b0c8a8ccb0b969 + url: "https://pub.dev" + source: hosted + version: "6.7.1" + lint: + dependency: "direct dev" + description: + name: lint + sha256: d758a5211fce7fd3f5e316f804daefecdc34c7e53559716125e6da7388ae8565 + url: "https://pub.dev" + source: hosted + version: "2.3.0" + locale_names: + dependency: "direct main" + description: + name: locale_names + sha256: "7a89ca54072f4f13d0f5df5a9ba69337554bf2fd057d1dd2a238898f3f159374" + url: "https://pub.dev" + source: hosted + version: "1.1.1" + logging: + dependency: transitive + description: + name: logging + sha256: "623a88c9594aa774443aa3eb2d41807a48486b5613e67599fb4c41c0ad47c340" + url: "https://pub.dev" + source: hosted + version: "1.2.0" + matcher: + dependency: transitive + description: + name: matcher + sha256: "1803e76e6653768d64ed8ff2e1e67bea3ad4b923eb5c56a295c3e634bad5960e" + url: "https://pub.dev" + source: hosted + version: "0.12.16" + material_color_utilities: + dependency: transitive + description: + name: material_color_utilities + sha256: "9528f2f296073ff54cb9fee677df673ace1218163c3bc7628093e7eed5203d41" + url: "https://pub.dev" + source: hosted + version: "0.5.0" + meta: + dependency: transitive + description: + name: meta + sha256: a6e590c838b18133bb482a2745ad77c5bb7715fb0451209e1a7567d416678b8e + url: "https://pub.dev" + source: hosted + version: "1.10.0" + mime: + dependency: transitive + description: + name: mime + sha256: e4ff8e8564c03f255408decd16e7899da1733852a9110a58fe6d1b817684a63e + url: "https://pub.dev" + source: hosted + version: "1.0.4" + package_config: + dependency: transitive + description: + name: package_config + sha256: "1c5b77ccc91e4823a5af61ee74e6b972db1ef98c2ff5a18d3161c982a55448bd" + url: "https://pub.dev" + source: hosted + version: "2.1.0" + package_info_plus: + dependency: "direct main" + description: + name: package_info_plus + sha256: "88bc797f44a94814f2213db1c9bd5badebafdfb8290ca9f78d4b9ee2a3db4d79" + url: "https://pub.dev" + source: hosted + version: "5.0.1" + package_info_plus_platform_interface: + dependency: transitive + description: + name: package_info_plus_platform_interface + sha256: "9bc8ba46813a4cc42c66ab781470711781940780fd8beddd0c3da62506d3a6c6" + url: "https://pub.dev" + source: hosted + version: "2.0.1" + parchment: + dependency: transitive + description: + name: parchment + sha256: "67c8ea89d62abecf75a802e1cae227dfdeead6a458e53c44ee0c39c38a6327e2" + url: "https://pub.dev" + source: hosted + version: "1.14.0" + parchment_delta: + dependency: transitive + description: + name: parchment_delta + sha256: "8b360d0138eb591c7fe193670e2d05466e482792af9c5b4d3f568c5c61530f08" + url: "https://pub.dev" + source: hosted + version: "1.0.0" + path: + dependency: "direct main" + description: + name: path + sha256: "8829d8a55c13fc0e37127c29fedf290c102f4e40ae94ada574091fe0ff96c917" + url: "https://pub.dev" + source: hosted + version: "1.8.3" + path_provider: + dependency: "direct main" + description: + name: path_provider + sha256: b27217933eeeba8ff24845c34003b003b2b22151de3c908d0e679e8fe1aa078b + url: "https://pub.dev" + source: hosted + version: "2.1.2" + path_provider_android: + dependency: transitive + description: + name: path_provider_android + sha256: "477184d672607c0a3bf68fbbf601805f92ef79c82b64b4d6eb318cbca4c48668" + url: "https://pub.dev" + source: hosted + version: "2.2.2" + path_provider_foundation: + dependency: transitive + description: + name: path_provider_foundation + sha256: "19314d595120f82aca0ba62787d58dde2cc6b5df7d2f0daf72489e38d1b57f2d" + url: "https://pub.dev" + source: hosted + version: "2.3.1" + path_provider_linux: + dependency: transitive + description: + name: path_provider_linux + sha256: f7a1fe3a634fe7734c8d3f2766ad746ae2a2884abe22e241a8b301bf5cac3279 + url: "https://pub.dev" + source: hosted + version: "2.2.1" + path_provider_platform_interface: + dependency: transitive + description: + name: path_provider_platform_interface + sha256: "94b1e0dd80970c1ce43d5d4e050a9918fce4f4a775e6142424c30a29a363265c" + url: "https://pub.dev" + source: hosted + version: "2.1.1" + path_provider_windows: + dependency: transitive + description: + name: path_provider_windows + sha256: "8bc9f22eee8690981c22aa7fc602f5c85b497a6fb2ceb35ee5a5e5ed85ad8170" + url: "https://pub.dev" + source: hosted + version: "2.2.1" + petitparser: + dependency: transitive + description: + name: petitparser + sha256: c15605cd28af66339f8eb6fbe0e541bfe2d1b72d5825efc6598f3e0a31b9ad27 + url: "https://pub.dev" + source: hosted + version: "6.0.2" + platform: + dependency: transitive + description: + name: platform + sha256: "0a279f0707af40c890e80b1e9df8bb761694c074ba7e1d4ab1bc4b728e200b59" + url: "https://pub.dev" + source: hosted + version: "3.1.3" + plugin_platform_interface: + dependency: transitive + description: + name: plugin_platform_interface + sha256: f4f88d4a900933e7267e2b353594774fc0d07fb072b47eedcd5b54e1ea3269f8 + url: "https://pub.dev" + source: hosted + version: "2.1.7" + pointycastle: + dependency: transitive + description: + name: pointycastle + sha256: "7c1e5f0d23c9016c5bbd8b1473d0d3fb3fc851b876046039509e18e0c7485f2c" + url: "https://pub.dev" + source: hosted + version: "3.7.3" + pool: + dependency: transitive + description: + name: pool + sha256: "20fe868b6314b322ea036ba325e6fc0711a22948856475e2c2b6306e8ab39c2a" + url: "https://pub.dev" + source: hosted + version: "1.5.1" + pub_semver: + dependency: transitive + description: + name: pub_semver + sha256: "40d3ab1bbd474c4c2328c91e3a7df8c6dd629b79ece4c4bd04bee496a224fb0c" + url: "https://pub.dev" + source: hosted + version: "2.1.4" + pubspec_parse: + dependency: transitive + description: + name: pubspec_parse + sha256: c63b2876e58e194e4b0828fcb080ad0e06d051cb607a6be51a9e084f47cb9367 + url: "https://pub.dev" + source: hosted + version: "1.2.3" + quick_actions: + dependency: "direct main" + description: + name: quick_actions + sha256: b17da113df7a7005977f64adfa58ccc49c829d3ccc6e8e770079a8c7fbf2da9e + url: "https://pub.dev" + source: hosted + version: "1.0.7" + quick_actions_android: + dependency: transitive + description: + name: quick_actions_android + sha256: adb42f20a46b22fee4caef421c00ff9eb209f9d441010bc5d6e9afa824288cf6 + url: "https://pub.dev" + source: hosted + version: "1.0.10" + quick_actions_ios: + dependency: transitive + description: + name: quick_actions_ios + sha256: dd355101d0e9fef6176fa2ae2bf738bcafa8df09a1e17057fcb56475719793de + url: "https://pub.dev" + source: hosted + version: "1.0.10" + quick_actions_platform_interface: + dependency: transitive + description: + name: quick_actions_platform_interface + sha256: "81a1e40c519bb3cacfec38b3008b13cef665a75bd270da94f40091b57f0f9236" + url: "https://pub.dev" + source: hosted + version: "1.0.6" + quiver: + dependency: transitive + description: + name: quiver + sha256: b1c1ac5ce6688d77f65f3375a9abb9319b3cb32486bdc7a1e0fdf004d7ba4e47 + url: "https://pub.dev" + source: hosted + version: "3.2.1" + receive_sharing_intent: + dependency: "direct main" + description: + name: receive_sharing_intent + sha256: "8fdf5927934041264becf65199ef8057b8b176e879d95ffa0420cd2a6219c0fd" + url: "https://pub.dev" + source: hosted + version: "1.6.7" + riverpod: + dependency: transitive + description: + name: riverpod + sha256: "548e2192eb7aeb826eb89387f814edb76594f3363e2c0bb99dd733d795ba3589" + url: "https://pub.dev" + source: hosted + version: "2.5.0" + riverpod_analyzer_utils: + dependency: transitive + description: + name: riverpod_analyzer_utils + sha256: d72d7096964baf288b55619fe48100001fc4564ab7923ed0a7f5c7650e03c0d6 + url: "https://pub.dev" + source: hosted + version: "0.3.4" + riverpod_annotation: + dependency: "direct main" + description: + name: riverpod_annotation + sha256: "77e5d51afa4fa3e67903fb8746f33d368728d7051a0b6c292bcee60aeba46d95" + url: "https://pub.dev" + source: hosted + version: "2.3.4" + riverpod_generator: + dependency: "direct dev" + description: + name: riverpod_generator + sha256: "5b36ad2f2b562cffb37212e8d59390b25499bf045b732276e30a207b16a25f61" + url: "https://pub.dev" + source: hosted + version: "2.3.3" + riverpod_lint: + dependency: "direct dev" + description: + name: riverpod_lint + sha256: "70198738c3047ae4f6517ef1a2011a8514a980a52576c7f629a3a08810319a02" + url: "https://pub.dev" + source: hosted + version: "2.1.1" + rxdart: + dependency: transitive + description: + name: rxdart + sha256: "0c7c0cedd93788d996e33041ffecda924cc54389199cde4e6a34b440f50044cb" + url: "https://pub.dev" + source: hosted + version: "0.27.7" + share_plus: + dependency: "direct main" + description: + name: share_plus + sha256: "3ef39599b00059db0990ca2e30fca0a29d8b37aae924d60063f8e0184cf20900" + url: "https://pub.dev" + source: hosted + version: "7.2.2" + share_plus_platform_interface: + dependency: transitive + description: + name: share_plus_platform_interface + sha256: df08bc3a07d01f5ea47b45d03ffcba1fa9cd5370fb44b3f38c70e42cced0f956 + url: "https://pub.dev" + source: hosted + version: "3.3.1" + shared_preferences: + dependency: "direct main" + description: + name: shared_preferences + sha256: "81429e4481e1ccfb51ede496e916348668fd0921627779233bd24cc3ff6abd02" + url: "https://pub.dev" + source: hosted + version: "2.2.2" + shared_preferences_android: + dependency: transitive + description: + name: shared_preferences_android + sha256: "8568a389334b6e83415b6aae55378e158fbc2314e074983362d20c562780fb06" + url: "https://pub.dev" + source: hosted + version: "2.2.1" + shared_preferences_foundation: + dependency: transitive + description: + name: shared_preferences_foundation + sha256: "7bf53a9f2d007329ee6f3df7268fd498f8373602f943c975598bbb34649b62a7" + url: "https://pub.dev" + source: hosted + version: "2.3.4" + shared_preferences_linux: + dependency: transitive + description: + name: shared_preferences_linux + sha256: "9f2cbcf46d4270ea8be39fa156d86379077c8a5228d9dfdb1164ae0bb93f1faa" + url: "https://pub.dev" + source: hosted + version: "2.3.2" + shared_preferences_platform_interface: + dependency: transitive + description: + name: shared_preferences_platform_interface + sha256: d4ec5fc9ebb2f2e056c617112aa75dcf92fc2e4faaf2ae999caa297473f75d8a + url: "https://pub.dev" + source: hosted + version: "2.3.1" + shared_preferences_web: + dependency: transitive + description: + name: shared_preferences_web + sha256: "7b15ffb9387ea3e237bb7a66b8a23d2147663d391cafc5c8f37b2e7b4bde5d21" + url: "https://pub.dev" + source: hosted + version: "2.2.2" + shared_preferences_windows: + dependency: transitive + description: + name: shared_preferences_windows + sha256: "841ad54f3c8381c480d0c9b508b89a34036f512482c407e6df7a9c4aa2ef8f59" + url: "https://pub.dev" + source: hosted + version: "2.3.2" + shelf: + dependency: transitive + description: + name: shelf + sha256: ad29c505aee705f41a4d8963641f91ac4cee3c8fad5947e033390a7bd8180fa4 + url: "https://pub.dev" + source: hosted + version: "1.4.1" + shelf_web_socket: + dependency: transitive + description: + name: shelf_web_socket + sha256: "9ca081be41c60190ebcb4766b2486a7d50261db7bd0f5d9615f2d653637a84c1" + url: "https://pub.dev" + source: hosted + version: "1.0.4" + simple_icons: + dependency: "direct main" + description: + name: simple_icons + sha256: "30067d70a9d72923fbc80e142e17fa46085dfa970e66bc4bede3be4819d05901" + url: "https://pub.dev" + source: hosted + version: "10.1.3" + sky_engine: + dependency: transitive + description: flutter + source: sdk + version: "0.0.99" + source_gen: + dependency: transitive + description: + name: source_gen + sha256: "14658ba5f669685cd3d63701d01b31ea748310f7ab854e471962670abcf57832" + url: "https://pub.dev" + source: hosted + version: "1.5.0" + source_helper: + dependency: transitive + description: + name: source_helper + sha256: "6adebc0006c37dd63fe05bca0a929b99f06402fc95aa35bf36d67f5c06de01fd" + url: "https://pub.dev" + source: hosted + version: "1.3.4" + source_span: + dependency: transitive + description: + name: source_span + sha256: "53e943d4206a5e30df338fd4c6e7a077e02254531b138a15aec3bd143c1a8b3c" + url: "https://pub.dev" + source: hosted + version: "1.10.0" + sprintf: + dependency: transitive + description: + name: sprintf + sha256: "1fc9ffe69d4df602376b52949af107d8f5703b77cda567c4d7d86a0693120f23" + url: "https://pub.dev" + source: hosted + version: "7.0.0" + stack_trace: + dependency: transitive + description: + name: stack_trace + sha256: "73713990125a6d93122541237550ee3352a2d84baad52d375a4cad2eb9b7ce0b" + url: "https://pub.dev" + source: hosted + version: "1.11.1" + state_notifier: + dependency: transitive + description: + name: state_notifier + sha256: b8677376aa54f2d7c58280d5a007f9e8774f1968d1fb1c096adcb4792fba29bb + url: "https://pub.dev" + source: hosted + version: "1.0.0" + stream_channel: + dependency: transitive + description: + name: stream_channel + sha256: ba2aa5d8cc609d96bbb2899c28934f9e1af5cddbd60a827822ea467161eb54e7 + url: "https://pub.dev" + source: hosted + version: "2.1.2" + stream_transform: + dependency: transitive + description: + name: stream_transform + sha256: "14a00e794c7c11aa145a170587321aedce29769c08d7f58b1d141da75e3b1c6f" + url: "https://pub.dev" + source: hosted + version: "2.1.0" + string_scanner: + dependency: transitive + description: + name: string_scanner + sha256: "556692adab6cfa87322a115640c11f13cb77b3f076ddcc5d6ae3c20242bedcde" + url: "https://pub.dev" + source: hosted + version: "1.2.0" + term_glyph: + dependency: transitive + description: + name: term_glyph + sha256: a29248a84fbb7c79282b40b8c72a1209db169a2e0542bce341da992fe1bc7e84 + url: "https://pub.dev" + source: hosted + version: "1.2.1" + test_api: + dependency: transitive + description: + name: test_api + sha256: "5c2f730018264d276c20e4f1503fd1308dfbbae39ec8ee63c5236311ac06954b" + url: "https://pub.dev" + source: hosted + version: "0.6.1" + time: + dependency: transitive + description: + name: time + sha256: ad8e018a6c9db36cb917a031853a1aae49467a93e0d464683e029537d848c221 + url: "https://pub.dev" + source: hosted + version: "2.1.4" + timing: + dependency: transitive + description: + name: timing + sha256: "70a3b636575d4163c477e6de42f247a23b315ae20e86442bebe32d3cabf61c32" + url: "https://pub.dev" + source: hosted + version: "1.0.1" + typed_data: + dependency: transitive + description: + name: typed_data + sha256: facc8d6582f16042dd49f2463ff1bd6e2c9ef9f3d5da3d9b087e244a7b564b3c + url: "https://pub.dev" + source: hosted + version: "1.3.2" + universal_io: + dependency: transitive + description: + name: universal_io + sha256: "1722b2dcc462b4b2f3ee7d188dad008b6eb4c40bbd03a3de451d82c78bba9aad" + url: "https://pub.dev" + source: hosted + version: "2.2.2" + url_launcher: + dependency: "direct main" + description: + name: url_launcher + sha256: c512655380d241a337521703af62d2c122bf7b77a46ff7dd750092aa9433499c + url: "https://pub.dev" + source: hosted + version: "6.2.4" + url_launcher_android: + dependency: transitive + description: + name: url_launcher_android + sha256: "31222ffb0063171b526d3e569079cf1f8b294075ba323443fdc690842bfd4def" + url: "https://pub.dev" + source: hosted + version: "6.2.0" + url_launcher_ios: + dependency: transitive + description: + name: url_launcher_ios + sha256: bba3373219b7abb6b5e0d071b0fe66dfbe005d07517a68e38d4fc3638f35c6d3 + url: "https://pub.dev" + source: hosted + version: "6.2.1" + url_launcher_linux: + dependency: transitive + description: + name: url_launcher_linux + sha256: ab360eb661f8879369acac07b6bb3ff09d9471155357da8443fd5d3cf7363811 + url: "https://pub.dev" + source: hosted + version: "3.1.1" + url_launcher_macos: + dependency: transitive + description: + name: url_launcher_macos + sha256: b7244901ea3cf489c5335bdacda07264a6e960b1c1b1a9f91e4bc371d9e68234 + url: "https://pub.dev" + source: hosted + version: "3.1.0" + url_launcher_platform_interface: + dependency: transitive + description: + name: url_launcher_platform_interface + sha256: "980e8d9af422f477be6948bdfb68df8433be71f5743a188968b0c1b887807e50" + url: "https://pub.dev" + source: hosted + version: "2.2.0" + url_launcher_web: + dependency: transitive + description: + name: url_launcher_web + sha256: "7286aec002c8feecc338cc33269e96b73955ab227456e9fb2a91f7fab8a358e9" + url: "https://pub.dev" + source: hosted + version: "2.2.2" + url_launcher_windows: + dependency: transitive + description: + name: url_launcher_windows + sha256: ecf9725510600aa2bb6d7ddabe16357691b6d2805f66216a97d1b881e21beff7 + url: "https://pub.dev" + source: hosted + version: "3.1.1" + uuid: + dependency: transitive + description: + name: uuid + sha256: cd210a09f7c18cbe5a02511718e0334de6559871052c90a90c0cca46a4aa81c8 + url: "https://pub.dev" + source: hosted + version: "4.3.3" + vector_math: + dependency: transitive + description: + name: vector_math + sha256: "80b3257d1492ce4d091729e3a67a60407d227c27241d6927be0130c98e741803" + url: "https://pub.dev" + source: hosted + version: "2.1.4" + vm_service: + dependency: transitive + description: + name: vm_service + sha256: b3d56ff4341b8f182b96aceb2fa20e3dcb336b9f867bc0eafc0de10f1048e957 + url: "https://pub.dev" + source: hosted + version: "13.0.0" + watcher: + dependency: transitive + description: + name: watcher + sha256: "3d2ad6751b3c16cf07c7fca317a1413b3f26530319181b37e3b9039b84fc01d8" + url: "https://pub.dev" + source: hosted + version: "1.1.0" + web: + dependency: transitive + description: + name: web + sha256: afe077240a270dcfd2aafe77602b4113645af95d0ad31128cc02bce5ac5d5152 + url: "https://pub.dev" + source: hosted + version: "0.3.0" + web_socket_channel: + dependency: transitive + description: + name: web_socket_channel + sha256: d88238e5eac9a42bb43ca4e721edba3c08c6354d4a53063afaa568516217621b + url: "https://pub.dev" + source: hosted + version: "2.4.0" + win32: + dependency: transitive + description: + name: win32 + sha256: b0f37db61ba2f2e9b7a78a1caece0052564d1bc70668156cf3a29d676fe4e574 + url: "https://pub.dev" + source: hosted + version: "5.1.1" + xdg_directories: + dependency: transitive + description: + name: xdg_directories + sha256: "589ada45ba9e39405c198fe34eb0f607cddb2108527e658136120892beac46d2" + url: "https://pub.dev" + source: hosted + version: "1.0.3" + xml: + dependency: transitive + description: + name: xml + sha256: b015a8ad1c488f66851d762d3090a21c600e479dc75e68328c52774040cf9226 + url: "https://pub.dev" + source: hosted + version: "6.5.0" + xxh3: + dependency: transitive + description: + name: xxh3 + sha256: a92b30944a9aeb4e3d4f3c3d4ddb3c7816ca73475cd603682c4f8149690f56d7 + url: "https://pub.dev" + source: hosted + version: "1.0.1" + yaml: + dependency: transitive + description: + name: yaml + sha256: "75769501ea3489fca56601ff33454fe45507ea3bfb014161abc3b43ae25989d5" + url: "https://pub.dev" + source: hosted + version: "3.1.2" +sdks: + dart: ">=3.2.0 <4.0.0" + flutter: ">=3.16.0" diff --git a/pubspec.yaml b/pubspec.yaml new file mode 100644 index 00000000..767069a7 --- /dev/null +++ b/pubspec.yaml @@ -0,0 +1,58 @@ +name: localmaterialnotes +description: Simple, local, material design notes +repository: https://github.com/maelchiotti/LocalMaterialNotes +documentation: https://github.com/maelchiotti/LocalMaterialNotes/wiki + +version: 0.1.0 +publish_to: none + +environment: + sdk: ">=3.0.0 <4.0.0" + +dependencies: + collection: ^1.18.0 + cupertino_icons: ^1.0.6 + dynamic_color: ^1.6.9 + equatable: ^2.0.5 + fleather: ^1.14.1 + flutter: + sdk: flutter + flutter_hooks: ^0.20.4 + flutter_localizations: + sdk: flutter + flutter_native_splash: ^2.3.10 + flutter_riverpod: ^2.4.10 + flutter_settings_ui: ^3.0.0 + go_router: ^13.1.0 + intl: ^0.18.1 + isar: ^3.1.0+1 + isar_flutter_libs: ^3.1.0+1 + json_annotation: ^4.8.1 + locale_names: ^1.1.1 + package_info_plus: ^5.0.1 + path: ^1.8.3 + path_provider: ^2.1.2 + quick_actions: ^1.0.7 + receive_sharing_intent: ^1.6.7 + riverpod_annotation: ^2.3.4 + share_plus: ^7.2.2 + shared_preferences: ^2.2.2 + simple_icons: ^10.1.3 + url_launcher: ^6.2.4 + +dev_dependencies: + build_runner: ^2.4.8 + custom_lint: ^0.5.11 + flutter_launcher_icons: ^0.13.1 + flutter_test: + sdk: flutter + isar_generator: ^3.1.0+1 + json_serializable: ^6.7.1 + lint: ^2.3.0 + riverpod_generator: ^2.3.3 + riverpod_lint: ^2.1.1 + +flutter: + uses-material-design: true + assets: + - assets/logos/ diff --git a/test/starter_test.dart b/test/starter_test.dart new file mode 100644 index 00000000..c5b29b7c --- /dev/null +++ b/test/starter_test.dart @@ -0,0 +1,7 @@ +import 'package:flutter_test/flutter_test.dart'; + +void main() { + test('Starter test', () { + expect(true, true); + }); +}