From f9db2b147981c20bc1e3f7e17e4bd0b6b233ebf4 Mon Sep 17 00:00:00 2001 From: Kenneth van Ewijk Date: Wed, 20 Jan 2016 15:33:48 +0100 Subject: [PATCH] Much better photo handling --- .../EventArgs/PhotoStatusUpdatedEventArgs.cs | 14 ++++++ .../Helpers/EventArgs/PhotoTakenEventArgs.cs | 14 ------ YJMPD-UWP/Model/ApiHandler.cs | 11 +++-- YJMPD-UWP/Model/GameHandler.cs | 15 ++++-- YJMPD-UWP/Model/NetworkHandler.cs | 4 +- YJMPD-UWP/Model/PhotoHandler.cs | 30 +++++++++--- YJMPD-UWP/ViewModels/GameVM.cs | 13 ++++- YJMPD-UWP/ViewModels/PhotoVM.cs | 48 +------------------ YJMPD-UWP/Views/GameView.xaml | 10 ++-- YJMPD-UWP/Views/PhotoView.xaml | 17 ++----- YJMPD-UWP/Views/WaitingView.xaml | 2 +- YJMPD-UWP/Views/WaitingView.xaml.cs | 9 ++++ YJMPD-UWP/YJMPD-UWP.csproj | 2 +- 13 files changed, 90 insertions(+), 99 deletions(-) create mode 100644 YJMPD-UWP/Helpers/EventArgs/PhotoStatusUpdatedEventArgs.cs delete mode 100644 YJMPD-UWP/Helpers/EventArgs/PhotoTakenEventArgs.cs diff --git a/YJMPD-UWP/Helpers/EventArgs/PhotoStatusUpdatedEventArgs.cs b/YJMPD-UWP/Helpers/EventArgs/PhotoStatusUpdatedEventArgs.cs new file mode 100644 index 0000000..b206139 --- /dev/null +++ b/YJMPD-UWP/Helpers/EventArgs/PhotoStatusUpdatedEventArgs.cs @@ -0,0 +1,14 @@ +using Windows.UI.Xaml.Media.Imaging; + +namespace YJMPD_UWP.Helpers.EventArgs +{ + public class PhotoStatusUpdatedEventArgs : System.EventArgs + { + public Model.PhotoHandler.PhotoStatus Status { get; private set; } + + public PhotoStatusUpdatedEventArgs(Model.PhotoHandler.PhotoStatus status) + { + Status = status; + } + } +} diff --git a/YJMPD-UWP/Helpers/EventArgs/PhotoTakenEventArgs.cs b/YJMPD-UWP/Helpers/EventArgs/PhotoTakenEventArgs.cs deleted file mode 100644 index 7365938..0000000 --- a/YJMPD-UWP/Helpers/EventArgs/PhotoTakenEventArgs.cs +++ /dev/null @@ -1,14 +0,0 @@ -using Windows.UI.Xaml.Media.Imaging; - -namespace YJMPD_UWP.Helpers.EventArgs -{ - public class PhotoTakenEventArgs : System.EventArgs - { - public string Photo { get; private set; } - - public PhotoTakenEventArgs(string photo) - { - Photo = photo; - } - } -} diff --git a/YJMPD-UWP/Model/ApiHandler.cs b/YJMPD-UWP/Model/ApiHandler.cs index d7f0019..bb596ec 100644 --- a/YJMPD-UWP/Model/ApiHandler.cs +++ b/YJMPD-UWP/Model/ApiHandler.cs @@ -48,18 +48,17 @@ namespace YJMPD_UWP.Model case Command.Picture: if (o["selected"].ToObject() == true) { - Debug.WriteLine("Selected player taking picture"); App.Game.SetSelected(true); App.Navigate(typeof(PhotoView)); } else - App.Navigate(typeof(WaitingView)); + App.Navigate(typeof(WaitingView), "Waiting on photo..."); App.Game.MoveToWaiting(); break; case Command.PictureUrl: if (!App.Game.Selected) - App.Photo.UpdatePhotoTaken(o[Command.PictureUrl.ToString()].ToString()); + App.Photo.SetPhoto(o[Command.PictureUrl.ToString()].ToString()); App.Game.MoveToStarted(); break; @@ -118,12 +117,14 @@ namespace YJMPD_UWP.Model return true; } - public async Task SendPicture(string url) + public async Task SendPhoto(string url) { JObject obj = JObject.FromObject(new { command = Command.PictureUrl.ToString(), - pictureurl = url + pictureurl = url, + lon = App.Geo.Position.Coordinate.Point.Position.Longitude, + lat = App.Geo.Position.Coordinate.Point.Position.Latitude }); await App.Network.Write(obj.ToString(Formatting.None)); diff --git a/YJMPD-UWP/Model/GameHandler.cs b/YJMPD-UWP/Model/GameHandler.cs index 517c634..e5e0dbc 100644 --- a/YJMPD-UWP/Model/GameHandler.cs +++ b/YJMPD-UWP/Model/GameHandler.cs @@ -53,12 +53,21 @@ namespace YJMPD_UWP.Model { Players = new List(); Status = GameStatus.STOPPED; - App.Photo.OnPhotoTaken += Photo_OnPhotoTaken; + App.Photo.OnStatusUpdate += Photo_OnStatusUpdate; } - private void Photo_OnPhotoTaken(object sender, PhotoTakenEventArgs e) + private void Photo_OnStatusUpdate(object sender, PhotoStatusUpdatedEventArgs e) { - App.Api.SendPicture(e.Photo); + switch(e.Status) + { + case PhotoHandler.PhotoStatus.UPLOADING: + App.Navigate(typeof(WaitingView), "Uploading..."); + break; + case PhotoHandler.PhotoStatus.DONE: + if(Selected) + App.Api.SendPhoto(App.Photo.Photo); + break; + } } public void AddPlayer(string username) diff --git a/YJMPD-UWP/Model/NetworkHandler.cs b/YJMPD-UWP/Model/NetworkHandler.cs index 7ad9bd9..b4fba04 100644 --- a/YJMPD-UWP/Model/NetworkHandler.cs +++ b/YJMPD-UWP/Model/NetworkHandler.cs @@ -18,8 +18,8 @@ namespace YJMPD_UWP.Model { public class NetworkHandler { - public delegate void OnStatusUpdatedHandler(object sender, NetworkStatusUpdatedEventArgs e); - public event OnStatusUpdatedHandler OnStatusUpdate; + public delegate void OnStatusUpdateHandler(object sender, NetworkStatusUpdatedEventArgs e); + public event OnStatusUpdateHandler OnStatusUpdate; public enum NetworkStatus { DISCONNECTED, CONNECTING, CONNECTED } public NetworkStatus Status { get; private set; } diff --git a/YJMPD-UWP/Model/PhotoHandler.cs b/YJMPD-UWP/Model/PhotoHandler.cs index 50c86d0..90083e4 100644 --- a/YJMPD-UWP/Model/PhotoHandler.cs +++ b/YJMPD-UWP/Model/PhotoHandler.cs @@ -16,32 +16,43 @@ namespace YJMPD_UWP.Model { public class PhotoHandler { - public delegate void OnPhotoTakenHandler(object sender, PhotoTakenEventArgs e); - public event OnPhotoTakenHandler OnPhotoTaken; + public delegate void OnStatusUpdateHandler(object sender, PhotoStatusUpdatedEventArgs e); + public event OnStatusUpdateHandler OnStatusUpdate; + public enum PhotoStatus { NOPHOTO, TAKING, UPLOADING, DONE} + public PhotoStatus Status; public string Photo { get; private set; } public PhotoHandler() { - + Status = PhotoStatus.NOPHOTO; } public void Reset() { Photo = null; + Status = PhotoStatus.NOPHOTO; } - public void UpdatePhotoTaken(string photo) + public void SetPhoto(string photo) { Photo = photo; + UpdateStatus(PhotoStatus.DONE); + } - if (OnPhotoTaken == null) return; + private void UpdateStatus(PhotoStatus status) + { + Status = status; - OnPhotoTaken(this, new PhotoTakenEventArgs(photo)); + if (OnStatusUpdate == null) return; + + OnStatusUpdate(this, new PhotoStatusUpdatedEventArgs(status)); } public async void Take() { + UpdateStatus(PhotoStatus.TAKING); + CameraCaptureUI captureUI = new CameraCaptureUI(); captureUI.PhotoSettings.Format = CameraCaptureUIPhotoFormat.Png; captureUI.PhotoSettings.AllowCropping = false; @@ -51,6 +62,7 @@ namespace YJMPD_UWP.Model if (photo == null) { + UpdateStatus(PhotoStatus.NOPHOTO); return; } @@ -65,9 +77,13 @@ namespace YJMPD_UWP.Model SoftwareBitmapSource bitmapSource = new SoftwareBitmapSource(); await bitmapSource.SetBitmapAsync(softwareBitmapBGR8); + UpdateStatus(PhotoStatus.UPLOADING); + string photoURL = await UploadImage(stream.AsStream()); - UpdatePhotoTaken(photoURL); + Photo = photoURL; + + UpdateStatus(PhotoStatus.DONE); } public async Task UploadImage(Stream file) diff --git a/YJMPD-UWP/ViewModels/GameVM.cs b/YJMPD-UWP/ViewModels/GameVM.cs index 8e7fbf4..73064a7 100644 --- a/YJMPD-UWP/ViewModels/GameVM.cs +++ b/YJMPD-UWP/ViewModels/GameVM.cs @@ -1,4 +1,7 @@ -namespace YJMPD_UWP.ViewModels +using Windows.UI.Xaml.Media; +using Windows.UI.Xaml.Media.Imaging; + +namespace YJMPD_UWP.ViewModels { public class GameVM : TemplateVM { @@ -6,5 +9,13 @@ { } + + public ImageSource Photo + { + get + { + return new BitmapImage(new System.Uri(App.Photo.Photo)); + } + } } } diff --git a/YJMPD-UWP/ViewModels/PhotoVM.cs b/YJMPD-UWP/ViewModels/PhotoVM.cs index 149a91a..be8816b 100644 --- a/YJMPD-UWP/ViewModels/PhotoVM.cs +++ b/YJMPD-UWP/ViewModels/PhotoVM.cs @@ -8,22 +8,17 @@ namespace YJMPD_UWP.ViewModels { public class PhotoVM : TemplateVM { - private string photo; DispatcherTimer timer; int secondsleft = 60; public PhotoVM() : base("Photo") { - App.Photo.OnPhotoTaken += Photo_OnPhotoTaken; - photo = App.Photo.Photo; timer = new DispatcherTimer(); timer.Interval = TimeSpan.FromSeconds(1); timer.Tick += Timer_Tick; - - if (ControlsVisible) - timer.Start(); + timer.Start(); } private void Timer_Tick(object sender, object e) @@ -37,36 +32,6 @@ namespace YJMPD_UWP.ViewModels } } - private void Photo_OnPhotoTaken(object sender, Helpers.EventArgs.PhotoTakenEventArgs e) - { - dispatcher.RunAsync(Windows.UI.Core.CoreDispatcherPriority.Normal, () => - { - timer.Stop(); - secondsleft = 60; - - photo = e.Photo; - NotifyPropertyChanged(nameof(Photo)); - NotifyPropertyChanged(nameof(PhotoVisible)); - NotifyPropertyChanged(nameof(ControlsVisible)); - }); - } - - public bool PhotoVisible - { - get - { - return photo != null; - } - } - - public bool ControlsVisible - { - get - { - return !PhotoVisible; - } - } - public string TimeOut { get @@ -74,16 +39,5 @@ namespace YJMPD_UWP.ViewModels return "Take a photo within " + secondsleft + " seconds"; } } - - public ImageSource Photo - { - get - { - if (photo == null || photo == "") - return new BitmapImage(new Uri("ms-appx:///Assets/Error.png")); - - return new BitmapImage(new Uri(photo)); - } - } } } diff --git a/YJMPD-UWP/Views/GameView.xaml b/YJMPD-UWP/Views/GameView.xaml index ae8a5ac..fe66f90 100644 --- a/YJMPD-UWP/Views/GameView.xaml +++ b/YJMPD-UWP/Views/GameView.xaml @@ -7,9 +7,9 @@ xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" mc:Ignorable="d"> - - - - - + + + + + diff --git a/YJMPD-UWP/Views/PhotoView.xaml b/YJMPD-UWP/Views/PhotoView.xaml index 4a5fe53..5ad679e 100644 --- a/YJMPD-UWP/Views/PhotoView.xaml +++ b/YJMPD-UWP/Views/PhotoView.xaml @@ -8,17 +8,8 @@ xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" mc:Ignorable="d"> - - - - - - - - - - -