1515use std:: { collections:: BTreeSet , fmt, sync:: Arc } ;
1616
1717use as_variant:: as_variant;
18- use decryption_retry_task:: DecryptionRetryTask ;
1918use eyeball_im:: { VectorDiff , VectorSubscriberStream } ;
2019use eyeball_im_util:: vector:: { FilterMap , VectorObserverExt } ;
2120use futures_core:: Stream ;
@@ -24,7 +23,7 @@ use imbl::Vector;
2423use matrix_sdk:: Result ;
2524use matrix_sdk:: {
2625 deserialized_responses:: TimelineEvent ,
27- event_cache:: { RoomEventCache , RoomPaginationStatus } ,
26+ event_cache:: { DecryptionRetryRequest , RoomEventCache , RoomPaginationStatus } ,
2827 paginators:: { PaginationResult , PaginationToken , Paginator } ,
2928 send_queue:: {
3029 LocalEcho , LocalEchoContent , RoomSendQueueUpdate , SendHandle , SendReactionHandle ,
@@ -73,6 +72,7 @@ use crate::{
7372 timeline:: {
7473 MsgLikeContent , MsgLikeKind , Room , TimelineEventFilterFn ,
7574 algorithms:: rfind_event_by_item_id,
75+ controller:: decryption_retry_task:: compute_redecryption_candidates,
7676 date_dividers:: DateDividerAdjuster ,
7777 event_item:: TimelineItemHandle ,
7878 pinned_events_loader:: { PinnedEventsLoader , PinnedEventsLoaderError } ,
@@ -261,10 +261,6 @@ pub(super) struct TimelineController<P: RoomDataProvider = Room> {
261261
262262 /// Settings applied to this timeline.
263263 pub ( super ) settings : TimelineSettings ,
264-
265- /// Long-running task used to retry decryption of timeline items without
266- /// blocking main processing.
267- decryption_retry_task : DecryptionRetryTask < P , P > ,
268264}
269265
270266#[ derive( Clone ) ]
@@ -426,10 +422,7 @@ impl<P: RoomDataProvider> TimelineController<P> {
426422 is_room_encrypted,
427423 ) ) ) ;
428424
429- let decryption_retry_task =
430- DecryptionRetryTask :: new ( state. clone ( ) , room_data_provider. clone ( ) ) ;
431-
432- Self { state, focus, room_data_provider, settings, decryption_retry_task }
425+ Self { state, focus, room_data_provider, settings }
433426 }
434427
435428 /// Initializes the configured focus with appropriate data.
@@ -1267,10 +1260,11 @@ impl<P: RoomDataProvider> TimelineController<P> {
12671260 true
12681261 }
12691262
1270- pub ( crate ) async fn retry_event_decryption_inner ( & self , session_ids : Option < BTreeSet < String > > ) {
1271- self . decryption_retry_task
1272- . decrypt ( self . room_data_provider . clone ( ) , session_ids, self . settings . clone ( ) )
1273- . await ;
1263+ pub ( super ) async fn compute_redecryption_candidates (
1264+ & self ,
1265+ ) -> ( BTreeSet < String > , BTreeSet < String > ) {
1266+ let state = self . state . read ( ) . await ;
1267+ compute_redecryption_candidates ( & state. items )
12741268 }
12751269
12761270 pub ( super ) async fn set_sender_profiles_pending ( & self ) {
@@ -1791,7 +1785,15 @@ impl TimelineController {
17911785
17921786 #[ instrument( skip( self ) , fields( room_id = ?self . room( ) . room_id( ) ) ) ]
17931787 pub ( super ) async fn retry_event_decryption ( & self , session_ids : Option < BTreeSet < String > > ) {
1794- self . retry_event_decryption_inner ( session_ids) . await
1788+ let ( utds, decrypted) = self . compute_redecryption_candidates ( ) . await ;
1789+
1790+ let request = DecryptionRetryRequest {
1791+ room_id : self . room ( ) . room_id ( ) . to_owned ( ) ,
1792+ utd_session_ids : utds,
1793+ refresh_info_session_ids : decrypted,
1794+ } ;
1795+
1796+ self . room ( ) . client ( ) . event_cache ( ) . request_decryption ( request) ;
17951797 }
17961798
17971799 /// Combine the global (event cache) pagination status with the local state
0 commit comments