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