From ea8fb6d78fa6939b7763d4cc14ac8eb865b69f9c Mon Sep 17 00:00:00 2001 From: NorbiPeti Date: Wed, 1 Mar 2017 19:03:26 +0100 Subject: [PATCH] =?UTF-8?q?Jav=C3=ADt=C3=A1sok?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Most már csak akkor nyitja meg a fájlokat, ha elkezdi a mentést (adatvesztést elkerülendő) - A helyettesítéseknél most már több osztály is támogatott egyszerre - A tanárt beírja az eredeti órából áthelyezésnél - Osztály egyenlőség a nullokra is működik - Megnyitáskor kétszeres frissítés javítva - Az utolsó frissítést akkor is beállítja, ha nem sikerült, így nem fog folyamatosan próbálkozni offline - A következő óránál most már a helyettesített adatokat mutatja - Óra közben a "Jelenlegi óra" feliratot mutatja, nem a "következő"-t - Ha nincs több óra, a következő napra görget, nem a maira --- Orarend/API.cs | 60 +++++++++++++----------- Orarend/Osztály.cs | 6 +-- OrarendAndroidApp/MainActivity.cs | 76 +++++++++++++++++++------------ 3 files changed, 85 insertions(+), 57 deletions(-) diff --git a/Orarend/API.cs b/Orarend/API.cs index 58757d3..7549ff6 100644 --- a/Orarend/API.cs +++ b/Orarend/API.cs @@ -23,10 +23,10 @@ namespace Orarend public static Settings Beállítások { get; private set; } = new Settings(); /// /// Frissíti az osztálylistát és az eredeti órarendet, első megnyitásnál, és egy órarend hozzáadásánál/szerkesztésénél, majd hetente elegendő meghívni - /// A file stream, ahova mentse az adatokat, hogy ne kelljen külön meghívni - /// A file stream, ahova mentse az adatokat, hogy ne kelljen külön meghívni + /// A file stream, ahova mentse az adatokat, hogy ne kelljen külön meghívni - Azért funkció, hogy elkerüljök az adatvesztést, mivel így csak a mentéskor nyitja meg + /// A file stream, ahova mentse az adatokat, hogy ne kelljen külön meghívni - Azért funkció, hogy elkerüljök az adatvesztést, mivel így csak a mentéskor nyitja meg /// - public static async Task Frissítés(Stream órarendstream, Stream osztálystream, Órarend ór = null) + public static async Task Frissítés(Func órarendstream, Func osztálystream, Órarend ór = null) { try { @@ -118,16 +118,16 @@ namespace Orarend } finally { - ÓrarendMentés(órarendstream); - OsztályMentés(osztálystream); + ÓrarendMentés(órarendstream()); + OsztályMentés(osztálystream()); } } /// /// Frissíti a helyettesítéseket, naponta, indításkor vagy gombnyommásra frissítse (minden nap az első előtérbe kerüléskor) - /// A file stream, ahova mentse az ÓRARENDEKET, hogy ne kelljen külön meghívni + /// A file stream, ahova mentse az ÓRARENDEKET, hogy ne kelljen külön meghívni - Azért funkció, hogy elkerüljök az adatvesztést, mivel így csak a mentéskor nyitja meg /// - public static async Task HelyettesítésFrissítés(Stream s) + public static async Task HelyettesítésFrissítés(Func órarendstream) { if (Órarendek.Count == 0 || Osztályok.Length == 0) return; @@ -151,25 +151,33 @@ namespace Orarend 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) + var osztályok = node.ChildNodes[2].InnerText.Split(new string[] { ", " }, StringSplitOptions.None); + foreach (string osztálynév in osztályok) { - ú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); + Osztály osztály = Osztályok.Single(o => o.Azonosító.Contains(osztálynév)); + var csoportok = node.ChildNodes[3].InnerText; + int névindex= csoportok.IndexOf(osztálynév); + int végeindex = csoportok.IndexOf(")", névindex >= 0 ? névindex : 0); + string csoport = osztályok.Length == 1 ? csoportok : csoportok.Substring(névindex + osztálynév.Length + 1, végeindex - névindex - osztálynév.Length - 1); + 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)) + { + if (tanár == "") + tanár = órarend.Órák[(int)dátum.DayOfWeek - 1][óraszám - 1]?.Tanár.Név ?? ""; + 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); + } } } } @@ -177,7 +185,7 @@ namespace Orarend } finally { - ÓrarendMentés(s); + ÓrarendMentés(órarendstream()); } } diff --git a/Orarend/Osztály.cs b/Orarend/Osztály.cs index eb6314c..12eccf8 100644 --- a/Orarend/Osztály.cs +++ b/Orarend/Osztály.cs @@ -25,17 +25,17 @@ namespace Orarend public bool Equals(Osztály other) { - return Azonosító == other.Azonosító; + return Azonosító == other?.Azonosító; } public static bool operator==(Osztály a, Osztály b) { - return a.Equals(b); + return a?.Equals(b) ?? (object)b == null; } public static bool operator!=(Osztály a, Osztály b) { - return !a.Equals(b); + return !(a == b); } public override bool Equals(object obj) diff --git a/OrarendAndroidApp/MainActivity.cs b/OrarendAndroidApp/MainActivity.cs index b0bdf9d..d42ff16 100644 --- a/OrarendAndroidApp/MainActivity.cs +++ b/OrarendAndroidApp/MainActivity.cs @@ -40,7 +40,6 @@ namespace OrarendAndroidApp if (list.Contains("osztaly") && API.Osztályok == null) 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() @@ -99,7 +98,7 @@ namespace OrarendAndroidApp menu.Enabled = false; }; handler.Post(loadstart); - API.HelyettesítésFrissítés(OpenFileOutput("orarend", FileCreationMode.Private)).ContinueWith(t => + API.HelyettesítésFrissítés(() => OpenFileOutput("orarend", FileCreationMode.Private)).ContinueWith(t => { handler.RemoveCallbacks(loadstart); handler.Post(() => @@ -110,8 +109,8 @@ namespace OrarendAndroidApp { ó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); } + utolsófrissítésplusz1óra = DateTime.Now + new TimeSpan(1, 0, 0); //Mindenképpen állítsa be, hogy ne írja folyamatosan a hibát }); }); } @@ -126,22 +125,22 @@ namespace OrarendAndroidApp 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(() => - { - bar.Visibility = ViewStates.Gone; - órarendlistafrissítés(); - 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(); - } - }); - }); + API.Frissítés(() => OpenFileOutput("orarend", FileCreationMode.Private), () => OpenFileOutput("osztaly", FileCreationMode.Private), ór).ContinueWith(t => + { + handler.RemoveCallbacks(loadstart); + handler.Post(() => + { + bar.Visibility = ViewStates.Gone; + órarendlistafrissítés(); + 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(); + } + }); + }); } private string[] Napok = new string[6] { "Hétfő", "Kedd", "Szerda", "Csütörtök", "Péntek", "Szombat" }; @@ -176,8 +175,9 @@ namespace OrarendAndroidApp addCell((j + 1).ToString(), Color.Black, tr); for (int i = 0; i < 6; i++) { - 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 + var innenide = helyettesítésInnenIde(i, j); + var helyettesítés = innenide[0]; + var helyettesítésIde = innenide[1]; //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 }); } @@ -197,6 +197,15 @@ namespace OrarendAndroidApp selected = null; } + private Helyettesítés[] helyettesítésInnenIde(int i, int j) + { + return new Helyettesítés[] + { + órarend.Helyettesítések.FirstOrDefault(h => (int)h.EredetiNap == i + 1 && h.EredetiSorszám == j + 1), + órarend.Helyettesítések.FirstOrDefault(h => (int)h.ÚjNap == i + 1 && h.ÚjSorszám == j + 1 && h.ÚjÓra != null) //Ha az eredeti óra elmarad, és ide lesz helyezve egy másik, az áthelyezést mutassa + }; + } + private TextView selected; /// /// Kiválasztja az adott órát @@ -212,8 +221,9 @@ namespace OrarendAndroidApp Helyettesítés helyettesítésIde = null; if (ij != null) { - 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 + var innenide = helyettesítésInnenIde(ij[0], ij[1]); + helyettesítésInnen = innenide[0]; + helyettesítésIde = innenide[1]; } //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) @@ -246,7 +256,7 @@ namespace OrarendAndroidApp ? "Á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 ("") + + ((ó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) : "") + (helyettesítésIde.ÚjÓra.Csoportok[0] != óra.Csoportok[0] ? "\nCsoport: " + helyettesítésIde.ÚjÓra.Csoportok.Aggregate((a, b) => a + ", " + b) : "") //ˇˇ De ha változott, akkor nem : "") //Ha a pozicíó nem változott, a fentebbi rész már kiírta az adatait ; @@ -337,6 +347,7 @@ namespace OrarendAndroidApp return ret; } + private bool nincstöbbóra = false; private void CsengőTimer(object state) { handler.Post(() => @@ -348,8 +359,10 @@ namespace OrarendAndroidApp return; } var most = DateTime.Now - DateTime.Today; + //var most = new TimeSpan(8, 10, 0); bool talált = false; var kovora = FindViewById(Resource.Id.kovoraTV); + nincstöbbóra = false; if (órarend.Órakezdetek[0] == TimeSpan.Zero) { //Még nincsenek beállítva a kezdetek kezdveg.Text = "Betöltés"; @@ -359,12 +372,14 @@ namespace OrarendAndroidApp for (int i = 0; i < órarend.Órakezdetek.Length - 1; i++) { var vége = órarend.Órakezdetek[i].Add(new TimeSpan(0, 45, 0)); + bool becsengetés; if (most > órarend.Órakezdetek[i]) { if (most < vége) { kezdveg.Text = "Kicsengetés: " + (vége - most).ToString("hh\\:mm\\:ss"); talált = true; + becsengetés = false; } else continue; @@ -374,26 +389,29 @@ namespace OrarendAndroidApp kezdveg.Text = "Becsengetés: " + (órarend.Órakezdetek[i] - most).ToString("hh\\:mm\\:ss"); talált = true; kovora.Visibility = ViewStates.Invisible; + becsengetés = true; } int x = (int)DateTime.Today.DayOfWeek - 1; Óra óra; - if (x != -1 && x < 6 && (óra = órarend.Órák[x][i]) != null) + var innenide = helyettesítésInnenIde(x, i); + if (x != -1 && x < 6 && (óra = innenide[1] != null ? innenide[1].ÚjÓra : innenide[0] != null ? innenide[0].EredetiNap != innenide[0].ÚjNap || innenide[0].EredetiSorszám != innenide[0].ÚjSorszám ? null : innenide[0].ÚjÓra : órarend.Órák[x][i]) != null) { //-1: Vasárnap - kovora.Text = "Következő óra: " + óra.EgyediNév + "\n" + óra.Terem + "\n" + óra.Tanár.Név + "\n" + óra.Csoportok.Aggregate((a, b) => a + ", " + b); + kovora.Text = (becsengetés ? "Következő" : "Jelenlegi") + " óra: " + óra.EgyediNév + "\n" + óra.Terem + "\n" + óra.Tanár.Név + "\n" + óra.Csoportok.Aggregate((a, b) => a + ", " + b); kovora.Visibility = ViewStates.Visible; kezdveg.Visibility = ViewStates.Visible; + break; } else { kovora.Visibility = ViewStates.Invisible; kezdveg.Visibility = ViewStates.Invisible; } - break; } if (!talált) { kezdveg.Visibility = ViewStates.Invisible; kovora.Visibility = ViewStates.Invisible; + nincstöbbóra = true; } }); } @@ -432,7 +450,9 @@ namespace OrarendAndroidApp private void MaiNaphozGörgetés() { - var x = DateTime.Today.DayOfWeek == DayOfWeek.Sunday ? DayOfWeek.Monday : DateTime.Today.DayOfWeek; + var x = DateTime.Today.DayOfWeek; + if (nincstöbbóra) x++; + x = x == DayOfWeek.Sunday ? DayOfWeek.Monday : x; var table = FindViewById(Resource.Id.tableLayout1); if (table.ChildCount == 0) return;