Implemented structure for push Notifications

This commit is contained in:
Elias Müller 2023-08-19 17:04:45 +02:00
parent 9c5b04cfc6
commit 1a172d3d86
28 changed files with 567 additions and 46 deletions

View File

@ -9,6 +9,13 @@
</list> </list>
</value> </value>
</entry> </entry>
<entry key="_flutterfire_internals">
<value>
<list>
<option value="$USER_HOME$/.pub-cache/hosted/pub.dev/_flutterfire_internals-1.3.4/lib" />
</list>
</value>
</entry>
<entry key="analyzer"> <entry key="analyzer">
<value> <value>
<list> <list>
@ -215,7 +222,7 @@
<entry key="collection"> <entry key="collection">
<value> <value>
<list> <list>
<option value="$USER_HOME$/.pub-cache/hosted/pub.dev/collection-1.17.1/lib" /> <option value="$USER_HOME$/.pub-cache/hosted/pub.dev/collection-1.17.2/lib" />
</list> </list>
</value> </value>
</entry> </entry>
@ -282,6 +289,13 @@
</list> </list>
</value> </value>
</entry> </entry>
<entry key="dbus">
<value>
<list>
<option value="$USER_HOME$/.pub-cache/hosted/pub.dev/dbus-0.7.8/lib" />
</list>
</value>
</entry>
<entry key="device_info_plus"> <entry key="device_info_plus">
<value> <value>
<list> <list>
@ -380,6 +394,62 @@
</list> </list>
</value> </value>
</entry> </entry>
<entry key="firebase_core">
<value>
<list>
<option value="$USER_HOME$/.pub-cache/hosted/pub.dev/firebase_core-2.15.0/lib" />
</list>
</value>
</entry>
<entry key="firebase_core_platform_interface">
<value>
<list>
<option value="$USER_HOME$/.pub-cache/hosted/pub.dev/firebase_core_platform_interface-4.8.0/lib" />
</list>
</value>
</entry>
<entry key="firebase_core_web">
<value>
<list>
<option value="$USER_HOME$/.pub-cache/hosted/pub.dev/firebase_core_web-2.6.0/lib" />
</list>
</value>
</entry>
<entry key="firebase_in_app_messaging">
<value>
<list>
<option value="$USER_HOME$/.pub-cache/hosted/pub.dev/firebase_in_app_messaging-0.7.3+4/lib" />
</list>
</value>
</entry>
<entry key="firebase_in_app_messaging_platform_interface">
<value>
<list>
<option value="$USER_HOME$/.pub-cache/hosted/pub.dev/firebase_in_app_messaging_platform_interface-0.2.4+4/lib" />
</list>
</value>
</entry>
<entry key="firebase_messaging">
<value>
<list>
<option value="$USER_HOME$/.pub-cache/hosted/pub.dev/firebase_messaging-14.6.5/lib" />
</list>
</value>
</entry>
<entry key="firebase_messaging_platform_interface">
<value>
<list>
<option value="$USER_HOME$/.pub-cache/hosted/pub.dev/firebase_messaging_platform_interface-4.5.4/lib" />
</list>
</value>
</entry>
<entry key="firebase_messaging_web">
<value>
<list>
<option value="$USER_HOME$/.pub-cache/hosted/pub.dev/firebase_messaging_web-3.5.4/lib" />
</list>
</value>
</entry>
<entry key="fixnum"> <entry key="fixnum">
<value> <value>
<list> <list>
@ -436,6 +506,27 @@
</list> </list>
</value> </value>
</entry> </entry>
<entry key="flutter_local_notifications">
<value>
<list>
<option value="$USER_HOME$/.pub-cache/hosted/pub.dev/flutter_local_notifications-15.1.0+1/lib" />
</list>
</value>
</entry>
<entry key="flutter_local_notifications_linux">
<value>
<list>
<option value="$USER_HOME$/.pub-cache/hosted/pub.dev/flutter_local_notifications_linux-4.0.0+1/lib" />
</list>
</value>
</entry>
<entry key="flutter_local_notifications_platform_interface">
<value>
<list>
<option value="$USER_HOME$/.pub-cache/hosted/pub.dev/flutter_local_notifications_platform_interface-7.0.0+1/lib" />
</list>
</value>
</entry>
<entry key="flutter_localizations"> <entry key="flutter_localizations">
<value> <value>
<list> <list>
@ -478,6 +569,13 @@
</list> </list>
</value> </value>
</entry> </entry>
<entry key="fluttertoast">
<value>
<list>
<option value="$USER_HOME$/.pub-cache/hosted/pub.dev/fluttertoast-8.2.2/lib" />
</list>
</value>
</entry>
<entry key="font_awesome_flutter"> <entry key="font_awesome_flutter">
<value> <value>
<list> <list>
@ -600,7 +698,7 @@
<entry key="intl"> <entry key="intl">
<value> <value>
<list> <list>
<option value="$USER_HOME$/.pub-cache/hosted/pub.dev/intl-0.18.0/lib" /> <option value="$USER_HOME$/.pub-cache/hosted/pub.dev/intl-0.18.1/lib" />
</list> </list>
</value> </value>
</entry> </entry>
@ -705,14 +803,14 @@
<entry key="matcher"> <entry key="matcher">
<value> <value>
<list> <list>
<option value="$USER_HOME$/.pub-cache/hosted/pub.dev/matcher-0.12.15/lib" /> <option value="$USER_HOME$/.pub-cache/hosted/pub.dev/matcher-0.12.16/lib" />
</list> </list>
</value> </value>
</entry> </entry>
<entry key="material_color_utilities"> <entry key="material_color_utilities">
<value> <value>
<list> <list>
<option value="$USER_HOME$/.pub-cache/hosted/pub.dev/material_color_utilities-0.2.0/lib" /> <option value="$USER_HOME$/.pub-cache/hosted/pub.dev/material_color_utilities-0.5.0/lib" />
</list> </list>
</value> </value>
</entry> </entry>
@ -1006,7 +1104,7 @@
<entry key="source_span"> <entry key="source_span">
<value> <value>
<list> <list>
<option value="$USER_HOME$/.pub-cache/hosted/pub.dev/source_span-1.9.1/lib" /> <option value="$USER_HOME$/.pub-cache/hosted/pub.dev/source_span-1.10.0/lib" />
</list> </list>
</value> </value>
</entry> </entry>
@ -1132,7 +1230,7 @@
<entry key="test_api"> <entry key="test_api">
<value> <value>
<list> <list>
<option value="$USER_HOME$/.pub-cache/hosted/pub.dev/test_api-0.5.1/lib" /> <option value="$USER_HOME$/.pub-cache/hosted/pub.dev/test_api-0.6.0/lib" />
</list> </list>
</value> </value>
</entry> </entry>
@ -1248,6 +1346,13 @@
</list> </list>
</value> </value>
</entry> </entry>
<entry key="web">
<value>
<list>
<option value="$USER_HOME$/.pub-cache/hosted/pub.dev/web-0.1.4-beta/lib" />
</list>
</value>
</entry>
<entry key="web_socket_channel"> <entry key="web_socket_channel">
<value> <value>
<list> <list>
@ -1297,6 +1402,7 @@
<root url="file://$USER_HOME$/.pub-cache/git/nextcloud-neon-50d607e278061992659e4fdbc03a9d9fe0f04a77/packages/dynamite/dynamite_runtime/lib" /> <root url="file://$USER_HOME$/.pub-cache/git/nextcloud-neon-50d607e278061992659e4fdbc03a9d9fe0f04a77/packages/dynamite/dynamite_runtime/lib" />
<root url="file://$USER_HOME$/.pub-cache/git/nextcloud-neon-9a42bdb3a0ef1e3dbd62f746fb0fe75856be66a3/packages/nextcloud/lib" /> <root url="file://$USER_HOME$/.pub-cache/git/nextcloud-neon-9a42bdb3a0ef1e3dbd62f746fb0fe75856be66a3/packages/nextcloud/lib" />
<root url="file://$USER_HOME$/.pub-cache/hosted/pub.dev/_fe_analyzer_shared-62.0.0/lib" /> <root url="file://$USER_HOME$/.pub-cache/hosted/pub.dev/_fe_analyzer_shared-62.0.0/lib" />
<root url="file://$USER_HOME$/.pub-cache/hosted/pub.dev/_flutterfire_internals-1.3.4/lib" />
<root url="file://$USER_HOME$/.pub-cache/hosted/pub.dev/analyzer-6.0.0/lib" /> <root url="file://$USER_HOME$/.pub-cache/hosted/pub.dev/analyzer-6.0.0/lib" />
<root url="file://$USER_HOME$/.pub-cache/hosted/pub.dev/animated_digit-3.2.1/lib" /> <root url="file://$USER_HOME$/.pub-cache/hosted/pub.dev/animated_digit-3.2.1/lib" />
<root url="file://$USER_HOME$/.pub-cache/hosted/pub.dev/another_flushbar-1.12.30/lib" /> <root url="file://$USER_HOME$/.pub-cache/hosted/pub.dev/another_flushbar-1.12.30/lib" />
@ -1326,7 +1432,7 @@
<root url="file://$USER_HOME$/.pub-cache/hosted/pub.dev/cli_util-0.4.0/lib" /> <root url="file://$USER_HOME$/.pub-cache/hosted/pub.dev/cli_util-0.4.0/lib" />
<root url="file://$USER_HOME$/.pub-cache/hosted/pub.dev/clock-1.1.1/lib" /> <root url="file://$USER_HOME$/.pub-cache/hosted/pub.dev/clock-1.1.1/lib" />
<root url="file://$USER_HOME$/.pub-cache/hosted/pub.dev/code_builder-4.5.0/lib" /> <root url="file://$USER_HOME$/.pub-cache/hosted/pub.dev/code_builder-4.5.0/lib" />
<root url="file://$USER_HOME$/.pub-cache/hosted/pub.dev/collection-1.17.1/lib" /> <root url="file://$USER_HOME$/.pub-cache/hosted/pub.dev/collection-1.17.2/lib" />
<root url="file://$USER_HOME$/.pub-cache/hosted/pub.dev/convert-3.1.1/lib" /> <root url="file://$USER_HOME$/.pub-cache/hosted/pub.dev/convert-3.1.1/lib" />
<root url="file://$USER_HOME$/.pub-cache/hosted/pub.dev/cookie_jar-4.0.8/lib" /> <root url="file://$USER_HOME$/.pub-cache/hosted/pub.dev/cookie_jar-4.0.8/lib" />
<root url="file://$USER_HOME$/.pub-cache/hosted/pub.dev/cross_file-0.3.3+4/lib" /> <root url="file://$USER_HOME$/.pub-cache/hosted/pub.dev/cross_file-0.3.3+4/lib" />
@ -1336,6 +1442,7 @@
<root url="file://$USER_HOME$/.pub-cache/hosted/pub.dev/cupertino_icons-1.0.5/lib" /> <root url="file://$USER_HOME$/.pub-cache/hosted/pub.dev/cupertino_icons-1.0.5/lib" />
<root url="file://$USER_HOME$/.pub-cache/hosted/pub.dev/dart_internal-0.2.9/lib" /> <root url="file://$USER_HOME$/.pub-cache/hosted/pub.dev/dart_internal-0.2.9/lib" />
<root url="file://$USER_HOME$/.pub-cache/hosted/pub.dev/dart_style-2.3.2/lib" /> <root url="file://$USER_HOME$/.pub-cache/hosted/pub.dev/dart_style-2.3.2/lib" />
<root url="file://$USER_HOME$/.pub-cache/hosted/pub.dev/dbus-0.7.8/lib" />
<root url="file://$USER_HOME$/.pub-cache/hosted/pub.dev/device_info_plus-8.2.2/lib" /> <root url="file://$USER_HOME$/.pub-cache/hosted/pub.dev/device_info_plus-8.2.2/lib" />
<root url="file://$USER_HOME$/.pub-cache/hosted/pub.dev/device_info_plus_platform_interface-7.0.0/lib" /> <root url="file://$USER_HOME$/.pub-cache/hosted/pub.dev/device_info_plus_platform_interface-7.0.0/lib" />
<root url="file://$USER_HOME$/.pub-cache/hosted/pub.dev/dio-4.0.6/lib" /> <root url="file://$USER_HOME$/.pub-cache/hosted/pub.dev/dio-4.0.6/lib" />
@ -1349,15 +1456,27 @@
<root url="file://$USER_HOME$/.pub-cache/hosted/pub.dev/file_selector_platform_interface-2.6.0/lib" /> <root url="file://$USER_HOME$/.pub-cache/hosted/pub.dev/file_selector_platform_interface-2.6.0/lib" />
<root url="file://$USER_HOME$/.pub-cache/hosted/pub.dev/file_selector_windows-0.9.3/lib" /> <root url="file://$USER_HOME$/.pub-cache/hosted/pub.dev/file_selector_windows-0.9.3/lib" />
<root url="file://$USER_HOME$/.pub-cache/hosted/pub.dev/filesize-2.0.1/lib" /> <root url="file://$USER_HOME$/.pub-cache/hosted/pub.dev/filesize-2.0.1/lib" />
<root url="file://$USER_HOME$/.pub-cache/hosted/pub.dev/firebase_core-2.15.0/lib" />
<root url="file://$USER_HOME$/.pub-cache/hosted/pub.dev/firebase_core_platform_interface-4.8.0/lib" />
<root url="file://$USER_HOME$/.pub-cache/hosted/pub.dev/firebase_core_web-2.6.0/lib" />
<root url="file://$USER_HOME$/.pub-cache/hosted/pub.dev/firebase_in_app_messaging-0.7.3+4/lib" />
<root url="file://$USER_HOME$/.pub-cache/hosted/pub.dev/firebase_in_app_messaging_platform_interface-0.2.4+4/lib" />
<root url="file://$USER_HOME$/.pub-cache/hosted/pub.dev/firebase_messaging-14.6.5/lib" />
<root url="file://$USER_HOME$/.pub-cache/hosted/pub.dev/firebase_messaging_platform_interface-4.5.4/lib" />
<root url="file://$USER_HOME$/.pub-cache/hosted/pub.dev/firebase_messaging_web-3.5.4/lib" />
<root url="file://$USER_HOME$/.pub-cache/hosted/pub.dev/fixnum-1.1.0/lib" /> <root url="file://$USER_HOME$/.pub-cache/hosted/pub.dev/fixnum-1.1.0/lib" />
<root url="file://$USER_HOME$/.pub-cache/hosted/pub.dev/flutter_blurhash-0.7.0/lib" /> <root url="file://$USER_HOME$/.pub-cache/hosted/pub.dev/flutter_blurhash-0.7.0/lib" />
<root url="file://$USER_HOME$/.pub-cache/hosted/pub.dev/flutter_cache_manager-3.3.1/lib" /> <root url="file://$USER_HOME$/.pub-cache/hosted/pub.dev/flutter_cache_manager-3.3.1/lib" />
<root url="file://$USER_HOME$/.pub-cache/hosted/pub.dev/flutter_launcher_icons-0.13.1/lib" /> <root url="file://$USER_HOME$/.pub-cache/hosted/pub.dev/flutter_launcher_icons-0.13.1/lib" />
<root url="file://$USER_HOME$/.pub-cache/hosted/pub.dev/flutter_linkify-6.0.0/lib" /> <root url="file://$USER_HOME$/.pub-cache/hosted/pub.dev/flutter_linkify-6.0.0/lib" />
<root url="file://$USER_HOME$/.pub-cache/hosted/pub.dev/flutter_lints-2.0.2/lib" /> <root url="file://$USER_HOME$/.pub-cache/hosted/pub.dev/flutter_lints-2.0.2/lib" />
<root url="file://$USER_HOME$/.pub-cache/hosted/pub.dev/flutter_local_notifications-15.1.0+1/lib" />
<root url="file://$USER_HOME$/.pub-cache/hosted/pub.dev/flutter_local_notifications_linux-4.0.0+1/lib" />
<root url="file://$USER_HOME$/.pub-cache/hosted/pub.dev/flutter_local_notifications_platform_interface-7.0.0+1/lib" />
<root url="file://$USER_HOME$/.pub-cache/hosted/pub.dev/flutter_login-4.2.0/lib" /> <root url="file://$USER_HOME$/.pub-cache/hosted/pub.dev/flutter_login-4.2.0/lib" />
<root url="file://$USER_HOME$/.pub-cache/hosted/pub.dev/flutter_native_splash-2.3.1/lib" /> <root url="file://$USER_HOME$/.pub-cache/hosted/pub.dev/flutter_native_splash-2.3.1/lib" />
<root url="file://$USER_HOME$/.pub-cache/hosted/pub.dev/flutter_plugin_android_lifecycle-2.0.15/lib" /> <root url="file://$USER_HOME$/.pub-cache/hosted/pub.dev/flutter_plugin_android_lifecycle-2.0.15/lib" />
<root url="file://$USER_HOME$/.pub-cache/hosted/pub.dev/fluttertoast-8.2.2/lib" />
<root url="file://$USER_HOME$/.pub-cache/hosted/pub.dev/font_awesome_flutter-10.5.0/lib" /> <root url="file://$USER_HOME$/.pub-cache/hosted/pub.dev/font_awesome_flutter-10.5.0/lib" />
<root url="file://$USER_HOME$/.pub-cache/hosted/pub.dev/frontend_server_client-3.2.0/lib" /> <root url="file://$USER_HOME$/.pub-cache/hosted/pub.dev/frontend_server_client-3.2.0/lib" />
<root url="file://$USER_HOME$/.pub-cache/hosted/pub.dev/glob-2.1.2/lib" /> <root url="file://$USER_HOME$/.pub-cache/hosted/pub.dev/glob-2.1.2/lib" />
@ -1375,7 +1494,7 @@
<root url="file://$USER_HOME$/.pub-cache/hosted/pub.dev/image_picker_macos-0.2.1/lib" /> <root url="file://$USER_HOME$/.pub-cache/hosted/pub.dev/image_picker_macos-0.2.1/lib" />
<root url="file://$USER_HOME$/.pub-cache/hosted/pub.dev/image_picker_platform_interface-2.9.0/lib" /> <root url="file://$USER_HOME$/.pub-cache/hosted/pub.dev/image_picker_platform_interface-2.9.0/lib" />
<root url="file://$USER_HOME$/.pub-cache/hosted/pub.dev/image_picker_windows-0.2.1/lib" /> <root url="file://$USER_HOME$/.pub-cache/hosted/pub.dev/image_picker_windows-0.2.1/lib" />
<root url="file://$USER_HOME$/.pub-cache/hosted/pub.dev/intl-0.18.0/lib" /> <root url="file://$USER_HOME$/.pub-cache/hosted/pub.dev/intl-0.18.1/lib" />
<root url="file://$USER_HOME$/.pub-cache/hosted/pub.dev/intl_phone_number_input-0.7.3+1/lib" /> <root url="file://$USER_HOME$/.pub-cache/hosted/pub.dev/intl_phone_number_input-0.7.3+1/lib" />
<root url="file://$USER_HOME$/.pub-cache/hosted/pub.dev/io-1.0.4/lib" /> <root url="file://$USER_HOME$/.pub-cache/hosted/pub.dev/io-1.0.4/lib" />
<root url="file://$USER_HOME$/.pub-cache/hosted/pub.dev/jiffy-6.2.1/lib" /> <root url="file://$USER_HOME$/.pub-cache/hosted/pub.dev/jiffy-6.2.1/lib" />
@ -1390,8 +1509,8 @@
<root url="file://$USER_HOME$/.pub-cache/hosted/pub.dev/loader_overlay-2.3.0/lib" /> <root url="file://$USER_HOME$/.pub-cache/hosted/pub.dev/loader_overlay-2.3.0/lib" />
<root url="file://$USER_HOME$/.pub-cache/hosted/pub.dev/localstore-1.3.5/lib" /> <root url="file://$USER_HOME$/.pub-cache/hosted/pub.dev/localstore-1.3.5/lib" />
<root url="file://$USER_HOME$/.pub-cache/hosted/pub.dev/logging-1.2.0/lib" /> <root url="file://$USER_HOME$/.pub-cache/hosted/pub.dev/logging-1.2.0/lib" />
<root url="file://$USER_HOME$/.pub-cache/hosted/pub.dev/matcher-0.12.15/lib" /> <root url="file://$USER_HOME$/.pub-cache/hosted/pub.dev/matcher-0.12.16/lib" />
<root url="file://$USER_HOME$/.pub-cache/hosted/pub.dev/material_color_utilities-0.2.0/lib" /> <root url="file://$USER_HOME$/.pub-cache/hosted/pub.dev/material_color_utilities-0.5.0/lib" />
<root url="file://$USER_HOME$/.pub-cache/hosted/pub.dev/meta-1.9.1/lib" /> <root url="file://$USER_HOME$/.pub-cache/hosted/pub.dev/meta-1.9.1/lib" />
<root url="file://$USER_HOME$/.pub-cache/hosted/pub.dev/mime-1.0.4/lib" /> <root url="file://$USER_HOME$/.pub-cache/hosted/pub.dev/mime-1.0.4/lib" />
<root url="file://$USER_HOME$/.pub-cache/hosted/pub.dev/nested-1.0.0/lib" /> <root url="file://$USER_HOME$/.pub-cache/hosted/pub.dev/nested-1.0.0/lib" />
@ -1431,7 +1550,7 @@
<root url="file://$USER_HOME$/.pub-cache/hosted/pub.dev/sign_in_button-3.2.0/lib" /> <root url="file://$USER_HOME$/.pub-cache/hosted/pub.dev/sign_in_button-3.2.0/lib" />
<root url="file://$USER_HOME$/.pub-cache/hosted/pub.dev/source_gen-1.4.0/lib" /> <root url="file://$USER_HOME$/.pub-cache/hosted/pub.dev/source_gen-1.4.0/lib" />
<root url="file://$USER_HOME$/.pub-cache/hosted/pub.dev/source_helper-1.3.4/lib" /> <root url="file://$USER_HOME$/.pub-cache/hosted/pub.dev/source_helper-1.3.4/lib" />
<root url="file://$USER_HOME$/.pub-cache/hosted/pub.dev/source_span-1.9.1/lib" /> <root url="file://$USER_HOME$/.pub-cache/hosted/pub.dev/source_span-1.10.0/lib" />
<root url="file://$USER_HOME$/.pub-cache/hosted/pub.dev/sqflite-2.3.0/lib" /> <root url="file://$USER_HOME$/.pub-cache/hosted/pub.dev/sqflite-2.3.0/lib" />
<root url="file://$USER_HOME$/.pub-cache/hosted/pub.dev/sqflite_common-2.5.0/lib" /> <root url="file://$USER_HOME$/.pub-cache/hosted/pub.dev/sqflite_common-2.5.0/lib" />
<root url="file://$USER_HOME$/.pub-cache/hosted/pub.dev/stack_trace-1.11.0/lib" /> <root url="file://$USER_HOME$/.pub-cache/hosted/pub.dev/stack_trace-1.11.0/lib" />
@ -1449,7 +1568,7 @@
<root url="file://$USER_HOME$/.pub-cache/hosted/pub.dev/syncfusion_pdfviewer_windows-21.2.10/lib" /> <root url="file://$USER_HOME$/.pub-cache/hosted/pub.dev/syncfusion_pdfviewer_windows-21.2.10/lib" />
<root url="file://$USER_HOME$/.pub-cache/hosted/pub.dev/synchronized-3.1.0/lib" /> <root url="file://$USER_HOME$/.pub-cache/hosted/pub.dev/synchronized-3.1.0/lib" />
<root url="file://$USER_HOME$/.pub-cache/hosted/pub.dev/term_glyph-1.2.1/lib" /> <root url="file://$USER_HOME$/.pub-cache/hosted/pub.dev/term_glyph-1.2.1/lib" />
<root url="file://$USER_HOME$/.pub-cache/hosted/pub.dev/test_api-0.5.1/lib" /> <root url="file://$USER_HOME$/.pub-cache/hosted/pub.dev/test_api-0.6.0/lib" />
<root url="file://$USER_HOME$/.pub-cache/hosted/pub.dev/timezone-0.9.2/lib" /> <root url="file://$USER_HOME$/.pub-cache/hosted/pub.dev/timezone-0.9.2/lib" />
<root url="file://$USER_HOME$/.pub-cache/hosted/pub.dev/timing-1.0.1/lib" /> <root url="file://$USER_HOME$/.pub-cache/hosted/pub.dev/timing-1.0.1/lib" />
<root url="file://$USER_HOME$/.pub-cache/hosted/pub.dev/typed_data-1.3.2/lib" /> <root url="file://$USER_HOME$/.pub-cache/hosted/pub.dev/typed_data-1.3.2/lib" />
@ -1466,6 +1585,7 @@
<root url="file://$USER_HOME$/.pub-cache/hosted/pub.dev/vector_math-2.1.4/lib" /> <root url="file://$USER_HOME$/.pub-cache/hosted/pub.dev/vector_math-2.1.4/lib" />
<root url="file://$USER_HOME$/.pub-cache/hosted/pub.dev/version-3.0.2/lib" /> <root url="file://$USER_HOME$/.pub-cache/hosted/pub.dev/version-3.0.2/lib" />
<root url="file://$USER_HOME$/.pub-cache/hosted/pub.dev/watcher-1.1.0/lib" /> <root url="file://$USER_HOME$/.pub-cache/hosted/pub.dev/watcher-1.1.0/lib" />
<root url="file://$USER_HOME$/.pub-cache/hosted/pub.dev/web-0.1.4-beta/lib" />
<root url="file://$USER_HOME$/.pub-cache/hosted/pub.dev/web_socket_channel-2.4.0/lib" /> <root url="file://$USER_HOME$/.pub-cache/hosted/pub.dev/web_socket_channel-2.4.0/lib" />
<root url="file://$USER_HOME$/.pub-cache/hosted/pub.dev/win32-4.1.4/lib" /> <root url="file://$USER_HOME$/.pub-cache/hosted/pub.dev/win32-4.1.4/lib" />
<root url="file://$USER_HOME$/.pub-cache/hosted/pub.dev/xdg_directories-1.0.1/lib" /> <root url="file://$USER_HOME$/.pub-cache/hosted/pub.dev/xdg_directories-1.0.1/lib" />

