diff --git a/Orarend/API.cs b/Orarend/API.cs index c1665bf..2ac5490 100644 --- a/Orarend/API.cs +++ b/Orarend/API.cs @@ -1,4 +1,5 @@ using HtmlAgilityPack; +using Java.Lang; using System; using System.Collections.Generic; using System.IO; @@ -6,78 +7,99 @@ using System.Linq; using System.Net; using System.Text.RegularExpressions; using System.Threading.Tasks; -using System.Xml; -using System.Xml.Linq; namespace Orarend { public static class API - { + { //TODO: Beállítások: Téma (sötét, világos) (Android; platformfüggő beállítások), Előre megadott egyedi nevek használata /// - /// Visszatér az osztályok listájával, egy-egy kételemű tömbbel, az első elem az azonosító, a második a megjelenített név. + /// Visszatér az osztályok listájával. /// Lehet null, ha még nem volt sikeres . /// /// - public static IEnumerable Osztályok { get; private set; } - public static Órarend AktuálisÓrarend { get; private set; } + public static Osztály[] Osztályok { get; private set; } + public static List<Órarend> Órarendek { get; } = new List<Órarend>(); + /// + /// 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 + /// public static async Task Frissítés() { - AktuálisÓrarend = new Órarend { OsztályID = "12.b|2" }; //TODO: TMP - HtmlDocument doc = new HtmlDocument(); - var req = WebRequest.CreateHttp("http://deri.enaplo.net/ajax/orarend/orarendoszt.php" + (AktuálisÓrarend == null ? "" : "?p=" + Uri.EscapeDataString(AktuálisÓrarend.OsztályID))); - 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); - } - Osztályok = doc.GetElementbyId("uok").ChildNodes.Where(node => node.HasAttributes).Select(node => new string[] { node.GetAttributeValue("value", ""), node.NextSibling.InnerText }); - if (AktuálisÓrarend != null) - { - bool ahét = true; - foreach (var node in doc.GetElementbyId("oda").FirstChild.FirstChild.ChildNodes[1].ChildNodes) + using (var sr = new StreamReader(resp.GetResponseStream())) { - switch (node.FirstChild.InnerText) - { - case "A": - ahét = true; - break; - case "B": - ahét = false; - break; - default: - { - int x = int.Parse(node.FirstChild.InnerText) - 1; - AktuálisÓrarend.Órakezdetek[x] = TimeSpan.Parse(node.FirstChild.Attributes["title"].Value.Split('-')[0].Trim()); - for (int i = 0; i < 5; i++) //Napok - { //TODO: for ciklus az egy időben tartott órákhoz - var óranode = node.ChildNodes[i + 1].FirstChild; - var óra = (ahét ? AktuálisÓrarend.ÓrákAHét : AktuálisÓrarend.ÓrákBHét)[i, x]; - if (óranode.ChildNodes.Count == 0) - continue; - if (óra == null) - (ahét ? AktuálisÓrarend.ÓrákAHét : AktuálisÓrarend.ÓrákBHét)[i, x] = óra = new Óra(); - var csoportok = óranode.FirstChild.InnerText.TrimEnd(':'); - óra.Sorszám = x + 1; - óra.Csoportok = csoportok; - óra.Név = óranode.ChildNodes[2].Attributes["title"].Value; - óra.Azonosító = óranode.ChildNodes[2].InnerText; - óra.Terem = óranode.ChildNodes[3].InnerText.Trim(' ', '(', ')'); - óra.Tanár = new Tanár - { - Azonosító = óranode.ChildNodes[4].InnerText, - Név = óranode.ChildNodes[4].Attributes["title"].Value - }; - } - break; - } - } + 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()); + } + foreach (var órarend in Órarendek) + { + var doc = await load("http://deri.enaplo.net/ajax/orarend/orarendoszt.php?p=" + Uri.EscapeDataString(órarend.Osztály.Azonosító)); + await Task.Run(() => + { + bool ahét = true; + foreach (var node in doc.GetElementbyId("oda").FirstChild.FirstChild.ChildNodes[1].ChildNodes) + { + switch (node.FirstChild.InnerText) + { + case "A": + ahét = true; + break; + case "B": + ahét = false; + break; + default: + { + 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 + { //TODO: for ciklus az egy időben tartott órákhoz + 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; + if (óra == null) + (ahét ? órarend.ÓrákAHét : órarend.ÓrákBHét)[i, x] = óra = new Óra(); + var csoportok = óranode.FirstChild.InnerText.TrimEnd(':'); + óra.Sorszám = x + 1; + óra.Csoportok = new string[] { csoportok }; //Az állandó órarendben osztályonként csak egy csoport van egy órán + óra.Azonosító = óranode.ChildNodes[2].InnerText; + óra.TeljesNév = óranode.ChildNodes[2].Attributes["title"].Value; + óra.Terem = óranode.ChildNodes[3].InnerText.Trim(' ', '(', ')'); + óra.Tanár = new Tanár + { + Azonosító = óranode.ChildNodes[4].InnerText, + Név = óranode.ChildNodes[4].Attributes["title"].Value + }; + } + break; + } + } + } + }); + Thread.Sleep(10); + } + } + + /// + /// 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) + /// + public static async Task HelyettesítésFrissítés() + { + } } } diff --git a/Orarend/Orarend.csproj b/Orarend/Orarend.csproj index 0b5b840..8292462 100644 --- a/Orarend/Orarend.csproj +++ b/Orarend/Orarend.csproj @@ -35,16 +35,21 @@ + + - - ..\packages\HtmlAgilityPack.1.4.9.5\lib\portable-net45+netcore45+wpa81+wp8+MonoAndroid+MonoTouch\HtmlAgilityPack.dll + + ..\packages\HtmlAgilityPack.1.4.9.4\lib\portable-net45+netcore45+wpa81+wp8+MonoAndroid+MonoTouch\HtmlAgilityPack.dll True + + C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\MonoAndroid\v6.0\Mono.Android.dll + diff --git a/Orarend/packages.config b/Orarend/packages.config index d2da071..d70a6b5 100644 --- a/Orarend/packages.config +++ b/Orarend/packages.config @@ -1,4 +1,4 @@  - + \ No newline at end of file diff --git a/Orarend/Óra.cs b/Orarend/Óra.cs index 550e105..158251f 100644 --- a/Orarend/Óra.cs +++ b/Orarend/Óra.cs @@ -8,14 +8,56 @@ namespace Orarend { public class Óra { - public string Azonosító { get; set; } - public string Név { get; set; } + private ÓraTípus Típus { get; set; } public Tanár Tanár { get; set; } public int Sorszám { get; set; } public string Terem { get; set; } /// - /// Az órán résztvevő csoportok, pluszjelekkel elválasztva + /// Az órán résztvevő csoportok /// - public string Csoportok { get; set; } + public string[] Csoportok { get; set; } + + public string Azonosító + { + get + { + return Típus?.Azonosító; + } + set + { + if (!ÓraTípus.Típusok.ContainsKey(value)) + ÓraTípus.Típusok.Add(value, Típus = new ÓraTípus { Azonosító = value }); + else + Típus = ÓraTípus.Típusok[value]; + } + } + + public string TeljesNév + { + get + { + return Típus?.TeljesNév; + } + set + { + if (Típus == null) + throw new InvalidOperationException("Az azonosító nincs beállítva!"); + Típus.TeljesNév = value; + } + } + + public string EgyediNév + { + get + { + return Típus?.EgyediNév ?? Típus?.TeljesNév; + } + set + { + if (Típus == null) + throw new InvalidOperationException("Az azonosító nincs beállítva!"); + Típus.EgyediNév = value; + } + } } } diff --git a/Orarend/ÓraTípus.cs b/Orarend/ÓraTípus.cs new file mode 100644 index 0000000..2882013 --- /dev/null +++ b/Orarend/ÓraTípus.cs @@ -0,0 +1,17 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Orarend +{ + public class ÓraTípus + { + public string TeljesNév { get; set; } + public string Azonosító { get; set; } + public string EgyediNév { get; set; } + + public static Dictionary Típusok { get; } = new Dictionary(); + } +} diff --git a/Orarend/Órarend.cs b/Orarend/Órarend.cs index efe67d7..b68c187 100644 --- a/Orarend/Órarend.cs +++ b/Orarend/Órarend.cs @@ -17,8 +17,7 @@ namespace Orarend /// public Óra[,] ÓrákBHét { get; } = new Óra[6, 16]; public string Név { get; set; } - public string OsztályID { get; set; } - public string OsztályNév { get; set; } + public Osztály Osztály { get; set; } /// /// Egy 16 elemű tömb az órák kezdő időpontjaival /// diff --git a/OrarendAndroidApp/MainActivity.cs b/OrarendAndroidApp/MainActivity.cs index 8d91102..7970e83 100644 --- a/OrarendAndroidApp/MainActivity.cs +++ b/OrarendAndroidApp/MainActivity.cs @@ -5,32 +5,37 @@ using Android.Runtime; using Android.Views; using Android.Widget; using Android.OS; -using Android.Support.V4.View; using Orarend; using System.Linq; using Android.Graphics; +using Java.Lang; namespace OrarendAndroidApp { - [Activity(Label = "OrarendAndroidApp", MainLauncher = true, Icon = "@drawable/icon")] + [Activity(Label = "Órarend", MainLauncher = true, Icon = "@drawable/icon", Theme = "@android:style/Theme.Holo.Light")] public class MainActivity : Activity { private Handler handler; + private Órarend órarend; protected override void OnCreate(Bundle bundle) { base.OnCreate(bundle); SetContentView(Resource.Layout.MainLayout); handler = new Handler(); + } + + private void HelyettesítésFrissítés() + { var table = FindViewById(Resource.Id.tableLayout1); Action addCell = (text, color, tr1) => - { - TextView textview = new TextView(this); - textview.SetText(text, TextView.BufferType.Normal); - textview.SetTextColor(color); - tr1.AddView(textview); - }; - API.Frissítés().ContinueWith(t => + { + TextView textview = new TextView(this); + textview.SetText(text, TextView.BufferType.Normal); + textview.SetTextColor(color); + tr1.AddView(textview); + }; + API.HelyettesítésFrissítés().ContinueWith(t => { handler.Post(() => { @@ -45,16 +50,56 @@ namespace OrarendAndroidApp } else { - for (int j = 0; j < API.AktuálisÓrarend.ÓrákAHét.GetLength(1); j++) + for (int j = 0; j < órarend.ÓrákAHét.GetLength(1); j++) { TableRow tr = new TableRow(this); - for (int i = 0; i < API.AktuálisÓrarend.ÓrákAHét.GetLength(0); i++) - addCell(API.AktuálisÓrarend.ÓrákAHét[i, j] != null ? API.AktuálisÓrarend.ÓrákAHét[i, j].Név : "", Color.Aqua, tr); + for (int i = 0; i < órarend.ÓrákAHét.GetLength(0); i++) + addCell(órarend.ÓrákAHét[i, j] != null ? órarend.ÓrákAHét[i, j].EgyediNév : "", Color.Aqua, tr); table.AddView(tr); } } }); }); } + + public override bool OnCreateOptionsMenu(IMenu menu) + { + MenuInflater.Inflate(Resource.Menu.main_menu_light, menu); + return base.OnCreateOptionsMenu(menu); + } + + public override bool OnOptionsItemSelected(IMenuItem item) + { + switch (item.ItemId) + { + case Resource.Id.menu_refresh: + { + var bar = FindViewById(Resource.Id.progressBar1); + handler.Post(() => bar.Visibility = ViewStates.Visible); + API.HelyettesítésFrissítés().ContinueWith(t => //TODO: Megjelenítés frissítése + { + handler.Post(() => bar.Visibility = ViewStates.Gone); + }); + break; + } + case Resource.Id.menu_add: //TODO + break; + case Resource.Id.menu_edit: //TODO + break; + case Resource.Id.menu_preferences: //TODO + break; + case Resource.Id.menu_fullrefresh: + { + var bar = FindViewById(Resource.Id.progressBar1); + handler.Post(() => bar.Visibility = ViewStates.Visible); + API.Frissítés().ContinueWith(t => //TODO: Megjelenítés frissítése + { + handler.Post(() => bar.Visibility = ViewStates.Gone); + }); + break; + } + } + return base.OnOptionsItemSelected(item); + } } } diff --git a/OrarendAndroidApp/OrarendAndroidApp.csproj b/OrarendAndroidApp/OrarendAndroidApp.csproj index 1abbcb2..8ad7dac 100644 --- a/OrarendAndroidApp/OrarendAndroidApp.csproj +++ b/OrarendAndroidApp/OrarendAndroidApp.csproj @@ -45,31 +45,20 @@ - - - - ..\packages\Xamarin.Android.Support.v4.23.2.1\lib\MonoAndroid403\Xamarin.Android.Support.v4.dll - True - - - AndroidResource - - - @@ -85,6 +74,21 @@ Orarend + + + + + + + + + + + + + + +