public ManageGroupsPage()
        {
            InitializeComponent();

            UpdateItems(GroupsDataStore.GetSaved());
            MessagingCenter.Subscribe <Application, List <SavedGroup> >(this, MessageTypes.SavedGroupsChanged, (sender, newSavedGroups) =>
            {
                UpdateItems(newSavedGroups);
            });
        }
        async void Handle_ItemTapped(object sender, ItemTappedEventArgs e)
        {
            if (e.Item == null || !(e.Item is SavedGroup))
            {
                return;
            }

            SavedGroup selectedGroup = (SavedGroup)e.Item;

            //Deselect Item
            ((ListView)sender).SelectedItem = null;

            List <string> actionList = new List <string> {
                "Обновить расписание", "Настроить отображение предметов", "Удалить"
            };

            if (GroupsDataStore.GetSelected()?.ID != selectedGroup.ID)
            {
                actionList.Insert(0, "Выбрать");
            }
            string action = await DisplayActionSheet("Выберете действие:", "Отмена", null, actionList.ToArray());

            switch (action)
            {
            case "Выбрать":
                GroupsDataStore.UpdateSelected(selectedGroup);
                await DisplayAlert("Выбор группы", "Группа успешно выбрана", "Ok");

                break;

            case "Обновить расписание":
                await UpdateTimetable(selectedGroup);

                break;

            case "Настроить отображение предметов":
                await Navigation.PushAsync(new ManageLessonsPage(selectedGroup));

                break;

            case "Удалить":
                groups.Remove(selectedGroup);
                GroupsDataStore.UpdateSaved(groups.ToList());
                if (selectedGroup.ID == GroupsDataStore.GetSelected()?.ID)
                {
                    GroupsDataStore.UpdateSelected(null);
                }
                break;
            }
        }
        private async Task UpdateTimetable(params SavedGroup[] savedGroups)
        {
            if (savedGroups == null || savedGroups.Length == 0 || CheckUpdateTimetableRights() == false)
            {
                return;
            }

            GroupsLayout.IsEnabled   = false;
            ProgressLayout.IsVisible = true;

            await Task.Factory.StartNew(() =>
            {
                string result;
                if (EventsDataStore.GetEventsFromCist(Config.TimetableFromDate, Config.TimetableToDate, savedGroups) != null)
                {
                    foreach (SavedGroup group in savedGroups)
                    {
                        group.LastUpdated = DateTime.Now;
                    }
                    GroupsDataStore.UpdateSaved(groups.ToList());

                    if (savedGroups.Length == 1)
                    {
                        result = $"Расписание группы {savedGroups[0].Name} успешно обновлено.";
                    }
                    else
                    {
                        result = $"Расписание успешно обновлено для групп:{Environment.NewLine}{string.Join(", ", savedGroups.Select(g => g.Name))}";
                    }
                }
                else
                {
                    result = "Произошла ошибка, пожалуйста, попробуйте позже.";
                }

                Device.BeginInvokeOnMainThread(() =>
                {
                    DisplayAlert("Обновление расписания", result, "Ok");
                    ProgressLayout.IsVisible = false;
                    GroupsLayout.IsEnabled   = true;
                });
            });
        }
        async void Handle_ItemTapped(object sender, ItemTappedEventArgs e)
        {
            if (e.Item == null || !(e.Item is Group))
            {
                return;
            }

            Group selectedGroup = (Group)e.Item;

            //Deselect Item
            ((ListView)sender).SelectedItem = null;

            if (savedGroups.Exists(g => g.ID == selectedGroup.ID))
            {
                await DisplayAlert("Добавление группы", "Группа уже находится в сохранённых", "OK");

                return;
            }

            savedGroups.Add(new SavedGroup(selectedGroup));
            GroupsDataStore.UpdateSaved(savedGroups);
            await DisplayAlert("Добавление группы", "Группа добавлена в сохранённые", "OK");
        }
        private async Task UpdateGroups(bool fromCistOnly = false)
        {
            GroupsLayout.IsEnabled   = false;
            ProgressLayout.IsVisible = true;

            await Task.Factory.StartNew(() =>
            {
                if (fromCistOnly)
                {
                    allGroups = GroupsDataStore.GetAllFromCist();
                }
                else
                {
                    allGroups = GroupsDataStore.GetAll();
                }
                if (allGroups == null)
                {
                    Device.BeginInvokeOnMainThread(() =>
                    {
                        DisplayAlert("Загрузка списка групп", "Не удолось загрузить список групп. Пожалуйста, попробуйте позже.", "Ok");
                    });
                    return;
                }

                savedGroups = GroupsDataStore.GetSaved();
                groups      = new ObservableCollection <Group>(allGroups.OrderBy(g => g.Name));

                Device.BeginInvokeOnMainThread(() =>
                {
                    AllGroupsList.ItemsSource = groups;
                    Searchbar_TextChanged(new object(), new TextChangedEventArgs(null, null));

                    ProgressLayout.IsVisible = false;
                    GroupsLayout.IsEnabled   = true;
                });
            });
        }