using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading; using System.Threading.Tasks; using Tango.Core.DI; using Tango.Core.Threading; using Tango.Integration.ExternalBridge; using Tango.PPC.Common.ExternalBridge; using Tango.PPC.Common.Notifications; using Tango.PPC.Shared.Notifications; namespace Tango.PPC.Common.RemoteNotifications { [TangoCreateWhenRegistered] public class DefaultRemoteNotificationsService : IRemoteNotificationsService { private INotificationProvider _notification; public bool Enabled { get; set; } = true; public DefaultRemoteNotificationsService(IPPCExternalBridgeService externalBridge, INotificationProvider notificationProvider) { _notification = notificationProvider; externalBridge.RegisterRequestHandler(this); } [ExternalBridgeRequestHandlerMethod(typeof(RemoteMessageBoxRequest), RequestHandlerLoggingMode.LogRequestName)] public async Task OnRemoteMessageBoxRequest(RemoteMessageBoxRequest request, String token, ExternalBridgeReceiver receiver) { bool result = false; bool completed = false; if (request.Timeout != null) { ThreadFactory.StartNew(() => { Thread.Sleep(request.Timeout.Value); if (!completed) { completed = true; _notification.CurrentMessageBox.Close(false); receiver.SendErrorResponse(new TimeoutException("The user did not respond within the given timeout."), token); } }); } switch (request.Type) { case RemoteMessageBoxType.Info: await _notification.ShowInfo(request.Message); break; case RemoteMessageBoxType.Warning: await _notification.ShowWarning(request.Message); break; case RemoteMessageBoxType.Question: result = await _notification.ShowQuestion(request.Message); break; case RemoteMessageBoxType.Error: await _notification.ShowError(request.Message); break; default: break; } if (completed) return; completed = true; await receiver.SendGenericResponse(new RemoteMessageBoxResponse() { Result = result }, token); } public void OnReceiverDisconnected(ExternalBridgeReceiver receiver) { } } }