From 072564fd3127c5fa8b8edce5f99f194440394ade Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Elias=20M=C3=BCller?= <elias@elias-mueller.com>
Date: Sun, 11 Jun 2023 15:57:40 +0200
Subject: [PATCH] Added uniform loading indicator for all screens

---
 android/.idea/gradle.xml                      | 15 ++++---
 android/.idea/jarRepositories.xml             |  4 +-
 android/.idea/kotlinc.xml                     |  2 +-
 android/.idea/workspace.xml                   | 17 ++++---
 lib/view/pages/files/files.dart               |  3 +-
 lib/view/pages/more/message/message.dart      |  3 +-
 lib/view/pages/talk/chatList.dart             |  5 +--
 lib/view/pages/talk/chatView.dart             |  3 +-
 lib/view/pages/timetable/timetable.dart       |  3 +-
 lib/widget/loadingSpinner.dart                | 44 ++++++++++++++-----
 linux/flutter/generated_plugin_registrant.cc  |  4 ++
 linux/flutter/generated_plugins.cmake         |  1 +
 macos/Flutter/GeneratedPluginRegistrant.swift |  2 +
 pubspec.yaml                                  |  2 +-
 .../flutter/generated_plugin_registrant.cc    |  3 ++
 windows/flutter/generated_plugins.cmake       |  1 +
 16 files changed, 76 insertions(+), 36 deletions(-)

diff --git a/android/.idea/gradle.xml b/android/.idea/gradle.xml
index 8e3b1a8..0bc0df2 100644
--- a/android/.idea/gradle.xml
+++ b/android/.idea/gradle.xml
@@ -9,14 +9,17 @@
         <option name="modules">
           <set>
             <option value="$USER_HOME$/.pub-cache/hosted/pub.dev/better_open_file-3.6.4/android" />
-            <option value="$USER_HOME$/.pub-cache/hosted/pub.dev/file_picker-5.2.11/android" />
-            <option value="$USER_HOME$/.pub-cache/hosted/pub.dev/flutter_native_splash-2.2.19/android" />
-            <option value="$USER_HOME$/.pub-cache/hosted/pub.dev/flutter_plugin_android_lifecycle-2.0.14/android" />
-            <option value="$USER_HOME$/.pub-cache/hosted/pub.dev/image_picker_android-0.8.6+11/android" />
+            <option value="$USER_HOME$/.pub-cache/hosted/pub.dev/device_info_plus-8.2.2/android" />
+            <option value="$USER_HOME$/.pub-cache/hosted/pub.dev/file_picker-5.3.1/android" />
+            <option value="$USER_HOME$/.pub-cache/hosted/pub.dev/flutter_native_splash-2.3.0/android" />
+            <option value="$USER_HOME$/.pub-cache/hosted/pub.dev/flutter_plugin_android_lifecycle-2.0.15/android" />
+            <option value="$USER_HOME$/.pub-cache/hosted/pub.dev/image_picker_android-0.8.6+17/android" />
+            <option value="$USER_HOME$/.pub-cache/hosted/pub.dev/package_info-2.0.2/android" />
             <option value="$USER_HOME$/.pub-cache/hosted/pub.dev/path_provider_android-2.0.27/android" />
             <option value="$USER_HOME$/.pub-cache/hosted/pub.dev/shared_preferences_android-2.1.4/android" />
-            <option value="$USER_HOME$/.pub-cache/hosted/pub.dev/sqflite-2.2.8+1/android" />
-            <option value="$USER_HOME$/.pub-cache/hosted/pub.dev/url_launcher_android-6.0.31/android" />
+            <option value="$USER_HOME$/.pub-cache/hosted/pub.dev/sqflite-2.2.8+4/android" />
+            <option value="$USER_HOME$/.pub-cache/hosted/pub.dev/syncfusion_flutter_pdfviewer-21.2.8/android" />
+            <option value="$USER_HOME$/.pub-cache/hosted/pub.dev/url_launcher_android-6.0.35/android" />
             <option value="$PROJECT_DIR$" />
             <option value="$PROJECT_DIR$/app" />
           </set>
diff --git a/android/.idea/jarRepositories.xml b/android/.idea/jarRepositories.xml
index 7a35ca4..aea0c22 100644
--- a/android/.idea/jarRepositories.xml
+++ b/android/.idea/jarRepositories.xml
@@ -17,8 +17,8 @@
       <option name="url" value="https://repo.maven.apache.org/maven2/" />
     </remote-repository>
     <remote-repository>
