From afb274713400ff08ceb0268187b96a7eebffc2e8 Mon Sep 17 00:00:00 2001 From: Paul Schneider Date: Tue, 25 Oct 2016 23:20:26 +0200 Subject: [PATCH] prepares a private chat --- .../Resources/drawable/exclam.png | Bin 0 -> 3006 bytes .../drawable/nicubunu-Peer-to-peer.png | Bin 0 -> 7015 bytes BookAStar/BookAStar/App.xaml.cs | 46 +++++++++- BookAStar/BookAStar/BookAStar.csproj | 11 ++- BookAStar/BookAStar/Constants.cs | 4 +- BookAStar/BookAStar/Data/DataManager.cs | 21 +++-- BookAStar/BookAStar/Data/LocaLEntity.cs | 4 +- .../BookAStar/Images/Notifications/exclam.png | Bin 0 -> 3006 bytes .../Images/Notifications/exclam_inv.png | Bin 0 -> 2771 bytes .../Model/Social/Messaging/ChatStatus.cs | 10 +++ .../BookAStar/Model/Social/PrivateMessage.cs | 15 ++++ BookAStar/BookAStar/Pages/ChatPage.xaml | 13 ++- BookAStar/BookAStar/Pages/ChatPage.xaml.cs | 4 +- BookAStar/BookAStar/Settings/ChatSettings.cs | 80 ++++++++++++++++++ .../{Helpers => Settings}/MainSettings.cs | 0 15 files changed, 189 insertions(+), 19 deletions(-) create mode 100644 BookAStar/BookAStar.Droid/Resources/drawable/exclam.png create mode 100644 BookAStar/BookAStar.Droid/Resources/drawable/nicubunu-Peer-to-peer.png create mode 100644 BookAStar/BookAStar/Images/Notifications/exclam.png create mode 100644 BookAStar/BookAStar/Images/Notifications/exclam_inv.png create mode 100644 BookAStar/BookAStar/Model/Social/Messaging/ChatStatus.cs create mode 100644 BookAStar/BookAStar/Model/Social/PrivateMessage.cs create mode 100644 BookAStar/BookAStar/Settings/ChatSettings.cs rename BookAStar/BookAStar/{Helpers => Settings}/MainSettings.cs (100%) diff --git a/BookAStar/BookAStar.Droid/Resources/drawable/exclam.png b/BookAStar/BookAStar.Droid/Resources/drawable/exclam.png new file mode 100644 index 0000000000000000000000000000000000000000..0fc3f26a602227f83c5ae9691c5059b4b8180435 GIT binary patch literal 3006 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 AdjJ3c literal 0 HcmV?d00001 diff --git a/BookAStar/BookAStar.Droid/Resources/drawable/nicubunu-Peer-to-peer.png b/BookAStar/BookAStar.Droid/Resources/drawable/nicubunu-Peer-to-peer.png new file mode 100644 index 0000000000000000000000000000000000000000..b920c64d47c2601b26f8a44e12b4997dd11f95d2 GIT binary patch literal 7015 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 + { + App.IsConnected = args.IsConnected; + }; } // called on app startup, not on rotation @@ -225,6 +231,44 @@ 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 + + + } + } + } + } + + // Start the Hub connection + private async void StartHubConnection () + { + chatHubConnection = new HubConnection(Constants.SignalRHubsUrl); + if (MainSettings.CurrentUser != null) + chatHubConnection.Headers.Add("Bearer", MainSettings.CurrentUser.YavscTokens.AccessToken); + chatHubProxy = chatHubConnection.CreateHubProxy("ChatHub"); + chatHubProxy.On("AddMessage", (n, m) => { + Messages.Add(string.Format("{0} says: {1}", n, m)); + }); + await chatHubConnection.Start(); + } + private HubConnection chatHubConnection=null; + private IHubProxy chatHubProxy = null; + public static Task HasSomeCloud { + get + { + return CrossConnectivity.Current.IsReachable(Constants.YavscHomeUrl, Constants.CloudTimeout); + } + } + public void PostDeviceInfo() { var res = PlatformSpecificInstance.InvokeApi( diff --git a/BookAStar/BookAStar/BookAStar.csproj b/BookAStar/BookAStar/BookAStar.csproj index 75f2f26a..588e1398 100644 --- a/BookAStar/BookAStar/BookAStar.csproj +++ b/BookAStar/BookAStar/BookAStar.csproj @@ -49,7 +49,10 @@ + + + @@ -97,7 +100,7 @@ EventDetail.xaml - + @@ -218,6 +221,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 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..4c67559e 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; 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/Images/Notifications/exclam.png b/BookAStar/BookAStar/Images/Notifications/exclam.png new file mode 100644 index 0000000000000000000000000000000000000000..0fc3f26a602227f83c5ae9691c5059b4b8180435 GIT binary patch literal 3006 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 AdjJ3c literal 0 HcmV?d00001 diff --git a/BookAStar/BookAStar/Images/Notifications/exclam_inv.png b/BookAStar/BookAStar/Images/Notifications/exclam_inv.png new file mode 100644 index 0000000000000000000000000000000000000000..0dac252a663bd7f8b7a61828c89c27199eeb1c84 GIT binary patch literal 2771 zcmV;^3M}=BP)ARi0M?%N;dyuQy~mi@Txz59Ng z-^`u&&fdHCeV%j9`+S_|Jm)DOSqudx0%M$4DNq7<-TW;dXaM#CJAiF^-3;tWiognD zUj9+Q6rcjQ0=T$??=}GY_2mQaWqdwJ<#C?AN;;6wPGFP1UQpvO1IPnKz?Hx(pb99< z_`D8yBjbs!RpmElajz2KqZutq889N_yKezCz&hYL-~>jGG6`6&Pp$8~b^$*I=Cz}g zTrwP(3oKIubIWuHSgEa2fvGNg1_O8Nlk5t3Gf)kTk5E}h1NUf`(CU=67WkTWDMlB$ z0C*U9-w|XzaK8#V>XZTZ0lS^@9|KnCn8i2^rNB?Lul9i!;7MR6P#DAdc)(O(4RF$_ z(-UgshBNwJ0vvIkmPde#5>&?vb-Zv`>(~S=1%{+q@rA(cK%?_?tj_abt~Xk_6;3O6 zP{%XHX;c0L9n1xNK|Qc~LFs zTxWj&0Jap`(^NbDf?J|ixNFopec)cxRnE9wXHzZuz(sd8H2$4eJAcLINm_{Nf=& zsDXR^%zWN_ncnzq;C$0XuQ8Y~D0Nl7ZaRlBa%ZCHpw}5o=y;o->zkDlM)2HhvX2bc z6NaSc%Cj8Iv}n#Sx1&~ z#6fhlr@MmRIP-lY+I&xSwUHk3&CJjrd>7l|6bH^mHp%+H4LvdN+oC^qtI0Mt%vGJe zi8$@D<_r2m+px9$xDj}2@67fG`a4a@9Fu44_&8xaW>!&IUnJa)Z3{i| z`ev9MW6NaK;Xb+_FNw1G$*{+g6E0RbH;Pah*c>t1|r-fuEYDgRBAc4Eb=_D)3=Lo~RjAZd! z)$PKLzVwuS=_Zp`;o{*qN=Lu zHsANZ-@#X|si~>ikYEEi2K)h-jcn#wojD7*Rnz?mOf;>P6TAz|Yu1AULsk>P(#HmTtss`K$4at;nQ`cD;suE%(UNeEvzxuk|b z*CRb-+ZV`Qek)>2n*pSUX2kQ`$29;80Z(5m zQ0$o;(v9al`F%_rsiH5?>^XhEZ39aW#rp6!xdvb@K)RlOfa4yLavb0+lS^s{bbZ(( zbPEnOxuk|b*ZVvq-#l2>?=%tUdav68m;t2E0QPxEtT@1MlS^s{bY1Tu8wDT?4KtF@ z2VsC7VSLzVlS?`cpbps$JRHe0Yb2W@U=*?-R2!@XypHS-7;ExLJQpEe-+!a7U9iKfj);J^TayfIU-yufKOfWNo~un)-%JOsGdWRzG+k)veZ z(Q#j!3?V^gkl7}u#4=l3_}?LW1KSutkUwUY$tkf^X6U+&0c=DmRQ#A9S6 zgP}-jxWmBOjtt-g@GE`)8IxOLxIw%2b%Y^+?HT~UPxX2W7Ac$rJYa#oU)A1+nfw(w zbFLJ)(c~93;>6(Z3SO@GvmWQXC3}ee=Bp+Y{ z@Qdykz)9p3YJf%73dEL0di?=%7DSf~0AK|YG;q1i2x7^#i07})d6>Ip0L{QR^!;L+ z5yWof|80H01UW3C+Xeuz2H1+ElV4zRjSV*<>EL$(D?784j%WeCtna^tZ6AvRgMkP1 z{a5HD^GjC}L_7mLjzkPEGx%9%Z2# zz#ilzN+Vhf0BTi7)w#Gqfi^2X5>Q~ifoSo#>gL%lcI{br1&w;6n@#4C;d<4{p+QmP4B1cM z1K%{=?X4o(7>@j%mI*7Qd z9^8`&WEk+W%CHWY6t@bT3p}qCXe8X4Y;?{vB!Q=|MldX{6*&WVOe@lgxRCpreosp= z62sS`GFz+NK3*J5%VL zBzTpzAMl{gWqo8NYif#>Uk<#cvS>lv>8Z%pIsw?M759OsfJ;-P_)*%ww`%>jAltZ7 zMIqwXZgif2RltY@*SQqgaTTd5y9VWiO`Br8M7g*pQYyrfOQQY;zQ zDNo08XSUD+Jc)R};^Vf--$C(CYz`O*yHYM9H~!Q1(F86qfF-wIqE#!iQs7+jjW`Vw)50>#vx=GwjMcIEof1;s_!BZ Z{0|VKjBX7RE@A)x002ovPDHLkV1jg*A`}1s literal 0 HcmV?d00001 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/PrivateMessage.cs b/BookAStar/BookAStar/Model/Social/PrivateMessage.cs new file mode 100644 index 00000000..1fa633fd --- /dev/null +++ b/BookAStar/BookAStar/Model/Social/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 +{ + class PrivateMessage + { + public DateTime Date { get; set; } + public string SenderId { get; set; } + public string Message { get; set; } + } +} diff --git a/BookAStar/BookAStar/Pages/ChatPage.xaml b/BookAStar/BookAStar/Pages/ChatPage.xaml index f53cc3f6..0a15c6b3 100644 --- a/BookAStar/BookAStar/Pages/ChatPage.xaml +++ b/BookAStar/BookAStar/Pages/ChatPage.xaml @@ -1,9 +1,10 @@  - - + + - \ No newline at end of file + + + + + + + \ No newline at end of file diff --git a/BookAStar/BookAStar/Pages/ChatPage.xaml.cs b/BookAStar/BookAStar/Pages/ChatPage.xaml.cs index cab895da..0d4ecc76 100644 --- a/BookAStar/BookAStar/Pages/ChatPage.xaml.cs +++ b/BookAStar/BookAStar/Pages/ChatPage.xaml.cs @@ -6,7 +6,7 @@ using Xamarin.Forms; namespace BookAStar.Pages { - public partial class ChatPage : ContentPage + public partial class ChatPage : TabbedPage { public ObservableCollection Messages { get; set; } public string ChatUser { get; set; } @@ -42,7 +42,9 @@ namespace BookAStar.Pages { IsBusy = true; chatHubConnection = new HubConnection(Constants.SignalRHubsUrl); + chatHubProxy = chatHubConnection.CreateHubProxy("ChatHub"); + chatHubProxy.On("AddMessage", (n, m) => { Messages.Add(string.Format("{0} says: {1}", n, m)); }); diff --git a/BookAStar/BookAStar/Settings/ChatSettings.cs b/BookAStar/BookAStar/Settings/ChatSettings.cs new file mode 100644 index 00000000..4e50073c --- /dev/null +++ b/BookAStar/BookAStar/Settings/ChatSettings.cs @@ -0,0 +1,80 @@ +using BookAStar.Model.Workflow.Messaging; +using Plugin.Settings; +using Plugin.Settings.Abstractions; +using System.Collections.Generic; + +namespace BookAStar.Settings +{ + public static class ChatSettings + { + public static ISettings AppSettings + { + get + { + return CrossSettings.Current; + } + } + private const string statusKey = "chat.status"; + private const string ignoreListKey = "chat.ignoreList"; + private const string denyAnonymousAccessKey = "chat.denyAnonymousAccess"; + private const string denyTouristAccessKey = "chat.denyTouristAccess"; + + public static ChatStatus Status + { + get + { + return AppSettings.GetValueOrDefault(statusKey, ChatStatus.OffLine); + } + set + { + AppSettings.AddOrUpdateValue(statusKey, value); + } + } + public static List IgnoreList + { + get + { + return AppSettings.GetValueOrDefault>(ignoreListKey); + } + } + public static void Ignore(string userId) + { + var ignoreList = IgnoreList; + ignoreList.Add(userId); + AppSettings.AddOrUpdateValue(ignoreListKey, ignoreList); + } + public static void UnIgnore(string userId) + { + var ignoreList = IgnoreList; + ignoreList.Remove(userId); + AppSettings.AddOrUpdateValue(ignoreListKey, ignoreList); + } + public static void UnIgnoreAll() + { + var ignoreList = new List(); + AppSettings.AddOrUpdateValue(ignoreListKey, ignoreList); + } + public static bool DenyAnonymousAccess + { + get + { + return AppSettings.GetValueOrDefault(denyAnonymousAccessKey); + } + set + { + AppSettings.AddOrUpdateValue(denyAnonymousAccessKey, value); + } + } + public static bool DenyTouristAccess + { + get + { + return AppSettings.GetValueOrDefault(denyTouristAccessKey); + } + set + { + AppSettings.AddOrUpdateValue(denyTouristAccessKey, value); + } + } + } +} diff --git a/BookAStar/BookAStar/Helpers/MainSettings.cs b/BookAStar/BookAStar/Settings/MainSettings.cs similarity index 100% rename from BookAStar/BookAStar/Helpers/MainSettings.cs rename to BookAStar/BookAStar/Settings/MainSettings.cs