using System; using System.IO; using InABox.Core; using Plugin.Media; using Xamarin.Forms; using XF.Material.Forms.UI.Dialogs; namespace comal.timesheets { class EmbeddedImageCapture : Grid { public Button CameraButton = new Button(); public Button LibraryButton = new Button(); public Label CameraLabel = new Label(); public Label LibraryLabel = new Label(); public Document Document; public Image Image { get; set; } bool firstLoad; bool disableLibrary; public EmbeddedImageCapture(bool disablelibrary = false) { VerticalOptions = LayoutOptions.Center; firstLoad = true; Document = new Document(); Image = new Image(); disableLibrary = disablelibrary; AddColumnsAndRows(); AddButtons(); } private void AddColumnsAndRows() { new ColumnDefinition { Width = new GridLength(1, GridUnitType.Star) }; new ColumnDefinition { Width = new GridLength(1, GridUnitType.Star) }; RowDefinition row = new RowDefinition() { Height = new GridLength(1, GridUnitType.Star) }; RowDefinition row1 = new RowDefinition() { Height = new GridLength(5, GridUnitType.Star) }; RowDefinition row2 = new RowDefinition() { Height = new GridLength(2, GridUnitType.Star) }; RowDefinitions.Add(row); RowDefinitions.Add(row1); RowDefinitions.Add(row2); } private void AddButtons() { if (firstLoad) { CameraButton.Clicked += CameraButton_Clicked; CameraButton.ImageSource = "cameraicon.png"; CameraButton.Margin = 5; CameraButton.Padding = 2; SetColumn(CameraButton, 0); SetRow(CameraButton, 1); CameraButton.BackgroundColor = Color.FromHex("#15C7C1"); CameraButton.HeightRequest = 90; CameraButton.WidthRequest = 90; CameraButton.CornerRadius = 15; CameraButton.HorizontalOptions = LayoutOptions.Center; CameraButton.VerticalOptions = LayoutOptions.Center; //CameraButton.BorderWidth = 1; //CameraButton.BorderColor = Color.Orange; LibraryButton.Clicked += LibraryButton_Clicked; LibraryButton.ImageSource = "photolibraryicon.png"; if (Device.RuntimePlatform.Equals(Device.iOS)) { LibraryButton.ImageSource = "photo.png"; } LibraryButton.Margin = 5; LibraryButton.Padding = 2; SetRow(LibraryButton, 1); SetColumn(LibraryButton, 1); LibraryButton.BackgroundColor = Color.FromHex("#15C7C1"); LibraryButton.HeightRequest = 90; LibraryButton.WidthRequest = 90; LibraryButton.CornerRadius = 15; LibraryButton.HorizontalOptions = LayoutOptions.Center; LibraryButton.VerticalOptions = LayoutOptions.Center; if (disableLibrary) LibraryButton.IsEnabled = false; //LibraryButton.BorderWidth = 1; //LibraryButton.BorderColor = Color.Orange; CameraLabel.Text = "Camera"; SetRow(CameraLabel, 2); SetColumn(CameraLabel, 0); CameraLabel.HorizontalOptions = LayoutOptions.Center; CameraLabel.HorizontalTextAlignment = TextAlignment.Center; CameraLabel.FontAttributes = FontAttributes.Bold; CameraLabel.FontSize = Device.GetNamedSize(NamedSize.Medium, CameraLabel); LibraryLabel.Text = "Library"; SetRow(LibraryLabel, 2); SetColumn(LibraryLabel, 1); LibraryLabel.HorizontalOptions = LayoutOptions.Center; LibraryLabel.HorizontalTextAlignment = TextAlignment.Center; LibraryLabel.FontAttributes = FontAttributes.Bold; LibraryLabel.FontSize = Device.GetNamedSize(NamedSize.Medium, LibraryLabel); } Children.Add(CameraButton); Children.Add(LibraryButton); Children.Add(CameraLabel); Children.Add(LibraryLabel); firstLoad = false; } private void CameraButton_Clicked(object sender, EventArgs e) { OpenCamera(); } private void LibraryButton_Clicked(object sender, EventArgs e) { OpenLibrary(); } private async void OpenLibrary() { try { await CrossMedia.Current.Initialize(); if (!CrossMedia.Current.IsCameraAvailable || !CrossMedia.Current.IsTakePhotoSupported) { return; } var file = await CrossMedia.Current.PickPhotoAsync(new Plugin.Media.Abstractions.PickMediaOptions() { CompressionQuality = 15, PhotoSize = Plugin.Media.Abstractions.PhotoSize.Full, }); if (file == null) return; AddPhoto(file); } catch { return; } } private async void OpenCamera() { try { await CrossMedia.Current.Initialize(); if (!CrossMedia.Current.IsCameraAvailable || !CrossMedia.Current.IsTakePhotoSupported) { return; } String filename = String.Format("{0:yyyy-MM-dd HH:mm:ss.fff}.png", DateTime.Now); var file = await CrossMedia.Current.TakePhotoAsync(new Plugin.Media.Abstractions.StoreCameraMediaOptions { Name = filename, CompressionQuality = 15, PhotoSize = Plugin.Media.Abstractions.PhotoSize.Full, SaveMetaData = false }); if (file == null) return; AddPhoto(file); } catch { } } private async void AddPhoto(Plugin.Media.Abstractions.MediaFile file) { try { using (await MaterialDialog.Instance.LoadingDialogAsync(message: "Adding Photo")) { var memoryStream = new MemoryStream(); if (Device.RuntimePlatform.Equals(Device.Android)) file.GetStream().CopyTo(memoryStream); else if (Device.RuntimePlatform.Equals(Device.iOS)) file.GetStreamWithImageRotatedForExternalStorage().CopyTo(memoryStream); var data = memoryStream.ToArray(); DataToImage(data); } } catch { } } public void DataToImage(byte[] data) { try { ImageSource src = ImageSource.FromStream(() => new MemoryStream(data)); Image = new Image(); Image.HeightRequest = 200; Image.WidthRequest = 200; Image.Aspect = Aspect.AspectFit; Image.VerticalOptions = LayoutOptions.FillAndExpand; Image.HorizontalOptions = LayoutOptions.FillAndExpand; Image.Source = src; Image.GestureRecognizers.Add(new TapGestureRecognizer { Command = new Command(OnTap), CommandParameter = src, NumberOfTapsRequired = 1 }); if (Image != null) { Device.BeginInvokeOnMainThread(() => { Children.Clear(); RowDefinitions.Clear(); ColumnDefinitions.Clear(); //SetColumn(Image, 0); //SetColumnSpan(Image, 2); //SetRow(Image, 0); //SetRowSpan(Image, 3); Children.Add(Image); //ForceLayout(); }); } } catch { } } private void OnTap(object obj) { ImageViewerEditor imageViewEditor = new ImageViewerEditor(obj as ImageSource, true); imageViewEditor.OnDeleteSelected += Viewer_OnDeleteSelected; imageViewEditor.OnSaveSelected += ImageViewEditor_OnSaveSelected; Navigation.PushAsync(imageViewEditor); } private void ImageViewEditor_OnSaveSelected(byte[] array) { DataToImage(array); } private void Viewer_OnDeleteSelected() { Document = new Document(); Image = new Image(); Image.Source = null; Children.Clear(); AddColumnsAndRows(); AddButtons(); } public void ClearItems() { Image = new Image(); Image.Source = null; Children.Clear(); } } }