diff --git a/src/Android/MainApplication.cs b/src/Android/MainApplication.cs index 9e7ea0a24..a64760c3d 100644 --- a/src/Android/MainApplication.cs +++ b/src/Android/MainApplication.cs @@ -44,8 +44,8 @@ namespace Bit.Droid var liteDbStorage = new LiteDbStorageService(Path.Combine(documentsPath, "bitwarden.db")); var deviceActionService = new DeviceActionService(); var localizeService = new LocalizeService(); - var broadcasterService = new MobileBroadcasterService(); - var messagingService = new MobileMessagingService(); + var broadcasterService = new BroadcasterService(); + var messagingService = new MobileBroadcasterMessagingService(broadcasterService); var i18nService = new MobileI18nService(localizeService.GetCurrentCultureInfo()); var secureStorageService = new SecureStorageService(); var cryptoPrimitiveService = new CryptoPrimitiveService(); diff --git a/src/App/App.xaml.cs b/src/App/App.xaml.cs index 6868a96e4..522b52caf 100644 --- a/src/App/App.xaml.cs +++ b/src/App/App.xaml.cs @@ -44,21 +44,25 @@ namespace Bit.App }); ServiceContainer.Resolve("platformUtilsService").Init(); - _broadcasterService.Subscribe("showDialog", async (details) => + _broadcasterService.Subscribe(nameof(App), async (message) => { - var confirmed = true; - var confirmText = string.IsNullOrWhiteSpace(details.ConfirmText) ? - AppResources.Ok : details.ConfirmText; - if(!string.IsNullOrWhiteSpace(details.CancelText)) + if(message.Command == "showDialog") { - confirmed = await MainPage.DisplayAlert(details.Title, details.Text, confirmText, - details.CancelText); + var details = message.Data as DialogDetails; + var confirmed = true; + var confirmText = string.IsNullOrWhiteSpace(details.ConfirmText) ? + AppResources.Ok : details.ConfirmText; + if(!string.IsNullOrWhiteSpace(details.CancelText)) + { + confirmed = await MainPage.DisplayAlert(details.Title, details.Text, confirmText, + details.CancelText); + } + else + { + await MainPage.DisplayAlert(details.Title, details.Text, details.ConfirmText); + } + _messagingService.Send("showDialogResolve", new Tuple(details.DialogId, confirmed)); } - else - { - await MainPage.DisplayAlert(details.Title, details.Text, details.ConfirmText); - } - _messagingService.Send("showDialogResolve", new Tuple(details.DialogId, confirmed)); }); } diff --git a/src/Core/Abstractions/IBroadcasterService.cs b/src/Core/Abstractions/IBroadcasterService.cs index 6a7a02b2d..afdf29f21 100644 --- a/src/Core/Abstractions/IBroadcasterService.cs +++ b/src/Core/Abstractions/IBroadcasterService.cs @@ -1,11 +1,12 @@ -using System; +using Bit.Core.Models.Domain; +using System; namespace Bit.Core.Abstractions { public interface IBroadcasterService { - void Send(T message, string id = null); - void Subscribe(string id, Action messageCallback); + void Send(Message message, string id = null); + void Subscribe(string id, Action messageCallback); void Unsubscribe(string id); } } \ No newline at end of file diff --git a/src/Core/Abstractions/IMessagingService.cs b/src/Core/Abstractions/IMessagingService.cs index f0a23b4ef..08d631907 100644 --- a/src/Core/Abstractions/IMessagingService.cs +++ b/src/Core/Abstractions/IMessagingService.cs @@ -2,6 +2,6 @@ { public interface IMessagingService { - void Send(string subscriber, T arg = default(T)); + void Send(string subscriber, object arg = null); } } \ No newline at end of file diff --git a/src/Core/Models/Domain/Message.cs b/src/Core/Models/Domain/Message.cs new file mode 100644 index 000000000..1553cbf72 --- /dev/null +++ b/src/Core/Models/Domain/Message.cs @@ -0,0 +1,8 @@ +namespace Bit.Core.Models.Domain +{ + public class Message + { + public string Command { get; set; } + public object Data { get; set; } + } +} diff --git a/src/Core/Services/AuthService.cs b/src/Core/Services/AuthService.cs index 914ddb4c7..8b0472e5e 100644 --- a/src/Core/Services/AuthService.cs +++ b/src/Core/Services/AuthService.cs @@ -140,7 +140,7 @@ namespace Bit.Core.Services public void LogOut(Action callback) { callback.Invoke(); - _messagingService.Send("loggedOut"); + _messagingService.Send("loggedOut"); } public List GetSupportedTwoFactorProviders() @@ -312,7 +312,7 @@ namespace Bit.Core.Services await _cryptoService.SetEncPrivateKeyAsync(tokenResponse.PrivateKey); } - _messagingService.Send("loggedIn"); + _messagingService.Send("loggedIn"); return result; } diff --git a/src/Core/Services/BroadcasterService.cs b/src/Core/Services/BroadcasterService.cs new file mode 100644 index 000000000..4ac47ce91 --- /dev/null +++ b/src/Core/Services/BroadcasterService.cs @@ -0,0 +1,45 @@ +using Bit.Core.Abstractions; +using Bit.Core.Models.Domain; +using System; +using System.Collections.Generic; + +namespace Bit.App.Services +{ + public class BroadcasterService : IBroadcasterService + { + private readonly Dictionary> _subscribers = new Dictionary>(); + + public void Send(Message message, string id = null) + { + if(!string.IsNullOrWhiteSpace(id)) + { + if(_subscribers.ContainsKey(id)) + { + _subscribers[id].Invoke(message); + } + return; + } + foreach(var sub in _subscribers) + { + sub.Value.Invoke(message); + } + } + + public void Subscribe(string id, Action messageCallback) + { + if(_subscribers.ContainsKey(id)) + { + return; + } + _subscribers.Add(id, messageCallback); + } + + public void Unsubscribe(string id) + { + if(_subscribers.ContainsKey(id)) + { + _subscribers.Remove(id); + } + } + } +} diff --git a/src/Core/Services/SyncService.cs b/src/Core/Services/SyncService.cs index f5c662942..764ddbb0f 100644 --- a/src/Core/Services/SyncService.cs +++ b/src/Core/Services/SyncService.cs @@ -255,7 +255,7 @@ namespace Bit.Core.Services private void SyncStarted() { SyncInProgress = true; - _messagingService.Send("syncStarted"); + _messagingService.Send("syncStarted"); } private bool SyncCompleted(bool successfully)