View File

@ -1,24 +1,18 @@
<component name="libraryTable"> <component name="libraryTable">
<library name="Flutter Plugins" type="FlutterPluginsLibraryType"> <library name="Flutter Plugins" type="FlutterPluginsLibraryType">
<CLASSES> <CLASSES>
<root url="file://$USER_HOME$/.pub-cache/hosted/pub.dev/better_open_file-3.6.4" />
<root url="file://$USER_HOME$/.pub-cache/hosted/pub.dev/package_info-2.0.2" />
<root url="file://$USER_HOME$/.pub-cache/hosted/pub.dev/path_provider-2.0.15" />
<root url="file://$USER_HOME$/.pub-cache/hosted/pub.dev/device_info_plus-8.2.2" />
<root url="file://$USER_HOME$/.pub-cache/hosted/pub.dev/url_launcher_linux-3.0.5" />
<root url="file://$USER_HOME$/.pub-cache/hosted/pub.dev/path_provider_android-2.0.27" />
<root url="file://$USER_HOME$/.pub-cache/hosted/pub.dev/url_launcher_ios-6.1.4" />
<root url="file://$USER_HOME$/.pub-cache/hosted/pub.dev/image_picker_windows-0.2.1" />
<root url="file://$USER_HOME$/.pub-cache/hosted/pub.dev/file_selector_windows-0.9.3" />
<root url="file://$USER_HOME$/.pub-cache/hosted/pub.dev/image_picker_macos-0.2.1" />
<root url="file://$USER_HOME$/.pub-cache/hosted/pub.dev/file_selector_linux-0.9.2" />
<root url="file://$USER_HOME$/.pub-cache/hosted/pub.dev/image_picker_linux-0.2.1" />
<root url="file://$USER_HOME$/.pub-cache/hosted/pub.dev/syncfusion_pdfviewer_web-21.2.10" /> <root url="file://$USER_HOME$/.pub-cache/hosted/pub.dev/syncfusion_pdfviewer_web-21.2.10" />
<root url="file://$USER_HOME$/.pub-cache/hosted/pub.dev/url_launcher_web-2.0.18" /> <root url="file://$USER_HOME$/.pub-cache/hosted/pub.dev/url_launcher_web-2.0.18" />
<root url="file://$USER_HOME$/.pub-cache/hosted/pub.dev/libphonenumber_plugin-0.3.2" /> <root url="file://$USER_HOME$/.pub-cache/hosted/pub.dev/libphonenumber_plugin-0.3.2" />
<root url="file://$USER_HOME$/.pub-cache/hosted/pub.dev/url_launcher_android-6.0.37" />
<root url="file://$USER_HOME$/.pub-cache/hosted/pub.dev/image_picker_windows-0.2.1" />
<root url="file://$USER_HOME$/.pub-cache/hosted/pub.dev/url_launcher_macos-3.0.6" /> <root url="file://$USER_HOME$/.pub-cache/hosted/pub.dev/url_launcher_macos-3.0.6" />
<root url="file://$USER_HOME$/.pub-cache/hosted/pub.dev/image_picker_ios-0.8.8" /> <root url="file://$USER_HOME$/.pub-cache/hosted/pub.dev/image_picker_ios-0.8.8" />
<root url="file://$USER_HOME$/.pub-cache/hosted/pub.dev/file_selector_windows-0.9.3" />
<root url="file://$USER_HOME$/.pub-cache/hosted/pub.dev/better_open_file-3.6.4" />
<root url="file://$USER_HOME$/.pub-cache/hosted/pub.dev/package_info-2.0.2" />
<root url="file://$USER_HOME$/.pub-cache/hosted/pub.dev/url_launcher-6.1.12" /> <root url="file://$USER_HOME$/.pub-cache/hosted/pub.dev/url_launcher-6.1.12" />
<root url="file://$USER_HOME$/.pub-cache/hosted/pub.dev/firebase_core-2.15.0" />
<root url="file://$USER_HOME$/.pub-cache/hosted/pub.dev/libphonenumber_web-0.3.1" /> <root url="file://$USER_HOME$/.pub-cache/hosted/pub.dev/libphonenumber_web-0.3.1" />
<root url="file://$USER_HOME$/.pub-cache/hosted/pub.dev/image_picker-1.0.1" /> <root url="file://$USER_HOME$/.pub-cache/hosted/pub.dev/image_picker-1.0.1" />
<root url="file://$USER_HOME$/.pub-cache/hosted/pub.dev/shared_preferences_linux-2.3.0" /> <root url="file://$USER_HOME$/.pub-cache/hosted/pub.dev/shared_preferences_linux-2.3.0" />
@ -26,19 +20,32 @@
<root url="file://$USER_HOME$/.pub-cache/hosted/pub.dev/file_selector_macos-0.9.3+1" /> <root url="file://$USER_HOME$/.pub-cache/hosted/pub.dev/file_selector_macos-0.9.3+1" />
<root url="file://$USER_HOME$/.pub-cache/hosted/pub.dev/shared_preferences_web-2.2.0" /> <root url="file://$USER_HOME$/.pub-cache/hosted/pub.dev/shared_preferences_web-2.2.0" />
<root url="file://$USER_HOME$/.pub-cache/hosted/pub.dev/path_provider_foundation-2.2.4" /> <root url="file://$USER_HOME$/.pub-cache/hosted/pub.dev/path_provider_foundation-2.2.4" />
<root url="file://$USER_HOME$/.pub-cache/hosted/pub.dev/path_provider-2.0.15" />
<root url="file://$USER_HOME$/.pub-cache/hosted/pub.dev/image_picker_for_web-2.2.0" /> <root url="file://$USER_HOME$/.pub-cache/hosted/pub.dev/image_picker_for_web-2.2.0" />
<root url="file://$USER_HOME$/.pub-cache/hosted/pub.dev/image_picker_macos-0.2.1" />
<root url="file://$USER_HOME$/.pub-cache/hosted/pub.dev/shared_preferences_android-2.2.0" /> <root url="file://$USER_HOME$/.pub-cache/hosted/pub.dev/shared_preferences_android-2.2.0" />
<root url="file://$USER_HOME$/.pub-cache/hosted/pub.dev/file_selector_linux-0.9.2" />
<root url="file://$USER_HOME$/.pub-cache/hosted/pub.dev/device_info_plus-8.2.2" />
<root url="file://$USER_HOME$/.pub-cache/hosted/pub.dev/firebase_messaging-14.6.5" />
<root url="file://$USER_HOME$/.pub-cache/hosted/pub.dev/url_launcher_linux-3.0.5" />
<root url="file://$USER_HOME$/.pub-cache/hosted/pub.dev/firebase_messaging_web-3.5.4" />
<root url="file://$USER_HOME$/.pub-cache/hosted/pub.dev/image_picker_android-0.8.7+4" />
<root url="file://$USER_HOME$/.pub-cache/hosted/pub.dev/url_launcher_windows-3.0.7" /> <root url="file://$USER_HOME$/.pub-cache/hosted/pub.dev/url_launcher_windows-3.0.7" />
<root url="file://$USER_HOME$/.pub-cache/hosted/pub.dev/path_provider_android-2.0.27" />
<root url="file://$USER_HOME$/.pub-cache/hosted/pub.dev/url_launcher_ios-6.1.4" />
<root url="file://$USER_HOME$/.pub-cache/hosted/pub.dev/flutter_native_splash-2.3.1" /> <root url="file://$USER_HOME$/.pub-cache/hosted/pub.dev/flutter_native_splash-2.3.1" />
<root url="file://$USER_HOME$/.pub-cache/hosted/pub.dev/firebase_core_web-2.6.0" />
<root url="file://$USER_HOME$/.pub-cache/hosted/pub.dev/path_provider_windows-2.1.7" /> <root url="file://$USER_HOME$/.pub-cache/hosted/pub.dev/path_provider_windows-2.1.7" />
<root url="file://$USER_HOME$/.pub-cache/hosted/pub.dev/shared_preferences_windows-2.3.0" /> <root url="file://$USER_HOME$/.pub-cache/hosted/pub.dev/shared_preferences_windows-2.3.0" />
<root url="file://$USER_HOME$/.pub-cache/hosted/pub.dev/shared_preferences-2.2.0" /> <root url="file://$USER_HOME$/.pub-cache/hosted/pub.dev/shared_preferences-2.2.0" />
<root url="file://$USER_HOME$/.pub-cache/hosted/pub.dev/image_picker_linux-0.2.1" />
<root url="file://$USER_HOME$/.pub-cache/hosted/pub.dev/shared_preferences_foundation-2.3.2" /> <root url="file://$USER_HOME$/.pub-cache/hosted/pub.dev/shared_preferences_foundation-2.3.2" />
<root url="file://$USER_HOME$/.pub-cache/hosted/pub.dev/path_provider_linux-2.1.11" /> <root url="file://$USER_HOME$/.pub-cache/hosted/pub.dev/path_provider_linux-2.1.11" />
<root url="file://$USER_HOME$/.pub-cache/hosted/pub.dev/file_picker-5.3.1" /> <root url="file://$USER_HOME$/.pub-cache/hosted/pub.dev/file_picker-5.3.1" />
<root url="file://$USER_HOME$/.pub-cache/hosted/pub.dev/url_launcher_android-6.0.37" />
<root url="file://$USER_HOME$/.pub-cache/hosted/pub.dev/image_picker_android-0.8.7+4" />
<root url="file://$USER_HOME$/.pub-cache/hosted/pub.dev/sqflite-2.3.0" /> <root url="file://$USER_HOME$/.pub-cache/hosted/pub.dev/sqflite-2.3.0" />
<root url="file://$USER_HOME$/.pub-cache/hosted/pub.dev/firebase_in_app_messaging-0.7.3+4" />
<root url="file://$USER_HOME$/.pub-cache/hosted/pub.dev/flutter_local_notifications-15.1.0+1" />
<root url="file://$USER_HOME$/.pub-cache/hosted/pub.dev/fluttertoast-8.2.2" />
</CLASSES> </CLASSES>
<JAVADOC /> <JAVADOC />
<SOURCES /> <SOURCES />

