diff options
| -rw-r--r-- | installer-downloader/src/cacao_impl/delegate.rs | 4 | ||||
| -rw-r--r-- | installer-downloader/src/controller.rs | 2 | ||||
| -rw-r--r-- | installer-downloader/src/delegate.rs | 3 | ||||
| -rw-r--r-- | installer-downloader/src/ui_downloader.rs | 47 | ||||
| -rw-r--r-- | installer-downloader/src/winapi_impl/delegate.rs | 4 | ||||
| -rw-r--r-- | installer-downloader/tests/controller.rs | 7 | ||||
| -rw-r--r-- | installer-downloader/tests/snapshots/controller__download-3.snap | 2 | ||||
| -rw-r--r-- | installer-downloader/tests/snapshots/controller__failed_verification.snap | 2 | ||||
| -rw-r--r-- | mullvad-update/src/client/fetch.rs | 7 |
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(); } |
