/// <summary> /// Инициализировать приложение. /// </summary> public static void Initialize(string tileId, bool restored = false) { if (restored) { (ServiceLocator.Current.GetInstance <SidebarViewModel>()).Activate(); ServiceHelper.VKLongPollService.StartLongPolling(); ServiceLocator.Current.GetInstance <IAppMessagesService>().StartAndRestore(); ServiceLocator.Current.GetInstance <IPromoService>().Update(); ProcessTile(tileId); return; } var message = new NavigateToPageMessage { Operation = NavigationType.New }; if (ServiceLocator.Current.GetInstance <SettingsService>().AccessToken == null) { message.Page = AppViews.LoginView; } else { message.Page = AppViews.NewsView; (ServiceLocator.Current.GetInstance <SidebarViewModel>()).Activate(); ServiceHelper.VKLongPollService.StartLongPolling(); ServiceLocator.Current.GetInstance <IAppMessagesService>().StartAndRestore(); ServiceLocator.Current.GetInstance <IPromoService>().Update(); } if (!ProcessTile(tileId)) { Messenger.Default.Send(message); } }
/// <summary> /// Отправляет Push-уведомление внутри приложения. /// </summary> /// <param name="conversation">Беседа, уведомление для которой нужно отправить.</param> /// <param name="message">Сообщение для отправки.</param> private void SendPush(IConversation conversation, VKMessage message) { if ((message.Type & VKMessageType.Sent) == VKMessageType.Sent) { return; } var navParameter = new NavigateToPageMessage { Page = AppViews.ConversationView, Parameter = conversation.ID }; string title = null; if (message.IsChatMessage) { title = String.Format("{0}\n{1}", message.Sender.FullName, conversation.Title); } else { title = message.Sender.FullName; } CoreHelper.SendInAppPush(message.Body, title, PopupMessageType.Default, message.Sender.Photo50, parameter: navParameter); }
private object ReceiveMessage(NavigateToPageMessage action) { var page = string.Format("/Views/{0}View.xaml", action.PageName); NavigationService.Navigate(new System.Uri(page, System.UriKind.Relative)); return(null); }
private void OnNavigateToPage(NavigateToPageMessage message) { string[] parameters = message.Page.Split(new Char[] { '|' }); message.Page = parameters[0]; Type type; if (message.Page.StartsWith("/MainView")) { string TotalPath = "VKClientFinalW8MVVM." + message.Page.Substring(1); type = Type.GetType(TotalPath, false); } else { string TotalPath = "VKClient.Views." + message.Page.Substring(1); //string TotalPath = "VKClientFinalW8MVVM.Views." + message.Page.Substring(1); type = Type.GetType(TotalPath, false); } if (type == null) { if (Debugger.IsAttached) { Debugger.Break(); } return; } if (typeof(Page).GetTypeInfo().IsAssignableFrom(type.GetTypeInfo())) { Frame frame = (Frame)Window.Current.Content; frame.Navigate(type, parameters); return; } //DialogService.DisplayPopup(type, message.Parameters, null); }
private object ReceiveNavigationMessage(NavigateToPageMessage message) { StringBuilder sb = new StringBuilder("/Views/"); sb.Append(message.PageName); sb.Append(".xaml"); NavigationService.Navigate( new System.Uri(sb.ToString(), System.UriKind.Relative)); return(null); }
private void OnNavigateToPage(NavigateToPageMessage message) { Type type = Type.GetType("Meridian.View." + message.Page.Substring(1), false); if (type == null) { if (Debugger.IsAttached) { Debugger.Break(); } return; } var frame = Application.Current.MainWindow.GetVisualDescendents().OfType <Frame>().FirstOrDefault(); if (frame == null) { return; } if (Settings.Instance.SendStats) { YandexMetrica.ReportEvent("page" + message.Page); } if (typeof(Layout.PageBase).IsAssignableFrom(type)) { var page = (Layout.PageBase)Activator.CreateInstance(type); page.NavigationContext.Parameters = message.Parameters; frame.Navigate(page); } else if (typeof(PageBase).IsAssignableFrom(type)) { var page = (PageBase)Activator.CreateInstance(type); page.NavigationContext.Parameters = message.Parameters; frame.Navigate(page); } else if (typeof(Page).IsAssignableFrom(type)) { frame.Navigate(Activator.CreateInstance(type)); } UpdateCanGoBack(); }
/// <summary> /// Вызывается при получении новых сообщений через LongPoll. /// </summary> private async void VKLongPollService_MessagesReceived(object sender, MessagesReceivedEventArgs e) { var ids = new ulong[e.Messages.Count]; for (int i = 0; i < e.Messages.Count; i++) { ids[i] = e.Messages[i].MessageID; } List <VKMessage> resultMessages = null; bool success = false; byte numOfRetries = 0; while (!success && numOfRetries <= 3) { var request = new GetByIDRequest { MessageIDs = ids.ToList() }; var response = await request.ExecuteAsync(); if (response.Error.ErrorType == VKErrors.None) { success = true; resultMessages = response.Response.Items; } else { numOfRetries++; CoreHelper.SendInAppPush( "Ошибка соединения.\nПовтор через " + 3 * numOfRetries + " секунд", null, PopupMessageType.Warning); await Task.Delay(3000 *numOfRetries); } } if (!success) { CoreHelper.SendInAppPush( "Не удалось получить подробные сообщения", "LongPoll", PopupMessageType.Error); return; } var unknownUsers = new Dictionary <ulong, List <VKMessage> >(); var conversations = new Dictionary <long, List <VKMessage> >(); foreach (var msg in resultMessages) { long key = msg.IsChatMessage ? -msg.ChatID : (long)msg.UserID; if (conversations.ContainsKey(key)) { conversations[key].Add(msg); } else { var list = new List <VKMessage>(); list.Add(msg); conversations[key] = list; } if (CachedUsers.ContainsKey(msg.UserID)) { msg.Sender = CachedUsers[msg.UserID]; } else { if (unknownUsers.ContainsKey(msg.UserID)) { unknownUsers[msg.UserID].Add(msg); } else { var list = new List <VKMessage>(); list.Add(msg); unknownUsers[msg.UserID] = list; } } } success = unknownUsers.Count == 0; numOfRetries = 0; while (!success && numOfRetries <= 3) { var usersRequest = new GetUsersRequest() { UserIDs = unknownUsers.Keys.ToList() }; var usersResponse = await usersRequest.ExecuteAsync(); if (usersResponse.Error.ErrorType == VKErrors.None) { success = true; foreach (var user in usersResponse.Response) { var sUser = new VKProfileChat() { ID = user.ID, FirstName = user.FirstName, LastName = user.LastName, Online = user.Online, Photo50 = user.Photo50 }; var list = unknownUsers[user.ID]; for (int i = 0; i < list.Count; i++) { list[i].Sender = sUser; } CachedUsers[sUser.ID] = sUser; } } else { numOfRetries++; CoreHelper.SendInAppPush( "Ошибка соединения.\nПовтор через " + 3 * numOfRetries + " секунд", null, PopupMessageType.Warning); await Task.Delay(3000 *numOfRetries); } } if (!success) { CoreHelper.SendInAppPush( "Не удалось получить информацию о пользователях сообщений", null, PopupMessageType.Error); } foreach (long convID in conversations.Keys) { var msgsList = conversations[convID]; var cachedConv = Conversations.Keys.FirstOrDefault(c => c.ID == convID); if (cachedConv != null) { var list = Conversations[cachedConv]; foreach (var msg in msgsList) { list.Insert(0, msg); } } else { MessagesCollection list = null; if (convID < 0) { list = new MessagesCollection((uint)-convID); } else { list = new MessagesCollection((ulong)convID); } cachedConv = await ServiceHelper.MessagesCacheService.GetConversationFromCache(convID); if (cachedConv != null) { foreach (var msg in cachedConv.CachedMessages) { list.Add(msg); } } else { if (convID < 0) { success = false; numOfRetries = 0; while (!success && numOfRetries <= 3) { var request = new GetChatRequest() { ChatID = -convID, IsSingle = true, Fields = new List <VKUserFields> { VKUserFields.photo_50, VKUserFields.online, VKUserFields.sex } }; var response = await request.ExecuteAsync(); if (response.Error.ErrorType == VKErrors.None) { success = true; cachedConv = new CachedConversationOld { ID = convID, Title = response.Response.Title, Users = new ObservableCollection <VKProfileChat>(response.Response.Users), CachedMessages = msgsList, AdminID = response.Response.AdminID }; Conversations[cachedConv] = list; foreach (var user in cachedConv.Users) { CachedUsers[user.ID] = user; } } else { numOfRetries++; CoreHelper.SendInAppPush( "Ошибка соединения.\nПовтор через " + 3 * numOfRetries + " секунд", null, PopupMessageType.Warning); await Task.Delay(3000 *numOfRetries); } } } else { success = false; numOfRetries = 0; while (!success && numOfRetries <= 3) { var request = new GetUsersRequest { UserID = (ulong)convID }; var response = await request.ExecuteAsync(); if (response.Error.ErrorType == VKErrors.None) { success = true; var user = response.Response[0]; cachedConv = new CachedConversationOld { ID = convID, Title = user.FullName, Users = new ObservableCollection <VKProfileChat> { new VKProfileChat { ID = user.ID, LastName = user.LastName, FirstName = user.FirstName, Photo50 = user.Photo50, Online = user.Online } } }; CachedUsers[user.ID] = cachedConv.Users[0]; } else { numOfRetries++; CoreHelper.SendInAppPush( "Ошибка соединения.\nПовтор через " + 3 * numOfRetries + " секунд", null, PopupMessageType.Warning); await Task.Delay(3000 *numOfRetries); } } } } foreach (var msg in msgsList) { list.Insert(0, msg); } //list.UpdateSimilar(); Conversations[cachedConv] = list; } await CacheConversation(cachedConv.ID); WorkOnDialog(msgsList.Last()); var lastMsg = msgsList.LastOrDefault(m => m.Type == VKMessageType.Received); if (lastMsg == null) { continue; } var navParameter = new NavigateToPageMessage { Page = AppViews.ConversationView, Parameter = convID }; CoreHelper.SendInAppPush(lastMsg.Body, cachedConv.Title, PopupMessageType.Default, lastMsg.Sender.Photo50, parameter: navParameter); } await ServiceHelper.MessagesCacheService.CacheDialogs(Dialogs.Take(20).ToList()); }
private void OnNavigateToPage(NavigateToPageMessage message) { Type type = Type.GetType("Meridian.View." + message.Page.Substring(1), false); if (type == null) { if (Debugger.IsAttached) Debugger.Break(); return; } var frame = Application.Current.MainWindow.GetVisualDescendents().OfType<Frame>().FirstOrDefault(); if (frame == null) return; if (Settings.Instance.SendStats) Counter.ReportEvent("page" + message.Page); if (typeof(PageBase).IsAssignableFrom(type)) { var page = (PageBase)Activator.CreateInstance(type); page.NavigationContext.Parameters = message.Parameters; frame.Navigate(page); } else if (typeof(Page).IsAssignableFrom(type)) { frame.Navigate(Activator.CreateInstance(type)); } UpdateCanGoBack(); }
/// <summary> /// Отправляет внутренее всплывающее уведомление. /// </summary> /// <param name="content">Содержимое уведомления.</param> /// <param name="title">Заголовок уведомления.</param> /// <param name="type">Тип уведомления.</param> /// <param name="imageUrl">Путь к картинке уведомления.</param> /// <param name="duration">Длительность уведомления.</param> /// <param name="parameter">Параметр навигации для уведомления.</param> /// <param name="actionToDo">Делегат для выполнения при нажатии уведомления.</param> public static void SendInAppPush(string content, string title = null, PopupMessageType type = PopupMessageType.Default, string imageUrl = null, TimeSpan duration = default(TimeSpan), NavigateToPageMessage parameter = null, Action actionToDo = null) { var pop = new PopupMessage() { Title = title, Content = content, Type = type, ImageUrl = imageUrl, Parameter = parameter, ActionToDo = actionToDo }; if (duration != default(TimeSpan)) { pop.Duration = duration; } Messenger.Default.Send(pop); }