[fractal] Get user avatar through matrix-sdk



commit 40d3ae176f9b029e45cf50c080d521d4ef8cd855
Author: Alejandro Domínguez <adomu net-c com>
Date:   Sun Sep 6 18:56:42 2020 +0200

    Get user avatar through matrix-sdk

 fractal-gtk/src/appop/account.rs                 |  4 +-
 fractal-gtk/src/appop/media_viewer.rs            |  3 +-
 fractal-gtk/src/appop/message.rs                 | 27 ++------
 fractal-gtk/src/appop/mod.rs                     |  3 -
 fractal-gtk/src/appop/notify.rs                  | 48 +++++---------
 fractal-gtk/src/appop/room.rs                    |  1 -
 fractal-gtk/src/appop/user.rs                    | 18 ++----
 fractal-gtk/src/backend/mod.rs                   | 45 -------------
 fractal-gtk/src/backend/sync.rs                  | 25 +++-----
 fractal-gtk/src/backend/user.rs                  | 82 ++++++++++--------------
 fractal-gtk/src/cache/mod.rs                     | 22 ++-----
 fractal-gtk/src/model/room.rs                    | 19 +++---
 fractal-gtk/src/widgets/media_viewer.rs          | 39 ++++-------
 fractal-gtk/src/widgets/member.rs                | 22 ++++---
 fractal-gtk/src/widgets/message.rs               | 30 ++-------
 fractal-gtk/src/widgets/room_history.rs          | 41 ++----------
 fractal-matrix-api/src/meson.build               |  1 -
 fractal-matrix-api/src/r0/profile.rs             |  1 -
 fractal-matrix-api/src/r0/profile/get_profile.rs | 26 --------
 19 files changed, 122 insertions(+), 335 deletions(-)
---
diff --git a/fractal-gtk/src/appop/account.rs b/fractal-gtk/src/appop/account.rs
index c8ba7411..1dc28dbe 100644
--- a/fractal-gtk/src/appop/account.rs
+++ b/fractal-gtk/src/appop/account.rs
@@ -543,10 +543,8 @@ impl AppOp {
             None,
         );
         download_to_cache(
-            login_data.session_client.clone(),
-            self.thread_pool.clone(),
+            login_data.session_client,
             self.user_info_cache.clone(),
-            login_data.access_token,
             login_data.uid,
             data,
         );
diff --git a/fractal-gtk/src/appop/media_viewer.rs b/fractal-gtk/src/appop/media_viewer.rs
index 728529d4..6c7ba658 100644
--- a/fractal-gtk/src/appop/media_viewer.rs
+++ b/fractal-gtk/src/appop/media_viewer.rs
@@ -39,8 +39,7 @@ impl AppOp {
                 login_data.uid,
             );
             panel.display_media_viewer(login_data.session_client.clone(), msg);
