summaryrefslogtreecommitdiff
path: root/Xamarin.Forms.Core/MessagingCenter.cs
diff options
context:
space:
mode:
Diffstat (limited to 'Xamarin.Forms.Core/MessagingCenter.cs')
-rw-r--r--Xamarin.Forms.Core/MessagingCenter.cs89
1 files changed, 20 insertions, 69 deletions
diff --git a/Xamarin.Forms.Core/MessagingCenter.cs b/Xamarin.Forms.Core/MessagingCenter.cs
index d5753e1d..b6a167da 100644
--- a/Xamarin.Forms.Core/MessagingCenter.cs
+++ b/Xamarin.Forms.Core/MessagingCenter.cs
@@ -2,28 +2,12 @@ using System;
using System.Collections.Generic;
using System.Linq;
using System.Reflection;
+using System.Runtime.CompilerServices;
namespace Xamarin.Forms
{
- public interface IMessagingCenter
+ public static class MessagingCenter
{
- void Send<TSender, TArgs>(TSender sender, string message, TArgs args) where TSender : class;
-
- void Send<TSender>(TSender sender, string message) where TSender : class;
-
- void Subscribe<TSender, TArgs>(object subscriber, string message, Action<TSender, TArgs> callback, TSender source = null) where TSender : class;
-
- void Subscribe<TSender>(object subscriber, string message, Action<TSender> callback, TSender source = null) where TSender : class;
-
- void Unsubscribe<TSender, TArgs>(object subscriber, string message) where TSender : class;
-
- void Unsubscribe<TSender>(object subscriber, string message) where TSender : class;
- }
-
- public class MessagingCenter : IMessagingCenter
- {
- public static IMessagingCenter Instance { get; } = new MessagingCenter();
-
class Sender : Tuple<string, Type, Type>
{
public Sender(string message, Type senderType, Type argType) : base(message, senderType, argType)
@@ -35,8 +19,8 @@ namespace Xamarin.Forms
class MaybeWeakReference
{
- WeakReference DelegateWeakReference { get; }
- object DelegateStrongReference { get; }
+ WeakReference DelegateWeakReference { get; set; }
+ object DelegateStrongReference { get; set; }
readonly bool _isStrongReference;
@@ -100,16 +84,11 @@ namespace Xamarin.Forms
}
}
- readonly Dictionary<Sender, List<Subscription>> _subscriptions =
+ static readonly Dictionary<Sender, List<Subscription>> s_subscriptions =
new Dictionary<Sender, List<Subscription>>();
public static void Send<TSender, TArgs>(TSender sender, string message, TArgs args) where TSender : class
{
- Instance.Send(sender, message, args);
- }
-
- void IMessagingCenter.Send<TSender, TArgs>(TSender sender, string message, TArgs args)
- {
if (sender == null)
throw new ArgumentNullException(nameof(sender));
InnerSend(message, typeof(TSender), typeof(TArgs), sender, args);
@@ -117,11 +96,6 @@ namespace Xamarin.Forms
public static void Send<TSender>(TSender sender, string message) where TSender : class
{
- Instance.Send(sender, message);
- }
-
- void IMessagingCenter.Send<TSender>(TSender sender, string message)
- {
if (sender == null)
throw new ArgumentNullException(nameof(sender));
InnerSend(message, typeof(TSender), null, sender, null);
@@ -129,11 +103,6 @@ namespace Xamarin.Forms
public static void Subscribe<TSender, TArgs>(object subscriber, string message, Action<TSender, TArgs> callback, TSender source = null) where TSender : class
{
- Instance.Subscribe(subscriber, message, callback, source);
- }
-
- void IMessagingCenter.Subscribe<TSender, TArgs>(object subscriber, string message, Action<TSender, TArgs> callback, TSender source)
- {
if (subscriber == null)
throw new ArgumentNullException(nameof(subscriber));
if (callback == null)
@@ -152,11 +121,6 @@ namespace Xamarin.Forms
public static void Subscribe<TSender>(object subscriber, string message, Action<TSender> callback, TSender source = null) where TSender : class
{
- Instance.Subscribe(subscriber, message, callback, source);
- }
-
- void IMessagingCenter.Subscribe<TSender>(object subscriber, string message, Action<TSender> callback, TSender source)
- {
if (subscriber == null)
throw new ArgumentNullException(nameof(subscriber));
if (callback == null)
@@ -175,32 +139,27 @@ namespace Xamarin.Forms
public static void Unsubscribe<TSender, TArgs>(object subscriber, string message) where TSender : class
{
- Instance.Unsubscribe<TSender, TArgs>(subscriber, message);
- }
-
- void IMessagingCenter.Unsubscribe<TSender, TArgs>(object subscriber, string message)
- {
InnerUnsubscribe(message, typeof(TSender), typeof(TArgs), subscriber);
}
public static void Unsubscribe<TSender>(object subscriber, string message) where TSender : class
{
- Instance.Unsubscribe<TSender>(subscriber, message);
+ InnerUnsubscribe(message, typeof(TSender), null, subscriber);
}
- void IMessagingCenter.Unsubscribe<TSender>(object subscriber, string message)
+ internal static void ClearSubscribers()
{
- InnerUnsubscribe(message, typeof(TSender), null, subscriber);
+ s_subscriptions.Clear();
}
- void InnerSend(string message, Type senderType, Type argType, object sender, object args)
+ static void InnerSend(string message, Type senderType, Type argType, object sender, object args)
{
if (message == null)
throw new ArgumentNullException(nameof(message));
var key = new Sender(message, senderType, argType);
- if (!_subscriptions.ContainsKey(key))
+ if (!s_subscriptions.ContainsKey(key))
return;
- List<Subscription> subcriptions = _subscriptions[key];
+ List<Subscription> subcriptions = s_subscriptions[key];
if (subcriptions == null || !subcriptions.Any())
return; // should not be reachable
@@ -219,24 +178,24 @@ namespace Xamarin.Forms
}
}
- void InnerSubscribe(object subscriber, string message, Type senderType, Type argType, object target, MethodInfo methodInfo, Filter filter)
+ static void InnerSubscribe(object subscriber, string message, Type senderType, Type argType, object target, MethodInfo methodInfo, Filter filter)
{
if (message == null)
throw new ArgumentNullException(nameof(message));
var key = new Sender(message, senderType, argType);
var value = new Subscription(subscriber, target, methodInfo, filter);
- if (_subscriptions.ContainsKey(key))
+ if (s_subscriptions.ContainsKey(key))
{
- _subscriptions[key].Add(value);
+ s_subscriptions[key].Add(value);
}
else
{
var list = new List<Subscription> { value };
- _subscriptions[key] = list;
+ s_subscriptions[key] = list;
}
}
- void InnerUnsubscribe(string message, Type senderType, Type argType, object subscriber)
+ static void InnerUnsubscribe(string message, Type senderType, Type argType, object subscriber)
{
if (subscriber == null)
throw new ArgumentNullException(nameof(subscriber));
@@ -244,19 +203,11 @@ namespace Xamarin.Forms
throw new ArgumentNullException(nameof(message));
var key = new Sender(message, senderType, argType);
- if (!_subscriptions.ContainsKey(key))
+ if (!s_subscriptions.ContainsKey(key))
return;
- _subscriptions[key].RemoveAll(sub => sub.CanBeRemoved() || sub.Subscriber.Target == subscriber);
- if (!_subscriptions[key].Any())
- _subscriptions.Remove(key);
- }
-
- // This is a bit gross; it only exists to support the unit tests in PageTests
- // because the implementations of ActionSheet, Alert, and IsBusy are all very
- // tightly coupled to the MessagingCenter singleton
- internal static void ClearSubscribers()
- {
- (Instance as MessagingCenter)?._subscriptions.Clear();
+ s_subscriptions[key].RemoveAll(sub => sub.CanBeRemoved() || sub.Subscriber.Target == subscriber);
+ if (!s_subscriptions[key].Any())
+ s_subscriptions.Remove(key);
}
}
} \ No newline at end of file