From 5f0a822d7d7866b5cd3e729412ccd7da563a5dff Mon Sep 17 00:00:00 2001
From: Ayush Singh <ayush@beagleboard.org>
Date: Sun, 11 Aug 2024 02:17:42 +0530
Subject: [PATCH] gui: Send notification on flash finish

- Send a notification in platform agnostic manner once flashing is
  finished.

Signed-off-by: Ayush Singh <ayush@beagleboard.org>
---
 Cargo.lock      | 138 ++++++++++++++++++++++++++++++++++++++++++++++--
 gui/Cargo.toml  |   1 +
 gui/src/main.rs |  16 ++++++
 3 files changed, 151 insertions(+), 4 deletions(-)

diff --git a/Cargo.lock b/Cargo.lock
index fa37755..2076454 100644
--- a/Cargo.lock
+++ b/Cargo.lock
@@ -1190,6 +1190,16 @@ dependencies = [
  "dirs-sys",
 ]
 
+[[package]]
+name = "dirs-next"
+version = "2.0.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "b98cf8ebf19c3d1b223e151f99a4f9f0690dca41414773390fc824184ac833e1"
+dependencies = [
+ "cfg-if",
+ "dirs-sys-next",
+]
+
 [[package]]
 name = "dirs-sys"
 version = "0.4.1"
@@ -1202,6 +1212,17 @@ dependencies = [
  "windows-sys 0.48.0",
 ]
 
+[[package]]
+name = "dirs-sys-next"
+version = "0.1.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "4ebda144c4fe02d1f7ea1a7d9641b6fc6b580adcfa024ae48797ecdeb6825b4d"
+dependencies = [
+ "libc",
+ "redox_users",
+ "winapi",
+]
+
 [[package]]
 name = "dispatch"
 version = "0.2.0"
@@ -1820,6 +1841,7 @@ dependencies = [
  "iced",
  "iced_aw",
  "image 0.25.2",
+ "notify-rust",
  "rfd",
  "tokio",
  "tracing",
@@ -2716,6 +2738,19 @@ dependencies = [
  "crc",
 ]
 
+[[package]]
+name = "mac-notification-sys"
+version = "0.6.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "51fca4d74ff9dbaac16a01b924bc3693fa2bba0862c2c633abc73f9a8ea21f64"
+dependencies = [
+ "cc",
+ "dirs-next",
+ "objc-foundation",
+ "objc_id",
+ "time",
+]
+
 [[package]]
 name = "mach2"
 version = "0.4.2"
@@ -2980,6 +3015,19 @@ version = "0.3.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "0676bb32a98c1a483ce53e500a81ad9c3d5b3f7c920c28c24e9cb0980d0b5bc8"
 
+[[package]]
+name = "notify-rust"
+version = "4.11.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "26a1d03b6305ecefdd9c6c60150179bb8d9f0cd4e64bbcad1e41419e7bf5e414"
+dependencies = [
+ "log",
+ "mac-notification-sys",
+ "serde",
+ "tauri-winrt-notification",
+ "zbus",
+]
+
 [[package]]
 name = "nu-ansi-term"
 version = "0.46.0"
@@ -3674,6 +3722,15 @@ version = "2.0.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "a993555f31e5a609f617c12db6250dedcac1b0a85076912c436e6fc9b2c8e6a3"
 
+[[package]]
+name = "quick-xml"
+version = "0.31.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "1004a344b30a54e2ee58d66a71b32d2db2feb0a31f9a2d302bf0536f15de2a33"
+dependencies = [
+ "memchr",
+]
+
 [[package]]
 name = "quick-xml"
 version = "0.32.0"
@@ -4704,6 +4761,17 @@ version = "0.12.15"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "4873307b7c257eddcb50c9bedf158eb669578359fb28428bef438fec8e6ba7c2"
 
+[[package]]
+name = "tauri-winrt-notification"
+version = "0.2.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "f89f5fb70d6f62381f5d9b2ba9008196150b40b75f3068eb24faeddf1c686871"
+dependencies = [
+ "quick-xml 0.31.0",
+ "windows 0.56.0",
+ "windows-version",
+]
+
 [[package]]
 name = "tempfile"
 version = "3.10.1"
@@ -5809,6 +5877,16 @@ dependencies = [
  "windows-targets 0.52.6",
 ]
 
+[[package]]
+name = "windows"
+version = "0.56.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "1de69df01bdf1ead2f4ac895dc77c9351aefff65b2f3db429a343f9cbf05e132"
+dependencies = [
+ "windows-core 0.56.0",
+ "windows-targets 0.52.6",
+]
+
 [[package]]
 name = "windows"
 version = "0.58.0"
@@ -5828,19 +5906,42 @@ dependencies = [
  "windows-targets 0.52.6",
 ]
 
+[[package]]
+name = "windows-core"
+version = "0.56.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "4698e52ed2d08f8658ab0c39512a7c00ee5fe2688c65f8c0a4f06750d729f2a6"
+dependencies = [
+ "windows-implement 0.56.0",
+ "windows-interface 0.56.0",
+ "windows-result 0.1.2",
+ "windows-targets 0.52.6",
+]
+
 [[package]]
 name = "windows-core"
 version = "0.58.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "6ba6d44ec8c2591c134257ce647b7ea6b20335bf6379a27dac5f1641fcf59f99"
 dependencies = [
- "windows-implement",
- "windows-interface",
- "windows-result",
+ "windows-implement 0.58.0",
+ "windows-interface 0.58.0",
+ "windows-result 0.2.0",
  "windows-strings",
  "windows-targets 0.52.6",
 ]
 
+[[package]]
+name = "windows-implement"
+version = "0.56.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "f6fc35f58ecd95a9b71c4f2329b911016e6bec66b3f2e6a4aad86bd2e99e2f9b"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "syn 2.0.70",
+]
+
 [[package]]
 name = "windows-implement"
 version = "0.58.0"
