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$1>"), "<(td)" + trtd, "<$1>$2$1>");
- 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$1>"), "<(td)" + trtd, "<$1>$2$1>");
+ 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
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+