using System; using System.Collections.Generic; using System.Linq; using System.Net; using System.Windows; using System.Windows.Controls; using System.Windows.Documents; using System.Windows.Input; using System.Windows.Media; using System.Windows.Media.Animation; using System.Windows.Shapes; using System.IO; using System.Collections.ObjectModel; using System.Threading; using Microsoft.Phone.Shell; using Microsoft.Phone.Notification; using WindowsPhone.Recipes.Push.Client.Services; using WindowsPhone.Recipes.Push.Client.Controls; namespace WindowsPhone.Recipes.Push.Client.Views { public partial class InboxView : UserControl { #region Fields /// Url of the GetTileImage REST service. private static readonly string GetTileImageService = App.ServerAddress + "/ImageService/GetTileImage?uri={0}"; private readonly ObservableCollection _rawMessages = new ObservableCollection(); private ShellTileSchedule _tileSchedule; #endregion #region Properties public ObservableCollection RawMessages { get { return _rawMessages; } } public IEnumerable ServerImages { get { return new string[] { "number0.png", "number1.png", "number2.png", "number3.png", "number4.png", "number5.png", "number6.png", "number7.png", "number8.png", "number9.png" }; } } public string SelectedServerImage { get { return (string)GetValue(SelectedServerImageProperty); } set { SetValue(SelectedServerImageProperty, value); } } // Using a DependencyProperty as the backing store for SelectedServerImage. This enables animation, styling, binding, etc... public static readonly DependencyProperty SelectedServerImageProperty = DependencyProperty.Register( "SelectedServerImage", typeof(string), typeof(InboxView), new PropertyMetadata("number0.png")); public IEnumerable PushPatterns { get { return new string[] { "One Time", "Counter", "Ask to Pin", "Custom Tile", "Tile Schedule" }; } } public string PushPattern { get { return (string)GetValue(PushPatternProperty); } set { SetValue(PushPatternProperty, value); } } // Using a DependencyProperty as the backing store for PushPattern. This enables animation, styling, binding, etc... public static readonly DependencyProperty PushPatternProperty = DependencyProperty.Register( "PushPattern", typeof(string), typeof(InboxView), new PropertyMetadata(null, PushPatternChanged)); private static void PushPatternChanged(DependencyObject d, DependencyPropertyChangedEventArgs e) { var view = d as InboxView; if ("Tile Schedule".CompareTo(e.NewValue) == 0) { VisualStateManager.GoToState(view, "ScheduleView", false); } else { VisualStateManager.GoToState(view, "NormalView", false); } } public int Counter { get { return (int)GetValue(CounterProperty); } set { SetValue(CounterProperty, value); } } // Using a DependencyProperty as the backing store for Counter. This enables animation, styling, binding, etc... public static readonly DependencyProperty CounterProperty = DependencyProperty.Register( "Counter", typeof(int), typeof(InboxView), new PropertyMetadata(0)); public string TileScheduleParameter { get { return (string)GetValue(TileScheduleParameterProperty); } set { SetValue(TileScheduleParameterProperty, value); } } // Using a DependencyProperty as the backing store for TileScheduleParameter. This enables animation, styling, binding, etc... public static readonly DependencyProperty TileScheduleParameterProperty = DependencyProperty.Register( "TileScheduleParameter", typeof(string), typeof(InboxView), new PropertyMetadata("number0.png")); #endregion public InboxView() { DataContext = this; InitializeComponent(); Loaded += InboxView_Loaded; Unloaded += InboxView_Unloaded; UpdateServerInfo(); } private void InboxView_Unloaded(object sender, RoutedEventArgs e) { UnregisterRawNotification(); } private void InboxView_Loaded(object sender, RoutedEventArgs e) { RegisterRawNotification(); } private void UpdateServerInfo() { try { var pushService = new PushServiceClient(); pushService.GetServerInfoCompleted += (s1, e1) => { try { pushService.CloseAsync(); if (e1.Result != null) { Dispatcher.BeginInvoke(() => { PushPattern = e1.Result.PushPattern; Counter = e1.Result.Counter; }); } } catch (Exception ex) { ex.Show(); } }; pushService.GetServerInfoAsync(); } catch (Exception ex) { ex.Show(); } } private void RegisterRawNotification() { var context = PushContext.Current; if (context != null) { context.RawNotification += context_RawNotification; } } private void UnregisterRawNotification() { var context = PushContext.Current; if (context != null) { context.RawNotification -= context_RawNotification; } } private void context_RawNotification(object sender, HttpNotificationEventArgs e) { try { using (var stream = new StreamReader(e.Notification.Body)) { var rawMessage = stream.ReadToEnd(); _rawMessages.Insert(0, rawMessage); if ("AskToPin".CompareTo(rawMessage) == 0) { AskToPin(); } UpdateServerInfo(); } } catch (Exception ex) { ex.Show(); } } private void AskToPin() { NotificationBox.Show("Important", "Please pin your application to Start Screen so this application can work properly."); } private void ButtonSchedule_Click(object sender, RoutedEventArgs e) { _tileSchedule = new ShellTileSchedule(); _tileSchedule.Recurrence = UpdateRecurrence.Interval; _tileSchedule.StartTime = DateTime.Now; _tileSchedule.Interval = UpdateInterval.EveryHour; _tileSchedule.RemoteImageUri = new Uri(string.Format(GetTileImageService, TileScheduleParameter)); _tileSchedule.Start(); } private void ButtonTestNow_Click(object sender, RoutedEventArgs e) { try { var pushService = new PushServiceClient(); pushService.UpdateTileCompleted += (s1, e1) => { try { pushService.CloseAsync(); } catch (Exception ex) { ex.Show(); } }; pushService.UpdateTileAsync(PushContext.Current.NotificationChannel.ChannelUri, SelectedServerImage); } catch (Exception ex) { ex.Show(); } } } }