View File

@ -23,6 +23,7 @@ if (flutterVersionName == null) {
apply plugin: 'com.android.application' apply plugin: 'com.android.application'
apply plugin: 'kotlin-android' apply plugin: 'kotlin-android'
apply plugin: 'com.google.gms.google-services'
apply from: "$flutterRoot/packages/flutter_tools/gradle/flutter.gradle" apply from: "$flutterRoot/packages/flutter_tools/gradle/flutter.gradle"
android { android {
@ -39,7 +40,7 @@ android {
applicationId "eu.mhsl.marianum.mobile.client" applicationId "eu.mhsl.marianum.mobile.client"
// You can update the following values to match your application needs. // You can update the following values to match your application needs.
// For more information, see: https://docs.flutter.dev/deployment/android#reviewing-the-build-configuration. // For more information, see: https://docs.flutter.dev/deployment/android#reviewing-the-build-configuration.
minSdkVersion flutter.minSdkVersion minSdkVersion 19
targetSdkVersion flutter.targetSdkVersion targetSdkVersion flutter.targetSdkVersion
versionCode flutterVersionCode.toInteger() versionCode flutterVersionCode.toInteger()
versionName flutterVersionName versionName flutterVersionName

View File

@ -0,0 +1,39 @@
{
"project_info": {
"project_number": "522850592536",
"project_id": "marmobile-33b10",
"storage_bucket": "marmobile-33b10.appspot.com"
},
"client": [
{
"client_info": {
"mobilesdk_app_id": "1:522850592536:android:9a355c61e6f1b0f0c2606d",
"android_client_info": {
"package_name": "eu.mhsl.marianum.mobile.client"
}
},
"oauth_client": [
{
"client_id": "522850592536-5urolovocke0fmr7kpd0hqvfd3gft6qo.apps.googleusercontent.com",
"client_type": 3
}
],
"api_key": [
{
"current_key": "AIzaSyAXo66A3jSBxnAYKgpUIfucidELoHw5W3M"
}
],
"services": {
"appinvite_service": {
"other_platform_oauth_client": [
{
"client_id": "522850592536-5urolovocke0fmr7kpd0hqvfd3gft6qo.apps.googleusercontent.com",
"client_type": 3
}
]
}
}
}
],
"configuration_version": "1"
}

View File

@ -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);
}
}

View File

@ -8,6 +8,7 @@ buildscript {
dependencies { dependencies {
classpath 'com.android.tools.build:gradle:7.1.3' classpath 'com.android.tools.build:gradle:7.1.3'
classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version" classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
classpath 'com.google.gms:google-services:4.3.15'
} }
} }

