private async Task CreateThumbnails(string selected, AbstractMediaProvider provider)
        {
            cancellationTokenSource = new CancellationTokenSource();
            var token = cancellationTokenSource.Token;

            thumbnailGrid.Items.Clear();
            fileList = await provider.GetChildEntries(selected);

            Array.Sort(fileList, (string s1, string s2) =>
            {
                int i1, i2;
                string s1WithoutExtension = s1.Substring(0, s1.LastIndexOf("."));
                string s2WithoutExtension = s2.Substring(0, s2.LastIndexOf("."));

                if (Int32.TryParse(s1WithoutExtension, out i1) && Int32.TryParse(s2WithoutExtension, out i2))
                {
                    return(i1.CompareTo(i2));
                }
                return(s1.CompareTo(s2));
            });

            try
            {
                foreach (var file in fileList)
                {
                    var stream = await provider.OpenEntryAsRandomAccessStreamAsync(file);

                    SoftwareBitmap bitmap = await CreateResizedBitmap(stream, 200, 200);

                    var source        = new SoftwareBitmapSource();
                    var setSourceTask = source.SetBitmapAsync(bitmap);

                    var thumbnail = new Thumbnail();
                    thumbnail.Image.Source = source;
                    thumbnail.Click       += Thumbnail_Click;

                    thumbnail.Label.Text = ExtractFilename(file);

                    thumbnail.UserData = file;

                    token.ThrowIfCancellationRequested();
                    thumbnailGrid.Items.Add(thumbnail);

                    await setSourceTask;
                    await Task.Delay(1);
                }
            }
            catch { }
            finally { cancellationTokenSource = null; }
        }
        public async void SetMediaProvider(AbstractMediaProvider provider)
        {
            if (this.provider != null)
            {
                this.provider.Dispose();
            }
            this.provider = provider;
            subFolderListCtrl.Items.Clear();
            folderList = await provider.GetFolderEntries();

            RebuildSubFolderList();

            subFolderListCtrl.SelectedIndex = 0;
            imageControl.Visibility         = Visibility.Collapsed;
            imageControl.AutoEnabled        = false;
            imageBorder.Visibility          = Visibility.Collapsed;
            loadingBorder.Visibility        = Visibility.Collapsed;
            thumbnailGrid.IsEnabled         = true;
            this.IsEnabled = true;
        }
        private async Task <Exception> ChangeMediaProvider(AbstractMediaProvider provider)
        {
            if (this.NavigationPane.SelectedItem is NavigationViewItem selectedItem)
            {
                if (selectedItem.Content is FolderListItem item)
                {
                    var page = this.thumbnailPages.Find((p) => p.Entry == item.FolderEntry);
                    if (page != null)
                    {
                        page.CancellationToken.Cancel();
                    }
                }
            }

            FolderReadingDialog dialog = new FolderReadingDialog();

            _ = dialog.ShowAsync(ContentDialogPlacement.Popup);

            Exception error;

            error = await MediaManager.ChangeProvider(provider);

            if (error != null)
            {
                dialog.Hide();
                return(error);
            }

            await this.RebuildSubFolderList(dialog);

            GC.Collect();
            this.ThumbnailBorder.Opacity = 0;

            this.HideImageControl();
            this.IsEnabled = true;
            dialog.Hide();
            return(null);
        }
        private async void openFileButton_Click(object sender, RoutedEventArgs e)
        {
            this.IsEnabled = false;
            var picker = new FileOpenPicker();

            picker.FileTypeFilter.Add(".zip");
            picker.FileTypeFilter.Add(".rar");
            picker.FileTypeFilter.Add(".7z");
            picker.FileTypeFilter.Add("*");
            var selected = await picker.PickSingleFileAsync();

            if (selected == null)
            {
                this.IsEnabled = true;
                return;
            }

            var stream = await selected.OpenStreamForReadAsync();

            AbstractMediaProvider provider = null;

            try
            {
                provider = new ArchiveMediaProvider(stream);
            }
            catch
            {
                var dialog = new MessageDialog(String.Format("Cannot open file: {0}.", selected.Name), "Error");
                await dialog.ShowAsync();

                stream.Dispose();
                this.IsEnabled = true;
                return;
            }
            filenameTextBlock.Text = selected.Name;
            SetMediaProvider(provider);
        }