-      <option name="id" value="Google9" />
-      <option name="name" value="Google9" />
+      <option name="id" value="Google8" />
+      <option name="name" value="Google8" />
       <option name="url" value="https://dl.google.com/dl/android/maven2/" />
     </remote-repository>
     <remote-repository>
diff --git a/android/.idea/kotlinc.xml b/android/.idea/kotlinc.xml
index 4515aa3..4251b72 100644
--- a/android/.idea/kotlinc.xml
+++ b/android/.idea/kotlinc.xml
@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <project version="4">
   <component name="KotlinJpsPluginSettings">
-    <option name="version" value="1.6.10" />
+    <option name="version" value="1.7.22" />
   </component>
 </project>
\ No newline at end of file
diff --git a/android/.idea/workspace.xml b/android/.idea/workspace.xml
index 5534c9c..ac18d62 100644
--- a/android/.idea/workspace.xml
+++ b/android/.idea/workspace.xml
@@ -4,18 +4,19 @@
     <option name="autoReloadType" value="NONE" />
   </component>
   <component name="ChangeListManager">
-    <list default="true" id="55523c1b-a651-4ecd-b499-9518606f9735" name="Changes" comment="">
-      <change beforePath="$PROJECT_DIR$/../.idea/libraries/Dart_Packages.xml" beforeDir="false" afterPath="$PROJECT_DIR$/../.idea/libraries/Dart_Packages.xml" afterDir="false" />
+    <list default="true" id="3a85c1e5-8060-4ece-92bb-103238b65897" name="Changes" comment="">
       <change beforePath="$PROJECT_DIR$/.idea/gradle.xml" beforeDir="false" afterPath="$PROJECT_DIR$/.idea/gradle.xml" afterDir="false" />
       <change beforePath="$PROJECT_DIR$/.idea/jarRepositories.xml" beforeDir="false" afterPath="$PROJECT_DIR$/.idea/jarRepositories.xml" afterDir="false" />
+      <change beforePath="$PROJECT_DIR$/.idea/kotlinc.xml" beforeDir="false" afterPath="$PROJECT_DIR$/.idea/kotlinc.xml" afterDir="false" />
       <change beforePath="$PROJECT_DIR$/.idea/workspace.xml" beforeDir="false" afterPath="$PROJECT_DIR$/.idea/workspace.xml" afterDir="false" />
+      <change beforePath="$PROJECT_DIR$/../pubspec.yaml" beforeDir="false" afterPath="$PROJECT_DIR$/../pubspec.yaml" afterDir="false" />
     </list>
     <option name="SHOW_DIALOG" value="false" />
     <option name="HIGHLIGHT_CONFLICTS" value="true" />
     <option name="HIGHLIGHT_NON_ACTIVE_CHANGELIST" value="false" />
     <option name="LAST_RESOLUTION" value="IGNORE" />
   </component>
-  <component name="ExecutionTargetManager" SELECTED_TARGET="device_and_snapshot_combo_box_target[/home/elias/.android/avd/Pixel_XL_API_30.avd]" />
+  <component name="ExecutionTargetManager" SELECTED_TARGET="device_and_snapshot_combo_box_target[/home/elias/.android/avd/Nexus_10_API_30.avd]" />
   <component name="ExternalProjectsData">
     <projectState path="$PROJECT_DIR$">
       <ProjectState />
@@ -29,7 +30,7 @@
   <component name="Git.Settings">
     <option name="RECENT_GIT_ROOT_PATH" value="$PROJECT_DIR$/.." />
   </component>
-  <component name="ProjectId" id="2PQt9ih7RXI4ANibeGG9zQL3kSX" />
+  <component name="ProjectId" id="2QyvXwW5ikwP9uWcseM58nPLgSu" />
   <component name="ProjectLevelVcsManager" settingsEditedManually="true" />
   <component name="ProjectViewState">
     <option name="hideEmptyMiddlePackages" value="true" />
