@@ -1693,6 +1693,7 @@ pub async fn markseen_msgs(context: &Context, msg_ids: Vec<MsgId>) -> Result<()>
1693
1693
m.id AS id,
1694
1694
m.chat_id AS chat_id,
1695
1695
m.state AS state,
1696
+ m.download_state as download_state,
1696
1697
m.ephemeral_timer AS ephemeral_timer,
1697
1698
m.param AS param,
1698
1699
m.from_id AS from_id,
@@ -1708,6 +1709,7 @@ pub async fn markseen_msgs(context: &Context, msg_ids: Vec<MsgId>) -> Result<()>
1708
1709
let id: MsgId = row. get ( "id" ) ?;
1709
1710
let chat_id: ChatId = row. get ( "chat_id" ) ?;
1710
1711
let state: MessageState = row. get ( "state" ) ?;
1712
+ let download_state: DownloadState = row. get ( "download_state" ) ?;
1711
1713
let param: Params = row. get :: < _ , String > ( "param" ) ?. parse ( ) . unwrap_or_default ( ) ;
1712
1714
let from_id: ContactId = row. get ( "from_id" ) ?;
1713
1715
let rfc724_mid: String = row. get ( "rfc724_mid" ) ?;
@@ -1719,6 +1721,7 @@ pub async fn markseen_msgs(context: &Context, msg_ids: Vec<MsgId>) -> Result<()>
1719
1721
id,
1720
1722
chat_id,
1721
1723
state,
1724
+ download_state,
1722
1725
param,
1723
1726
from_id,
1724
1727
rfc724_mid,
@@ -1748,6 +1751,7 @@ pub async fn markseen_msgs(context: &Context, msg_ids: Vec<MsgId>) -> Result<()>
1748
1751
id,
1749
1752
curr_chat_id,
1750
1753
curr_state,
1754
+ curr_download_state,
1751
1755
curr_param,
1752
1756
curr_from_id,
1753
1757
curr_rfc724_mid,
@@ -1757,7 +1761,14 @@ pub async fn markseen_msgs(context: &Context, msg_ids: Vec<MsgId>) -> Result<()>
1757
1761
_curr_ephemeral_timer,
1758
1762
) in msgs
1759
1763
{
1760
- if curr_state == MessageState :: InFresh || curr_state == MessageState :: InNoticed {
1764
+ if curr_download_state != DownloadState :: Done {
1765
+ if curr_state == MessageState :: InFresh {
1766
+ // Don't mark partially downloaded messages as seen or send a read receipt since
1767
+ // they are not really seen by the user.
1768
+ update_msg_state ( context, id, MessageState :: InNoticed ) . await ?;
1769
+ updated_chat_ids. insert ( curr_chat_id) ;
1770
+ }
1771
+ } else if curr_state == MessageState :: InFresh || curr_state == MessageState :: InNoticed {
1761
1772
update_msg_state ( context, id, MessageState :: InSeen ) . await ?;
1762
1773
info ! ( context, "Seen message {}." , id) ;
1763
1774
@@ -2601,8 +2612,28 @@ mod tests {
2601
2612
assert ! ( !msg. param. get_bool( Param :: WantsMdn ) . unwrap_or_default( ) ) ;
2602
2613
assert_eq ! ( msg. state, MessageState :: InFresh ) ;
2603
2614
markseen_msgs ( alice, vec ! [ msg. id] ) . await ?;
2604
- let msg = Message :: load_from_db ( alice, msg. id ) . await ?;
2605
- assert_eq ! ( msg. state, MessageState :: InSeen ) ;
2615
+ // A not downloaded message can be seen only if it's seen on another device.
2616
+ assert_eq ! ( msg. id. get_state( alice) . await ?, MessageState :: InNoticed ) ;
2617
+ // Marking the message as seen again is a no op.
2618
+ markseen_msgs ( alice, vec ! [ msg. id] ) . await ?;
2619
+ assert_eq ! ( msg. id. get_state( alice) . await ?, MessageState :: InNoticed ) ;
2620
+
2621
+ msg. id
2622
+ . update_download_state ( alice, DownloadState :: InProgress )
2623
+ . await ?;
2624
+ markseen_msgs ( alice, vec ! [ msg. id] ) . await ?;
2625
+ assert_eq ! ( msg. id. get_state( alice) . await ?, MessageState :: InNoticed ) ;
2626
+ msg. id
2627
+ . update_download_state ( alice, DownloadState :: Failure )
2628
+ . await ?;
2629
+ markseen_msgs ( alice, vec ! [ msg. id] ) . await ?;
2630
+ assert_eq ! ( msg. id. get_state( alice) . await ?, MessageState :: InNoticed ) ;
2631
+ msg. id
2632
+ . update_download_state ( alice, DownloadState :: Undecipherable )
2633
+ . await ?;
2634
+ markseen_msgs ( alice, vec ! [ msg. id] ) . await ?;
2635
+ assert_eq ! ( msg. id. get_state( alice) . await ?, MessageState :: InNoticed ) ;
2636
+
2606
2637
assert ! (
2607
2638
!alice
2608
2639
. sql
@@ -2611,12 +2642,25 @@ mod tests {
2611
2642
) ;
2612
2643
2613
2644
alice. set_config ( Config :: DownloadLimit , None ) . await ?;
2645
+ // Let's assume that Alice and Bob resolved the problem with encryption.
2646
+ let old_msg = msg;
2614
2647
let msg = alice. recv_msg ( & sent_msg) . await ;
2648
+ assert_eq ! ( msg. chat_id, old_msg. chat_id) ;
2615
2649
assert_eq ! ( msg. download_state, DownloadState :: Done ) ;
2616
2650
assert ! ( msg. param. get_bool( Param :: WantsMdn ) . unwrap_or_default( ) ) ;
2617
2651
assert ! ( msg. get_showpadlock( ) ) ;
2652
+ // The message state mustn't be downgraded to `InFresh`.
2653
+ assert_eq ! ( msg. state, MessageState :: InNoticed ) ;
2654
+ markseen_msgs ( alice, vec ! [ msg. id] ) . await ?;
2655
+ let msg = Message :: load_from_db ( alice, msg. id ) . await ?;
2618
2656
assert_eq ! ( msg. state, MessageState :: InSeen ) ;
2619
-
2657
+ assert_eq ! (
2658
+ alice
2659
+ . sql
2660
+ . count( "SELECT COUNT(*) FROM smtp_mdns" , ( ) )
2661
+ . await ?,
2662
+ 1
2663
+ ) ;
2620
2664
Ok ( ( ) )
2621
2665
}
2622
2666
0 commit comments