From 7ce7762a9480eaa4d3976820ca6d216548a77688 Mon Sep 17 00:00:00 2001 From: Joakim Hulthe Date: Sat, 3 Jan 2026 21:04:10 +0100 Subject: [PATCH] Make it build for Android --- Cargo.lock | 111 ++++++++++++++++++++++-- gui/Cargo.toml | 29 ++++++- gui/android/keystore/default.keystore | Bin 0 -> 2662 bytes gui/android/resources/drawable/icon.png | Bin 0 -> 28510 bytes gui/src/android.rs | 8 ++ gui/src/lib.rs | 6 ++ 6 files changed, 144 insertions(+), 10 deletions(-) create mode 100644 gui/android/keystore/default.keystore create mode 100644 gui/android/resources/drawable/icon.png create mode 100644 gui/src/android.rs diff --git a/Cargo.lock b/Cargo.lock index fc15b34..e6fafd4 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -70,6 +70,27 @@ version = "0.2.21" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "683d7910e743518b0e34f1186f92494becacb047c7b6bf616c96772180fef923" +[[package]] +name = "android-activity" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ee91c0c2905bae44f84bfa4e044536541df26b7703fd0888deeb9060fcc44289" +dependencies = [ + "android-properties", + "bitflags 2.10.0", + "cc", + "cesu8", + "jni", + "jni-sys", + "libc", + "log", + "ndk 0.8.0", + "ndk-context", + "ndk-sys 0.5.0+25.2.9519653", + "num_enum", + "thiserror 1.0.69", +] + [[package]] name = "android-activity" version = "0.6.0" @@ -84,13 +105,22 @@ dependencies = [ "jni-sys", "libc", "log", - "ndk", + "ndk 0.9.0", "ndk-context", - "ndk-sys", + "ndk-sys 0.6.0+11769913", "num_enum", "thiserror 1.0.69", ] +[[package]] +name = "android-build" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8cac4c64175d504608cf239756339c07f6384a476f97f20a7043f92920b0b8fd" +dependencies = [ + "windows-sys 0.52.0", +] + [[package]] name = "android-properties" version = "0.2.2" @@ -667,7 +697,7 @@ checksum = "0b023947811758c97c59bf9d1c188fd619ad4718dcaa767947df1cadb14f39f4" dependencies = [ "glob", "libc", - "libloading", + "libloading 0.8.9", ] [[package]] @@ -1020,7 +1050,7 @@ version = "0.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "330c60081dcc4c72131f8eb70510f1ac07223e5d4163db481a04a0befcffa412" dependencies = [ - "libloading", + "libloading 0.8.9", ] [[package]] @@ -1652,7 +1682,7 @@ dependencies = [ "dispatch2", "glutin_egl_sys", "glutin_wgl_sys", - "libloading", + "libloading 0.8.9", "objc2 0.6.3", "objc2-app-kit 0.3.2", "objc2-core-foundation", @@ -1938,6 +1968,22 @@ dependencies = [ "tracing", ] +[[package]] +name = "i-slint-backend-android-activity" +version = "1.14.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "38c42a78b1ace78c7fa4ba42de61ba85799342c0b8c62adca33f3132dab427c6" +dependencies = [ + "android-activity 0.5.2", + "android-activity 0.6.0", + "android-build", + "i-slint-core", + "i-slint-renderer-skia", + "jni", + "ndk 0.9.0", + "raw-window-handle", +] + [[package]] name = "i-slint-backend-linuxkms" version = "1.14.1" @@ -1977,6 +2023,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e138660c634d6bbdf98bb2d0cfa487cda28e032e133a2a2c974f1cc494198765" dependencies = [ "cfg-if", + "i-slint-backend-android-activity", "i-slint-backend-linuxkms", "i-slint-backend-qt", "i-slint-backend-winit", @@ -2374,6 +2421,7 @@ dependencies = [ "tokio", "wasm-bindgen", "wasm-bindgen-futures", + "web-sys", "xdg", ] @@ -2522,6 +2570,15 @@ version = "1.0.15" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4a5f13b858c8d314ee3e8f639011f7ccefe71f97f96e50151fb991f267928e2c" +[[package]] +name = "java-locator" +version = "0.1.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "09c46c1fe465c59b1474e665e85e1256c3893dd00927b8d55f63b09044c1e64f" +dependencies = [ + "glob", +] + [[package]] name = "jni" version = "0.21.1" @@ -2531,7 +2588,9 @@ dependencies = [ "cesu8", "cfg-if", "combine", + "java-locator", "jni-sys", + "libloading 0.7.4", "log", "thiserror 1.0.69", "walkdir", @@ -2651,6 +2710,16 @@ dependencies = [ "cc", ] +[[package]] +name = "libloading" +version = "0.7.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b67380fd3b2fbe7527a606e18729d21c6f3951633d0500574c4dc22d2d638b9f" +dependencies = [ + "cfg-if", + "winapi", +] + [[package]] name = "libloading" version = "0.8.9" @@ -2953,6 +3022,20 @@ dependencies = [ "version_check", ] +[[package]] +name = "ndk" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2076a31b7010b17a38c01907c45b945e8f11495ee4dd588309718901b1f7a5b7" +dependencies = [ + "bitflags 2.10.0", + "jni-sys", + "log", + "ndk-sys 0.5.0+25.2.9519653", + "num_enum", + "thiserror 1.0.69", +] + [[package]] name = "ndk" version = "0.9.0" @@ -2962,7 +3045,7 @@ dependencies = [ "bitflags 2.10.0", "jni-sys", "log", - "ndk-sys", + "ndk-sys 0.6.0+11769913", "num_enum", "raw-window-handle", "thiserror 1.0.69", @@ -2974,6 +3057,15 @@ version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "27b02d87554356db9e9a873add8782d4ea6e3e58ea071a9adb9a2e8ddb884a8b" +[[package]] +name = "ndk-sys" +version = "0.5.0+25.2.9519653" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8c196769dd60fd4f363e11d948139556a344e79d451aeb2fa2fd040738ef7691" +dependencies = [ + "jni-sys", +] + [[package]] name = "ndk-sys" version = "0.6.0+11769913" @@ -4695,6 +4787,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9c35c4bdca2c42c69b21ceb416aa4ba76c3f54df30e9ce85dcad0742229422a6" dependencies = [ "const-field-offset", + "i-slint-backend-android-activity", "i-slint-backend-selector", "i-slint-core", "i-slint-core-macros", @@ -4883,7 +4976,7 @@ dependencies = [ "fastrand", "js-sys", "memmap2", - "ndk", + "ndk 0.9.0", "objc2 0.6.3", "objc2-core-foundation", "objc2-core-graphics", @@ -6544,7 +6637,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c66d4b9ed69c4009f6321f762d6e61ad8a2389cd431b97cb1e146812e9e6c732" dependencies = [ "ahash", - "android-activity", + "android-activity 0.6.0", "atomic-waker", "bitflags 2.10.0", "block2 0.5.1", @@ -6558,7 +6651,7 @@ dependencies = [ "js-sys", "libc", "memmap2", - "ndk", + "ndk 0.9.0", "objc2 0.5.2", "objc2-app-kit 0.2.2", "objc2-foundation 0.2.2", diff --git a/gui/Cargo.toml b/gui/Cargo.toml index 4907baa..d3b79a3 100644 --- a/gui/Cargo.toml +++ b/gui/Cargo.toml @@ -19,14 +19,41 @@ anyhow = "1.0.100" tokio = { version = "1.48.0", default-features = false, features = ["fs", "rt-multi-thread"] } xdg = "3.0.0" +[target.'cfg(target_os = "android")'.dependencies] +tokio = { version = "1.48.0", default-features = false, features = ["rt-multi-thread"] } + [target.'cfg(target_arch = "wasm32")'.dependencies] wasm-bindgen = "0.2.106" wasm-bindgen-futures = "0.4.56" +web-sys = "0.3.83" [dependencies.slint] version = "1.14.1" default-features = false -features = ["live-preview", "backend-winit-wayland", "renderer-femtovg", "compat-1-2"] +features = [ + "live-preview", + "backend-winit-wayland", + "renderer-femtovg", + "compat-1-2", + "backend-android-activity-06", +] [build-dependencies] slint-build = "1.14.1" + +# See https://github.com/rust-mobile/cargo-apk?tab=readme-ov-file#manifest +[package.metadata.android] +package = "sh.nubo.Inkopslista" +resources = "./android/resources" + +[package.metadata.android.signing.dev] +path = "android/keystore/default.keystore" +keystore_password = "123456" + +[package.metadata.android.signing.release] +path = "android/keystore/default.keystore" +keystore_password = "123456" + +[package.metadata.android.application] +label = "Inköpslista" +icon = "@drawable/icon" diff --git a/gui/android/keystore/default.keystore b/gui/android/keystore/default.keystore new file mode 100644 index 0000000000000000000000000000000000000000..a1b0488babfb40bae02b84f6436ee30c4d1f207a GIT binary patch literal 2662 zcma);dpr{g8^^bq8D^7)%{}*AH{_DcrQ97+a;qVtxtq%}l~@iUw?xRT+#8NtwW)tKF{a*{hr_R=lAnqC<4A9API426FeL*cFeFN?PXOyMp3A?N+59Ejk5QZNA^sGP!U_Cq{@3HX`d z6~cI64F4Hn7ZL9xzZ1EKIEEZq*aVq_!Tf80g)c>H<^1BU3n>7!#n8=&U&m38u?t4PTO3o{Sg5=|0ZYlOOoxU8|3^;1$0`=WL zO%`L_@2xcqN@O?Jw_h$PWf8G^@OBvwU`{qLAqr{LVh-0>g9WA7mGOWl4b91ZXvcD2R##&=`g2NBv zzo7M>!s=EYW@gvySl;XbDpejBl5Aw66E1}4Uph>yfz%&}Q=r!~I?(mZYV9TET>Q(S z{wUVSus1#X1Ma@+=LbdTjSy$g#7^4=sw`EA$TDjIxO#I$x4m-&;ar)lVN%N@~|zSa%4Sx{!^QO-NI zgzxs0Xi73mL6&fNS$cg*^MUBo4YS~*O) zqGnSM3a(}msPO$At}I*Q+C+1vP&NNO66tzSmgAua)zcfXvZy)YY`gF8dC8-Q(Dp>O zT7eSj_7hIlWwBM!oh!KQtQx|w=asdQPLF)!&e}b@ceT%#Q(PlVCSIP5U-SciQn0+( z{kX#)wNQeQ6_%(UNvl#>pNcul5s)5BFGu>}YzJbCr>SpY9ga*nzBZNnwUW2uVi%w! zh>WO=MbE=$(ji-nmP#=9G~aj&~Kb>W>Zt?z6SdSqfDorEDxMo+DTj0falxDwoAW1MXUA)4okM1o= zI>BjCxQ)9A8aS06dm%|$98|dj{ zu)0QA3>HHHoBv$mgOpRiIzJ>W5D@UAsr=&r{}-g6t2@}RlaIEY^NzR6CK-01n=GjR z52WRaoCHMX6a2OaA+dc2ry3I|JWW|BWkTt=s$r$(JUFF#F6yu=Nh}j1`ljGmgvY5P zEb9)c3x0WDn?k6X#OApTFjtl(GQ(#F<5MIvNk9z^l23ZlQVm@~q;~w$Nj&_Kb!y#J;MW=MD^vA6m=r{1r zbGU)5Un>;SH%TZ{Yl~I){IET($#f*58fPu(p%~K>=++I z3VqvNhjv2F&(U=q61B%^tQF7Hd%@_Xbz^!vbT1A~lZ_b&g*Ppw4cV=(0m^;mF~)6A z4Z6D#+~i9lr49zSXgXmt0{EYIfUPA#P=stsPqv_0_f2Z9J zdr({CI3$KF&rj=TZi?S#vozYGs;Z@P@870RW=4i&Qs{bBbEGliY-pwaWs)eo3-|4! z-^Wq68Qi^5q+a}RnBqY(>%v%&fT&ttfUjh;PVdn>Eu$1y{jM`nw_n_ektepumaaoY zt8349S@$p4;is3n~lS1enYVM1#Ts&%Vhp3EustN_2b6CHY zMu0oitk>j6ObYxKjz3{rDk0-W4h+`!Hch*a2d~Q1R7A0u;dJ}M>^Y)T8CU-~jVG(I zE~&2+EkMiwRDWw!Vfv+-Udv|rWb8mnTu-^6G3W4uvGx+^o|X_?nE+1NLu zQxnN#n-2nWW9G?;2mcz$a2!S+)@kNImG z&SC|Ns@A*b`s(I$ZS$!qz5(55_dW-!mlf$du_p${D%^A*eIrwnsLn@MFC=DtT)?}! zOnOb?hfAU~RdZB&@>|U~+d`CEZPZo1MCZwbob6kg~L%t}cQFuAh2fA`vHxjtjh_ z5wQ>!t)_dXaM~M_J2?y9e@p2$yr-+cXo(znt|q_Wy0u073`h%8;@uBXv$r7k)N0wF zY`+J@pD*U!+Q{IZK}ea~_j+gu_tGQ}VSf1m5}}{J7YN7;0LyWV+C+tJj86yHU-lGn w`u@QfH5U20(DPE;s(IfhU2iQgGFje&z~fG@D(oT}(a&)9{l00`{|gy^0}!>m2LJ#7 literal 0 HcmV?d00001 diff --git a/gui/android/resources/drawable/icon.png b/gui/android/resources/drawable/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..82cfa504bdfeb5830839c511e70a95ec24dced63 GIT binary patch literal 28510 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 literal 0 HcmV?d00001 diff --git a/gui/src/android.rs b/gui/src/android.rs new file mode 100644 index 0000000..a633121 --- /dev/null +++ b/gui/src/android.rs @@ -0,0 +1,8 @@ +#[unsafe(no_mangle)] +fn android_main(app: slint::android::AndroidApp) { + slint::android::init(app).unwrap(); + + if let Err(e) = crate::run() { + eprintln!("{e:?}"); + } +} diff --git a/gui/src/lib.rs b/gui/src/lib.rs index f20f162..6d674ec 100644 --- a/gui/src/lib.rs +++ b/gui/src/lib.rs @@ -4,6 +4,9 @@ mod config; mod runtime; +#[cfg(target_os = "android")] +mod android; + #[cfg(target_arch = "wasm32")] mod wasm; @@ -96,6 +99,9 @@ pub fn run() -> Result<(), anyhow::Error> { #[cfg(target_arch = "wasm32")] let conf = Config::default(); + #[cfg(target_os = "android")] + let conf = Config::default(); + state.set_server_address(conf.address.to_shared_string()); let conf_shared = Arc::new(Mutex::new(conf));