From fcb1d8d6d9170f8eb77c0b5dbbbf14c76af85c57 Mon Sep 17 00:00:00 2001
From: 55nknown <55922348+55nknown@users.noreply.github.com>
Date: Mon, 14 Nov 2022 09:14:08 +0100
Subject: [PATCH] fix #122

---
 filcnaplo/lib/api/client.dart                 | 19 +++++++----------
 .../lib/api/providers/status_provider.dart    |  4 ++++
 filcnaplo/lib/app.dart                        |  5 +++--
 filcnaplo/lib/helpers/update_helper.dart      |  2 +-
 filcnaplo/lib/models/release.dart             | 21 +++++++++++++++++--
 filcnaplo_kreta_api                           |  2 +-
 filcnaplo_mobile_ui                           |  2 +-
 7 files changed, 37 insertions(+), 18 deletions(-)

diff --git a/filcnaplo/lib/api/client.dart b/filcnaplo/lib/api/client.dart
index 0a8e049..dcab1eb 100644
--- a/filcnaplo/lib/api/client.dart
+++ b/filcnaplo/lib/api/client.dart
@@ -121,18 +121,15 @@ class FilcAPI {
     return null;
   }
 
-  static Future<http.StreamedResponse?> downloadRelease(Release release) {
-    if (release.downloads.isNotEmpty) {
-      try {
-        var client = http.Client();
-        var request = http.Request('GET', Uri.parse(release.downloads.first));
-        return client.send(request);
-      } catch (error) {
-        print("ERROR: FilcAPI.downloadRelease: $error");
-      }
+  static Future<http.StreamedResponse?> downloadRelease(ReleaseDownload release) {
+    try {
+      var client = http.Client();
+      var request = http.Request('GET', Uri.parse(release.url));
+      return client.send(request);
+    } catch (error) {
+      print("ERROR: FilcAPI.downloadRelease: $error");
+      return Future.value(null);
     }
-
-    return Future.value(null);
   }
 
   static Future<void> sendReport(ErrorReport report) async {
diff --git a/filcnaplo/lib/api/providers/status_provider.dart b/filcnaplo/lib/api/providers/status_provider.dart
index c8bb94f..274a942 100644
--- a/filcnaplo/lib/api/providers/status_provider.dart
+++ b/filcnaplo/lib/api/providers/status_provider.dart
@@ -7,9 +7,12 @@ enum Status { network, maintenance, syncing }
 class StatusProvider extends ChangeNotifier {
   final List<Status> _stack = [];
   double _progress = 0.0;
+  ConnectivityResult _networkType = ConnectivityResult.none;
+  ConnectivityResult get networkType => _networkType;
 
   StatusProvider() {
     _handleNetworkChanges();
+    Connectivity().checkConnectivity().then((value) => _networkType = value);
   }
 
   Status? getStatus() => _stack.isNotEmpty ? _stack[0] : null;
@@ -18,6 +21,7 @@ class StatusProvider extends ChangeNotifier {
 
   void _handleNetworkChanges() {
     Connectivity().onConnectivityChanged.listen((event) {
+      _networkType = event;
       if (event == ConnectivityResult.none) {
         if (!_stack.contains(Status.network)) {
           _stack.insert(0, Status.network);
diff --git a/filcnaplo/lib/app.dart b/filcnaplo/lib/app.dart
index c8e32e1..3a9e2a3 100644
--- a/filcnaplo/lib/app.dart
+++ b/filcnaplo/lib/app.dart
@@ -86,7 +86,7 @@ class App extends StatelessWidget {
         ChangeNotifierProvider<UpdateProvider>(create: (context) => UpdateProvider(context: context)),
 
         // User data providers
-        ChangeNotifierProvider<GradeProvider>(create: (context) => GradeProvider(settings: settings, user: user, database: database, kreta: kreta)),
+        ChangeNotifierProvider<GradeProvider>(create: (_) => GradeProvider(settings: settings, user: user, database: database, kreta: kreta)),
         ChangeNotifierProvider<TimetableProvider>(create: (_) => timetable),
         ChangeNotifierProvider<ExamProvider>(create: (context) => ExamProvider(context: context)),
         ChangeNotifierProvider<HomeworkProvider>(create: (context) => HomeworkProvider(context: context)),
@@ -95,7 +95,8 @@ class App extends StatelessWidget {
         ChangeNotifierProvider<EventProvider>(create: (context) => EventProvider(context: context)),
         ChangeNotifierProvider<AbsenceProvider>(create: (context) => AbsenceProvider(context: context)),
 
-        ChangeNotifierProvider<GradeCalculatorProvider>(create: (context) => GradeCalculatorProvider(context)),
+        ChangeNotifierProvider<GradeCalculatorProvider>(
+            create: (_) => GradeCalculatorProvider(settings: settings, user: user, database: database, kreta: kreta)),
         ChangeNotifierProvider<LiveCardProvider>(create: (context) => LiveCardProvider(timetable: timetable, settings: settings))
       ],
       child: Consumer<ThemeModeObserver>(
diff --git a/filcnaplo/lib/helpers/update_helper.dart b/filcnaplo/lib/helpers/update_helper.dart
index 2d6f15c..5c78a08 100644
--- a/filcnaplo/lib/helpers/update_helper.dart
+++ b/filcnaplo/lib/helpers/update_helper.dart
@@ -40,7 +40,7 @@ extension UpdateHelper on Release {
   }
 
   Future<Uint8List> download({UpdateCallback? updateCallback}) async {
-    var response = await FilcAPI.downloadRelease(this);
+    var response = await FilcAPI.downloadRelease(downloads.first);
 
     List<List<int>> chunks = [];
     int downloaded = 0;
diff --git a/filcnaplo/lib/models/release.dart b/filcnaplo/lib/models/release.dart
index 6d1696d..52d5331 100644
--- a/filcnaplo/lib/models/release.dart
+++ b/filcnaplo/lib/models/release.dart
@@ -1,9 +1,26 @@
+class ReleaseDownload {
+  String url;
+  int size;
+
+  ReleaseDownload({
+    required this.url,
+    required this.size,
+  });
+
+  factory ReleaseDownload.fromJson(Map json) {
+    return ReleaseDownload(
+      url: json["browser_download_url"] ?? "",
+      size: json["size"] ?? 0,
+    );
+  }
+}
+
 class Release {
   String tag;
   Version version;
   String author;
   String body;
-  List<String> downloads;
+  List<ReleaseDownload> downloads;
   bool prerelease;
 
   Release({
@@ -20,7 +37,7 @@ class Release {
       tag: json["tag_name"] ?? Version.zero.toString(),
       author: json["author"] != null ? json["author"]["login"] ?? "" : "",
       body: json["body"] ?? "",
-      downloads: json["assets"] != null ? json["assets"].map((a) => a["browser_download_url"] ?? "").toList().cast<String>() : [],
+      downloads: json["assets"] != null ? json["assets"].map((a) => ReleaseDownload.fromJson(a)).toList().cast<ReleaseDownload>() : [],
       prerelease: json["prerelease"] ?? false,
       version: Version.fromString(json["tag_name"] ?? ""),
     );
diff --git a/filcnaplo_kreta_api b/filcnaplo_kreta_api
index 01cf6ca..bcd9755 160000
--- a/filcnaplo_kreta_api
+++ b/filcnaplo_kreta_api
@@ -1 +1 @@
-Subproject commit 01cf6ca701f944e21ffb6e16cc543cc3a981c38c
+Subproject commit bcd97552227f418898d6a42f671024e479ecb1b4
diff --git a/filcnaplo_mobile_ui b/filcnaplo_mobile_ui
index 1e32a60..950c49b 160000
--- a/filcnaplo_mobile_ui
+++ b/filcnaplo_mobile_ui
@@ -1 +1 @@
-Subproject commit 1e32a601cb001522c62afc0fe4527ea9b1d46b31
+Subproject commit 950c49ba8976e5b338271669de2f97fc703c0999