diff --git a/BookAStar/BookAStar.Droid/BookAStar.Droid.csproj b/BookAStar/BookAStar.Droid/BookAStar.Droid.csproj index d2f740a2..008e1262 100644 --- a/BookAStar/BookAStar.Droid/BookAStar.Droid.csproj +++ b/BookAStar/BookAStar.Droid/BookAStar.Droid.csproj @@ -484,6 +484,12 @@ + + + + + + diff --git a/BookAStar/BookAStar.Droid/Helpers/SimpleJsonPostMethod.cs b/BookAStar/BookAStar.Droid/Helpers/SimpleJsonPostMethod.cs index dd826232..afc40072 100644 --- a/BookAStar/BookAStar.Droid/Helpers/SimpleJsonPostMethod.cs +++ b/BookAStar/BookAStar.Droid/Helpers/SimpleJsonPostMethod.cs @@ -84,7 +84,6 @@ namespace Yavsc.Helpers public async Task InvokeJson(object query) { - JsonValue jsonDoc=null; using (Stream streamQuery = request.GetRequestStream()) { using (StreamWriter writer = new StreamWriter(streamQuery)) { diff --git a/BookAStar/BookAStar.Droid/Properties/AndroidManifest.xml b/BookAStar/BookAStar.Droid/Properties/AndroidManifest.xml index 1e31870f..ea30fc44 100644 --- a/BookAStar/BookAStar.Droid/Properties/AndroidManifest.xml +++ b/BookAStar/BookAStar.Droid/Properties/AndroidManifest.xml @@ -21,7 +21,7 @@ - + diff --git a/BookAStar/BookAStar.Droid/Resources/Resource.Designer.cs b/BookAStar/BookAStar.Droid/Resources/Resource.Designer.cs index 0e9e68a0..7be6d2f1 100644 --- a/BookAStar/BookAStar.Droid/Resources/Resource.Designer.cs +++ b/BookAStar/BookAStar.Droid/Resources/Resource.Designer.cs @@ -4160,310 +4160,316 @@ namespace BookAStar.Droid public const int design_snackbar_background = 2130837625; // aapt resource value: 0x7f02007a - public const int glyphish_07_map_marker = 2130837626; + public const int exclam = 2130837626; // aapt resource value: 0x7f02007b - public const int glyphish_103_map = 2130837627; + public const int glyphish_07_map_marker = 2130837627; // aapt resource value: 0x7f02007c - public const int glyphish_13_target = 2130837628; + public const int glyphish_103_map = 2130837628; // aapt resource value: 0x7f02007d - public const int glyphish_74_location = 2130837629; + public const int glyphish_13_target = 2130837629; // aapt resource value: 0x7f02007e - public const int gmf_icon = 2130837630; + public const int glyphish_74_location = 2130837630; // aapt resource value: 0x7f02007f - public const int ic_action_full_screen = 2130837631; + public const int gmf_icon = 2130837631; // aapt resource value: 0x7f020080 - public const int ic_action_overflow = 2130837632; + public const int ic_action_full_screen = 2130837632; // aapt resource value: 0x7f020081 - public const int ic_action_pause = 2130837633; + public const int ic_action_overflow = 2130837633; // aapt resource value: 0x7f020082 - public const int ic_action_pause_large = 2130837634; + public const int ic_action_pause = 2130837634; // aapt resource value: 0x7f020083 - public const int ic_action_play = 2130837635; + public const int ic_action_pause_large = 2130837635; // aapt resource value: 0x7f020084 - public const int ic_action_play_large = 2130837636; + public const int ic_action_play = 2130837636; // aapt resource value: 0x7f020085 - public const int ic_action_return_from_full_screen = 2130837637; + public const int ic_action_play_large = 2130837637; // aapt resource value: 0x7f020086 - public const int ic_audiotrack = 2130837638; + public const int ic_action_return_from_full_screen = 2130837638; // aapt resource value: 0x7f020087 - public const int ic_audiotrack_light = 2130837639; + public const int ic_audiotrack = 2130837639; // aapt resource value: 0x7f020088 - public const int ic_bluetooth_grey = 2130837640; + public const int ic_audiotrack_light = 2130837640; // aapt resource value: 0x7f020089 - public const int ic_bluetooth_white = 2130837641; + public const int ic_bluetooth_grey = 2130837641; // aapt resource value: 0x7f02008a - public const int ic_cast_dark = 2130837642; + public const int ic_bluetooth_white = 2130837642; // aapt resource value: 0x7f02008b - public const int ic_cast_disabled_light = 2130837643; + public const int ic_cast_dark = 2130837643; // aapt resource value: 0x7f02008c - public const int ic_cast_grey = 2130837644; + public const int ic_cast_disabled_light = 2130837644; // aapt resource value: 0x7f02008d - public const int ic_cast_light = 2130837645; + public const int ic_cast_grey = 2130837645; // aapt resource value: 0x7f02008e - public const int ic_cast_off_light = 2130837646; + public const int ic_cast_light = 2130837646; // aapt resource value: 0x7f02008f - public const int ic_cast_on_0_light = 2130837647; + public const int ic_cast_off_light = 2130837647; // aapt resource value: 0x7f020090 - public const int ic_cast_on_1_light = 2130837648; + public const int ic_cast_on_0_light = 2130837648; // aapt resource value: 0x7f020091 - public const int ic_cast_on_2_light = 2130837649; + public const int ic_cast_on_1_light = 2130837649; // aapt resource value: 0x7f020092 - public const int ic_cast_on_light = 2130837650; + public const int ic_cast_on_2_light = 2130837650; // aapt resource value: 0x7f020093 - public const int ic_cast_white = 2130837651; + public const int ic_cast_on_light = 2130837651; // aapt resource value: 0x7f020094 - public const int ic_close_dark = 2130837652; + public const int ic_cast_white = 2130837652; // aapt resource value: 0x7f020095 - public const int ic_close_light = 2130837653; + public const int ic_close_dark = 2130837653; // aapt resource value: 0x7f020096 - public const int ic_collapse = 2130837654; + public const int ic_close_light = 2130837654; // aapt resource value: 0x7f020097 - public const int ic_collapse_00000 = 2130837655; + public const int ic_collapse = 2130837655; // aapt resource value: 0x7f020098 - public const int ic_collapse_00001 = 2130837656; + public const int ic_collapse_00000 = 2130837656; // aapt resource value: 0x7f020099 - public const int ic_collapse_00002 = 2130837657; + public const int ic_collapse_00001 = 2130837657; // aapt resource value: 0x7f02009a - public const int ic_collapse_00003 = 2130837658; + public const int ic_collapse_00002 = 2130837658; // aapt resource value: 0x7f02009b - public const int ic_collapse_00004 = 2130837659; + public const int ic_collapse_00003 = 2130837659; // aapt resource value: 0x7f02009c - public const int ic_collapse_00005 = 2130837660; + public const int ic_collapse_00004 = 2130837660; // aapt resource value: 0x7f02009d - public const int ic_collapse_00006 = 2130837661; + public const int ic_collapse_00005 = 2130837661; // aapt resource value: 0x7f02009e - public const int ic_collapse_00007 = 2130837662; + public const int ic_collapse_00006 = 2130837662; // aapt resource value: 0x7f02009f - public const int ic_collapse_00008 = 2130837663; + public const int ic_collapse_00007 = 2130837663; // aapt resource value: 0x7f0200a0 - public const int ic_collapse_00009 = 2130837664; + public const int ic_collapse_00008 = 2130837664; // aapt resource value: 0x7f0200a1 - public const int ic_collapse_00010 = 2130837665; + public const int ic_collapse_00009 = 2130837665; // aapt resource value: 0x7f0200a2 - public const int ic_collapse_00011 = 2130837666; + public const int ic_collapse_00010 = 2130837666; // aapt resource value: 0x7f0200a3 - public const int ic_collapse_00012 = 2130837667; + public const int ic_collapse_00011 = 2130837667; // aapt resource value: 0x7f0200a4 - public const int ic_collapse_00013 = 2130837668; + public const int ic_collapse_00012 = 2130837668; // aapt resource value: 0x7f0200a5 - public const int ic_collapse_00014 = 2130837669; + public const int ic_collapse_00013 = 2130837669; // aapt resource value: 0x7f0200a6 - public const int ic_collapse_00015 = 2130837670; + public const int ic_collapse_00014 = 2130837670; // aapt resource value: 0x7f0200a7 - public const int ic_corp_icon = 2130837671; + public const int ic_collapse_00015 = 2130837671; // aapt resource value: 0x7f0200a8 - public const int ic_expand = 2130837672; + public const int ic_corp_icon = 2130837672; // aapt resource value: 0x7f0200a9 - public const int ic_expand_00000 = 2130837673; + public const int ic_expand = 2130837673; // aapt resource value: 0x7f0200aa - public const int ic_expand_00001 = 2130837674; + public const int ic_expand_00000 = 2130837674; // aapt resource value: 0x7f0200ab - public const int ic_expand_00002 = 2130837675; + public const int ic_expand_00001 = 2130837675; // aapt resource value: 0x7f0200ac - public const int ic_expand_00003 = 2130837676; + public const int ic_expand_00002 = 2130837676; // aapt resource value: 0x7f0200ad - public const int ic_expand_00004 = 2130837677; + public const int ic_expand_00003 = 2130837677; // aapt resource value: 0x7f0200ae - public const int ic_expand_00005 = 2130837678; + public const int ic_expand_00004 = 2130837678; // aapt resource value: 0x7f0200af - public const int ic_expand_00006 = 2130837679; + public const int ic_expand_00005 = 2130837679; // aapt resource value: 0x7f0200b0 - public const int ic_expand_00007 = 2130837680; + public const int ic_expand_00006 = 2130837680; // aapt resource value: 0x7f0200b1 - public const int ic_expand_00008 = 2130837681; + public const int ic_expand_00007 = 2130837681; // aapt resource value: 0x7f0200b2 - public const int ic_expand_00009 = 2130837682; + public const int ic_expand_00008 = 2130837682; // aapt resource value: 0x7f0200b3 - public const int ic_expand_00010 = 2130837683; + public const int ic_expand_00009 = 2130837683; // aapt resource value: 0x7f0200b4 - public const int ic_expand_00011 = 2130837684; + public const int ic_expand_00010 = 2130837684; // aapt resource value: 0x7f0200b5 - public const int ic_expand_00012 = 2130837685; + public const int ic_expand_00011 = 2130837685; // aapt resource value: 0x7f0200b6 - public const int ic_expand_00013 = 2130837686; + public const int ic_expand_00012 = 2130837686; // aapt resource value: 0x7f0200b7 - public const int ic_expand_00014 = 2130837687; + public const int ic_expand_00013 = 2130837687; // aapt resource value: 0x7f0200b8 - public const int ic_expand_00015 = 2130837688; + public const int ic_expand_00014 = 2130837688; // aapt resource value: 0x7f0200b9 - public const int ic_launcher = 2130837689; + public const int ic_expand_00015 = 2130837689; // aapt resource value: 0x7f0200ba - public const int ic_media_pause = 2130837690; + public const int ic_launcher = 2130837690; // aapt resource value: 0x7f0200bb - public const int ic_media_play = 2130837691; + public const int ic_media_pause = 2130837691; // aapt resource value: 0x7f0200bc - public const int ic_media_route_disabled_mono_dark = 2130837692; + public const int ic_media_play = 2130837692; // aapt resource value: 0x7f0200bd - public const int ic_media_route_off_mono_dark = 2130837693; + public const int ic_media_route_disabled_mono_dark = 2130837693; // aapt resource value: 0x7f0200be - public const int ic_media_route_on_0_mono_dark = 2130837694; + public const int ic_media_route_off_mono_dark = 2130837694; // aapt resource value: 0x7f0200bf - public const int ic_media_route_on_1_mono_dark = 2130837695; + public const int ic_media_route_on_0_mono_dark = 2130837695; // aapt resource value: 0x7f0200c0 - public const int ic_media_route_on_2_mono_dark = 2130837696; + public const int ic_media_route_on_1_mono_dark = 2130837696; // aapt resource value: 0x7f0200c1 - public const int ic_media_route_on_mono_dark = 2130837697; + public const int ic_media_route_on_2_mono_dark = 2130837697; // aapt resource value: 0x7f0200c2 - public const int ic_pause_dark = 2130837698; + public const int ic_media_route_on_mono_dark = 2130837698; // aapt resource value: 0x7f0200c3 - public const int ic_pause_light = 2130837699; + public const int ic_pause_dark = 2130837699; // aapt resource value: 0x7f0200c4 - public const int ic_play_dark = 2130837700; + public const int ic_pause_light = 2130837700; // aapt resource value: 0x7f0200c5 - public const int ic_play_light = 2130837701; + public const int ic_play_dark = 2130837701; // aapt resource value: 0x7f0200c6 - public const int ic_speaker_dark = 2130837702; + public const int ic_play_light = 2130837702; // aapt resource value: 0x7f0200c7 - public const int ic_speaker_group_dark = 2130837703; + public const int ic_speaker_dark = 2130837703; // aapt resource value: 0x7f0200c8 - public const int ic_speaker_group_light = 2130837704; + public const int ic_speaker_group_dark = 2130837704; // aapt resource value: 0x7f0200c9 - public const int ic_speaker_light = 2130837705; + public const int ic_speaker_group_light = 2130837705; // aapt resource value: 0x7f0200ca - public const int ic_tv_dark = 2130837706; + public const int ic_speaker_light = 2130837706; // aapt resource value: 0x7f0200cb - public const int ic_tv_light = 2130837707; + public const int ic_tv_dark = 2130837707; // aapt resource value: 0x7f0200cc - public const int icon = 2130837708; + public const int ic_tv_light = 2130837708; // aapt resource value: 0x7f0200cd - public const int icon_anon = 2130837709; + public const int icon = 2130837709; // aapt resource value: 0x7f0200ce - public const int mr_dialog_material_background_dark = 2130837710; + public const int icon_anon = 2130837710; // aapt resource value: 0x7f0200cf - public const int mr_dialog_material_background_light = 2130837711; + public const int mr_dialog_material_background_dark = 2130837711; // aapt resource value: 0x7f0200d0 - public const int mr_ic_audiotrack_light = 2130837712; + public const int mr_dialog_material_background_light = 2130837712; // aapt resource value: 0x7f0200d1 - public const int mr_ic_cast_dark = 2130837713; + public const int mr_ic_audiotrack_light = 2130837713; // aapt resource value: 0x7f0200d2 - public const int mr_ic_cast_light = 2130837714; + public const int mr_ic_cast_dark = 2130837714; // aapt resource value: 0x7f0200d3 - public const int mr_ic_close_dark = 2130837715; + public const int mr_ic_cast_light = 2130837715; // aapt resource value: 0x7f0200d4 - public const int mr_ic_close_light = 2130837716; + public const int mr_ic_close_dark = 2130837716; // aapt resource value: 0x7f0200d5 - public const int mr_ic_media_route_connecting_mono_dark = 2130837717; + public const int mr_ic_close_light = 2130837717; // aapt resource value: 0x7f0200d6 - public const int mr_ic_media_route_connecting_mono_light = 2130837718; + public const int mr_ic_media_route_connecting_mono_dark = 2130837718; // aapt resource value: 0x7f0200d7 - public const int mr_ic_media_route_mono_dark = 2130837719; + public const int mr_ic_media_route_connecting_mono_light = 2130837719; // aapt resource value: 0x7f0200d8 - public const int mr_ic_media_route_mono_light = 2130837720; + public const int mr_ic_media_route_mono_dark = 2130837720; // aapt resource value: 0x7f0200d9 - public const int mr_ic_pause_dark = 2130837721; + public const int mr_ic_media_route_mono_light = 2130837721; // aapt resource value: 0x7f0200da - public const int mr_ic_pause_light = 2130837722; + public const int mr_ic_pause_dark = 2130837722; // aapt resource value: 0x7f0200db - public const int mr_ic_play_dark = 2130837723; + public const int mr_ic_pause_light = 2130837723; // aapt resource value: 0x7f0200dc - public const int mr_ic_play_light = 2130837724; + public const int mr_ic_play_dark = 2130837724; // aapt resource value: 0x7f0200dd - public const int nfqrcode = 2130837725; + public const int mr_ic_play_light = 2130837725; + + // aapt resource value: 0x7f0200de + public const int nfqrcode = 2130837726; + + // aapt resource value: 0x7f0200e1 + public const int notification_template_icon_bg = 2130837729; // aapt resource value: 0x7f0200df - public const int notification_template_icon_bg = 2130837727; + public const int peer_to_peer = 2130837727; - // aapt resource value: 0x7f0200de - public const int visuel_sexion = 2130837726; + // aapt resource value: 0x7f0200e0 + public const int visuel_sexion = 2130837728; static Drawable() { diff --git a/BookAStar/BookAStar.Droid/Resources/drawable/exclam.png b/BookAStar/BookAStar.Droid/Resources/drawable/exclam.png new file mode 100644 index 00000000..0fc3f26a Binary files /dev/null and b/BookAStar/BookAStar.Droid/Resources/drawable/exclam.png differ diff --git a/BookAStar/BookAStar.Droid/Resources/drawable/peer_to_peer.png b/BookAStar/BookAStar.Droid/Resources/drawable/peer_to_peer.png new file mode 100644 index 00000000..b920c64d Binary files /dev/null and b/BookAStar/BookAStar.Droid/Resources/drawable/peer_to_peer.png differ diff --git a/BookAStar/BookAStar.Droid/Services/YavscChooserTargetService.cs b/BookAStar/BookAStar.Droid/Services/YavscChooserTargetService.cs index 36c14393..85fe7e1c 100644 --- a/BookAStar/BookAStar.Droid/Services/YavscChooserTargetService.cs +++ b/BookAStar/BookAStar.Droid/Services/YavscChooserTargetService.cs @@ -32,7 +32,7 @@ namespace BookAStar.Droid Resource.Drawable.icon); ChooserTarget t = new ChooserTarget( new Java.Lang.String( - "BookingStar"), i, + Constants.ApplicationName), i, .5f, new ComponentName(this, "BookAStar.SendFilesActivity"), null); var res = new List(); diff --git a/BookAStar/BookAStar/App.xaml.cs b/BookAStar/BookAStar/App.xaml.cs index cb690f7e..e3e7dec3 100644 --- a/BookAStar/BookAStar/App.xaml.cs +++ b/BookAStar/BookAStar/App.xaml.cs @@ -12,12 +12,16 @@ using XLabs.Enums; namespace BookAStar { + using System.Threading.Tasks; using Data; using Interfaces; using Model; using Model.UI; using Pages; + using Plugin.Connectivity; using ViewModels; + using Microsoft.AspNet.SignalR.Client; + using Model.Social.Messaging; public partial class App : Application // superclass new in 1.3 { @@ -53,6 +57,14 @@ namespace BookAStar app.Rotation += OnRotation; app.Startup += OnStartup; app.Suspended += OnSuspended; + MainSettings.UserChanged += MainSettings_UserChanged; + CrossConnectivity.Current.ConnectivityChanged += (conSender, args) => + { + App.IsConnected = args.IsConnected; + }; + SetupHubConnection(); + if (CrossConnectivity.Current.IsConnected) + StartHubConnection(); } // omg @@ -67,7 +79,7 @@ namespace BookAStar } - // Called Once, at app init + // FIXME Never called. private void OnInitialize(object sender, EventArgs e) { @@ -225,11 +237,90 @@ namespace BookAStar } public static INavigationService NavigationService { protected set; get; } + public static bool isConnected; + public static bool IsConnected { get { return isConnected; } + private set + { + if (isConnected != value) + { + isConnected = value; + if (isConnected) + { + // TODO Start all cloud related stuff + CurrentApp.StartHubConnection(); + } + + } + } + } + private HubConnection chatHubConnection = null; + public HubConnection ChatHubConnection + { + get + { + return chatHubConnection; + } + } + // Start the Hub connection + public async void StartHubConnection () + { + await chatHubConnection.Start(); + } + + public void SetupHubConnection() + { + chatHubConnection = new HubConnection(Constants.SignalRHubsUrl); + chatHubConnection.Error += ChatHubConnection_Error; + + chatHubProxy = chatHubConnection.CreateHubProxy("ChatHub"); + chatHubProxy.On("PV", (n, m) => { + DataManager.Current.PrivateMessages.Add( + new UserMessage + { + Message = m, + SenderId = n, + Date = DateTime.Now + } + ); + }); + } + + private void MainSettings_UserChanged(object sender, EventArgs e) + { + if (MainSettings.CurrentUser != null) + { + if (chatHubConnection.Headers.ContainsKey("Bearer")) + chatHubConnection.Headers.Remove("Bearer"); + chatHubConnection.Headers.Add("Bearer", MainSettings.CurrentUser.YavscTokens.AccessToken); + } + else chatHubConnection.Headers.Remove("Bearer"); + } + + private void ChatHubConnection_Error(Exception obj) + { + // TODO log in debug binaries + } + + private IHubProxy chatHubProxy = null; + public IHubProxy ChatHubProxy + { + get + { + return chatHubProxy; + } + } + public static Task HasSomeCloud { + get + { + return CrossConnectivity.Current.IsReachable(Constants.YavscHomeUrl, Constants.CloudTimeout); + } + } + public void PostDeviceInfo() { - var res = PlatformSpecificInstance.InvokeApi( - "gcm/register", - PlatformSpecificInstance.GetDeviceInfo()); + var info = PlatformSpecificInstance.GetDeviceInfo(); + if (!string.IsNullOrWhiteSpace(info.GCMRegistrationId)) + PlatformSpecificInstance.InvokeApi("gcm/register", info); } public static void ShowBookQuery (BookQueryData query) diff --git a/BookAStar/BookAStar/Behaviors/MaxLengthValidator.cs b/BookAStar/BookAStar/Behaviors/MaxLengthValidator.cs index 07f51476..5c460345 100644 --- a/BookAStar/BookAStar/Behaviors/MaxLengthValidator.cs +++ b/BookAStar/BookAStar/Behaviors/MaxLengthValidator.cs @@ -26,8 +26,8 @@ namespace BookAStar.Behaviors private void bindable_TextChanged(object sender, TextChangedEventArgs e) { - IsValid = e.NewTextValue.Length <= 0 || e.NewTextValue.Length <= MaxLength; - if (!IsValid && e.NewTextValue.Length > MaxLength) + IsValid = e.NewTextValue == null? false : ( e.NewTextValue.Length > 0 && e.NewTextValue.Length <= MaxLength ) ; + if (!IsValid) if (e.NewTextValue!=null) if (e.NewTextValue.Length > MaxLength) ((Editor)sender).Text = e.NewTextValue.Substring(0, MaxLength); } diff --git a/BookAStar/BookAStar/BookAStar.csproj b/BookAStar/BookAStar/BookAStar.csproj index 75f2f26a..9a7cf243 100644 --- a/BookAStar/BookAStar/BookAStar.csproj +++ b/BookAStar/BookAStar/BookAStar.csproj @@ -49,7 +49,10 @@ + + + @@ -97,7 +100,7 @@ EventDetail.xaml - + @@ -166,6 +169,9 @@ RatingView.xaml + + UserListView.xaml + @@ -218,6 +224,12 @@ ..\..\packages\Newtonsoft.Json.9.0.1\lib\portable-net45+wp80+win8+wpa81\Newtonsoft.Json.dll + + ..\..\packages\Xam.Plugin.Connectivity.2.2.12\lib\MonoAndroid10\Plugin.Connectivity.dll + + + ..\..\packages\Xam.Plugin.Connectivity.2.2.12\lib\MonoAndroid10\Plugin.Connectivity.Abstractions.dll + ..\..\packages\Xam.Plugins.Settings.2.5.1.0\lib\portable-net45+wp80+win8+wpa81\Plugin.Settings.dll True @@ -358,6 +370,12 @@ + + + MSBuild:UpdateDesignTimeXaml + Designer + + diff --git a/BookAStar/BookAStar/Constants.cs b/BookAStar/BookAStar/Constants.cs index 922a84d7..70234d49 100644 --- a/BookAStar/BookAStar/Constants.cs +++ b/BookAStar/BookAStar/Constants.cs @@ -19,11 +19,13 @@ namespace BookAStar public static readonly string UserInfoUrl = YavscApiUrl + "/me"; public static readonly string BlogUrl = YavscApiUrl + "/blogs"; public static readonly string FsUrl = YavscApiUrl + "/fs"; - public static readonly string SignalRHubsUrl = YavscHomeUrl + "/signalr/hubs"; + public static readonly string SignalRHubsUrl = YavscHomeUrl + "/api/signalr/hubs"; #endregion #region Permissions ids public static int AllowBeATarget = 1; #endregion + + public static int CloudTimeout = 400; } } diff --git a/BookAStar/BookAStar/Data/DataManager.cs b/BookAStar/BookAStar/Data/DataManager.cs index 1a478437..a6c752ff 100644 --- a/BookAStar/BookAStar/Data/DataManager.cs +++ b/BookAStar/BookAStar/Data/DataManager.cs @@ -5,6 +5,7 @@ using Model.Workflow; using Model.UI; using ViewModels; + using Model.Social.Messaging; public class DataManager { @@ -19,7 +20,7 @@ /// internal LocalEntity EstimationCache { get; set; } internal LocalEntity EstimateLinesTemplates { get; set; } - + internal LocalEntity PrivateMessages { get; set; } protected static DataManager current ; public static DataManager Current @@ -34,18 +35,16 @@ public DataManager() { - BookQueries = new RemoteEntityRO("bookquery", - q => q.Id); - Estimates = new RemoteEntity("estimate", - x => x.Id); - Blogspot = new RemoteEntity("blog", - x=>x.Id); + BookQueries = new RemoteEntityRO("bookquery", q => q.Id); + Estimates = new RemoteEntity("estimate", x => x.Id); + Blogspot = new RemoteEntity("blog", x=>x.Id); Contacts = new LocalEntity(c => c.UserId); AppState = new LocalEntity(s => s.Position); - EstimationCache = new LocalEntity( - e => e.Query.Id); - EstimateLinesTemplates = new LocalEntity( - l => l.Description); + EstimationCache = new LocalEntity(e => e.Query.Id); + EstimateLinesTemplates = new LocalEntity(l => l.Description); + PrivateMessages = new LocalEntity(m=> m.GetHashCode()); + + PrivateMessages.Load(); BookQueries.Load(); Estimates.Load(); Blogspot.Load(); diff --git a/BookAStar/BookAStar/Data/LocaLEntity.cs b/BookAStar/BookAStar/Data/LocaLEntity.cs index 05ee3d58..56d800ce 100644 --- a/BookAStar/BookAStar/Data/LocaLEntity.cs +++ b/BookAStar/BookAStar/Data/LocaLEntity.cs @@ -14,7 +14,9 @@ namespace BookAStar.Data public LocalEntity(Func getKey) : base() { - if (getKey == null) throw new InvalidOperationException(); + if (getKey == null) + // choose please, because of the genesis + throw new InvalidOperationException ("A key must be defined"); GetKey = getKey; IList l = this; } diff --git a/BookAStar/BookAStar/Data/RemoteEntity.cs b/BookAStar/BookAStar/Data/RemoteEntity.cs index f07844cb..3a8119ed 100644 --- a/BookAStar/BookAStar/Data/RemoteEntity.cs +++ b/BookAStar/BookAStar/Data/RemoteEntity.cs @@ -9,6 +9,7 @@ using System.Net; namespace BookAStar.Data { using Helpers; + using System.Diagnostics; using System.Text; public class RemoteEntity : LocalEntity, ICommand where K : IEquatable @@ -79,7 +80,7 @@ namespace BookAStar.Data private void AfterExecuting() { IsExecuting = false; - if (CanExecuteChanged!=null) + if (CanExecuteChanged != null) CanExecuteChanged.Invoke(this, new EventArgs()); } @@ -134,19 +135,24 @@ namespace BookAStar.Data { if (!response.IsSuccessStatusCode) { - var errcontent = await response.Content.ReadAsStringAsync(); // TODO throw custom exception, and catch to inform user - throw new Exception($"Create failed posting {stringContent} @ {controllerUri.AbsoluteUri}"); + var errcontent = await response.Content.ReadAsStringAsync(); + Debug.WriteLine($"Create failed posting {stringContent} @ {controllerUri.AbsoluteUri}"); + } + else + { + var recontent = await response.Content.ReadAsStringAsync(); + JsonSerializerSettings sett = new JsonSerializerSettings(); + JsonConvert.PopulateObject(recontent, item); } - var recontent = await response.Content.ReadAsStringAsync(); - JsonConvert.PopulateObject(recontent, item); } + } CurrentItem = item; AfterExecuting(); } - public async void Update (V item) + public async void Update(V item) { BeforeExecute(); @@ -154,13 +160,27 @@ namespace BookAStar.Data using (HttpClient client = UserHelpers.CreateClient()) { HttpContent content = new StringContent( - JsonConvert.SerializeObject(item) + JsonConvert.SerializeObject(item), Encoding.UTF8, "application/json" ); using (var response = await client.PutAsync(uri, content)) { if (!response.IsSuccessStatusCode) - // TODO throw custom exception, and catch to inform user - throw new Exception($"Update failed puting {item} @ {uri.AbsolutePath}"); + {// TODO throw custom exception, and catch to inform user + if (response.StatusCode == HttpStatusCode.BadRequest) + { + var recontent = await response.Content.ReadAsStringAsync(); + } + + else Debug.WriteLine($"Update failed ({item} @ {uri.AbsolutePath} )"); + + } + else + { + // TODO implement an handler of string content (json) + // in most of cases, nothing to do + var recontent = await response.Content.ReadAsStringAsync(); + JsonConvert.PopulateObject(recontent, item); + } } } diff --git a/BookAStar/BookAStar/Images/Notifications/exclam.png b/BookAStar/BookAStar/Images/Notifications/exclam.png new file mode 100644 index 00000000..0fc3f26a Binary files /dev/null and b/BookAStar/BookAStar/Images/Notifications/exclam.png differ diff --git a/BookAStar/BookAStar/Images/Notifications/exclam_inv.png b/BookAStar/BookAStar/Images/Notifications/exclam_inv.png new file mode 100644 index 00000000..0dac252a Binary files /dev/null and b/BookAStar/BookAStar/Images/Notifications/exclam_inv.png differ diff --git a/BookAStar/BookAStar/Model/ClientProviderInfo.cs b/BookAStar/BookAStar/Model/ClientProviderInfo.cs index 21991bfa..07a04dc0 100644 --- a/BookAStar/BookAStar/Model/ClientProviderInfo.cs +++ b/BookAStar/BookAStar/Model/ClientProviderInfo.cs @@ -25,5 +25,9 @@ namespace BookAStar.Model return UserHelpers.Avatar(Avatar); } } + public override string ToString() + { + return UserName; + } } } diff --git a/BookAStar/BookAStar/Model/Social/Messaging/ChatStatus.cs b/BookAStar/BookAStar/Model/Social/Messaging/ChatStatus.cs new file mode 100644 index 00000000..0f8dcaba --- /dev/null +++ b/BookAStar/BookAStar/Model/Social/Messaging/ChatStatus.cs @@ -0,0 +1,10 @@ +namespace BookAStar.Model.Workflow.Messaging +{ + public enum ChatStatus + { + OnLine, + Away, + OffLine + } +} + diff --git a/BookAStar/BookAStar/Model/Social/Messaging/PrivateMessage.cs b/BookAStar/BookAStar/Model/Social/Messaging/PrivateMessage.cs new file mode 100644 index 00000000..8133a1f4 --- /dev/null +++ b/BookAStar/BookAStar/Model/Social/Messaging/PrivateMessage.cs @@ -0,0 +1,15 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace BookAStar.Model.Social.Messaging +{ + public class UserMessage + { + public DateTime Date { get; set; } + public string SenderId { get; set; } + public string Message { get; set; } + } +} diff --git a/BookAStar/BookAStar/Model/Workflow/BillingLine.cs b/BookAStar/BookAStar/Model/Workflow/BillingLine.cs index ee47feed..21335a65 100644 --- a/BookAStar/BookAStar/Model/Workflow/BillingLine.cs +++ b/BookAStar/BookAStar/Model/Workflow/BillingLine.cs @@ -6,6 +6,7 @@ namespace BookAStar.Model.Workflow { public class BillingLine : IBillingLine { + public long Id { get; set; } public string Description { get; set; } public TimeSpan Duration { get; set; } public int Count { get; set; } = 1; diff --git a/BookAStar/BookAStar/Pages/BookQueryPage.xaml b/BookAStar/BookAStar/Pages/BookQueryPage.xaml index d8c19a23..11b3d615 100644 --- a/BookAStar/BookAStar/Pages/BookQueryPage.xaml +++ b/BookAStar/BookAStar/Pages/BookQueryPage.xaml @@ -26,9 +26,8 @@