diff --git a/android/build/reports/problems/problems-report.html b/android/build/reports/problems/problems-report.html
index f85479d..e923c4a 100644
--- a/android/build/reports/problems/problems-report.html
+++ b/android/build/reports/problems/problems-report.html
@@ -650,7 +650,7 @@ code + .copy-button {
diff --git a/appimage/Extera.AppDir/bundle/data/flutter_assets/FontManifest.json b/appimage/Extera.AppDir/bundle/data/flutter_assets/FontManifest.json
index 0a1b110..9899cce 100644
--- a/appimage/Extera.AppDir/bundle/data/flutter_assets/FontManifest.json
+++ b/appimage/Extera.AppDir/bundle/data/flutter_assets/FontManifest.json
@@ -1 +1 @@
-[{"family":"MaterialIcons","fonts":[{"asset":"fonts/MaterialIcons-Regular.otf"}]},{"family":"packages/cupertino_icons/CupertinoIcons","fonts":[{"asset":"packages/cupertino_icons/assets/CupertinoIcons.ttf"}]},{"family":"packages/material/Material","fonts":[{"asset":"packages/material/lib/fonts/material.ttf"}]}]
\ No newline at end of file
+[{"family":"MaterialIcons","fonts":[{"asset":"fonts/MaterialIcons-Regular.otf"}]},{"family":"packages/material/Material","fonts":[{"asset":"packages/material/lib/fonts/material.ttf"}]},{"family":"packages/cupertino_icons/CupertinoIcons","fonts":[{"asset":"packages/cupertino_icons/assets/CupertinoIcons.ttf"}]}]
\ No newline at end of file
diff --git a/appimage/Extera.AppDir/bundle/data/flutter_assets/NOTICES.Z b/appimage/Extera.AppDir/bundle/data/flutter_assets/NOTICES.Z
index 9eb1e49..51c691b 100644
Binary files a/appimage/Extera.AppDir/bundle/data/flutter_assets/NOTICES.Z and b/appimage/Extera.AppDir/bundle/data/flutter_assets/NOTICES.Z differ
diff --git a/appimage/Extera.AppDir/bundle/extera_next b/appimage/Extera.AppDir/bundle/extera_next
index 79c7c71..fcc8c70 100755
Binary files a/appimage/Extera.AppDir/bundle/extera_next and b/appimage/Extera.AppDir/bundle/extera_next differ
diff --git a/appimage/Extera.AppDir/bundle/lib/libapp.so b/appimage/Extera.AppDir/bundle/lib/libapp.so
index cda5f16..d398166 100644
Binary files a/appimage/Extera.AppDir/bundle/lib/libapp.so and b/appimage/Extera.AppDir/bundle/lib/libapp.so differ
diff --git a/appimage/Extera.AppDir/bundle/lib/libdesktop_drop_plugin.so b/appimage/Extera.AppDir/bundle/lib/libdesktop_drop_plugin.so
index 361d4c5..0cfdc62 100644
Binary files a/appimage/Extera.AppDir/bundle/lib/libdesktop_drop_plugin.so and b/appimage/Extera.AppDir/bundle/lib/libdesktop_drop_plugin.so differ
diff --git a/appimage/Extera.AppDir/bundle/lib/libdynamic_color_plugin.so b/appimage/Extera.AppDir/bundle/lib/libdynamic_color_plugin.so
index d8d05af..0fd22d8 100644
Binary files a/appimage/Extera.AppDir/bundle/lib/libdynamic_color_plugin.so and b/appimage/Extera.AppDir/bundle/lib/libdynamic_color_plugin.so differ
diff --git a/appimage/Extera.AppDir/bundle/lib/libemoji_picker_flutter_plugin.so b/appimage/Extera.AppDir/bundle/lib/libemoji_picker_flutter_plugin.so
index 9e528a7..bebd365 100644
Binary files a/appimage/Extera.AppDir/bundle/lib/libemoji_picker_flutter_plugin.so and b/appimage/Extera.AppDir/bundle/lib/libemoji_picker_flutter_plugin.so differ
diff --git a/appimage/Extera.AppDir/bundle/lib/libfile_selector_linux_plugin.so b/appimage/Extera.AppDir/bundle/lib/libfile_selector_linux_plugin.so
index 852f7a4..5e78878 100644
Binary files a/appimage/Extera.AppDir/bundle/lib/libfile_selector_linux_plugin.so and b/appimage/Extera.AppDir/bundle/lib/libfile_selector_linux_plugin.so differ
diff --git a/appimage/Extera.AppDir/bundle/lib/libflutter_linux_gtk.so b/appimage/Extera.AppDir/bundle/lib/libflutter_linux_gtk.so
index 912e1c9..00bb1a8 100644
Binary files a/appimage/Extera.AppDir/bundle/lib/libflutter_linux_gtk.so and b/appimage/Extera.AppDir/bundle/lib/libflutter_linux_gtk.so differ
diff --git a/appimage/Extera.AppDir/bundle/lib/libflutter_secure_storage_linux_plugin.so b/appimage/Extera.AppDir/bundle/lib/libflutter_secure_storage_linux_plugin.so
index 43a82a1..4759d19 100644
Binary files a/appimage/Extera.AppDir/bundle/lib/libflutter_secure_storage_linux_plugin.so and b/appimage/Extera.AppDir/bundle/lib/libflutter_secure_storage_linux_plugin.so differ
diff --git a/appimage/Extera.AppDir/bundle/lib/libflutter_webrtc_plugin.so b/appimage/Extera.AppDir/bundle/lib/libflutter_webrtc_plugin.so
index 73de264..0135e10 100644
Binary files a/appimage/Extera.AppDir/bundle/lib/libflutter_webrtc_plugin.so and b/appimage/Extera.AppDir/bundle/lib/libflutter_webrtc_plugin.so differ
diff --git a/appimage/Extera.AppDir/bundle/lib/libgtk_plugin.so b/appimage/Extera.AppDir/bundle/lib/libgtk_plugin.so
index da7928f..da9a983 100644
Binary files a/appimage/Extera.AppDir/bundle/lib/libgtk_plugin.so and b/appimage/Extera.AppDir/bundle/lib/libgtk_plugin.so differ
diff --git a/appimage/Extera.AppDir/bundle/lib/libhandy_flutter.so b/appimage/Extera.AppDir/bundle/lib/libhandy_flutter.so
index 3007d5f..e783d91 100644
Binary files a/appimage/Extera.AppDir/bundle/lib/libhandy_flutter.so and b/appimage/Extera.AppDir/bundle/lib/libhandy_flutter.so differ
diff --git a/appimage/Extera.AppDir/bundle/lib/libhandy_window_plugin.so b/appimage/Extera.AppDir/bundle/lib/libhandy_window_plugin.so
index 3831f43..d20758a 100644
Binary files a/appimage/Extera.AppDir/bundle/lib/libhandy_window_plugin.so and b/appimage/Extera.AppDir/bundle/lib/libhandy_window_plugin.so differ
diff --git a/appimage/Extera.AppDir/bundle/lib/libpasteboard_plugin.so b/appimage/Extera.AppDir/bundle/lib/libpasteboard_plugin.so
index 55b7b3f..7f9781a 100644
Binary files a/appimage/Extera.AppDir/bundle/lib/libpasteboard_plugin.so and b/appimage/Extera.AppDir/bundle/lib/libpasteboard_plugin.so differ
diff --git a/appimage/Extera.AppDir/bundle/lib/librecord_linux_plugin.so b/appimage/Extera.AppDir/bundle/lib/librecord_linux_plugin.so
index e0b7a31..c1e1ee2 100644
Binary files a/appimage/Extera.AppDir/bundle/lib/librecord_linux_plugin.so and b/appimage/Extera.AppDir/bundle/lib/librecord_linux_plugin.so differ
diff --git a/appimage/Extera.AppDir/bundle/lib/libsqlcipher_flutter_libs_plugin.so b/appimage/Extera.AppDir/bundle/lib/libsqlcipher_flutter_libs_plugin.so
index b3a71ed..84df94e 100644
Binary files a/appimage/Extera.AppDir/bundle/lib/libsqlcipher_flutter_libs_plugin.so and b/appimage/Extera.AppDir/bundle/lib/libsqlcipher_flutter_libs_plugin.so differ
diff --git a/appimage/Extera.AppDir/bundle/lib/liburl_launcher_linux_plugin.so b/appimage/Extera.AppDir/bundle/lib/liburl_launcher_linux_plugin.so
index 91280f2..7137a19 100644
Binary files a/appimage/Extera.AppDir/bundle/lib/liburl_launcher_linux_plugin.so and b/appimage/Extera.AppDir/bundle/lib/liburl_launcher_linux_plugin.so differ
diff --git a/appimage/Extera.AppDir/bundle/lib/libvodozemac_bindings_dart.so b/appimage/Extera.AppDir/bundle/lib/libvodozemac_bindings_dart.so
index 7ba00d6..2c547ec 100644
Binary files a/appimage/Extera.AppDir/bundle/lib/libvodozemac_bindings_dart.so and b/appimage/Extera.AppDir/bundle/lib/libvodozemac_bindings_dart.so differ
diff --git a/appimage/Extera.AppDir/bundle/lib/libwindow_to_front_plugin.so b/appimage/Extera.AppDir/bundle/lib/libwindow_to_front_plugin.so
index dcb6f34..f535034 100644
Binary files a/appimage/Extera.AppDir/bundle/lib/libwindow_to_front_plugin.so and b/appimage/Extera.AppDir/bundle/lib/libwindow_to_front_plugin.so differ
diff --git a/lib/generated/l10n/l10n.dart b/lib/generated/l10n/l10n.dart
index d2d6978..0e28925 100644
--- a/lib/generated/l10n/l10n.dart
+++ b/lib/generated/l10n/l10n.dart
@@ -223,6 +223,12 @@ abstract class L10n {
/// **'Resume'**
String get resume;
+ /// No description provided for @endPoll.
+ ///
+ /// In en, this message translates to:
+ /// **'End poll'**
+ String get endPoll;
+
/// No description provided for @anonymousPoll.
///
/// In en, this message translates to:
diff --git a/lib/generated/l10n/l10n_ar.dart b/lib/generated/l10n/l10n_ar.dart
index a260522..6080152 100644
--- a/lib/generated/l10n/l10n_ar.dart
+++ b/lib/generated/l10n/l10n_ar.dart
@@ -24,6 +24,9 @@ class L10nAr extends L10n {
@override
String get resume => 'Resume';
+ @override
+ String get endPoll => 'End poll';
+
@override
String get anonymousPoll => 'Anonymous';
diff --git a/lib/generated/l10n/l10n_be.dart b/lib/generated/l10n/l10n_be.dart
index 1989195..a58e901 100644
--- a/lib/generated/l10n/l10n_be.dart
+++ b/lib/generated/l10n/l10n_be.dart
@@ -24,6 +24,9 @@ class L10nBe extends L10n {
@override
String get resume => 'Resume';
+ @override
+ String get endPoll => 'End poll';
+
@override
String get anonymousPoll => 'Anonymous';
diff --git a/lib/generated/l10n/l10n_bn.dart b/lib/generated/l10n/l10n_bn.dart
index ccf7ee8..28883f5 100644
--- a/lib/generated/l10n/l10n_bn.dart
+++ b/lib/generated/l10n/l10n_bn.dart
@@ -24,6 +24,9 @@ class L10nBn extends L10n {
@override
String get resume => 'Resume';
+ @override
+ String get endPoll => 'End poll';
+
@override
String get anonymousPoll => 'Anonymous';
diff --git a/lib/generated/l10n/l10n_bo.dart b/lib/generated/l10n/l10n_bo.dart
index 8674eba..df8ca51 100644
--- a/lib/generated/l10n/l10n_bo.dart
+++ b/lib/generated/l10n/l10n_bo.dart
@@ -24,6 +24,9 @@ class L10nBo extends L10n {
@override
String get resume => 'Resume';
+ @override
+ String get endPoll => 'End poll';
+
@override
String get anonymousPoll => 'Anonymous';
diff --git a/lib/generated/l10n/l10n_ca.dart b/lib/generated/l10n/l10n_ca.dart
index 739e2a2..7a202db 100644
--- a/lib/generated/l10n/l10n_ca.dart
+++ b/lib/generated/l10n/l10n_ca.dart
@@ -24,6 +24,9 @@ class L10nCa extends L10n {
@override
String get resume => 'Resume';
+ @override
+ String get endPoll => 'End poll';
+
@override
String get anonymousPoll => 'Anonymous';
diff --git a/lib/generated/l10n/l10n_cs.dart b/lib/generated/l10n/l10n_cs.dart
index d3c52c7..3fc13e6 100644
--- a/lib/generated/l10n/l10n_cs.dart
+++ b/lib/generated/l10n/l10n_cs.dart
@@ -24,6 +24,9 @@ class L10nCs extends L10n {
@override
String get resume => 'Resume';
+ @override
+ String get endPoll => 'End poll';
+
@override
String get anonymousPoll => 'Anonymous';
diff --git a/lib/generated/l10n/l10n_de.dart b/lib/generated/l10n/l10n_de.dart
index 35350fb..0dfe099 100644
--- a/lib/generated/l10n/l10n_de.dart
+++ b/lib/generated/l10n/l10n_de.dart
@@ -24,6 +24,9 @@ class L10nDe extends L10n {
@override
String get resume => 'Resume';
+ @override
+ String get endPoll => 'End poll';
+
@override
String get anonymousPoll => 'Anonymous';
diff --git a/lib/generated/l10n/l10n_el.dart b/lib/generated/l10n/l10n_el.dart
index 53b4c07..e62f767 100644
--- a/lib/generated/l10n/l10n_el.dart
+++ b/lib/generated/l10n/l10n_el.dart
@@ -24,6 +24,9 @@ class L10nEl extends L10n {
@override
String get resume => 'Resume';
+ @override
+ String get endPoll => 'End poll';
+
@override
String get anonymousPoll => 'Anonymous';
diff --git a/lib/generated/l10n/l10n_en.dart b/lib/generated/l10n/l10n_en.dart
index b9b592d..f6b2d1f 100644
--- a/lib/generated/l10n/l10n_en.dart
+++ b/lib/generated/l10n/l10n_en.dart
@@ -24,6 +24,9 @@ class L10nEn extends L10n {
@override
String get resume => 'Resume';
+ @override
+ String get endPoll => 'End poll';
+
@override
String get anonymousPoll => 'Anonymous';
diff --git a/lib/generated/l10n/l10n_eo.dart b/lib/generated/l10n/l10n_eo.dart
index fa30748..f9194f8 100644
--- a/lib/generated/l10n/l10n_eo.dart
+++ b/lib/generated/l10n/l10n_eo.dart
@@ -24,6 +24,9 @@ class L10nEo extends L10n {
@override
String get resume => 'Resume';
+ @override
+ String get endPoll => 'End poll';
+
@override
String get anonymousPoll => 'Anonymous';
diff --git a/lib/generated/l10n/l10n_es.dart b/lib/generated/l10n/l10n_es.dart
index 2870ed1..330336c 100644
--- a/lib/generated/l10n/l10n_es.dart
+++ b/lib/generated/l10n/l10n_es.dart
@@ -24,6 +24,9 @@ class L10nEs extends L10n {
@override
String get resume => 'Resume';
+ @override
+ String get endPoll => 'End poll';
+
@override
String get anonymousPoll => 'Anonymous';
diff --git a/lib/generated/l10n/l10n_et.dart b/lib/generated/l10n/l10n_et.dart
index a98a50b..1f69070 100644
--- a/lib/generated/l10n/l10n_et.dart
+++ b/lib/generated/l10n/l10n_et.dart
@@ -24,6 +24,9 @@ class L10nEt extends L10n {
@override
String get resume => 'Resume';
+ @override
+ String get endPoll => 'End poll';
+
@override
String get anonymousPoll => 'Anonymous';
diff --git a/lib/generated/l10n/l10n_eu.dart b/lib/generated/l10n/l10n_eu.dart
index 0f853ce..52e8d1d 100644
--- a/lib/generated/l10n/l10n_eu.dart
+++ b/lib/generated/l10n/l10n_eu.dart
@@ -24,6 +24,9 @@ class L10nEu extends L10n {
@override
String get resume => 'Resume';
+ @override
+ String get endPoll => 'End poll';
+
@override
String get anonymousPoll => 'Anonymous';
diff --git a/lib/generated/l10n/l10n_fa.dart b/lib/generated/l10n/l10n_fa.dart
index 045c48b..afb64a9 100644
--- a/lib/generated/l10n/l10n_fa.dart
+++ b/lib/generated/l10n/l10n_fa.dart
@@ -24,6 +24,9 @@ class L10nFa extends L10n {
@override
String get resume => 'Resume';
+ @override
+ String get endPoll => 'End poll';
+
@override
String get anonymousPoll => 'Anonymous';
diff --git a/lib/generated/l10n/l10n_fi.dart b/lib/generated/l10n/l10n_fi.dart
index c7b1f8c..c71cbe5 100644
--- a/lib/generated/l10n/l10n_fi.dart
+++ b/lib/generated/l10n/l10n_fi.dart
@@ -24,6 +24,9 @@ class L10nFi extends L10n {
@override
String get resume => 'Resume';
+ @override
+ String get endPoll => 'End poll';
+
@override
String get anonymousPoll => 'Anonymous';
diff --git a/lib/generated/l10n/l10n_fil.dart b/lib/generated/l10n/l10n_fil.dart
index b656f3f..1429a9c 100644
--- a/lib/generated/l10n/l10n_fil.dart
+++ b/lib/generated/l10n/l10n_fil.dart
@@ -24,6 +24,9 @@ class L10nFil extends L10n {
@override
String get resume => 'Resume';
+ @override
+ String get endPoll => 'End poll';
+
@override
String get anonymousPoll => 'Anonymous';
diff --git a/lib/generated/l10n/l10n_fr.dart b/lib/generated/l10n/l10n_fr.dart
index dbf78eb..5602fbf 100644
--- a/lib/generated/l10n/l10n_fr.dart
+++ b/lib/generated/l10n/l10n_fr.dart
@@ -24,6 +24,9 @@ class L10nFr extends L10n {
@override
String get resume => 'Resume';
+ @override
+ String get endPoll => 'End poll';
+
@override
String get anonymousPoll => 'Anonymous';
diff --git a/lib/generated/l10n/l10n_ga.dart b/lib/generated/l10n/l10n_ga.dart
index b0af7e2..131fcd2 100644
--- a/lib/generated/l10n/l10n_ga.dart
+++ b/lib/generated/l10n/l10n_ga.dart
@@ -24,6 +24,9 @@ class L10nGa extends L10n {
@override
String get resume => 'Resume';
+ @override
+ String get endPoll => 'End poll';
+
@override
String get anonymousPoll => 'Anonymous';
diff --git a/lib/generated/l10n/l10n_gl.dart b/lib/generated/l10n/l10n_gl.dart
index 0b2348d..01ae489 100644
--- a/lib/generated/l10n/l10n_gl.dart
+++ b/lib/generated/l10n/l10n_gl.dart
@@ -24,6 +24,9 @@ class L10nGl extends L10n {
@override
String get resume => 'Resume';
+ @override
+ String get endPoll => 'End poll';
+
@override
String get anonymousPoll => 'Anonymous';
diff --git a/lib/generated/l10n/l10n_he.dart b/lib/generated/l10n/l10n_he.dart
index bc07521..7db68b8 100644
--- a/lib/generated/l10n/l10n_he.dart
+++ b/lib/generated/l10n/l10n_he.dart
@@ -24,6 +24,9 @@ class L10nHe extends L10n {
@override
String get resume => 'Resume';
+ @override
+ String get endPoll => 'End poll';
+
@override
String get anonymousPoll => 'Anonymous';
diff --git a/lib/generated/l10n/l10n_hi.dart b/lib/generated/l10n/l10n_hi.dart
index 32aee05..bf68016 100644
--- a/lib/generated/l10n/l10n_hi.dart
+++ b/lib/generated/l10n/l10n_hi.dart
@@ -24,6 +24,9 @@ class L10nHi extends L10n {
@override
String get resume => 'Resume';
+ @override
+ String get endPoll => 'End poll';
+
@override
String get anonymousPoll => 'Anonymous';
diff --git a/lib/generated/l10n/l10n_hr.dart b/lib/generated/l10n/l10n_hr.dart
index f34a661..1e8145d 100644
--- a/lib/generated/l10n/l10n_hr.dart
+++ b/lib/generated/l10n/l10n_hr.dart
@@ -24,6 +24,9 @@ class L10nHr extends L10n {
@override
String get resume => 'Resume';
+ @override
+ String get endPoll => 'End poll';
+
@override
String get anonymousPoll => 'Anonymous';
diff --git a/lib/generated/l10n/l10n_hu.dart b/lib/generated/l10n/l10n_hu.dart
index c25d3f7..410e9e0 100644
--- a/lib/generated/l10n/l10n_hu.dart
+++ b/lib/generated/l10n/l10n_hu.dart
@@ -24,6 +24,9 @@ class L10nHu extends L10n {
@override
String get resume => 'Resume';
+ @override
+ String get endPoll => 'End poll';
+
@override
String get anonymousPoll => 'Anonymous';
diff --git a/lib/generated/l10n/l10n_ia.dart b/lib/generated/l10n/l10n_ia.dart
index 12ed28b..5be8d93 100644
--- a/lib/generated/l10n/l10n_ia.dart
+++ b/lib/generated/l10n/l10n_ia.dart
@@ -24,6 +24,9 @@ class L10nIa extends L10n {
@override
String get resume => 'Resume';
+ @override
+ String get endPoll => 'End poll';
+
@override
String get anonymousPoll => 'Anonymous';
diff --git a/lib/generated/l10n/l10n_id.dart b/lib/generated/l10n/l10n_id.dart
index f945a2d..7075f65 100644
--- a/lib/generated/l10n/l10n_id.dart
+++ b/lib/generated/l10n/l10n_id.dart
@@ -24,6 +24,9 @@ class L10nId extends L10n {
@override
String get resume => 'Resume';
+ @override
+ String get endPoll => 'End poll';
+
@override
String get anonymousPoll => 'Anonymous';
diff --git a/lib/generated/l10n/l10n_ie.dart b/lib/generated/l10n/l10n_ie.dart
index e16c06c..e455c13 100644
--- a/lib/generated/l10n/l10n_ie.dart
+++ b/lib/generated/l10n/l10n_ie.dart
@@ -24,6 +24,9 @@ class L10nIe extends L10n {
@override
String get resume => 'Resume';
+ @override
+ String get endPoll => 'End poll';
+
@override
String get anonymousPoll => 'Anonymous';
diff --git a/lib/generated/l10n/l10n_it.dart b/lib/generated/l10n/l10n_it.dart
index b36a90d..3edf595 100644
--- a/lib/generated/l10n/l10n_it.dart
+++ b/lib/generated/l10n/l10n_it.dart
@@ -24,6 +24,9 @@ class L10nIt extends L10n {
@override
String get resume => 'Resume';
+ @override
+ String get endPoll => 'End poll';
+
@override
String get anonymousPoll => 'Anonymous';
diff --git a/lib/generated/l10n/l10n_ja.dart b/lib/generated/l10n/l10n_ja.dart
index 1419431..5c0b0b9 100644
--- a/lib/generated/l10n/l10n_ja.dart
+++ b/lib/generated/l10n/l10n_ja.dart
@@ -24,6 +24,9 @@ class L10nJa extends L10n {
@override
String get resume => 'Resume';
+ @override
+ String get endPoll => 'End poll';
+
@override
String get anonymousPoll => 'Anonymous';
diff --git a/lib/generated/l10n/l10n_ka.dart b/lib/generated/l10n/l10n_ka.dart
index cd929d1..b14cf51 100644
--- a/lib/generated/l10n/l10n_ka.dart
+++ b/lib/generated/l10n/l10n_ka.dart
@@ -24,6 +24,9 @@ class L10nKa extends L10n {
@override
String get resume => 'Resume';
+ @override
+ String get endPoll => 'End poll';
+
@override
String get anonymousPoll => 'Anonymous';
diff --git a/lib/generated/l10n/l10n_ko.dart b/lib/generated/l10n/l10n_ko.dart
index 65859ff..987d15b 100644
--- a/lib/generated/l10n/l10n_ko.dart
+++ b/lib/generated/l10n/l10n_ko.dart
@@ -24,6 +24,9 @@ class L10nKo extends L10n {
@override
String get resume => 'Resume';
+ @override
+ String get endPoll => 'End poll';
+
@override
String get anonymousPoll => 'Anonymous';
diff --git a/lib/generated/l10n/l10n_lt.dart b/lib/generated/l10n/l10n_lt.dart
index 7b19433..ac83bb7 100644
--- a/lib/generated/l10n/l10n_lt.dart
+++ b/lib/generated/l10n/l10n_lt.dart
@@ -24,6 +24,9 @@ class L10nLt extends L10n {
@override
String get resume => 'Resume';
+ @override
+ String get endPoll => 'End poll';
+
@override
String get anonymousPoll => 'Anonymous';
diff --git a/lib/generated/l10n/l10n_lv.dart b/lib/generated/l10n/l10n_lv.dart
index 085978b..1c846be 100644
--- a/lib/generated/l10n/l10n_lv.dart
+++ b/lib/generated/l10n/l10n_lv.dart
@@ -24,6 +24,9 @@ class L10nLv extends L10n {
@override
String get resume => 'Resume';
+ @override
+ String get endPoll => 'End poll';
+
@override
String get anonymousPoll => 'Anonymous';
diff --git a/lib/generated/l10n/l10n_nb.dart b/lib/generated/l10n/l10n_nb.dart
index c686acf..46d562b 100644
--- a/lib/generated/l10n/l10n_nb.dart
+++ b/lib/generated/l10n/l10n_nb.dart
@@ -24,6 +24,9 @@ class L10nNb extends L10n {
@override
String get resume => 'Resume';
+ @override
+ String get endPoll => 'End poll';
+
@override
String get anonymousPoll => 'Anonymous';
diff --git a/lib/generated/l10n/l10n_nl.dart b/lib/generated/l10n/l10n_nl.dart
index 596e4df..515d851 100644
--- a/lib/generated/l10n/l10n_nl.dart
+++ b/lib/generated/l10n/l10n_nl.dart
@@ -24,6 +24,9 @@ class L10nNl extends L10n {
@override
String get resume => 'Resume';
+ @override
+ String get endPoll => 'End poll';
+
@override
String get anonymousPoll => 'Anonymous';
diff --git a/lib/generated/l10n/l10n_pl.dart b/lib/generated/l10n/l10n_pl.dart
index f8b0cd6..bd7c434 100644
--- a/lib/generated/l10n/l10n_pl.dart
+++ b/lib/generated/l10n/l10n_pl.dart
@@ -24,6 +24,9 @@ class L10nPl extends L10n {
@override
String get resume => 'Resume';
+ @override
+ String get endPoll => 'End poll';
+
@override
String get anonymousPoll => 'Anonymous';
diff --git a/lib/generated/l10n/l10n_pt.dart b/lib/generated/l10n/l10n_pt.dart
index df06a56..dec34b1 100644
--- a/lib/generated/l10n/l10n_pt.dart
+++ b/lib/generated/l10n/l10n_pt.dart
@@ -24,6 +24,9 @@ class L10nPt extends L10n {
@override
String get resume => 'Resume';
+ @override
+ String get endPoll => 'End poll';
+
@override
String get anonymousPoll => 'Anonymous';
diff --git a/lib/generated/l10n/l10n_ro.dart b/lib/generated/l10n/l10n_ro.dart
index 5faa460..bee47b5 100644
--- a/lib/generated/l10n/l10n_ro.dart
+++ b/lib/generated/l10n/l10n_ro.dart
@@ -24,6 +24,9 @@ class L10nRo extends L10n {
@override
String get resume => 'Resume';
+ @override
+ String get endPoll => 'End poll';
+
@override
String get anonymousPoll => 'Anonymous';
diff --git a/lib/generated/l10n/l10n_ru.dart b/lib/generated/l10n/l10n_ru.dart
index 3b8ca56..6185935 100644
--- a/lib/generated/l10n/l10n_ru.dart
+++ b/lib/generated/l10n/l10n_ru.dart
@@ -24,6 +24,9 @@ class L10nRu extends L10n {
@override
String get resume => 'Продолжить';
+ @override
+ String get endPoll => 'Завершить опрос';
+
@override
String get anonymousPoll => 'Анонимный';
diff --git a/lib/generated/l10n/l10n_sk.dart b/lib/generated/l10n/l10n_sk.dart
index dddf31b..ccf70fd 100644
--- a/lib/generated/l10n/l10n_sk.dart
+++ b/lib/generated/l10n/l10n_sk.dart
@@ -24,6 +24,9 @@ class L10nSk extends L10n {
@override
String get resume => 'Resume';
+ @override
+ String get endPoll => 'End poll';
+
@override
String get anonymousPoll => 'Anonymous';
diff --git a/lib/generated/l10n/l10n_sl.dart b/lib/generated/l10n/l10n_sl.dart
index 62c43a3..77b0bb6 100644
--- a/lib/generated/l10n/l10n_sl.dart
+++ b/lib/generated/l10n/l10n_sl.dart
@@ -24,6 +24,9 @@ class L10nSl extends L10n {
@override
String get resume => 'Resume';
+ @override
+ String get endPoll => 'End poll';
+
@override
String get anonymousPoll => 'Anonymous';
diff --git a/lib/generated/l10n/l10n_sr.dart b/lib/generated/l10n/l10n_sr.dart
index aef4655..9dcd3ed 100644
--- a/lib/generated/l10n/l10n_sr.dart
+++ b/lib/generated/l10n/l10n_sr.dart
@@ -24,6 +24,9 @@ class L10nSr extends L10n {
@override
String get resume => 'Resume';
+ @override
+ String get endPoll => 'End poll';
+
@override
String get anonymousPoll => 'Anonymous';
diff --git a/lib/generated/l10n/l10n_sv.dart b/lib/generated/l10n/l10n_sv.dart
index 2e2bdc0..114a14c 100644
--- a/lib/generated/l10n/l10n_sv.dart
+++ b/lib/generated/l10n/l10n_sv.dart
@@ -24,6 +24,9 @@ class L10nSv extends L10n {
@override
String get resume => 'Resume';
+ @override
+ String get endPoll => 'End poll';
+
@override
String get anonymousPoll => 'Anonymous';
diff --git a/lib/generated/l10n/l10n_ta.dart b/lib/generated/l10n/l10n_ta.dart
index 9ab887d..23b7602 100644
--- a/lib/generated/l10n/l10n_ta.dart
+++ b/lib/generated/l10n/l10n_ta.dart
@@ -24,6 +24,9 @@ class L10nTa extends L10n {
@override
String get resume => 'Resume';
+ @override
+ String get endPoll => 'End poll';
+
@override
String get anonymousPoll => 'Anonymous';
diff --git a/lib/generated/l10n/l10n_te.dart b/lib/generated/l10n/l10n_te.dart
index 380552f..394e118 100644
--- a/lib/generated/l10n/l10n_te.dart
+++ b/lib/generated/l10n/l10n_te.dart
@@ -24,6 +24,9 @@ class L10nTe extends L10n {
@override
String get resume => 'Resume';
+ @override
+ String get endPoll => 'End poll';
+
@override
String get anonymousPoll => 'Anonymous';
diff --git a/lib/generated/l10n/l10n_th.dart b/lib/generated/l10n/l10n_th.dart
index 252d7d1..60b3fb7 100644
--- a/lib/generated/l10n/l10n_th.dart
+++ b/lib/generated/l10n/l10n_th.dart
@@ -24,6 +24,9 @@ class L10nTh extends L10n {
@override
String get resume => 'Resume';
+ @override
+ String get endPoll => 'End poll';
+
@override
String get anonymousPoll => 'Anonymous';
diff --git a/lib/generated/l10n/l10n_tr.dart b/lib/generated/l10n/l10n_tr.dart
index f85d2fb..b3672ae 100644
--- a/lib/generated/l10n/l10n_tr.dart
+++ b/lib/generated/l10n/l10n_tr.dart
@@ -24,6 +24,9 @@ class L10nTr extends L10n {
@override
String get resume => 'Resume';
+ @override
+ String get endPoll => 'End poll';
+
@override
String get anonymousPoll => 'Anonymous';
diff --git a/lib/generated/l10n/l10n_uk.dart b/lib/generated/l10n/l10n_uk.dart
index edc438f..94f5d9d 100644
--- a/lib/generated/l10n/l10n_uk.dart
+++ b/lib/generated/l10n/l10n_uk.dart
@@ -24,6 +24,9 @@ class L10nUk extends L10n {
@override
String get resume => 'Resume';
+ @override
+ String get endPoll => 'End poll';
+
@override
String get anonymousPoll => 'Anonymous';
diff --git a/lib/generated/l10n/l10n_vi.dart b/lib/generated/l10n/l10n_vi.dart
index 91a6dab..be90270 100644
--- a/lib/generated/l10n/l10n_vi.dart
+++ b/lib/generated/l10n/l10n_vi.dart
@@ -24,6 +24,9 @@ class L10nVi extends L10n {
@override
String get resume => 'Resume';
+ @override
+ String get endPoll => 'End poll';
+
@override
String get anonymousPoll => 'Anonymous';
diff --git a/lib/generated/l10n/l10n_zh.dart b/lib/generated/l10n/l10n_zh.dart
index daa16c6..3bdf92f 100644
--- a/lib/generated/l10n/l10n_zh.dart
+++ b/lib/generated/l10n/l10n_zh.dart
@@ -24,6 +24,9 @@ class L10nZh extends L10n {
@override
String get resume => 'Resume';
+ @override
+ String get endPoll => 'End poll';
+
@override
String get anonymousPoll => 'Anonymous';
diff --git a/lib/pages/chat/events/poll_content.dart b/lib/pages/chat/events/poll_content.dart
index bfe9ff9..579f63e 100644
--- a/lib/pages/chat/events/poll_content.dart
+++ b/lib/pages/chat/events/poll_content.dart
@@ -1,5 +1,6 @@
import 'package:extera_next/generated/l10n/l10n.dart';
import 'package:extera_next/utils/poll_events.dart';
+import 'package:extera_next/widgets/matrix.dart';
import 'package:flutter/material.dart';
import 'package:matrix/matrix.dart';
@@ -29,6 +30,7 @@ class PollWidgetState extends State {
Map? pollResults;
bool hasVoted = false;
bool isLoading = false;
+ bool hasEnded = false;
@override
void initState() {
@@ -38,8 +40,7 @@ class PollWidgetState extends State {
void _loadPollData() {
final event = widget.event;
- final content =
- event.content[PollEvents.PollStart] as Map;
+ final content = event.content[PollEvents.PollStart] as Map;
// Check if user has already voted
_checkExistingVote();
@@ -51,47 +52,49 @@ class PollWidgetState extends State {
}
}
- void _checkExistingVote() {
+ void _checkExistingVote() async {
final room = widget.event.room;
final currentUserId = room.client.userID;
-
+ final rel = await Matrix.of(context)
+ .client
+ .getRelatingEventsWithRelTypeAndEventType(room.id, widget.event.eventId,
+ "m.reference", "org.matrix.msc3381.poll.response");
- // Find existing poll response events from current user
- final responses = widget.timeline!.events.where((e) {
- return e.type == 'org.matrix.msc3381.poll.response' &&
- e.senderId == currentUserId &&
- e.relationshipEventId == widget.event.eventId;
- }).toList();
+ // Get all poll response events for this poll
+ final responses = rel.chunk;
if (responses.isNotEmpty) {
// Use the latest response
- final latestResponse = responses.last;
- final responseContent = latestResponse
- .content['org.matrix.msc3381.poll.response'] as Map;
- if (responseContent != null) {
- final List answers = responseContent['answers'];
- setState(() {
- selectedAnswers = answers.cast();
- originalVote = List.from(answers.cast()); // Store original vote
- hasVoted = true;
- });
+ for (final response in responses) {
+ final responseContent =
+ response.content['org.matrix.msc3381.poll.response']
+ as Map;
+ if (responseContent != null && response.senderId == currentUserId) {
+ final List answers = responseContent['answers'];
+ setState(() {
+ selectedAnswers = answers.cast();
+ originalVote =
+ List.from(answers.cast()); // Store original vote
+ hasVoted = true;
+ });
+ }
}
}
}
- void _calculateResults() {
+ void _calculateResults() async {
final room = widget.event.room;
final pollEventId = widget.event.eventId;
final results = {};
-
+ final rel = await Matrix.of(context)
+ .client
+ .getRelatingEventsWithRelTypeAndEventType(room.id, pollEventId,
+ "m.reference", "org.matrix.msc3381.poll.response");
// Get all poll response events for this poll
- final responses = widget.timeline!.events.where((e) {
- return e.type == 'org.matrix.msc3381.poll.response' &&
- e.relationshipEventId == pollEventId;
- }).toList();
+ final responses = rel.chunk;
// Count votes for each answer
for (final response in responses) {
@@ -121,18 +124,15 @@ class PollWidgetState extends State {
final room = widget.event.room;
// Send poll response event
- await room.sendEvent(
- {
- 'm.relates_to': {
- 'rel_type': 'm.reference',
- 'event_id': widget.event.eventId,
- },
- 'org.matrix.msc3381.poll.response': {
- 'answers': answers,
- },
+ await room.sendEvent({
+ 'm.relates_to': {
+ 'rel_type': 'm.reference',
+ 'event_id': widget.event.eventId,
},
- type: 'org.matrix.msc3381.poll.response'
- );
+ 'org.matrix.msc3381.poll.response': {
+ 'answers': answers,
+ },
+ }, type: 'org.matrix.msc3381.poll.response');
setState(() {
selectedAnswers = answers;
@@ -206,30 +206,35 @@ class PollWidgetState extends State {
final isDisclosed = kind == 'org.matrix.msc3381.disclosed';
final isEnded = _isPollEnded();
- return isDisclosed || isEnded || hasVoted;
+ return isDisclosed ? (isEnded || hasVoted) : isEnded;
}
double _getAnswerPercentage(String answerId) {
if (pollResults == null || pollResults!.isEmpty) return 0.0;
-
final totalVotes = pollResults!.values.reduce((a, b) => a + b);
if (totalVotes == 0) return 0.0;
- return pollResults![answerId]?.toDouble() ?? 0 / totalVotes.toDouble();
+ // if (_shouldShowResults()) {
+ // Logs().w("Get answer percentage for $answerId");
+ // Logs().w(pollResults.toString());
+ // Logs().w("${pollResults![answerId]?.toDouble() ?? 0} / $totalVotes");
+ // }
+
+ return (pollResults![answerId]?.toDouble() ?? 0) / totalVotes.toDouble();
}
// Check if the current selection is different from the original vote
bool _hasSelectionChanged() {
if (selectedAnswers.length != originalVote.length) return true;
-
+
// Sort both lists to compare regardless of order
final sortedSelected = List.from(selectedAnswers)..sort();
final sortedOriginal = List.from(originalVote)..sort();
-
+
for (int i = 0; i < sortedSelected.length; i++) {
if (sortedSelected[i] != sortedOriginal[i]) return true;
}
-
+
return false;
}
@@ -364,7 +369,9 @@ class PollWidgetState extends State {
height: 16,
child: CircularProgressIndicator(strokeWidth: 2),
)
- : Text(hasVoted ? L10n.of(context).changeVote : L10n.of(context).vote),
+ : Text(hasVoted
+ ? L10n.of(context).changeVote
+ : L10n.of(context).vote),
),
const Spacer(),
@@ -386,7 +393,8 @@ class PollWidgetState extends State {
Padding(
padding: const EdgeInsets.only(top: 8),
child: Text(
- L10n.of(context).choicesSelected(selectedAnswers.length, maxSelections),
+ L10n.of(context)
+ .choicesSelected(selectedAnswers.length, maxSelections),
style: TextStyle(
fontSize: widget.fontSize - 2,
color: widget.color.withOpacity(0.6),
@@ -397,4 +405,4 @@ class PollWidgetState extends State {
),
);
}
-}
\ No newline at end of file
+}