summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorDavid Lönnhager <david.l@mullvad.net>2025-03-03 15:56:34 +0100
committerDavid Lönnhager <david.l@mullvad.net>2025-03-05 23:32:47 +0100
commit47ef9dea7087f8e89a840dbf70faf5b9877fe42e (patch)
treeff0bc1c843b1980d6c76f9e47fe9dec577e3b88b
parenta0e7b804164a464c94fb0c7390575a021fdffe7d (diff)
downloadmullvadvpn-47ef9dea7087f8e89a840dbf70faf5b9877fe42e.tar.xz
mullvadvpn-47ef9dea7087f8e89a840dbf70faf5b9877fe42e.zip
Add clear_progress
-rw-r--r--installer-downloader/src/cacao_impl/delegate.rs4
-rw-r--r--installer-downloader/src/controller.rs2
-rw-r--r--installer-downloader/src/delegate.rs3
-rw-r--r--installer-downloader/src/ui_downloader.rs47
-rw-r--r--installer-downloader/src/winapi_impl/delegate.rs4
-rw-r--r--installer-downloader/tests/controller.rs7
-rw-r--r--installer-downloader/tests/snapshots/controller__download-3.snap2
-rw-r--r--installer-downloader/tests/snapshots/controller__failed_verification.snap2
-rw-r--r--mullvad-update/src/client/fetch.rs7
9 files changed, 65 insertions, 13 deletions
diff --git a/installer-downloader/src/cacao_impl/delegate.rs b/installer-downloader/src/cacao_impl/delegate.rs
index 645fc1aa63..c7dc9d3476 100644
--- a/installer-downloader/src/cacao_impl/delegate.rs
+++ b/installer-downloader/src/cacao_impl/delegate.rs
@@ -59,6 +59,10 @@ impl AppDelegate for AppWindow {
self.progress.set_value(complete as f64);
}
+ fn clear_download_progress(&mut self) {
+ self.progress.set_value(0.);
+ }
+
fn show_download_button(&mut self) {
self.download_button.set_hidden(false);
}
diff --git a/installer-downloader/src/controller.rs b/installer-downloader/src/controller.rs
index c679a338ea..94c15de36d 100644
--- a/installer-downloader/src/controller.rs
+++ b/installer-downloader/src/controller.rs
@@ -445,7 +445,7 @@ impl<D: AppDelegate + 'static, A: From<UiAppDownloaderParameters<D>> + AppDownlo
self_.hide_cancel_button();
self_.hide_download_progress();
- self_.set_download_progress(0);
+ self_.clear_download_progress();
});
}
}
diff --git a/installer-downloader/src/delegate.rs b/installer-downloader/src/delegate.rs
index 6eff3a4a37..17182bd0d1 100644
--- a/installer-downloader/src/delegate.rs
+++ b/installer-downloader/src/delegate.rs
@@ -48,6 +48,9 @@ pub trait AppDelegate {
/// Update download progress bar
fn set_download_progress(&mut self, complete: u32);
+ /// Clear download progress
+ fn clear_download_progress(&mut self);
+
/// Enable download button
fn enable_download_button(&mut self);
diff --git a/installer-downloader/src/ui_downloader.rs b/installer-downloader/src/ui_downloader.rs
index acb6c528e5..9c97b17b8a 100644
--- a/installer-downloader/src/ui_downloader.rs
+++ b/installer-downloader/src/ui_downloader.rs
@@ -143,29 +143,58 @@ impl<Delegate: AppDelegate> UiProgressUpdater<Delegate> {
queue,
}
}
+
+ fn need_update(&mut self, complete: u32) -> bool {
+ if self.prev_progress == Some(complete) {
+ // Unconditionally updating causes flickering
+ return false;
+ }
+ self.prev_progress = Some(complete);
+ true
+ }
+
+ fn complete_from_percentage(fraction_complete: f32) -> u32 {
+ (100.0 * fraction_complete).min(100.0) as u32
+ }
+
+ fn status_text(&self, complete_percentage: u32) -> String {
+ format!(
+ "{} {}... ({complete_percentage}%)",
+ resource::DOWNLOADING_DESC_PREFIX,
+ self.domain
+ )
+ }
}
impl<Delegate: AppDelegate + 'static> fetch::ProgressUpdater for UiProgressUpdater<Delegate> {
fn set_progress(&mut self, fraction_complete: f32) {
- let value = (100.0 * fraction_complete).min(100.0) as u32;
+ let value = Self::complete_from_percentage(fraction_complete);
- if self.prev_progress == Some(value) {
- // Unconditionally updating causes flickering
+ if !self.need_update(value) {
return;
}
- let status = format!(
- "{} {}... ({value}%)",
- resource::DOWNLOADING_DESC_PREFIX,
- self.domain
- );
+ let status = self.status_text(value);
self.queue.queue_main(move |self_| {
self_.set_download_progress(value);
self_.set_download_text(&status);
});
+ }
- self.prev_progress = Some(value);
+ fn clear_progress(&mut self) {
+ let value = 0;
+
+ if !self.need_update(value) {
+ return;
+ }
+
+ let status = self.status_text(value);
+
+ self.queue.queue_main(move |self_| {
+ self_.clear_download_progress();
+ self_.set_download_text(&status);
+ });
}
fn set_url(&mut self, url: &str) {
diff --git a/installer-downloader/src/winapi_impl/delegate.rs b/installer-downloader/src/winapi_impl/delegate.rs
index 3df758b077..1312f5aec9 100644
--- a/installer-downloader/src/winapi_impl/delegate.rs
+++ b/installer-downloader/src/winapi_impl/delegate.rs
@@ -71,6 +71,10 @@ impl AppDelegate for AppWindow {
self.progress_bar.set_pos(complete);
}
+ fn clear_download_progress(&mut self) {
+ self.progress_bar.set_pos(0);
+ }
+
fn show_download_button(&mut self) {
self.download_button.set_visible(true);
}
diff --git a/installer-downloader/tests/controller.rs b/installer-downloader/tests/controller.rs
index e2325adcb9..6eb9e727d0 100644
--- a/installer-downloader/tests/controller.rs
+++ b/installer-downloader/tests/controller.rs
@@ -96,7 +96,7 @@ impl<const EXE_SUCCEED: bool, const VERIFY_SUCCEED: bool, const LAUNCH_SUCCEED:
{
async fn download_executable(&mut self) -> Result<(), DownloadError> {
self.params.app_progress.set_url(&self.params.app_url);
- self.params.app_progress.set_progress(0.);
+ self.params.app_progress.clear_progress();
if EXE_SUCCEED {
self.params.app_progress.set_progress(1.);
Ok(())
@@ -269,6 +269,11 @@ impl AppDelegate for FakeAppDelegate {
self.state.download_progress = complete;
}
+ fn clear_download_progress(&mut self) {
+ self.state.call_log.push(format!("clear_download_progress"));
+ self.state.download_progress = 0;
+ }
+
fn show_download_button(&mut self) {
self.state.call_log.push("show_download_button".into());
self.state.download_button_visible = true;
diff --git a/installer-downloader/tests/snapshots/controller__download-3.snap b/installer-downloader/tests/snapshots/controller__download-3.snap
index c995f67c92..f7c952b191 100644
--- a/installer-downloader/tests/snapshots/controller__download-3.snap
+++ b/installer-downloader/tests/snapshots/controller__download-3.snap
@@ -43,7 +43,7 @@ call_log:
- show_cancel_button
- enable_cancel_button
- show_download_progress
- - "set_download_progress: 0"
+ - clear_download_progress
- "set_download_text: Downloading from mullvad.net... (0%)"
- "set_download_progress: 100"
- "set_download_text: Downloading from mullvad.net... (100%)"
diff --git a/installer-downloader/tests/snapshots/controller__failed_verification.snap b/installer-downloader/tests/snapshots/controller__failed_verification.snap
index 3269280f94..0f672c029b 100644
--- a/installer-downloader/tests/snapshots/controller__failed_verification.snap
+++ b/installer-downloader/tests/snapshots/controller__failed_verification.snap
@@ -43,7 +43,7 @@ call_log:
- show_cancel_button
- enable_cancel_button
- show_download_progress
- - "set_download_progress: 0"
+ - clear_download_progress
- "set_download_text: Downloading from mullvad.net... (0%)"
- "set_download_progress: 100"
- "set_download_text: Downloading from mullvad.net... (100%)"
diff --git a/mullvad-update/src/client/fetch.rs b/mullvad-update/src/client/fetch.rs
index db0a64c4cf..2a66fc68bc 100644
--- a/mullvad-update/src/client/fetch.rs
+++ b/mullvad-update/src/client/fetch.rs
@@ -19,6 +19,9 @@ pub trait ProgressUpdater: Send + 'static {
/// Progress so far
fn set_progress(&mut self, fraction_complete: f32);
+ /// Clear progress so far
+ fn clear_progress(&mut self);
+
/// URL that is being downloaded
fn set_url(&mut self, url: &str);
}
@@ -312,6 +315,10 @@ mod test {
self.complete = fraction_complete;
}
+ fn clear_progress(&mut self) {
+ self.complete = 0.;
+ }
+
fn set_url(&mut self, url: &str) {
self.url = url.to_owned();
}