-            let (body, header) =
-                panel.create(login_data.session_client.clone(), self.thread_pool.clone())?;
+            let (body, header) = panel.create(login_data.session_client.clone())?;
             *self.media_viewer.borrow_mut() = Some(panel);
 
             if let Some(login_data) = self.login_data.clone() {
diff --git a/fractal-gtk/src/appop/message.rs b/fractal-gtk/src/appop/message.rs
index a8623257..c2f9f1ea 100644
--- a/fractal-gtk/src/appop/message.rs
+++ b/fractal-gtk/src/appop/message.rs
@@ -50,12 +50,7 @@ impl AppOp {
         let session_client = self.login_data.as_ref()?.session_client.clone();
         if let Some(ui_msg) = self.create_new_room_message(msg) {
             if let Some(ref mut history) = self.history {
-                history.add_new_message(
-                    session_client,
-                    self.thread_pool.clone(),
-                    self.user_info_cache.clone(),
-                    ui_msg,
-                );
+                history.add_new_message(session_client, self.user_info_cache.clone(), ui_msg);
             }
         }
         None
@@ -66,12 +61,7 @@ impl AppOp {
             unwrap_or_unit_return!(self.login_data.as_ref().map(|ld| ld.session_client.clone()));
         if let Some(ui_msg) = self.create_new_room_message(msg) {
             if let Some(ref mut history) = self.history {
-                history.remove_message(
-                    session_client,
-                    self.thread_pool.clone(),
-                    self.user_info_cache.clone(),
-                    ui_msg,
-                );
+                history.remove_message(session_client, self.user_info_cache.clone(), ui_msg);
             }
         }
     }
@@ -86,7 +76,6 @@ impl AppOp {
             )
             .tmpwidget(
                 login_data.session_client.clone(),
-                self.thread_pool.clone(),
                 self.user_info_cache.clone(),
                 &ui_msg,
             );
@@ -131,7 +120,6 @@ impl AppOp {
                 )
                 .tmpwidget(
                     login_data.session_client.clone(),
-                    self.thread_pool.clone(),
                     self.user_info_cache.clone(),
                     &ui_msg,
                 );
@@ -410,8 +398,8 @@ impl AppOp {
                     .builder
                     .get_object("main_window")
                     .expect("Can't find main_window in ui file.");
-                if let (Some(app), Some(event_id)) = (window.get_application(), msg.id.as_ref()) {
-                    self.notify(app, &msg.room, event_id);
+                if let (Some(app), Some(event_id)) = (window.get_application(), msg.id.clone()) {
+                    self.notify(app, msg.room.clone(), event_id);
                 }
             }
 
@@ -455,12 +443,7 @@ impl AppOp {
         }
 
         if let Some(ref mut history) = self.history {
-            history.add_old_messages_in_batch(
-                session_client,
-                self.thread_pool.clone(),
-                self.user_info_cache.clone(),
-                list,
-            );
+            history.add_old_messages_in_batch(session_client, self.user_info_cache.clone(), list);
         }
     }
 
diff --git a/fractal-gtk/src/appop/mod.rs b/fractal-gtk/src/appop/mod.rs
index dc7547eb..0d2025cc 100644
--- a/fractal-gtk/src/appop/mod.rs
+++ b/fractal-gtk/src/appop/mod.rs
@@ -11,7 +11,6 @@ use fractal_api::r0::AccessToken;
 use fractal_api::Client as MatrixClient;
 use gtk::prelude::*;
 
-use crate::backend::ThreadPool;
 use crate::cache::CacheMap;
 use fractal_api::url::Url;
 
@@ -119,7 +118,6 @@ pub struct AppOp {
     pub leaflet: libhandy::Leaflet,
     pub deck: libhandy::Deck,
 
-    pub thread_pool: ThreadPool,
     pub user_info_cache: UserInfoCache,
 }
 
@@ -166,7 +164,6 @@ impl AppOp {
             leaflet,
             deck,
 
-            thread_pool: ThreadPool::new(20),
             user_info_cache: Arc::new(Mutex::new(
                 CacheMap::new().timeout(Duration::from_secs(60 * 60)),
             )),
diff --git a/fractal-gtk/src/appop/notify.rs b/fractal-gtk/src/appop/notify.rs
index 47b26e1b..5f6a5b95 100644
--- a/fractal-gtk/src/appop/notify.rs
+++ b/fractal-gtk/src/appop/notify.rs
@@ -1,16 +1,12 @@
+use crate::app::RUNTIME;
 use crate::backend::user;
 use fractal_api::identifiers::{EventId, RoomId};
 use gio::ApplicationExt;
 use gio::FileExt;
 use gio::Notification;
-use glib::clone;
-use glib::source::Continue;
 use gtk::prelude::*;
 use log::info;
 use std::path::Path;
-use std::sync::mpsc::channel;
-use std::sync::mpsc::TryRecvError;
-use std::sync::mpsc::{Receiver, Sender};
 
 use crate::util::i18n::i18n;
 
@@ -43,12 +39,10 @@ impl AppOp {
         inapp.set_reveal_child(false);
     }
 
-    pub fn notify(&self, app: gtk::Application, room_id: &RoomId, id: &EventId) -> Option<()> {
-        let login_data = self.login_data.as_ref()?;
-        let access_token = login_data.access_token.clone();
-        let session_client = login_data.session_client.clone();
-        let msg = self.get_message_by_id(room_id, id)?;
-        let r = self.rooms.get(room_id)?;
+    pub fn notify(&self, app: gtk::Application, room_id: RoomId, id: EventId) -> Option<()> {
+        let session_client = self.login_data.as_ref()?.session_client.clone();
+        let msg = self.get_message_by_id(&room_id, &id)?;
+        let r = self.rooms.get(&room_id)?;
         let short_body = match &msg.mtype[..] {
             "m.audio" => i18n("An audio file has been added to the conversation."),
             "m.image" => i18n("An image has been added to the conversation."),
@@ -65,31 +59,19 @@ impl AppOp {
             String::new()
         };
 
-        let (tx, rx): (Sender<user::UserInfo>, Receiver<user::UserInfo>) = channel();
-        user::get_user_info_async(
-            self.thread_pool.clone(),
+        let response = RUNTIME.spawn(user::get_user_info(
             session_client,
             self.user_info_cache.clone(),
-            access_token,
             msg.sender,
-            tx,
-        );
-
-        let room_id = room_id.to_string();
-        let id = id.to_string();
-        glib::timeout_add_local(
-            50,
-            clone!(@weak app => @default-return Continue(false), move || match rx.try_recv() {
-                Err(TryRecvError::Empty) => Continue(true),
-                Err(TryRecvError::Disconnected) => Continue(false),
-                Ok((name, avatar_path)) => {
-                    let title = format!("{}{}", name, title);
-                    let n = create_notification(&room_id, &title, &short_body, &avatar_path);
-                    app.send_notification(Some(id.as_str()), &n);
-                    Continue(false)
-                }
-            }),
-        );
+        ));
+
+        glib::MainContext::default().spawn_local(async move {
+            if let Ok(Ok((name, avatar_path))) = response.await {
+                let title = format!("{}{}", name, title);
+                let n = create_notification(room_id.as_str(), &title, &short_body, &avatar_path);
+                app.send_notification(Some(id.as_str()), &n);
+            }
+        });
 
         None
     }
diff --git a/fractal-gtk/src/appop/room.rs b/fractal-gtk/src/appop/room.rs
index b79b7dd1..a53ad1da 100644
--- a/fractal-gtk/src/appop/room.rs
+++ b/fractal-gtk/src/appop/room.rs
@@ -310,7 +310,6 @@ impl AppOp {
         self.history = if let Some(mut history) = history {
             history.create(
                 login_data.session_client,
-                self.thread_pool.clone(),
                 self.user_info_cache.clone(),
                 messages,
             );
diff --git a/fractal-gtk/src/appop/user.rs b/fractal-gtk/src/appop/user.rs
index 6fd640f0..35fe4067 100644
--- a/fractal-gtk/src/appop/user.rs
+++ b/fractal-gtk/src/appop/user.rs
@@ -6,7 +6,7 @@ use glib::clone;
 use std::path::PathBuf;
 use std::thread;
 
-use crate::app::App;
+use crate::app::{App, RUNTIME};
 use crate::appop::AppOp;
 
 use crate::cache::download_to_cache;
@@ -31,12 +31,8 @@ impl AppOp {
             }
         }));
 
-        thread::spawn(clone!(@strong login_data => move || {
-            match user::get_user_avatar(
-                login_data.session_client.clone(),
-                login_data.access_token,
-                &login_data.uid,
-            ) {
+        RUNTIME.spawn(async move {
+            match user::get_user_avatar(login_data.session_client, &login_data.uid).await {
                 Ok((_, path)) => {
                     APPOP!(set_avatar, (path));
                 }
@@ -44,7 +40,7 @@ impl AppOp {
                     err.handle_error();
                 }
             }
-        }));
+        });
     }
 
     pub fn show_user_info(&self) {
@@ -93,9 +89,7 @@ impl AppOp {
             );
             download_to_cache(
                 login_data.session_client.clone(),
-                self.thread_pool.clone(),
                 self.user_info_cache.clone(),
-                login_data.access_token.clone(),
                 login_data.uid.clone(),
                 data,
             );
@@ -118,10 +112,8 @@ impl AppOp {
                     None,
                 );
                 download_to_cache(
-                    login_data.session_client.clone(),
-                    self.thread_pool.clone(),
+                    login_data.session_client,
                     self.user_info_cache.clone(),
-                    login_data.access_token.clone(),
                     login_data.uid,
                     data,
                 );
diff --git a/fractal-gtk/src/backend/mod.rs b/fractal-gtk/src/backend/mod.rs
index fba8bc4e..01807ad9 100644
--- a/fractal-gtk/src/backend/mod.rs
+++ b/fractal-gtk/src/backend/mod.rs
@@ -8,8 +8,6 @@ use std::convert::TryFrom;
 use std::fmt::Debug;
 use std::io::Error as IoError;
 use std::path::PathBuf;
-use std::sync::{Arc, Condvar, Mutex};
-use std::thread;
 
 use crate::client::ClientBlocking;
 use crate::util::cache_dir_path;
@@ -30,49 +28,6 @@ lazy_static! {
     pub static ref HTTP_CLIENT: ClientBlocking = ClientBlocking::new();
 }
 
-#[derive(Clone, Debug)]
-pub struct ThreadPool {
-    thread_count: Arc<(Mutex<u8>, Condvar)>,
-    limit: u8,
-}
-
-impl ThreadPool {
-    pub fn new(limit: u8) -> Self {
-        ThreadPool {
-            thread_count: Arc::new((Mutex::new(0), Condvar::new())),
-            limit,
-        }
-    }
-
-    pub fn run<F>(&self, func: F)
-    where
-        F: FnOnce() + Send + 'static,
-    {
-        let thread_count = self.thread_count.clone();
-        let limit = self.limit;
-        thread::spawn(move || {
-            // waiting, less than {limit} threads at the same time
-            let &(ref num, ref cvar) = &*thread_count;
-            {
-                let mut start = num.lock().unwrap();
-                while *start >= limit {
-                    start = cvar.wait(start).unwrap()
-                }
-                *start += 1;
-            }
-
-            func();
-
-            // freeing the cvar for new threads
-            {
-                let mut counter = num.lock().unwrap();
-                *counter -= 1;
-            }
-            cvar.notify_one();
-        });
-    }
-}
-
 pub enum ContentType {
     Download,
     Thumbnail(u32, u32),
diff --git a/fractal-gtk/src/backend/sync.rs b/fractal-gtk/src/backend/sync.rs
index bb49c703..3aef92ba 100644
--- a/fractal-gtk/src/backend/sync.rs
+++ b/fractal-gtk/src/backend/sync.rs
@@ -192,14 +192,13 @@ pub fn sync(
     match query {
         Ok(response) => {
             if since.is_none() {
-                let rooms =
-                    Room::from_sync_response(session_client, &response, user_id, access_token)
-                        .map(|rooms| {
-                            let def = join_to_room
-                                .and_then(|jtr| rooms.iter().find(|x| x.id == jtr).cloned());
-                            (rooms, def)
-                        })
-                        .map_err(Into::into);
+                let rooms = Room::from_sync_response(session_client, &response, user_id)
+                    .map(|rooms| {
+                        let def = join_to_room
+                            .and_then(|jtr| rooms.iter().find(|x| x.id == jtr).cloned());
+                        (rooms, def)
+                    })
+                    .map_err(Into::into);
 
                 let next_batch = response.next_batch;
 
@@ -208,13 +207,9 @@ pub fn sync(
                 let join = &response.rooms.join;
 
                 // New rooms
-                let update_rooms = Room::from_sync_response(
-                    session_client,
-                    &response,
-                    user_id.clone(),
-                    access_token,
-                )
-                .map_err(Into::into);
+                let update_rooms =
+                    Room::from_sync_response(session_client, &response, user_id.clone())
+                        .map_err(Into::into);
 
                 // Message events
                 let room_messages = join
diff --git a/fractal-gtk/src/backend/user.rs b/fractal-gtk/src/backend/user.rs
index 1ba462eb..41101f50 100644
--- a/fractal-gtk/src/backend/user.rs
+++ b/fractal-gtk/src/backend/user.rs
@@ -7,19 +7,15 @@ use std::io::Error as IoError;
 
 use super::MediaError;
 use crate::actions::global::activate_action;
-use crate::app::RUNTIME;
 use crate::appop::UserInfoCache;
-use crate::backend::ThreadPool;
 use crate::backend::HTTP_CLIENT;
 use crate::util::cache_dir_path;
-use crate::util::ResultExpectLog;
 use log::error;
 use std::convert::TryInto;
 use std::path::PathBuf;
-use std::sync::mpsc::Sender;
-use std::thread;
 
 use crate::model::member::Member;
+use fractal_api::api::r0::profile::get_profile::Request as GetProfileRequest;
 use fractal_api::api::r0::user_directory::search_users::Request as UserDirectoryRequest;
 use fractal_api::identity::r0::association::msisdn::submit_token::request as submit_phone_token_req;
 use fractal_api::identity::r0::association::msisdn::submit_token::Body as SubmitPhoneTokenBody;
@@ -57,9 +53,6 @@ use fractal_api::r0::media::create_content::Response as CreateContentResponse;
 use fractal_api::r0::profile::get_display_name::request as get_display_name;
 use fractal_api::r0::profile::get_display_name::Parameters as GetDisplayNameParameters;
 use fractal_api::r0::profile::get_display_name::Response as GetDisplayNameResponse;
-use fractal_api::r0::profile::get_profile::request as get_profile;
-use fractal_api::r0::profile::get_profile::Parameters as GetProfileParameters;
-use fractal_api::r0::profile::get_profile::Response as GetProfileResponse;
 use fractal_api::r0::profile::set_avatar_url::request as set_avatar_url;
 use fractal_api::r0::profile::set_avatar_url::Body as SetAvatarUrlBody;
 use fractal_api::r0::profile::set_avatar_url::Parameters as SetAvatarUrlParameters;
@@ -561,31 +554,22 @@ pub fn set_user_avatar(
     Ok(avatar)
 }
 
-pub fn get_user_info_async(
-    thread_pool: ThreadPool,
+pub async fn get_user_info(
     session_client: MatrixClient,
     user_info_cache: UserInfoCache,
-    access_token: AccessToken,
     uid: UserId,
-    tx: Sender<UserInfo>,
-) {
+) -> Result<UserInfo, GetUserAvatarError> {
     if let Some(info) = user_info_cache.lock().unwrap().get(&uid).cloned() {
-        thread::spawn(move || {
-            tx.send(info).expect_log("Connection closed");
-        });
-        return;
+        return Ok(info);
     }
 
-    thread_pool.run(move || {
-        let info = get_user_avatar(session_client, access_token, &uid);
+    let info = get_user_avatar(session_client, &uid).await;
 
-        if let Ok(ref i0) = info {
-            user_info_cache.lock().unwrap().insert(uid, i0.clone());
-        }
+    if let Ok(ref i0) = info {
+        user_info_cache.lock().unwrap().insert(uid, i0.clone());
+    }
 
-        tx.send(info.unwrap_or_default())
-            .expect_log("Connection closed");
-    });
+    info
 }
 
 #[derive(Debug)]
@@ -625,14 +609,14 @@ pub async fn search(
 
 #[derive(Debug)]
 pub enum GetUserAvatarError {
-    Reqwest(ReqwestError),
+    Matrix(MatrixError),
     Download(MediaError),
     ParseUrl(UrlError),
 }
 
-impl From<ReqwestError> for GetUserAvatarError {
-    fn from(err: ReqwestError) -> Self {
-        Self::Reqwest(err)
+impl From<MatrixError> for GetUserAvatarError {
+    fn from(err: MatrixError) -> Self {
+        Self::Matrix(err)
     }
 }
 
@@ -650,36 +634,40 @@ impl From<UrlError> for GetUserAvatarError {
 
 impl HandleError for GetUserAvatarError {}
 
-pub fn get_user_avatar(
+pub async fn get_user_avatar(
     session_client: MatrixClient,
-    access_token: AccessToken,
     user_id: &UserId,
 ) -> Result<(String, PathBuf), GetUserAvatarError> {
-    let base = session_client.homeserver().clone();
-    let params = GetProfileParameters { access_token };
-    let request = get_profile(base.clone(), &params, user_id)?;
-    let response: GetProfileResponse = HTTP_CLIENT.get_client().execute(request)?.json()?;
-
-    let name = response
-        .displayname
-        .filter(|n| !n.is_empty())
-        .unwrap_or_else(|| user_id.to_string());
+    let request = GetProfileRequest::new(user_id);
+    let response = session_client.send(request).await?;
 
-    let img = response
+    let img = match response
         .avatar_url
         .map(|url| Url::parse(&url))
         .transpose()?
         .map(|url| {
-            let dest = cache_dir_path(None, &user_id.to_string())?;
-            RUNTIME.handle().block_on(dw_media(
+            (
+                url,
+                cache_dir_path(None, user_id.as_str()).map_err(MediaError::from),
+            )
+        }) {
+        Some((url, Ok(dest))) => {
+            dw_media(
                 session_client,
                 &url,
                 ContentType::default_thumbnail(),
                 Some(dest),
-            ))
-        })
-        .unwrap_or_else(|| Ok(Default::default()))
-        .map_err(GetUserAvatarError::Download)?;
+            )
+            .await
+        }
+        Some((_, Err(err))) => Err(err),
+        None => Ok(Default::default()),
+    }?;
+
+    let name = response
+        .displayname
+        .filter(|n| !n.is_empty())
+        .unwrap_or_else(|| user_id.as_str().to_owned());
 
     Ok((name, img))
 }
diff --git a/fractal-gtk/src/cache/mod.rs b/fractal-gtk/src/cache/mod.rs
index 491c3de9..c4044ce8 100644
--- a/fractal-gtk/src/cache/mod.rs
+++ b/fractal-gtk/src/cache/mod.rs
@@ -1,6 +1,6 @@
+use crate::app::RUNTIME;
 use crate::appop::UserInfoCache;
 use crate::backend::user;
-use crate::backend::ThreadPool;
 use crate::util::cache_dir_path;
 use crate::util::ResultExpectLog;
 use fractal_api::r0::AccessToken;
@@ -16,7 +16,6 @@ use anyhow::Error;
 use fractal_api::identifiers::{DeviceId, UserId};
 use std::collections::HashMap;
 use std::hash::Hash;
-use std::path::PathBuf;
 use std::time::{Duration, Instant};
 
 use crate::globals;
@@ -158,28 +157,15 @@ pub fn remove_from_cache(user_info_cache: UserInfoCache, user_id: &UserId) {
 /// this downloads a avatar and stores it in the cache folder
 pub fn download_to_cache(
     session_client: MatrixClient,
-    thread_pool: ThreadPool,
     user_info_cache: UserInfoCache,
-    access_token: AccessToken,
     uid: UserId,
     data: Rc<RefCell<AvatarData>>,
 ) {
-    let (tx, rx) = channel::<(String, PathBuf)>();
-    user::get_user_info_async(
-        thread_pool,
-        session_client,
-        user_info_cache,
-        access_token,
-        uid,
-        tx,
-    );
+    let response = RUNTIME.spawn(user::get_user_info(session_client, user_info_cache, uid));
 
-    glib::timeout_add_local(50, move || match rx.try_recv() {
-        Err(TryRecvError::Empty) => Continue(true),
-        Err(TryRecvError::Disconnected) => Continue(false),
-        Ok(_resp) => {
+    glib::MainContext::default().spawn_local(async move {
+        if let Ok(_) = response.await {
             data.borrow_mut().redraw(None);
-            Continue(false)
         }
     });
 }
diff --git a/fractal-gtk/src/model/room.rs b/fractal-gtk/src/model/room.rs
index 89eee099..e11952be 100644
--- a/fractal-gtk/src/model/room.rs
+++ b/fractal-gtk/src/model/room.rs
@@ -1,5 +1,6 @@
 use serde_json::Value as JsonValue;
 
+use crate::app::RUNTIME;
 use crate::backend::user::get_user_avatar;
 use crate::model::member::Member;
 use crate::model::member::MemberList;
@@ -8,7 +9,6 @@ use either::Either;
 use fractal_api::directory::PublicRoomsChunk;
 use fractal_api::identifiers::{Error as IdError, EventId, RoomAliasId, RoomId, UserId};
 use fractal_api::r0::sync::sync_events::Response as SyncResponse;
-use fractal_api::r0::AccessToken;
 use fractal_api::url::{ParseError as UrlError, Url};
 use fractal_api::Client as MatrixClient;
 use log::{debug, info};
@@ -138,7 +138,6 @@ impl Room {
         session_client: MatrixClient,
         response: &SyncResponse,
         user_id: UserId,
-        access_token: AccessToken,
     ) -> Result<Vec<Self>, IdError> {
         // getting the list of direct rooms
         let direct: HashSet<RoomId> = parse_m_direct(&response.account_data.events)
@@ -211,8 +210,9 @@ impl Room {
                 let leave_id = UserId::try_from(last_event["sender"].as_str().unwrap_or_default())?;
                 if leave_id != user_id {
                     let kick_reason = &last_event["content"]["reason"];
-                    if let Ok((kicker_alias, kicker_avatar)) =
-                        get_user_avatar(session_client.clone(), access_token.clone(), &leave_id)
+                    if let Ok((kicker_alias, kicker_avatar)) = RUNTIME
+                        .handle()
+                        .block_on(get_user_avatar(session_client.clone(), &leave_id))
                     {
                         let kicker = Member {
                             alias: Some(kicker_alias),
@@ -250,12 +250,11 @@ impl Room {
                             && x["state_key"] == user_id.to_string().as_str()
                     })
                     .map_or(Ok(None), |ev| {
-                        Ok(get_user_avatar(
-                            session_client.clone(),
-                            access_token.clone(),
-                            &UserId::try_from(ev["sender"].as_str().unwrap_or_default())?,
-                        )
-                        .ok())
+                        let user_id = UserId::try_from(ev["sender"].as_str().unwrap_or_default())?;
+                        let avatar = RUNTIME
+                            .handle()
+                            .block_on(get_user_avatar(session_client.clone(), &user_id));
+                        Ok(avatar.ok())
                     });
                 if let Some((alias, avatar)) = alias_avatar? {
                     let inv_sender = Member {
diff --git a/fractal-gtk/src/widgets/media_viewer.rs b/fractal-gtk/src/widgets/media_viewer.rs
index 92bcd6bf..6e22a74e 100644
--- a/fractal-gtk/src/widgets/media_viewer.rs
+++ b/fractal-gtk/src/widgets/media_viewer.rs
@@ -1,6 +1,5 @@
 use crate::app::RUNTIME;
 use crate::backend::media;
-use crate::backend::ThreadPool;
 use fractal_api::r0::AccessToken;
 use glib::clone;
 
@@ -640,11 +639,7 @@ impl MediaViewer {
         }
     }
 
-    pub fn create(
-        &mut self,
-        session_client: MatrixClient,
-        thread_pool: ThreadPool,
-    ) -> Option<(gtk::Box, gtk::Box)> {
+    pub fn create(&mut self, session_client: MatrixClient) -> Option<(gtk::Box, gtk::Box)> {
         let body = self
             .builder
             .get_object::<gtk::Box>("media_viewer_box")
@@ -654,7 +649,7 @@ impl MediaViewer {
             .get_object::<gtk::Box>("media_viewer_headerbar_box")
             .expect("Can't find media_viewer_headerbar in ui file.");
         self.connect_media_viewer_headerbar(session_client.clone());
-        self.connect_media_viewer_box(session_client, thread_pool);
+        self.connect_media_viewer_box(session_client);
         self.connect_stop_video_when_leaving();
 
         Some((body, header))
@@ -728,11 +723,7 @@ impl MediaViewer {
         }));
     }
 
-    pub fn connect_media_viewer_box(
-        &mut self,
-        session_client: MatrixClient,
-        thread_pool: ThreadPool,
-    ) {
+    pub fn connect_media_viewer_box(&mut self, session_client: MatrixClient) {
         let full_screen_button = self
             .builder
             .get_object::<gtk::Button>("full_screen_button")
@@ -889,13 +880,13 @@ impl MediaViewer {
             .builder
             .get_object::<gtk::Button>("previous_media_button")
             .expect("Cant find previous_media_button in ui file.");
-        let s_client = session_client.clone();
-        let t_pool = thread_pool.clone();
-        previous_media_button.connect_clicked(clone!(@weak data => move |_| {
-            if !data.borrow_mut().previous_media(s_client.clone()) {
-                load_more_media(s_client.clone(), t_pool.clone(), data, builder.clone());
-            }
-        }));
+        previous_media_button.connect_clicked(
+            clone!(@strong session_client, @weak data => move |_| {
+                if !data.borrow_mut().previous_media(session_client.clone()) {
+                    load_more_media(session_client.clone(), data, builder.clone());
+                }
+            }),
+        );
 
         let next_media_button = self
             .builder
@@ -1021,12 +1012,7 @@ fn loading_state(ui: &gtk::Builder, val: bool) -> bool {
     val
 }
 
-fn load_more_media(
-    session_client: MatrixClient,
-    thread_pool: ThreadPool,
-    data: Rc<RefCell<Data>>,
-    builder: gtk::Builder,
-) {
+fn load_more_media(session_client: MatrixClient, data: Rc<RefCell<Data>>, builder: gtk::Builder) {
     data.borrow_mut().loading_more_media = loading_state(&builder, true);
 
     let msg = data.borrow().media_list[data.borrow().current_media_index].clone();
@@ -1053,7 +1039,6 @@ fn load_more_media(
                     data.borrow_mut().no_more_media = true;
                 }
 
-                let thread_pool = thread_pool.clone();
                 let media_list = data.borrow().media_list.clone();
                 let img_msgs: Vec<Message> = msgs
                     .into_iter()
@@ -1065,7 +1050,7 @@ fn load_more_media(
                 data.borrow_mut().media_list = new_media_list;
                 data.borrow_mut().prev_batch = Some(prev_batch);
                 if img_msgs_count == 0 {
-                    load_more_media(session_client.clone(), thread_pool, data, builder.clone());
+                    load_more_media(session_client.clone(), data, builder.clone());
                 } else {
                     data.borrow_mut().current_media_index += img_msgs_count;
                     data.borrow_mut().previous_media(session_client.clone());
diff --git a/fractal-gtk/src/widgets/member.rs b/fractal-gtk/src/widgets/member.rs
index 1977ba60..44a2f9ad 100644
--- a/fractal-gtk/src/widgets/member.rs
+++ b/fractal-gtk/src/widgets/member.rs
@@ -56,12 +56,15 @@ impl<'a> MemberBox<'a> {
             badge,
             None,
         );
-        if let Some(login_data) = self.op.login_data.clone() {
+        if let Some(session_client) = self
+            .op
+            .login_data
+            .as_ref()
+            .map(|ld| ld.session_client.clone())
+        {
             download_to_cache(
-                login_data.session_client.clone(),
-                self.op.thread_pool.clone(),
+                session_client,
                 self.op.user_info_cache.clone(),
-                login_data.access_token,
                 self.member.uid.clone(),
                 data,
             );
@@ -101,12 +104,15 @@ impl<'a> MemberBox<'a> {
             None,
             None,
         );
-        if let Some(login_data) = self.op.login_data.clone() {
+        if let Some(session_client) = self
+            .op
+            .login_data
+            .as_ref()
+            .map(|ld| ld.session_client.clone())
+        {
             download_to_cache(
-                login_data.session_client.clone(),
-                self.op.thread_pool.clone(),
+                session_client,
                 self.op.user_info_cache.clone(),
-                login_data.access_token,
                 self.member.uid.clone(),
                 data,
             );
diff --git a/fractal-gtk/src/widgets/message.rs b/fractal-gtk/src/widgets/message.rs
index 2dda58fb..fcdd7175 100644
--- a/fractal-gtk/src/widgets/message.rs
+++ b/fractal-gtk/src/widgets/message.rs
@@ -2,7 +2,6 @@ use crate::util::i18n::i18n;
 use itertools::Itertools;
 
 use crate::appop::UserInfoCache;
-use crate::backend::ThreadPool;
 use chrono::prelude::*;
 use either::Either;
 use fractal_api::r0::AccessToken;
@@ -73,7 +72,6 @@ impl MessageBox {
     pub fn create(
         &mut self,
         session_client: MatrixClient,
-        thread_pool: ThreadPool,
         user_info_cache: UserInfoCache,
         msg: &Message,
         has_header: bool,
@@ -110,7 +108,7 @@ impl MessageBox {
             _ if has_header => {
                 self.row.set_margin_top(12);
                 self.header = true;
-                self.widget(session_client, thread_pool, user_info_cache, msg)
+                self.widget(session_client, user_info_cache, msg)
             }
             _ => {
                 self.header = false;
@@ -131,18 +129,10 @@ impl MessageBox {
     pub fn tmpwidget(
         mut self,
         session_client: MatrixClient,
-        thread_pool: ThreadPool,
         user_info_cache: UserInfoCache,
         msg: &Message,
     ) -> MessageBox {
-        self.create(
-            session_client,
-            thread_pool,
-            user_info_cache,
-            msg,
-            true,
-            true,
-        );
+        self.create(session_client, user_info_cache, msg, true, true);
         {
             let w = self.get_listbox_row();
             w.get_style_context().add_class("msg-tmp");
@@ -153,7 +143,6 @@ impl MessageBox {
     pub fn update_header(
         &mut self,
         session_client: MatrixClient,
-        thread_pool: ThreadPool,
         user_info_cache: UserInfoCache,
         msg: Message,
         has_header: bool,
@@ -161,7 +150,7 @@ impl MessageBox {
         let w = if has_header && msg.mtype != RowType::Emote {
             self.row.set_margin_top(12);
             self.header = true;
-            self.widget(session_client, thread_pool, user_info_cache, &msg)
+            self.widget(session_client, user_info_cache, &msg)
         } else {
             if let RowType::Emote = msg.mtype {
                 self.row.set_margin_top(12);
@@ -179,7 +168,6 @@ impl MessageBox {
     fn widget(
         &mut self,
         session_client: MatrixClient,
-        thread_pool: ThreadPool,
         user_info_cache: UserInfoCache,
         msg: &Message,
     ) -> gtk::Box {
@@ -190,7 +178,7 @@ impl MessageBox {
         let msg_widget = gtk::Box::new(gtk::Orientation::Horizontal, 10);
         let content = self.build_room_msg_content(session_client.clone(), msg, false);
         /* Todo: make build_room_msg_avatar() faster (currently ~1ms) */
-        let avatar = self.build_room_msg_avatar(session_client, thread_pool, user_info_cache, msg);
+        let avatar = self.build_room_msg_avatar(session_client, user_info_cache, msg);
 
         msg_widget.pack_start(&avatar, false, false, 0);
         msg_widget.pack_start(&content, true, true, 0);
@@ -275,7 +263,6 @@ impl MessageBox {
     fn build_room_msg_avatar(
         &self,
         session_client: MatrixClient,
-        thread_pool: ThreadPool,
         user_info_cache: UserInfoCache,
         msg: &Message,
     ) -> widgets::Avatar {
@@ -297,14 +284,7 @@ impl MessageBox {
             self.username.set_text(&uid.to_string());
         }
 
-        download_to_cache(
-            session_client,
-            thread_pool,
-            user_info_cache,
-            self.access_token.clone(),
-            uid.clone(),
-            data.clone(),
-        );
+        download_to_cache(session_client, user_info_cache, uid.clone(), data.clone());
         download_to_cache_username(
             self.server_url.clone(),
             self.access_token.clone(),
diff --git a/fractal-gtk/src/widgets/room_history.rs b/fractal-gtk/src/widgets/room_history.rs
index 6126b01c..54192084 100644
--- a/fractal-gtk/src/widgets/room_history.rs
+++ b/fractal-gtk/src/widgets/room_history.rs
@@ -13,7 +13,6 @@ use crate::uitypes::MessageContent;
 use crate::uitypes::RowType;
 use crate::util::i18n::i18n;
 
-use crate::backend::ThreadPool;
 use crate::globals;
 use crate::widgets;
 use crate::widgets::{PlayerExt, VideoPlayerWidget};
@@ -314,7 +313,6 @@ impl RoomHistory {
     pub fn create(
         &mut self,
         session_client: MatrixClient,
-        thread_pool: ThreadPool,
         user_info_cache: UserInfoCache,
         mut messages: Vec<MessageContent>,
     ) -> Option<()> {
@@ -327,14 +325,9 @@ impl RoomHistory {
         }
         let bottom = messages.split_off(position);
         messages.reverse();
-        self.add_old_messages_in_batch(
-            session_client.clone(),
-            thread_pool.clone(),
-            user_info_cache.clone(),
-            messages,
-        );
+        self.add_old_messages_in_batch(session_client.clone(), user_info_cache.clone(), messages);
         /* Add the rest of the messages after the new message divider */
-        self.add_new_messages_in_batch(session_client, thread_pool, user_info_cache, bottom);
+        self.add_new_messages_in_batch(session_client, user_info_cache, bottom);
 
         let rows = &self.rows;
         let id = glib::timeout_add_local(
@@ -453,7 +446,6 @@ impl RoomHistory {
     fn run_queue(
         &mut self,
         session_client: MatrixClient,
-        thread_pool: ThreadPool,
         user_info_cache: UserInfoCache,
     ) -> Option<()> {
         let queue = self.queue.clone();
@@ -526,7 +518,6 @@ impl RoomHistory {
                     }
                     item.widget = Some(create_row(
                         session_client.clone(),
-                        thread_pool.clone(),
                         user_info_cache.clone(),
                         item.clone(),
                         has_header,
@@ -564,12 +555,11 @@ impl RoomHistory {
     pub fn add_new_message(
         &mut self,
         session_client: MatrixClient,
-        thread_pool: ThreadPool,
         user_info_cache: UserInfoCache,
         mut item: MessageContent,
     ) -> Option<()> {
         if item.msg.replace.is_some() {
-            self.replace_message(session_client, thread_pool, user_info_cache, item);
+            self.replace_message(session_client, user_info_cache, item);
             return None;
         }
         let mut rows = self.rows.borrow_mut();
@@ -603,7 +593,6 @@ impl RoomHistory {
 
         let b = create_row(
             session_client,
-            thread_pool,
             user_info_cache,
             item.clone(),
             has_header,
@@ -618,7 +607,6 @@ impl RoomHistory {
     pub fn replace_message(
         &mut self,
         session_client: MatrixClient,
-        thread_pool: ThreadPool,
         user_info_cache: UserInfoCache,
         mut item: MessageContent,
     ) -> Option<()> {
@@ -642,7 +630,6 @@ impl RoomHistory {
 
         item.widget = Some(create_row(
             session_client,
-            thread_pool,
             user_info_cache,
             item.clone(),
             msg_widget.header,
@@ -656,7 +643,6 @@ impl RoomHistory {
     pub fn remove_message(
         &mut self,
         session_client: MatrixClient,
-        thread_pool: ThreadPool,
         user_info_cache: UserInfoCache,
         item: MessageContent,
     ) -> Option<()> {
@@ -702,13 +688,7 @@ impl RoomHistory {
                     msg_next_cloned.redactable && msg_next_cloned.sender == msg_sender
                 })
             {
-                msg_widget.update_header(
-                    session_client,
-                    thread_pool,
-                    user_info_cache,
-                    msg_next_cloned,
-                    true,
-                );
+                msg_widget.update_header(session_client, user_info_cache, msg_next_cloned, true);
             }
         }
         None
@@ -717,18 +697,12 @@ impl RoomHistory {
     pub fn add_new_messages_in_batch(
         &mut self,
         session_client: MatrixClient,
-        thread_pool: ThreadPool,
         user_info_cache: UserInfoCache,
         messages: Vec<MessageContent>,
     ) -> Option<()> {
         /* TODO: use lazy loading */
         for item in messages {
-            self.add_new_message(
-                session_client.clone(),
-                thread_pool.clone(),
-                user_info_cache.clone(),
-                item,
-            );
+            self.add_new_message(session_client.clone(), user_info_cache.clone(), item);
         }
         None
     }
@@ -736,7 +710,6 @@ impl RoomHistory {
     pub fn add_old_messages_in_batch(
         &mut self,
         session_client: MatrixClient,
-        thread_pool: ThreadPool,
         user_info_cache: UserInfoCache,
         messages: Vec<MessageContent>,
     ) -> Option<()> {
@@ -745,7 +718,7 @@ impl RoomHistory {
         self.queue
             .borrow_mut()
             .append(&mut VecDeque::from(messages));
-        self.run_queue(session_client, thread_pool, user_info_cache);
+        self.run_queue(session_client, user_info_cache);
 
         None
     }
@@ -768,7 +741,6 @@ impl RoomHistory {
 /* This function creates the content for a Row based on the content of msg */
 fn create_row(
     session_client: MatrixClient,
-    thread_pool: ThreadPool,
     user_info_cache: UserInfoCache,
     row: MessageContent,
     has_header: bool,
@@ -781,7 +753,6 @@ fn create_row(
     let mut mb = widgets::MessageBox::new(server_url, access_token);
     mb.create(
         session_client,
-        thread_pool,
         user_info_cache,
         &row,
         has_header && row.mtype != RowType::Emote,
diff --git a/fractal-matrix-api/src/meson.build b/fractal-matrix-api/src/meson.build
index 386bdfba..618a5df4 100644
--- a/fractal-matrix-api/src/meson.build
+++ b/fractal-matrix-api/src/meson.build
@@ -15,7 +15,6 @@ api_sources = files(
   'r0/contact/request_verification_token_msisdn.rs',
   'r0/media/create_content.rs',
   'r0/profile/get_display_name.rs',
-  'r0/profile/get_profile.rs',
   'r0/profile/set_avatar_url.rs',
   'r0/profile/set_display_name.rs',
   'r0/server/domain_info.rs',
diff --git a/fractal-matrix-api/src/r0/profile.rs b/fractal-matrix-api/src/r0/profile.rs
index c556486e..62d77463 100644
--- a/fractal-matrix-api/src/r0/profile.rs
+++ b/fractal-matrix-api/src/r0/profile.rs
@@ -1,4 +1,3 @@
 pub mod get_display_name;
-pub mod get_profile;
 pub mod set_avatar_url;
 pub mod set_display_name;



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]