public ReadingList(Ao3PageModel model, long timestamp, int?unread) { Uri = model.Uri.AbsoluteUri; Timestamp = timestamp; Unread = unread; Model = Ao3PageModel.Serialize(model); }
private async Task WriteViewModelToDbAsync(Ao3PageViewModel viewmodel, ReadingList dbentry) { bool changed = false; if (dbentry.Unread != viewmodel.Unread) { changed = true; dbentry.Unread = viewmodel.Unread; } string model = Ao3PageModel.Serialize(viewmodel.BaseData); if (!(model is null) && dbentry.Model != model) { changed = true; dbentry.Model = model; } if (changed) { await App.Database.ReadingListCached.InsertOrUpdateAsync(dbentry); } }
void RestoreReadingList() { Task.Factory.StartNew(async() => { await App.Database.ReadingListCached.BeginDeferralAsync(); try { // Restore the reading list contents! var items = new Dictionary <string, ReadingList>(); foreach (var i in await App.Database.ReadingListCached.SelectAsync()) { items[i.Uri] = i; } var tasks = new Queue <Task>(); using (var tasklimit = new SemaphoreSlim(MaxRefreshTasks)) { await wvp.DoOnMainThreadAsync(() => ListView.ItemsSource = readingListBacking); if (items.Count == 0) { tasks.Enqueue(AddAsyncImpl("http://archiveofourown.org/", DateTime.UtcNow.ToUnixTime())); } else { var timestamp = DateTime.UtcNow.ToUnixTime(); foreach (var item in items.Values) { var model = Ao3PageModel.Deserialize(item.Model) ?? Ao3SiteDataLookup.LookupQuick(item.Uri); if (model == null) { continue; } if (model.Uri.AbsoluteUri != item.Uri) { await App.Database.ReadingListCached.DeleteAsync(item.Uri); await App.Database.ReadingListCached.InsertOrUpdateAsync(new ReadingList(model, timestamp, item.Unread)); } if (readingListBacking.FindInAll((m) => m.Uri.AbsoluteUri == model.Uri.AbsoluteUri) is null) { var viewmodel = new Ao3PageViewModel(model.Uri, model.HasChapters ? item.Unread : (int?)null, model.Type == Ao3PageType.Work ? tagTypeVisible : null) { TagsVisible = tags_visible, Favourite = item.Favourite }; await tasklimit.WaitAsync(); tasks.Enqueue(Task.Run(async() => { await viewmodel.SetBaseDataAsync(model, false); if (!readingListBacking.Contains(viewmodel)) { await wvp.DoOnMainThreadAsync(() => { viewmodel.PropertyChanged += Viewmodel_PropertyChanged; readingListBacking.Add(viewmodel); }); } await RefreshAsync(viewmodel); await Task.Delay(RefreshDelay); tasklimit.Release(); })); } #pragma warning disable 4014 while (tasks.Count > 0 && tasks.Peek().IsCompleted) { tasks.Dequeue(); } #pragma warning restore 4014 } } } await wvp.DoOnMainThreadAsync(() => { restored.SetResult(true); SyncIndicator.Content = new ActivityIndicator() { IsVisible = IsOnScreen, IsRunning = IsOnScreen, IsEnabled = IsOnScreen }; App.Database.GetVariableEvents("LogFontSizeUI").Updated += LogFontSizeUI_Updated; }); GC.Collect(); // If we don't have network access, we wait till it's available if (!App.Current.HaveNetwork) { tcsNetworkAvailable = new TaskCompletionSource <bool>(); App.Current.HaveNetworkChanged += App_HaveNetworkChanged; await tcsNetworkAvailable.Task; } #pragma warning disable 4014 while (tasks.Count > 0 && tasks.Peek().IsCompleted) { tasks.Dequeue(); } #pragma warning restore 4014 await Task.WhenAll(tasks); await SyncToServerAsync(false, true); } finally { await App.Database.ReadingListCached.EndDeferralAsync().ConfigureAwait(false); } await wvp.DoOnMainThreadAsync(() => { RefreshButton.IsEnabled = true; SyncIndicator.Content = null; }).ConfigureAwait(false); }, TaskCreationOptions.PreferFairness | TaskCreationOptions.LongRunning); }