View File

@ -3,6 +3,7 @@
<component name="NewModuleRootManager" inherit-compiler-output="true"> <component name="NewModuleRootManager" inherit-compiler-output="true">
<exclude-output /> <exclude-output />
<content url="file://$MODULE_DIR$"> <content url="file://$MODULE_DIR$">
<sourceFolder url="file://$MODULE_DIR$/test" isTestSource="true" />
<excludeFolder url="file://$MODULE_DIR$/build" /> <excludeFolder url="file://$MODULE_DIR$/build" />
<excludeFolder url="file://$MODULE_DIR$/.pub" /> <excludeFolder url="file://$MODULE_DIR$/.pub" />
<excludeFolder url="file://$MODULE_DIR$/.dart_tool" /> <excludeFolder url="file://$MODULE_DIR$/.dart_tool" />

View File

@ -1,4 +1,5 @@
import 'dart:convert'; import 'dart:convert';
import 'dart:developer';
import 'package:http/http.dart' as http; import 'package:http/http.dart' as http;
import '../apiError.dart'; import '../apiError.dart';
@ -21,6 +22,10 @@ abstract class MhslApi<T> extends ApiRequest {
throw ApiError("Request could not be dispatched!"); throw ApiError("Request could not be dispatched!");
} }
if(data.statusCode > 299) {
log("Non 200 Status code from mhsl services: $subpath: ${data.statusCode}");
}
return assemble(utf8.decode(data.bodyBytes)); return assemble(utf8.decode(data.bodyBytes));
} }
} }

