예제 #1
0
 public ReadingList(Ao3PageModel model, long timestamp, int?unread)
 {
     Uri       = model.Uri.AbsoluteUri;
     Timestamp = timestamp;
     Unread    = unread;
     Model     = Ao3PageModel.Serialize(model);
 }
예제 #2
0
        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);
            }
        }
예제 #3
0
        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);
        }