diff --git a/Orarend/API.cs b/Orarend/API.cs index 6e98906..58757d3 100644 --- a/Orarend/API.cs +++ b/Orarend/API.cs @@ -1,5 +1,4 @@ using HtmlAgilityPack; -using Java.Lang; using System; using System.Collections.Generic; using System.Globalization; @@ -29,87 +28,99 @@ namespace Orarend /// public static async Task Frissítés(Stream órarendstream, Stream osztálystream, Órarend ór = null) { - Func> load = async (url) => + try { - HtmlDocument doc = new HtmlDocument(); - var req = WebRequest.CreateHttp(url); - var resp = await req.GetResponseAsync(); - await Task.Run(() => + Func> load = async (url) => { - using (var sr = new StreamReader(resp.GetResponseStream())) + HtmlDocument doc = new HtmlDocument(); + var req = WebRequest.CreateHttp(url); + var resp = await req.GetResponseAsync(); + await Task.Run(() => { - const string trtd = @"(?:\s\w+=(?:\""|\')?(?:\w|[áéóüöőúű.:;])+(?:\""|\')?)*>(?!.+?\.+?)(.+?)(?=<\1(?:\s\w+=(?:\""|\')?(?:\w|[áéóüöőúű.:;])+(?:\""|\')?)*>)"; - string html = Regex.Replace(Regex.Replace(Regex.Replace(sr.ReadToEnd(), "]*)>((?:\\w|[áéóüöőúű.])+)(?=<)(?!\\/)", "$2"), "<(tr)" + trtd, "<$1>$2"), "<(td)" + trtd, "<$1>$2"); - doc.LoadHtml(html); - } - }); - return doc; - }; - if (Órarendek.Count == 0) - { - var doc = await load("http://deri.enaplo.net/ajax/orarend/orarendoszt.php"); - await Task.Run(() => Osztályok = doc.GetElementbyId("uok").ChildNodes.Where(node => node.HasAttributes).Select(node => new Osztály { Azonosító = node.GetAttributeValue("value", ""), Név = node.NextSibling.InnerText }).ToArray()); - } - Func<Órarend, Task> órarenda = async órarend => - { - var doc = await load("http://deri.enaplo.net/ajax/orarend/orarendoszt.php?p=" + Uri.EscapeDataString(órarend.Osztály.Azonosító)); - await Task.Run(() => - { - Osztályok = doc.GetElementbyId("uok").ChildNodes.Where(node => node.HasAttributes).Select(node => new Osztály { Azonosító = node.GetAttributeValue("value", ""), Név = node.NextSibling.InnerText }).ToArray(); - bool ahét = true; - foreach (var node in doc.GetElementbyId("oda").FirstChild.FirstChild.ChildNodes[1].ChildNodes) + using (var sr = new StreamReader(resp.GetResponseStream())) + { + const string trtd = @"(?:\s\w+=(?:\""|\')?(?:\w|[áéóüöőúű.:;])+(?:\""|\')?)*>(?!.+?\.+?)(.+?)(?=<\1(?:\s\w+=(?:\""|\')?(?:\w|[áéóüöőúű.:;])+(?:\""|\')?)*>)"; + string html = Regex.Replace(Regex.Replace(Regex.Replace(sr.ReadToEnd(), "]*)>((?:\\w|[áéóüöőúű.])+)(?=<)(?!\\/)", "$2"), "<(tr)" + trtd, "<$1>$2"), "<(td)" + trtd, "<$1>$2"); + doc.LoadHtml(html); + } + }); + return doc; + }; + if (Órarendek.Count == 0) + { + var doc = await load("http://deri.enaplo.net/ajax/orarend/orarendoszt.php"); + await Task.Run(() => Osztályok = doc.GetElementbyId("uok").ChildNodes.Where(node => node.HasAttributes).Select(node => new Osztály { Azonosító = node.GetAttributeValue("value", ""), Név = node.NextSibling.InnerText }).ToArray()); + } + Func<Órarend, Task> órarenda = async órarend => + { + var doc = await load("http://deri.enaplo.net/ajax/orarend/orarendoszt.php?p=" + Uri.EscapeDataString(órarend.Osztály.Azonosító)); + await Task.Run(() => { - switch (node.FirstChild.InnerText) + lock (Órarendek) { - case "A": - ahét = true; - break; - case "B": - ahét = false; - break; - default: + Osztályok = doc.GetElementbyId("uok").ChildNodes.Where(node => node.HasAttributes).Select(node => new Osztály { Azonosító = node.GetAttributeValue("value", ""), Név = node.NextSibling.InnerText }).ToArray(); + bool ahét = true; + foreach (var node in doc.GetElementbyId("oda").FirstChild.FirstChild.ChildNodes[1].ChildNodes) + { + switch (node.FirstChild.InnerText) { - int x = int.Parse(node.FirstChild.InnerText) - 1; - órarend.Órakezdetek[x] = TimeSpan.Parse(node.FirstChild.Attributes["title"].Value.Split('-')[0].Trim()); - for (int i = 0; i < 5; i++) //Napok - { - var óranode = node.ChildNodes[i + 1].FirstChild; - var óra = (ahét ? órarend.ÓrákAHét : órarend.ÓrákBHét)[i][x]; - if (óranode.ChildNodes.Count == 0) - continue; - for (int j = 0; j < óranode.ChildNodes.Count; j += 6) + case "A": + ahét = true; + break; + case "B": + ahét = false; + break; + default: { - var csoport = óranode.ChildNodes[j].InnerText.TrimEnd(':'); - if (csoport != "Egész osztály" && !órarend.Csoportok.Contains(csoport)) - continue; - if (óra == null) - (ahét ? órarend.ÓrákAHét : órarend.ÓrákBHét)[i][x] = óra = new Óra(); - óra.Csoportok = new string[] { csoport }; //Az állandó órarendben osztályonként csak egy csoport van egy órán - óra.Azonosító = óranode.ChildNodes[j + 2].InnerText; - óra.TeljesNév = óranode.ChildNodes[j + 2].Attributes["title"].Value; - óra.Terem = óranode.ChildNodes[j + 3].InnerText.Trim(' ', '(', ')'); - óra.Tanár = new Tanár + int x = int.Parse(node.FirstChild.InnerText) - 1; + órarend.Órakezdetek[x] = TimeSpan.Parse(node.FirstChild.Attributes["title"].Value.Split('-')[0].Trim()); + for (int i = 0; i < 5; i++) //Napok { - Azonosító = óranode.ChildNodes[j + 4].InnerText, - Név = óranode.ChildNodes[j + 4].Attributes["title"].Value - }; + var óranode = node.ChildNodes[i + 1].FirstChild; + var óra = (ahét ? órarend.ÓrákAHét : órarend.ÓrákBHét)[i][x]; + if (óranode.ChildNodes.Count == 0) + continue; + for (int j = 0; j < óranode.ChildNodes.Count; j += 6) + { + var csoport = óranode.ChildNodes[j].InnerText.TrimEnd(':'); + if (csoport != "Egész osztály" && !órarend.Csoportok.Contains(csoport)) + { + órarend.Órák[i][x] = null; + continue; + } + if (óra == null) + (ahét ? órarend.ÓrákAHét : órarend.ÓrákBHét)[i][x] = óra = new Óra(); + óra.Csoportok = new string[] { csoport }; //Az állandó órarendben osztályonként csak egy csoport van egy órán + óra.Azonosító = óranode.ChildNodes[j + 2].InnerText; + óra.TeljesNév = óranode.ChildNodes[j + 2].Attributes["title"].Value; + óra.Terem = óranode.ChildNodes[j + 3].InnerText.Trim(' ', '(', ')'); + óra.Tanár = new Tanár + { + Azonosító = óranode.ChildNodes[j + 4].InnerText, + Név = óranode.ChildNodes[j + 4].Attributes["title"].Value + }; + break; + } + } break; } - } - break; } + } + Java.Lang.Thread.Sleep(10); } - } - Thread.Sleep(10); - }); - }; - if (ór == null) - foreach (var órarend in Órarendek) - await órarenda(órarend); - else - await órarenda(ór); - ÓrarendMentés(órarendstream); - OsztályMentés(osztálystream); + }); + }; + if (ór == null) + foreach (var órarend in Órarendek) + await órarenda(órarend); + else + await órarenda(ór); + } + finally + { + ÓrarendMentés(órarendstream); + OsztályMentés(osztálystream); + } } /// @@ -120,48 +131,57 @@ namespace Orarend { if (Órarendek.Count == 0 || Osztályok.Length == 0) return; - foreach (var órarend in Órarendek) - órarend.Helyettesítések.Clear(); - HtmlDocument doc = new HtmlDocument(); - var req = WebRequest.CreateHttp("http://deri.enaplo.net/ajax/print/htlista.php"); - var resp = await req.GetResponseAsync(); - await Task.Run(() => + try { - using (var sr = new StreamReader(resp.GetResponseStream())) - doc.LoadHtml(sr.ReadToEnd()); - foreach (var node in doc.DocumentNode.ChildNodes[2].ChildNodes[1].ChildNodes) + HtmlDocument doc = new HtmlDocument(); + var req = WebRequest.CreateHttp("http://deri.enaplo.net/ajax/print/htlista.php"); + var resp = await req.GetResponseAsync(); + await Task.Run(() => { - DateTime dátum = DateTime.Parse(node.ChildNodes[0].InnerText.Substring(0, node.ChildNodes[0].InnerText.Length - 4)); - int hét = CultureInfo.InvariantCulture.Calendar.GetWeekOfYear(dátum, CalendarWeekRule.FirstFullWeek, DayOfWeek.Monday); - if (hét != Hét) - continue; - byte óraszám = byte.Parse(node.ChildNodes[1].InnerText); - Osztály osztály = Osztályok.Single(o => o.Azonosító.Contains(node.ChildNodes[2].InnerText)); - string csoport = node.ChildNodes[3].InnerText; - string óraaz = node.ChildNodes[4].InnerText; - string terem = node.ChildNodes[5].InnerText.Split(new string[] { " -> " }, StringSplitOptions.None).Last(); //Mindig az új termet tárolja el, ha változott - string tanár = node.ChildNodes[7].InnerText; - string[] megj = node.ChildNodes[8].InnerText.Split(' '); - string óranév = node.ChildNodes[9].InnerText; - DayOfWeek újnap = dátum.DayOfWeek; - byte újsorszám = óraszám; - if (megj.Length > 2) + lock (Órarendek) { - újnap = DateTime.Parse(megj[1]).DayOfWeek; - újsorszám = byte.Parse(megj[3].Trim('.')); + using (var sr = new StreamReader(resp.GetResponseStream())) + doc.LoadHtml(sr.ReadToEnd()); + foreach (var órarend in Órarendek) + órarend.Helyettesítések.Clear(); + foreach (var node in doc.DocumentNode.ChildNodes[2].ChildNodes[1].ChildNodes) + { + DateTime dátum = DateTime.Parse(node.ChildNodes[0].InnerText.Substring(0, node.ChildNodes[0].InnerText.Length - 4)); + int hét = CultureInfo.InvariantCulture.Calendar.GetWeekOfYear(dátum, CalendarWeekRule.FirstFullWeek, DayOfWeek.Monday); + if (hét != Hét) + continue; + byte óraszám = byte.Parse(node.ChildNodes[1].InnerText); + Osztály osztály = Osztályok.Single(o => o.Azonosító.Contains(node.ChildNodes[2].InnerText)); + string csoport = node.ChildNodes[3].InnerText; + string óraaz = node.ChildNodes[4].InnerText; + string terem = node.ChildNodes[5].InnerText.Split(new string[] { " -> " }, StringSplitOptions.None).Last(); //Mindig az új termet tárolja el, ha változott + string tanár = node.ChildNodes[7].InnerText; + string[] megj = node.ChildNodes[8].InnerText.Split(' '); + string óranév = node.ChildNodes[9].InnerText; + DayOfWeek újnap = dátum.DayOfWeek; + byte újsorszám = óraszám; + if (megj.Length > 2) + { + újnap = DateTime.Parse(megj[1]).DayOfWeek; + újsorszám = byte.Parse(megj[3].Trim('.')); + } + foreach (var órarend in (csoport == "Egész osztály" ? Órarendek : Órarendek.Where(ór => ór.Csoportok.Contains(csoport))).Where(ór => ór.Osztály == osztály)) + //foreach (var órarend in Órarendek.Where(ór => ór.Osztály == osztály && (csoport == "Egész osztály" || ór.Csoportok.Contains(csoport)))) - A probléma valószínűleg a referencia változások miatt volt, a serialization miatt, és hogy alapból nem a .Equals-ot futtatja le ==-kor + { + var helyettesítés = new Helyettesítés { EredetiNap = dátum.DayOfWeek, EredetiSorszám = óraszám, ÚjÓra = tanár == "elmarad" ? null : new Óra { Azonosító = óraaz, Csoportok = new string[] { csoport }, Terem = terem, Tanár = new Tanár { Név = tanár }, TeljesNév = óranév }, ÚjNap = újnap, ÚjSorszám = újsorszám }; + órarend.Helyettesítések.Add(helyettesítés); + } + } } - foreach (var órarend in (csoport == "Egész osztály" ? Órarendek : Órarendek.Where(ór => ór.Csoportok.Contains(csoport))).Where(ór => ór.Osztály == osztály)) - //foreach (var órarend in Órarendek.Where(ór => ór.Osztály == osztály && (csoport == "Egész osztály" || ór.Csoportok.Contains(csoport)))) - A probléma valószínűleg a referencia változások miatt volt, a serialization miatt, és hogy alapból nem a .Equals-ot futtatja le ==-kor - { - var helyettesítés = new Helyettesítés { EredetiNap = dátum.DayOfWeek, EredetiSorszám = óraszám, ÚjÓra = tanár == "elmarad" ? null : new Óra { Azonosító = óraaz, Csoportok = new string[] { csoport }, Terem = terem, Tanár = new Tanár { Név = tanár }, TeljesNév = óranév }, ÚjNap = újnap, ÚjSorszám = újsorszám }; - órarend.Helyettesítések.Add(helyettesítés); - } - } + }); + } + finally + { ÓrarendMentés(s); - }); + } } - - private static T betöltés(Stream s) + + private static T betöltés(Stream s, Action hibánál) { using (s) { @@ -176,9 +196,9 @@ namespace Orarend var serializer = new DataContractJsonSerializer(typeof(T)); return (T)serializer.ReadObject(ms); } - catch + catch (Exception e) { - return default(T); + hibánál(e); } } return default(T); @@ -186,19 +206,19 @@ namespace Orarend } } - public static void ÓrarendBetöltés(Stream s) + public static void ÓrarendBetöltés(Stream s, Action hibánál) { - Órarendek.AddRange(betöltés<Órarend[]>(s) ?? new Órarend[0]); + Órarendek.AddRange(betöltés<Órarend[]>(s, hibánál) ?? new Órarend[0]); } - public static void OsztályBetöltés(Stream s) + public static void OsztályBetöltés(Stream s, Action hibánál) { - Osztályok = betöltés(s) ?? new Osztály[0]; + Osztályok = betöltés(s, hibánál) ?? new Osztály[0]; } - public static void BeállításBetöltés(Stream s) + public static void BeállításBetöltés(Stream s, Action hibánál) { - Beállítások = betöltés(s); + Beállítások = betöltés(s, hibánál); } //TODO: Tényleges órarendből állapítsa meg azt is, hogyha egyáltalán nincs ott egy óra, és máshol sincs, és ezt írja ki private static void mentés(Stream s, T obj) diff --git a/OrarendAndroidApp/MainActivity.cs b/OrarendAndroidApp/MainActivity.cs index 36cbaa2..b0bdf9d 100644 --- a/OrarendAndroidApp/MainActivity.cs +++ b/OrarendAndroidApp/MainActivity.cs @@ -8,7 +8,6 @@ using Android.OS; using Orarend; using System.Linq; using Android.Graphics; -using Java.Lang; using System.Collections.Generic; using System.Threading.Tasks; using System.Threading; @@ -22,6 +21,7 @@ namespace OrarendAndroidApp { private Handler handler; private Órarend órarend; + private Timer timer; private const int EDIT_ADD_ACT_REQUEST = 1; @@ -34,12 +34,13 @@ namespace OrarendAndroidApp handler = new Handler(); string[] list = FileList(); if (list.Contains("beallitasok")) - API.BeállításBetöltés(OpenFileInput("beallitasok")); + API.BeállításBetöltés(OpenFileInput("beallitasok"), e => Hiba("Hiba a beállítások betöltése során!\n" + e)); if (list.Contains("orarend") && API.Órarendek.Count == 0) - API.ÓrarendBetöltés(OpenFileInput("orarend")); + API.ÓrarendBetöltés(OpenFileInput("orarend"), e => Hiba("Hiba az órarendek betöltése során!\n" + e)); if (list.Contains("osztaly") && API.Osztályok == null) - API.OsztályBetöltés(OpenFileInput("osztaly")); - var timer = new Timer(CsengőTimer, null, new TimeSpan(0, 0, 1), new TimeSpan(0, 0, 1)); + API.OsztályBetöltés(OpenFileInput("osztaly"), e => Hiba("Hiba az osztályok betöltése során!\n" + e)); + timer = new Timer(CsengőTimer, null, new TimeSpan(0, 0, 1), new TimeSpan(0, 0, 1)); + frissítésHa1ÓraEltelt(); } private void órarendlistafrissítés() @@ -88,35 +89,57 @@ namespace OrarendAndroidApp tr1.AddView(textview); } - private void HelyettesítésFrissítés() + private void HelyettesítésFrissítés(bool internethiba = true) { var bar = FindViewById(Resource.Id.progressBar1); - handler.Post(() => bar.Visibility = ViewStates.Visible); + var menu = FindViewById(Resource.Id.actionMenuView1); + Action loadstart = () => + { + bar.Visibility = ViewStates.Visible; + menu.Enabled = false; + }; + handler.Post(loadstart); API.HelyettesítésFrissítés(OpenFileOutput("orarend", FileCreationMode.Private)).ContinueWith(t => { + handler.RemoveCallbacks(loadstart); handler.Post(() => { - TaskHiba(t); bar.Visibility = ViewStates.Gone; - órarendfrissítés(); - Toast.MakeText(this, "Helyettesítések frissítve", ToastLength.Short).Show(); + menu.Enabled = true; + if (TaskHiba(t, internethiba)) + { + órarendfrissítés(); + Toast.MakeText(this, "Helyettesítések frissítve", ToastLength.Short).Show(); + utolsófrissítésplusz1óra = DateTime.Now + new TimeSpan(1, 0, 0); + } }); }); } private void ÓrarendFrissítés(Órarend ór = null) - { //TODO: Meghívni minden tervezett alkalommal + { var bar = FindViewById(Resource.Id.progressBar1); - handler.Post(() => bar.Visibility = ViewStates.Visible); + var menu = FindViewById(Resource.Id.actionMenuView1); + Action loadstart = () => + { + bar.Visibility = ViewStates.Visible; + menu.Enabled = false; + }; + handler.Post(loadstart); API.Frissítés(OpenFileOutput("orarend", FileCreationMode.Private), OpenFileOutput("osztaly", FileCreationMode.Private), ór).ContinueWith(t => { + handler.RemoveCallbacks(loadstart); handler.Post(() => { - if (TaskHiba(t) && (ór == null || ór == órarend)) - órarendfrissítés(); bar.Visibility = ViewStates.Gone; órarendlistafrissítés(); - Toast.MakeText(this, "Órarend" + (ór == null ? "ek" : "") + " és osztálylista frissítve", ToastLength.Short).Show(); + HelyettesítésFrissítés(); + if (TaskHiba(t)) + { + if (ór == null || ór == órarend) + órarendfrissítés(); + Toast.MakeText(this, (API.Órarendek.Count > 0 ? "Órarend" + (ór == null ? "ek" : "") + " és o" : "O") + "sztálylista frissítve", ToastLength.Short).Show(); + } }); }); } @@ -127,8 +150,8 @@ namespace OrarendAndroidApp { var table = FindViewById(Resource.Id.tableLayout1); deselect(); - if (table.ChildCount > 1) - table.RemoveViews(1, table.ChildCount - 1); + if (table.ChildCount > 0) + table.RemoveViews(0, table.ChildCount); if (órarend == null) return; TableRow tr = new TableRow(this); @@ -153,8 +176,8 @@ namespace OrarendAndroidApp addCell((j + 1).ToString(), Color.Black, tr); for (int i = 0; i < 6; i++) { - var helyettesítés = órarend.Helyettesítések.SingleOrDefault(h => (int)h.EredetiNap - 1 == i && h.EredetiSorszám - 1 == j); - var helyettesítésIde = órarend.Helyettesítések.SingleOrDefault(h => (int)h.ÚjNap - 1 == i && h.ÚjSorszám - 1 == j && h.ÚjÓra != null); //Ha az eredeti óra elmarad, és ide lesz helyezve egy másik, az áthelyezést mutassa + var helyettesítés = órarend.Helyettesítések.FirstOrDefault(h => (int)h.EredetiNap - 1 == i && h.EredetiSorszám - 1 == j); + var helyettesítésIde = órarend.Helyettesítések.FirstOrDefault(h => (int)h.ÚjNap - 1 == i && h.ÚjSorszám - 1 == j && h.ÚjÓra != null); //Ha az eredeti óra elmarad, és ide lesz helyezve egy másik, az áthelyezést mutassa //addCell(helyettesítés?.ÚjÓra?.EgyediNév ?? órarend.Órák[i][j]?.EgyediNév ?? "", helyettesítés == null ? Color.Black : Color.Red, tr, new int[2] { i, j }); addCell(helyettesítésIde != null ? helyettesítésIde.ÚjÓra.EgyediNév : helyettesítés != null ? helyettesítés.EredetiNap != helyettesítés.ÚjNap || helyettesítés.EredetiSorszám != helyettesítés.ÚjSorszám ? "Áthelyezve" : helyettesítés.ÚjÓra?.EgyediNév ?? "elmarad" : órarend.Órák[i][j]?.EgyediNév ?? "", helyettesítés == null ? Color.Black : Color.Red, tr, new int[2] { i, j }); } @@ -170,6 +193,7 @@ namespace OrarendAndroidApp private void deselect() { FindViewById(Resource.Id.kivoraTV).Visibility = ViewStates.Gone; + FindViewById(Resource.Id.helyTV).Visibility = ViewStates.Gone; selected = null; } @@ -188,12 +212,12 @@ namespace OrarendAndroidApp Helyettesítés helyettesítésIde = null; if (ij != null) { - helyettesítésInnen = órarend.Helyettesítések.SingleOrDefault(h => (int)h.EredetiNap == ij[0] + 1 && h.EredetiSorszám == ij[1] + 1); - helyettesítésIde = órarend.Helyettesítések.SingleOrDefault(h => (int)h.ÚjNap == ij[0] + 1 && h.ÚjSorszám == ij[1] + 1 && h.ÚjÓra != null); //Ha az eredeti óra elmarad, és ide lesz helyezve egy másik, az áthelyezést mutassa + helyettesítésInnen = órarend.Helyettesítések.FirstOrDefault(h => (int)h.EredetiNap == ij[0] + 1 && h.EredetiSorszám == ij[1] + 1); + helyettesítésIde = órarend.Helyettesítések.FirstOrDefault(h => (int)h.ÚjNap == ij[0] + 1 && h.ÚjSorszám == ij[1] + 1 && h.ÚjÓra != null); //Ha az eredeti óra elmarad, és ide lesz helyezve egy másik, az áthelyezést mutassa } //if (ij == null || (óra = órarend.Órák[ij[0]][ij[1]] ?? ((helyettesítésIde = órarend.Helyettesítések.SingleOrDefault(h => (int)h.ÚjNap == ij[0] + 1 && h.ÚjSorszám == ij[1] + 1))?.ÚjÓra)) == null) if (ij == null || (óra = órarend.Órák[ij[0]][ij[1]] ?? (helyettesítésIde?.ÚjÓra)) == null) - { //Ha az óra nincs beállítva, beállítja a helyettesítettre + { //Ha az óra nincs beállítva, beállítja a helyettesítettre - TODO: Ne; rejtse el deselect(); return; } @@ -205,20 +229,21 @@ namespace OrarendAndroidApp + "\nTerem: " + óra.Terem + "\nTanár: " + óra.Tanár.Név + "\nIdőtartam: " + órarend.Órakezdetek[ij[1]].ToString("hh\\:mm") + "-" + órarend.Órakezdetek[ij[1]].Add(new TimeSpan(0, 45, 0)).ToString("hh\\:mm") - + "\nCsoport: " + óra.Csoportok.Aggregate((a, b) => a + ", " + b) - + (helyettesítésInnen == null ? "" + + "\nCsoport: " + óra.Csoportok.Aggregate((a, b) => a + ", " + b); + var hely = FindViewById(Resource.Id.helyTV); + hely.Text = (helyettesítésInnen == null ? "" : helyettesítésInnen.EredetiNap != helyettesítésInnen.ÚjNap || helyettesítésInnen.EredetiSorszám != helyettesítésInnen.ÚjSorszám - ? "\n\nÁthelyezve: innen --> " + Napok[(int)helyettesítésInnen.ÚjNap - 1] + " " + helyettesítésInnen.ÚjSorszám + ". óra" + ? "Áthelyezve: innen --> " + Napok[(int)helyettesítésInnen.ÚjNap - 1] + " " + helyettesítésInnen.ÚjSorszám + ". óra" : helyettesítésInnen.ÚjÓra != null && helyettesítésInnen.ÚjÓra != óra - ? "\n\nHelyettesítés:" + ? "Helyettesítés:" + (helyettesítésInnen.ÚjÓra.EgyediNév != óra.EgyediNév ? "\nÓra: " + helyettesítésInnen.ÚjÓra.EgyediNév : "") + (helyettesítésInnen.ÚjÓra.Terem != óra.Terem ? "\nTerem: " + helyettesítésInnen.ÚjÓra.Terem : "") + (helyettesítésInnen.ÚjÓra.Tanár.Név != óra.Tanár.Név ? "\nTanár: " + helyettesítésInnen.ÚjÓra.Tanár.Név : "") + (helyettesítésInnen.ÚjÓra.Csoportok[0] != óra.Csoportok[0] ? "\nCsoport: " + helyettesítésInnen.ÚjÓra.Csoportok.Aggregate((a, b) => a + ", " + b) : "") - : "\n\nAz óra elmarad") + : "Az óra elmarad") + (helyettesítésIde == null ? "" : helyettesítésIde.EredetiNap != helyettesítésIde.ÚjNap || helyettesítésIde.EredetiSorszám != helyettesítésIde.ÚjSorszám - ? "\n\nÁthelyezve: " + Napok[(int)helyettesítésInnen.EredetiNap - 1] + " " + helyettesítésIde.EredetiSorszám + ". óra --> ide" + ? "Áthelyezve: " + Napok[(int)helyettesítésInnen.EredetiNap - 1] + " " + helyettesítésIde.EredetiSorszám + ". óra --> ide" + (helyettesítésIde.ÚjÓra.EgyediNév != óra.EgyediNév ? "\nÓra: " + helyettesítésIde.ÚjÓra.EgyediNév : "") + (helyettesítésIde.ÚjÓra.Terem != óra.Terem ? "\nTerem: " + helyettesítésIde.ÚjÓra.Terem : "") + ((óra.Tanár.Név != (helyettesítésIde.ÚjÓra.Tanár.Név == "" ? órarend.Órák[(int)helyettesítésIde.EredetiNap - 1][helyettesítésIde.EredetiSorszám - 1].Tanár.Név : helyettesítésIde.ÚjÓra.Tanár.Név)) ? "\nTanár: " + (óra.Tanár.Név == "" ? órarend.Órák[(int)helyettesítésIde.EredetiNap - 1][helyettesítésIde.EredetiSorszám - 1].Tanár.Név : helyettesítésIde.ÚjÓra.Tanár.Név) : "") //TODO: A tanár mező üres ("") @@ -226,6 +251,7 @@ namespace OrarendAndroidApp : "") //Ha a pozicíó nem változott, a fentebbi rész már kiírta az adatait ; kivora.Visibility = ViewStates.Visible; + hely.Visibility = ViewStates.Visible; } public override bool OnCreateOptionsMenu(IMenu menu) @@ -292,14 +318,18 @@ namespace OrarendAndroidApp /// Az összes hibát kiírja, ami a futása közben keletkezett /// /// + /// Ha igaz, kiírja a WebException-öket is /// Igaz, ha nem volt hiba - private bool TaskHiba(Task t) + private bool TaskHiba(Task t, bool internethiba = true) { bool ret = true; - foreach (var ex in (IEnumerable)t.Exception?.InnerExceptions ?? new System.Exception[0]) + foreach (var ex in (IEnumerable)t.Exception?.InnerExceptions ?? new Exception[0]) { if (ex is WebException) - Hiba("Nem sikerült csatlakozni az E-naplóhoz.\n" + ex.Message); + { + if (internethiba) + Hiba("Nem sikerült csatlakozni az E-naplóhoz.\n" + ex.Message); + } else Hiba(ex.ToString()); ret = false; @@ -391,18 +421,31 @@ namespace OrarendAndroidApp { base.OnWindowFocusChanged(hasFocus); if (!hasFocus) + { + timer.Change(Timeout.Infinite, Timeout.Infinite); return; + } + timer.Change(new TimeSpan(0, 0, 0), new TimeSpan(0, 0, 1)); + frissítésHa1ÓraEltelt(); MaiNaphozGörgetés(); - //handler.Post(() => { if ((table.GetChildAt(1) as ViewGroup).GetChildAt((int)x).RequestFocus()) Toast.MakeText(this, "Siker", ToastLength.Short).Show(); else Toast.MakeText(this, "Nem siker", ToastLength.Short).Show(); }); } private void MaiNaphozGörgetés() { var x = DateTime.Today.DayOfWeek == DayOfWeek.Sunday ? DayOfWeek.Monday : DateTime.Today.DayOfWeek; var table = FindViewById(Resource.Id.tableLayout1); - if (table.ChildCount <= 1) + if (table.ChildCount == 0) return; - FindViewById(Resource.Id.horizontalView).SmoothScrollTo((table.GetChildAt(1) as ViewGroup).GetChildAt((int)x).Left, 0); + var cell = (table.GetChildAt(0) as ViewGroup).GetChildAt((int)x); + FindViewById(Resource.Id.horizontalView).SmoothScrollTo(Math.Max(cell.Left - (FindViewById(Resource.Id.container).Width - cell.Width) / 2, 0), 0); + } + + private DateTime utolsófrissítésplusz1óra = DateTime.MinValue; + private void frissítésHa1ÓraEltelt() + { + if (utolsófrissítésplusz1óra > DateTime.Now) + return; + HelyettesítésFrissítés(false); } } } diff --git a/OrarendAndroidApp/Resources/Resource.Designer.cs b/OrarendAndroidApp/Resources/Resource.Designer.cs index 53db572..0feced9 100644 --- a/OrarendAndroidApp/Resources/Resource.Designer.cs +++ b/OrarendAndroidApp/Resources/Resource.Designer.cs @@ -84,14 +84,17 @@ namespace OrarendAndroidApp public partial class Id { - // aapt resource value: 0x7f06000b - public const int ScrollView01 = 2131099659; + // aapt resource value: 0x7f06000d + public const int ScrollView01 = 2131099661; + + // aapt resource value: 0x7f06000a + public const int ScrollView02 = 2131099658; + + // aapt resource value: 0x7f060015 + public const int actionMenuView1 = 2131099669; // aapt resource value: 0x7f060009 - public const int ScrollView02 = 2131099657; - - // aapt resource value: 0x7f060013 - public const int actionMenuView1 = 2131099667; + public const int container = 2131099657; // aapt resource value: 0x7f060005 public const int csoportokEditText = 2131099653; @@ -99,56 +102,59 @@ namespace OrarendAndroidApp // aapt resource value: 0x7f060008 public const int deleteButton = 2131099656; - // aapt resource value: 0x7f06000c - public const int horizontalView = 2131099660; + // aapt resource value: 0x7f060011 + public const int helyTV = 2131099665; + + // aapt resource value: 0x7f06000e + public const int horizontalView = 2131099662; + + // aapt resource value: 0x7f060012 + public const int kezdvegTV = 2131099666; // aapt resource value: 0x7f060010 - public const int kezdvegTV = 2131099664; + public const int kivoraTV = 2131099664; - // aapt resource value: 0x7f06000f - public const int kivoraTV = 2131099663; - - // aapt resource value: 0x7f060011 - public const int kovoraTV = 2131099665; - - // aapt resource value: 0x7f060016 - public const int menu_add = 2131099670; - - // aapt resource value: 0x7f060017 - public const int menu_edit = 2131099671; - - // aapt resource value: 0x7f060019 - public const int menu_fullrefresh = 2131099673; + // aapt resource value: 0x7f060013 + public const int kovoraTV = 2131099667; // aapt resource value: 0x7f060018 - public const int menu_preferences = 2131099672; + public const int menu_add = 2131099672; - // aapt resource value: 0x7f060015 - public const int menu_refresh = 2131099669; + // aapt resource value: 0x7f060019 + public const int menu_edit = 2131099673; + + // aapt resource value: 0x7f06001b + public const int menu_fullrefresh = 2131099675; + + // aapt resource value: 0x7f06001a + public const int menu_preferences = 2131099674; + + // aapt resource value: 0x7f060017 + public const int menu_refresh = 2131099671; // aapt resource value: 0x7f060001 public const int névEditText = 2131099649; - // aapt resource value: 0x7f060012 - public const int osztalylistaTV = 2131099666; + // aapt resource value: 0x7f060014 + public const int osztalylistaTV = 2131099668; // aapt resource value: 0x7f060003 public const int osztálySpinner = 2131099651; - // aapt resource value: 0x7f06000e - public const int progressBar1 = 2131099662; + // aapt resource value: 0x7f06000c + public const int progressBar1 = 2131099660; // aapt resource value: 0x7f060007 public const int saveButton = 2131099655; - // aapt resource value: 0x7f06000a - public const int scrollLinearLayout = 2131099658; + // aapt resource value: 0x7f06000b + public const int scrollLinearLayout = 2131099659; - // aapt resource value: 0x7f060014 - public const int spinner = 2131099668; + // aapt resource value: 0x7f060016 + public const int spinner = 2131099670; - // aapt resource value: 0x7f06000d - public const int tableLayout1 = 2131099661; + // aapt resource value: 0x7f06000f + public const int tableLayout1 = 2131099663; // aapt resource value: 0x7f060000 public const int textView1 = 2131099648; diff --git a/OrarendAndroidApp/Resources/layout/MainLayout.axml b/OrarendAndroidApp/Resources/layout/MainLayout.axml index a0a47ea..29ef585 100644 --- a/OrarendAndroidApp/Resources/layout/MainLayout.axml +++ b/OrarendAndroidApp/Resources/layout/MainLayout.axml @@ -1,5 +1,6 @@ + - - + android:isScrollContainer="true" /> +