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 @@
-
-
-
+
+
\ No newline at end of file
diff --git a/BookAStar/BookAStar/Pages/BookQueryPage.xaml.cs b/BookAStar/BookAStar/Pages/BookQueryPage.xaml.cs
index f547338c..dbc0377f 100644
--- a/BookAStar/BookAStar/Pages/BookQueryPage.xaml.cs
+++ b/BookAStar/BookAStar/Pages/BookQueryPage.xaml.cs
@@ -7,6 +7,7 @@ namespace BookAStar.Pages
using Data;
using Model;
using Model.Workflow;
+ using System.Linq;
using ViewModels;
public partial class BookQueryPage : ContentPage
@@ -57,23 +58,36 @@ namespace BookAStar.Pages
private void OnEditEstimate(object sender, EventArgs ev)
{
- var viewModel = ((BookQueryViewModel)BindingContext).DraftEstimate;
- if (viewModel == null)
+ var bookQueryViewModel = (BookQueryViewModel)BindingContext;
+
+ var editEstimateViewModel = bookQueryViewModel.DraftEstimate;
+ if (editEstimateViewModel == null)
{
- DataManager.Current.Contacts.Merge(BookQuery.Client);
- var e = new Estimate()
+ // First search for an existing estimate
+ var estimateToEdit = DataManager.Current.Estimates.FirstOrDefault(
+ estimate=> estimate.CommandId == bookQueryViewModel.Id
+ );
+ if (estimateToEdit == null)
{
- ClientId = BookQuery.Client.UserId,
- CommandId = BookQuery.Id,
- OwnerId = MainSettings.CurrentUser.Id,
- Id = 0,
- Description = "# **Hello Estimate!**"
- };
- viewModel = new EditEstimateViewModel(e, LocalState.New);
- DataManager.Current.EstimationCache.Add(viewModel);
+ DataManager.Current.Contacts.Merge(BookQuery.Client);
+ DataManager.Current.Contacts.SaveCollection();
+ estimateToEdit = new Estimate()
+ {
+ ClientId = BookQuery.Client.UserId,
+ CommandId = BookQuery.Id,
+ OwnerId = MainSettings.CurrentUser.Id,
+ Id = 0,
+ Description = "# **Hello Estimate!**"
+ };
+ editEstimateViewModel = new EditEstimateViewModel(estimateToEdit, LocalState.New);
+ }
+ else
+ editEstimateViewModel = new EditEstimateViewModel(estimateToEdit, LocalState.UpToDate);
+
+ DataManager.Current.EstimationCache.Add(editEstimateViewModel);
}
App.NavigationService.NavigateTo(true,
- viewModel);
+ editEstimateViewModel);
}
protected override void OnSizeAllocated(double width, double height)
diff --git a/BookAStar/BookAStar/Pages/ChatPage.xaml b/BookAStar/BookAStar/Pages/ChatPage.xaml
index f53cc3f6..adbb5844 100644
--- a/BookAStar/BookAStar/Pages/ChatPage.xaml
+++ b/BookAStar/BookAStar/Pages/ChatPage.xaml
@@ -1,22 +1,96 @@
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-
-
-
\ 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..214a14f9 100644
--- a/BookAStar/BookAStar/Pages/ChatPage.xaml.cs
+++ b/BookAStar/BookAStar/Pages/ChatPage.xaml.cs
@@ -1,54 +1,83 @@
-using Microsoft.AspNet.SignalR.Client;
+using BookAStar.Data;
+using BookAStar.Model.Social.Messaging;
+using Microsoft.AspNet.SignalR.Client;
using System;
using System.Collections.ObjectModel;
using System.Diagnostics;
using Xamarin.Forms;
+using XLabs.Caching;
+using XLabs.Forms.Controls;
+using XLabs.Ioc;
namespace BookAStar.Pages
{
- public partial class ChatPage : ContentPage
+ public partial class ChatPage : TabbedPage
{
- public ObservableCollection Messages { get; set; }
+ public ObservableCollection Messages { get; set; }
public string ChatUser { get; set; }
- private HubConnection chatHubConnection;
- private IHubProxy chatHubProxy;
-
public ChatPage()
{
InitializeComponent();
Title = "Chat";
- sendButton.Clicked += async (sender, args) => {
+ sendButton.Clicked += async (sender, args) =>
+ {
IsBusy = true;
try
{
- await chatHubProxy.Invoke("Send", ChatUser, messageEntry.Text);
+ await App.CurrentApp.ChatHubProxy.Invoke("Send", ChatUser, messageEntry.Text);
+ messageEntry.Text = null;
}
catch (Exception ex)
{
-
Debug.WriteLine(ex);
}
IsBusy = false;
};
- messageList.ItemsSource = Messages = new ObservableCollection();
+ // contactPicker.DisplayProperty = "UserName";
+
+ messageList.ItemsSource = Messages = new ObservableCollection();
+ PVList.ItemsSource = DataManager.Current.PrivateMessages;
+ App.CurrentApp.ChatHubConnection.StateChanged += ChatHubConnection_StateChanged;
+ // DataManager.Current.Contacts
+
+ MainSettings.UserChanged += MainSettings_UserChanged;
+ MainSettings_UserChanged(this, null);
+
+ App.CurrentApp.ChatHubProxy.On("addMessage", (n, m) =>
+ {
+ Messages.Add(new UserMessage
+ {
+ Message = m,
+ SenderId = n,
+ Date = DateTime.Now
+ });
+ });
+
+ App.CurrentApp.ChatHubProxy.On("addMessage", (n, m) =>
+ {
+ Messages.Add(new UserMessage
+ {
+ Message = m,
+ SenderId = n,
+ Date = DateTime.Now
+ });
+ });
}
- protected override async void OnAppearing()
+ private void MainSettings_UserChanged(object sender, EventArgs e)
{
- 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));
- });
- await chatHubConnection.Start();
- IsBusy = false;
- sendButton.IsEnabled = true;
+ ChatUser = MainSettings.UserName;
+ contactPicker.ItemsSource = DataManager.Current.Contacts;
+ }
+
+ private void ChatHubConnection_StateChanged(StateChange obj)
+ {
+ sendButton.IsEnabled = obj.NewState == ConnectionState.Connected;
}
}
}
diff --git a/BookAStar/BookAStar/Pages/EditBillingLinePage.xaml b/BookAStar/BookAStar/Pages/EditBillingLinePage.xaml
index bd66e782..6ce717aa 100644
--- a/BookAStar/BookAStar/Pages/EditBillingLinePage.xaml
+++ b/BookAStar/BookAStar/Pages/EditBillingLinePage.xaml
@@ -93,8 +93,10 @@
Path=IsValid,
Converter={StaticResource boolToStyleImage}}" />
-
-
+
diff --git a/BookAStar/BookAStar/Pages/EditBillingLinePage.xaml.cs b/BookAStar/BookAStar/Pages/EditBillingLinePage.xaml.cs
index 863add5f..779d189e 100644
--- a/BookAStar/BookAStar/Pages/EditBillingLinePage.xaml.cs
+++ b/BookAStar/BookAStar/Pages/EditBillingLinePage.xaml.cs
@@ -21,5 +21,11 @@ namespace BookAStar.Pages
{
this.Navigation.PopAsync();
}
+ protected override bool OnBackButtonPressed()
+ {
+ var bvm = (BillingLineViewModel)BindingContext;
+ bvm.ValidateCommand?.Execute(null);
+ return base.OnBackButtonPressed();
+ }
}
}
diff --git a/BookAStar/BookAStar/Pages/EditEstimatePage.xaml b/BookAStar/BookAStar/Pages/EditEstimatePage.xaml
index a3c5be6e..3e4a4bc4 100644
--- a/BookAStar/BookAStar/Pages/EditEstimatePage.xaml
+++ b/BookAStar/BookAStar/Pages/EditEstimatePage.xaml
@@ -40,7 +40,7 @@
+ HeightRequest="40" ItemTapped="OnEditLine">
diff --git a/BookAStar/BookAStar/Pages/EditEstimatePage.xaml.cs b/BookAStar/BookAStar/Pages/EditEstimatePage.xaml.cs
index 3bfdae2b..4c46a728 100644
--- a/BookAStar/BookAStar/Pages/EditEstimatePage.xaml.cs
+++ b/BookAStar/BookAStar/Pages/EditEstimatePage.xaml.cs
@@ -14,6 +14,7 @@ namespace BookAStar.Pages
InitializeComponent();
BindingContext = model;
}
+
protected override void OnBindingContextChanged()
{
base.OnBindingContextChanged();
@@ -41,17 +42,36 @@ namespace BookAStar.Pages
protected void OnNewCommanLine(object sender, EventArgs e)
{
var com = new BillingLine() { Count = 1, UnitaryCost = 0.01m };
- var lineView = new BillingLineViewModel(com);
- var bill =
- ((EditEstimateViewModel)BindingContext).Bill;
- bill.Add(com);
- bill.SaveCollection();
- lineView.PropertyChanged += (s,f) => bill.SaveCollection();
+ var bill = ((EditEstimateViewModel)BindingContext).Bill;
+ var lineView = new BillingLineViewModel(com)
+ { ValidateCommand = new Command(() => {
+ bill.Add(com);
+ bill.SaveCollection();
+ })};
App.NavigationService.NavigateTo(
true,
new object[] { lineView } );
}
+ protected void OnEditLine(object sender, ItemTappedEventArgs e)
+ {
+ var line = (BillingLine)e.Item;
+ var bill = ((EditEstimateViewModel)BindingContext).Bill;
+ var lineView = new BillingLineViewModel(line)
+ {
+ ValidateCommand = new Command(() => {
+ bill.SaveCollection();
+ })
+ };
+ lineView.PropertyChanged += LineView_PropertyChanged;
+ App.NavigationService.NavigateTo(
+ true,
+ new object[] { lineView });
+ }
+ private void LineView_PropertyChanged(object sender, System.ComponentModel.PropertyChangedEventArgs e)
+ {
+ DataManager.Current.EstimationCache.SaveCollection();
+ }
protected void OnEstimateValidated(object sender, EventArgs e)
{
@@ -68,7 +88,9 @@ namespace BookAStar.Pages
DataManager.Current.Estimates.Update(evm.Data);
}
DataManager.Current.Estimates.SaveCollection();
- evm.State = LocalState.UpToDate;
+ DataManager.Current.EstimationCache.Remove(evm);
+ DataManager.Current.EstimationCache.SaveCollection();
+ Navigation.PopAsync();
}
}
}
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
diff --git a/BookAStar/BookAStar/ViewModels/BillingLineViewModel.cs b/BookAStar/BookAStar/ViewModels/BillingLineViewModel.cs
index 0ff1d92f..051280bb 100644
--- a/BookAStar/BookAStar/ViewModels/BillingLineViewModel.cs
+++ b/BookAStar/BookAStar/ViewModels/BillingLineViewModel.cs
@@ -13,48 +13,57 @@ namespace BookAStar.ViewModels
{
BillingLine data;
- public BillingLineViewModel( BillingLine data)
+ public BillingLineViewModel(BillingLine data)
{
this.data = data ?? new BillingLine();
// sets durationValue & durationUnit
+ count = data.Count;
+ description = data.Description;
+
Duration = data.Duration;
- unitaryCostText = data.UnitaryCost.ToString("G",CultureInfo.InvariantCulture);
+ unitaryCostText = data.UnitaryCost.ToString("G", CultureInfo.InvariantCulture);
}
+ private int count;
public int Count
{
get
{
- return data.Count;
+ return count;
}
set
{
- data.Count = value;
+ SetProperty(ref count, value);
+ data.Count = count;
}
}
+ private string description;
public string Description
{
get
{
- return data.Description;
+ return description;
}
set
{
- data.Description = value;
+ SetProperty(ref description, value);
+ data.Description = description;
}
}
+ decimal unitaryCost;
public decimal UnitaryCost
{
get
{
- return data.UnitaryCost;
+ return unitaryCost;
}
set
{
- data.UnitaryCost = value;
+ SetProperty(ref unitaryCost, value);
+ data.UnitaryCost = unitaryCost;
}
}
@@ -72,12 +81,12 @@ namespace BookAStar.ViewModels
data.Duration = this.Duration;
}
}
-
- public enum DurationUnits:int
+
+ public enum DurationUnits : int
{
- Jours=0,
- Heures=1,
- Minutes=2
+ Jours = 0,
+ Heures = 1,
+ Minutes = 2
}
private DurationUnits durationUnit;
@@ -85,17 +94,17 @@ namespace BookAStar.ViewModels
pour décrire la quantité de travail associée à ce type de service")]
public DurationUnits DurationUnit
{
- get {
+ get
+ {
return durationUnit;
}
set
{
- SetProperty(ref durationUnit, value, "DurationUnit");
- data.Duration = this.Duration;
+ SetProperty(ref durationUnit, value, "DurationUnit");
+ data.Duration = this.Duration;
}
}
-
- protected decimal unitaryCost;
+
public static readonly string unitCostFormat = "0,.00";
string unitaryCostText;
public string UnitaryCostText
@@ -129,7 +138,7 @@ pour décrire la quantité de travail associée à ce type de service")]
case DurationUnits.Heures:
return new TimeSpan(DurationValue, 0, 0);
case DurationUnits.Jours:
- return new TimeSpan(DurationValue*24, 0, 0);
+ return new TimeSpan(DurationValue * 24, 0, 0);
case DurationUnits.Minutes:
return new TimeSpan(0, DurationValue, 0);
// Assert(false); since all units are treated bellow
@@ -143,21 +152,21 @@ pour décrire la quantité de travail associée à ce type de service")]
double days = value.TotalDays;
if (days >= 1.0)
{
- DurationValue = (int) days;
+ DurationValue = (int)days;
DurationUnit = DurationUnits.Jours;
return;
}
double hours = value.TotalHours;
if (hours >= 1.0)
{
- DurationValue = (int) hours;
+ DurationValue = (int)hours;
DurationUnit = DurationUnits.Jours;
return;
}
- DurationValue = (int) value.TotalMinutes;
+ DurationValue = (int)value.TotalMinutes;
DurationUnit = DurationUnits.Minutes;
}
}
-
+
}
}
diff --git a/BookAStar/BookAStar/Views/UserListView.xaml b/BookAStar/BookAStar/Views/UserListView.xaml
new file mode 100644
index 00000000..348aa1e3
--- /dev/null
+++ b/BookAStar/BookAStar/Views/UserListView.xaml
@@ -0,0 +1,35 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/BookAStar/BookAStar/Views/UserListView.xaml.cs b/BookAStar/BookAStar/Views/UserListView.xaml.cs
new file mode 100644
index 00000000..18f5daac
--- /dev/null
+++ b/BookAStar/BookAStar/Views/UserListView.xaml.cs
@@ -0,0 +1,37 @@
+using BookAStar.Model;
+using System;
+using System.Collections;
+using System.Collections.Generic;
+using System.Collections.ObjectModel;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+using Xamarin.Forms;
+
+namespace BookAStar.Views
+{
+ public partial class UserListView : ContentView
+ {
+ public BindableProperty ItemsSourceProperty = BindableProperty.Create(
+ "ItemsSource", typeof(IEnumerable), typeof(UserListView));
+
+ public IEnumerable ItemsSource
+ {
+ get { return list.ItemsSource; }
+ set { list.ItemsSource = value; }
+ }
+
+ /* public IEnumerable ItemsSource
+ {
+ get { return GetValue(ItemsSourceProperty) as IEnumerable; }
+ set { SetValue(ItemsSourceProperty, value); }
+ }
+ */
+ public UserListView()
+ {
+ InitializeComponent();
+ }
+
+ }
+}