mirror of
https://github.com/XFox111/GUTSchedule.git
synced 2026-04-22 06:58:01 +03:00
@@ -15,9 +15,9 @@ Global
|
|||||||
{A0471165-37F5-4309-8A92-42F1A6589EEE}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
{A0471165-37F5-4309-8A92-42F1A6589EEE}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||||
{A0471165-37F5-4309-8A92-42F1A6589EEE}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
{A0471165-37F5-4309-8A92-42F1A6589EEE}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||||
{A0471165-37F5-4309-8A92-42F1A6589EEE}.Debug|Any CPU.Deploy.0 = Debug|Any CPU
|
{A0471165-37F5-4309-8A92-42F1A6589EEE}.Debug|Any CPU.Deploy.0 = Debug|Any CPU
|
||||||
{A0471165-37F5-4309-8A92-42F1A6589EEE}.Release (APK)|Any CPU.ActiveCfg = Release|Any CPU
|
{A0471165-37F5-4309-8A92-42F1A6589EEE}.Release (APK)|Any CPU.ActiveCfg = Release (APK)|Any CPU
|
||||||
{A0471165-37F5-4309-8A92-42F1A6589EEE}.Release (APK)|Any CPU.Build.0 = Release|Any CPU
|
{A0471165-37F5-4309-8A92-42F1A6589EEE}.Release (APK)|Any CPU.Build.0 = Release (APK)|Any CPU
|
||||||
{A0471165-37F5-4309-8A92-42F1A6589EEE}.Release (APK)|Any CPU.Deploy.0 = Release|Any CPU
|
{A0471165-37F5-4309-8A92-42F1A6589EEE}.Release (APK)|Any CPU.Deploy.0 = Release (APK)|Any CPU
|
||||||
{A0471165-37F5-4309-8A92-42F1A6589EEE}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
{A0471165-37F5-4309-8A92-42F1A6589EEE}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||||
{A0471165-37F5-4309-8A92-42F1A6589EEE}.Release|Any CPU.Build.0 = Release|Any CPU
|
{A0471165-37F5-4309-8A92-42F1A6589EEE}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||||
{A0471165-37F5-4309-8A92-42F1A6589EEE}.Release|Any CPU.Deploy.0 = Release|Any CPU
|
{A0471165-37F5-4309-8A92-42F1A6589EEE}.Release|Any CPU.Deploy.0 = Release|Any CPU
|
||||||
|
|||||||
@@ -0,0 +1,86 @@
|
|||||||
|
using Android.App;
|
||||||
|
using Android.Content;
|
||||||
|
using Android.Content.PM;
|
||||||
|
using Android.OS;
|
||||||
|
using Android.Support.V4.Text;
|
||||||
|
using Android.Support.V7.App;
|
||||||
|
using Android.Text.Method;
|
||||||
|
using Android.Widget;
|
||||||
|
using Newtonsoft.Json;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Linq;
|
||||||
|
using System.Net.Http;
|
||||||
|
|
||||||
|
namespace GUT.Schedule.Activities
|
||||||
|
{
|
||||||
|
[Activity(Label = "@string/aboutTitle")]
|
||||||
|
public class AboutActivity : AppCompatActivity
|
||||||
|
{
|
||||||
|
protected override async void OnCreate(Bundle savedInstanceState)
|
||||||
|
{
|
||||||
|
(string name, string handle, string link)[] contacts = new (string, string, string)[]
|
||||||
|
{
|
||||||
|
(Resources.GetText(Resource.String.websiteContact), "https://xfox111.net", "https://xfox111.net"),
|
||||||
|
(Resources.GetText(Resource.String.twitterContact), "@xfox111", "https://twitter.com/xfox111"),
|
||||||
|
(Resources.GetText(Resource.String.vkontakteContact), "@xfox.mike", "https://vk.com/xfox.mike"),
|
||||||
|
("LinkedIn", "@xfox", "https://linkedin.com/in/xfox"),
|
||||||
|
("GitHub", "@xfox111", "https://github.com/xfox111"),
|
||||||
|
};
|
||||||
|
(string name, string link)[] links = new (string, string)[]
|
||||||
|
{
|
||||||
|
(Resources.GetText(Resource.String.privacyPolicyLink), "https://xfox111.net/Projects/GUTSchedule/PrivacyPolicy.txt"),
|
||||||
|
("General Public License v3", "https://www.gnu.org/licenses/gpl-3.0"),
|
||||||
|
(Resources.GetText(Resource.String.repositoryLink), "https://github.com/xfox111/gutschedule"),
|
||||||
|
(Resources.GetText(Resource.String.notsLink), "http://tios.spbgut.ru/index.php"),
|
||||||
|
(Resources.GetText(Resource.String.sutLink), "https://sut.ru"),
|
||||||
|
};
|
||||||
|
|
||||||
|
base.OnCreate(savedInstanceState);
|
||||||
|
SetContentView(Resource.Layout.About);
|
||||||
|
PackageInfo version = PackageManager.GetPackageInfo(PackageName, PackageInfoFlags.MatchAll);
|
||||||
|
FindViewById<TextView>(Resource.Id.version).Text = $"v{version.VersionName} (ci-id #{version.VersionCode})";
|
||||||
|
|
||||||
|
FindViewById<Button>(Resource.Id.feedback).Click += (s, e) =>
|
||||||
|
StartActivity(new Intent(Intent.ActionView, Android.Net.Uri.Parse("mailto:feedback@xfox111.net")));
|
||||||
|
|
||||||
|
FindViewById<TextView>(Resource.Id.contacts).SetText(
|
||||||
|
HtmlCompat.FromHtml(string.Join("<br />", contacts.Select(i => $"<span>{i.name}:</span> <a href=\"{i.link}\">{i.handle}</a>")), HtmlCompat.FromHtmlModeLegacy),
|
||||||
|
TextView.BufferType.Normal);
|
||||||
|
FindViewById<TextView>(Resource.Id.contacts).MovementMethod = LinkMovementMethod.Instance;
|
||||||
|
|
||||||
|
FindViewById<TextView>(Resource.Id.links).SetText(
|
||||||
|
HtmlCompat.FromHtml(string.Join("<br />", links.Select(i => $"<a href=\"{i.link}\">{i.name}</a>")), HtmlCompat.FromHtmlModeLegacy),
|
||||||
|
TextView.BufferType.Normal);
|
||||||
|
FindViewById<TextView>(Resource.Id.links).MovementMethod = LinkMovementMethod.Instance;
|
||||||
|
|
||||||
|
List<string> contributors = new List<string>();
|
||||||
|
try
|
||||||
|
{
|
||||||
|
using HttpClient client = new HttpClient();
|
||||||
|
using HttpRequestMessage request = new HttpRequestMessage(HttpMethod.Get, "https://api.github.com/repos/xfox111/gutschedule/contributors");
|
||||||
|
request.Headers.Add("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:72.0) Gecko/20100101 Firefox/72.0");
|
||||||
|
|
||||||
|
HttpResponseMessage response = await client.SendAsync(request);
|
||||||
|
string resposeContent = await response.Content.ReadAsStringAsync();
|
||||||
|
dynamic parsedResponse = JsonConvert.DeserializeObject(resposeContent);
|
||||||
|
|
||||||
|
foreach (var i in parsedResponse)
|
||||||
|
if (i.type == "User" && ((string)i.login).ToLower() != "xfox111")
|
||||||
|
contributors.Add((string)i.login);
|
||||||
|
}
|
||||||
|
finally
|
||||||
|
{
|
||||||
|
if (contributors.Count > 0)
|
||||||
|
{
|
||||||
|
FindViewById<TextView>(Resource.Id.contributors).SetText(
|
||||||
|
HtmlCompat.FromHtml(string.Join(", ", contributors.Select(i => $"<a href=\"https://github.com/{i}\">@{i}</a>")), HtmlCompat.FromHtmlModeLegacy),
|
||||||
|
TextView.BufferType.Normal);
|
||||||
|
FindViewById<TextView>(Resource.Id.contributors).MovementMethod = LinkMovementMethod.Instance;
|
||||||
|
|
||||||
|
FindViewById<TextView>(Resource.Id.contributorsTitle).Visibility = Android.Views.ViewStates.Visible;
|
||||||
|
FindViewById<TextView>(Resource.Id.contributors).Visibility = Android.Views.ViewStates.Visible;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -7,12 +7,12 @@ using System.Collections.Generic;
|
|||||||
using System.Net.Http;
|
using System.Net.Http;
|
||||||
using System.Threading.Tasks;
|
using System.Threading.Tasks;
|
||||||
|
|
||||||
namespace GUT.Schedule
|
namespace GUT.Schedule.Activities
|
||||||
{
|
{
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Shows status of schedule export process
|
/// Shows status of schedule export process
|
||||||
/// </summary>
|
/// </summary>
|
||||||
[Activity]
|
[Activity(Theme = "@style/AppTheme.Light.SplashScreen")]
|
||||||
public class ExportActivity : Activity
|
public class ExportActivity : Activity
|
||||||
{
|
{
|
||||||
TextView status;
|
TextView status;
|
||||||
@@ -20,7 +20,7 @@ namespace GUT.Schedule
|
|||||||
protected override void OnCreate(Bundle savedInstanceState)
|
protected override void OnCreate(Bundle savedInstanceState)
|
||||||
{
|
{
|
||||||
base.OnCreate(savedInstanceState);
|
base.OnCreate(savedInstanceState);
|
||||||
SetContentView(Resource.Layout.export_progress);
|
SetContentView(Resource.Layout.Export);
|
||||||
|
|
||||||
status = FindViewById<TextView>(Resource.Id.status);
|
status = FindViewById<TextView>(Resource.Id.status);
|
||||||
|
|
||||||
@@ -32,9 +32,9 @@ namespace GUT.Schedule
|
|||||||
try
|
try
|
||||||
{
|
{
|
||||||
if(Data.DataSet.IsProfessor == true)
|
if(Data.DataSet.IsProfessor == true)
|
||||||
status.Text = "Загрузка расписания с картофельных серверов Бонча";
|
status.Text = Resources.GetText(Resource.String.potatoLoadingStatus); // For some reason professors' schedule loads much slower
|
||||||
else
|
else
|
||||||
status.Text = "Загрузка расписания";
|
status.Text = Resources.GetText(Resource.String.loadingStatus);
|
||||||
|
|
||||||
if (Data.DataSet.HttpClient != null)
|
if (Data.DataSet.HttpClient != null)
|
||||||
{
|
{
|
||||||
@@ -49,7 +49,7 @@ namespace GUT.Schedule
|
|||||||
|
|
||||||
schedule = schedule.FindAll(i => i.StartTime.Date >= Data.StartDate && i.StartTime.Date <= Data.EndDate); // Filtering schedule according to export range
|
schedule = schedule.FindAll(i => i.StartTime.Date >= Data.StartDate && i.StartTime.Date <= Data.EndDate); // Filtering schedule according to export range
|
||||||
|
|
||||||
status.Text = "Экспортирование в календарь";
|
status.Text = Resources.GetText(Resource.String.calendarExportStatus);
|
||||||
Calendar.Export(schedule);
|
Calendar.Export(schedule);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
@@ -58,20 +58,20 @@ namespace GUT.Schedule
|
|||||||
|
|
||||||
schedule = schedule.FindAll(i => i.StartTime.Date >= Data.StartDate && i.StartTime.Date <= Data.EndDate); // Filtering schedule according to export range
|
schedule = schedule.FindAll(i => i.StartTime.Date >= Data.StartDate && i.StartTime.Date <= Data.EndDate); // Filtering schedule according to export range
|
||||||
|
|
||||||
status.Text = "Экспортирование в календарь";
|
status.Text = Resources.GetText(Resource.String.calendarExportStatus);
|
||||||
Calendar.Export(schedule);
|
Calendar.Export(schedule);
|
||||||
}
|
}
|
||||||
|
|
||||||
status.Text = "Готово";
|
status.Text = Resources.GetText(Resource.String.doneStatus);
|
||||||
await Task.Delay(1000);
|
await Task.Delay(1000);
|
||||||
}
|
}
|
||||||
catch (HttpRequestException e)
|
catch (HttpRequestException e)
|
||||||
{
|
{
|
||||||
Android.Support.V7.App.AlertDialog.Builder builder = new Android.Support.V7.App.AlertDialog.Builder(this);
|
Android.Support.V7.App.AlertDialog.Builder builder = new Android.Support.V7.App.AlertDialog.Builder(this);
|
||||||
builder.SetMessage("Невозможно загрузить расписание. Проверьте интернет-соединение или попробуйте позже")
|
builder.SetMessage(Resources.GetText(Resource.String.connectionFailMessage))
|
||||||
.SetTitle(e.Message)
|
.SetTitle(e.Message)
|
||||||
.SetPositiveButton("ОК", (s, e) => base.OnBackPressed())
|
.SetPositiveButton("ОК", (s, e) => base.OnBackPressed())
|
||||||
.SetNegativeButton("Повторить", (s, e) => Export());
|
.SetNegativeButton(Resources.GetText(Resource.String.repeat), (s, e) => Export());
|
||||||
|
|
||||||
Android.Support.V7.App.AlertDialog dialog = builder.Create();
|
Android.Support.V7.App.AlertDialog dialog = builder.Create();
|
||||||
dialog.Show();
|
dialog.Show();
|
||||||
|
|||||||
@@ -4,6 +4,7 @@ using System.Linq;
|
|||||||
using System.Net.Http;
|
using System.Net.Http;
|
||||||
using Android.App;
|
using Android.App;
|
||||||
using Android.Content;
|
using Android.Content;
|
||||||
|
using Android.Content.PM;
|
||||||
using Android.OS;
|
using Android.OS;
|
||||||
using Android.Preferences;
|
using Android.Preferences;
|
||||||
using Android.Support.V4.Text;
|
using Android.Support.V4.Text;
|
||||||
@@ -15,9 +16,9 @@ using AngleSharp.Html.Dom;
|
|||||||
using AngleSharp.Html.Parser;
|
using AngleSharp.Html.Parser;
|
||||||
using GUT.Schedule.Models;
|
using GUT.Schedule.Models;
|
||||||
|
|
||||||
namespace GUT.Schedule
|
namespace GUT.Schedule.Activities
|
||||||
{
|
{
|
||||||
[Activity(Theme = "@style/AppTheme")]
|
[Activity]
|
||||||
public class MainActivity : AppCompatActivity
|
public class MainActivity : AppCompatActivity
|
||||||
{
|
{
|
||||||
Button start, end, export;
|
Button start, end, export;
|
||||||
@@ -33,7 +34,9 @@ namespace GUT.Schedule
|
|||||||
protected override void OnCreate(Bundle savedInstanceState)
|
protected override void OnCreate(Bundle savedInstanceState)
|
||||||
{
|
{
|
||||||
base.OnCreate(savedInstanceState);
|
base.OnCreate(savedInstanceState);
|
||||||
SetContentView(Resource.Layout.activity_main);
|
SetContentView(Resource.Layout.Main);
|
||||||
|
PackageInfo version = PackageManager.GetPackageInfo(PackageName, PackageInfoFlags.MatchAll);
|
||||||
|
FindViewById<TextView>(Resource.Id.version).Text = $"v{version.VersionName} (ci-id #{version.VersionCode})";
|
||||||
|
|
||||||
prefs = PreferenceManager.GetDefaultSharedPreferences(this);
|
prefs = PreferenceManager.GetDefaultSharedPreferences(this);
|
||||||
|
|
||||||
@@ -52,10 +55,10 @@ namespace GUT.Schedule
|
|||||||
// Settings spinners' dropdown lists content
|
// Settings spinners' dropdown lists content
|
||||||
reminder.SetList(this, new[]
|
reminder.SetList(this, new[]
|
||||||
{
|
{
|
||||||
"Нет",
|
Resources.GetText(Resource.String.noReminderOption),
|
||||||
"Во время начала",
|
Resources.GetText(Resource.String.inTimeReminderOption),
|
||||||
"За 5 мин",
|
Resources.GetText(Resource.String.fiveMinuteReminderOption),
|
||||||
"За 10 мин"
|
Resources.GetText(Resource.String.tenMinuteReminderOption)
|
||||||
});
|
});
|
||||||
reminder.SetSelection(prefs.GetInt("Reminder", 0));
|
reminder.SetSelection(prefs.GetInt("Reminder", 0));
|
||||||
|
|
||||||
@@ -79,7 +82,7 @@ namespace GUT.Schedule
|
|||||||
|
|
||||||
if (Data.StartDate > Data.EndDate)
|
if (Data.StartDate > Data.EndDate)
|
||||||
{
|
{
|
||||||
error.Text = "Ошибка: Неправильный диапазон дат";
|
error.Text = Resources.GetText(Resource.String.invalidDateRangeError);
|
||||||
error.Visibility = ViewStates.Visible;
|
error.Visibility = ViewStates.Visible;
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@@ -88,10 +91,10 @@ namespace GUT.Schedule
|
|||||||
bool? isProf = null;
|
bool? isProf = null;
|
||||||
if(authorize.Checked)
|
if(authorize.Checked)
|
||||||
{
|
{
|
||||||
Toast.MakeText(ApplicationContext, "Авторизация...", ToastLength.Short).Show();
|
Toast.MakeText(ApplicationContext, Resources.GetText(Resource.String.authorizationState), ToastLength.Short).Show();
|
||||||
if (string.IsNullOrWhiteSpace(email.Text) || string.IsNullOrWhiteSpace(password.Text))
|
if (string.IsNullOrWhiteSpace(email.Text) || string.IsNullOrWhiteSpace(password.Text))
|
||||||
{
|
{
|
||||||
error.Text = "Ошибка: Введите корректные учетные данные";
|
error.Text = Resources.GetText(Resource.String.invalidAuthorizationError);
|
||||||
error.Visibility = ViewStates.Visible;
|
error.Visibility = ViewStates.Visible;
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@@ -112,14 +115,14 @@ namespace GUT.Schedule
|
|||||||
|
|
||||||
if (!response.IsSuccessStatusCode)
|
if (!response.IsSuccessStatusCode)
|
||||||
{
|
{
|
||||||
error.Text = $"Ошибка авторизации: {response.StatusCode}: {responseContent}";
|
error.Text = $"{Resources.GetText(Resource.String.authorizationError)}: {response.StatusCode}: {responseContent}";
|
||||||
error.Visibility = ViewStates.Visible;
|
error.Visibility = ViewStates.Visible;
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!responseContent.StartsWith("1", StringComparison.OrdinalIgnoreCase))
|
if (!responseContent.StartsWith("1", StringComparison.OrdinalIgnoreCase))
|
||||||
{
|
{
|
||||||
error.Text = $"Ошибка авторизации: Неверный e-mail и/или пароль ({string.Join("; ", responseContent.Replace("error=", "", StringComparison.OrdinalIgnoreCase).Split('|'))})";
|
error.Text = $"{Resources.GetText(Resource.String.invalidCredentialError)} ({string.Join("; ", responseContent.Replace("error=", "", StringComparison.OrdinalIgnoreCase).Split('|'))})";
|
||||||
error.Visibility = ViewStates.Visible;
|
error.Visibility = ViewStates.Visible;
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@@ -149,7 +152,7 @@ namespace GUT.Schedule
|
|||||||
{
|
{
|
||||||
if(Data.Groups.Count < 1)
|
if(Data.Groups.Count < 1)
|
||||||
{
|
{
|
||||||
error.Text = "Ошибка: Не выбрана группа";
|
error.Text = Resources.GetText(Resource.String.groupSelectionError);
|
||||||
error.Visibility = ViewStates.Visible;
|
error.Visibility = ViewStates.Visible;
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@@ -287,7 +290,7 @@ namespace GUT.Schedule
|
|||||||
#region Menu stuff
|
#region Menu stuff
|
||||||
public override bool OnCreateOptionsMenu(IMenu menu)
|
public override bool OnCreateOptionsMenu(IMenu menu)
|
||||||
{
|
{
|
||||||
MenuInflater.Inflate(Resource.Menu.menu_main, menu);
|
MenuInflater.Inflate(Resource.Menu.MainContextMenu, menu);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -295,9 +298,9 @@ namespace GUT.Schedule
|
|||||||
{
|
{
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
Toast.MakeText(ApplicationContext, "Очистка...", ToastLength.Short).Show();
|
Toast.MakeText(ApplicationContext, Resources.GetText(Resource.String.clearingStatus), ToastLength.Short).Show();
|
||||||
Calendar.Clear(keepPrevious);
|
Calendar.Clear(keepPrevious);
|
||||||
Toast.MakeText(ApplicationContext, "Готово!", ToastLength.Short).Show();
|
Toast.MakeText(ApplicationContext, Resources.GetText(Resource.String.doneStatus), ToastLength.Short).Show();
|
||||||
}
|
}
|
||||||
catch (Exception e)
|
catch (Exception e)
|
||||||
{
|
{
|
||||||
@@ -318,16 +321,7 @@ namespace GUT.Schedule
|
|||||||
switch (item.ItemId)
|
switch (item.ItemId)
|
||||||
{
|
{
|
||||||
case Resource.Id.about:
|
case Resource.Id.about:
|
||||||
builder = new Android.Support.V7.App.AlertDialog.Builder(this);
|
StartActivity(new Intent(this, typeof(AboutActivity)));
|
||||||
builder.SetMessage(HtmlCompat.FromHtml(new StreamReader(Assets.Open("About.html")).ReadToEnd(), HtmlCompat.FromHtmlModeLegacy))
|
|
||||||
.SetTitle("ГУТ.Расписание")
|
|
||||||
.SetPositiveButton("ОК", (IDialogInterfaceOnClickListener)null);
|
|
||||||
|
|
||||||
dialog = builder.Create();
|
|
||||||
dialog.Show();
|
|
||||||
|
|
||||||
// Making links clickable
|
|
||||||
dialog.FindViewById<TextView>(Android.Resource.Id.Message).MovementMethod = LinkMovementMethod.Instance;
|
|
||||||
return true;
|
return true;
|
||||||
case Resource.Id.email:
|
case Resource.Id.email:
|
||||||
StartActivity(new Intent(Intent.ActionView, Android.Net.Uri.Parse("mailto:feedback@xfox111.net")));
|
StartActivity(new Intent(Intent.ActionView, Android.Net.Uri.Parse("mailto:feedback@xfox111.net")));
|
||||||
@@ -335,14 +329,11 @@ namespace GUT.Schedule
|
|||||||
|
|
||||||
case Resource.Id.clear:
|
case Resource.Id.clear:
|
||||||
builder = new Android.Support.V7.App.AlertDialog.Builder(this);
|
builder = new Android.Support.V7.App.AlertDialog.Builder(this);
|
||||||
builder.SetMessage("Это действие удалит экспортированное расписание из всех доступных календарей.\n" +
|
builder.SetMessage(Resources.GetText(Resource.String.clearScheduleMessage))
|
||||||
"Данное действие затронет только расписание, экспортированное этим приложением\n" +
|
.SetTitle(Resources.GetText(Resource.String.clearScheduleTitle))
|
||||||
"'Все' - удалит все события расписания, включая прошедшие\n" +
|
.SetPositiveButton(Resources.GetText(Resource.String.clearUpcomingOption), (s, e) => Clear())
|
||||||
"'Только новые' - удалит будущие события расписания")
|
.SetNegativeButton(Resources.GetText(Resource.String.clearAllOption), (s, e) => Clear(false))
|
||||||
.SetTitle("Очистка календарей")
|
.SetNeutralButton(Resources.GetText(Resource.String.cancelOption), (IDialogInterfaceOnClickListener)null);
|
||||||
.SetPositiveButton("Только новые", (s, e) => Clear())
|
|
||||||
.SetNegativeButton("Все", (s, e) => Clear(false))
|
|
||||||
.SetNeutralButton("Отмена", (IDialogInterfaceOnClickListener)null);
|
|
||||||
|
|
||||||
dialog = builder.Create();
|
dialog = builder.Create();
|
||||||
dialog.Show();
|
dialog.Show();
|
||||||
|
|||||||
@@ -12,29 +12,31 @@ using System;
|
|||||||
using System.Linq;
|
using System.Linq;
|
||||||
using System.Net.Http;
|
using System.Net.Http;
|
||||||
|
|
||||||
namespace GUT.Schedule
|
namespace GUT.Schedule.Activities
|
||||||
{
|
{
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Splash screen activity. Loads init data
|
/// Splash screen activity. Loads init data
|
||||||
/// </summary>
|
/// </summary>
|
||||||
[Activity(MainLauncher = true)]
|
[Activity(MainLauncher = true, Theme = "@style/AppTheme.Light.SplashScreen")]
|
||||||
public class StartActivity : AppCompatActivity
|
public class StartActivity : AppCompatActivity
|
||||||
{
|
{
|
||||||
TextView status;
|
TextView status;
|
||||||
|
|
||||||
protected override void OnCreate(Bundle savedInstanceState)
|
protected override void OnCreate(Bundle savedInstanceState)
|
||||||
{
|
{
|
||||||
SetContentView(Resource.Layout.splash_screen);
|
SetContentView(Resource.Layout.SplashScreen);
|
||||||
base.OnCreate(savedInstanceState);
|
base.OnCreate(savedInstanceState);
|
||||||
|
|
||||||
status = FindViewById<TextView>(Resource.Id.status);
|
status = FindViewById<TextView>(Resource.Id.status);
|
||||||
|
PackageInfo version = PackageManager.GetPackageInfo(PackageName, PackageInfoFlags.MatchAll);
|
||||||
|
FindViewById<TextView>(Resource.Id.version).Text = $"v{version.VersionName} (ci-id #{version.VersionCode})";
|
||||||
|
|
||||||
status.Text = "Проверка наличия разрешений";
|
status.Text = Resources.GetText(Resource.String.permissionsCheckStatus);
|
||||||
|
|
||||||
if (ContextCompat.CheckSelfPermission(this, Manifest.Permission.WriteCalendar) != Permission.Granted)
|
if (ContextCompat.CheckSelfPermission(this, Manifest.Permission.WriteCalendar) != Permission.Granted)
|
||||||
{
|
{
|
||||||
if (ActivityCompat.ShouldShowRequestPermissionRationale(this, Manifest.Permission.WriteCalendar))
|
if (ActivityCompat.ShouldShowRequestPermissionRationale(this, Manifest.Permission.WriteCalendar))
|
||||||
ShowDialog("Доступ к календарю", "Разрешите приложению получать доступ к календарю. Без этого разрешения приложение не сможет добавлять расписание в ваш календарь", RequestPermissions);
|
ShowDialog(Resources.GetText(Resource.String.calendarAccessTitle), Resources.GetText(Resource.String.calendarAccessRationale), RequestPermissions);
|
||||||
else
|
else
|
||||||
RequestPermissions();
|
RequestPermissions();
|
||||||
}
|
}
|
||||||
@@ -46,24 +48,24 @@ namespace GUT.Schedule
|
|||||||
{
|
{
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
status.Text = "Загрузка списка календарей";
|
status.Text = Resources.GetText(Resource.String.calendarLoadingStatus);
|
||||||
Calendar.LoadCalendars();
|
Calendar.LoadCalendars();
|
||||||
if (Calendar.Calendars.Count == 0)
|
if (Calendar.Calendars.Count == 0)
|
||||||
{
|
{
|
||||||
ShowDialog("Создайте новый календарь", "На вашем устройстве нет календарей пригодных для записи расписания");
|
ShowDialog(Resources.GetText(Resource.String.createCalendarTitle), Resources.GetText(Resource.String.createCalendarMessage));
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
status.Text = "Загрузка списка факультетов";
|
status.Text = Resources.GetText(Resource.String.facultiesLoadingStatus);
|
||||||
await Parser.LoadFaculties();
|
await Parser.LoadFaculties();
|
||||||
|
|
||||||
status.Text = "Загрузка дат смещения";
|
status.Text = Resources.GetText(Resource.String.offsetDatesLoadingStatus);
|
||||||
using HttpClient client = new HttpClient();
|
using HttpClient client = new HttpClient();
|
||||||
Data.FirstWeekDay = int.Parse(await client.GetStringAsync("https://xfox111.net/schedule_offset.txt"));
|
Data.FirstWeekDay = int.Parse(await client.GetStringAsync("https://xfox111.net/schedule_offset.txt"));
|
||||||
}
|
}
|
||||||
catch(HttpRequestException e)
|
catch(HttpRequestException e)
|
||||||
{
|
{
|
||||||
ShowDialog(e.Message, "Невозможно загрузить расписание. Проверьте интернет-соединение или попробуйте позже", Proceed, FinishAndRemoveTask, "Повторить", "Выйти");
|
ShowDialog(e.Message, Resources.GetText(Resource.String.connectionFailMessage), Proceed, FinishAndRemoveTask, Resources.GetText(Resource.String.repeat), Resources.GetText(Resource.String.quit));
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
catch (Exception e)
|
catch (Exception e)
|
||||||
@@ -81,7 +83,7 @@ namespace GUT.Schedule
|
|||||||
if (grantResults.All(i => i == Permission.Granted))
|
if (grantResults.All(i => i == Permission.Granted))
|
||||||
Proceed();
|
Proceed();
|
||||||
else
|
else
|
||||||
ShowDialog("Доступ к календарю", "Разрешите приложению получать доступ к календарю. Без этого разрешения приложение не сможет добавлять расписание в ваш календарь", RequestPermissions);
|
ShowDialog(Resources.GetText(Resource.String.calendarAccessTitle), Resources.GetText(Resource.String.calendarAccessRationale), RequestPermissions);
|
||||||
}
|
}
|
||||||
|
|
||||||
private void RequestPermissions() =>
|
private void RequestPermissions() =>
|
||||||
@@ -99,7 +101,7 @@ namespace GUT.Schedule
|
|||||||
.SetTitle(title).SetPositiveButton(posActionLabel ?? "OK", (s, e) => posAction?.Invoke());
|
.SetTitle(title).SetPositiveButton(posActionLabel ?? "OK", (s, e) => posAction?.Invoke());
|
||||||
|
|
||||||
if (negAction != null)
|
if (negAction != null)
|
||||||
builder.SetNegativeButton(negActionLabel ?? "Close", (s, e) => negAction.Invoke());
|
builder.SetNegativeButton(negActionLabel ?? Resources.GetText(Resource.String.close), (s, e) => negAction.Invoke());
|
||||||
|
|
||||||
Android.Support.V7.App.AlertDialog dialog = builder.Create();
|
Android.Support.V7.App.AlertDialog dialog = builder.Create();
|
||||||
dialog.Show();
|
dialog.Show();
|
||||||
|
|||||||
@@ -1,21 +0,0 @@
|
|||||||
<p>
|
|
||||||
Приложение для экспорта расписания студентов СПбГУТ в Google календарь
|
|
||||||
</p>
|
|
||||||
|
|
||||||
<p>
|
|
||||||
<b>Разработал:</b> Михаил Гордеев, ИКСС, ИКТ-907<br />
|
|
||||||
<b>Веб-сайт:</b> <a href="https://xfox111.net">https://xfox111.net/</a><br />
|
|
||||||
<b>Твиттер:</b> <a href="https://twitter.com/xfox111">@xfox111</a><br />
|
|
||||||
<b>ВКонтакте:</b> <a href="https://vk.com/xfox.Mike">@xfox.mike</a><br />
|
|
||||||
<b>LinkedIn:</b> <a href="https://linkedin.com/in/xfox">@xfox</a><br />
|
|
||||||
</p>
|
|
||||||
|
|
||||||
<p>
|
|
||||||
<b>Поддержать:</b> <a href="https://www.buymeacoffee.com/xfox111">By me a coffee</a>
|
|
||||||
</p>
|
|
||||||
|
|
||||||
<p>
|
|
||||||
©2020 Michael "XFox" Gordeev.<br />
|
|
||||||
ПО с <a href="https://github.com/xfox111/gutschedule">открытым исходным кодом</a><br />
|
|
||||||
Лицензия: <a href="https://www.gnu.org/licenses/gpl-3.0">General Public License v3</a><br />
|
|
||||||
</p>
|
|
||||||
@@ -77,6 +77,7 @@
|
|||||||
<AndroidEnableProfiledAot>false</AndroidEnableProfiledAot>
|
<AndroidEnableProfiledAot>false</AndroidEnableProfiledAot>
|
||||||
<BundleAssemblies>false</BundleAssemblies>
|
<BundleAssemblies>false</BundleAssemblies>
|
||||||
<AndroidSupportedAbis>armeabi-v7a;x86;x86_64;arm64-v8a</AndroidSupportedAbis>
|
<AndroidSupportedAbis>armeabi-v7a;x86;x86_64;arm64-v8a</AndroidSupportedAbis>
|
||||||
|
<AndroidPackageFormat>apk</AndroidPackageFormat>
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<Reference Include="System" />
|
<Reference Include="System" />
|
||||||
@@ -87,6 +88,7 @@
|
|||||||
<Reference Include="System.Numerics.Vectors" />
|
<Reference Include="System.Numerics.Vectors" />
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
|
<Compile Include="Activities\AboutActivity.cs" />
|
||||||
<Compile Include="Calendar.cs" />
|
<Compile Include="Calendar.cs" />
|
||||||
<Compile Include="Models\Data.cs" />
|
<Compile Include="Models\Data.cs" />
|
||||||
<Compile Include="Fragments\DatePickerFragment.cs" />
|
<Compile Include="Fragments\DatePickerFragment.cs" />
|
||||||
@@ -105,12 +107,10 @@
|
|||||||
<None Include="Properties\AndroidManifest.xml" />
|
<None Include="Properties\AndroidManifest.xml" />
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<AndroidResource Include="Resources\layout\activity_main.xml">
|
<AndroidResource Include="Resources\layout\Main.xml">
|
||||||
<SubType>Designer</SubType>
|
<SubType>Designer</SubType>
|
||||||
</AndroidResource>
|
</AndroidResource>
|
||||||
<AndroidResource Include="Resources\values\colors.xml" />
|
<AndroidResource Include="Resources\values\colors.xml" />
|
||||||
<AndroidResource Include="Resources\values\ic_launcher_background.xml" />
|
|
||||||
<AndroidResource Include="Resources\values\styles.xml" />
|
|
||||||
<AndroidResource Include="Resources\mipmap-anydpi-v26\ic_launcher.xml" />
|
<AndroidResource Include="Resources\mipmap-anydpi-v26\ic_launcher.xml" />
|
||||||
<AndroidResource Include="Resources\mipmap-anydpi-v26\ic_launcher_round.xml" />
|
<AndroidResource Include="Resources\mipmap-anydpi-v26\ic_launcher_round.xml" />
|
||||||
<AndroidResource Include="Resources\mipmap-hdpi\ic_launcher.png" />
|
<AndroidResource Include="Resources\mipmap-hdpi\ic_launcher.png" />
|
||||||
@@ -129,13 +129,16 @@
|
|||||||
<AndroidResource Include="Resources\mipmap-xxxhdpi\ic_launcher_foreground.png" />
|
<AndroidResource Include="Resources\mipmap-xxxhdpi\ic_launcher_foreground.png" />
|
||||||
<AndroidResource Include="Resources\mipmap-xxxhdpi\ic_launcher_round.png" />
|
<AndroidResource Include="Resources\mipmap-xxxhdpi\ic_launcher_round.png" />
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
<ItemGroup>
|
|
||||||
<AndroidAsset Include="Assets\About.html" />
|
|
||||||
</ItemGroup>
|
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<PackageReference Include="AngleSharp">
|
<PackageReference Include="AngleSharp">
|
||||||
<Version>0.13.0</Version>
|
<Version>0.13.0</Version>
|
||||||
</PackageReference>
|
</PackageReference>
|
||||||
|
<PackageReference Include="Microsoft.CSharp">
|
||||||
|
<Version>4.7.0</Version>
|
||||||
|
</PackageReference>
|
||||||
|
<PackageReference Include="Newtonsoft.Json">
|
||||||
|
<Version>12.0.3</Version>
|
||||||
|
</PackageReference>
|
||||||
<PackageReference Include="System.Net.Http">
|
<PackageReference Include="System.Net.Http">
|
||||||
<Version>4.3.4</Version>
|
<Version>4.3.4</Version>
|
||||||
</PackageReference>
|
</PackageReference>
|
||||||
@@ -145,21 +148,38 @@
|
|||||||
<PackageReference Include="Xamarin.Essentials" Version="1.3.1" />
|
<PackageReference Include="Xamarin.Essentials" Version="1.3.1" />
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<AndroidResource Include="Resources\layout\splash_screen.xml">
|
<AndroidResource Include="Resources\layout\SplashScreen.xml">
|
||||||
<SubType>Designer</SubType>
|
<SubType>Designer</SubType>
|
||||||
</AndroidResource>
|
</AndroidResource>
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<AndroidResource Include="Resources\menu\menu_main.xml" />
|
<AndroidResource Include="Resources\menu\MainContextMenu.xml" />
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<AndroidResource Include="Resources\layout\export_progress.xml">
|
<AndroidResource Include="Resources\layout\Export.xml">
|
||||||
<SubType>Designer</SubType>
|
<SubType>Designer</SubType>
|
||||||
</AndroidResource>
|
</AndroidResource>
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<AndroidResource Include="Resources\drawable\logo.png" />
|
<AndroidResource Include="Resources\drawable\logo.png" />
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
|
<ItemGroup>
|
||||||
|
<AndroidResource Include="Resources\values\styles.xml" />
|
||||||
|
</ItemGroup>
|
||||||
|
<ItemGroup>
|
||||||
|
<AndroidResource Include="Resources\layout\About.xml">
|
||||||
|
<SubType>Designer</SubType>
|
||||||
|
</AndroidResource>
|
||||||
|
</ItemGroup>
|
||||||
|
<ItemGroup>
|
||||||
|
<Folder Include="Assets\" />
|
||||||
|
</ItemGroup>
|
||||||
|
<ItemGroup>
|
||||||
|
<AndroidResource Include="Resources\values\strings.xml" />
|
||||||
|
</ItemGroup>
|
||||||
|
<ItemGroup>
|
||||||
|
<AndroidResource Include="Resources\values-en\strings.xml" />
|
||||||
|
</ItemGroup>
|
||||||
<Import Project="$(MSBuildExtensionsPath)\Xamarin\Android\Xamarin.Android.CSharp.targets" />
|
<Import Project="$(MSBuildExtensionsPath)\Xamarin\Android\Xamarin.Android.CSharp.targets" />
|
||||||
<!-- To modify your build process, add your task inside one of the targets below and uncomment it.
|
<!-- To modify your build process, add your task inside one of the targets below and uncomment it.
|
||||||
Other similar extension points exist, see Microsoft.Common.targets.
|
Other similar extension points exist, see Microsoft.Common.targets.
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
<?xml version="1.0" encoding="utf-8"?>
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
<manifest xmlns:android="http://schemas.android.com/apk/res/android" android:versionCode="108" android:versionName="1.0.8" package="com.xfox111.gut.schedule" android:installLocation="auto">
|
<manifest xmlns:android="http://schemas.android.com/apk/res/android" android:versionCode="1" android:versionName="0-development-test" package="com.xfox111.gut.schedule" android:installLocation="auto">
|
||||||
<uses-sdk android:minSdkVersion="16" android:targetSdkVersion="28" />
|
<uses-sdk android:minSdkVersion="16" android:targetSdkVersion="28" />
|
||||||
<application android:allowBackup="true" android:icon="@mipmap/ic_launcher" android:label="ГУТ.Расписание" android:roundIcon="@mipmap/ic_launcher_round" android:supportsRtl="true" android:theme="@style/AppTheme.NoActionBar"></application>
|
<application android:allowBackup="true" android:icon="@mipmap/ic_launcher" android:label="@string/appName" android:roundIcon="@mipmap/ic_launcher_round" android:supportsRtl="true" android:theme="@style/AppTheme.Light"></application>
|
||||||
<uses-permission android:name="android.permission.READ_CALENDAR" />
|
<uses-permission android:name="android.permission.READ_CALENDAR" />
|
||||||
<uses-permission android:name="android.permission.WRITE_CALENDAR" />
|
<uses-permission android:name="android.permission.WRITE_CALENDAR" />
|
||||||
<uses-permission android:name="android.permission.INTERNET" />
|
<uses-permission android:name="android.permission.INTERNET" />
|
||||||
|
|||||||
+602
-374
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,102 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="match_parent"
|
||||||
|
android:theme="@style/AppTheme.Light">
|
||||||
|
|
||||||
|
<LinearLayout
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="match_parent"
|
||||||
|
android:orientation="vertical"
|
||||||
|
android:padding="10dp">
|
||||||
|
|
||||||
|
<TextView
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
style="@style/TextAppearance.AppCompat.Headline"
|
||||||
|
android:text="@string/appName"/>
|
||||||
|
<TextView
|
||||||
|
android:id="@+id/version"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:textStyle="italic"
|
||||||
|
android:layout_marginTop="-5dp"
|
||||||
|
android:layout_marginBottom="10dp"
|
||||||
|
android:text="v$(Build.BuildNumber) (ci-id #$(Build.BuildId))"/>
|
||||||
|
|
||||||
|
|
||||||
|
<TextView
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:text="@string/appDescription"/>
|
||||||
|
|
||||||
|
<TextView
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:layout_marginTop="5dp"
|
||||||
|
android:text="@string/developedBy"/>
|
||||||
|
|
||||||
|
<TextView
|
||||||
|
android:id="@+id/contributorsTitle"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:layout_marginTop="10dp"
|
||||||
|
style="@style/TextAppearance.AppCompat.Subhead"
|
||||||
|
android:visibility="gone"
|
||||||
|
android:text="@string/contributorsTitle"/>
|
||||||
|
|
||||||
|
<TextView
|
||||||
|
android:id="@+id/contributors"
|
||||||
|
android:visibility="gone"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="wrap_content"/>
|
||||||
|
|
||||||
|
<TextView
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:layout_marginTop="10dp"
|
||||||
|
style="@style/TextAppearance.AppCompat.Subhead"
|
||||||
|
android:text="@string/specialThanksTitle"/>
|
||||||
|
|
||||||
|
<TextView
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:text="@string/specialThanksPeople"/>
|
||||||
|
|
||||||
|
<TextView
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:layout_marginTop="10dp"
|
||||||
|
style="@style/TextAppearance.AppCompat.Subhead"
|
||||||
|
android:text="@string/contactsTitle"/>
|
||||||
|
|
||||||
|
<TextView
|
||||||
|
android:id="@+id/contacts"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="wrap_content"/>
|
||||||
|
|
||||||
|
<TextView
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:layout_marginTop="10dp"
|
||||||
|
style="@style/TextAppearance.AppCompat.Subhead"
|
||||||
|
android:text="@string/linksTitle"/>
|
||||||
|
|
||||||
|
<TextView
|
||||||
|
android:id="@+id/links"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="wrap_content"/>
|
||||||
|
|
||||||
|
<TextView
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:layout_marginTop="10dp"
|
||||||
|
android:text="©2020 Michael "XFox" Gordeev"/>
|
||||||
|
|
||||||
|
<Button
|
||||||
|
android:id="@+id/feedback"
|
||||||
|
android:layout_width="wrap_content"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:text="@string/feedbackButton"/>
|
||||||
|
</LinearLayout>
|
||||||
|
</ScrollView>
|
||||||
+2
-2
@@ -3,7 +3,7 @@
|
|||||||
android:orientation="vertical"
|
android:orientation="vertical"
|
||||||
android:layout_width="match_parent"
|
android:layout_width="match_parent"
|
||||||
android:layout_height="match_parent"
|
android:layout_height="match_parent"
|
||||||
android:theme="@style/AppTheme.NoActionBar">
|
android:theme="@style/AppTheme.Light.SplashScreen">
|
||||||
|
|
||||||
<LinearLayout
|
<LinearLayout
|
||||||
android:layout_width="wrap_content"
|
android:layout_width="wrap_content"
|
||||||
@@ -22,7 +22,7 @@
|
|||||||
android:id="@+id/status"
|
android:id="@+id/status"
|
||||||
android:layout_width="wrap_content"
|
android:layout_width="wrap_content"
|
||||||
android:layout_height="wrap_content"
|
android:layout_height="wrap_content"
|
||||||
android:text="Загрузка"
|
android:text="@string/loadingStatus"
|
||||||
android:textColor="#fff"
|
android:textColor="#fff"
|
||||||
android:layout_gravity="center_horizontal"
|
android:layout_gravity="center_horizontal"
|
||||||
/>
|
/>
|
||||||
+28
-27
@@ -1,21 +1,19 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
<ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
|
<ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
xmlns:app="http://schemas.android.com/apk/res-auto"
|
|
||||||
xmlns:tools="http://schemas.android.com/tools"
|
|
||||||
android:layout_width="match_parent"
|
android:layout_width="match_parent"
|
||||||
android:layout_height="match_parent"
|
android:layout_height="match_parent"
|
||||||
app:layout_behavior="@string/appbar_scrolling_view_behavior">
|
android:theme="@style/AppTheme.Light">
|
||||||
|
|
||||||
<LinearLayout
|
<LinearLayout
|
||||||
android:layout_width="match_parent"
|
android:layout_width="match_parent"
|
||||||
android:layout_height="wrap_content"
|
android:layout_height="wrap_content"
|
||||||
android:orientation="vertical"
|
android:orientation="vertical"
|
||||||
android:layout_margin="10dp">
|
android:padding="10dp">
|
||||||
|
|
||||||
<TextView
|
<TextView
|
||||||
android:layout_width="match_parent"
|
android:layout_width="match_parent"
|
||||||
android:layout_height="wrap_content"
|
android:layout_height="wrap_content"
|
||||||
android:text="Параметры расписания"
|
android:text="@string/scheduleParametersTitle"
|
||||||
android:textStyle="bold"
|
android:textStyle="bold"
|
||||||
android:textSize="16dp"/>
|
android:textSize="16dp"/>
|
||||||
|
|
||||||
@@ -23,19 +21,18 @@
|
|||||||
android:id="@+id/authorization"
|
android:id="@+id/authorization"
|
||||||
android:layout_width="match_parent"
|
android:layout_width="match_parent"
|
||||||
android:layout_height="wrap_content"
|
android:layout_height="wrap_content"
|
||||||
android:text="Авторизоваться через Личный кабинет"/>
|
android:text="@string/authorizeCheckbox"/>
|
||||||
|
|
||||||
<LinearLayout
|
<LinearLayout
|
||||||
android:id="@+id/studentParams"
|
android:id="@+id/studentParams"
|
||||||
android:layout_width="match_parent"
|
android:layout_width="match_parent"
|
||||||
android:layout_height="wrap_content"
|
android:layout_height="wrap_content"
|
||||||
android:orientation="vertical"
|
android:orientation="vertical">
|
||||||
android:visibility="gone">
|
|
||||||
|
|
||||||
<TextView
|
<TextView
|
||||||
android:layout_width="match_parent"
|
android:layout_width="match_parent"
|
||||||
android:layout_height="wrap_content"
|
android:layout_height="wrap_content"
|
||||||
android:text="Факультет"/>
|
android:text="@string/facultySpinner"/>
|
||||||
|
|
||||||
<Spinner
|
<Spinner
|
||||||
android:id="@+id/faculty"
|
android:id="@+id/faculty"
|
||||||
@@ -45,7 +42,7 @@
|
|||||||
<TextView
|
<TextView
|
||||||
android:layout_width="match_parent"
|
android:layout_width="match_parent"
|
||||||
android:layout_height="wrap_content"
|
android:layout_height="wrap_content"
|
||||||
android:text="Курс"/>
|
android:text="@string/courseSpinner"/>
|
||||||
|
|
||||||
<Spinner
|
<Spinner
|
||||||
android:id="@+id/course"
|
android:id="@+id/course"
|
||||||
@@ -55,7 +52,7 @@
|
|||||||
<TextView
|
<TextView
|
||||||
android:layout_width="match_parent"
|
android:layout_width="match_parent"
|
||||||
android:layout_height="wrap_content"
|
android:layout_height="wrap_content"
|
||||||
android:text="Группа"/>
|
android:text="@string/groupSpinner"/>
|
||||||
|
|
||||||
<Spinner
|
<Spinner
|
||||||
android:id="@+id/group"
|
android:id="@+id/group"
|
||||||
@@ -84,7 +81,7 @@
|
|||||||
<TextView
|
<TextView
|
||||||
android:layout_width="match_parent"
|
android:layout_width="match_parent"
|
||||||
android:layout_height="wrap_content"
|
android:layout_height="wrap_content"
|
||||||
android:text="Пароль"/>
|
android:text="@string/passwordField"/>
|
||||||
|
|
||||||
<EditText
|
<EditText
|
||||||
android:id="@+id/password"
|
android:id="@+id/password"
|
||||||
@@ -96,14 +93,14 @@
|
|||||||
<TextView
|
<TextView
|
||||||
android:layout_width="match_parent"
|
android:layout_width="match_parent"
|
||||||
android:layout_height="wrap_content"
|
android:layout_height="wrap_content"
|
||||||
android:text="Параметры экспорта"
|
android:text="@string/exportParametersTitle"
|
||||||
android:textStyle="bold"
|
android:textStyle="bold"
|
||||||
android:textSize="16dp"/>
|
android:textSize="16dp"/>
|
||||||
|
|
||||||
<TextView
|
<TextView
|
||||||
android:layout_width="match_parent"
|
android:layout_width="match_parent"
|
||||||
android:layout_height="wrap_content"
|
android:layout_height="wrap_content"
|
||||||
android:text="Диапазон экспорта"/>
|
android:text="@string/dateRange"/>
|
||||||
|
|
||||||
<TableLayout
|
<TableLayout
|
||||||
android:layout_width="match_parent"
|
android:layout_width="match_parent"
|
||||||
@@ -142,12 +139,12 @@
|
|||||||
android:id="@+id/forDay"
|
android:id="@+id/forDay"
|
||||||
android:layout_width="match_parent"
|
android:layout_width="match_parent"
|
||||||
android:layout_height="wrap_content"
|
android:layout_height="wrap_content"
|
||||||
android:text="На день"/>
|
android:text="@string/forDayButton"/>
|
||||||
<Button
|
<Button
|
||||||
android:id="@+id/forWeek"
|
android:id="@+id/forWeek"
|
||||||
android:layout_width="match_parent"
|
android:layout_width="match_parent"
|
||||||
android:layout_height="wrap_content"
|
android:layout_height="wrap_content"
|
||||||
android:text="На неделю"/>
|
android:text="@string/forWeekButton"/>
|
||||||
</LinearLayout>
|
</LinearLayout>
|
||||||
|
|
||||||
<LinearLayout
|
<LinearLayout
|
||||||
@@ -159,12 +156,12 @@
|
|||||||
android:id="@+id/forMonth"
|
android:id="@+id/forMonth"
|
||||||
android:layout_width="match_parent"
|
android:layout_width="match_parent"
|
||||||
android:layout_height="wrap_content"
|
android:layout_height="wrap_content"
|
||||||
android:text="На месяц"/>
|
android:text="@string/forMonthButton"/>
|
||||||
<Button
|
<Button
|
||||||
android:id="@+id/forSemester"
|
android:id="@+id/forSemester"
|
||||||
android:layout_width="match_parent"
|
android:layout_width="match_parent"
|
||||||
android:layout_height="wrap_content"
|
android:layout_height="wrap_content"
|
||||||
android:text="На семестр"/>
|
android:text="@string/forSemesterButton"/>
|
||||||
</LinearLayout>
|
</LinearLayout>
|
||||||
</TableRow>
|
</TableRow>
|
||||||
</TableLayout>
|
</TableLayout>
|
||||||
@@ -172,7 +169,7 @@
|
|||||||
<TextView
|
<TextView
|
||||||
android:layout_width="match_parent"
|
android:layout_width="match_parent"
|
||||||
android:layout_height="wrap_content"
|
android:layout_height="wrap_content"
|
||||||
android:text="Напоминать за"/>
|
android:text="@string/reminderSpinner"/>
|
||||||
|
|
||||||
<Spinner
|
<Spinner
|
||||||
android:id="@+id/reminder"
|
android:id="@+id/reminder"
|
||||||
@@ -182,24 +179,24 @@
|
|||||||
<TextView
|
<TextView
|
||||||
android:layout_width="match_parent"
|
android:layout_width="match_parent"
|
||||||
android:layout_height="wrap_content"
|
android:layout_height="wrap_content"
|
||||||
android:text="(i) При экспорте расписания в Google календарь (не локальный) с отключенными уведомлениями, Google автоматически поставит уведомление за 30 минут"/>
|
android:text="@string/reminderNote"/>
|
||||||
|
|
||||||
<CheckBox
|
<CheckBox
|
||||||
android:id="@+id/groupTitle"
|
android:id="@+id/groupTitle"
|
||||||
android:layout_width="match_parent"
|
android:layout_width="match_parent"
|
||||||
android:layout_height="wrap_content"
|
android:layout_height="wrap_content"
|
||||||
android:text="Добавить номер группы в заголовок"/>
|
android:text="@string/addGroupToTitleCheckbox"/>
|
||||||
|
|
||||||
|
|
||||||
<TextView
|
<TextView
|
||||||
android:layout_width="match_parent"
|
android:layout_width="match_parent"
|
||||||
android:layout_height="wrap_content"
|
android:layout_height="wrap_content"
|
||||||
android:text="(i) Не касается расписания преподавателя"/>
|
android:text="@string/titleNote"/>
|
||||||
|
|
||||||
<TextView
|
<TextView
|
||||||
android:layout_width="match_parent"
|
android:layout_width="match_parent"
|
||||||
android:layout_height="wrap_content"
|
android:layout_height="wrap_content"
|
||||||
android:text="Конечный календарь"/>
|
android:text="@string/destinationCalendarSpinner"/>
|
||||||
|
|
||||||
<Spinner
|
<Spinner
|
||||||
android:id="@+id/calendar"
|
android:id="@+id/calendar"
|
||||||
@@ -219,12 +216,16 @@
|
|||||||
android:id="@+id/export"
|
android:id="@+id/export"
|
||||||
android:layout_width="match_parent"
|
android:layout_width="match_parent"
|
||||||
android:layout_height="wrap_content"
|
android:layout_height="wrap_content"
|
||||||
android:text="Добавить расписание"/>
|
android:text="@string/addScheduleButton"/>
|
||||||
|
|
||||||
<TextView
|
<TextView
|
||||||
android:layout_width="match_parent"
|
android:layout_width="match_parent"
|
||||||
android:layout_height="wrap_content"
|
android:layout_height="wrap_content"
|
||||||
android:text="©2020 Михаил Гордеев ИКСС, ИКТ-907"
|
android:text="@string/copyrights"/>
|
||||||
android:layout_marginBottom="50dp"/>
|
<TextView
|
||||||
|
android:id="@+id/version"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:text="v$(Build.BuildNumber) (ci-id #$(Build.BuildId))"/>
|
||||||
</LinearLayout>
|
</LinearLayout>
|
||||||
</ScrollView>
|
</ScrollView>
|
||||||
+13
-7
@@ -1,8 +1,9 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
|
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
android:orientation="vertical"
|
android:orientation="vertical"
|
||||||
android:layout_width="match_parent"
|
android:layout_width="match_parent"
|
||||||
android:layout_height="match_parent"
|
android:layout_height="match_parent"
|
||||||
android:theme="@style/AppTheme.NoActionBar">
|
android:theme="@style/AppTheme.Light.SplashScreen">
|
||||||
|
|
||||||
<LinearLayout
|
<LinearLayout
|
||||||
android:layout_width="wrap_content"
|
android:layout_width="wrap_content"
|
||||||
@@ -19,8 +20,7 @@
|
|||||||
<TextView
|
<TextView
|
||||||
android:layout_width="wrap_content"
|
android:layout_width="wrap_content"
|
||||||
android:layout_height="wrap_content"
|
android:layout_height="wrap_content"
|
||||||
android:text="ГУТ.Расписание"
|
android:text="@string/appName"
|
||||||
android:textColor="#ffffff"
|
|
||||||
android:layout_gravity="center_horizontal"
|
android:layout_gravity="center_horizontal"
|
||||||
android:textSize="36dp"/>
|
android:textSize="36dp"/>
|
||||||
|
|
||||||
@@ -28,17 +28,23 @@
|
|||||||
android:layout_width="50dp"
|
android:layout_width="50dp"
|
||||||
android:layout_height="50dp"
|
android:layout_height="50dp"
|
||||||
android:layout_gravity="center_horizontal"
|
android:layout_gravity="center_horizontal"
|
||||||
android:layout_marginVertical="50dp"
|
android:layout_marginVertical="50dp"/>
|
||||||
android:indeterminateTint="#ffffff"/>
|
|
||||||
|
|
||||||
<TextView
|
<TextView
|
||||||
android:id="@+id/status"
|
android:id="@+id/status"
|
||||||
android:layout_width="wrap_content"
|
android:layout_width="wrap_content"
|
||||||
android:layout_height="wrap_content"
|
android:layout_height="wrap_content"
|
||||||
android:layout_gravity="center_horizontal"
|
android:layout_gravity="center_horizontal"
|
||||||
android:text="Инициализация"
|
android:text="@string/initializationStatus"
|
||||||
android:textColor="@android:color/white"
|
|
||||||
android:textSize="20dp"/>
|
android:textSize="20dp"/>
|
||||||
</LinearLayout>
|
</LinearLayout>
|
||||||
|
|
||||||
|
<TextView
|
||||||
|
android:id="@+id/version"
|
||||||
|
android:layout_alignParentBottom="true"
|
||||||
|
android:layout_width="wrap_content"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:layout_centerHorizontal="true"
|
||||||
|
android:text="v$(Build.BuildNumber) (ci-id #$(Build.BuildId))"/>
|
||||||
|
|
||||||
</RelativeLayout>
|
</RelativeLayout>
|
||||||
+3
-3
@@ -4,14 +4,14 @@
|
|||||||
|
|
||||||
<item
|
<item
|
||||||
android:id="@+id/clear"
|
android:id="@+id/clear"
|
||||||
android:title="Очистить расписание"
|
android:title="@string/clearCalendarOption"
|
||||||
android:showAsAction="never"/>
|
android:showAsAction="never"/>
|
||||||
<item
|
<item
|
||||||
android:id="@+id/email"
|
android:id="@+id/email"
|
||||||
android:title="Сообщить об ошибке"
|
android:title="@string/reportErrorOption"
|
||||||
app:showAsAction="never" />
|
app:showAsAction="never" />
|
||||||
<item
|
<item
|
||||||
android:id="@+id/about"
|
android:id="@+id/about"
|
||||||
android:title="О приложении"
|
android:title="@string/aboutTitle"
|
||||||
app:showAsAction="never" />
|
app:showAsAction="never" />
|
||||||
</menu>
|
</menu>
|
||||||
@@ -0,0 +1,102 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8" ?>
|
||||||
|
<resources>
|
||||||
|
<string name="appName">ГУТ.Расписание</string>
|
||||||
|
|
||||||
|
<!-- StartActivity -->
|
||||||
|
<string name="initializationStatus">Инициализация</string>
|
||||||
|
<string name="permissionsCheckStatus">Проверка наличия разрешений</string>
|
||||||
|
<string name="calendarLoadingStatus">Загрузка списка календарей</string>
|
||||||
|
<string name="facultiesLoadingStatus">Загрузка списка факультативов</string>
|
||||||
|
<string name="offsetDatesLoadingStatus">Загрузка дат смещения</string>
|
||||||
|
|
||||||
|
<string name="calendarAccessTitle">Доступ к календарю</string>
|
||||||
|
<string name="calendarAccessRationale">Разрешите приложению получать доступ к календарю. Без этого разрешения приложение не сможет добавлять расписание в ваш календарь</string>
|
||||||
|
|
||||||
|
<string name="createCalendarTitle">Создайте новый календарь</string>
|
||||||
|
<string name="createCalendarMessage">На вашем устройстве нет календарей пригодных для записи расписания</string>
|
||||||
|
|
||||||
|
<string name="connectionFailMessage">Невозможно загрузить расписание. Проверьте интернет-соединение или попробуйте позже</string>
|
||||||
|
<string name="repeat">Повторить</string>
|
||||||
|
<string name="quit">Выйти</string>
|
||||||
|
<string name="close">Закрыть</string>
|
||||||
|
|
||||||
|
<!-- MainActivity -->
|
||||||
|
<string name="scheduleParametersTitle">Параметры расписания</string>
|
||||||
|
<string name="authorizeCheckbox">Авторизоваться через Личный кабинет</string>
|
||||||
|
<string name="facultySpinner">Факультет</string>
|
||||||
|
<string name="courseSpinner">Курс</string>
|
||||||
|
<string name="groupSpinner">Группа</string>
|
||||||
|
|
||||||
|
<string name="passwordField">Пароль</string>
|
||||||
|
|
||||||
|
<string name="exportParametersTitle">Параметры экспорта</string>
|
||||||
|
<string name="dateRange">Диапазон экспорта</string>
|
||||||
|
|
||||||
|
<string name="forDayButton">На день</string>
|
||||||
|
<string name="forWeekButton">На неделю</string>
|
||||||
|
<string name="forMonthButton">На месяц</string>
|
||||||
|
<string name="forSemesterButton">На семестр</string>
|
||||||
|
|
||||||
|
<string name="reminderSpinner">Напоминать за</string>
|
||||||
|
<string name="reminderNote">(i) Внимание, при экспорте в облачный Google-календарь, Google автоматически ставит уведомление за пол часа, если его не поставил пользователь</string>
|
||||||
|
<string name="noReminderOption">Нет</string>
|
||||||
|
<string name="inTimeReminderOption">Во время начала</string>
|
||||||
|
<string name="fiveMinuteReminderOption">За 5 минут</string>
|
||||||
|
<string name="tenMinuteReminderOption">За 10 минут</string>
|
||||||
|
|
||||||
|
<string name="addGroupToTitleCheckbox">Добавить номер группы в заголовок</string>
|
||||||
|
<string name="titleNote">(i) Не касается преподавательского расписания</string>
|
||||||
|
|
||||||
|
<string name="destinationCalendarSpinner">Конечый календарь</string>
|
||||||
|
|
||||||
|
<string name="addScheduleButton">Добавить расписание</string>
|
||||||
|
|
||||||
|
<string name="copyrights">©2020 Михаил Гордеев, ИКСС, ИКТ-907</string>
|
||||||
|
|
||||||
|
<string name="clearCalendarOption">Очистить расписание</string>
|
||||||
|
<string name="reportErrorOption">Сообщить об ошибке</string>
|
||||||
|
|
||||||
|
<string name="invalidDateRangeError">Ошибка: Неправильный диапазон дат</string>
|
||||||
|
<string name="authorizationState">Авторизация...</string>
|
||||||
|
<string name="invalidAuthorizationError">Ошибка: Введите корректные учетные данные</string>
|
||||||
|
<string name="authorizationError">Ошибка авторизации</string>
|
||||||
|
<string name="invalidCredentialError">Ошибка авторизации: Неверный e-mail и/или пароль</string>
|
||||||
|
<string name="groupSelectionError">Ошибка: Не выбрана группа</string>
|
||||||
|
|
||||||
|
<string name="clearScheduleTitle">Очистка расписания</string>
|
||||||
|
<string name="clearScheduleMessage">Это действие удалит экспортированное расписание из всех доступных календарей. \nДанное действие затронет только расписание, экспортированное этим приложением \n\'Все\' - удалит все события расписания, включая прошедшие \n\'Только новые\' - удалит будущие события расписания
|
||||||
|
</string>
|
||||||
|
<string name="clearAllOption">Все</string>
|
||||||
|
<string name="clearUpcomingOption">Только новые</string>
|
||||||
|
<string name="cancelOption">Отмена</string>
|
||||||
|
<string name="clearingStatus">Очистка...</string>
|
||||||
|
|
||||||
|
<!-- ExportActivity -->
|
||||||
|
<string name="loadingStatus">Загрузка</string>
|
||||||
|
<string name="potatoLoadingStatus">Загрузка расписания с картофельных серверов Бонча</string>
|
||||||
|
<string name="scheduleLoadingStatus">Загрузка расписания</string>
|
||||||
|
<string name="calendarExportStatus">Экспортирование в календарь</string>
|
||||||
|
<string name="doneStatus">Готово</string>
|
||||||
|
|
||||||
|
<!-- AboutActivity -->
|
||||||
|
<string name="aboutTitle">О приложении</string>
|
||||||
|
<string name="appDescription">Приложение для экспорта перподавательского и учебного расписаний Санкт-Петербургского Государственного Университета Телекоммуникаций им. проф. М.А. Бонч-Бруевича</string>
|
||||||
|
<string name="developedBy">Разработано Михаилом Гордеевым, ИКТ-907, ИКСС в Научно-образовательном центре \"Технологии информационных образовательных систем\"</string>
|
||||||
|
<string name="contributorsTitle">Свой вклад в разработку внесли</string>
|
||||||
|
|
||||||
|
<string name="specialThanksTitle">Особые благодарности</string>
|
||||||
|
<string name="specialThanksPeople">Виталий Мошков, Анастасия Годунова</string>
|
||||||
|
|
||||||
|
<string name="contactsTitle">Контакты</string>
|
||||||
|
<string name="websiteContact">Веб-сайт</string>
|
||||||
|
<string name="twitterContact">Твиттер</string>
|
||||||
|
<string name="vkontakteContact">ВКонтакте</string>
|
||||||
|
|
||||||
|
<string name="linksTitle">Полезные ссылки</string>
|
||||||
|
<string name="privacyPolicyLink">Политика конфиденциальности</string>
|
||||||
|
<string name="repositoryLink">Репозиторий GitHub</string>
|
||||||
|
<string name="notsLink">НОЦ \"ТИОС\"</string>
|
||||||
|
<string name="sutLink">СПбГУТ</string>
|
||||||
|
|
||||||
|
<string name="feedbackButton">Оставить отзыв</string>
|
||||||
|
</resources>
|
||||||
@@ -1,6 +1,4 @@
|
|||||||
<?xml version="1.0" encoding="utf-8"?>
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
<resources>
|
<resources>
|
||||||
<color name="colorPrimary">#ff8000</color>
|
<color name="colorPrimary">#ff8000</color>
|
||||||
<color name="colorPrimaryDark">#ff8000</color>
|
|
||||||
<color name="colorAccent">#ff8000</color>
|
|
||||||
</resources>
|
</resources>
|
||||||
@@ -1,4 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="utf-8"?>
|
|
||||||
<resources>
|
|
||||||
<color name="ic_launcher_background">#ff8000</color>
|
|
||||||
</resources>
|
|
||||||
@@ -0,0 +1,100 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8" ?>
|
||||||
|
<resources>
|
||||||
|
<string name="appName">GUT.Schedule</string>
|
||||||
|
|
||||||
|
<string name="initializationStatus">Initialization</string>
|
||||||
|
<string name="permissionsCheckStatus">Checking permissions</string>
|
||||||
|
<string name="calendarLoadingStatus">Loading calendars list</string>
|
||||||
|
<string name="facultiesLoadingStatus">Loading faculties list</string>
|
||||||
|
<string name="offsetDatesLoadingStatus">Loading offset dates</string>
|
||||||
|
|
||||||
|
<string name="calendarAccessTitle">Calendar access</string>
|
||||||
|
<string name="calendarAccessRationale">Grant permission to the app to access calendar. Without it the app will not be able to add schedule to your calendar</string>
|
||||||
|
|
||||||
|
<string name="createCalendarTitle">Create new calendar</string>
|
||||||
|
<string name="createCalendarMessage">There\'s no calendars on your device we can write schedule to</string>
|
||||||
|
|
||||||
|
<string name="connectionFailMessage">Unable to load schedule. Check your internet connection or try again later</string>
|
||||||
|
<string name="repeat">Try again</string>
|
||||||
|
<string name="quit">Quit</string>
|
||||||
|
<string name="close">Close</string>
|
||||||
|
|
||||||
|
<!-- MainActivity -->
|
||||||
|
<string name="scheduleParametersTitle">Schedule parameters</string>
|
||||||
|
<string name="authorizeCheckbox">Authorize via Personal cabinet</string>
|
||||||
|
<string name="facultySpinner">Faculty</string>
|
||||||
|
<string name="courseSpinner">Course</string>
|
||||||
|
<string name="groupSpinner">Group</string>
|
||||||
|
|
||||||
|
<string name="passwordField">Password</string>
|
||||||
|
|
||||||
|
<string name="exportParametersTitle">Export parameters</string>
|
||||||
|
<string name="dateRange">Export range</string>
|
||||||
|
|
||||||
|
<string name="forDayButton">For day</string>
|
||||||
|
<string name="forWeekButton">For week</string>
|
||||||
|
<string name="forMonthButton">For month</string>
|
||||||
|
<string name="forSemesterButton">For semester</string>
|
||||||
|
|
||||||
|
<string name="reminderSpinner">Set reminders for</string>
|
||||||
|
<string name="reminderNote">(i) Attention, for cloud-based Google calendars Google automatically sets reminders for 30 minutes if there\'s no reminder set by user</string>
|
||||||
|
<string name="noReminderOption">None</string>
|
||||||
|
<string name="inTimeReminderOption">At the start of event</string>
|
||||||
|
<string name="fiveMinuteReminderOption">5 minutes</string>
|
||||||
|
<string name="tenMinuteReminderOption">10 minutes</string>
|
||||||
|
|
||||||
|
<string name="addGroupToTitleCheckbox">Add group number to event title</string>
|
||||||
|
<string name="titleNote">(i) This doesn\'t affect professors\' schedule</string>
|
||||||
|
|
||||||
|
<string name="destinationCalendarSpinner">Destination calendar</string>
|
||||||
|
|
||||||
|
<string name="addScheduleButton">Add schedule</string>
|
||||||
|
|
||||||
|
<string name="copyrights">©2020 Michael Gordeev, INS, IS-907</string>
|
||||||
|
|
||||||
|
<string name="clearCalendarOption">Clear schedule</string>
|
||||||
|
<string name="reportErrorOption">Report error</string>
|
||||||
|
|
||||||
|
<string name="invalidDateRangeError">Error: Invalid date range</string>
|
||||||
|
<string name="authorizationState">Authorization...</string>
|
||||||
|
<string name="invalidAuthorizationError">Error: Invalid credential</string>
|
||||||
|
<string name="authorizationError">Authorization error</string>
|
||||||
|
<string name="invalidCredentialError">Authorization error: Invalid e-mail and/or password</string>
|
||||||
|
<string name="groupSelectionError">Error: no group was selected</string>
|
||||||
|
|
||||||
|
<string name="clearScheduleTitle">Clear schedule</string>
|
||||||
|
<string name="clearScheduleMessage">This action will purge exported schedule from all available calendars. \nIt will affect only events created by the app. \n\'All\' - will purge all timetable events including the past ones \n\'Upcoming\' - will affect only upcoming timetable events</string>
|
||||||
|
<string name="clearAllOption">All</string>
|
||||||
|
<string name="clearUpcomingOption">Upcoming</string>
|
||||||
|
<string name="cancelOption">Cancel</string>
|
||||||
|
<string name="clearingStatus">Clearing...</string>
|
||||||
|
|
||||||
|
<!-- ExportActivity -->
|
||||||
|
<string name="loadingStatus">Loading</string>
|
||||||
|
<string name="potatoLoadingStatus">Loading schedule from SPbSUT potato servers</string>
|
||||||
|
<string name="scheduleLoadingStatus">Loading schedule</string>
|
||||||
|
<string name="calendarExportStatus">Exporting to calendar</string>
|
||||||
|
<string name="doneStatus">Done</string>
|
||||||
|
|
||||||
|
<!-- AboutActivity -->
|
||||||
|
<string name="aboutTitle">About application</string>
|
||||||
|
<string name="appDescription">Application for SPbSUT professors\' and students\' schedule export</string>
|
||||||
|
<string name="developedBy">Developed by Michael Gordeev (IS-907, INS) in the \"Technologies of Informational and Educational Systems\" Research Facility</string>
|
||||||
|
<string name="contributorsTitle">Contributors</string>
|
||||||
|
|
||||||
|
<string name="specialThanksTitle">Special thanks</string>
|
||||||
|
<string name="specialThanksPeople">Vitaliy Moshkov, Anastasiya Godunova</string>
|
||||||
|
|
||||||
|
<string name="contactsTitle">Contacts</string>
|
||||||
|
<string name="websiteContact">Website</string>
|
||||||
|
<string name="twitterContact">Twitter</string>
|
||||||
|
<string name="vkontakteContact">Vkontakte</string>
|
||||||
|
|
||||||
|
<string name="linksTitle">Useful links</string>
|
||||||
|
<string name="privacyPolicyLink">Privacy policy</string>
|
||||||
|
<string name="repositoryLink">GitHub Repository</string>
|
||||||
|
<string name="notsLink">\"TIES\" RF</string>
|
||||||
|
<string name="sutLink">SPbSUT</string>
|
||||||
|
|
||||||
|
<string name="feedbackButton">Leave feedback</string>
|
||||||
|
</resources>
|
||||||
@@ -1,17 +1,21 @@
|
|||||||
<resources>
|
<resources>
|
||||||
<style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
|
<style name="AppTheme.Light" parent="Theme.AppCompat.Light.DarkActionBar">
|
||||||
<item name="colorPrimary">@color/colorPrimary</item>
|
<item name="colorPrimary">@color/colorPrimary</item>
|
||||||
<item name="colorPrimaryDark">@color/colorPrimaryDark</item>
|
<item name="colorPrimaryDark">@color/colorPrimary</item>
|
||||||
<item name="colorAccent">@color/colorAccent</item>
|
<item name="colorAccent">@color/colorPrimary</item>
|
||||||
<item name="android:navigationBarColor">#00000000</item>
|
<item name="android:navigationBarColor">@android:color/transparent</item>
|
||||||
<item name="android:windowLightNavigationBar">true</item>
|
<item name="android:windowLightNavigationBar">true</item>
|
||||||
|
|
||||||
|
<item name="android:fitsSystemWindows">true</item>
|
||||||
</style>
|
</style>
|
||||||
|
|
||||||
<style name="AppTheme.NoActionBar">
|
<style name="AppTheme.Light.SplashScreen" parent="AppTheme.Light">
|
||||||
<item name="windowActionBar">false</item>
|
<item name="windowActionBar">false</item>
|
||||||
<item name="windowNoTitle">true</item>
|
<item name="windowNoTitle">true</item>
|
||||||
<item name="android:navigationBarColor">#ff8000</item>
|
<item name="android:navigationBarColor">@color/colorPrimary</item>
|
||||||
<item name="android:windowLightNavigationBar">false</item>
|
<item name="android:windowLightNavigationBar">false</item>
|
||||||
<item name="android:windowBackground">@color/colorPrimary</item>
|
<item name="android:windowBackground">@color/colorPrimary</item>
|
||||||
|
<item name="android:textColor">@android:color/white</item>
|
||||||
|
<item name="android:indeterminateTint">@android:color/white</item>
|
||||||
</style>
|
</style>
|
||||||
</resources>
|
</resources>
|
||||||
+4
-8
@@ -1,8 +1,4 @@
|
|||||||
Version 1.0.8
|
- Added version number to loading screen and main page
|
||||||
- Student now can authorize with SPbSUT Cabinet credential
|
- Updated "About" page
|
||||||
- Introduced both work and study schedule export for PhD students
|
- Changed version numbering system
|
||||||
- Duplicating schedule entries (when group splits in two) are now mergeg into one
|
- Added English localization
|
||||||
- Fixed cases when app crashes on the second launch after entered credentials
|
|
||||||
- Fixed export errors
|
|
||||||
- Professors' schedule is now marked with 📚
|
|
||||||
- You can now add your group number to event title when using cabinet authorization
|
|
||||||
Reference in New Issue
Block a user