Exemplo n.º 1
0
        protected override async void OnBackgroundActivated(BackgroundActivatedEventArgs args)
        {
            base.OnBackgroundActivated(args);

            if (args.TaskInstance.TriggerDetails is AppServiceTriggerDetails appServiceTriggerDetails)
            {
                Logger.Info("App service background activation.");
                BackgroundTaskDeferral appServiceDeferral = args.TaskInstance.GetDeferral();
                args.TaskInstance.Canceled += (IBackgroundTaskInstance sender, BackgroundTaskCancellationReason reason) => appServiceDeferral.Complete();
                AppServiceConnection appServiceConnection = appServiceTriggerDetails.AppServiceConnection;
                appServiceConnection.ServiceClosed   += (AppServiceConnection sender, AppServiceClosedEventArgs args) => appServiceDeferral.Complete();
                appServiceConnection.RequestReceived += OnAppServiceRequestReceived;
                return;
            }

            BackgroundTaskDeferral deferral = args.TaskInstance.GetDeferral();

            switch (args.TaskInstance.Task.Name)
            {
            case BackgroundTaskHelper.TOAST_BACKGROUND_TASK_NAME:
                if (args.TaskInstance.TriggerDetails is ToastNotificationActionTriggerDetail details)
                {
                    InitLogger();

                    string   arguments = details.Argument;
                    ValueSet userInput = details.UserInput;

                    Logger.Debug("App activated in background through toast with: " + arguments);
                    AbstractToastActivation abstractToastActivation = ToastActivationArgumentParser.ParseArguments(arguments);

                    if (abstractToastActivation is null)
                    {
                        Logger.Warn("Unable to evaluate toast activation string - unknown format");
                    }
                    else if (abstractToastActivation is MarkChatAsReadToastActivation markChatAsRead)
                    {
                        ToastHelper.RemoveToastGroup(ToastHelper.GetChatToastGroup(markChatAsRead.CHAT_ID.ToString()));
                        DataCache.INSTANCE.MarkAllChatMessagesAsRead(markChatAsRead.CHAT_ID);
                    }
                    else if (abstractToastActivation is MarkMessageAsReadToastActivation markMessageAsRead)
                    {
                        DataCache.INSTANCE.MarkChatMessageAsRead(markMessageAsRead.CHAT_ID, markMessageAsRead.CHAT_MESSAGE_ID);
                    }
                    else if (abstractToastActivation is SendReplyToastActivation sendReply)
                    {
                        ChatModel chat;
                        using (SemaLock semaLock = DataCache.INSTANCE.NewChatSemaLock())
                        {
                            chat = DataCache.INSTANCE.GetChat(sendReply.CHAT_ID, semaLock);
                        }
                        if (chat is not null && userInput[ToastHelper.TEXT_BOX_ID] is string text)
                        {
                            string trimedText = text.Trim(UiUtils.TRIM_CHARS);
                            await SendChatMessageAsync(chat, trimedText);
                        }
                        DataCache.INSTANCE.MarkChatMessageAsRead(sendReply.CHAT_ID, sendReply.CHAT_MESSAGE_ID);
                    }
                }
                break;

            default:
                break;
            }

            deferral.Complete();
        }