This commit is contained in:
2016-10-26 20:29:46 +02:00
parent 1a5ea1f011
commit 4669318b7e
14 changed files with 400 additions and 172 deletions

View File

@ -484,6 +484,12 @@
<ItemGroup>
<AndroidResource Include="Resources\drawable\chat_icon_s.png" />
</ItemGroup>
<ItemGroup>
<AndroidResource Include="Resources\drawable\exclam.png" />
</ItemGroup>
<ItemGroup>
<AndroidResource Include="Resources\drawable\peer_to_peer.png" />
</ItemGroup>
<Import Project="$(MSBuildExtensionsPath)\Xamarin\Android\Xamarin.Android.CSharp.targets" />
<Target Name="EnsureNuGetPackageBuildImports" BeforeTargets="PrepareForBuild">
<PropertyGroup>

View File

@ -84,7 +84,6 @@ namespace Yavsc.Helpers
public async Task<JsonValue> InvokeJson(object query)
{
JsonValue jsonDoc=null;
using (Stream streamQuery = request.GetRequestStream()) {
using (StreamWriter writer = new StreamWriter(streamQuery)) {

View File

@ -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;
// aapt resource value: 0x7f0200df
public const int notification_template_icon_bg = 2130837727;
public const int mr_ic_play_light = 2130837725;
// aapt resource value: 0x7f0200de
public const int visuel_sexion = 2130837726;
public const int nfqrcode = 2130837726;
// aapt resource value: 0x7f0200e1
public const int notification_template_icon_bg = 2130837729;
// aapt resource value: 0x7f0200df
public const int peer_to_peer = 2130837727;
// aapt resource value: 0x7f0200e0
public const int visuel_sexion = 2130837728;
static Drawable()
{

View File

Before

Width:  |  Height:  |  Size: 6.9 KiB

After

Width:  |  Height:  |  Size: 6.9 KiB

View File

@ -21,6 +21,7 @@ namespace BookAStar
using Plugin.Connectivity;
using ViewModels;
using Microsoft.AspNet.SignalR.Client;
using Model.Social.Messaging;
public partial class App : Application // superclass new in 1.3
{
@ -56,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
@ -70,13 +79,10 @@ namespace BookAStar
}
// Called Once, at app init
// FIXME Never called.
private void OnInitialize(object sender, EventArgs e)
{
CrossConnectivity.Current.ConnectivityChanged += (conSender, args) =>
{
App.IsConnected = args.IsConnected;
};
}
// called on app startup, not on rotation
@ -243,23 +249,33 @@ namespace BookAStar
// 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 ()
{
if (chatHubConnection != null)
chatHubConnection.Dispose();
await chatHubConnection.Start();
}
public void SetupHubConnection()
{
chatHubConnection = new HubConnection(Constants.SignalRHubsUrl);
if (MainSettings.CurrentUser != null)
chatHubConnection.Headers.Add("Bearer", MainSettings.CurrentUser.YavscTokens.AccessToken);
chatHubConnection.Error += ChatHubConnection_Error;
chatHubProxy = chatHubConnection.CreateHubProxy("ChatHub");
chatHubProxy.On<string, string>("PV", (n, m) => {
DataManager.Current.PrivateMessages.Add(
new Model.Social.PrivateMessage
new UserMessage
{
Message = m,
SenderId = n,
@ -267,11 +283,32 @@ namespace BookAStar
}
);
});
await chatHubConnection.Start();
}
private HubConnection chatHubConnection=null;
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<bool> HasSomeCloud {
get
{
@ -281,9 +318,9 @@ namespace BookAStar
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)

View File

@ -50,7 +50,7 @@
<Compile Include="Constants.cs" />
<Compile Include="Data\LocalState.cs" />
<Compile Include="Model\Social\Messaging\ChatStatus.cs" />
<Compile Include="Model\Social\PrivateMessage.cs" />
<Compile Include="Model\Social\Messaging\PrivateMessage.cs" />
<Compile Include="Model\UI\PageState.cs" />
<Compile Include="Settings\ChatSettings.cs" />
<Compile Include="ViewModels\EditingViewModel.cs" />
@ -169,6 +169,9 @@
<Compile Include="Views\RatingView.xaml.cs">
<DependentUpon>RatingView.xaml</DependentUpon>
</Compile>
<Compile Include="Views\UserListView.xaml.cs">
<DependentUpon>UserListView.xaml</DependentUpon>
</Compile>
</ItemGroup>
<ItemGroup>
<EmbeddedResource Include="App.xaml">
@ -367,6 +370,12 @@
<ItemGroup>
<EmbeddedResource Include="Images\Chat\chat_icon_s.png" />
</ItemGroup>
<ItemGroup>
<EmbeddedResource Include="Views\UserListView.xaml">
<Generator>MSBuild:UpdateDesignTimeXaml</Generator>
<SubType>Designer</SubType>
</EmbeddedResource>
</ItemGroup>
<Import Project="$(MSBuildExtensionsPath32)\Microsoft\Portable\$(TargetFrameworkVersion)\Microsoft.Portable.CSharp.targets" />
<Import Project="..\..\packages\Xamarin.Forms.2.3.2.127\build\portable-win+net45+wp80+win81+wpa81+MonoAndroid10+MonoTouch10+Xamarin.iOS10\Xamarin.Forms.targets" Condition="Exists('..\..\packages\Xamarin.Forms.2.3.2.127\build\portable-win+net45+wp80+win81+wpa81+MonoAndroid10+MonoTouch10+Xamarin.iOS10\Xamarin.Forms.targets')" />
<Target Name="EnsureNuGetPackageBuildImports" BeforeTargets="PrepareForBuild">

View File

@ -5,7 +5,7 @@
using Model.Workflow;
using Model.UI;
using ViewModels;
using Model.Social;
using Model.Social.Messaging;
public class DataManager
{
@ -20,7 +20,7 @@
/// </summary>
internal LocalEntity<EditEstimateViewModel, long> EstimationCache { get; set; }
internal LocalEntity<BillingLine, string> EstimateLinesTemplates { get; set; }
internal LocalEntity<PrivateMessage, int> PrivateMessages { get; set; }
internal LocalEntity<UserMessage, int> PrivateMessages { get; set; }
protected static DataManager current ;
public static DataManager Current
@ -42,7 +42,7 @@
AppState = new LocalEntity<PageState, int>(s => s.Position);
EstimationCache = new LocalEntity<EditEstimateViewModel, long>(e => e.Query.Id);
EstimateLinesTemplates = new LocalEntity<BillingLine, string>(l => l.Description);
PrivateMessages = new LocalEntity<PrivateMessage, int>(m=> m.GetHashCode());
PrivateMessages = new LocalEntity<UserMessage, int>(m=> m.GetHashCode());
PrivateMessages.Load();
BookQueries.Load();

View File

@ -25,5 +25,9 @@ namespace BookAStar.Model
return UserHelpers.Avatar(Avatar);
}
}
public override string ToString()
{
return UserName;
}
}
}

View File

@ -4,9 +4,9 @@ using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace BookAStar.Model.Social
namespace BookAStar.Model.Social.Messaging
{
class PrivateMessage
public class UserMessage
{
public DateTime Date { get; set; }
public string SenderId { get; set; }

View File

@ -70,6 +70,7 @@ namespace BookAStar.Pages
if (estimateToEdit == null)
{
DataManager.Current.Contacts.Merge(BookQuery.Client);
DataManager.Current.Contacts.SaveCollection();
estimateToEdit = new Estimate()
{
ClientId = BookQuery.Client.UserId,

View File

@ -2,28 +2,95 @@
<TabbedPage xmlns="http://xamarin.com/schemas/2014/forms"
xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
x:Class="BookAStar.Pages.ChatPage"
xmlns:views="clr-namespace:BookAStar.Views;assembly=BookAStar"
xmlns:controls="clr-namespace:XLabs.Forms.Controls;assembly=XLabs.Forms"
xmlns:toolkit="clr-namespace:XLabs.Forms.Mvvm;assembly=XLabs.Forms"
>
<TabbedPage.Children>
<ContentPage Title="Public" Icon="chat.png" >
<StackLayout Padding="5, 5, 5, 5">
<StackLayout Spacing = "12"
Orientation = "Horizontal"
Padding="5, 0, 5, 0">
<Entry x:Name="messageEntry" Placeholder = "enter your Message"
VerticalOptions = "Center"
HorizontalOptions = "FillAndExpand"></Entry>
<Button x:Name="sendButton" Text = "Send" HorizontalOptions = "End"
VerticalOptions = "Center"></Button>
<Label Text="{Binding MainText}" VerticalOptions="Center" HorizontalOptions="Center" />
<TabbedPage.Children>
<ContentPage Title="Public" Icon="chat_icon_s.png" >
<StackLayout Padding="5, 5, 5, 5">
<StackLayout Spacing = "12"
Orientation = "Horizontal"
Padding="5, 0, 5, 0">
<Entry x:Name="messageEntry" Placeholder = "enter your Message"
VerticalOptions = "Center"
HorizontalOptions = "FillAndExpand"></Entry>
<Button x:Name="sendButton" Text = "Send" HorizontalOptions = "End"
VerticalOptions = "Center"></Button>
</StackLayout>
<ListView x:Name="messageList" HasUnevenRows="true">
<ListView.ItemTemplate HeightRequest="80" VerticalOptions="StartAndExpand">
<DataTemplate>
<ViewCell>
<ViewCell.View>
<StackLayout Orientation="Horizontal" VerticalOptions="StartAndExpand">
<Label Text="{Binding Date, StringFormat='{0:HH:mm}'}" FontAttributes="Italic" />
<Label Text="{Binding SenderId}" FontFamily="monospace" FontAttributes="Italic" />
<BoxView WidthRequest="1" HeightRequest="15" Color="#000090"/>
<Label Text="{Binding Message}" FontFamily="monospace" />
</StackLayout>
</ViewCell.View>
</ViewCell>
</DataTemplate>
</ListView.ItemTemplate>
</ListView>
</StackLayout>
</ContentPage>
<ContentPage Title="Notifications" Icon="exclam.png" >
<StackLayout Padding="5, 5, 5, 5">
<ListView x:Name="notifList" HasUnevenRows="true">
<ListView.ItemTemplate HeightRequest="80" VerticalOptions="StartAndExpand">
<DataTemplate>
<ViewCell>
<ViewCell.View>
<StackLayout Orientation="Horizontal" VerticalOptions="StartAndExpand">
<Label Text="{Binding Date, StringFormat='{0:hh:mm}'}" FontAttributes="Italic" />
<Label Text="{Binding SenderId}" FontFamily="monospace" FontAttributes="Italic" />
<BoxView Color="#000090" WidthRequest="1" HeightRequest="15" />
<Label Text="{Binding Message}" FontFamily="monospace" />
</StackLayout>
</ViewCell.View>
</ViewCell>
</DataTemplate>
</ListView.ItemTemplate>
</ListView>
</StackLayout>
</ContentPage>
<ContentPage Title="Contacts" Icon="peer_to_peer.png" >
<StackLayout Padding="5, 5, 5, 5">
<StackLayout Spacing = "12"
Orientation = "Horizontal"
Padding="5, 0, 5, 0">
<Entry x:Name="pvEntry" Placeholder = "enter your private message"
VerticalOptions = "Center"
HorizontalOptions = "FillAndExpand"></Entry>
<!--
<controls:ExtendedPicker x:Name="contactPicker" Display="{Binding UserName}"></controls:ExtendedPicker>
-->
<controls:ExtendedPicker x:Name="contactPicker" />
<Button x:Name="sendPVButton" Text = "Send" HorizontalOptions = "End"
VerticalOptions = "Center"></Button>
</StackLayout>
<ListView x:Name="PVList" HasUnevenRows="true">
<ListView.ItemTemplate HeightRequest="80" VerticalOptions="StartAndExpand">
<DataTemplate>
<ViewCell>
<ViewCell.View>
<StackLayout Orientation="Horizontal" VerticalOptions="StartAndExpand">
<Label Text="{Binding Date, StringFormat='{0:hh:mm}'}" FontAttributes="Italic" />
<Label Text="{Binding SenderId}" FontFamily="monospace" FontAttributes="Italic" />
<BoxView Color="#000090" WidthRequest="1" HeightRequest="15" />
<Label Text="{Binding Message}" FontFamily="monospace" />
</StackLayout>
</ViewCell.View>
</ViewCell>
</DataTemplate>
</ListView.ItemTemplate>
</ListView>
<!-- <views:UserListView ItemsSource="" /> -->
</StackLayout>
<ListView x:Name="messageList"></ListView>
</StackLayout>
</ContentPage>
<ContentPage Title="Notifications" Icon="exclam.png" >
</ContentPage>
<ContentPage Title="Privé" Icon="nicubunu-Peer-to-peer.png" >
</ContentPage>
</TabbedPage.Children>
</ContentPage>
</TabbedPage.Children>
</TabbedPage>

View File

@ -1,56 +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 : TabbedPage
{
public ObservableCollection<string> Messages { get; set; }
public ObservableCollection<UserMessage> 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<string>("Send", ChatUser, messageEntry.Text);
await App.CurrentApp.ChatHubProxy.Invoke<string>("Send", ChatUser, messageEntry.Text);
messageEntry.Text = null;
}
catch (Exception ex)
{
Debug.WriteLine(ex);
}
IsBusy = false;
};
messageList.ItemsSource = Messages = new ObservableCollection<string>();
// contactPicker.DisplayProperty = "UserName";
messageList.ItemsSource = Messages = new ObservableCollection<UserMessage>();
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<string, string>("addMessage", (n, m) =>
{
Messages.Add(new UserMessage
{
Message = m,
SenderId = n,
Date = DateTime.Now
});
});
App.CurrentApp.ChatHubProxy.On<string, string>("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<string, string>("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;
}
}
}

View File

@ -0,0 +1,35 @@
<?xml version="1.0" encoding="UTF-8"?>
<ContentView xmlns="http://xamarin.com/schemas/2014/forms"
xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
x:Class="BookAStar.Views.UserListView"
xmlns:local="clr-namespace:BookAStar;assembly=BookAStar"
xmlns:extensions="clr-namespace:BookAStar.Extensions;assembly=BookAStar">
<ContentView.Resources>
<ResourceDictionary>
<Style TargetType="Label">
<Setter Property="Style" Value="{StaticResource ContentLabelStyle}" />
</Style>
<Style TargetType="Button">
<Setter Property="Style" Value="{StaticResource ButtonStyle}" />
</Style>
</ResourceDictionary>
</ContentView.Resources>
<ContentView.Content>
<ListView x:Name="list" ItemTapped="OnViewDetail" HasUnevenRows="true" RowHeight="80">
<ListView.ItemTemplate HeightRequest="80" VerticalOptions="StartAndExpand">
<DataTemplate>
<ViewCell>
<ViewCell.View>
<StackLayout Orientation="Horizontal" Padding="10,10,10,10" VerticalOptions="StartAndExpand">
<Image Source="{Binding AvatarOrNot}" Aspect="AspectFit" />
<Label Text="{Binding UserName}" />
<Label Text="{Binding EMail}" />
</StackLayout>
</ViewCell.View>
</ViewCell>
</DataTemplate>
</ListView.ItemTemplate>
</ListView>
</ContentView.Content>
</ContentView>

View File

@ -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();
}
}
}