private ClientNotificationWithAcknowledgement CreateMessageReceivedNotification(Message message, ServerNotification serverNotification)
		{
			var notification = new ClientNotificationWithAcknowledgement
			{
				{"type", "MessageReceived"},
				{"senderInternalUserId", message.SenderInternalUserId},
				{"messageId", message.MessageId},
				{"senderMessageId", message.SenderMessageId},
				{"receivedExpired", message.ExpiryTimeStamp.HasValue && message.ExpiryTimeStamp <= DateTime.UtcNow},
				{"messageType", message.MessageType},
				{"messageScope", message.MessageScope},
				{"sentTimestamp", message.SentTimestamp},
				{"contextItems", message.ContextItems},
			};

			notification.AcknowledgementDetail = new ClientNotificationAcknowledgement
			{
				Result = NotificationResult.Delivered,
				ServerNotificationId = serverNotification.NotificationId,
				SentTime = serverNotification.CreatedOn,
				Type = serverNotification.Type
			};

			return notification;
		}
		private TimeSpan CalculatedTimeToRead(Message message)
		{
			if(!(message.ReceivedTimestamp.HasValue && message.ReadTimestamp.HasValue))
			{
				return TimeSpan.Zero;
			}

			return message.ReadTimestamp.Value - message.ReceivedTimestamp.Value;
		}
		public async Task NotifyMessageReadAsync(Message message)
		{
			var notification = CreateMessageReadNotification(message);
			await _notificationManager.QueueClientNotificationAsync(notification);
			if (_appState.IsOpen)
			{
				_notificationManager.SynchroniseAsync().ExecuteInBackground();
			}
		}
		private ClientNotification CreateMessageReadNotification(Message message)
		{
			var notification = new ClientNotification
			{
				{"type", "MessageRead"},
				{"senderInternalUserId", message.SenderInternalUserId},
				{"messageId", message.MessageId},
				{"senderMessageId", message.SenderMessageId},
				{"messageType", message.MessageType},
				{"messageScope", message.MessageScope},
				{"sentTimestamp", message.SentTimestamp},
				{"contextItems", message.ContextItems},
				{"timeToReadSeconds", (int)CalculatedTimeToRead(message).TotalSeconds}
			};

			return notification;
		}
		private ClientNotification CreateInteractionResultNotification(Message message, string interactionType, string buttonDescription, string userAction, DateTime interactionTime)
		{
			var notification = new ClientNotification
			{
				{"type", "InteractionResult"},
				{"senderInternalUserId", message.SenderInternalUserId},
				{"messageId", message.MessageId},
				{"senderMessageId", message.SenderMessageId},
				{"timeToInteractionSeconds", (int)(interactionTime - message.SentTimestamp).TotalSeconds},
				{"interactionTimeStamp", interactionTime},
				{"interactionType", interactionType},
				{"buttonDescription", buttonDescription},
				{"userAction", userAction},
				{"operatingSystem", _environmentInformation.OperatingSystem},
				{"messageSentTimestamp", message.SentTimestamp},
				{"contextItems", message.ContextItems},
			};

			return notification;
		}
		private async Task SendInteractionResultAsync(Message message, string interactionType, string buttonDescription, string userAction, DateTime interactionTime)
		{
			var notification = CreateInteractionResultNotification(message, interactionType, buttonDescription, userAction, interactionTime);
			await _notificationManager.QueueClientNotificationAsync(notification);

			var storedMessage = await _pushDataContext.SimplePushMessages.GetAsync(message.MessageId);
			if (storedMessage != null)
			{
				// We are done with this message now, delete it
				await _pushDataContext.SimplePushMessages.DeleteAsync(storedMessage.Id);
				await _pushDataContext.SaveChangesAsync();
			}
		}
		private static void CreateBasicAlertView(Message message, out SimplePushAlertView alertView, out DisplayAlertEvent displayAlertEvent, string bodyOverride = null)
		{
			alertView = new SimplePushAlertView();
			var avatarId = message.AvatarAssetId;
			if (!String.IsNullOrEmpty(avatarId))
			{
				var assetHelper = DonkyCore.Instance.GetService<IAssetHelper>();
				alertView.Image.Source = new UriImageSource
				{
					Uri = new Uri(assetHelper.CreateUriForAsset(avatarId))
				};
			}
			alertView.TitleLabel.Text = message.SenderDisplayName;
			alertView.BodyLabel.Text = bodyOverride ?? message.Body;

			displayAlertEvent = new DisplayAlertEvent
			{
				Content = alertView
			};
		}