From ee46fb9228fd6e70893270703d814a400bb8ca22 Mon Sep 17 00:00:00 2001 From: Vitaly Takmazov Date: Fri, 26 Apr 2013 22:04:18 +0400 Subject: Fixed crash when network is unavailable, added warning message --- Juick/Classes/BooleanToVisibiltyConverter.cs | 24 +++++++++++++ Juick/Juick.csproj | 1 + Juick/MainPage.xaml | 10 ++++-- Juick/ViewModels/AppViewModel.cs | 52 ++++++++++++++++++++-------- Juick/ViewModels/PageViewModel.cs | 2 ++ 5 files changed, 71 insertions(+), 18 deletions(-) create mode 100644 Juick/Classes/BooleanToVisibiltyConverter.cs 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 @@ App.xaml + 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"> + + + + - - + + 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(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 _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>(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; -- cgit v1.2.3