mirror of
https://gitlab.gnome.org/World/Authenticator.git
synced 2025-03-04 08:44:40 +01:00
provider image: properly abort old tasks
This commit is contained in:
parent
2a57aed29f
commit
022b9d072e
3 changed files with 35 additions and 13 deletions
1
Cargo.lock
generated
1
Cargo.lock
generated
|
@ -249,7 +249,6 @@ dependencies = [
|
||||||
"binascii",
|
"binascii",
|
||||||
"diesel",
|
"diesel",
|
||||||
"diesel_migrations",
|
"diesel_migrations",
|
||||||
"futures",
|
|
||||||
"gettext-rs",
|
"gettext-rs",
|
||||||
"gst-plugin-gtk4",
|
"gst-plugin-gtk4",
|
||||||
"gstreamer",
|
"gstreamer",
|
||||||
|
|
|
@ -10,7 +10,6 @@ ashpd = {version = "0.3", features = ["feature_pipewire", "feature_gtk4"]}
|
||||||
binascii = "0.1"
|
binascii = "0.1"
|
||||||
diesel = {version = "1.4", features = ["sqlite", "r2d2"]}
|
diesel = {version = "1.4", features = ["sqlite", "r2d2"]}
|
||||||
diesel_migrations = {version = "1.4", features = ["sqlite"]}
|
diesel_migrations = {version = "1.4", features = ["sqlite"]}
|
||||||
futures = "0.3"
|
|
||||||
gettext-rs = {version = "0.7", features = ["gettext-system"]}
|
gettext-rs = {version = "0.7", features = ["gettext-system"]}
|
||||||
gst = {package = "gstreamer", version = "0.18"}
|
gst = {package = "gstreamer", version = "0.18"}
|
||||||
gst4gtk = { package = "gst-plugin-gtk4", version = "0.1"}
|
gst4gtk = { package = "gst-plugin-gtk4", version = "0.1"}
|
||||||
|
|
|
@ -27,6 +27,8 @@ mod imp {
|
||||||
pub image: TemplateChild<gtk::Image>,
|
pub image: TemplateChild<gtk::Image>,
|
||||||
#[template_child]
|
#[template_child]
|
||||||
pub spinner: TemplateChild<gtk::Spinner>,
|
pub spinner: TemplateChild<gtk::Spinner>,
|
||||||
|
pub signal_id: RefCell<Option<glib::SignalHandlerId>>,
|
||||||
|
pub join_handle: RefCell<Option<tokio::task::JoinHandle<()>>>,
|
||||||
}
|
}
|
||||||
|
|
||||||
#[glib::object_subclass]
|
#[glib::object_subclass]
|
||||||
|
@ -46,6 +48,8 @@ mod imp {
|
||||||
image: TemplateChild::default(),
|
image: TemplateChild::default(),
|
||||||
spinner: TemplateChild::default(),
|
spinner: TemplateChild::default(),
|
||||||
provider: RefCell::new(None),
|
provider: RefCell::new(None),
|
||||||
|
signal_id: Default::default(),
|
||||||
|
join_handle: Default::default(),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -132,13 +136,20 @@ impl ProviderImage {
|
||||||
imp.spinner.start();
|
imp.spinner.start();
|
||||||
self.on_provider_image_changed();
|
self.on_provider_image_changed();
|
||||||
}
|
}
|
||||||
provider.connect_notify_local(
|
let signal_id = provider.connect_notify_local(
|
||||||
Some("image-uri"),
|
Some("image-uri"),
|
||||||
clone!(@weak self as image => move |_, _| {
|
clone!(@weak self as image => move |_, _| {
|
||||||
image.on_provider_image_changed();
|
image.on_provider_image_changed();
|
||||||
}),
|
}),
|
||||||
);
|
);
|
||||||
|
imp.signal_id.replace(Some(signal_id));
|
||||||
return;
|
return;
|
||||||
|
} else {
|
||||||
|
if let (Some(signal_id), Some(provider)) =
|
||||||
|
(imp.signal_id.borrow_mut().take(), self.provider())
|
||||||
|
{
|
||||||
|
provider.disconnect(signal_id);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
imp.image.set_from_icon_name(Some("provider-fallback"));
|
imp.image.set_from_icon_name(Some("provider-fallback"));
|
||||||
|
@ -179,6 +190,9 @@ impl ProviderImage {
|
||||||
|
|
||||||
fn fetch(&self) {
|
fn fetch(&self) {
|
||||||
let imp = self.imp();
|
let imp = self.imp();
|
||||||
|
if let Some(handle) = imp.join_handle.borrow_mut().take() {
|
||||||
|
handle.abort();
|
||||||
|
}
|
||||||
if let Some(provider) = self.provider() {
|
if let Some(provider) = self.provider() {
|
||||||
imp.stack.set_visible_child_name("loading");
|
imp.stack.set_visible_child_name("loading");
|
||||||
imp.spinner.start();
|
imp.spinner.start();
|
||||||
|
@ -186,8 +200,8 @@ impl ProviderImage {
|
||||||
if let Some(website) = provider.website() {
|
if let Some(website) = provider.website() {
|
||||||
let id = provider.id();
|
let id = provider.id();
|
||||||
let name = provider.name();
|
let name = provider.name();
|
||||||
let (sender, receiver) = futures::channel::oneshot::channel();
|
let (sender, receiver) = tokio::sync::oneshot::channel();
|
||||||
RUNTIME.spawn(async move {
|
let future = async move {
|
||||||
match Provider::favicon(website, name, id).await {
|
match Provider::favicon(website, name, id).await {
|
||||||
Ok(cache_name) => {
|
Ok(cache_name) => {
|
||||||
sender.send(Some(cache_name)).unwrap();
|
sender.send(Some(cache_name)).unwrap();
|
||||||
|
@ -196,16 +210,24 @@ impl ProviderImage {
|
||||||
log::error!("Failed to load favicon {}", err);
|
log::error!("Failed to load favicon {}", err);
|
||||||
sender.send(None).unwrap();
|
sender.send(None).unwrap();
|
||||||
}
|
}
|
||||||
}
|
};
|
||||||
});
|
};
|
||||||
|
let join_handle = RUNTIME.spawn(future);
|
||||||
|
imp.join_handle.borrow_mut().replace(join_handle);
|
||||||
|
|
||||||
glib::MainContext::default().spawn_local(clone!(@weak self as this => async move {
|
glib::MainContext::default().spawn_local(clone!(@weak self as this => async move {
|
||||||
let imp = this.imp();
|
let imp = this.imp();
|
||||||
let response = receiver.await.unwrap();
|
match receiver.await {
|
||||||
if let Some(cache_name) = response {
|
Ok(Some(cache_name)) => {
|
||||||
send!(imp.sender.clone(), ImageAction::Ready(cache_name));
|
send!(imp.sender.clone(), ImageAction::Ready(cache_name));
|
||||||
} else {
|
}
|
||||||
send!(imp.sender.clone(), ImageAction::Failed);
|
Ok(None) => {
|
||||||
}
|
send!(imp.sender.clone(), ImageAction::Failed);
|
||||||
|
},
|
||||||
|
Err(_) => {
|
||||||
|
log::debug!("Provider image fetching aborted");
|
||||||
|
}
|
||||||
|
};
|
||||||
}));
|
}));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -261,9 +283,11 @@ impl ProviderImage {
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
if let Some(provider) = self.provider() {
|
if let Some(provider) = self.provider() {
|
||||||
|
let guard = provider.freeze_notify();
|
||||||
if let Err(err) = provider.set_image_uri(&image_path) {
|
if let Err(err) = provider.set_image_uri(&image_path) {
|
||||||
warn!("Failed to update provider image {}", err);
|
warn!("Failed to update provider image {}", err);
|
||||||
}
|
}
|
||||||
|
drop(guard);
|
||||||
}
|
}
|
||||||
|
|
||||||
imp.stack.set_visible_child_name("image");
|
imp.stack.set_visible_child_name("image");
|
||||||
|
|
Loading…
Add table
Reference in a new issue