@@ -5852,6 +5953,17 @@ dependencies = [
  "syn 2.0.70",
 ]
 
+[[package]]
+name = "windows-interface"
+version = "0.56.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "08990546bf4edef8f431fa6326e032865f27138718c587dc21bc0265bbcb57cc"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "syn 2.0.70",
+]
+
 [[package]]
 name = "windows-interface"
 version = "0.58.0"
@@ -5863,6 +5975,15 @@ dependencies = [
  "syn 2.0.70",
 ]
 
+[[package]]
+name = "windows-result"
+version = "0.1.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "5e383302e8ec8515204254685643de10811af0ed97ea37210dc26fb0032647f8"
+dependencies = [
+ "windows-targets 0.52.6",
+]
+
 [[package]]
 name = "windows-result"
 version = "0.2.0"
@@ -5878,7 +5999,7 @@ version = "0.1.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "4cd9b125c486025df0eabcb585e62173c6c9eddcec5d117d3b6e8c30e2ee4d10"
 dependencies = [
- "windows-result",
+ "windows-result 0.2.0",
  "windows-targets 0.52.6",
 ]
 
@@ -5955,6 +6076,15 @@ dependencies = [
  "windows_x86_64_msvc 0.52.6",
 ]
 
+[[package]]
+name = "windows-version"
+version = "0.1.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "6998aa457c9ba8ff2fb9f13e9d2a930dabcea28f1d0ab94d687d8b3654844515"
+dependencies = [
+ "windows-targets 0.52.6",
+]
+
 [[package]]
 name = "windows_aarch64_gnullvm"
 version = "0.42.2"
diff --git a/gui/Cargo.toml b/gui/Cargo.toml
index a2c3d59..84e102f 100644
--- a/gui/Cargo.toml
+++ b/gui/Cargo.toml
@@ -15,6 +15,7 @@ image = "0.25.2"
 futures-util = "0.3.30"
 tokio = { version = "1.39.2", default-features = false, features = ["macros"] }
 webbrowser = "1.0.1"
+notify-rust = "4.11.1"
 
 [package.metadata.appimage]
 auto_link = true
diff --git a/gui/src/main.rs b/gui/src/main.rs
index d11f351..32dfeca 100644
--- a/gui/src/main.rs
+++ b/gui/src/main.rs
@@ -289,7 +289,23 @@ impl Application for BBImager {
             }
             BBImagerMessage::StopFlashing(x) => {
                 self.flashing = false;
+                let content = x.label.to_string();
                 self.progress_bar = x;
+                return Command::perform(
+                    async move {
+                        let res = tokio::task::spawn_blocking(move || {
+                            notify_rust::Notification::new()
+                                .appname("BeagleBoard Imager")
+                                .body(&content)
+                                .finalize()
+                                .show()
+                        })
+                        .await
+                        .unwrap();
+                        tracing::debug!("Notification response {res:?}");
+                    },
+                    |_| BBImagerMessage::Null,
+                );
             }
             BBImagerMessage::Destinations(x) => {
                 self.destinations = x;
-- 
GitLab