View File

@ -0,0 +1,26 @@
import 'dart:convert';
import 'dart:developer';
import 'package:http/http.dart' as http;
import '../../mhslApi.dart';
import 'notifyRegisterParams.dart';
class NotifyRegister extends MhslApi<void> {
NotifyRegisterParams params;
NotifyRegister(this.params) : super("notify/register/");
@override
void assemble(String raw) {
}
@override
Future<http.Response> request(Uri uri) {
String requestString = jsonEncode(params.toJson());
log(requestString);
return http.post(uri, body: requestString);
}
}

View File

@ -0,0 +1,19 @@
import 'package:json_annotation/json_annotation.dart';
part 'notifyRegisterParams.g.dart';
@JsonSerializable()
class NotifyRegisterParams {
String username;
String password;
String fcmToken;
NotifyRegisterParams({
required this.username,
required this.password,
required this.fcmToken
});
factory NotifyRegisterParams.fromJson(Map<String, dynamic> json) => _$NotifyRegisterParamsFromJson(json);
Map<String, dynamic> toJson() => _$NotifyRegisterParamsToJson(this);
}

View File

@ -0,0 +1,23 @@
// GENERATED CODE - DO NOT MODIFY BY HAND
part of 'notifyRegisterParams.dart';
// **************************************************************************
// JsonSerializableGenerator
// **************************************************************************
NotifyRegisterParams _$NotifyRegisterParamsFromJson(
Map<String, dynamic> json) =>
NotifyRegisterParams(
username: json['username'] as String,
password: json['password'] as String,
fcmToken: json['fcmToken'] as String,
);
Map<String, dynamic> _$NotifyRegisterParamsToJson(
NotifyRegisterParams instance) =>
<String, dynamic>{
'username': instance.username,
'password': instance.password,
'fcmToken': instance.fcmToken,
};

