using System; using MMEA.MessageCenter.Events; using Xamarin.Essentials; namespace MMEA.MessageCenter { /// <summary> /// Wrapper used to communicate with classes through the Xamarin.MessagingCenter /// </summary> /// <remarks> /// Made for easier debugging /// </remarks> public interface IApplicationMessageCenter { /// <summary> /// Listen to messages send through the Messaging Center /// </summary> /// <param name="subscribableMessage"></param> /// <param name="callback"></param> /// <typeparam name="T">Type of the content that is within the message</typeparam> void Subscribe<T>(SubscribableMessage<T> subscribableMessage, Action<IApplicationMessageCenter, T> callback); /// <summary> /// Send a message to the MessagingCenter /// </summary> /// <param name="message"></param> /// <typeparam name="T">Type of the content send</typeparam> void Send<T>(SubscribableMessage<T> message); } /// <inheritdoc /> public class ApplicationMessageCenter : IApplicationMessageCenter { private readonly IMessagingCenter _messageCenter; /// <summary> /// Default constructor /// </summary> /// <param name="messagingCenter"></param> public ApplicationMessageCenter(IMessagingCenter messagingCenter) { _messageCenter = messagingCenter; } /// <inheritdoc /> public void Subscribe<T>(SubscribableMessage<T> subscribableMessage, Action<IApplicationMessageCenter, T> callback) { _messageCenter.Subscribe(this, subscribableMessage.MessageName, callback); } /// <inheritdoc /> public void Send<T>(SubscribableMessage<T> message) { _messageCenter.Send<IApplicationMessageCenter, T>(this, message.MessageName, message.Content); } } public static class Messages { public static SubscribableMessage<ConnectivityChangedEventArgs> ConnectivityChanged( ConnectivityChangedEventArgs eventArgs = null) { return new SubscribableMessage<ConnectivityChangedEventArgs> { MessageName = "ConnectivityChanged", Content = eventArgs }; } public static SubscribableMessage<float?> ButtonOpacityChange(float? opacity) { return new SubscribableMessage<float?> { MessageName = "ButtonOpacityChange", Content = opacity }; } public static SubscribableMessage<object> MonitorActivation() { return new SubscribableMessage<object> { MessageName = "MonitorActivation", Content = null }; } public static SubscribableMessage<LoadMessageCarouselEvent> OpenMessageCarousel( LoadMessageCarouselEvent carouselEvent = null) { return new SubscribableMessage<LoadMessageCarouselEvent> { MessageName = "OpenMessageCarousel", Content = carouselEvent }; } public static SubscribableMessage<int?> NotificationOpened(int? remoteMessageId = null) { return new SubscribableMessage<int?> { MessageName = "NotificationOpened", Content = remoteMessageId }; } public static SubscribableMessage<object> DeviceActivated() { return new SubscribableMessage<object> { MessageName = "DeviceActivated", Content = null }; } public static SubscribableMessage<Guid?> MessageViewed(Guid? messageId = null) { return new SubscribableMessage<Guid?> { MessageName = "MessageViewed", Content = messageId }; } public static SubscribableMessage<LikedMessageEvent> MessageLiked(LikedMessageEvent linkedMessageEvent = null) { return new SubscribableMessage<LikedMessageEvent> { MessageName = "MessageLiked", Content = linkedMessageEvent }; } public static SubscribableMessage<object> RefreshTranslationLabels() { return new SubscribableMessage<object> { MessageName = "RefreshTranslationLabels", Content = null }; } public static SubscribableMessage<string> SearchExecuted(string content = null) { return new SubscribableMessage<string> { MessageName = "SearchExecuted", Content = content }; } public static SubscribableMessage<bool> ChangeOrientationAllowance(bool allowed = false) { return new SubscribableMessage<bool> { MessageName = "ChangeOrientationAllowance", Content = allowed }; } public static SubscribableMessage<bool> SyncLocalMessages(bool forceRefresh = false) { return new SubscribableMessage<bool> { MessageName = "SyncLocalMessages", Content = forceRefresh }; } public static SubscribableMessage<bool> LocalMessagesSynced(bool forceRefresh = false) { return new SubscribableMessage<bool> { MessageName = "LocalMessagesSynced", Content = forceRefresh }; } public static SubscribableMessage<int?> AddMessage(int? messageId = null) { return new SubscribableMessage<int?> { MessageName = "AddMessage", Content = messageId }; } } public class SubscribableMessage<T> { public string MessageName { get; set; } public T Content { get; set; } } }