diff --git a/deltachat-ffi/deltachat.h b/deltachat-ffi/deltachat.h index 152349a97..d8004cb8d 100644 --- a/deltachat-ffi/deltachat.h +++ b/deltachat-ffi/deltachat.h @@ -4558,7 +4558,8 @@ void dc_event_unref(dc_event_t* event); * Messages were marked noticed or seen. * The ui may update badge counters or stop showing a chatlist-item with a bold font. * - * This event is emitted eg. when calling dc_markseen_msgs(), dc_marknoticed_chat() or dc_marknoticed_contact(). + * This event is emitted eg. when calling dc_markseen_msgs(), dc_marknoticed_chat() or dc_marknoticed_contact() + * or when a chat is answered on another device. * Do not try to derive the state of an item from just the fact you received the event; * use eg. dc_msg_get_state() or dc_get_fresh_msg_cnt() for this purpose. * diff --git a/src/chat.rs b/src/chat.rs index e0fd01a1f..f36d9064b 100644 --- a/src/chat.rs +++ b/src/chat.rs @@ -1744,6 +1744,27 @@ pub async fn get_chat_msgs( } } +pub(crate) async fn marknoticed_chat_if_older_than( + context: &Context, + chat_id: ChatId, + timestamp: i64, +) -> Result<(), Error> { + if let Some(chat_timestamp) = context + .sql + .query_get_value( + context, + "SELECT MAX(timestamp) FROM msgs WHERE chat_id=?", + paramsv![chat_id], + ) + .await + { + if timestamp > chat_timestamp { + marknoticed_chat(context, chat_id).await?; + } + } + Ok(()) +} + pub async fn marknoticed_chat(context: &Context, chat_id: ChatId) -> Result<(), Error> { // "WHERE" below uses the index `(state, hidden, chat_id)`, see get_fresh_msg_cnt() for reasoning if !context diff --git a/src/dc_receive_imf.rs b/src/dc_receive_imf.rs index 6315b9691..4989e96a9 100644 --- a/src/dc_receive_imf.rs +++ b/src/dc_receive_imf.rs @@ -845,6 +845,11 @@ async fn add_parts( "Message has {} parts and is assigned to chat #{}.", icnt, chat_id, ); + // new outgoing message from another device marks the chat as noticed. + if !incoming && !*hidden && !chat_id.is_special() { + chat::marknoticed_chat_if_older_than(context, chat_id, sort_timestamp).await?; + } + // check event to send if chat_id.is_trash() || *hidden { *create_event_to_send = None;