View File

@ -1,6 +1,7 @@
import 'dart:async'; import 'dart:async';
import 'package:firebase_messaging/firebase_messaging.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:persistent_bottom_nav_bar/persistent_tab_view.dart'; import 'package:persistent_bottom_nav_bar/persistent_tab_view.dart';
import 'package:provider/provider.dart'; import 'package:provider/provider.dart';
@ -10,6 +11,9 @@ import 'api/mhsl/breaker/getBreakers/getBreakersResponse.dart';
import 'model/breakers/Breaker.dart'; import 'model/breakers/Breaker.dart';
import 'model/breakers/BreakerProps.dart'; import 'model/breakers/BreakerProps.dart';
import 'model/chatList/chatListProps.dart'; import 'model/chatList/chatListProps.dart';
import 'notification/notificationController.dart';
import 'notification/notifyUpdater.dart';
import 'storage/base/settingsProvider.dart';
import 'view/pages/files/files.dart'; import 'view/pages/files/files.dart';
import 'view/pages/more/overhang.dart'; import 'view/pages/more/overhang.dart';
import 'view/pages/talk/chatList.dart'; import 'view/pages/talk/chatList.dart';
@ -42,6 +46,13 @@ class _AppState extends State<App> {
}); });
}); });
if(Provider.of<SettingsProvider>(context, listen: false).val().notificationSettings.enabled) {
NotifyUpdater.registerToServer();
}
FirebaseMessaging.onMessage.listen((message) => NotificationController.onForegroundMessageHandler(message, context));
FirebaseMessaging.onBackgroundMessage(NotificationController.onBackgroundMessageHandler);
super.initState(); super.initState();
} }

View File

