diff options
author | Vitaly Takmazov | 2013-04-26 22:04:18 +0400 |
---|---|---|
committer | Vitaly Takmazov | 2013-04-26 22:04:18 +0400 |
commit | ee46fb9228fd6e70893270703d814a400bb8ca22 (patch) | |
tree | 32bbe9e4b43c1fb6906ac708009020cc1990bbf0 | |
parent | e7fb2a3794bc7fb3c6592312d2628d9d11eedf3b (diff) |
Fixed crash when network is unavailable, added warning message
-rw-r--r-- | Juick/Classes/BooleanToVisibiltyConverter.cs | 24 | ||||
-rw-r--r-- | Juick/Juick.csproj | 1 | ||||
-rw-r--r-- | Juick/MainPage.xaml | 10 | ||||
-rw-r--r-- | Juick/ViewModels/AppViewModel.cs | 52 | ||||
-rw-r--r-- | Juick/ViewModels/PageViewModel.cs | 2 |
5 files changed, 71 insertions, 18 deletions
diff --git a/Juick/Classes/BooleanToVisibiltyConverter.cs b/Juick/Classes/BooleanToVisibiltyConverter.cs new file mode 100644 index 0000000..679cc3f --- /dev/null +++ b/Juick/Classes/BooleanToVisibiltyConverter.cs @@ -0,0 +1,24 @@ +using System; +using System.Collections.Generic; +using System.Globalization; +using System.Linq; +using System.Text; +using System.Windows; +using System.Windows.Data; + +namespace Juick.Classes +{ + public class BooleanToVisibiltyConverter : IValueConverter + { + public object Convert(object value, Type targetType, object parameter, CultureInfo culture) + { + var visible = (bool) value; + return visible ? Visibility.Visible : Visibility.Collapsed; + } + + public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) + { + throw new NotImplementedException(); + } + } +} diff --git a/Juick/Juick.csproj b/Juick/Juick.csproj index 33fbd5c..26371f0 100644 --- a/Juick/Juick.csproj +++ b/Juick/Juick.csproj @@ -80,6 +80,7 @@ <DependentUpon>App.xaml</DependentUpon>
</Compile>
<Compile Include="Classes\AccountManager.cs" />
+ <Compile Include="Classes\BooleanToVisibiltyConverter.cs" />
<Compile Include="Classes\DelegateCommand.cs" />
<Compile Include="Classes\ExpressionHelper.cs" />
<Compile Include="Classes\InvokeDelegateCommandAction.cs" />
diff --git a/Juick/MainPage.xaml b/Juick/MainPage.xaml index 45e1ff9..7c38b7b 100644 --- a/Juick/MainPage.xaml +++ b/Juick/MainPage.xaml @@ -7,22 +7,26 @@ xmlns:controls="clr-namespace:Microsoft.Phone.Controls;assembly=Microsoft.Phone.Controls"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
- xmlns:usercontrols="clr-namespace:Juick.Controls"
+ xmlns:usercontrols="clr-namespace:Juick.Controls" xmlns:classes="clr-namespace:Juick.Classes"
mc:Ignorable="d" d:DesignWidth="480" d:DesignHeight="696"
FontFamily="{StaticResource PhoneFontFamilyNormal}"
FontSize="{StaticResource PhoneFontSizeNormal}"
Foreground="{StaticResource PhoneForegroundBrush}"
SupportedOrientations="PortraitOrLandscape" Orientation="Portrait"
phoneshell:SystemTray.IsVisible="True">
+ <phone:PhoneApplicationPage.Resources>
+ <classes:BooleanToVisibiltyConverter x:Key="BooleanToVisibilityConverter"/>
+ </phone:PhoneApplicationPage.Resources>
<!--LayoutRoot is the root grid where all page content is placed-->
<Grid x:Name="LayoutRoot" Background="Transparent">
<Grid.RowDefinitions>
<RowDefinition Height="Auto" />
+ <RowDefinition Height="Auto" />
<RowDefinition Height="*" />
</Grid.RowDefinitions>
-
- <controls:Pivot x:Name="Pages" Title="juick" Grid.Row="1" ItemsSource="{Binding Pages}">
+ <TextBlock Grid.Row="1" Text="Network unavailable" Visibility="{Binding NetworkUnavailable, Converter={StaticResource BooleanToVisibilityConverter}}"/>
+ <controls:Pivot x:Name="Pages" Title="juick" Grid.Row="2" ItemsSource="{Binding Pages}">
<controls:Pivot.HeaderTemplate>
<DataTemplate>
<TextBlock Text="{Binding Caption}"></TextBlock>
diff --git a/Juick/ViewModels/AppViewModel.cs b/Juick/ViewModels/AppViewModel.cs index 7d5006c..07ba7cf 100644 --- a/Juick/ViewModels/AppViewModel.cs +++ b/Juick/ViewModels/AppViewModel.cs @@ -2,8 +2,10 @@ using System.Collections.Generic; using System.Collections.ObjectModel; using System.Linq; +using System.Net.NetworkInformation; using Juick.Classes; using JuickApi; +using Microsoft.Phone.Net.NetworkInformation; using RestSharp; using Microsoft.Phone.Notification; using System.Diagnostics; @@ -13,29 +15,37 @@ namespace Juick.ViewModels { public class AppViewModel : ViewModelBase { - readonly HttpNotificationChannel pushChannel; + static readonly string IsNetworkAvailablePropertyName = ExpressionHelper.GetPropertyName<AppViewModel>(x => x.NetworkUnavailable); + readonly HttpNotificationChannel _pushChannel; // The name of our push channel. - string channelName = "JuickChannel"; + private const string channelName = "JuickChannel"; + + public void UpdateNetworkStatus() + { + NetworkUnavailable = !DeviceNetworkInformation.IsNetworkAvailable; + } public AppViewModel() { - pushChannel = HttpNotificationChannel.Find(channelName); + UpdateNetworkStatus(); + NetworkChange.NetworkAddressChanged += (sender, args) => UpdateNetworkStatus(); + _pushChannel = HttpNotificationChannel.Find(channelName); // If the channel was not found, then create a new connection to the push service. - if (pushChannel == null) + if (_pushChannel == null) { - pushChannel = new HttpNotificationChannel(channelName); + _pushChannel = new HttpNotificationChannel(channelName); // Register for all the events before attempting to open the channel. - pushChannel.ChannelUriUpdated += (sender, e) => EnableNotifications(e.ChannelUri.ToString()); - pushChannel.ErrorOccurred += (sender, e) => DisableNotifications(); + _pushChannel.ChannelUriUpdated += (sender, e) => EnableNotifications(e.ChannelUri.ToString()); + _pushChannel.ErrorOccurred += (sender, e) => DisableNotifications(); // Register for this notification only if you need to receive the notifications while your application is running. // Register for this notification only if you need to receive the notifications while your application is running. - pushChannel.ShellToastNotificationReceived += (sender, e) => + _pushChannel.ShellToastNotificationReceived += (sender, e) => { - StringBuilder message = new StringBuilder(); + var message = new StringBuilder(); string relativeUri = string.Empty; message.AppendFormat("Received Toast {0}:\n", DateTime.Now.ToShortTimeString()); @@ -57,20 +67,20 @@ namespace Juick.ViewModels Debug.WriteLine("Received: " + message.ToString()); }; - pushChannel.Open(); + _pushChannel.Open(); // Bind this new channel for toast events. - pushChannel.BindToShellToast(); + _pushChannel.BindToShellToast(); } else { // The channel was already open, so just register for all the events. - pushChannel.ChannelUriUpdated += (sender, e) => EnableNotifications(e.ChannelUri.ToString()); - pushChannel.ErrorOccurred += (sender, e) => DisableNotifications(); + _pushChannel.ChannelUriUpdated += (sender, e) => EnableNotifications(e.ChannelUri.ToString()); + _pushChannel.ErrorOccurred += (sender, e) => DisableNotifications(); // Register for this notification only if you need to receive the notifications while your application is running. - pushChannel.ShellToastNotificationReceived += (sender, e) => + _pushChannel.ShellToastNotificationReceived += (sender, e) => { StringBuilder message = new StringBuilder(); string relativeUri = string.Empty; @@ -94,7 +104,7 @@ namespace Juick.ViewModels Debug.WriteLine("Received: " + message.ToString()); }; - EnableNotifications(pushChannel.ChannelUri.ToString()); + EnableNotifications(_pushChannel.ChannelUri.ToString()); } } private ObservableCollection<PageViewModel> _pages; @@ -120,6 +130,18 @@ namespace Juick.ViewModels } } + private bool _isNetworkUnavailable; + public bool NetworkUnavailable + { + get { return _isNetworkUnavailable; } + set + { + _isNetworkUnavailable = value; + NotifyPropertyChanged(IsNetworkAvailablePropertyName); + } + } + + private AccountManager _acc; public AccountManager Account diff --git a/Juick/ViewModels/PageViewModel.cs b/Juick/ViewModels/PageViewModel.cs index e398caf..ce48449 100644 --- a/Juick/ViewModels/PageViewModel.cs +++ b/Juick/ViewModels/PageViewModel.cs @@ -72,6 +72,8 @@ namespace Juick.ViewModels _context.Client.ExecuteAsync<List<Message>>(request, response => { _context.IsDataLoading = false; + if (response.Data == null) + return; response.Data.Select(x => new PostItem(x)).ToList().ForEach(i => Items.Add(i)); }); _context.IsDataLoading = true; |