@@ -39,6 +40,8 @@
   "keyToString": {
     "BundleExportedModule": "android.app",
     "ExportBundle.BundlePathForandroid.app": "/home/elias/projects/MarianumMobile/Client/android/app",
+    "RunOnceActivity.OpenProjectViewOnStart": "true",
+    "RunOnceActivity.ShowReadmeOnStart": "true",
     "RunOnceActivity.cidr.known.project.marker": "true",
     "cidr.known.project.marker": "true",
     "dart.analysis.tool.window.visible": "false",
@@ -114,11 +117,11 @@
   <component name="SpellCheckerSettings" RuntimeDictionaries="0" Folders="0" CustomDictionaries="0" DefaultDictionary="application-level" UseSingleDictionary="true" transferred="true" />
   <component name="TaskManager">
     <task active="true" id="Default" summary="Default task">
-      <changelist id="55523c1b-a651-4ecd-b499-9518606f9735" name="Changes" comment="" />
-      <created>1683400983746</created>
+      <changelist id="3a85c1e5-8060-4ece-92bb-103238b65897" name="Changes" comment="" />
+      <created>1686338678988</created>
       <option name="number" value="Default" />
       <option name="presentableId" value="Default" />
-      <updated>1683400983746</updated>
+      <updated>1686338678988</updated>
     </task>
     <servers />
   </component>
diff --git a/lib/view/pages/files/files.dart b/lib/view/pages/files/files.dart
index 4475b42..f42abb7 100644
--- a/lib/view/pages/files/files.dart
+++ b/lib/view/pages/files/files.dart
@@ -5,6 +5,7 @@ import 'dart:io';
 import 'package:flutter/material.dart';
 import 'package:loader_overlay/loader_overlay.dart';
 import 'package:marianum_mobile/storage/base/settingsProvider.dart';
+import 'package:marianum_mobile/widget/loadingSpinner.dart';
 import 'package:provider/provider.dart';
 
 import '../../../api/marianumcloud/webdav/queries/listFiles/cacheableFile.dart';
@@ -223,7 +224,7 @@ class _FilesState extends State<Files> {
         },
         child: const Icon(Icons.add),
       ),