@ -1,6 +1,10 @@
import 'dart:async'; import 'dart:async';
import 'dart:developer';
import 'dart:io'; import 'dart:io';
import 'package:firebase_core/firebase_core.dart';
import 'package:firebase_messaging/firebase_messaging.dart';
import 'package:flutter/foundation.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter/services.dart'; import 'package:flutter/services.dart';
import 'package:jiffy/jiffy.dart'; import 'package:jiffy/jiffy.dart';
@ -27,6 +31,8 @@ import 'widget/placeholderView.dart';
Future<void> main() async { Future<void> main() async {
WidgetsFlutterBinding.ensureInitialized(); WidgetsFlutterBinding.ensureInitialized();
await Firebase.initializeApp();
log("Firebase token: ${await FirebaseMessaging.instance.getToken() ?? "Error: no Firebase token!"}");
ByteData data = await PlatformAssetBundle().load('assets/ca/lets-encrypt-r3.pem'); ByteData data = await PlatformAssetBundle().load('assets/ca/lets-encrypt-r3.pem');
SecurityContext.defaultContext.setTrustedCertificatesBytes(data.buffer.asUint8List()); SecurityContext.defaultContext.setTrustedCertificatesBytes(data.buffer.asUint8List());

View File

@ -0,0 +1,45 @@
import 'dart:developer';
import 'package:firebase_core/firebase_core.dart';
import 'package:firebase_messaging/firebase_messaging.dart';
import 'package:flutter/cupertino.dart';
import '../api/marianumcloud/talk/room/getRoom.dart';
import '../api/marianumcloud/talk/room/getRoomParams.dart';
import '../model/accountData.dart';
import 'notificationService.dart';
class NotificationController {
@pragma('vm:entry-point')
static Future<void> onBackgroundMessageHandler(RemoteMessage message) async {
log("Handling a background notification: ${message.messageId}");
await Firebase.initializeApp();
AccountData().waitForPopulation().then((value) {
log("User account status: $value");
if(value) {
GetRoom(
GetRoomParams(
includeStatus: false,
),
).run().then((value) {
var messageCount = value.data.map((e) => e.unreadMessages).reduce((a, b) => a + b);
var chatCount = value.data.map((e) => e.unreadMessages).length;
var people = value.data.where((e) => e.unreadMessages > 0).map((e) => e.displayName.split(" ")[0]);
final NotificationService service = NotificationService();
service.initializeNotifications().then((value) {
service.showNotification(
title: "Du hast $messageCount ungelesene Nachrichten!",
body: "In $chatCount Chats, von ${people.join(", ")}"
);
});
});
}
});
}
static Future<void> onForegroundMessageHandler(RemoteMessage message, BuildContext context) async {
NotificationService().showToast(message: "Du hast eine neue Talk Nachricht!", context: context);
}
}

View File

@ -0,0 +1,75 @@
import 'package:flutter/material.dart';
import 'package:flutter_local_notifications/flutter_local_notifications.dart';
import 'package:fluttertoast/fluttertoast.dart';
import 'package:provider/provider.dart';
import '../model/chatList/chatListProps.dart';
import '../model/message/messageProps.dart';
class NotificationService {
static final NotificationService _instance = NotificationService._internal();
factory NotificationService() {
return _instance;
}
NotificationService._internal();
FlutterLocalNotificationsPlugin flutterLocalNotificationsPlugin = FlutterLocalNotificationsPlugin();
Future<void> initializeNotifications() async {
const AndroidInitializationSettings androidSettings = AndroidInitializationSettings(
'@mipmap/ic_launcher'
);
final DarwinInitializationSettings iosSettings = DarwinInitializationSettings(
onDidReceiveLocalNotification: (id, title, body, payload) {
// TODO Navigate to Talk section (This runs when an Notification is tapped)
},
);
final InitializationSettings initializationSettings = InitializationSettings(
android: androidSettings,
iOS: iosSettings,
);
await flutterLocalNotificationsPlugin.initialize(
initializationSettings,
);
}
Future<void> showNotification({required String title, required String body}) async {
const AndroidNotificationDetails androidPlatformChannelSpecifics =
AndroidNotificationDetails(
'your_channel_id',
'Your Channel Name',
importance: Importance.defaultImportance,
priority: Priority.defaultPriority,
ticker: 'ticker',
);
const NotificationDetails platformChannelSpecifics = NotificationDetails(android: androidPlatformChannelSpecifics);
await flutterLocalNotificationsPlugin.show(
0,
title,
body,
platformChannelSpecifics,
);
}
void showToast({required String message, required BuildContext context, ToastGravity gravity = ToastGravity.BOTTOM}) {
Fluttertoast.showToast(
msg: message,
gravity: gravity,
toastLength: Toast.LENGTH_SHORT,
backgroundColor: Theme.of(context).primaryColor,
textColor: Colors.white,
fontSize: 13.0,
);
Provider.of<ChatListProps>(context, listen: false).run(renew: true);
Provider.of<MessageProps>(context, listen: false).run(renew: true);
}
}

View File

@ -0,0 +1,22 @@
import 'package:firebase_messaging/firebase_messaging.dart';
import '../api/mhsl/notify/register/notifyRegister.dart';
import '../api/mhsl/notify/register/notifyRegisterParams.dart';
import '../model/accountData.dart';
class NotifyUpdater {
static void registerToServer() async {
String? fcmToken = await FirebaseMessaging.instance.getToken();
if(fcmToken == null) throw Exception("Failed to register push notification because there is no FBC token!");
NotifyRegister(
NotifyRegisterParams(
username: AccountData().getUsername(),
password: AccountData().getPassword(),
fcmToken: fcmToken,
),
).run();
}
}

View File

@ -5,6 +5,7 @@ import '../file/fileSettings.dart';
import '../fileView/fileViewSettings.dart'; import '../fileView/fileViewSettings.dart';
import '../gradeAverages/gradeAveragesSettings.dart'; import '../gradeAverages/gradeAveragesSettings.dart';
import '../holidays/holidaysSettings.dart'; import '../holidays/holidaysSettings.dart';
import '../notification/notificationSettings.dart';
import '../talk/talkSettings.dart'; import '../talk/talkSettings.dart';
import '../timetable/timetableSettings.dart'; import '../timetable/timetableSettings.dart';
@ -25,6 +26,7 @@ class Settings {
FileSettings fileSettings; FileSettings fileSettings;
HolidaysSettings holidaysSettings; HolidaysSettings holidaysSettings;
FileViewSettings fileViewSettings; FileViewSettings fileViewSettings;
NotificationSettings notificationSettings;
Settings({ Settings({
required this.appTheme, required this.appTheme,
@ -35,6 +37,7 @@ class Settings {
required this.fileSettings, required this.fileSettings,
required this.holidaysSettings, required this.holidaysSettings,
required this.fileViewSettings, required this.fileViewSettings,
required this.notificationSettings,
}); });
static String _themeToJson(ThemeMode m) => m.name; static String _themeToJson(ThemeMode m) => m.name;

View File

@ -21,6 +21,8 @@ Settings _$SettingsFromJson(Map<String, dynamic> json) => Settings(
json['holidaysSettings'] as Map<String, dynamic>), json['holidaysSettings'] as Map<String, dynamic>),
fileViewSettings: FileViewSettings.fromJson( fileViewSettings: FileViewSettings.fromJson(
json['fileViewSettings'] as Map<String, dynamic>), json['fileViewSettings'] as Map<String, dynamic>),
notificationSettings: NotificationSettings.fromJson(
json['notificationSettings'] as Map<String, dynamic>),
); );
Map<String, dynamic> _$SettingsToJson(Settings instance) => <String, dynamic>{ Map<String, dynamic> _$SettingsToJson(Settings instance) => <String, dynamic>{
@ -32,4 +34,5 @@ Map<String, dynamic> _$SettingsToJson(Settings instance) => <String, dynamic>{
'fileSettings': instance.fileSettings.toJson(), 'fileSettings': instance.fileSettings.toJson(),
'holidaysSettings': instance.holidaysSettings.toJson(), 'holidaysSettings': instance.holidaysSettings.toJson(),
'fileViewSettings': instance.fileViewSettings.toJson(), 'fileViewSettings': instance.fileViewSettings.toJson(),
'notificationSettings': instance.notificationSettings.toJson(),
}; };

View File

@ -0,0 +1,14 @@
import 'package:json_annotation/json_annotation.dart';
part 'notificationSettings.g.dart';
@JsonSerializable()
class NotificationSettings {
bool askUsageDismissed;
bool enabled;
NotificationSettings({required this.askUsageDismissed, required this.enabled});
factory NotificationSettings.fromJson(Map<String, dynamic> json) => _$NotificationSettingsFromJson(json);
Map<String, dynamic> toJson() => _$NotificationSettingsToJson(this);
}

View File

@ -0,0 +1,21 @@
// GENERATED CODE - DO NOT MODIFY BY HAND
part of 'notificationSettings.dart';
// **************************************************************************
// JsonSerializableGenerator
// **************************************************************************
NotificationSettings _$NotificationSettingsFromJson(
Map<String, dynamic> json) =>
NotificationSettings(
askUsageDismissed: json['askUsageDismissed'] as bool,
enabled: json['enabled'] as bool,
);
Map<String, dynamic> _$NotificationSettingsToJson(
NotificationSettings instance) =>
<String, dynamic>{
'askUsageDismissed': instance.askUsageDismissed,
'enabled': instance.enabled,
};

View File

@ -1,5 +1,4 @@
import 'package:flutter/foundation.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:persistent_bottom_nav_bar/persistent_tab_view.dart'; import 'package:persistent_bottom_nav_bar/persistent_tab_view.dart';

View File

@ -1,5 +1,6 @@
import 'dart:async'; import 'dart:async';
import 'package:firebase_messaging/firebase_messaging.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:provider/provider.dart'; import 'package:provider/provider.dart';
@ -26,6 +27,8 @@ class _ChatListState extends State<ChatList> {
void initState() { void initState() {
super.initState(); super.initState();
FirebaseMessaging.instance.requestPermission();
WidgetsBinding.instance.addPostFrameCallback((timeStamp) { WidgetsBinding.instance.addPostFrameCallback((timeStamp) {
_query(); _query();
}); });

View File

@ -7,6 +7,7 @@ import '../../storage/file/fileSettings.dart';
import '../../storage/fileView/fileViewSettings.dart'; import '../../storage/fileView/fileViewSettings.dart';
import '../../storage/gradeAverages/gradeAveragesSettings.dart'; import '../../storage/gradeAverages/gradeAveragesSettings.dart';
import '../../storage/holidays/holidaysSettings.dart'; import '../../storage/holidays/holidaysSettings.dart';
import '../../storage/notification/notificationSettings.dart';
import '../../storage/talk/talkSettings.dart'; import '../../storage/talk/talkSettings.dart';
import '../../storage/timetable/timetableSettings.dart'; import '../../storage/timetable/timetableSettings.dart';
import '../pages/files/files.dart'; import '../pages/files/files.dart';
@ -39,6 +40,10 @@ class DefaultSettings {
fileViewSettings: FileViewSettings( fileViewSettings: FileViewSettings(
alwaysOpenExternally: Platform.isIOS, alwaysOpenExternally: Platform.isIOS,
), ),
notificationSettings: NotificationSettings(
askUsageDismissed: false,
enabled: false,
)
); );
} }
} }

View File

