protected override async void OnAppearing() { if (IsBusy) { return; } try { IsBusy = true; if (!_adjusted) { await Device.InvokeOnMainThreadAsync(() => UniformFormattingHelpers.UniversalAdjustments(this.Content)); _adjusted = false; } ScrollDownPrompt.IsVisible = false; await Task.Delay(10); _ = Task.Run(async() => { await Task.Delay(10); using (UserDialogs.Instance.Loading("Loading Photos...")) { await MakeGrid(); _adjusted = true; } }); while (!_adjusted) { await Task.Delay(200); } } catch (Exception ex) { Console.WriteLine("Error: " + ex.Message); } IsBusy = false; }
protected override async void OnAppearing() { if (IsBusy) { base.OnAppearing(); return; } try { IsBusy = true; if (!_adjusted) { await Device.InvokeOnMainThreadAsync(() => { UniformFormattingHelpers.UniversalAdjustments(this.Content); _adjusted = true; }); } base.OnAppearing(); var noimageyet = "iVBORw0KGgoAAAANSUhEUgAAAMgAAADICAMAAACahl6sAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAMAUExURf8AAP8BAf8CAv8DA/8EBP8FBf8GBv8HB/8ICP8JCf8KCv8LC/8MDP8NDf8ODv8PD/8QEP8SEv8TE/8UFP8WFv8XF/8YGP8aGv8bG/8cHP8eHv8fH/8gIP8hIf8iIv8jI/8kJP8lJf8mJv8oKP8qKv8rK/8sLP8tLf8uLv8vL/8wMP8xMf8yMv8zM/80NP81Nf82Nv83N/85Of86Ov87O/88PP8+Pv8/P/9AQP9CQv9DQ/9ERP9HR/9ISP9KSv9MTP9NTf9OTv9PT/9QUP9RUf9SUv9UVP9XV/9YWP9ZWf9aWv9cXP9dXf9fX/9gYP9hYf9iYv9kZP9lZf9mZv9nZ/9oaP9qav9ra/9sbP9ubv9vb/9wcP9xcf9ycv9zc/90dP91df92dv93d/94eP96ev97e/98fP99ff9+fv9/f4CAgP+AgP+Bgf+Cgv+Dg/+EhP+Fhf+Hh/+IiP+Jif+Kiv+Li/+MjP+Njf+Ojv+Pj/+QkP+Rkf+Skv+Tk/+Vlf+Wlv+Xl/+YmP+Zmf+amv+bm/+cnP+dnf+env+fn/+goP+hof+iov+jo/+kpP+lpf+mpv+np/+oqP+pqf+qqv+rq/+srP+urv+vr/+xsf+ysv+zs/+0tP+1tf+2tv+3t/+4uP+5uf+6uv+7u/+8vP+9vf++vv+/v//AwP/Cwv/Dw//Gxv/Hx//IyP/Jyf/Kyv/Ly//MzP/Nzf/Ozv/Pz//Q0P/R0f/S0v/T0//U1P/V1f/W1v/X1//Y2P/Z2f/b2//c3P/e3v/f3//i4v/j4//k5P/m5v/n5//o6P/p6f/q6v/r6//s7P/t7f/u7v/v7//w8P/y8v/z8//09P/19f/29v/39//4+P/5+f/6+v/7+//8/P/9/f///wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHpgoG0AAAAJcEhZcwAADsMAAA7DAcdvqGQAAAaOSURBVHhe7Zf7f811HMdfGrWSEM1tcUpyyz2l5pJLKWNuuYuWisWEVSwVc2uKooQuLilDFJpLKrfColIjafP5Y/pcXuewM49Hx2Ozx9t6P3847/f78z1nj9fzfL6XM5hqQrUSeemGR0WkoSLSUBFpVFcR295gMLiKiIHBVUQMDK4iYmBwFREDg6uIGBhcRcTA4CoiBgZXETEwuIqIgcFVRAwMriJiYHAVEQODq4gYGFxFxMDgKiIGBlcRMTC4ioiBwVVEDAyuImJgcBURA4OriBgYXEXEwOAqIgYGVxExMLiKiIHBVUQMDK4iYmBwFREDg6uIGBhcRcTA4CoiBgZXETEwuIqIgcFVRAwMriJiYHAVEQODq4gYGFxFxMDgKiIGBlcRMTD4/0pkQuPIy6Hb2uTu0JRn7p3d2VWIjNSs0JxpmXowdP8Bgyci8iCAAt9tQh1fr0IOKkUkH8mnfJOFSIlvorw9+i12ZWHwxESS0dN311+kJIIJrp6th3y/EGMkxrErC4MnJjIMWO+66y8S3ZJyG2IyMIxdWRg8MZGcdHR1XUykaG32iNe3hD5AkXmvGbNh4pSNtj0yacT8vW7NmPMrxw+Zuiz05tLSKRPmzM/NXeSnj7NH5+30XSBsSXRDjuSPzd3hjL7IbYOOi5YscYtlYfAERX4EVtguKrKxkb1sgEd/8JOHIjVxqIM7NMbk1bDl5nVucUYdt4Q2B9zweXM/AE3ssNe/OZxNxG/JbL8hJZP90R4/G5PuO+AS33UZBk9QxEzA/bajyAZg+Ee78+5Fo8t/NyaC+nPXZwD90HvV4hZo5xbrts4pOJDZDk+5oRUmHzvzKpJy1hhzIgkvFB5dnoyp7kjAbsnMkiZ+Q9IRWXN8R5qT2ri4FTq+krs4vOdKGDxRkVO1sMCYzUGkCx5x5VgKsl31UCQJjffb0hnIsKUQ+NaW59wRs91/eDM6u2EgFtrXEZjkhrW47Q9XA/lIWeE3pBApxXYuCadZX4z0h+Nh8ERFzIto6lLcbudPccc5fyALrXx1xEQ+cGUW2rhiIvjQV8d54LSxJ81YN8xwp9OfgD1rLCn4yleP3ZIGPvpwzPQLTyLdvvYLHywHgycscq4+ZlPkDaSFAztwa2gsMZHDrqyiSGfk+mou/bSrADhuzEr0d/MgLDVmn73yVjpa4H3/rkA+wi0rDWPzHenoYacnwu6Vg8ETFrFJ650LIhMx2K+bI8DJ0MWLrEZbV+xJ6EWWdA+XqhU5Abzjs35nzLqw6njPvz1Q0iB8KpXHgD52GoRMt1gOBk9cxDRFdhB5FgPcbO85QGnoYiI3xYvMs6+j0WDKsvVrvYhpH7K5P7kJ+NKzfZd7c4zUcO+NYHZB4IydhlSayALUCyIL0cXNLm6z0FjiRfztyp5aVqQQtd19utSL5GDe9AH9J/sHjL2pu1IOivTCm34MDK80EXvjzPAi9ovc7Rcew0BfHfEi7V0JIvPDoSDSG5/5I46LCLeGeCgyNlxOZDxGsysLg1+LyLv2jHAipge6FdkyFzjkRs/VRTo5kdW4xz5vitO8yBjUHZo5bdYq/yydirb7XP0r+tQPUORIsn8K2y11p9ZsdPJDPAx+LSLmYYpsSUbt3mPsQ5m/7h0UqREVecCVIHIyFa2fH9XM/vR010gkXCMYZPvS+5DUZ9K4vkn+z8agiL29I21yVkaq/+39DdBpcMWe7N2iIvsaoaVvjvaqBdzSdZsfAlcX6egv9q972uAdDnZ1Innouufg7g32x4f/FjIb2kM1H3JPx8tEuBPmE2+dMsrtiN0SoLlfLgODJyJy0Z1H8XzvHuBX8qd//dU+8xyn//allGPRtt+NuWCHs7UR/l+ahsd9NUVbD8d/zcXhXxJHceHO2FC6339JcTB4IiKVyZ7o7+dn8HRoKgqDV7XIBWCqPVH+Wcj/cCoOg1e1iFluz/SGd9krbA4XKgqDV7mI+WX60H4Dxsz6jWOFYfCqF6lsGFxFxMDgKiIGBlcRMTC4ioiBwVVEDAyuImJgcBURA4OriBgYXEXEwOAqIgYGVxExMLiKiIHBVUQMDK4iYmBwFREDg6uIGBhcRcTA4CoiBgZXETEwuIqIgcFVRAwMriJiYHAVEQODq4gYGFxFxMDgKiIGBlcRMTC4ioiBwVVEDAyuImJgcBURA4OriBgYXEXEwOAqIgYGVxExMLiKiIHBVUQMDF5tRW5cVEQaKiINFZFGdROpFlQTEWP+BY52eW7j7qukAAAAAElFTkSuQmCC"; ImageSource noImg = ImageSource.FromStream(() => new MemoryStream(Convert.FromBase64String(noimageyet))); if (_nShippingOrderFileID > 0) { Device.BeginInvokeOnMainThread(() => CameraButton.Text = "Retake Photo"); using (UserDialogs.Instance.Loading("Showing existing image....")) { await Task.Delay(100); var existingPic = App.soapService.GetShippingOrderFiles(_nShippingOrderID, _picType).SingleOrDefault(x => x.ShippingOrderFileID == _nShippingOrderFileID); if (existingPic != null) { await Task.Run(async() => { var str = await App.soapService.DownloadPicture(existingPic.FileName); var imagedata = Convert.FromBase64String(str); var image = ImageSource.FromStream(() => new MemoryStream(imagedata)); Device.BeginInvokeOnMainThread(() => { PhotoImage.Source = image; }); await Task.Delay(3000); }); } else { Device.BeginInvokeOnMainThread(() => { PhotoImage.Source = noImg; }); } } } else { Device.BeginInvokeOnMainThread(async() => { PhotoImage.Source = noImg; await Task.Delay(10); }); } } catch (Exception ex) { Console.WriteLine("Error: " + ex.Message); } IsBusy = false; }
private async Task MakeGrid() { string[] docTypes = { "Document", "Pickup", "Delivery", "Other" }; var files = App.soapService.GetShippingOrderFiles(_nShippingOrderID, "").OrderByDescending(f => f.UploadedTimeStamp); await Device.InvokeOnMainThreadAsync(() => { if (grid.RowDefinitions != null && grid.RowDefinitions.Count > 0) { grid.RowDefinitions.Clear(); } if (grid.Children != null && grid.Children.Count > 0) { grid.Children.Clear(); } foreach (var col in grid.ColumnDefinitions) { col.Width = Xamarin.Essentials.DeviceDisplay.MainDisplayInfo.Width / Xamarin.Essentials.DeviceDisplay.MainDisplayInfo.Density / 5; } }); var colDef = grid.ColumnDefinitions.FirstOrDefault(); double colWidth = 60.0; if (colDef != null) { colWidth = colDef.Width.Value; } int columnCount = 0; int rowCount = 0; await Device.InvokeOnMainThreadAsync(() => { mainHeader.Text = "Photos for Order #" + _nOrderNumber.ToString(); mainHeader.FontSize = 18; mainHeader.FontAttributes = FontAttributes.Bold; mainHeader.HorizontalOptions = LayoutOptions.CenterAndExpand; mainHeader.HeightRequest = 40; UniformFormattingHelpers.SetLabelFontAttributes(mainHeader); }); foreach (var type in docTypes) { var header = new Label() { Text = type + " Photos", HeightRequest = 34, VerticalOptions = LayoutOptions.Center, HorizontalOptions = LayoutOptions.Start, VerticalTextAlignment = TextAlignment.Center }; var addButton = new Button() { Text = "Add " + type + " Photo", FontSize = 13, HeightRequest = 32, WidthRequest = 160, VerticalOptions = LayoutOptions.Center, HorizontalOptions = LayoutOptions.End, Command = new Command(async() => { if (IsBusy) { return; } IsBusy = true; ScrollDownPrompt.IsVisible = false; await new PageService().PushModalAsync(new TakePhoto(_userSignIn, _nShippingOrderID, type, 0)); await Task.Delay(1000); IsBusy = false; }) }; UniformFormattingHelpers.SetLabelFontAttributes(header); await Device.InvokeOnMainThreadAsync(async() => { UniformFormattingHelpers.SetButtonAttributes(addButton); grid.RowDefinitions.Add(new RowDefinition() { Height = header.HeightRequest }); double spaceAvailableForScrolling = scrollView.ContentSize.Height - scrollView.Height; if (spaceAvailableForScrolling > 0) { await scrollView.ScrollToAsync(0, spaceAvailableForScrolling, false); await Task.Delay(10); } grid.Children.Add(header, 0, rowCount); grid.Children.Add(addButton, 2, rowCount++); Grid.SetColumnSpan(header, 2); Grid.SetColumnSpan(addButton, 2); }); foreach (var item in files.Where(f => f.DocumentType == type)) { bool fileExists = await App.soapService.PictureExists(item.FileName); if (fileExists) { string thumbFileName = item.FileName.Replace(".png", "_thumb.png"); bool thumbnailExists = await App.soapService.PictureExists(thumbFileName); if (!thumbnailExists) { string bigImageStr = await App.soapService.DownloadPicture(item.FileName); byte[] newthumbnail = null; var bigimagedata = Convert.FromBase64String(bigImageStr); try { newthumbnail = App.imageService.GenerateThumbnail(bigimagedata, 200); await App.soapService.UploadPicture(newthumbnail, thumbFileName); } catch (Exception ex) { Console.WriteLine(ex.Message + Environment.NewLine + ex.StackTrace); } } string str = await App.soapService.DownloadPicture(thumbFileName); var imagedata = Convert.FromBase64String(str); var resizedThumbnail = imagedata; try { resizedThumbnail = App.imageService.GenerateThumbnail(imagedata, (int)colWidth); } catch (Exception ex) { Console.WriteLine(ex.Message + Environment.NewLine + ex.StackTrace); } var size = App.imageService.GetSize(resizedThumbnail); var image = new Image() { Source = ImageSource.FromStream(() => new MemoryStream(resizedThumbnail)), GestureRecognizers = { new TapGestureRecognizer() { Command = new Command(async() => { if (IsBusy) { return; } IsBusy = true; ScrollDownPrompt.IsVisible = false; await new PageService().PushModalAsync(new TakePhoto(_userSignIn, _nShippingOrderID, type, item.ShippingOrderFileID)); await Task.Delay(1000); IsBusy = false; }) } }, WidthRequest = size.Width, HeightRequest = size.Height }; await Device.InvokeOnMainThreadAsync(async() => { if (columnCount == 0) { grid.RowDefinitions.Add(new RowDefinition() { Height = colWidth }); grid.Children.Add(image, columnCount++, rowCount); await Task.Delay(10); double spaceAvailableForScrolling = scrollView.ContentSize.Height - scrollView.Height; if (spaceAvailableForScrolling > 0) { await scrollView.ScrollToAsync(0, spaceAvailableForScrolling, false); await Task.Delay(10); } } else { grid.Children.Add(image, columnCount++, rowCount); } if (columnCount > 3) { columnCount = 0; rowCount++; } }); } else { Console.WriteLine(item.FileName + " doesn't exist as a blob on Azure"); } } if (files.Where(f => f.DocumentType == type).Count() <= 0) { var noPhotos = new Label() { Text = "No " + type + " Photos yet", FontSize = 12, HeightRequest = 60, VerticalTextAlignment = TextAlignment.Center, TextColor = Color.FromHex("#666666"), HorizontalTextAlignment = TextAlignment.Center }; await Device.InvokeOnMainThreadAsync(async() => { UniformFormattingHelpers.SetLabelFontAttributes(noPhotos); grid.RowDefinitions.Add(new RowDefinition() { Height = UniformFormattingHelpers.SizeByFontRatio(60) }); grid.Children.Add(noPhotos, 0, rowCount); Grid.SetColumnSpan(noPhotos, 4); double spaceAvailableForScrolling = scrollView.ContentSize.Height - scrollView.Height; if (spaceAvailableForScrolling > 0) { await scrollView.ScrollToAsync(0, spaceAvailableForScrolling, false); await Task.Delay(10); } }); } if (columnCount > 0) { columnCount = 0; rowCount++; } } var lastRow = new Label() { Text = "" }; lastRow.VerticalOptions = LayoutOptions.EndAndExpand; Grid.SetColumnSpan(lastRow, 4); await Device.InvokeOnMainThreadAsync(async() => { grid.Children.Add(lastRow, 0, rowCount); await scrollView.ScrollToAsync(0, 0, false); await Task.Delay(10); }); }