Compare commits

...

13 commits
v1.2 ... master

Author SHA1 Message Date
87c056b690
Create README.md 2018-06-22 11:52:37 +02:00
866903b790
Aaand again (AppVeyor btw) 2018-02-12 20:37:33 +01:00
6854be7281
És megint 2018-02-12 20:34:11 +01:00
538fb1b47c
And again 2018-02-12 20:20:40 +01:00
df6d850131
És megint 2018-02-12 20:17:31 +01:00
2ff64cd7c4
Let's try this again 2018-02-12 20:15:12 +01:00
d3a987d526
ValueTuple frissítése, üres sornál hely. 2018-02-12 19:55:06 +01:00
074ed19236 Hely. szöveg felülre, óra elmarad és egyéb jav. 2017-10-03 17:00:02 +02:00
403fde579d Kisebb előrehaladás 2017-09-29 21:24:08 +02:00
f4fc6d9278 Csengetés format javítva, long press elkezdve 2017-09-28 23:09:54 +02:00
34ede81265 Internethibát nem ír ki majdnem semmiképpen
És a percet 01 perc helyett 1 percként írja ki
2017-09-26 22:07:38 +02:00
e5915c8082 A/B hét javítva, 09.01-től számolja már, egyéb jav.
- Kódanalízis, biztonsági attribútumok
- Hibakezelés javítva (internethiba, stb.)
2017-09-24 21:45:05 +02:00
e46a588a9f Óra eltolás, auto. fr.-t nem jelzi egy ideig, gyakori óranevek 2017-09-07 23:07:18 +02:00
18 changed files with 234 additions and 81 deletions

View file