@ -7,6 +7,7 @@ import 'package:provider/provider.dart';
import 'package:shared_preferences/shared_preferences.dart'; import 'package:shared_preferences/shared_preferences.dart';
import '../../model/accountData.dart'; import '../../model/accountData.dart';
import '../../notification/notifyUpdater.dart';
import '../../storage/base/settingsProvider.dart'; import '../../storage/base/settingsProvider.dart';
import '../../theming/appTheme.dart'; import '../../theming/appTheme.dart';
import '../../widget/centeredLeading.dart'; import '../../widget/centeredLeading.dart';
@ -87,9 +88,7 @@ class _SettingsState extends State<Settings> {
), ),
)).toList(), )).toList(),
onChanged: (e) { onChanged: (e) {
setState(() { settings.val(write: true).appTheme = e!;
settings.val(write: true).appTheme = e!;
});
}, },
), ),
), ),
@ -102,9 +101,7 @@ class _SettingsState extends State<Settings> {
trailing: Checkbox( trailing: Checkbox(
value: settings.val().talkSettings.sortFavoritesToTop, value: settings.val().talkSettings.sortFavoritesToTop,
onChanged: (e) { onChanged: (e) {
setState(() { settings.val(write: true).talkSettings.sortFavoritesToTop = e!;
settings.val(write: true).talkSettings.sortFavoritesToTop = e!;
});
}, },
), ),
), ),
@ -115,9 +112,7 @@ class _SettingsState extends State<Settings> {
trailing: Checkbox( trailing: Checkbox(
value: settings.val().talkSettings.sortUnreadToTop, value: settings.val().talkSettings.sortUnreadToTop,
onChanged: (e) { onChanged: (e) {
setState(() { settings.val(write: true).talkSettings.sortUnreadToTop = e!;
settings.val(write: true).talkSettings.sortUnreadToTop = e!;
});
}, },
), ),
), ),
@ -130,9 +125,7 @@ class _SettingsState extends State<Settings> {
trailing: Checkbox( trailing: Checkbox(
value: settings.val().fileSettings.sortFoldersToTop, value: settings.val().fileSettings.sortFoldersToTop,
onChanged: (e) { onChanged: (e) {
setState(() { settings.val(write: true).fileSettings.sortFoldersToTop = e!;
settings.val(write: true).fileSettings.sortFoldersToTop = e!;
});
}, },
), ),
), ),
@ -152,6 +145,49 @@ class _SettingsState extends State<Settings> {
const Divider(), const Divider(),
ListTile(
leading: const CenteredLeading(Icon(Icons.notifications_active_outlined)),
title: const Text("Push-Benachrichtigungen aktivieren"),
subtitle: const Text("Lange tippen für mehr Informationen"),
trailing: Checkbox(
value: settings.val().notificationSettings.enabled,
onChanged: (e) {
if(e!) {
ConfirmDialog(
title: "Warnung",
icon: Icons.warning_amber,
content: ""
"Die Push-Benachrichtigungen werden durch mhsl.eu versendet.\n\n"
"Durch das aktivieren dieser Funktion wird dein Nutzername, dein Password und eine Geräte-ID von mhsl dauerhaft gespeichert und verarbeitet.\n\n"
"Für mehr Informationen drücke lange auf die Einstellungsoption!",
confirmButton: "Aktivieren",
onConfirm: () {
settings.val(write: true).notificationSettings.enabled = e;
NotifyUpdater.registerToServer();
},
).asDialog(context);
} else {
settings.val(write: true).notificationSettings.enabled = e;
}
},
),
onLongPress: () => showDialog(context: context, builder: (context) => AlertDialog(
title: const Text("Info über Push"),
content: const SingleChildScrollView(child: Text(""
"Aufgrund technischer Limitationen müssen Push-nachrichten über einen Externen Server - hier 'mhsl.eu' (Author dieser App) - erfolgen.\n\n"
"Wenn Push aktiviert wird, werden deine Zugangsdaten und ein Token verschlüsselt an den Betreiber gesendet und von ihm unverschlüsselt gespeichert.\n\n"
"Der extene Server verwendet die Zugangsdaten um sich maschinell in Nextcloud Talk anzumelden und via Websockets auf neue Nachrichten zu warten.\n\n"
"Wenn eine neue Nachricht eintrifft wird dein Telefon via FBC-Messaging (Google Firebase Push) vom Externen Server benachrichtigt.\n\n"
"Behalte im Hinterkopf, dass deine Zugangsdaten auf einem Externen Server gespeichert werden und dies trots bester Absichten ein Sicherheitsrisiko sein kann!"
)),
actions: [
TextButton(onPressed: () => Navigator.of(context).pop(), child: const Text("Zurück"))
],
)),
),
const Divider(),
ListTile( ListTile(
leading: const Icon(Icons.live_help_outlined), leading: const Icon(Icons.live_help_outlined),
title: const Text("Informationen und Lizenzen"), title: const Text("Informationen und Lizenzen"),
@ -215,9 +251,7 @@ class _SettingsState extends State<Settings> {
trailing: Checkbox( trailing: Checkbox(
value: settings.val().devToolsEnabled, value: settings.val().devToolsEnabled,
onChanged: (state) { onChanged: (state) {
changeView() => setState(() { changeView() => settings.val(write: true).devToolsEnabled = state ?? false;
settings.val(write: true).devToolsEnabled = state ?? false;
});
if(!state!) { if(!state!) {
changeView(); changeView();
@ -284,9 +318,7 @@ class _SettingsState extends State<Settings> {
content: "Alle Einstellungen gehen verloren! Accountdaten sowie App-Daten sind nicht betroffen.", content: "Alle Einstellungen gehen verloren! Accountdaten sowie App-Daten sind nicht betroffen.",
confirmButton: "Unwiederruflich Löschen", confirmButton: "Unwiederruflich Löschen",
onConfirm: () { onConfirm: () {
setState(() { Provider.of<SettingsProvider>(context, listen: false).reset();
Provider.of<SettingsProvider>(context, listen: false).reset();
});
}, },
).asDialog(context); ).asDialog(context);
}, },

View File

@ -7,6 +7,9 @@ import Foundation
import device_info_plus import device_info_plus
import file_selector_macos import file_selector_macos
import firebase_core
import firebase_messaging
import flutter_local_notifications
import package_info import package_info
import path_provider_foundation import path_provider_foundation
import shared_preferences_foundation import shared_preferences_foundation
@ -17,6 +20,9 @@ import url_launcher_macos
func RegisterGeneratedPlugins(registry: FlutterPluginRegistry) { func RegisterGeneratedPlugins(registry: FlutterPluginRegistry) {
DeviceInfoPlusMacosPlugin.register(with: registry.registrar(forPlugin: "DeviceInfoPlusMacosPlugin")) DeviceInfoPlusMacosPlugin.register(with: registry.registrar(forPlugin: "DeviceInfoPlusMacosPlugin"))
FileSelectorPlugin.register(with: registry.registrar(forPlugin: "FileSelectorPlugin")) FileSelectorPlugin.register(with: registry.registrar(forPlugin: "FileSelectorPlugin"))
FLTFirebaseCorePlugin.register(with: registry.registrar(forPlugin: "FLTFirebaseCorePlugin"))
FLTFirebaseMessagingPlugin.register(with: registry.registrar(forPlugin: "FLTFirebaseMessagingPlugin"))
FlutterLocalNotificationsPlugin.register(with: registry.registrar(forPlugin: "FlutterLocalNotificationsPlugin"))
FLTPackageInfoPlugin.register(with: registry.registrar(forPlugin: "FLTPackageInfoPlugin")) FLTPackageInfoPlugin.register(with: registry.registrar(forPlugin: "FLTPackageInfoPlugin"))
PathProviderPlugin.register(with: registry.registrar(forPlugin: "PathProviderPlugin")) PathProviderPlugin.register(with: registry.registrar(forPlugin: "PathProviderPlugin"))
SharedPreferencesPlugin.register(with: registry.registrar(forPlugin: "SharedPreferencesPlugin")) SharedPreferencesPlugin.register(with: registry.registrar(forPlugin: "SharedPreferencesPlugin"))

View File

@ -81,6 +81,11 @@ dependencies:
syncfusion_flutter_pdfviewer: ^21.2.8 syncfusion_flutter_pdfviewer: ^21.2.8
photo_view: ^0.14.0 photo_view: ^0.14.0
uuid: ^3.0.7 uuid: ^3.0.7
firebase_messaging: ^14.6.5
firebase_core: ^2.15.0
firebase_in_app_messaging: ^0.7.3+4
flutter_local_notifications: ^15.1.0+1
fluttertoast: ^8.2.2
dev_dependencies: dev_dependencies:
flutter_test: flutter_test:

View File

@ -7,12 +7,15 @@
#include "generated_plugin_registrant.h" #include "generated_plugin_registrant.h"
#include <file_selector_windows/file_selector_windows.h> #include <file_selector_windows/file_selector_windows.h>
#include <firebase_core/firebase_core_plugin_c_api.h>
#include <syncfusion_pdfviewer_windows/syncfusion_pdfviewer_windows_plugin.h> #include <syncfusion_pdfviewer_windows/syncfusion_pdfviewer_windows_plugin.h>
#include <url_launcher_windows/url_launcher_windows.h> #include <url_launcher_windows/url_launcher_windows.h>
void RegisterPlugins(flutter::PluginRegistry* registry) { void RegisterPlugins(flutter::PluginRegistry* registry) {
FileSelectorWindowsRegisterWithRegistrar( FileSelectorWindowsRegisterWithRegistrar(
registry->GetRegistrarForPlugin("FileSelectorWindows")); registry->GetRegistrarForPlugin("FileSelectorWindows"));
FirebaseCorePluginCApiRegisterWithRegistrar(
registry->GetRegistrarForPlugin("FirebaseCorePluginCApi"));
SyncfusionPdfviewerWindowsPluginRegisterWithRegistrar( SyncfusionPdfviewerWindowsPluginRegisterWithRegistrar(
registry->GetRegistrarForPlugin("SyncfusionPdfviewerWindowsPlugin")); registry->GetRegistrarForPlugin("SyncfusionPdfviewerWindowsPlugin"));
UrlLauncherWindowsRegisterWithRegistrar( UrlLauncherWindowsRegisterWithRegistrar(

View File

@ -4,6 +4,7 @@
list(APPEND FLUTTER_PLUGIN_LIST list(APPEND FLUTTER_PLUGIN_LIST
file_selector_windows file_selector_windows
firebase_core
syncfusion_pdfviewer_windows syncfusion_pdfviewer_windows
url_launcher_windows url_launcher_windows
) )