From d7d7db8dd44214dc2c9a0e8af0556eb44881184b Mon Sep 17 00:00:00 2001 From: DaPi Date: Sun, 13 Oct 2024 16:34:46 +0200 Subject: [PATCH] 1.0.4 --- Jugenddienst Stunden/App.xaml.cs | 39 ++++++++++- .../Jugenddienst Stunden.csproj | 32 +++++----- Jugenddienst Stunden/Models/Auth.cs | 4 +- Jugenddienst Stunden/Models/Operator.cs | 26 ++++---- Jugenddienst Stunden/Models/Stunde.cs | 64 ++++++++++++------- .../Platforms/Android/AndroidManifest.xml | 1 + Jugenddienst Stunden/Types/Base.cs | 6 +- Jugenddienst Stunden/Types/DayTime.cs | 31 +++++---- Jugenddienst Stunden/Types/Freistellung.cs | 4 +- Jugenddienst Stunden/Types/Gemeinde.cs | 2 +- Jugenddienst Stunden/Types/Hours.cs | 10 +-- .../Views/StundenPage.xaml.cs | 6 +- 12 files changed, 140 insertions(+), 85 deletions(-) diff --git a/Jugenddienst Stunden/App.xaml.cs b/Jugenddienst Stunden/App.xaml.cs index 8f43930..a039b4c 100644 --- a/Jugenddienst Stunden/App.xaml.cs +++ b/Jugenddienst Stunden/App.xaml.cs @@ -2,15 +2,50 @@ namespace Jugenddienst_Stunden; +/// +/// Die Hauptanwendungsklasse. +/// public partial class App : Application { + + /// + /// Initialisiert eine neue Instanz der -Klasse. + /// public App() { InitializeComponent(); - MainPage = new AppShell(); + //UnhandledException: Wird gefangen, wenn eine Ausnahme in einem beliebigen nicht verwalteten Thread außerhalb des individuellen Kontexts auftritt. + AppDomain.CurrentDomain.UnhandledException += (sender, e) => { + if (e.ExceptionObject is Exception ex) { + HandleException(ex); + } + }; + //UnobservedTaskException: Wird ausgelöst, wenn eine Ausnahme in einem asynchronen Task auftritt und nicht behandelt wird. + TaskScheduler.UnobservedTaskException += (sender, e) => { + HandleException(e.Exception); + e.SetObserved(); + }; + + //Dispatcher: Hilft bei der Handhabung von UI-bezogenen Ausnahmen innerhalb des UI-Threads. + if (Current?.Dispatcher != null) { + Current.Dispatcher.Dispatch(async () => { + try { + // Anwendungscode hier + await Task.CompletedTask; // Dummy await to avoid CS1998 + } catch (Exception ex) { + HandleException(ex); + } + }); + } + + MainPage = new AppShell(); } - + private void HandleException(Exception ex) { + // Fehlerbehandlungscode + Console.WriteLine($"Globale Ausnahme: {ex?.Message}"); + // Optional: Logging oder Benutzerbenachrichtigung + } //protected override Window CreateWindow(IActivationState activationState) => //new Window(new AppShell()) { diff --git a/Jugenddienst Stunden/Jugenddienst Stunden.csproj b/Jugenddienst Stunden/Jugenddienst Stunden.csproj index dd10c65..2b484cb 100644 --- a/Jugenddienst Stunden/Jugenddienst Stunden.csproj +++ b/Jugenddienst Stunden/Jugenddienst Stunden.csproj @@ -45,15 +45,15 @@ com.companyname.jugenddienststunden - 1.0.3 - 4 + 1.0.4 + 5 True com.companyname.jugenddienststunden - 1.0.3 - 4 + 1.0.4 + 5 @@ -68,8 +68,8 @@ com.companyname.jugenddienststunden - 1.0.3 - 4 + 1.0.4 + 5 $(DefineConstants);DISABLE_XAML_GENERATED_BREAK_ON_UNHANDLED_EXCEPTION @@ -81,8 +81,8 @@ com.companyname.jugenddienststunden - 1.0.3 - 4 + 1.0.4 + 5 @@ -90,24 +90,24 @@ - 1.0.3 - 4 + 1.0.4 + 5 - 1.0.3 - 4 + 1.0.4 + 5 - 4 + 5 $(DefineConstants);DISABLE_XAML_GENERATED_BREAK_ON_UNHANDLED_EXCEPTION - 1.0.3 + 1.0.4 - 4 - 1.0.3 + 5 + 1.0.4 diff --git a/Jugenddienst Stunden/Models/Auth.cs b/Jugenddienst Stunden/Models/Auth.cs index 8e2d295..c31d19f 100644 --- a/Jugenddienst Stunden/Models/Auth.cs +++ b/Jugenddienst Stunden/Models/Auth.cs @@ -8,7 +8,7 @@ using static System.Runtime.InteropServices.JavaScript.JSType; namespace Jugenddienst_Stunden.Models; class Auth { - public static async Task GetApiDataWithAuthAsync(string url, string token) { + public static async Task GetApiDataWithAuthAsync(string url, string token) { // Erstellen eines HttpClient-Objekts using (HttpClient client = new HttpClient() { Timeout = TimeSpan.FromSeconds(15) }) { @@ -62,7 +62,7 @@ class Auth { string json = JsonSerializer.Serialize(item); StringContent content = new StringContent(json, Encoding.UTF8, "application/json"); - HttpResponseMessage response = null; + HttpResponseMessage? response = null; if (isNewItem) response = await client.PostAsync(url, content); else diff --git a/Jugenddienst Stunden/Models/Operator.cs b/Jugenddienst Stunden/Models/Operator.cs index eb27063..e0d6486 100644 --- a/Jugenddienst Stunden/Models/Operator.cs +++ b/Jugenddienst Stunden/Models/Operator.cs @@ -6,21 +6,21 @@ using System.Text; namespace Jugenddienst_Stunden.Models; public class Operator : ObservableObject { - public string id; - public string name; - public string surname; - public string email; - public string password; - public string lang; - public string admin; - public string aktiv; - public string department; - public string department_name; - public string num; - public string year; + public string? id; + public string? name; + public string? surname; + public string? email; + public string? password; + public string? lang; + public string? admin; + public string? aktiv; + public string? department; + public string? department_name; + public string? num; + public string? year; - public event EventHandler AlertEvent; + public event EventHandler? AlertEvent; public static async Task LoadData(string apiKey) { diff --git a/Jugenddienst Stunden/Models/Stunde.cs b/Jugenddienst Stunden/Models/Stunde.cs index 640ee41..836113f 100644 --- a/Jugenddienst Stunden/Models/Stunde.cs +++ b/Jugenddienst Stunden/Models/Stunde.cs @@ -18,11 +18,13 @@ internal class Stunde : ObservableObject { public static async Task LoadData() { - Preferences.Default.Set("apiKey", "NXw5NDdCcEdLMVNDZTRENmphWG02MjlyeFFDenN8aHR0cDovL2hvdXJzLmRhdW5pLm1pbmUubnU6ODEvYXBwYXBp"); - Preferences.Default.Set("name", "Johannes"); - Preferences.Default.Set("surname", "Fink"); - Preferences.Default.Set("EmployeeId", 5); - Preferences.Default.Set("apiUrl", "http://hours.dauni.mine.nu:81/appapi"); + ////Preferences.Default.Set("apiKey", "NXw5NDdCcEdLMVNDZTRENmphWG02MjlyeFFDenN8aHR0cDovL2hvdXJzLmRhdW5pLm1pbmUubnU6ODEvYXBwYXBp"); + //Preferences.Default.Set("apiKey", "NXw5NDdCcEdLMVNDZTRENmphWG02MjlyeFFDenN8aHR0cHM6Ly9zdHVuZGVuLmpkLWxhbmEtdGlzZW5zLml0L2FwcGFwaQ==");//Online + //Preferences.Default.Set("name", "Johannes"); + //Preferences.Default.Set("surname", "Fink"); + //Preferences.Default.Set("EmployeeId", 5); + ////Preferences.Default.Set("apiUrl", "http://hours.dauni.mine.nu:81/appapi"); + //Preferences.Default.Set("apiUrl", "https://stunden.jd-lana-tisens.it/appapi"); apiKey = Preferences.Default.Get("apiKey", "NXw5NDdCcEdLMVNDZTRENmphWG02MjlyeFFDenN8aHR0cDovL2hvdXJzLmRhdW5pLm1pbmUubnU6ODEvYXBwYXBp"); EmployeeId = Preferences.Default.Get("employeeId", 5); @@ -38,14 +40,15 @@ internal class Stunde : ObservableObject { Hours hours = new Hours(); if (Connectivity.Current.NetworkAccess == NetworkAccess.None) { - await App.Current.MainPage.DisplayAlert("Keine Internetverbindung", - "Bitte überprüfen Sie Ihre Internetverbindung und versuchen Sie es erneut.", - "OK"); + throw new Exception("Bitte überprüfen Sie Ihre Internetverbindung und versuchen Sie es erneut."); + //await App.Current.MainPage.DisplayAlert("Keine Internetverbindung", + // "Bitte überprüfen Sie Ihre Internetverbindung und versuchen Sie es erneut.", + // "OK"); } else { var tokendata = new TokenData(apiKey); //string data = await Auth.GetApiDataWithAuthAsync(requestUrl, apiKey); - string data = await Auth.GetApiDataWithAuthAsync(tokendata.url + "?hours", tokendata.apiKey); + string? data = await Auth.GetApiDataWithAuthAsync(tokendata.url + "?hours", tokendata.apiKey); if (data == "null") { throw new Exception("Keine Daten erhalten"); @@ -54,7 +57,10 @@ internal class Stunde : ObservableObject { throw new Exception("Problem mit Token"); } - hours = JsonConvert.DeserializeObject(data); + if (data == null) { + throw new Exception("Keine Daten erhalten"); + } + hours = JsonConvert.DeserializeObject(data) ?? throw new Exception("Fehler beim Deserialisieren der Daten"); } return hours; @@ -70,13 +76,14 @@ internal class Stunde : ObservableObject { Hours hours = new Hours(); if (Connectivity.Current.NetworkAccess == NetworkAccess.None) { - await App.Current.MainPage.DisplayAlert("Keine Internetverbindung", - "Bitte überprüfen Sie Ihre Internetverbindung und versuchen Sie es erneut.", - "OK"); + throw new Exception("Bitte überprüfen Sie Ihre Internetverbindung und versuchen Sie es erneut."); + //await App.Current.MainPage.DisplayAlert("Keine Internetverbindung", + // "Bitte überprüfen Sie Ihre Internetverbindung und versuchen Sie es erneut.", + // "OK"); } else { var tokendata = new TokenData(apiKey); - string data = await Auth.GetApiDataWithAuthAsync(tokendata.url + "?basic", tokendata.apiKey); + string? data = await Auth.GetApiDataWithAuthAsync(tokendata.url + "?basic", tokendata.apiKey); if (data == "null") { throw new Exception("Keine Daten erhalten"); @@ -84,8 +91,10 @@ internal class Stunde : ObservableObject { if (data == "\"Lalala\"") { throw new Exception("Problem mit Token"); } - - hours = JsonConvert.DeserializeObject(data); + if (data == null) { + throw new Exception("Keine Daten erhalten"); + } + hours = JsonConvert.DeserializeObject(data) ?? throw new Exception("Fehler beim Deserialisieren der Daten"); } return hours; @@ -105,14 +114,15 @@ internal class Stunde : ObservableObject { List daytimes = new List(); if (Connectivity.Current.NetworkAccess == NetworkAccess.None) { - await App.Current.MainPage.DisplayAlert("Keine Internetverbindung", - "Bitte überprüfen Sie Ihre Internetverbindung und versuchen Sie es erneut.", - "OK"); + throw new Exception("Bitte überprüfen Sie Ihre Internetverbindung und versuchen Sie es erneut."); + //await App.Current.MainPage.DisplayAlert("Keine Internetverbindung", + // "Bitte überprüfen Sie Ihre Internetverbindung und versuchen Sie es erneut.", + // "OK"); } else { var tokendata = new TokenData(apiKey); //string data = await Auth.GetApiDataWithAuthAsync(requestUrl, apiKey); - string data = await Auth.GetApiDataWithAuthAsync(tokendata.url + "?date=" + date.ToString("yyyy-MM-dd"), tokendata.apiKey); + string? data = await Auth.GetApiDataWithAuthAsync(tokendata.url + "?date=" + date.ToString("yyyy-MM-dd"), tokendata.apiKey); if (data == "null") { throw new Exception("Keine Daten für " + date.ToString("ddd. dd. MMM") + " erhalten"); @@ -120,9 +130,11 @@ internal class Stunde : ObservableObject { if (data == "\"Lalala\"") { throw new Exception("Problem mit Token"); } - + if (data == null) { + throw new Exception("Keine Daten erhalten"); + } //daytimes = System.Text.Json.JsonSerializer.Deserialize>(data); - daytimes = JsonConvert.DeserializeObject>(data); + daytimes = JsonConvert.DeserializeObject>(data) ?? throw new Exception("Fehler beim Deserialisieren der Daten"); } @@ -138,10 +150,14 @@ internal class Stunde : ObservableObject { public static async Task LoadEntry(int id) { var tokendata = new TokenData(apiKey); - var data = await Auth.GetApiDataWithAuthAsync(tokendata.url + "?id=" + id, tokendata.apiKey); + string? data = await Auth.GetApiDataWithAuthAsync(tokendata.url + "?id=" + id, tokendata.apiKey); + + if (data == null) { + throw new Exception("Keine Daten erhalten"); + } //DayTime hours = Hours.daytime.Find(x => x.id == id); - DayTime hours = JsonConvert.DeserializeObject(data); + DayTime hours = JsonConvert.DeserializeObject(data) ?? throw new Exception("Fehler beim Deserialisieren der Daten"); hours.TimeSpanVon = hours.begin.ToTimeSpan(); hours.TimeSpanBis = hours.end.ToTimeSpan(); diff --git a/Jugenddienst Stunden/Platforms/Android/AndroidManifest.xml b/Jugenddienst Stunden/Platforms/Android/AndroidManifest.xml index b82c6af..20786b4 100644 --- a/Jugenddienst Stunden/Platforms/Android/AndroidManifest.xml +++ b/Jugenddienst Stunden/Platforms/Android/AndroidManifest.xml @@ -4,4 +4,5 @@ + \ No newline at end of file diff --git a/Jugenddienst Stunden/Types/Base.cs b/Jugenddienst Stunden/Types/Base.cs index 4784d82..6fdf007 100644 --- a/Jugenddienst Stunden/Types/Base.cs +++ b/Jugenddienst Stunden/Types/Base.cs @@ -2,9 +2,9 @@ namespace Jugenddienst_Stunden.Types; public class Base { - public Collection Projekte { get; set; } - public Collection Gemeinden { get; set; } - public Collection Freistellungen { get; set; } + public Collection? Projekte { get; set; } + public Collection? Gemeinden { get; set; } + public Collection? Freistellungen { get; set; } public int EmployeeId { get; set; } public Hours Hours { get; set; } diff --git a/Jugenddienst Stunden/Types/DayTime.cs b/Jugenddienst Stunden/Types/DayTime.cs index c555c9a..70813d0 100644 --- a/Jugenddienst Stunden/Types/DayTime.cs +++ b/Jugenddienst Stunden/Types/DayTime.cs @@ -7,35 +7,38 @@ namespace Jugenddienst_Stunden.Types; /// public class DayTime { public int? id { get; set; } - public int EmployeeId { get; set; } + public int? EmployeeId { get; set; } public DateTime day { get; set; } - public int wday { get; set; } + public int? wday { get; set; } public TimeOnly begin { get; set; } public TimeOnly end { get; set; } - public string description { get; set; } + public string? description { get; set; } public string? free { get; set; } public bool? approved { get; set; } public int? type { get; set; } public int? projekt { get; set; } public int? gemeinde { get; set; } - public TimeOnly night { get; set; } - public Dictionary total { get; set; } - public TimeOnly end_print { get; set; } - public TimeSpan TimeSpanVon { get; set; } - public TimeSpan TimeSpanBis { get; set; } - public Collection Projekte { get; set; } - public Collection Gemeinden { get; set; } - public Collection Freistellungen { get; set; } + public TimeOnly? night { get; set; } + public Dictionary? total { get; set; } + public TimeOnly? end_print { get; set; } + public TimeSpan? TimeSpanVon { get; set; } + public TimeSpan? TimeSpanBis { get; set; } + public Collection? Projekte { get; set; } + public Collection? Gemeinden { get; set; } + public Collection? Freistellungen { get; set; } /// /// Gets the active Gemeinde based on the gemeinde ID. /// - public Gemeinde GemeindeAktiv { get; set; } + public Gemeinde? GemeindeAktiv { get; set; } /// /// Gets the active Projekt based on the projekt ID. /// - public Projekt ProjektAktiv { get; set; } + public Projekt? ProjektAktiv { get; set; } - public Freistellung FreistellungAktiv { get; set; } + /// + /// Gets the active Freistellung based on the Freistellung ID + /// + public Freistellung? FreistellungAktiv { get; set; } } diff --git a/Jugenddienst Stunden/Types/Freistellung.cs b/Jugenddienst Stunden/Types/Freistellung.cs index 8724fa6..85734b5 100644 --- a/Jugenddienst Stunden/Types/Freistellung.cs +++ b/Jugenddienst Stunden/Types/Freistellung.cs @@ -6,6 +6,6 @@ using System.Threading.Tasks; namespace Jugenddienst_Stunden.Types; public class Freistellung { - public string Id { get; set; } - public string Name { get; set; } + public string? Id { get; set; } + public string? Name { get; set; } } diff --git a/Jugenddienst Stunden/Types/Gemeinde.cs b/Jugenddienst Stunden/Types/Gemeinde.cs index b901b4e..c310a37 100644 --- a/Jugenddienst Stunden/Types/Gemeinde.cs +++ b/Jugenddienst Stunden/Types/Gemeinde.cs @@ -18,5 +18,5 @@ public class Gemeinde { /// /// Name der Gemeinde. /// - public string Name { get; set; } + public string? Name { get; set; } } diff --git a/Jugenddienst Stunden/Types/Hours.cs b/Jugenddienst Stunden/Types/Hours.cs index d64281a..ae7b5ba 100644 --- a/Jugenddienst Stunden/Types/Hours.cs +++ b/Jugenddienst Stunden/Types/Hours.cs @@ -6,14 +6,14 @@ using System.Collections.ObjectModel; namespace Jugenddienst_Stunden.Types; public class Hours : ObservableObject { - public string zeit; - public string nominal; + public string? zeit; + public string? nominal; //public Dictionary nominal_day_api; - public List nominal_day_api; + public List? nominal_day_api; //public Dictionary nominal_week_api; - public List nominal_week_api; + public List? nominal_week_api; //public List time_line; - public string zeit_total; + public string? zeit_total; //https://stackoverflow.com/questions/29449641/deserialize-json-when-a-value-can-be-an-object-or-an-empty-array/29450279#29450279 //[JsonConverter(typeof(JsonSingleOrEmptyArrayConverter))] diff --git a/Jugenddienst Stunden/Views/StundenPage.xaml.cs b/Jugenddienst Stunden/Views/StundenPage.xaml.cs index 06ff147..2a78906 100644 --- a/Jugenddienst Stunden/Views/StundenPage.xaml.cs +++ b/Jugenddienst Stunden/Views/StundenPage.xaml.cs @@ -42,9 +42,9 @@ public partial class StundenPage : ContentPage { /// /// /// - protected void OnDateSelected(object sender, DateChangedEventArgs e) { - DateTime selectedDate = e.NewDate; - } + //protected void OnDateSelected(object sender, DateChangedEventArgs e) { + // DateTime selectedDate = e.NewDate; + //} } \ No newline at end of file