using System; using System.Linq; using Android.App; using Android.Content; using Android.Content.PM; using Android.OS; using Android.Support.V7.App; using Android.Text.Method; using Android.Views; using Android.Widget; using GUTSchedule.Models; using GUTSchedule.Droid.Fragments; using System.Collections.Generic; using System.Threading.Tasks; using AndroidX.Preference; namespace GUTSchedule.Droid.Activities { [Activity] public class MainActivity : AppCompatActivity { public static ExportParameters ExportParameters { get; set; } public static List<(string id, string name)> Faculties { get; set; } public static List<(string id, string name)> Groups { get; set; } public static bool AddGroupToTitle { get; set; } public static bool ExcludeMilitary { get; set; } public static int SelectedCalendarIndex { get; set; } public static int Reminder { get; set; } DateTime startDate = DateTime.Today; DateTime endDate = DateTime.Today.AddDays(7); Button start, end, export, applyForOccupation, validateCredential; Button forDay, forWeek, forMonth, forSemester; Spinner faculty, course, group, reminder, calendar; CheckBox groupTitle, authorize, excludeMilitary; TextView error; LinearLayout studentParams, profParams; EditText email, password; ISharedPreferences prefs; protected override async void OnCreate(Bundle savedInstanceState) { base.OnCreate(savedInstanceState); SetContentView(Resource.Layout.Main); PackageInfo version = PackageManager.GetPackageInfo(PackageName, PackageInfoFlags.MatchAll); FindViewById(Resource.Id.version).Text = $"v{version.VersionName} (ci-id #{version.LongVersionCode})"; prefs = PreferenceManager.GetDefaultSharedPreferences(this); AssignVariables(); faculty.SetList(this, Faculties.Select(i => i.name)); int s = Faculties.FindIndex(i => i.id == prefs.GetString("Faculty", "-123")); faculty.SetSelection(s == -1 ? 0 : s); course.SetList(this, "1234".ToCharArray()); course.SetSelection(prefs.GetInt("Course", 0)); // IDK why but this shit triggers events anyway (even if they are set in the next line. It seem to be that there's some asynchronous shit somewhere there) // P.S. Fuck Android await Task.Delay(100); UpdateGroupsList(); AddEvents(); // Settings spinners' dropdown lists content reminder.SetList(this, new[] { Resources.GetText(Resource.String.noReminderOption), Resources.GetText(Resource.String.inTimeReminderOption), Resources.GetText(Resource.String.fiveMinuteReminderOption), Resources.GetText(Resource.String.tenMinuteReminderOption) }); reminder.SetSelection(prefs.GetInt("Reminder", 0)); calendar.SetList(this, Calendar.Calendars.Select(i => i.Name)); s = Calendar.Calendars.FindIndex(i => i.Id == prefs.GetString("Calendar", "-123")); calendar.SetSelection(s == -1 ? 0 : s); end.Text = endDate.ToShortDateString(); start.Text = startDate.ToShortDateString(); groupTitle.Checked = prefs.GetBoolean("AddGroupToHeader", false); authorize.Checked = true; //prefs.GetBoolean("Authorize", true); excludeMilitary.Checked = prefs.GetBoolean("ExcludeMilitary", false); email.Text = prefs.GetString("email", ""); password.Text = prefs.GetString("password", ""); try { var classes = await Parser.CheckAvailableOccupations(email.Text, password.Text); applyForOccupation.Visibility = classes.Count > 0 ? ViewStates.Visible : ViewStates.Gone; } catch { applyForOccupation.Visibility = ViewStates.Gone; } } private void Export_Click(object sender, EventArgs e) { error.Visibility = ViewStates.Gone; if (startDate > endDate) { error.Text = Resources.GetText(Resource.String.invalidDateRangeError); error.Visibility = ViewStates.Visible; return; } if (authorize.Checked) { if (string.IsNullOrWhiteSpace(email.Text) || string.IsNullOrWhiteSpace(password.Text)) { error.Text = Resources.GetText(Resource.String.invalidAuthorizationError); error.Visibility = ViewStates.Visible; return; } ExportParameters = new CabinetExportParameters { Email = email.Text, Password = password.Text, EndDate = endDate, StartDate = startDate }; // Если ты это читаешь и у тебя возникли вопросы по типу "А какого хуя творится в коде ниже?!", то во-первых: // According to this SO thread: https://stackoverflow.com/questions/1925486/android-storing-username-and-password // I consider Preferences as safe enough method for storing credentials // А во-вторых, даже такой казалось бы небезопасный метод хранения учетных данных в сто раз надежнее того дерьма, // что творится на серверах Бонча (я не шучу, там пиздец) // Ну и в-третьих: Андроид - это пиздец и настоящий ад разработчика. И если бы была моя воля, я бы под него никогда не писал #FuckAndroid // З.Ы. Помнишь про второй пункт? Так вот, если ты используешь такой же пароль как в ЛК где-то еще, настоятельно рекомендую его поменять PreferenceManager.GetDefaultSharedPreferences(this).Edit().PutString("email", email.Text).Apply(); PreferenceManager.GetDefaultSharedPreferences(this).Edit().PutString("password", password.Text).Apply(); } else { if (Groups.Count < 1) { error.Text = Resources.GetText(Resource.String.groupSelectionError); error.Visibility = ViewStates.Visible; return; } ExportParameters = new DefaultExportParameters { EndDate = endDate, StartDate = startDate, Course = (course.SelectedItemPosition + 1).ToString(), FacultyId = Faculties[faculty.SelectedItemPosition].id, GroupId = Groups[group.SelectedItemPosition].id, }; } AddGroupToTitle = groupTitle.Checked; ExcludeMilitary = excludeMilitary.Checked; SelectedCalendarIndex = calendar.SelectedItemPosition; Reminder = (reminder.SelectedItemPosition - 1) * 5; StartActivity(new Intent(this, typeof(ExportActivity))); } private async void End_Click(object sender, EventArgs e) { endDate = await new DatePickerFragment().GetDate(SupportFragmentManager, endDate); end.Text = endDate.ToShortDateString(); } private async void Start_Click(object sender, EventArgs e) { startDate = await new DatePickerFragment().GetDate(SupportFragmentManager, startDate); start.Text = startDate.ToShortDateString(); } private async void UpdateGroupsList() { if (course.SelectedItem == null || Faculties.Count < 1) return; Groups = await Parser.GetGroups(Faculties[faculty.SelectedItemPosition].id, (course.SelectedItemPosition + 1).ToString()); group.SetList(this, Groups.Select(i => i.name)); int s = Groups?.FindIndex(i => i.id == prefs.GetString("Group", "-123")) ?? 0; group.SetSelection(s == -1 ? 0 : s); } private void SetDate(int days) { endDate = startDate.AddDays(days); end.Text = endDate.ToShortDateString(); } #region Init stuff private void AssignVariables() { start = FindViewById