private void UpdateFiles(List <UpdateFileEntryYaml> updateFileEntries)
        {
            if (Cancelled)
            {
                return;
            }

            Label_ProgressBar1.SafeInvoke(() => Label_ProgressBar1.Text = Label_ProgressBar3.Text);

            try
            {
                PercentageProgressBar.SafeInvoke(delegate { PercentageProgressBar.Maximum = updateFileEntries.Count; PercentageProgressBar.Step = 1; PercentageProgressBar.Value = 0; });
                Parallel.ForEach(updateFileEntries, (updateFileEntry, state) =>
                {
                    if (Cancelled)
                    {
                        state.Stop();
                    }

                    var dlUri    = new Uri(DLUri, updateFileEntry.AbsoluteFilePath);
                    var tempFile = new TempFile(updateFileEntry.AbsoluteFilePath);
                    using (var downloader = new WebClient())
                    {
                        downloader.DownloadFile(dlUri, tempFile.Path);
                        PercentageProgressBar.SafeInvoke(() => PercentageProgressBar.PerformStep());
                    }
                });
            }
            catch (UriFormatException)          { DownloadErrorMessage(); return; }
            catch (UnauthorizedAccessException) { DownloadErrorMessage(); return; }
            catch (IOException)                 { DownloadErrorMessage(); return; }
            catch (WebException)                { DownloadErrorMessage(); return; }

            ReplaceFiles(updateFileEntries);
        }
        private List <UpdateFileEntryYaml> StartUpdate()
        {
            if (Cancelled)
            {
                return(new List <UpdateFileEntryYaml>());
            }

            Label_ProgressBar1.SafeInvoke(() => Label_ProgressBar1.Text = Label_ProgressBar2.Text);

            var newUpdateInfo = UpdateInfoYaml.Deserialize(NewUpdateInfoFile.ReadAllText());

            var crc32 = new Crc32();
            var sha1  = new SHA1Managed();
            var notValidFileEntries = new List <UpdateFileEntryYaml>();

            PercentageProgressBar.SafeInvoke(delegate { PercentageProgressBar.Maximum = newUpdateInfo.Count(); PercentageProgressBar.Step = 1; PercentageProgressBar.Value = 0; });
            Parallel.ForEach(newUpdateInfo, (updateFileEntry, state) =>
            {
                if (Cancelled)
                {
                    state.Stop();
                }

                PercentageProgressBar.SafeInvoke(() => PercentageProgressBar.PerformStep());

                if (UpdatedFolder.CheckExists(updateFileEntry.AbsoluteFilePath) != ExistenceCheckResult.FileExists)
                {
                    notValidFileEntries.Add(updateFileEntry);
                    return;
                }
                using (var fs = UpdatedFolder.GetFile(updateFileEntry.AbsoluteFilePath).Open(PCLExt.FileStorage.FileAccess.Read))
                {
                    var crc32Hash = string.Empty;
                    var sha1Hash  = string.Empty;
                    crc32Hash     = crc32.ComputeHash(fs).Aggregate(crc32Hash, (current, b) => current + b.ToString("x2").ToLower());
                    if (crc32Hash == updateFileEntry.CRC32)
                    {
                        sha1Hash = sha1.ComputeHash(fs).Aggregate(sha1Hash, (current, b) => current + b.ToString("x2").ToLower());
                        if (sha1Hash == updateFileEntry.SHA1)
                        {
                            return;
                        }
                        else
                        {
                            notValidFileEntries.Add(updateFileEntry);
                            return;
                        }
                    }
                    else
                    {
                        notValidFileEntries.Add(updateFileEntry);
                        return;
                    }
                }
            });

            return(notValidFileEntries);
        }
        private async void DownloadUpdateInfoFiles()
        {
            OldUpdateInfoFile.Delete();
            NewUpdateInfoFile.Delete();

            try
            {
                using (Downloader = new WebClient())
                {
                    Downloader.DownloadProgressChanged += (sender, args) => PercentageProgressBar.SafeInvoke(() => PercentageProgressBar.Value = (int)args.BytesReceived);

                    PercentageProgressBar.SafeInvoke(() => PercentageProgressBar.Maximum = OldUpdateInfoAsset.Size);
                    await Downloader.DownloadFileTaskAsync(new Uri(OldUpdateInfoAsset.BrowserDownloadUrl), OldUpdateInfoFile.Path);

                    PercentageProgressBar.SafeInvoke(() => PercentageProgressBar.Maximum = NewUpdateInfoAsset.Size);
                    await Downloader.DownloadFileTaskAsync(new Uri(NewUpdateInfoAsset.BrowserDownloadUrl), NewUpdateInfoFile.Path);
                }
            }
            catch (WebException) { DownloadErrorMessage(); return; }
        }
		private void InitSubviews ()
		{
			FitpulseTheme.Apply (View);

			scrollView = new UIScrollView (UIScreen.MainScreen.Bounds);
			Add (scrollView);

			if (UISwitch.Appearance.RespondsToSelector (new Selector ("onImage"))) {
			} else {
				bool showSwitchText = !UIDevice.CurrentDevice.CheckSystemVersion (7, 0);
				var onRect = new CGRect (72, 20, 76, 42);
				var offRect = new CGRect (176, 20, 76, 42);

				if (!showSwitchText) {
				  onRect.X += 20;
				  onRect.Width -= 20;
				  offRect.Width -= 20;
				}

				var onSwitch = new SwitchOnOff (onRect);
				onSwitch.SetOn (true);

				var offSwitch = new SwitchOnOff (offRect);
				offSwitch.SetOn (false);

				onSwitch.ShowText (showSwitchText);
				offSwitch.ShowText (showSwitchText);

				scrollView.AddSubviews (onSwitch, offSwitch);
			}

			progressBar = new PercentageProgressBar (new CGRect (20, 68, 280, 24));
			progressBar.Progress = 0.5f;

			scrollView.Add (progressBar);

			var loadingLabel = new UILabel (new CGRect (118, 91, 84, 19));
			loadingLabel.Text = "Loading...";
			loadingLabel.Font = UIFont.BoldSystemFontOfSize (15);
			loadingLabel.TextColor = UIColor.FromRGB (135, 141, 138);
			loadingLabel.BackgroundColor = UIColor.Clear;
			loadingLabel.TextAlignment = UITextAlignment.Center;

			scrollView.Add (loadingLabel);		

			slider = new UISlider (new CGRect (18, 121, 284, 23));
			slider.MinValue = 0;
			slider.MaxValue = 1;
			slider.Value = 0.5f;
			slider.ValueChanged += (sender, e) => {
				progressBar.Progress = slider.Value; };

			scrollView.Add (slider);	

			var uiSegmentedControl = new UISegmentedControl (new [] {"Yes", "No", "Maybe"}) {
				SelectedSegment = 0
			};

			FitpulseTheme.Apply (uiSegmentedControl);
			uiSegmentedControl.SetWidth (80.0f, 0);
			uiSegmentedControl.SetWidth (80.0f, 1);				
			
			uiSegmentedControl.Frame = new CGRect (26, 161, 268, 44);

			scrollView.Add (uiSegmentedControl);

			textField = new UITextField (new CGRect (20, 221, 280, 31));
			textField.LeftView = new UIView (new CGRect (0, 0, 5, 31));
			textField.LeftViewMode = UITextFieldViewMode.Always;
			textField.Font = UIFont.SystemFontOfSize (14);
			textField.TextColor = UIColor.White;
			textField.Background = UIImage.FromFile ("text-input.png");
			textField.VerticalAlignment = UIControlContentVerticalAlignment.Center;
			textField.Placeholder = "Text";
			FitpulseTheme.Apply (textField);

			textField.Delegate = new TextFieldDelegate ();

			scrollView.Add (textField);

			var leftTopButton = Buttons.ElementsButton ("Button", FitpulseTheme.SharedTheme.GrayButtonImage);
			var rightTopButton = Buttons.ElementsButton ("Button", FitpulseTheme.SharedTheme.GrayPressedButtonImage);

			var leftBottomButton = Buttons.ElementsButton ("Button", FitpulseTheme.SharedTheme.BlueButtonImage);
			var rightBottomButton = Buttons.ElementsButton ("Button", FitpulseTheme.SharedTheme.BluePressedButtonImage);

			leftBottomButton.SetTitleColor (UIColor.White, UIControlState.Normal);
			leftBottomButton.SetTitleColor (UIColor.DarkGray, UIControlState.Highlighted);
			rightBottomButton.SetTitleColor (UIColor.White, UIControlState.Normal);
			rightBottomButton.SetTitleColor (UIColor.DarkGray, UIControlState.Highlighted);

			leftBottomButton.SetTitleShadowColor (UIColor.DarkGray, UIControlState.Normal);
			leftBottomButton.SetTitleShadowColor (UIColor.Gray, UIControlState.Highlighted);
			rightBottomButton.SetTitleShadowColor (UIColor.DarkGray, UIControlState.Normal);
			rightBottomButton.SetTitleShadowColor (UIColor.Gray, UIControlState.Highlighted);

			leftTopButton.Frame = new CGRect (20, 268, 126, 42);
			leftBottomButton.Frame = new CGRect (20, 318, 126, 42);
			rightTopButton.Frame = new CGRect (174, 268, 126, 42);
			rightBottomButton.Frame = new CGRect (174, 318, 126, 42);

			scrollView.AddSubviews (leftTopButton, leftBottomButton, rightTopButton, rightBottomButton);
			
		}
        private void CheckOldFiles()
        {
            var oldUpdateInfo = UpdateInfoYaml.Deserialize(OldUpdateInfoFile.ReadAllText());
            var newUpdateInfo = UpdateInfoYaml.Deserialize(NewUpdateInfoFile.ReadAllText());


            var toBeDeleted = new List <IFile>();
            var crc32       = new Crc32();
            var sha1        = new SHA1Managed();

            PercentageProgressBar.SafeInvoke(delegate { PercentageProgressBar.Maximum = oldUpdateInfo.Count(); PercentageProgressBar.Step = 1; PercentageProgressBar.Value = 0; });
            Parallel.ForEach(oldUpdateInfo, (oldUpdateFileEntry, state) =>
            {
                var newUpdateFileEntry = newUpdateInfo.FirstOrDefault(newUpdateInfoFile => newUpdateInfoFile.AbsoluteFilePath == oldUpdateFileEntry.AbsoluteFilePath);

                if (Cancelled)
                {
                    state.Stop();
                }

                PercentageProgressBar.SafeInvoke(() => PercentageProgressBar.PerformStep());

                if (UpdatedFolder.CheckExists(oldUpdateFileEntry.AbsoluteFilePath) != ExistenceCheckResult.FileExists)
                {
                    state.Break();
                }

                var folder  = UpdatedFolder;
                var folders = oldUpdateFileEntry.AbsoluteFilePath.Split('\\');
                foreach (var folderName in folders.Reverse().Skip(1).Reverse())
                {
                    folder = folder.GetFolder(folderName);
                }

                var file = UpdatedFolder.GetFile(folders.Reverse().Take(1).ToArray()[0]);
                using (var fs = file.Open(PCLExt.FileStorage.FileAccess.Read))
                {
                    var crc32Hash = string.Empty;
                    var sha1Hash  = string.Empty;
                    crc32Hash     = crc32.ComputeHash(fs).Aggregate(crc32Hash, (current, b) => current + b.ToString("x2").ToLower());
                    if (crc32Hash == oldUpdateFileEntry.CRC32 && crc32Hash == newUpdateFileEntry.CRC32)
                    {
                        sha1Hash = sha1.ComputeHash(fs).Aggregate(sha1Hash, (current, b) => current + b.ToString("x2").ToLower());
                        if (sha1Hash == oldUpdateFileEntry.SHA1 && sha1Hash == newUpdateFileEntry.SHA1)
                        {
                            return; // -- Everything matches, do nothing.
                        }
                        else
                        {
                            toBeDeleted.Add(file);
                            return; // -- Should be deleted;
                        }
                    }
                    else
                    {
                        toBeDeleted.Add(file);
                        return; // -- Should be deleted;
                    }
                }
            });
            foreach (var file in toBeDeleted)
            {
                file.Delete();
            }
        }