@ -9,6 +9,7 @@ using System.Linq;
using System.Net; using System.Net;
using System.Runtime.Serialization; using System.Runtime.Serialization;
using System.Runtime.Serialization.Json; using System.Runtime.Serialization.Json;
using System.Security;
using System.Text.RegularExpressions; using System.Text.RegularExpressions;
using System.Threading.Tasks; using System.Threading.Tasks;
@ -30,7 +31,7 @@ namespace Orarend
public Osztály[] osztályok { get; private set; } = new Osztály[0]; //Ez az initializáció csak akkor fut le, ha nem tölti be fájlból public Osztály[] osztályok { get; private set; } = new Osztály[0]; //Ez az initializáció csak akkor fut le, ha nem tölti be fájlból
[DataMember(Order = 2)] [DataMember(Order = 2)]
public List<Órarend> órarendek { get; private set; } = new List<Órarend>(); public List<Órarend> órarendek { get; private set; } = new List<Órarend>();
//[DataMember] [DataMember(Order = 3)]
public Settings beállítások { get; private set; } = new Settings(); public Settings beállítások { get; private set; } = new Settings();
/// <summary> /// <summary>
/// <para>Visszatér az osztályok listájával.</para> /// <para>Visszatér az osztályok listájával.</para>
@ -89,10 +90,11 @@ namespace Orarend
break; break;
default: default:
{ {
int x = int.Parse(node.FirstChild.InnerText) - 1; int x = int.Parse(node.FirstChild.InnerText) - 1, y = x - Beállítások.ÓraOffset;
maxx = x > maxx ? x : maxx; maxx = x > maxx ? x : maxx;
órarend.Órakezdetek[x] = TimeSpan.Parse(node.FirstChild.Attributes["title"].Value.Split('-')[0].Trim()); if (y >= 0 && y < órarend.Órakezdetek.Length)
var órák = (ahét ? órarend.ÓrákAHét : órarend.ÓrákBHét); órarend.Órakezdetek[y] = TimeSpan.Parse(node.FirstChild.Attributes["title"].Value.Split('-')[0].Trim());
var órák = ahét ? órarend.ÓrákAHét : órarend.ÓrákBHét;
for (int i = 0; i < 5; i++) //Napok for (int i = 0; i < 5; i++) //Napok
{ {
var óranode = node.ChildNodes[i + 1].FirstChild; var óranode = node.ChildNodes[i + 1].FirstChild;
@ -283,14 +285,16 @@ namespace Orarend
{ {
get get
{ {
int jelenlegihét = CultureInfo.InvariantCulture.Calendar.GetWeekOfYear(DateTime.Today, CalendarWeekRule.FirstFullWeek, DayOfWeek.Monday); int jelenlegihét = napbólhét(DateTime.Today);
if (DateTime.Today.DayOfWeek > DayOfWeek.Friday || DateTime.Today.DayOfWeek == DayOfWeek.Sunday) if (DateTime.Today.DayOfWeek > DayOfWeek.Friday || DateTime.Today.DayOfWeek == DayOfWeek.Sunday)
jelenlegihét++; jelenlegihét++;
return jelenlegihét; return jelenlegihét;
} }
} }
public static bool AHét { get => Hét % 2 == 0; } private static int napbólhét(DateTime nap) => CultureInfo.InvariantCulture.Calendar.GetWeekOfYear(nap, CalendarWeekRule.FirstFullWeek, DayOfWeek.Monday);
public static bool AHét { get => Hét % 2 == napbólhét(new DateTime(DateTime.Today.Year - (DateTime.Today.Month < 8 ? 1 : 0), 9, 1)) % 2; }
public static bool Fókusz public static bool Fókusz
{ {
@ -308,7 +312,7 @@ namespace Orarend
private static DateTime utolsófrissítésplusz1óra = DateTime.MinValue; private static DateTime utolsófrissítésplusz1óra = DateTime.MinValue;
public static event EventHandler<FrissítésEventArgs> Frissítéskor; public static event EventHandler<FrissítésEventArgs> Frissítéskor;
public class FrissítésEventArgs { public bool Siker { get; set; } = false; } public class FrissítésEventArgs : EventArgs { public bool Siker { get; set; } = false; }
private static void frissítésHa1ÓraEltelt() private static void frissítésHa1ÓraEltelt()
{ {
if (utolsófrissítésplusz1óra > DateTime.Now) if (utolsófrissítésplusz1óra > DateTime.Now)
@ -335,8 +339,8 @@ namespace Orarend
//Ha az eredeti óra elmarad, és ide lesz helyezve egy másik, az áthelyezést mutassa //Ha az eredeti óra elmarad, és ide lesz helyezve egy másik, az áthelyezést mutassa
public static Órarend Órarend { get; private set; } public static Órarend Órarend { get; private set; }
public static void ÓrarendKiválasztás(int position) => Órarend = Órarendek[position]; public static void ÓrarendKiválasztás(int position) { Órarend = Órarendek[position]; CsengőTimer(null); }
public static void ÓrarendKiválasztásTörlése() => Órarend = null; public static void ÓrarendKiválasztásTörlése() { Órarend = null; CsengőTimer(null); }
private static bool nincstöbbóra = false; private static bool nincstöbbóra = false;
public static event EventHandler<TimerEventArgs> CsengőTimerEvent; public static event EventHandler<TimerEventArgs> CsengőTimerEvent;
@ -346,9 +350,9 @@ namespace Orarend
if (Órarend == null) if (Órarend == null)
return new TimerEventArgs(null, "Nincs órarend kiválasztva"); return new TimerEventArgs(null, "Nincs órarend kiválasztva");
var most = DateTime.Now - DateTime.Today; var most = DateTime.Now - DateTime.Today;
//var most = new TimeSpan(9, 46, 0); //var most = new TimeSpan(12, 46, 0);
bool talált = false; bool talált = false;
if (Órarend.Órakezdetek[0] == TimeSpan.Zero) //Még nincsenek beállítva a kezdetek if (Órarend.Órakezdetek[Beállítások.ÓraOffset] == TimeSpan.Zero) //Még nincsenek beállítva a kezdetek
return new TimerEventArgs(null, "Betöltés"); return new TimerEventArgs(null, "Betöltés");
string kezdveg = null, kovora = null; string kezdveg = null, kovora = null;
for (int i = 0; i < Órarend.Órakezdetek.Length - 1; i++) for (int i = 0; i < Órarend.Órakezdetek.Length - 1; i++)
@ -358,7 +362,7 @@ namespace Orarend
int x = (int)DateTime.Today.DayOfWeek - 1; int x = (int)DateTime.Today.DayOfWeek - 1;
Óra óra; Óra óra;
var (innen, ide) = HelyettesítésInnenIde(Órarend, x, i); var (innen, ide) = HelyettesítésInnenIde(Órarend, x, i);
Func<TimeSpan, string> óraperc = ts => ts.Hours > 0 ? ts.ToString("h\\ómm\\p") : ts.ToString("mm") + " perc"; Func<TimeSpan, string> óraperc = ts => ts.Hours > 0 ? ts.ToString("h\\ómm\\p") : ts.ToString("%m") + " perc";
if (x != -1 && x < 6 && (óra = ide != null ? ide.ÚjÓra : innen != null ? innen.EredetiNap != innen.ÚjNap || innen.EredetiSorszám != innen.ÚjSorszám ? null : innen.ÚjÓra : Órarend.Órák[x][i]) != null) if (x != -1 && x < 6 && (óra = ide != null ? ide.ÚjÓra : innen != null ? innen.EredetiNap != innen.ÚjNap || innen.EredetiSorszám != innen.ÚjSorszám ? null : innen.ÚjÓra : Órarend.Órák[x][i]) != null)
{ //-1: Vasárnap { //-1: Vasárnap
if (most > Órarend.Órakezdetek[i]) if (most > Órarend.Órakezdetek[i])

View file

@ -33,6 +33,9 @@
<ErrorReport>prompt</ErrorReport> <ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel> <WarningLevel>4</WarningLevel>
</PropertyGroup> </PropertyGroup>
<PropertyGroup>
<SignAssembly>false</SignAssembly>
</PropertyGroup>
<ItemGroup> <ItemGroup>
<Compile Include="API.cs" /> <Compile Include="API.cs" />
<Compile Include="Events\TimerEventArgs.cs" /> <Compile Include="Events\TimerEventArgs.cs" />
@ -50,8 +53,8 @@
<Reference Include="HtmlAgilityPack, Version=1.4.9.5, Culture=neutral, processorArchitecture=MSIL"> <Reference Include="HtmlAgilityPack, Version=1.4.9.5, Culture=neutral, processorArchitecture=MSIL">
<HintPath>..\packages\HtmlAgilityPack.1.4.9.5\lib\portable-net45+netcore45+wp8+MonoAndroid+MonoTouch\HtmlAgilityPack.dll</HintPath> <HintPath>..\packages\HtmlAgilityPack.1.4.9.5\lib\portable-net45+netcore45+wp8+MonoAndroid+MonoTouch\HtmlAgilityPack.dll</HintPath>
</Reference> </Reference>
<Reference Include="System.ValueTuple, Version=4.0.1.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51, processorArchitecture=MSIL"> <Reference Include="System.ValueTuple, Version=4.0.2.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51">
<HintPath>..\packages\System.ValueTuple.4.3.0\lib\portable-net40+sl4+win8+wp8\System.ValueTuple.dll</HintPath> <HintPath>..\packages\System.ValueTuple.4.4.0\lib\portable-net40+sl4+win8+wp8\System.ValueTuple.dll</HintPath>
</Reference> </Reference>
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>

View file

@ -2,6 +2,7 @@
using System.Reflection; using System.Reflection;
using System.Runtime.CompilerServices; using System.Runtime.CompilerServices;
using System.Runtime.InteropServices; using System.Runtime.InteropServices;
using System.Security;
// General Information about an assembly is controlled through the following // General Information about an assembly is controlled through the following
// set of attributes. Change these attribute values to modify the information // set of attributes. Change these attribute values to modify the information
@ -15,6 +16,7 @@ using System.Runtime.InteropServices;
[assembly: AssemblyTrademark("")] [assembly: AssemblyTrademark("")]
[assembly: AssemblyCulture("")] [assembly: AssemblyCulture("")]
[assembly: NeutralResourcesLanguage("en")] [assembly: NeutralResourcesLanguage("en")]
[assembly: SecurityTransparent]
// Version information for an assembly consists of the following four values: // Version information for an assembly consists of the following four values:
// //

View file

@ -18,6 +18,7 @@ namespace Orarend
set(";prggy", "Programozás gyakorlat"); set(";prggy", "Programozás gyakorlat");
set("testns", "Tesi"); set("testns", "Tesi");
set("tapism", "Töri"); set("tapism", "Töri");
set("torten", "Töri");
set("matema", "Matek"); set("matema", "Matek");
set("bioege", "Biosz"); set("bioege", "Biosz");
set("foldra", "Föci"); set("foldra", "Föci");
@ -29,5 +30,8 @@ namespace Orarend
if (ÓraTípus.Típusok.ContainsKey(id)) if (ÓraTípus.Típusok.ContainsKey(id))
ÓraTípus.Típusok[id].EgyediNév = name; ÓraTípus.Típusok[id].EgyediNév = name;
} }
[DataMember]
public sbyte ÓraOffset { get; set; } = 0;
} }
} }

View file

@ -4,5 +4,5 @@
<package id="System.Collections" version="4.3.0" targetFramework="portable46-net451+win81" /> <package id="System.Collections" version="4.3.0" targetFramework="portable46-net451+win81" />
<package id="System.Resources.ResourceManager" version="4.3.0" targetFramework="portable46-net451+win81" /> <package id="System.Resources.ResourceManager" version="4.3.0" targetFramework="portable46-net451+win81" />
<package id="System.Runtime" version="4.3.0" targetFramework="portable46-net451+win81" /> <package id="System.Runtime" version="4.3.0" targetFramework="portable46-net451+win81" />
<package id="System.ValueTuple" version="4.3.0" targetFramework="portable46-net451+win81" /> <package id="System.ValueTuple" version="4.4.0" targetFramework="portable46-net451+win81" />
</packages> </packages>

View file

@ -21,6 +21,9 @@ namespace Orarend
[DataMember] [DataMember]
public string[] Csoportok { get; set; } public string[] Csoportok { get; set; }
[DataMember]
public bool ManuálisanHozzáadott { get; set; }
[DataMember] [DataMember]
public string Azonosító public string Azonosító
{ {

View file

@ -2,6 +2,7 @@
using System.Collections.Generic; using System.Collections.Generic;
using System.Linq; using System.Linq;
using System.Runtime.Serialization; using System.Runtime.Serialization;
using System.Security;
using System.Text; using System.Text;
using System.Threading.Tasks; using System.Threading.Tasks;

View file

@ -2,6 +2,7 @@
using Android.App; using Android.App;
using Android.OS; using Android.OS;
using Android.Preferences; using Android.Preferences;
using System.Security;
namespace OrarendAndroidApp namespace OrarendAndroidApp
{ {

View file

@ -12,6 +12,7 @@ using Android.Widget;
using Orarend; using Orarend;
using Android.Graphics; using Android.Graphics;
using Android.Preferences; using Android.Preferences;
using System.Security;
namespace OrarendAndroidApp namespace OrarendAndroidApp
{ {

View file

@ -15,6 +15,7 @@ using System.IO;
using System.Net; using System.Net;
using Android.Preferences; using Android.Preferences;
using Orarend.Events; using Orarend.Events;
using System.Security;
namespace OrarendAndroidApp namespace OrarendAndroidApp
{ {
@ -43,6 +44,11 @@ namespace OrarendAndroidApp
} }
} }
protected override void OnDestroy()
{
base.OnDestroy();
}
private void AndroidEnvironment_UnhandledExceptionRaiser(object sender, RaiseThrowableEventArgs e) private void AndroidEnvironment_UnhandledExceptionRaiser(object sender, RaiseThrowableEventArgs e)
{ {
if (!e.Handled) Hiba("Kezeletlen hiba!\n" + e.Exception); if (!e.Handled) Hiba("Kezeletlen hiba!\n" + e.Exception);
@ -82,6 +88,7 @@ namespace OrarendAndroidApp
órarendfrissítés(); órarendfrissítés();
} }
[SecuritySafeCritical]
private void addCell(string text, Color color, TableRow tr1, (int, int)? tag = null) private void addCell(string text, Color color, TableRow tr1, (int, int)? tag = null)
{ {
TextView textview = new TextView(this); TextView textview = new TextView(this);
@ -92,9 +99,13 @@ namespace OrarendAndroidApp
textview.Tag = tag.HasValue ? new JavaTuple<int, int>(tag.Value) : null; textview.Tag = tag.HasValue ? new JavaTuple<int, int>(tag.Value) : null;
textview.Clickable = true; textview.Clickable = true;
textview.Click += ÓraClick; textview.Click += ÓraClick;
//textview.LongClick += ÓraLongClick;
RegisterForContextMenu(textview);
textview.ContextMenuCreated += ÓraContextMenuCreated;
tr1.AddView(textview); tr1.AddView(textview);
} }
[SecuritySafeCritical]
private class JavaTuple<T1, T2> : Java.Lang.Object private class JavaTuple<T1, T2> : Java.Lang.Object
{ {
public (T1, T2) obj; public (T1, T2) obj;
@ -107,7 +118,10 @@ namespace OrarendAndroidApp
var bar = FindViewById<ProgressBar>(Resource.Id.progressBar1); var bar = FindViewById<ProgressBar>(Resource.Id.progressBar1);
//var menu = FindViewById<ActionMenuView>(Resource.Id.actionMenuView1); //var menu = FindViewById<ActionMenuView>(Resource.Id.actionMenuView1);
Action loadstart = () => bar.Visibility = ViewStates.Visible; Action loadstart = () => bar.Visibility = ViewStates.Visible;
if (internethiba)
handler.Post(loadstart); handler.Post(loadstart);
else
handler.PostDelayed(loadstart, 500);
API.HelyettesítésFrissítés(() => OpenFileOutput(DATA_FILENAME, FileCreationMode.Private)).ContinueWith(t => API.HelyettesítésFrissítés(() => OpenFileOutput(DATA_FILENAME, FileCreationMode.Private)).ContinueWith(t =>
{ {
handler.RemoveCallbacks(loadstart); handler.RemoveCallbacks(loadstart);
@ -125,10 +139,13 @@ namespace OrarendAndroidApp
}); });
} }
private void ÓrarendFrissítés(Órarend ór = null) private void ÓrarendFrissítés(bool auto, Órarend ór = null)
{ {
var bar = FindViewById<ProgressBar>(Resource.Id.progressBar1); var bar = FindViewById<ProgressBar>(Resource.Id.progressBar1);
Action loadstart = () => bar.Visibility = ViewStates.Visible; Action loadstart = () => bar.Visibility = ViewStates.Visible;
if (auto)
handler.PostDelayed(loadstart, 500);
else
handler.Post(loadstart); handler.Post(loadstart);
API.Frissítés(() => OpenFileOutput(DATA_FILENAME, FileCreationMode.Private), ór).ContinueWith(t => API.Frissítés(() => OpenFileOutput(DATA_FILENAME, FileCreationMode.Private), ór).ContinueWith(t =>
{ {
@ -150,6 +167,7 @@ namespace OrarendAndroidApp
private string[] Napok = new string[6] { "Hétfő", "Kedd", "Szerda", "Csütörtök", "Péntek", "Szombat" }; private string[] Napok = new string[6] { "Hétfő", "Kedd", "Szerda", "Csütörtök", "Péntek", "Szombat" };
[SecuritySafeCritical]
private void órarendfrissítés() private void órarendfrissítés()
{ {
var table = FindViewById<TableLayout>(Resource.Id.tableLayout1); var table = FindViewById<TableLayout>(Resource.Id.tableLayout1);
@ -170,7 +188,7 @@ namespace OrarendAndroidApp
bool notnull = false; bool notnull = false;
for (int i = 0; i < 6; i++) for (int i = 0; i < 6; i++)
{ //Kihagyja az üres sorokat { //Kihagyja az üres sorokat
if (API.Órarend.Órák[i][j] != null) //TODO: Helyettesítéseket is figyelje if (API.Órarend.Órák[i][j] != null && API.HelyettesítésInnenIde(API.Órarend, i, j).Item2 != null)
{ {
notnull = true; notnull = true;
break; break;
@ -191,7 +209,7 @@ namespace OrarendAndroidApp
for (int i = 0; i < 6; i++) for (int i = 0; i < 6; i++)
{ {
var (innen, ide) = API.HelyettesítésInnenIde(API.Órarend, i, j); var (innen, ide) = API.HelyettesítésInnenIde(API.Órarend, i, j);
addCell(ide != null ? ide.ÚjÓra.EgyediNév : innen != null ? innen.EredetiNap != innen.ÚjNap || innen.EredetiSorszám != innen.ÚjSorszám ? "Áthelyezve" : innen.ÚjÓra?.EgyediNév ?? "elmarad" : API.Órarend.Órák[i][j]?.EgyediNév ?? "", innen == null ? (DarkTheme ? Color.WhiteSmoke : Color.Black) : Color.Red, tr, (i, j)); addCell(ide != null ? ide.ÚjÓra.EgyediNév : innen != null ? innen.EredetiNap != innen.ÚjNap || innen.EredetiSorszám != innen.ÚjSorszám ? "áthelyezve" : innen.ÚjÓra?.EgyediNév ?? "elmarad" : API.Órarend.Órák[i][j]?.EgyediNév ?? "", innen == null ? (DarkTheme ? Color.WhiteSmoke : Color.Black) : Color.Red, tr, (i, j));
} }
table.AddView(tr, new ViewGroup.LayoutParams(ViewGroup.LayoutParams.WrapContent, ViewGroup.LayoutParams.WrapContent)); table.AddView(tr, new ViewGroup.LayoutParams(ViewGroup.LayoutParams.WrapContent, ViewGroup.LayoutParams.WrapContent));
} }
@ -200,6 +218,24 @@ namespace OrarendAndroidApp
handler.Post(() => MaiNaphozGörgetés()); handler.Post(() => MaiNaphozGörgetés());
} }
private (int i, int j, Óra óra, Helyettesítés innen, Helyettesítés ide)? TV2Óra(TextView tv)
{
var ij = (JavaTuple<int, int>)tv.Tag;
int i, j;
Helyettesítés innen, ide;
Óra óra;
if (ij != null)
{
(i, j) = ij;
(innen, ide) = API.HelyettesítésInnenIde(API.Órarend, i, j);
if ((óra = API.Órarend.Órák[i][j]) == null && ide?.ÚjÓra == null)
return null;
}
else
return null;
return (i, j, óra, innen, ide);
}
/// <summary> /// <summary>
/// A cellát nem frissíti, csak a szöveget tünteti el /// A cellát nem frissíti, csak a szöveget tünteti el
/// </summary> /// </summary>
@ -214,31 +250,19 @@ namespace OrarendAndroidApp
/// <summary> /// <summary>
/// Kiválasztja az adott órát /// Kiválasztja az adott órát
/// </summary> /// </summary>
[SecuritySafeCritical]
private void ÓraClick(object sender, EventArgs e) private void ÓraClick(object sender, EventArgs e)
{ {
var tv = (TextView)sender; var tv = (TextView)sender;
if (selected != null && selected != sender) if (selected != null && selected != sender)
selected.SetBackgroundResource(DarkTheme ? Resource.Drawable.cell_shape_dark : Resource.Drawable.cell_shape_light); selected.SetBackgroundResource(DarkTheme ? Resource.Drawable.cell_shape_dark : Resource.Drawable.cell_shape_light);
Óra óra; var x = TV2Óra(tv);
Helyettesítés helyettesítésInnen = null; if (x == null)
Helyettesítés helyettesítésIde = null;
var ij = (JavaTuple<int, int>)tv.Tag;
int i, j;
if (ij != null)
{
(i, j) = ij;
(helyettesítésInnen, helyettesítésIde) = API.HelyettesítésInnenIde(API.Órarend, i, j);
if ((óra = API.Órarend.Órák[i][j]) == null && helyettesítésIde?.ÚjÓra == null)
{
deselect();
return;
}
}
else
{ {
deselect(); deselect();
return; return;
} }
var (i, j, óra, helyettesítésInnen, helyettesítésIde) = x?.ToTuple();
tv.SetBackgroundResource(DarkTheme ? Resource.Drawable.cell_shape_selected_dark : Resource.Drawable.cell_shape_selected_light); tv.SetBackgroundResource(DarkTheme ? Resource.Drawable.cell_shape_selected_dark : Resource.Drawable.cell_shape_selected_light);
selected = tv; selected = tv;
var kivora = FindViewById<TextView>(Resource.Id.kivoraTV); var kivora = FindViewById<TextView>(Resource.Id.kivoraTV);
@ -264,7 +288,8 @@ namespace OrarendAndroidApp
+ (helyettesítésInnen.ÚjÓra.Terem != óra.Terem ? "\nTerem: " + helyettesítésInnen.ÚjÓra.Terem : "") + (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.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) : "") + (helyettesítésInnen.ÚjÓra.Csoportok[0] != óra.Csoportok[0] ? "\nCsoport: " + helyettesítésInnen.ÚjÓra.Csoportok.Aggregate((a, b) => a + ", " + b) : "")
: "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)
? "" : "Az óra elmarad") //Ha át lett helyezve ide másik óra, akkor nem kell kiírni, hogy elmarad ez az óra
+ (helyettesítésIde == null ? "" + (helyettesítésIde == null ? ""
: helyettesítésIde.EredetiNap != helyettesítésIde.ÚjNap || helyettesítésIde.EredetiSorszám != helyettesítésIde.ÚjSorszám : helyettesítésIde.EredetiNap != helyettesítésIde.ÚjNap || helyettesítésIde.EredetiSorszám != helyettesítésIde.ÚjSorszám
? "Áthelyezve: " + Napok[(int)helyettesítésIde.EredetiNap - 1] + " " + helyettesítésIde.EredetiSorszám + ". óra --> ide" ? "Áthelyezve: " + Napok[(int)helyettesítésIde.EredetiNap - 1] + " " + helyettesítésIde.EredetiSorszám + ". óra --> ide"
@ -274,7 +299,40 @@ namespace OrarendAndroidApp
+ (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 + (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 : "") //Ha a pozicíó nem változott, a fentebbi rész már kiírta az adatait
; ;
hely.Visibility = ViewStates.Visible; hely.Visibility = hely.Text.Length > 0 ? ViewStates.Visible : ViewStates.Gone;
}
private void ÓraContextMenuCreated(object sender, View.CreateContextMenuEventArgs e)
{
switch (sender)
{
case TextView tv:
var x = TV2Óra(tv);
Óra óra;
if (x != null)
(_, _, óra, _, _) = x?.ToTuple();
else
óra = null;
if (óra == null)
{ //TODO
ÓraContextItemData.Add(e.Menu.Add("Hozzáadás"), () => StartActivity(new Intent(this, typeof(SettingsActivity))));
}
break;
default:
Hiba("Ismeretlen küldő a menühöz!");
break;
}
}
private Dictionary<IMenuItem, Action> ÓraContextItemData = new Dictionary<IMenuItem, Action>();
private T ctor<T>() where T : new() => new T();
public override bool OnContextItemSelected(IMenuItem item)
{
bool ret = ÓraContextItemData.ContainsKey(item);
if (ret)
ÓraContextItemData[item]();
return ret;
} }
public override bool OnCreateOptionsMenu(IMenu menu) public override bool OnCreateOptionsMenu(IMenu menu)
@ -290,7 +348,7 @@ namespace OrarendAndroidApp
menu.FindItem(Resource.Id.menu_preferences).SetIcon(Resource.Drawable.ic_settings_white_24dp); menu.FindItem(Resource.Id.menu_preferences).SetIcon(Resource.Drawable.ic_settings_white_24dp);
} }
if (API.Osztályok == null || API.Osztályok.Length == 0) if (API.Osztályok == null || API.Osztályok.Length == 0)
ÓrarendFrissítés(); ÓrarendFrissítés(true);
else else
órarendlistafrissítés(); órarendlistafrissítés();
return base.OnCreateOptionsMenu(menu); return base.OnCreateOptionsMenu(menu);
@ -333,7 +391,7 @@ namespace OrarendAndroidApp
} }
case Resource.Id.menu_fullrefresh: case Resource.Id.menu_fullrefresh:
{ {
ÓrarendFrissítés(); ÓrarendFrissítés(false);
break; break;
} }
} }
@ -358,13 +416,16 @@ namespace OrarendAndroidApp
{ {
if (ex is WebException wex) if (ex is WebException wex)
{ {
if (internethiba || wex.Status != WebExceptionStatus.NameResolutionFailure) if (internethiba && wex.Status == WebExceptionStatus.ConnectFailure)
Hiba("Nem sikerült csatlakozni az E-naplóhoz.\n" + wex.Message);
else if (wex.Status == WebExceptionStatus.ConnectFailure)
Hiba("Nem sikerült csatlakozni az E-naplóhoz.\nHa van internet, próbáld újraindítani az alkalmazást."); Hiba("Nem sikerült csatlakozni az E-naplóhoz.\nHa van internet, próbáld újraindítani az alkalmazást.");
else if (internethiba)
Hiba("Nem sikerült csatlakozni az E-naplóhoz.\n" + wex.Message);
} }
else if (ex is InvalidOperationException oex && oex.Data.Contains("OERROR") && (string)oex.Data["OERROR"] == "CLS_NOT_FOUND") else if (ex is InvalidOperationException oex && oex.Data.Contains("OERROR") && (string)oex.Data["OERROR"] == "CLS_NOT_FOUND")
ÓrarendFrissítés(); {
ÓrarendFrissítés(true);
Toast.MakeText(this, oex.Message, ToastLength.Short).Show();
}
else else
Hiba(ex.ToString()); Hiba(ex.ToString());
ret = false; ret = false;
@ -378,14 +439,10 @@ namespace OrarendAndroidApp
{ {
var kezdveg = FindViewById<TextView>(Resource.Id.kezdvegTV); var kezdveg = FindViewById<TextView>(Resource.Id.kezdvegTV);
var kovora = FindViewById<TextView>(Resource.Id.kovoraTV); var kovora = FindViewById<TextView>(Resource.Id.kovoraTV);
if (e.KövetkezőÓra == null) kovora.Visibility = e.KövetkezőÓra == null ? ViewStates.Invisible : ViewStates.Visible;
kovora.Visibility = ViewStates.Invisible; kovora.Text = e.KövetkezőÓra ?? "";
else kezdveg.Visibility = e.HátralévőIdő == null ? ViewStates.Invisible : ViewStates.Visible;
kovora.Text = e.KövetkezőÓra; kezdveg.Text = e.HátralévőIdő ?? "";
if (e.HátralévőIdő == null)
kezdveg.Visibility = ViewStates.Invisible;
else
kezdveg.Text = e.HátralévőIdő;
}); });
} }
@ -398,7 +455,7 @@ namespace OrarendAndroidApp
return; return;
int index = data.Extras.GetBoolean("add") ? API.Órarendek.Count - 1 : data.Extras.GetInt("index"); int index = data.Extras.GetBoolean("add") ? API.Órarendek.Count - 1 : data.Extras.GetInt("index");
if (!data.Extras.GetBoolean("deleted")) if (!data.Extras.GetBoolean("deleted"))
ÓrarendFrissítés(API.Órarendek[index]); ÓrarendFrissítés(false, API.Órarendek[index]);
else else
{ {
API.ÓrarendKiválasztásTörlése(); API.ÓrarendKiválasztásTörlése();
@ -407,8 +464,12 @@ namespace OrarendAndroidApp
órarendlistafrissítés(); órarendlistafrissítés();
} }
else if (requestCode == SETTINGS_ACT_REQUEST) else if (requestCode == SETTINGS_ACT_REQUEST)
{
if (data?.Extras?.GetBoolean("offsetchanged") ?? false)
ÓrarendFrissítés(false);
Recreate(); Recreate();
} }
}
public override void OnWindowFocusChanged(bool hasFocus) public override void OnWindowFocusChanged(bool hasFocus)
{ {

View file

@ -55,8 +55,8 @@
<Reference Include="mscorlib" /> <Reference Include="mscorlib" />
<Reference Include="System" /> <Reference Include="System" />
<Reference Include="System.Core" /> <Reference Include="System.Core" />
<Reference Include="System.ValueTuple, Version=4.0.1.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51, processorArchitecture=MSIL"> <Reference Include="System.ValueTuple, Version=4.0.2.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51">
<HintPath>..\packages\System.ValueTuple.4.3.0\lib\netstandard1.0\System.ValueTuple.dll</HintPath> <HintPath>..\packages\System.ValueTuple.4.4.0\lib\netstandard1.0\System.ValueTuple.dll</HintPath>
</Reference> </Reference>
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
@ -81,6 +81,7 @@
<AndroidResource Include="Resources\layout\EditLayout.axml"> <AndroidResource Include="Resources\layout\EditLayout.axml">
<SubType>AndroidResource</SubType> <SubType>AndroidResource</SubType>
</AndroidResource> </AndroidResource>
<AndroidResource Include="Resources\menu\ora_menu.axml" />
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<AndroidResource Include="Resources\values\Strings.xml" /> <AndroidResource Include="Resources\values\Strings.xml" />

View file

@ -111,8 +111,8 @@ namespace OrarendAndroidApp
// aapt resource value: 0x7f070008 // aapt resource value: 0x7f070008
public const int deleteButton = 2131165192; public const int deleteButton = 2131165192;
// aapt resource value: 0x7f070011 // aapt resource value: 0x7f070010
public const int helyTV = 2131165201; public const int helyTV = 2131165200;
// aapt resource value: 0x7f07000e // aapt resource value: 0x7f07000e
public const int horizontalView = 2131165198; public const int horizontalView = 2131165198;
@ -120,8 +120,8 @@ namespace OrarendAndroidApp
// aapt resource value: 0x7f070012 // aapt resource value: 0x7f070012
public const int kezdvegTV = 2131165202; public const int kezdvegTV = 2131165202;
// aapt resource value: 0x7f070010 // aapt resource value: 0x7f070011
public const int kivoraTV = 2131165200; public const int kivoraTV = 2131165201;
// aapt resource value: 0x7f070013 // aapt resource value: 0x7f070013
public const int kovoraTV = 2131165203; public const int kovoraTV = 2131165203;
@ -212,6 +212,9 @@ namespace OrarendAndroidApp
// aapt resource value: 0x7f060000 // aapt resource value: 0x7f060000
public const int main_menu_light = 2131099648; public const int main_menu_light = 2131099648;
// aapt resource value: 0x7f060001
public const int ora_menu = 2131099649;
static Menu() static Menu()
{ {
global::Android.Runtime.ResourceIdManager.UpdateIdValues(); global::Android.Runtime.ResourceIdManager.UpdateIdValues();

View file

@ -55,14 +55,6 @@
android:isScrollContainer="true" /> android:isScrollContainer="true" />
</HorizontalScrollView> </HorizontalScrollView>
</ScrollView> </ScrollView>
<TextView
android:id="@+id/kivoraTV"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Kiválasztott óra"
android:textSize="14sp"
android:textStyle="bold"
android:visibility="gone" />
<TextView <TextView
android:id="@+id/helyTV" android:id="@+id/helyTV"
android:layout_width="wrap_content" android:layout_width="wrap_content"
@ -72,6 +64,14 @@
android:textStyle="bold" android:textStyle="bold"
android:visibility="gone" android:visibility="gone"
android:textColor="#FF0000" /> android:textColor="#FF0000" />
<TextView
android:id="@+id/kivoraTV"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Kiválasztott óra"
android:textSize="14sp"
android:textStyle="bold"
android:visibility="gone" />
<TextView <TextView
android:id="@+id/kezdvegTV" android:id="@+id/kezdvegTV"
android:text="Betöltés" android:text="Betöltés"

View file

@ -0,0 +1,18 @@
<?xml version="1.0" encoding="utf-8" ?>
<menu xmlns:android="http://schemas.android.com/apk/res/android">
<item
android:id="@+id/menu_refresh"
android:title="Frissítés" />
<item
android:id="@+id/menu_add"
android:title="Hozzáadás" />
<item
android:id="@+id/menu_edit"
android:title="Szerkesztés" />
<item
android:id="@+id/menu_preferences"
android:title="Beállítások" />
<item
android:id="@+id/menu_fullrefresh"
android:title="Órarendfrissítés" />
</menu>

View file

@ -5,4 +5,14 @@
android:title="Sötét téma" android:title="Sötét téma"
android:summary="Sötét téma" android:summary="Sötét téma"
android:defaultValue="false" /> android:defaultValue="false" />
<Preference
android:key="pref_commonnames"
android:title="Gyakori óranevek"
android:summary="Gyakori óranevek használata" />
<EditTextPreference
android:key="pref_offset"
android:title="Óra eltolás"
android:summary="Pl. ha 1, akkor az első óra 8:15-kor kezdődik."
android:defaultValue="0"
android:numeric="integer" />
</PreferenceScreen> </PreferenceScreen>

View file

@ -10,11 +10,13 @@ using Android.Runtime;
using Android.Views; using Android.Views;
using Android.Widget; using Android.Widget;
using Android.Preferences; using Android.Preferences;
using Orarend;
using System.Security;
namespace OrarendAndroidApp namespace OrarendAndroidApp
{ {
[Activity(Label = "Beállítások", Theme = "@android:style/Theme.Holo.Light")] [Activity(Label = "Beállítások", Theme = "@android:style/Theme.Holo.Light")]
public class SettingsActivity : PreferenceActivity, ISharedPreferencesOnSharedPreferenceChangeListener public class SettingsActivity : PreferenceActivity, ISharedPreferencesOnSharedPreferenceChangeListener, Preference.IOnPreferenceClickListener
{ {
protected override void OnCreate(Bundle savedInstanceState) protected override void OnCreate(Bundle savedInstanceState)
{ {
@ -26,14 +28,30 @@ namespace OrarendAndroidApp
base.OnCreate(savedInstanceState); base.OnCreate(savedInstanceState);
#pragma warning disable CS0618 // Type or member is obsolete #pragma warning disable CS0618 // Type or member is obsolete
AddPreferencesFromResource(Resource.Xml.preferences); AddPreferencesFromResource(Resource.Xml.preferences);
FindPreference("pref_commonnames").OnPreferenceClickListener = this;
#pragma warning restore CS0618 // Type or member is obsolete #pragma warning restore CS0618 // Type or member is obsolete
PreferenceManager.SetDefaultValues(this, Resource.Xml.preferences, false); PreferenceManager.SetDefaultValues(this, Resource.Xml.preferences, false);
} }
private Intent intent;
public void OnSharedPreferenceChanged(ISharedPreferences sharedPreferences, string key) public void OnSharedPreferenceChanged(ISharedPreferences sharedPreferences, string key)
{ {
if (key == "pref_theme") switch (key)
{
case "pref_theme":
Recreate(); Recreate();
break;
case "pref_commonnames":
API.Beállítások.UseCommonNames();
Toast.MakeText(this, "Óranevek frissítve", ToastLength.Short).Show();
break;
case "pref_offset":
API.Beállítások.ÓraOffset = sbyte.Parse(sharedPreferences.GetString(key, "0"));
intent = new Intent(Intent);
intent.PutExtra("offsetchanged", true);
SetResult(Result.Ok, intent);
break;
}
} }
protected override void OnResume() protected override void OnResume()
@ -47,5 +65,22 @@ namespace OrarendAndroidApp
base.OnPause(); base.OnPause();
PreferenceManager.GetDefaultSharedPreferences(this).UnregisterOnSharedPreferenceChangeListener(this); PreferenceManager.GetDefaultSharedPreferences(this).UnregisterOnSharedPreferenceChangeListener(this);
} }
public override void OnBackPressed()
{
SetResult(Result.Ok, intent);
//base.OnBackPressed();
Finish();
}
public bool OnPreferenceClick(Preference preference)
{
if (preference.Key == "pref_commonnames")
{
API.Beállítások.UseCommonNames();
Toast.MakeText(this, "Óranevek frissítve", ToastLength.Short).Show();
}
return true;
}
} }
} }

View file

@ -1,4 +1,4 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<packages> <packages>
<package id="System.ValueTuple" version="4.3.0" targetFramework="monoandroid60" /> <package id="System.ValueTuple" version="4.4.0" targetFramework="monoandroid60" />
</packages> </packages>

6
README.md Normal file
View file

@ -0,0 +1,6 @@
# Orarend
A school schedule app written in C# using Xamarin.
This app can obtain the schedule automatically from the school's website and update it as needed. Any temporary changes are marked red.
It downloads the site HTML and uses regex to fix some issues that the parser can't handle correctly and then parses the code.