mirror of
https://github.com/XFox111/GUTSchedule.git
synced 2026-04-22 06:58:01 +03:00
Implemented date range filter, code cleanup
This commit is contained in:
+13
-12
@@ -1,14 +1,20 @@
|
|||||||
using Android.App;
|
using Android.App;
|
||||||
using Android.OS;
|
using Android.OS;
|
||||||
using Android.Widget;
|
using Android.Widget;
|
||||||
|
using GUT.Schedule.Models;
|
||||||
|
using System.Collections.Generic;
|
||||||
using System.Threading.Tasks;
|
using System.Threading.Tasks;
|
||||||
|
|
||||||
namespace GUT.Schedule
|
namespace GUT.Schedule
|
||||||
{
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// Shows status of schedule export process
|
||||||
|
/// </summary>
|
||||||
[Activity(Theme = "@style/AppTheme.NoActionBar")]
|
[Activity(Theme = "@style/AppTheme.NoActionBar")]
|
||||||
public class ExportActivity : Activity
|
public class ExportActivity : Activity
|
||||||
{
|
{
|
||||||
TextView status;
|
TextView status;
|
||||||
|
|
||||||
protected override async void OnCreate(Bundle savedInstanceState)
|
protected override async void OnCreate(Bundle savedInstanceState)
|
||||||
{
|
{
|
||||||
base.OnCreate(savedInstanceState);
|
base.OnCreate(savedInstanceState);
|
||||||
@@ -17,24 +23,19 @@ namespace GUT.Schedule
|
|||||||
status = FindViewById<TextView>(Resource.Id.status);
|
status = FindViewById<TextView>(Resource.Id.status);
|
||||||
|
|
||||||
status.Text = "Загрузка расписания";
|
status.Text = "Загрузка расписания";
|
||||||
await Parser.LoadSchedule();
|
List<Subject> schedule = await Parser.LoadSchedule();
|
||||||
|
|
||||||
|
schedule = schedule.FindAll(i => i.StartTime.Date >= Data.StartDate && i.StartTime.Date <= Data.EndDate); // Filtering schedule according to export range
|
||||||
|
|
||||||
status.Text = "Экспортирование в календарь";
|
status.Text = "Экспортирование в календарь";
|
||||||
int minutes = Data.Reminder switch
|
Calendar.Export(schedule);
|
||||||
{
|
|
||||||
1 => 0,
|
|
||||||
2 => 5,
|
|
||||||
3 => 10,
|
|
||||||
_ => -1
|
|
||||||
};
|
|
||||||
Calendar.Export(Data.Calendars[Data.Calendar].Id, Data.Schedule, minutes < 0 ? (int?)null : minutes, Data.AddTitle);
|
|
||||||
|
|
||||||
status.Text = "Готово";
|
status.Text = "Готово";
|
||||||
|
|
||||||
await Task.Delay(3000);
|
await Task.Delay(3000);
|
||||||
base.OnBackPressed();
|
base.OnBackPressed(); // Navigates back to main activity (always because I don't allow backward navigation)
|
||||||
}
|
}
|
||||||
|
|
||||||
public override void OnBackPressed() { }
|
public override void OnBackPressed() { } // Disables back button
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
+43
-32
@@ -6,6 +6,7 @@ using Android.OS;
|
|||||||
using Android.Support.V7.App;
|
using Android.Support.V7.App;
|
||||||
using Android.Views;
|
using Android.Views;
|
||||||
using Android.Widget;
|
using Android.Widget;
|
||||||
|
using GUT.Schedule.Models;
|
||||||
|
|
||||||
namespace GUT.Schedule
|
namespace GUT.Schedule
|
||||||
{
|
{
|
||||||
@@ -25,9 +26,9 @@ namespace GUT.Schedule
|
|||||||
AssignVariables();
|
AssignVariables();
|
||||||
AddEvents();
|
AddEvents();
|
||||||
|
|
||||||
|
// Settings spinners' dropdown lists content
|
||||||
faculty.SetList(this, Data.Faculties.Select(i => i.Name));
|
faculty.SetList(this, Data.Faculties.Select(i => i.Name));
|
||||||
course.SetList(this, "12345".ToCharArray());
|
course.SetList(this, "1234".ToCharArray());
|
||||||
|
|
||||||
reminder.SetList(this, new string[]
|
reminder.SetList(this, new string[]
|
||||||
{
|
{
|
||||||
"Нет",
|
"Нет",
|
||||||
@@ -35,30 +36,12 @@ namespace GUT.Schedule
|
|||||||
"За 5 мин",
|
"За 5 мин",
|
||||||
"За 10 мин"
|
"За 10 мин"
|
||||||
});
|
});
|
||||||
calendar.SetList(this, Data.Calendars.Select(i => i.Name));
|
calendar.SetList(this, Calendar.Calendars.Select(i => i.Name));
|
||||||
|
|
||||||
end.Text = Data.EndDate.ToShortDateString();
|
end.Text = Data.EndDate.ToShortDateString();
|
||||||
start.Text = Data.StartDate.ToShortDateString();
|
start.Text = Data.StartDate.ToShortDateString();
|
||||||
}
|
}
|
||||||
|
|
||||||
public override bool OnCreateOptionsMenu(IMenu menu)
|
|
||||||
{
|
|
||||||
MenuInflater.Inflate(Resource.Menu.menu_main, menu);
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
public override bool OnOptionsItemSelected(IMenuItem item)
|
|
||||||
{
|
|
||||||
int id = item.ItemId;
|
|
||||||
if (id == Resource.Id.github)
|
|
||||||
{
|
|
||||||
StartActivity(new Intent(Intent.ActionView, Android.Net.Uri.Parse("https://github.com/xfox111/GUTSchedule")));
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
return base.OnOptionsItemSelected(item);
|
|
||||||
}
|
|
||||||
|
|
||||||
private void Export_Click(object sender, EventArgs e)
|
private void Export_Click(object sender, EventArgs e)
|
||||||
{
|
{
|
||||||
error.Visibility = ViewStates.Gone;
|
error.Visibility = ViewStates.Gone;
|
||||||
@@ -69,26 +52,35 @@ namespace GUT.Schedule
|
|||||||
error.Visibility = ViewStates.Visible;
|
error.Visibility = ViewStates.Visible;
|
||||||
}
|
}
|
||||||
|
|
||||||
Data.Faculty = faculty.SelectedItemPosition;
|
// Forming export parameters
|
||||||
Data.Group = group.SelectedItemPosition;
|
Data.DataSet = new DataSet
|
||||||
Data.Course = course.SelectedItemPosition + 1;
|
{
|
||||||
Data.Reminder = reminder.SelectedItemPosition;
|
Faculty = Data.Faculties[faculty.SelectedItemPosition].Id,
|
||||||
Data.AddTitle = groupTitle.Checked;
|
Group = Data.Groups[group.SelectedItemPosition].Id,
|
||||||
|
Course = course.SelectedItemPosition + 1,
|
||||||
|
AddGroupToTitle = groupTitle.Checked,
|
||||||
|
Calendar = Calendar.Calendars[calendar.SelectedItemPosition].Id,
|
||||||
|
Reminder = reminder.SelectedItemPosition switch
|
||||||
|
{
|
||||||
|
1 => 0,
|
||||||
|
2 => 5,
|
||||||
|
3 => 10,
|
||||||
|
_ => null
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
StartActivity(new Intent(this, typeof(ExportActivity)));
|
StartActivity(new Intent(this, typeof(ExportActivity)));
|
||||||
}
|
}
|
||||||
|
|
||||||
private async void End_Click(object sender, EventArgs e)
|
private async void End_Click(object sender, EventArgs e)
|
||||||
{
|
{
|
||||||
DatePickerFragment picker = new DatePickerFragment();
|
Data.EndDate = await new DatePickerFragment().GetDate(SupportFragmentManager, Data.EndDate);
|
||||||
Data.EndDate = await picker.GetDate(SupportFragmentManager, "datePicker");
|
|
||||||
end.Text = Data.EndDate.ToShortDateString();
|
end.Text = Data.EndDate.ToShortDateString();
|
||||||
}
|
}
|
||||||
|
|
||||||
private async void Start_Click(object sender, EventArgs e)
|
private async void Start_Click(object sender, EventArgs e)
|
||||||
{
|
{
|
||||||
DatePickerFragment picker = new DatePickerFragment();
|
Data.StartDate = await new DatePickerFragment().GetDate(SupportFragmentManager, Data.StartDate);
|
||||||
Data.StartDate = await picker.GetDate(SupportFragmentManager, "datePicker");
|
|
||||||
start.Text = Data.StartDate.ToShortDateString();
|
start.Text = Data.StartDate.ToShortDateString();
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -101,8 +93,6 @@ namespace GUT.Schedule
|
|||||||
group.SetList(this, Data.Groups.Select(i => i.Name));
|
group.SetList(this, Data.Groups.Select(i => i.Name));
|
||||||
}
|
}
|
||||||
|
|
||||||
public override void OnBackPressed() { }
|
|
||||||
|
|
||||||
#region Init stuff
|
#region Init stuff
|
||||||
private void AssignVariables()
|
private void AssignVariables()
|
||||||
{
|
{
|
||||||
@@ -131,5 +121,26 @@ namespace GUT.Schedule
|
|||||||
export.Click += Export_Click;
|
export.Click += Export_Click;
|
||||||
}
|
}
|
||||||
#endregion
|
#endregion
|
||||||
|
|
||||||
|
#region Menu stuff
|
||||||
|
public override bool OnCreateOptionsMenu(IMenu menu)
|
||||||
|
{
|
||||||
|
MenuInflater.Inflate(Resource.Menu.menu_main, menu);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
public override bool OnOptionsItemSelected(IMenuItem item)
|
||||||
|
{
|
||||||
|
if (item.ItemId == Resource.Id.github)
|
||||||
|
{
|
||||||
|
StartActivity(new Intent(Intent.ActionView, Android.Net.Uri.Parse("https://github.com/xfox111/GUTSchedule")));
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
return base.OnOptionsItemSelected(item);
|
||||||
|
}
|
||||||
|
#endregion
|
||||||
|
|
||||||
|
public override void OnBackPressed() { } // Disables back button
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
+10
-5
@@ -13,6 +13,9 @@ using System.Net.Http;
|
|||||||
|
|
||||||
namespace GUT.Schedule
|
namespace GUT.Schedule
|
||||||
{
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// Splash screen activity. Loads init data
|
||||||
|
/// </summary>
|
||||||
[Activity(MainLauncher = true, Theme = "@style/AppTheme.NoActionBar")]
|
[Activity(MainLauncher = true, Theme = "@style/AppTheme.NoActionBar")]
|
||||||
public class StartActivity : AppCompatActivity
|
public class StartActivity : AppCompatActivity
|
||||||
{
|
{
|
||||||
@@ -40,7 +43,7 @@ namespace GUT.Schedule
|
|||||||
|
|
||||||
private async void Proceed()
|
private async void Proceed()
|
||||||
{
|
{
|
||||||
status.Text = "Загрузка списка доступных для записи календарей";
|
status.Text = "Загрузка списка календарей";
|
||||||
Calendar.LoadCalendars();
|
Calendar.LoadCalendars();
|
||||||
|
|
||||||
status.Text = "Загрузка списка факультетов";
|
status.Text = "Загрузка списка факультетов";
|
||||||
@@ -56,6 +59,7 @@ namespace GUT.Schedule
|
|||||||
public override void OnRequestPermissionsResult(int requestCode, string[] permissions, [GeneratedEnum] Permission[] grantResults)
|
public override void OnRequestPermissionsResult(int requestCode, string[] permissions, [GeneratedEnum] Permission[] grantResults)
|
||||||
{
|
{
|
||||||
base.OnRequestPermissionsResult(requestCode, permissions, grantResults);
|
base.OnRequestPermissionsResult(requestCode, permissions, grantResults);
|
||||||
|
|
||||||
if (grantResults.All(i => i == Permission.Granted))
|
if (grantResults.All(i => i == Permission.Granted))
|
||||||
Proceed();
|
Proceed();
|
||||||
else
|
else
|
||||||
@@ -63,10 +67,11 @@ namespace GUT.Schedule
|
|||||||
}
|
}
|
||||||
|
|
||||||
private void RequestPermissions() =>
|
private void RequestPermissions() =>
|
||||||
ActivityCompat.RequestPermissions(this, new string[]
|
ActivityCompat.RequestPermissions(this, new[]
|
||||||
{
|
{
|
||||||
Manifest.Permission.ReadCalendar, Manifest.Permission.WriteCalendar
|
Manifest.Permission.ReadCalendar,
|
||||||
}, 76);
|
Manifest.Permission.WriteCalendar
|
||||||
|
}, 76); // IDK why I need requestCode value to be set (instead of 76 there can be any other number. Anyway it doesn't affect anything)
|
||||||
|
|
||||||
private void ShowDialog()
|
private void ShowDialog()
|
||||||
{
|
{
|
||||||
@@ -79,6 +84,6 @@ namespace GUT.Schedule
|
|||||||
dialog.Show();
|
dialog.Show();
|
||||||
}
|
}
|
||||||
|
|
||||||
public override void OnBackPressed() { }
|
public override void OnBackPressed() { } // Disables back button
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -1,19 +0,0 @@
|
|||||||
Any raw assets you want to be deployed with your application can be placed in
|
|
||||||
this directory (and child directories) and given a Build Action of "AndroidAsset".
|
|
||||||
|
|
||||||
These files will be deployed with your package and will be accessible using Android's
|
|
||||||
AssetManager, like this:
|
|
||||||
|
|
||||||
public class ReadAsset : Activity
|
|
||||||
{
|
|
||||||
protected override void OnCreate (Bundle bundle)
|
|
||||||
{
|
|
||||||
base.OnCreate (bundle);
|
|
||||||
|
|
||||||
InputStream input = Assets.Open ("my_asset.txt");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
Additionally, some Android functions will automatically load asset files:
|
|
||||||
|
|
||||||
Typeface tf = Typeface.CreateFromAsset (Context.Assets, "fonts/samplefont.ttf");
|
|
||||||
@@ -1,21 +1,30 @@
|
|||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
using Android.App;
|
using Android.App;
|
||||||
using Android.Content;
|
|
||||||
using Android.Database;
|
using Android.Database;
|
||||||
using Android.Net;
|
using Android.Net;
|
||||||
using Android.Provider;
|
using Android.Provider;
|
||||||
using Android.Support.V4.Content;
|
using Android.Support.V4.Content;
|
||||||
|
using GUT.Schedule.Models;
|
||||||
using Java.Util;
|
using Java.Util;
|
||||||
|
|
||||||
namespace GUT.Schedule
|
namespace GUT.Schedule
|
||||||
{
|
{
|
||||||
public static class Calendar
|
public static class Calendar
|
||||||
{
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// List of all existing Google calendars on the device
|
||||||
|
/// </summary>
|
||||||
|
public static List<(string Id, string Name)> Calendars { get; private set; } = new List<(string Id, string Name)>();
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Retrieves all Google Accounts' calendars existing on the device and puts them to <see cref="Calendars"/>
|
||||||
|
/// </summary>
|
||||||
public static void LoadCalendars()
|
public static void LoadCalendars()
|
||||||
{
|
{
|
||||||
Data.Calendars = new List<(string, string)>();
|
Calendars = new List<(string, string)>(); // Resetting current calendars list
|
||||||
|
|
||||||
var calendarsUri = CalendarContract.Calendars.ContentUri;
|
// Building calendar data retrieval projections
|
||||||
|
Uri calendarsUri = CalendarContract.Calendars.ContentUri;
|
||||||
string[] calendarsProjection = {
|
string[] calendarsProjection = {
|
||||||
CalendarContract.Calendars.InterfaceConsts.Id,
|
CalendarContract.Calendars.InterfaceConsts.Id,
|
||||||
CalendarContract.Calendars.InterfaceConsts.CalendarDisplayName,
|
CalendarContract.Calendars.InterfaceConsts.CalendarDisplayName,
|
||||||
@@ -24,55 +33,62 @@ namespace GUT.Schedule
|
|||||||
CalendarContract.Calendars.InterfaceConsts.AccountType,
|
CalendarContract.Calendars.InterfaceConsts.AccountType,
|
||||||
};
|
};
|
||||||
|
|
||||||
using Android.Support.V4.Content.CursorLoader loader = new Android.Support.V4.Content.CursorLoader(Application.Context, calendarsUri, calendarsProjection, null, null, null);
|
// Retrieving calendars data
|
||||||
|
using CursorLoader loader = new CursorLoader(Application.Context, calendarsUri, calendarsProjection, null, null, null);
|
||||||
ICursor cursor = (ICursor)loader.LoadInBackground();
|
ICursor cursor = (ICursor)loader.LoadInBackground();
|
||||||
|
|
||||||
cursor.MoveToNext();
|
cursor.MoveToNext();
|
||||||
for (int i = 0; i < cursor.Count; i++)
|
for (int i = 0; i < cursor.Count; i++)
|
||||||
{
|
{
|
||||||
if (cursor.GetString(4) == "com.google" && !cursor.GetString(3).Contains("google"))
|
if (cursor.GetString(4) == "com.google" && !cursor.GetString(3).Contains("google")) // Loading only users' main calendars
|
||||||
Data.Calendars.Add((cursor.GetString(0), $"{cursor.GetString(1)} ({cursor.GetString(2)})"));
|
Calendars.Add((cursor.GetString(0), $"{cursor.GetString(1)} ({cursor.GetString(2)})"));
|
||||||
cursor.MoveToNext();
|
cursor.MoveToNext();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public static void Export(string calendarId, IEnumerable<Subject> schedule, int? remindBefore, bool addGroupToTitle)
|
|
||||||
|
public static void Export(IEnumerable<Subject> schedule)
|
||||||
{
|
{
|
||||||
|
DataSet data = Data.DataSet;
|
||||||
|
|
||||||
foreach (Subject item in schedule)
|
foreach (Subject item in schedule)
|
||||||
AddEvent(calendarId, item, remindBefore, addGroupToTitle);
|
|
||||||
}
|
|
||||||
|
|
||||||
static void AddEvent(string calendarId, Subject subject, int? reminderMinutes, bool addHeader)
|
|
||||||
{
|
{
|
||||||
ContentValues eventValues = new ContentValues();
|
Android.Content.ContentValues eventValues = new Android.Content.ContentValues();
|
||||||
|
|
||||||
eventValues.Put(CalendarContract.Events.InterfaceConsts.CalendarId, calendarId);
|
eventValues.Put(CalendarContract.Events.InterfaceConsts.CalendarId, data.Calendar);
|
||||||
eventValues.Put(CalendarContract.Events.InterfaceConsts.Title, $"{subject.Order}.{(addHeader ? $" [{subject.Group}]" : "")} {subject.Name} ({subject.Type})");
|
|
||||||
eventValues.Put(CalendarContract.Events.InterfaceConsts.Description, subject.Professor);
|
eventValues.Put(CalendarContract.Events.InterfaceConsts.Title, string.Format("{0}.{1} {2} ({3})",
|
||||||
eventValues.Put(CalendarContract.Events.InterfaceConsts.EventLocation, string.Join(';', subject.Cabinets));
|
item.Order,
|
||||||
|
data.AddGroupToTitle ? $" [{item.Group}]" : "",
|
||||||
|
item.Name,
|
||||||
|
item.Type));
|
||||||
|
|
||||||
|
eventValues.Put(CalendarContract.Events.InterfaceConsts.Description, string.Join(';', item.Professor));
|
||||||
|
eventValues.Put(CalendarContract.Events.InterfaceConsts.EventLocation, string.Join(';', item.Cabinets));
|
||||||
|
|
||||||
eventValues.Put(CalendarContract.Events.InterfaceConsts.Availability, 0);
|
eventValues.Put(CalendarContract.Events.InterfaceConsts.Availability, 0);
|
||||||
|
|
||||||
if(reminderMinutes.HasValue)
|
if (data.Reminder.HasValue)
|
||||||
eventValues.Put(CalendarContract.Events.InterfaceConsts.HasAlarm, true);
|
eventValues.Put(CalendarContract.Events.InterfaceConsts.HasAlarm, true);
|
||||||
|
|
||||||
eventValues.Put(CalendarContract.Events.InterfaceConsts.Dtstart, subject.StartTime.ToUnixTime());
|
eventValues.Put(CalendarContract.Events.InterfaceConsts.Dtstart, item.StartTime.ToUnixTime());
|
||||||
eventValues.Put(CalendarContract.Events.InterfaceConsts.Dtend, Extensions.ToUnixTime(subject.EndTime));
|
eventValues.Put(CalendarContract.Events.InterfaceConsts.Dtend, Extensions.ToUnixTime(item.EndTime));
|
||||||
|
|
||||||
eventValues.Put(CalendarContract.Events.InterfaceConsts.EventTimezone, TimeZone.Default.ID);
|
eventValues.Put(CalendarContract.Events.InterfaceConsts.EventTimezone, TimeZone.Default.ID);
|
||||||
eventValues.Put(CalendarContract.Events.InterfaceConsts.EventEndTimezone, TimeZone.Default.ID);
|
eventValues.Put(CalendarContract.Events.InterfaceConsts.EventEndTimezone, TimeZone.Default.ID);
|
||||||
|
|
||||||
Uri response = Application.Context.ContentResolver.Insert(CalendarContract.Events.ContentUri, eventValues);
|
Uri response = Application.Context.ContentResolver.Insert(CalendarContract.Events.ContentUri, eventValues);
|
||||||
|
|
||||||
if (reminderMinutes.HasValue)
|
if (data.Reminder.HasValue)
|
||||||
{
|
{
|
||||||
ContentValues reminderValues = new ContentValues();
|
Android.Content.ContentValues reminderValues = new Android.Content.ContentValues();
|
||||||
reminderValues.Put(CalendarContract.Reminders.InterfaceConsts.EventId, long.Parse(response.LastPathSegment));
|
reminderValues.Put(CalendarContract.Reminders.InterfaceConsts.EventId, long.Parse(response.LastPathSegment));
|
||||||
reminderValues.Put(CalendarContract.Reminders.InterfaceConsts.Method, 1);
|
reminderValues.Put(CalendarContract.Reminders.InterfaceConsts.Method, 1);
|
||||||
reminderValues.Put(CalendarContract.Reminders.InterfaceConsts.Minutes, reminderMinutes.Value);
|
reminderValues.Put(CalendarContract.Reminders.InterfaceConsts.Minutes, data.Reminder.Value);
|
||||||
|
|
||||||
Application.Context.ContentResolver.Insert(CalendarContract.Reminders.ContentUri, reminderValues);
|
Application.Context.ContentResolver.Insert(CalendarContract.Reminders.ContentUri, reminderValues);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
@@ -1,40 +0,0 @@
|
|||||||
using System;
|
|
||||||
using Android.OS;
|
|
||||||
using Android.Widget;
|
|
||||||
using Android.Support.V4.App;
|
|
||||||
using System.Threading.Tasks;
|
|
||||||
|
|
||||||
namespace GUT.Schedule
|
|
||||||
{
|
|
||||||
public class DatePickerFragment : DialogFragment, Android.App.DatePickerDialog.IOnDateSetListener
|
|
||||||
{
|
|
||||||
DateTime date;
|
|
||||||
bool dismissed = false;
|
|
||||||
public override Android.App.Dialog OnCreateDialog(Bundle savedInstanceState)
|
|
||||||
{
|
|
||||||
DateTime now = DateTime.Today;
|
|
||||||
return new Android.App.DatePickerDialog(Activity, this, now.Year, now.Month - 1, now.Day);
|
|
||||||
}
|
|
||||||
|
|
||||||
public void OnDateSet(DatePicker view, int year, int month, int dayOfMonth)
|
|
||||||
{
|
|
||||||
SetDate(view.DateTime);
|
|
||||||
}
|
|
||||||
|
|
||||||
public async Task<DateTime> GetDate(FragmentManager manager, string tag)
|
|
||||||
{
|
|
||||||
Show(manager, tag);
|
|
||||||
|
|
||||||
while (!dismissed)
|
|
||||||
await Task.Delay(500);
|
|
||||||
|
|
||||||
return date;
|
|
||||||
}
|
|
||||||
|
|
||||||
private void SetDate(DateTime date)
|
|
||||||
{
|
|
||||||
this.date = date;
|
|
||||||
dismissed = true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -8,11 +8,25 @@ namespace GUT.Schedule
|
|||||||
{
|
{
|
||||||
public static class Extensions
|
public static class Extensions
|
||||||
{
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// Sets array as Spinner dropdown list content
|
||||||
|
/// </summary>
|
||||||
|
/// <typeparam name="T">Array items type</typeparam>
|
||||||
|
/// <param name="spinner">Spinner on which array will be assigned to</param>
|
||||||
|
/// <param name="context">Current activity context. In most common cases <c>this</c> will do</param>
|
||||||
|
/// <param name="array">Array of items to be displayed</param>
|
||||||
public static void SetList<T>(this Spinner spinner, Context context, IEnumerable<T> array)
|
public static void SetList<T>(this Spinner spinner, Context context, IEnumerable<T> array)
|
||||||
{
|
{
|
||||||
ArrayAdapter adapter = new ArrayAdapter(context, Resource.Layout.support_simple_spinner_dropdown_item, array.ToList());
|
ArrayAdapter adapter = new ArrayAdapter(context, Resource.Layout.support_simple_spinner_dropdown_item, array.ToList());
|
||||||
spinner.Adapter = adapter;
|
spinner.Adapter = adapter;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Returns <see cref="DateTime"/> instance based on study week number, weekday and semester start day number
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="week">Number of the study week</param>
|
||||||
|
/// <param name="weekday">Weekday</param>
|
||||||
|
/// <returns><see cref="DateTime"/> instance based on study week number, weekday and semester start day number</returns>
|
||||||
public static DateTime GetDateFromWeeks(int week, int weekday)
|
public static DateTime GetDateFromWeeks(int week, int weekday)
|
||||||
{
|
{
|
||||||
DateTime dt = new DateTime(DateTime.Today.Year, 9, Data.FirstWeekDay);
|
DateTime dt = new DateTime(DateTime.Today.Year, 9, Data.FirstWeekDay);
|
||||||
@@ -22,6 +36,13 @@ namespace GUT.Schedule
|
|||||||
|
|
||||||
return dt;
|
return dt;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Converts <see cref="DateTime"/> to milliseconds count
|
||||||
|
/// </summary>
|
||||||
|
/// <remarks>In the nearest future we will be fucked because of that shit</remarks>
|
||||||
|
/// <param name="dt"><see cref="DateTime"/> which is to be converted to UNIX time</param>
|
||||||
|
/// <returns><see cref="long"/> which is represented by total milliseconds count passed since 1970</returns>
|
||||||
public static long ToUnixTime(this DateTime dt) =>
|
public static long ToUnixTime(this DateTime dt) =>
|
||||||
(long)dt.ToUniversalTime().Subtract(new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc)).TotalMilliseconds;
|
(long)dt.ToUniversalTime().Subtract(new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc)).TotalMilliseconds;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -0,0 +1,43 @@
|
|||||||
|
using System;
|
||||||
|
using Android.OS;
|
||||||
|
using Android.Widget;
|
||||||
|
using Android.App;
|
||||||
|
using System.Threading.Tasks;
|
||||||
|
|
||||||
|
namespace GUT.Schedule
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// Date picker
|
||||||
|
/// </summary>
|
||||||
|
public class DatePickerFragment : Android.Support.V4.App.DialogFragment, DatePickerDialog.IOnDateSetListener
|
||||||
|
{
|
||||||
|
DateTime _date;
|
||||||
|
bool dismissed = false;
|
||||||
|
public override Dialog OnCreateDialog(Bundle savedInstanceState) =>
|
||||||
|
new DatePickerDialog(Activity, this, _date.Year, _date.Month - 1, _date.Day);
|
||||||
|
|
||||||
|
// Occures when user selected a date
|
||||||
|
public void OnDateSet(DatePicker view, int year, int month, int dayOfMonth)
|
||||||
|
{
|
||||||
|
_date = view.DateTime;
|
||||||
|
dismissed = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Shows date picker and waits for user input
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="manager">Fragment manager of the current activity (In most common cases it is <c>this.FragmentManager</c>)</param>
|
||||||
|
/// <param name="date">Date which is to be selected by default</param>
|
||||||
|
/// <returns><see cref="DateTime"/> picked by user</returns>
|
||||||
|
public async Task<DateTime> GetDate(Android.Support.V4.App.FragmentManager manager, DateTime date)
|
||||||
|
{
|
||||||
|
_date = date;
|
||||||
|
Show(manager, "datePicker");
|
||||||
|
|
||||||
|
while (!dismissed)
|
||||||
|
await Task.Delay(100);
|
||||||
|
|
||||||
|
return date;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -60,21 +60,20 @@
|
|||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<Compile Include="Calendar.cs" />
|
<Compile Include="Calendar.cs" />
|
||||||
<Compile Include="Data.cs" />
|
<Compile Include="Models\Data.cs" />
|
||||||
<Compile Include="DatePickerFragment.cs" />
|
<Compile Include="Fragments\DatePickerFragment.cs" />
|
||||||
<Compile Include="ExportActivity.cs" />
|
<Compile Include="Activities\ExportActivity.cs" />
|
||||||
<Compile Include="Extensions.cs" />
|
<Compile Include="Extensions.cs" />
|
||||||
<Compile Include="MainActivity.cs" />
|
<Compile Include="Activities\MainActivity.cs" />
|
||||||
|
<Compile Include="Models\DataSet.cs" />
|
||||||
<Compile Include="Parser.cs" />
|
<Compile Include="Parser.cs" />
|
||||||
<Compile Include="Resources\Resource.designer.cs" />
|
<Compile Include="Resources\Resource.designer.cs" />
|
||||||
<Compile Include="Properties\AssemblyInfo.cs" />
|
<Compile Include="Properties\AssemblyInfo.cs" />
|
||||||
<Compile Include="StartActivity.cs" />
|
<Compile Include="Activities\StartActivity.cs" />
|
||||||
<Compile Include="Subject.cs" />
|
<Compile Include="Models\Subject.cs" />
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<None Include="Resources\AboutResources.txt" />
|
|
||||||
<None Include="Properties\AndroidManifest.xml" />
|
<None Include="Properties\AndroidManifest.xml" />
|
||||||
<None Include="Assets\AboutAssets.txt" />
|
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<AndroidResource Include="Resources\layout\activity_main.xml">
|
<AndroidResource Include="Resources\layout\activity_main.xml">
|
||||||
|
|||||||
@@ -1,4 +1,5 @@
|
|||||||
using System;
|
using GUT.Schedule.Models;
|
||||||
|
using System;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
|
|
||||||
namespace GUT.Schedule
|
namespace GUT.Schedule
|
||||||
@@ -7,17 +8,13 @@ namespace GUT.Schedule
|
|||||||
{
|
{
|
||||||
public static List<(string Id, string Name)> Faculties { get; set; }
|
public static List<(string Id, string Name)> Faculties { get; set; }
|
||||||
public static List<(string Id, string Name)> Groups { get; set; }
|
public static List<(string Id, string Name)> Groups { get; set; }
|
||||||
public static List<(string Id, string Name)> Calendars { get; set; }
|
|
||||||
public static List<Subject> Schedule { get; set; }
|
|
||||||
public static int FirstWeekDay { get; set; }
|
public static int FirstWeekDay { get; set; }
|
||||||
public static DateTime StartDate { get; set; } = DateTime.Today;
|
public static DateTime StartDate { get; set; } = DateTime.Today;
|
||||||
public static DateTime EndDate { get; set; } = DateTime.Today.AddDays(7);
|
public static DateTime EndDate { get; set; } = DateTime.Today.AddDays(7);
|
||||||
|
|
||||||
public static int Faculty { get; set; }
|
/// <summary>
|
||||||
public static int Group { get; set; }
|
/// Export parameters
|
||||||
public static int Course { get; set; }
|
/// </summary>
|
||||||
public static int Calendar { get; set; }
|
public static DataSet DataSet { get; set; }
|
||||||
public static int Reminder { get; set; }
|
|
||||||
public static bool AddTitle { get; set; }
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -1,7 +1,7 @@
|
|||||||
using System;
|
using System;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
|
|
||||||
namespace GUT.Schedule
|
namespace GUT.Schedule.Models
|
||||||
{
|
{
|
||||||
public class Subject
|
public class Subject
|
||||||
{
|
{
|
||||||
@@ -1,44 +0,0 @@
|
|||||||
Images, layout descriptions, binary blobs and string dictionaries can be included
|
|
||||||
in your application as resource files. Various Android APIs are designed to
|
|
||||||
operate on the resource IDs instead of dealing with images, strings or binary blobs
|
|
||||||
directly.
|
|
||||||
|
|
||||||
For example, a sample Android app that contains a user interface layout (main.xml),
|
|
||||||
an internationalization string table (strings.xml) and some icons (drawable-XXX/icon.png)
|
|
||||||
would keep its resources in the "Resources" directory of the application:
|
|
||||||
|
|
||||||
Resources/
|
|
||||||
drawable/
|
|
||||||
icon.png
|
|
||||||
|
|
||||||
layout/
|
|
||||||
main.xml
|
|
||||||
|
|
||||||
values/
|
|
||||||
strings.xml
|
|
||||||
|
|
||||||
In order to get the build system to recognize Android resources, set the build action to
|
|
||||||
"AndroidResource". The native Android APIs do not operate directly with filenames, but
|
|
||||||
instead operate on resource IDs. When you compile an Android application that uses resources,
|
|
||||||
the build system will package the resources for distribution and generate a class called "R"
|
|
||||||
(this is an Android convention) that contains the tokens for each one of the resources
|
|
||||||
included. For example, for the above Resources layout, this is what the R class would expose:
|
|
||||||
|
|
||||||
public class R {
|
|
||||||
public class drawable {
|
|
||||||
public const int icon = 0x123;
|
|
||||||
}
|
|
||||||
|
|
||||||
public class layout {
|
|
||||||
public const int main = 0x456;
|
|
||||||
}
|
|
||||||
|
|
||||||
public class strings {
|
|
||||||
public const int first_string = 0xabc;
|
|
||||||
public const int second_string = 0xbcd;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
You would then use R.drawable.icon to reference the drawable/icon.png file, or R.layout.main
|
|
||||||
to reference the layout/main.xml file, or R.strings.first_string to reference the first
|
|
||||||
string in the dictionary file values/strings.xml.
|
|
||||||
@@ -3,7 +3,6 @@
|
|||||||
xmlns:tools="http://schemas.android.com/tools">
|
xmlns:tools="http://schemas.android.com/tools">
|
||||||
<item
|
<item
|
||||||
android:id="@+id/github"
|
android:id="@+id/github"
|
||||||
android:orderInCategory="100"
|
|
||||||
android:title="Посмотреть исходный код на GitHub"
|
android:title="Посмотреть исходный код на GitHub"
|
||||||
app:showAsAction="never" />
|
app:showAsAction="never" />
|
||||||
</menu>
|
</menu>
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
<?xml version="1.0" encoding="utf-8"?>
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
<adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android">
|
<adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android">
|
||||||
<background android:drawable="@color/ic_launcher_background"/>
|
<background android:drawable="@color/colorPrimary"/>
|
||||||
<foreground android:drawable="@mipmap/ic_launcher_foreground"/>
|
<foreground android:drawable="@mipmap/ic_launcher_foreground"/>
|
||||||
</adaptive-icon>
|
</adaptive-icon>
|
||||||
@@ -1,5 +1,5 @@
|
|||||||
<?xml version="1.0" encoding="utf-8"?>
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
<adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android">
|
<adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android">
|
||||||
<background android:drawable="@color/ic_launcher_background"/>
|
<background android:drawable="@color/colorPrimary"/>
|
||||||
<foreground android:drawable="@mipmap/ic_launcher_foreground"/>
|
<foreground android:drawable="@mipmap/ic_launcher_foreground"/>
|
||||||
</adaptive-icon>
|
</adaptive-icon>
|
||||||
Reference in New Issue
Block a user