private bool AskMessageInfo(String msgId, String msgStamp) { Boolean result = false; ManualResetEvent manualEvent = new ManualResetEvent(false); XamarinApplication.RbInstantMessaging.GetOneMessageFromConversationId(this.conversationId, msgId, msgStamp, callback => { if (callback.Result.Success) { result = true; Rainbow.Model.Message rbMessage = callback.Data; if (rbMessage != null) { List <Model.Message> messagesList = GetMessagesByReplyId(msgId); foreach (Model.Message message in messagesList) { SetReplyPartOfMessage(message, rbMessage); } } } manualEvent.Set(); }); manualEvent.WaitOne(); manualEvent.Dispose(); return(result); }
private void SdkWrapper_FileUploadUpdated(object sender, FileUploadEventArgs e) { if (e.FileDescriptor.Id == uploadFileDescriptorIdInProgress) { if (!e.InProgress) { FileUploadModel fileUploadModel = GetFileUploadByFileDescriptorId(uploadFileDescriptorIdInProgress); if (e.Completed) { // Send message Conversation conversation = Helper.SdkWrapper.GetConversationByPeerIdFromCache(fileUploadModel.PeerId); Rainbow.Model.Message message = fileUploadModel.RbMessage; Helper.SdkWrapper.SendMessage(conversation, ref message); // Remove this file from dictionaries RemoveFileByFullPath(fileUploadModel.FileFullPath); // The stream is closed in this method } else { UploadCannnotBeDone(fileUploadModel); } // The upload is finished uploadFileDescriptorIdInProgress = null; // Use upload pool UseUploadPool(); } } }
private Rainbow.Model.Message CreateRbMessage(FileUploadModel fileUploadModel, String toJid) { String fromJid = Helper.SdkWrapper.GetCurrentContactJid(); String fromResource = Helper.SdkWrapper.GetResourceId(); Restrictions.SDKMessageStorageMode messageStorageMode = Helper.SdkWrapper.GetMessageStorageMode(); // Create Rainbow.Message Rainbow.Model.Message message = Rainbow.Model.Message.FromTextAndFileDescriptor(fromJid, fromResource, toJid, fileUploadModel.PeerType, "", fileUploadModel.Urgency, null, null, messageStorageMode, fileUploadModel.FileDescriptor); message.Content = ""; return(message); }
private void AskMessageInfo() { Helper.SdkWrapper.GetOneMessageFromConversationId(message.ConversationId, message.Reply.Id, message.Reply.Stamp, callback => { if (callback.Result.Success) { Rainbow.Model.Message rbMessage = callback.Data; if (rbMessage != null) { log.LogDebug("[AskMessageInfo] Id:[{0}] - Reply.Id:[{1}] - Content:[2}]", message.Id, message.Reply.Id, rbMessage.Content); SetReplyPartOfMessage(rbMessage); } } }); }
private void MessageContentReply_BindingContextChanged(object sender, EventArgs e) { if (BindingContext != null) { try { message = (MessageElementModel)BindingContext; } catch { } if ((message != null) && !String.IsNullOrEmpty(message.ConversationId)) { String backgroundColorKey; if ((message.Peer.Id != Helper.SdkWrapper.GetCurrentContactId()) || usedAsInput) { backgroundColorKey = "ColorConversationStreamMessageOtherUserBackGround"; } else { backgroundColorKey = "ColorConversationStreamMessageCurrentUserBackGround"; } BackgroundColor = Helper.GetResourceDictionaryById <Color>(backgroundColorKey); // By default there is no Image visible Image.IsVisible = true; InitEvents(); // We need to get Name and text of the replied message ... Rainbow.Model.Message rbRepliedMessage = Helper.SdkWrapper.GetOneMessageFromConversationIdFromCache(message.ConversationId, message.Reply.Id); if (rbRepliedMessage != null) { log.LogDebug("[MessageContentReply_BindingContextChanged] Id:[{0}] - Reply.Id:[{1}] - Content:[2}]", message.Id, message.Reply.Id, rbRepliedMessage.Content); SetReplyPartOfMessage(rbRepliedMessage); } else { AskMessageInfo(); } } } }
private void SetReplyPartOfMessage(Model.Message message, Rainbow.Model.Message rbRepliedMessage) { // Store Jid of the message sender message.ReplyPeerJid = rbRepliedMessage.FromJid; if (String.IsNullOrEmpty(rbRepliedMessage.Content)) { if (rbRepliedMessage.FileAttachment != null) { message.ReplyBody = rbRepliedMessage.FileAttachment.Name; } else { message.ReplyBody = rbRepliedMessage.Id; // Bad display but should permit to debug this situation } } else { message.ReplyBody = rbRepliedMessage.Content; } log.Debug("[SetReplyPartOfMessage] - message.Id:[{0}] - replyMsgId:[{1}] - replyBody:[{2}] - ContactJid:[{3}]", message.Id, rbRepliedMessage.Id, message.ReplyBody, rbRepliedMessage.FromJid); Rainbow.Model.Contact contactReply = XamarinApplication.RbContacts.GetContactFromContactJid(rbRepliedMessage.FromJid); if (contactReply != null) { // Reply part is visible message.ReplyPartIsVisible = "True"; message.ReplyPeerId = contactReply.Id; message.ReplyPeerDisplayName = Util.GetContactDisplayName(contactReply); } else { log.Debug("[SetReplyPartOfMessage] - message.Id:[{0}] - replyMsgId:[{1}] - UnknownContactJid[{2}]", message.Id, rbRepliedMessage.Id, rbRepliedMessage.FromJid); // We ask to have more info about this contact using AvatarPool avatarPool.AddUnknownContactToPoolByJid(rbRepliedMessage.FromJid); } // We store info about this contact in reply context AddRepliedContactInvolved(rbRepliedMessage.FromJid); }
private InstantMessaging.Model.Message GetMessageFromRBMessage(Rainbow.Model.Message rbMessage, String conversationType) { InstantMessaging.Model.Message message = null; if (rbMessage != null) { InstantMessaging.App XamarinApplication = (InstantMessaging.App)Xamarin.Forms.Application.Current; AvatarPool avatarPool = AvatarPool.Instance; //log.Debug("[GetMessageFromRBMessage] Message.Id:[{0}] - Message.ReplaceId:[{1}] - DateTime:[{2}] - Content:[{3}]", rbMessage.Id, rbMessage.ReplaceId, rbMessage.Date.ToString("o"), rbMessage.Content); message = new InstantMessaging.Model.Message(); message.EventMessageBodyPart2Color = Color.Black; // Set default value Rainbow.Model.Contact contact = XamarinApplication.RbContacts.GetContactFromContactJid(rbMessage.FromJid); if (contact != null) { message.PeerId = contact.Id; message.PeerDisplayName = Util.GetContactDisplayName(contact); message.BackgroundColor = Color.FromHex(Rainbow.Helpers.AvatarPool.GetColorFromDisplayName(message.PeerDisplayName)); } else { message.BackgroundColor = Color.FromHex(Rainbow.Helpers.AvatarPool.GetColorFromDisplayName("")); // We ask to have more info about this contact usin AvatarPool avatarPool.AddUnknownContactToPoolByJid(rbMessage.FromJid); } // We have the display name only in Room / Bubble context message.PeerDisplayNameIsVisible = (conversationType == Rainbow.Model.Conversation.ConversationType.Room) ? "True" : "False"; message.Id = rbMessage.Id; message.PeerJid = rbMessage.FromJid; message.MessageDateTime = rbMessage.Date; message.MessageDateDisplay = Helper.HumanizeDateTime(rbMessage.Date); // Receipt SetReceiptPartOfMessage(message, rbMessage.Receipt); // Is-it an "Event message" ? String content; if (!String.IsNullOrEmpty(rbMessage.BubbleEvent)) { message.IsEventMessage = "True"; message.EventMessageBodyPart1 = Helper.GetBubbleEventMessageBody(contact, rbMessage.BubbleEvent); } // Is-it an "CallLog message" ? else if (rbMessage.CallLogAttachment != null) { SetCallLogPartOfMessage(message, rbMessage.CallLogAttachment); } else { message.IsEventMessage = "False"; message.BodyFontAttributes = FontAttributes.None; message.BodyColor = (message.PeerJid == currentContactJid) ? Color.Black : Color.White; if (!String.IsNullOrEmpty(rbMessage.Content)) { content = rbMessage.Content; } else { if (String.IsNullOrEmpty(rbMessage.ReplaceId)) { content = ""; } else { content = "This message was deleted."; message.BodyFontAttributes = FontAttributes.Italic; message.BodyColor = (message.PeerJid == currentContactJid) ? Color.Gray : Color.FromHex(Rainbow.Helpers.AvatarPool.GetDarkerColorFromDisplayName(message.PeerDisplayName)); } } // Edited text visible ? message.EditedIsVisible = String.IsNullOrEmpty(rbMessage.ReplaceId) ? "False" : "True"; // Reply part // By default is not displayed message.ReplyPartIsVisible = "False"; if (rbMessage.ReplyMessage != null) { // Store Id of this reply message message.ReplyId = rbMessage.ReplyMessage.Id; // Set background color message.ReplyBackgroundColor = Color.FromHex(Rainbow.Helpers.AvatarPool.GetDarkerColorFromDisplayName(message.PeerDisplayName)); // We need to get Name and text of the replied message ... Rainbow.Model.Message rbRepliedMessage = XamarinApplication.RbInstantMessaging.GetOneMessageFromConversationIdFromCache(this.conversationId, rbMessage.ReplyMessage.Id); if (rbRepliedMessage != null) { SetReplyPartOfMessage(message, rbRepliedMessage); } else { AddUnknownRepliedMessageInvolved(rbMessage.ReplyMessage.Id, rbMessage.ReplyMessage.Stamp); } } else { // Set default color to avoir warning message.ReplyBackgroundColor = Color.White; } // FileAttachment if (rbMessage.FileAttachment != null) { // Set Global info message.FileAttachmentIsVisible = "True"; message.FileDefaultInfoIsVisible = "True"; message.FileId = rbMessage.FileAttachment.Id; message.FileName = rbMessage.FileAttachment.Name; message.FileSize = Helper.HumanizeFileSize(rbMessage.FileAttachment.Size); if (filePool.IsThumbnailFileAvailable(conversationId, rbMessage.FileAttachment.Id, rbMessage.FileAttachment.Name)) { SetFileAttachmentSourceOfMessage(message, rbMessage.FileAttachment.Id); } else { // Ask more info about this file filePool.AskFileDescriptorDownload(this.conversationId, rbMessage.FileAttachment.Id); // Set default icon message.FileAttachmentSource = "icon_unknown_blue"; message.FileAttachmentSourceWidth = 50; message.FileAttachmentSourceHeight = 50; } } else { message.FileAttachmentIsVisible = "False"; message.FileDefaultInfoIsVisible = "False"; message.FileAttachmentSourceWidth = 0; message.FileAttachmentSourceHeight = 0; } message.Body = content; message.BodyIsVisible = String.IsNullOrEmpty(message.Body) ? "False" : "True"; } // We store info about this contact in message context AddContactInvolved(message.PeerJid); } return(message); }
private void SetReplyPartOfMessage(Rainbow.Model.Message rbRepliedMessage) { if (message == null) { return; } if (message.Reply == null) { return; } // Store Jid of the message sender message.Reply.Peer.Jid = rbRepliedMessage.FromJid; peerJid = rbRepliedMessage.FromJid; if (String.IsNullOrEmpty(rbRepliedMessage.Content)) { if (rbRepliedMessage.FileAttachment != null) { message.Reply.Content.Body = rbRepliedMessage.FileAttachment.Name; message.Reply.Content.Attachment = new MessageAttachmentModel() { Id = rbRepliedMessage.FileAttachment.Id, Name = rbRepliedMessage.FileAttachment.Name, Size = Helper.HumanizeFileSize(rbRepliedMessage.FileAttachment.Size) }; attachmentId = message.Reply.Content.Attachment.Id; // Need to manage Thumbnail if (Helper.SdkWrapper.IsThumbnailFileAvailable(message.ConversationId, attachmentId, message.Reply.Content.Attachment.Name)) { UpdateThumbnailDisplay(); } else { // Manage event(s) from FilePool Helper.SdkWrapper.ThumbnailAvailable += SdkWrapper_ThumbnailAvailable; // Ask more info about this file Helper.SdkWrapper.AskFileDescriptorDownload(message.ConversationId, attachmentId); DisplayAttachment(rbRepliedMessage.FileAttachment.Name); } } else { message.Reply.Content.Body = "File id: " + rbRepliedMessage.Id; // Bad display but should permit to debug this situation } } else { message.Reply.Content.Body = Helper.ReplaceCRLFFromString(rbRepliedMessage.Content, " "); } log.LogDebug("[SetReplyPartOfMessage] - message.Id:[{0}] - replyMsgId:[{1}] - replyBody:[{2}] - ContactJid:[{3}]", message.Id, rbRepliedMessage.Id, message.Reply.Content.Body, rbRepliedMessage.FromJid); if (!UpdateContactInfo()) { log.LogDebug("[SetReplyPartOfMessage] - message.Id:[{0}] - replyMsgId:[{1}] - Unknown Contact Jid:[{2}]", message.Id, rbRepliedMessage.Id, rbRepliedMessage.FromJid); // We ask to have more info about this contact using AvatarPool Helper.SdkWrapper.AddUnknownContactToPoolByJid(rbRepliedMessage.FromJid); } else { UpdateDisplay(); } }