From de330e854c393003201a626f069840950ed26940 Mon Sep 17 00:00:00 2001 From: NorbiPeti Date: Sat, 11 Mar 2017 22:25:37 +0100 Subject: [PATCH] =?UTF-8?q?Be=C3=A1ll=C3=ADt=C3=A1sok=20men=C3=BC=20=C3=A9?= =?UTF-8?q?s=20s=C3=B6t=C3=A9t/vil=C3=A1gos=20t=C3=A9ma=20hozz=C3=A1adva!?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Több óra próbálkozással De működik --- Orarend/API.cs | 6 +- Orarend/Settings.cs | 6 +- OrarendAndroidApp/ActivityBase.cs | 27 +++ OrarendAndroidApp/EditActivity.cs | 3 +- OrarendAndroidApp/MainActivity.cs | 80 ++++++--- OrarendAndroidApp/OrarendAndroidApp.csproj | 21 ++- .../Properties/AndroidManifest.xml | 2 +- .../Resources/Resource.Designer.cs | 162 ++++++++++-------- ...pe_added_light.xml => cell_shape_dark.xml} | 4 +- ...light.xml => cell_shape_selected_dark.xml} | 4 +- .../Resources/drawable/ic_add_white_24dp.png | Bin 0 -> 127 bytes .../drawable/ic_autorenew_white_24dp.png | Bin 0 -> 380 bytes .../drawable/ic_create_white_24dp.png | Bin 0 -> 214 bytes .../drawable/ic_settings_white_24dp.png | Bin 0 -> 460 bytes .../Resources/layout/MainLayout.axml | 7 +- .../Resources/menu/main_menu_light.axml | 5 +- .../Resources/xml/preferences.xml | 8 + OrarendAndroidApp/SettingsActivity.cs | 51 ++++++ 18 files changed, 268 insertions(+), 118 deletions(-) create mode 100644 OrarendAndroidApp/ActivityBase.cs rename OrarendAndroidApp/Resources/drawable/{cell_shape_added_light.xml => cell_shape_dark.xml} (57%) rename OrarendAndroidApp/Resources/drawable/{cell_shape_removed_light.xml => cell_shape_selected_dark.xml} (57%) create mode 100644 OrarendAndroidApp/Resources/drawable/ic_add_white_24dp.png create mode 100644 OrarendAndroidApp/Resources/drawable/ic_autorenew_white_24dp.png create mode 100644 OrarendAndroidApp/Resources/drawable/ic_create_white_24dp.png create mode 100644 OrarendAndroidApp/Resources/drawable/ic_settings_white_24dp.png create mode 100644 OrarendAndroidApp/Resources/xml/preferences.xml create mode 100644 OrarendAndroidApp/SettingsActivity.cs diff --git a/Orarend/API.cs b/Orarend/API.cs index 2c2bac8..c9d78b6 100644 --- a/Orarend/API.cs +++ b/Orarend/API.cs @@ -14,8 +14,8 @@ namespace Orarend { [DataContract] public 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 - internal static API példány = new API(); + { //TODO: Előre megadott egyedi nevek használata + internal static API példány = new API(); //TODO: FrissítésHa1ÓraEltelt() mentés private API() { } @@ -28,7 +28,7 @@ namespace Orarend public Osztály[] osztályok { get; private set; } [DataMember(Order = 2)] public List<Órarend> órarendek { get; private set; } = new List<Órarend>(); - [DataMember] + //[DataMember] public Settings beállítások { get; private set; } = new Settings(); /// /// Visszatér az osztályok listájával. diff --git a/Orarend/Settings.cs b/Orarend/Settings.cs index 16b9d73..ac3e806 100644 --- a/Orarend/Settings.cs +++ b/Orarend/Settings.cs @@ -7,13 +7,9 @@ using System.Threading.Tasks; namespace Orarend { - [DataContract] + [DataContract] // public class Settings { - [DataMember] - public bool DarkTheme { get; set; } - [DataMember] - public TimeSpan Difference { get; set; } //TODO public void UseCommonNames() { set("mateme", "Matek"); diff --git a/OrarendAndroidApp/ActivityBase.cs b/OrarendAndroidApp/ActivityBase.cs new file mode 100644 index 0000000..8822128 --- /dev/null +++ b/OrarendAndroidApp/ActivityBase.cs @@ -0,0 +1,27 @@ + +using Android.App; +using Android.OS; +using Android.Preferences; + +namespace OrarendAndroidApp +{ + public class ActivityBase : Activity + { + protected override void OnCreate(Bundle savedInstanceState) + { + base.OnCreate(savedInstanceState); + SetTheme(this); + } + + public static void SetTheme(Activity activity) + { + var settings = PreferenceManager.GetDefaultSharedPreferences(activity); + bool darktheme = settings.GetBoolean("pref_theme", false); + if (activity is ActivityBase) + (activity as ActivityBase).DarkTheme = darktheme; + activity.SetTheme(darktheme ? Android.Resource.Style.ThemeDeviceDefault : Android.Resource.Style.ThemeDeviceDefaultLight); + } + + public bool DarkTheme; + } +} \ No newline at end of file diff --git a/OrarendAndroidApp/EditActivity.cs b/OrarendAndroidApp/EditActivity.cs index 467a636..296791b 100644 --- a/OrarendAndroidApp/EditActivity.cs +++ b/OrarendAndroidApp/EditActivity.cs @@ -11,11 +11,12 @@ using Android.Views; using Android.Widget; using Orarend; using Android.Graphics; +using Android.Preferences; namespace OrarendAndroidApp { [Activity(Label = "AddActivity", Theme = "@android:style/Theme.Holo.Light")] - public class EditActivity : Activity + public class EditActivity : ActivityBase { private bool add; private int index; diff --git a/OrarendAndroidApp/MainActivity.cs b/OrarendAndroidApp/MainActivity.cs index c5cdde4..30fa3d6 100644 --- a/OrarendAndroidApp/MainActivity.cs +++ b/OrarendAndroidApp/MainActivity.cs @@ -13,25 +13,32 @@ using System.Threading.Tasks; using System.Threading; using System.IO; using System.Net; +using Android.Preferences; namespace OrarendAndroidApp { [Activity(Label = "Órarend", MainLauncher = true, Theme = "@android:style/Theme.Holo.Light")] - public class MainActivity : Activity + public class MainActivity : ActivityBase { private Handler handler; private Órarend órarend; private Timer timer; private const int EDIT_ADD_ACT_REQUEST = 1; + private const int SETTINGS_ACT_REQUEST = 2; public const string DATA_FILENAME = "data.json"; protected override void OnCreate(Bundle bundle) { + AndroidEnvironment.UnhandledExceptionRaiser += AndroidEnvironment_UnhandledExceptionRaiser; base.OnCreate(bundle); + //RequestWindowFeature(WindowFeatures.ActionBar); SetContentView(Resource.Layout.MainLayout); + //SetActionBar(new Toolbar(this)); ActionBar.SetDisplayShowTitleEnabled(false); - ActionBar.CustomView = FindViewById(Resource.Id.spinner); + //ActionBar.CustomView = new Spinner(this); + //ActionBar.CustomView = FindViewById(Resource.Id.spinner); + //ActionBar.SetCustomView(FindViewById(Resource.Id.spinner), new ActionBar.LayoutParams(GravityFlags.Left)); handler = new Handler(); string[] list = FileList(); if (list.Contains(DATA_FILENAME)) @@ -39,11 +46,18 @@ namespace OrarendAndroidApp timer = new Timer(CsengőTimer, null, new TimeSpan(0, 0, 0), new TimeSpan(0, 0, 5)); } + private void AndroidEnvironment_UnhandledExceptionRaiser(object sender, RaiseThrowableEventArgs e) + { + if (!e.Handled) + Hiba("Kezeletlen hiba!\n" + e.Exception); + e.Handled = true; + } + + private Spinner list; private void órarendlistafrissítés() { handler.Post(() => { - var list = FindViewById(Resource.Id.spinner); int selected = list.SelectedItemPosition; int count = list.Count; ArrayAdapter adapter; @@ -78,7 +92,7 @@ namespace OrarendAndroidApp textview.SetText(text, TextView.BufferType.Normal); textview.SetTextColor(color); textview.SetPadding(10, 10, 10, 10); - textview.SetBackgroundResource(Resource.Drawable.cell_shape_light); + textview.SetBackgroundResource(DarkTheme ? Resource.Drawable.cell_shape_dark : Resource.Drawable.cell_shape_light); textview.Tag = tag; textview.Clickable = true; textview.Click += ÓraClick; @@ -88,11 +102,11 @@ namespace OrarendAndroidApp private void HelyettesítésFrissítés(bool internethiba = true) { var bar = FindViewById(Resource.Id.progressBar1); - var menu = FindViewById(Resource.Id.actionMenuView1); + //var menu = FindViewById(Resource.Id.actionMenuView1); Action loadstart = () => { bar.Visibility = ViewStates.Visible; - menu.Enabled = false; + //menu.Enabled = false; }; handler.Post(loadstart); API.HelyettesítésFrissítés(() => OpenFileOutput(DATA_FILENAME, FileCreationMode.Private)).ContinueWith(t => @@ -101,7 +115,7 @@ namespace OrarendAndroidApp handler.Post(() => { bar.Visibility = ViewStates.Gone; - menu.Enabled = true; + //menu.Enabled = true; if (TaskHiba(t, internethiba)) { órarendfrissítés(); @@ -115,11 +129,11 @@ namespace OrarendAndroidApp private void ÓrarendFrissítés(Órarend ór = null) { var bar = FindViewById(Resource.Id.progressBar1); - var menu = FindViewById(Resource.Id.actionMenuView1); + //var menu = FindViewById(Resource.Id.actionMenuView1); Action loadstart = () => { bar.Visibility = ViewStates.Visible; - menu.Enabled = false; + //menu.Enabled = false; }; handler.Post(loadstart); API.Frissítés(() => OpenFileOutput(DATA_FILENAME, FileCreationMode.Private), ór).ContinueWith(t => @@ -151,9 +165,9 @@ namespace OrarendAndroidApp if (órarend == null) return; TableRow tr = new TableRow(this); - addCell(API.AHét ? "A" : "B", Color.Black, tr); + addCell(API.AHét ? "A" : "B", DarkTheme ? Color.White : Color.Black, tr); for (int i = 0; i < Napok.Length; i++) - addCell(Napok[i], Color.Black, tr); + addCell(Napok[i], DarkTheme ? Color.White : Color.Black, tr); table.AddView(tr, new ViewGroup.LayoutParams(ViewGroup.LayoutParams.WrapContent, ViewGroup.LayoutParams.WrapContent)); for (int j = 0; j < 16; j++) { @@ -169,14 +183,13 @@ namespace OrarendAndroidApp } if (notnull) { - addCell((j + 1).ToString(), Color.Black, tr); + addCell((j + 1).ToString(), DarkTheme ? Color.White : Color.Black, tr); for (int i = 0; i < 6; i++) { 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 }); + 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 ? (DarkTheme ? Color.WhiteSmoke : Color.Black) : Color.Red, tr, new int[2] { i, j }); } table.AddView(tr, new ViewGroup.LayoutParams(ViewGroup.LayoutParams.WrapContent, ViewGroup.LayoutParams.WrapContent)); } @@ -212,7 +225,7 @@ namespace OrarendAndroidApp var tv = (TextView)sender; var ij = (int[])tv.Tag; if (selected != null && selected != sender) - selected.SetBackgroundResource(Resource.Drawable.cell_shape_light); + selected.SetBackgroundResource(DarkTheme ? Resource.Drawable.cell_shape_dark : Resource.Drawable.cell_shape_light); Óra óra; Helyettesítés helyettesítésInnen = null; Helyettesítés helyettesítésIde = null; @@ -227,7 +240,7 @@ namespace OrarendAndroidApp deselect(); return; } - tv.SetBackgroundResource(Resource.Drawable.cell_shape_selected_light); + tv.SetBackgroundResource(DarkTheme ? Resource.Drawable.cell_shape_selected_dark : Resource.Drawable.cell_shape_selected_light); selected = tv; var kivora = FindViewById(Resource.Id.kivoraTV); if (óra == null) @@ -268,6 +281,15 @@ namespace OrarendAndroidApp public override bool OnCreateOptionsMenu(IMenu menu) { MenuInflater.Inflate(Resource.Menu.main_menu_light, menu); + ActionBar.SetCustomView(list = new Spinner(this, SpinnerMode.Dropdown), new ActionBar.LayoutParams(ActionBar.LayoutParams.MatchParent, ActionBar.LayoutParams.MatchParent, GravityFlags.Left)); + ActionBar.SetDisplayShowCustomEnabled(true); + if (DarkTheme) + { + menu.FindItem(Resource.Id.menu_add).SetIcon(Resource.Drawable.ic_add_white_24dp); + menu.FindItem(Resource.Id.menu_edit).SetIcon(Resource.Drawable.ic_create_white_24dp); + menu.FindItem(Resource.Id.menu_refresh).SetIcon(Resource.Drawable.ic_autorenew_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) ÓrarendFrissítés(); else @@ -304,8 +326,12 @@ namespace OrarendAndroidApp StartActivityForResult(intent, EDIT_ADD_ACT_REQUEST); break; } - case Resource.Id.menu_preferences: //TODO - break; + case Resource.Id.menu_preferences: + { + var intent = new Intent(this, typeof(SettingsActivity)); + StartActivityForResult(intent, SETTINGS_ACT_REQUEST); + break; + } case Resource.Id.menu_fullrefresh: { ÓrarendFrissítés(); @@ -360,7 +386,7 @@ namespace OrarendAndroidApp return; } var most = DateTime.Now - DateTime.Today; - //var most = new TimeSpan(13, 46, 0); + //var most = new TimeSpan(9, 46, 0); bool talált = false; var kovora = FindViewById(Resource.Id.kovoraTV); nincstöbbóra = false; @@ -375,15 +401,17 @@ namespace OrarendAndroidApp var vége = órarend.Órakezdetek[i].Add(new TimeSpan(0, 45, 0)); bool becsengetés; int x = (int)DateTime.Today.DayOfWeek - 1; //TODO: A mai nap és ez az egész az API-ba + //x = 2; //TODO: TMP Óra óra; var innenide = helyettesítésInnenIde(x, i); + Func óraperc = ts => ts.Hours > 0 ? ts.ToString("h\\ómm\\p") : ts.ToString("mm") + " perc"; 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 if (most > órarend.Órakezdetek[i]) { if (most < vége) { - kezdveg.Text = "Kicsengetés: " + (vége - most).ToString("hh\\:mm\\:ss"); + kezdveg.Text = "Kicsengetés: " + óraperc(vége - most); talált = true; becsengetés = false; } @@ -392,7 +420,7 @@ namespace OrarendAndroidApp } else { - kezdveg.Text = "Becsengetés: " + (órarend.Órakezdetek[i] - most).ToString("hh\\:mm\\:ss"); + kezdveg.Text = "Becsengetés: " + óraperc(órarend.Órakezdetek[i] - most); talált = true; becsengetés = true; } @@ -415,11 +443,11 @@ namespace OrarendAndroidApp protected override void OnActivityResult(int requestCode, [GeneratedEnum] Result resultCode, Intent data) { base.OnActivityResult(requestCode, resultCode, data); - if (resultCode == Result.Canceled) - return; - int index = data.Extras.GetBoolean("add") ? API.Órarendek.Count - 1 : data.Extras.GetInt("index"); if (requestCode == EDIT_ADD_ACT_REQUEST) { + if (resultCode == Result.Canceled) + return; + int index = data.Extras.GetBoolean("add") ? API.Órarendek.Count - 1 : data.Extras.GetInt("index"); if (!data.Extras.GetBoolean("deleted")) ÓrarendFrissítés(API.Órarendek[index]); else @@ -429,6 +457,10 @@ namespace OrarendAndroidApp } órarendlistafrissítés(); } + else if (requestCode == SETTINGS_ACT_REQUEST) + { + Recreate(); + } } public override void OnWindowFocusChanged(bool hasFocus) diff --git a/OrarendAndroidApp/OrarendAndroidApp.csproj b/OrarendAndroidApp/OrarendAndroidApp.csproj index 9bdfb85..19501c3 100644 --- a/OrarendAndroidApp/OrarendAndroidApp.csproj +++ b/OrarendAndroidApp/OrarendAndroidApp.csproj @@ -57,10 +57,12 @@ + + @@ -117,15 +119,30 @@ - + + + + Designer - + Designer + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/OrarendAndroidApp/SettingsActivity.cs b/OrarendAndroidApp/SettingsActivity.cs new file mode 100644 index 0000000..93dd806 --- /dev/null +++ b/OrarendAndroidApp/SettingsActivity.cs @@ -0,0 +1,51 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; + +using Android.App; +using Android.Content; +using Android.OS; +using Android.Runtime; +using Android.Views; +using Android.Widget; +using Android.Preferences; + +namespace OrarendAndroidApp +{ + [Activity(Label = "Belltsok", Theme = "@android:style/Theme.Holo.Light")] + public class SettingsActivity : PreferenceActivity, ISharedPreferencesOnSharedPreferenceChangeListener + { + protected override void OnCreate(Bundle savedInstanceState) + { + ActivityBase.SetTheme(this); + /*var settings = PreferenceManager.GetDefaultSharedPreferences(this); + bool darktheme = settings.GetBoolean("pref_theme", false); + //SetTheme(darktheme ? Android.Resource.Style.ThemeDeviceDefault : Android.Resource.Style.ThemeDeviceDefaultLight); + SetTheme(darktheme ? Android.Resource.Style.ThemeHolo : Android.Resource.Style.ThemeHoloLight);*/ + base.OnCreate(savedInstanceState); +#pragma warning disable CS0618 // Type or member is obsolete + AddPreferencesFromResource(Resource.Xml.preferences); +#pragma warning restore CS0618 // Type or member is obsolete + PreferenceManager.SetDefaultValues(this, Resource.Xml.preferences, false); + } + + public void OnSharedPreferenceChanged(ISharedPreferences sharedPreferences, string key) + { + if (key == "pref_theme") + Recreate(); + } + + protected override void OnResume() + { + base.OnResume(); + PreferenceManager.GetDefaultSharedPreferences(this).RegisterOnSharedPreferenceChangeListener(this); + } + + protected override void OnPause() + { + base.OnPause(); + PreferenceManager.GetDefaultSharedPreferences(this).UnregisterOnSharedPreferenceChangeListener(this); + } + } +} \ No newline at end of file