private async Task <bool> SendMessage(string messageText)
        {
            Debug.WriteLine("starting sendmessage");
            try
            {
                if (messageText != string.Empty)
                {
                    var           now     = Util.CurrentTimeMillis();
                    SignalMessage message = new SignalMessage()
                    {
                        Author            = null,
                        ComposedTimestamp = now,
                        Content           = new SignalMessageContent()
                        {
                            Content = messageText
                        },
                        ThreadId          = SelectedThread.ThreadId,
                        ReceivedTimestamp = now,
                        Direction         = SignalMessageDirection.Outgoing,
                        Read = true,
                        Type = SignalMessageType.Normal
                    };
                    Debug.WriteLine("keydown lock await");
                    using (await ActionInProgress.LockAsync())
                    {
                        Debug.WriteLine("keydown lock grabbed");

                        /* update in-memory data */
                        SelectedThread.MessagesCount       += 1;
                        SelectedThread.UnreadCount          = 0;
                        SelectedThread.LastMessage          = message;
                        SelectedThread.LastSeenMessageIndex = SelectedThread.MessagesCount;
                        SelectedThread.View.UpdateConversationDisplay(SelectedThread);
                        var container = new SignalMessageContainer(message, (int)SelectedThread.MessagesCount - 1);
                        View.Thread.Append(container, true);
                        MoveThreadToTop(SelectedThread);

                        /* save to disk */
                        await Task.Run(() =>
                        {
                            SignalDBContext.SaveMessageLocked(message);
                        });

                        /* add to OutgoingCache */
                        View.Thread.AddToOutgoingMessagesCache(container);

                        /* send */
                        OutgoingQueue.Add(message);
                    }
                    Debug.WriteLine("keydown lock released");
                }
                return(true);
            }
            catch (Exception ex)
            {
                Debug.WriteLine(ex);
                Debug.WriteLine(ex.Message);
                Debug.WriteLine(ex.StackTrace);
                return(false);
            }
        }