-      body: data == null ? const Center(child: CircularProgressIndicator()) : data!.files.isEmpty ? const ErrorView(icon: Icons.folder_off_rounded, text: "Der Ordner ist leer") : LoaderOverlay(
+      body: data == null ? const LoadingSpinner() : data!.files.isEmpty ? const ErrorView(icon: Icons.folder_off_rounded, text: "Der Ordner ist leer") : LoaderOverlay(
         child: RefreshIndicator(
           onRefresh: () {
             _query();
diff --git a/lib/view/pages/more/message/message.dart b/lib/view/pages/more/message/message.dart
index 82b5e31..162f3fa 100644
--- a/lib/view/pages/more/message/message.dart
+++ b/lib/view/pages/more/message/message.dart
@@ -1,5 +1,6 @@
 import 'package:flutter/cupertino.dart';
 import 'package:flutter/material.dart';
+import 'package:marianum_mobile/widget/loadingSpinner.dart';
 import 'package:provider/provider.dart';
 
 import '../../../../api/mhsl/message/getMessages/getMessagesResponse.dart';
@@ -30,7 +31,7 @@ class _MessageState extends State<Message> {
         title: const Text("Marianum Message"),
       ),
       body: Consumer<MessageProps>(builder: (context, value, child) {
-        if(value.primaryLoading()) return const Center(child: CircularProgressIndicator());
+        if(value.primaryLoading()) return const LoadingSpinner();
 
         return RefreshIndicator(
           child: ListView.builder(
diff --git a/lib/view/pages/talk/chatList.dart b/lib/view/pages/talk/chatList.dart
index 6f40e97..2b36c5b 100644
--- a/lib/view/pages/talk/chatList.dart
+++ b/lib/view/pages/talk/chatList.dart
@@ -3,6 +3,7 @@ import 'dart:async';
 import 'package:flutter/material.dart';
 import 'package:marianum_mobile/api/marianumcloud/talk/createRoom/createRoomParams.dart';
 import 'package:marianum_mobile/widget/confirmDialog.dart';
+import 'package:marianum_mobile/widget/loadingSpinner.dart';
 import 'package:provider/provider.dart';
 
 import '../../../api/marianumcloud/talk/createRoom/createRoom.dart';
@@ -78,9 +79,7 @@ class _ChatListState extends State<ChatList> {
       body: Consumer<ChatListProps>(
         builder: (context, data, child) {
 
-          if(data.primaryLoading()) {
-            return const Center(child: CircularProgressIndicator());
-          }
+          if(data.primaryLoading()) return const LoadingSpinner();
 
           latestData = data;
 
diff --git a/lib/view/pages/talk/chatView.dart b/lib/view/pages/talk/chatView.dart
index f9ce0ba..9dfe68d 100644
--- a/lib/view/pages/talk/chatView.dart
+++ b/lib/view/pages/talk/chatView.dart
@@ -2,6 +2,7 @@
 import 'package:flutter/material.dart';
 import 'package:jiffy/jiffy.dart';
 import 'package:loader_overlay/loader_overlay.dart';
+import 'package:marianum_mobile/widget/loadingSpinner.dart';
 import 'package:provider/provider.dart';
 
 import '../../../api/marianumcloud/talk/chat/getChatResponse.dart';
@@ -96,7 +97,7 @@ class _ChatViewState extends State<ChatView> {
               )
             ),
             child: LoaderOverlay(
-              child: data.primaryLoading() ? const Center(child: CircularProgressIndicator()) : Column(
+              child: data.primaryLoading() ? const LoadingSpinner() : Column(
                 children: [
                   Expanded(
                     child: ListView(
diff --git a/lib/view/pages/timetable/timetable.dart b/lib/view/pages/timetable/timetable.dart
index 6e254fb..0b6a38c 100644
--- a/lib/view/pages/timetable/timetable.dart
+++ b/lib/view/pages/timetable/timetable.dart
@@ -2,6 +2,7 @@
 import 'dart:developer';
 
 import 'package:flutter/material.dart';
+import 'package:marianum_mobile/widget/loadingSpinner.dart';
 import 'package:provider/provider.dart';
 import 'package:syncfusion_flutter_calendar/calendar.dart';
 
@@ -62,7 +63,7 @@ class _TimetableState extends State<Timetable> {
       ),
       body: Consumer<TimetableProps>(
         builder: (context, value, child) {
-          if(value.primaryLoading()) return const Placeholder();
+          if(value.primaryLoading()) return const LoadingSpinner();
 
           GetHolidaysResponse holidays = value.getHolidaysResponse;
 
diff --git a/lib/widget/loadingSpinner.dart b/lib/widget/loadingSpinner.dart
index e39236a..fcb9fb3 100644
--- a/lib/widget/loadingSpinner.dart
+++ b/lib/widget/loadingSpinner.dart
@@ -1,4 +1,6 @@
 
+import 'dart:async';
+
 import 'package:flutter/material.dart';
 
 class LoadingSpinner extends StatefulWidget {
@@ -9,21 +11,39 @@ class LoadingSpinner extends StatefulWidget {
 }
 
 class _LoadingSpinnerState extends State<LoadingSpinner> {
+  bool textVisible = false;
+  late Timer timer;
+
+  @override
+  void initState() {
+     timer = Timer(const Duration(seconds: 10), () {
+      setState(() {
+        textVisible = true;
+      });
+    });
+
+    super.initState();
+  }
+
   @override
   Widget build(BuildContext context) {
-    return Dialog(
-      child: Padding(
-        padding: const EdgeInsets.all(20),
-        child: Row(
-          mainAxisSize: MainAxisSize.min,
-          children: [
-            CircularProgressIndicator(
-              color: Theme.of(context).primaryColor,
-            ),
-            const Padding(padding: EdgeInsets.only(left: 15), child: Text("Daten abrufen...")),
-          ],
-        ),
+    return Center(
+      child: Column(
+        mainAxisAlignment: MainAxisAlignment.center,
+        children: [
+          const CircularProgressIndicator(),
+          Visibility(
+            visible: textVisible,
+            child: const Text("Bist du mit dem Internet verbunden?"),
+          ),
+        ],
       ),
     );
   }
+
+  @override
+  void dispose() {
+    timer.cancel();
+    super.dispose();
+  }
 }
diff --git a/linux/flutter/generated_plugin_registrant.cc b/linux/flutter/generated_plugin_registrant.cc
index f6f23bf..7299b5c 100644
--- a/linux/flutter/generated_plugin_registrant.cc
+++ b/linux/flutter/generated_plugin_registrant.cc
@@ -6,9 +6,13 @@
 
 #include "generated_plugin_registrant.h"
 
+#include <file_selector_linux/file_selector_plugin.h>
 #include <url_launcher_linux/url_launcher_plugin.h>
 
 void fl_register_plugins(FlPluginRegistry* registry) {
+  g_autoptr(FlPluginRegistrar) file_selector_linux_registrar =
+      fl_plugin_registry_get_registrar_for_plugin(registry, "FileSelectorPlugin");
+  file_selector_plugin_register_with_registrar(file_selector_linux_registrar);
   g_autoptr(FlPluginRegistrar) url_launcher_linux_registrar =
       fl_plugin_registry_get_registrar_for_plugin(registry, "UrlLauncherPlugin");
   url_launcher_plugin_register_with_registrar(url_launcher_linux_registrar);
diff --git a/linux/flutter/generated_plugins.cmake b/linux/flutter/generated_plugins.cmake
index f16b4c3..786ff5c 100644
--- a/linux/flutter/generated_plugins.cmake
+++ b/linux/flutter/generated_plugins.cmake
@@ -3,6 +3,7 @@
 #
 
 list(APPEND FLUTTER_PLUGIN_LIST
+  file_selector_linux
   url_launcher_linux
 )
 
diff --git a/macos/Flutter/GeneratedPluginRegistrant.swift b/macos/Flutter/GeneratedPluginRegistrant.swift
index 7026e66..9d5f78f 100644
--- a/macos/Flutter/GeneratedPluginRegistrant.swift
+++ b/macos/Flutter/GeneratedPluginRegistrant.swift
@@ -6,6 +6,7 @@ import FlutterMacOS
 import Foundation
 
 import device_info_plus
+import file_selector_macos
 import package_info
 import path_provider_foundation
 import shared_preferences_foundation
@@ -15,6 +16,7 @@ import url_launcher_macos
 
 func RegisterGeneratedPlugins(registry: FlutterPluginRegistry) {
   DeviceInfoPlusMacosPlugin.register(with: registry.registrar(forPlugin: "DeviceInfoPlusMacosPlugin"))
+  FileSelectorPlugin.register(with: registry.registrar(forPlugin: "FileSelectorPlugin"))
   FLTPackageInfoPlugin.register(with: registry.registrar(forPlugin: "FLTPackageInfoPlugin"))
   PathProviderPlugin.register(with: registry.registrar(forPlugin: "PathProviderPlugin"))
   SharedPreferencesPlugin.register(with: registry.registrar(forPlugin: "SharedPreferencesPlugin"))
diff --git a/pubspec.yaml b/pubspec.yaml
index f994d91..e9ce79a 100644
--- a/pubspec.yaml
+++ b/pubspec.yaml
@@ -17,7 +17,7 @@ publish_to: 'none' # Remove this line if you wish to publish to pub.dev
 # https://developer.apple.com/library/archive/documentation/General/Reference/InfoPlistKeyReference/Articles/CoreFoundationKeys.html
 # In Windows, build-name is used as the major, minor, and patch parts
 # of the product and file versions while build-number is used as the build suffix.
-version: 1.0.0+3
+version: 0.0.1+4
 
 environment:
   sdk: '>=2.18.4 <3.0.0'
diff --git a/windows/flutter/generated_plugin_registrant.cc b/windows/flutter/generated_plugin_registrant.cc
index 9871f6b..779f0ee 100644
--- a/windows/flutter/generated_plugin_registrant.cc
+++ b/windows/flutter/generated_plugin_registrant.cc
@@ -6,10 +6,13 @@
 
 #include "generated_plugin_registrant.h"
 
+#include <file_selector_windows/file_selector_windows.h>
 #include <syncfusion_pdfviewer_windows/syncfusion_pdfviewer_windows_plugin.h>
 #include <url_launcher_windows/url_launcher_windows.h>
 
 void RegisterPlugins(flutter::PluginRegistry* registry) {
+  FileSelectorWindowsRegisterWithRegistrar(
+      registry->GetRegistrarForPlugin("FileSelectorWindows"));
   SyncfusionPdfviewerWindowsPluginRegisterWithRegistrar(
       registry->GetRegistrarForPlugin("SyncfusionPdfviewerWindowsPlugin"));
   UrlLauncherWindowsRegisterWithRegistrar(
diff --git a/windows/flutter/generated_plugins.cmake b/windows/flutter/generated_plugins.cmake
index 2487723..3757972 100644
--- a/windows/flutter/generated_plugins.cmake
+++ b/windows/flutter/generated_plugins.cmake
@@ -3,6 +3,7 @@
 #
 
 list(APPEND FLUTTER_PLUGIN_LIST
+  file_selector_windows
   syncfusion_pdfviewer_windows
   url_launcher_windows
 )