diff --git a/Cargo.lock b/Cargo.lock index 171c1f8..1df877c 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -236,28 +236,6 @@ version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c08606f8c3cbf4ce6ec8e28fb0014a2c086708fe954eaa885384a6165172e7e8" -[[package]] -name = "aws-lc-rs" -version = "1.16.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d9a7b350e3bb1767102698302bc37256cbd48422809984b98d292c40e2579aa9" -dependencies = [ - "aws-lc-sys", - "zeroize", -] - -[[package]] -name = "aws-lc-sys" -version = "0.37.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b092fe214090261288111db7a2b2c2118e5a7f30dc2569f1732c4069a6840549" -dependencies = [ - "cc", - "cmake", - "dunce", - "fs_extra", -] - [[package]] name = "base64" version = "0.21.7" @@ -533,7 +511,6 @@ version = "0.1.0" dependencies = [ "anyhow", "cjdic2-core", - "reqwest 0.13.2", "serde", "serde_json", "tauri", @@ -557,15 +534,6 @@ dependencies = [ "zip", ] -[[package]] -name = "cmake" -version = "0.1.57" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "75443c44cd6b379beb8c5b45d85d0773baf31cce901fe7bb252f4eff3008ef7d" -dependencies = [ - "cc", -] - [[package]] name = "combine" version = "4.6.7" @@ -1183,12 +1151,6 @@ dependencies = [ "percent-encoding", ] -[[package]] -name = "fs_extra" -version = "1.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "42703706b716c37f96a77aea830392ad231f44c9e9a67872fa5548707e11b11c" - [[package]] name = "futf" version = "0.1.5" @@ -2678,12 +2640,6 @@ dependencies = [ "pathdiff", ] -[[package]] -name = "openssl-probe" -version = "0.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7c87def4c32ab89d880effc9e097653c8da5d6ef28e6b539d313baaacfbafcbe" - [[package]] name = "option-ext" version = "0.2.0" @@ -3144,7 +3100,6 @@ version = "0.11.13" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f1906b49b0c3bc04b5fe5d86a77925ae6524a19b816ae38ce1e426255f1d8a31" dependencies = [ - "aws-lc-rs", "bytes", "getrandom 0.3.4", "lru-slab", @@ -3425,30 +3380,21 @@ checksum = "ab3f43e3283ab1488b624b44b0e988d0acea0b3214e694730a055cb6b2efa801" dependencies = [ "base64 0.22.1", "bytes", - "encoding_rs", "futures-core", "futures-util", - "h2", "http", "http-body", "http-body-util", "hyper", - "hyper-rustls", "hyper-util", "js-sys", "log", - "mime", "percent-encoding", "pin-project-lite", - "quinn", - "rustls", - "rustls-pki-types", - "rustls-platform-verifier", "serde", "serde_json", "sync_wrapper", "tokio", - "tokio-rustls", "tokio-util", "tower", "tower-http", @@ -3533,7 +3479,6 @@ version = "0.23.37" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "758025cb5fccfd3bc2fd74708fd4682be41d99e5dff73c377c0646c6012c73a4" dependencies = [ - "aws-lc-rs", "once_cell", "ring", "rustls-pki-types", @@ -3542,18 +3487,6 @@ dependencies = [ "zeroize", ] -[[package]] -name = "rustls-native-certs" -version = "0.8.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "612460d5f7bea540c490b2b6395d8e34a953e52b491accd6c86c8164c5932a63" -dependencies = [ - "openssl-probe", - "rustls-pki-types", - "schannel", - "security-framework", -] - [[package]] name = "rustls-pki-types" version = "1.14.0" @@ -3564,40 +3497,12 @@ dependencies = [ "zeroize", ] -[[package]] -name = "rustls-platform-verifier" -version = "0.6.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1d99feebc72bae7ab76ba994bb5e121b8d83d910ca40b36e0921f53becc41784" -dependencies = [ - "core-foundation 0.10.1", - "core-foundation-sys", - "jni", - "log", - "once_cell", - "rustls", - "rustls-native-certs", - "rustls-platform-verifier-android", - "rustls-webpki", - "security-framework", - "security-framework-sys", - "webpki-root-certs", - "windows-sys 0.61.2", -] - -[[package]] -name = "rustls-platform-verifier-android" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f87165f0995f63a9fbeea62b64d10b4d9d8e78ec6d7d51fb2125fda7bb36788f" - [[package]] name = "rustls-webpki" version = "0.103.9" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d7df23109aa6c1567d1c575b9952556388da57401e4ace1d15f79eedad0d8f53" dependencies = [ - "aws-lc-rs", "ring", "rustls-pki-types", "untrusted", @@ -3624,15 +3529,6 @@ dependencies = [ "winapi-util", ] -[[package]] -name = "schannel" -version = "0.1.28" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "891d81b926048e76efe18581bf793546b4c0eaf8448d72be8de2bbee5fd166e1" -dependencies = [ - "windows-sys 0.61.2", -] - [[package]] name = "schemars" version = "0.8.22" @@ -3690,29 +3586,6 @@ version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" -[[package]] -name = "security-framework" -version = "3.7.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b7f4bc775c73d9a02cde8bf7b2ec4c9d12743edf609006c7facc23998404cd1d" -dependencies = [ - "bitflags 2.11.0", - "core-foundation 0.10.1", - "core-foundation-sys", - "libc", - "security-framework-sys", -] - -[[package]] -name = "security-framework-sys" -version = "2.17.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6ce2691df843ecc5d231c0b14ece2acc3efb62c0a398c7e1d875f3983ce020e3" -dependencies = [ - "core-foundation-sys", - "libc", -] - [[package]] name = "selectors" version = "0.24.0" @@ -5306,15 +5179,6 @@ dependencies = [ "system-deps", ] -[[package]] -name = "webpki-root-certs" -version = "1.0.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "804f18a4ac2676ffb4e8b5b5fa9ae38af06df08162314f96a68d2a363e21a8ca" -dependencies = [ - "rustls-pki-types", -] - [[package]] name = "webpki-roots" version = "1.0.6" diff --git a/package.json b/package.json index ac5a266..56f5037 100644 --- a/package.json +++ b/package.json @@ -8,8 +8,10 @@ "dev:mobile": "tauri dev -c src-tauri/tauri.mobile.conf.json", "dev:android": "tauri android dev", "build:desktop": "tauri build", - "build:android": "tauri android build --debug", - "install:android": "adb install -r src-tauri/gen/android/app/build/outputs/apk/universal/debug/app-universal-debug.apk", + "build:android": "tauri android build", + "install:android": "adb install -r src-tauri/gen/android/app/build/outputs/apk/universal/release/app-universal-release.apk", + "build:android:debug": "tauri android build --debug", + "install:android:debug": "adb install -r src-tauri/gen/android/app/build/outputs/apk/universal/debug/app-universal-debug.apk", "dev": "cd src-react && pnpm run dev", "build": "cd src-react && pnpm run build", "tauri": "tauri" diff --git a/src-core/src/service.rs b/src-core/src/service.rs index a97fed8..def8b15 100644 --- a/src-core/src/service.rs +++ b/src-core/src/service.rs @@ -132,10 +132,13 @@ impl AppService { LoadCallback: Fn(LoadYomitanZipDirResult), ImportCallback: Fn(YomitanZipImportProgress), { - let mut dir_zip_map: HashMap = HashMap::new(); + let mut dir_zip_map: HashMap = HashMap::new(); + let mut zip_dir_ord: HashMap = HashMap::new(); - for entry in zip_dir { - dir_zip_map.insert(entry.file_name().to_string(), entry); + for (i, entry) in zip_dir.iter().enumerate() { + let filename = entry.file_name(); + dir_zip_map.insert(filename.to_string(), entry); + zip_dir_ord.insert(filename.to_string(), i); } { @@ -173,16 +176,8 @@ impl AppService { } // Import ordering - new_dicts.sort_by_key(|s| { - if s.starts_with("[") - && let Some(end_i) = s.find(']') - { - s[(end_i + 1)..].trim_start().to_string() - } else { - s.to_string() - } - }); - to_be_removed_dicts.sort(); + new_dicts.sort_by_key(|s| zip_dir_ord.get(s)); + to_be_removed_dicts.sort_by_key(|s| zip_dir_ord.get(s)); load_callback(LoadYomitanZipDirResult { new_dicts: new_dicts.clone(), @@ -205,7 +200,7 @@ impl AppService { for z in new_dicts.clone().iter() { if let Some(zip_file) = dir_zip_map.get(z) { - Self::import_yomitan_zip_file(&mut writer, zip_file, lang, &import_callback)?; + Self::import_yomitan_zip_file(&mut writer, *zip_file, lang, &import_callback)?; } } } diff --git a/src-react/src/components/LoadingDialog.tsx b/src-react/src/components/LoadingDialog.tsx index dd92d9e..83192ee 100644 --- a/src-react/src/components/LoadingDialog.tsx +++ b/src-react/src/components/LoadingDialog.tsx @@ -45,7 +45,25 @@ function LoadingDialog() { if (isInit.current) return; isInit.current = true; - downloadAssets(); + // empty query warmup + // no need to await + invoke("search_yomitan", { + qTerm: "", + qReading: "", + limit: 1, + offset: 0, + }); + + document.body.style.pointerEvents = "none"; + downloadAssets().finally(() => { + document.body.style.pointerEvents = ""; + const elFirstInput = document.querySelector( + 'input[type="text"]', + ) as HTMLInputElement; + if (elFirstInput) { + elFirstInput.focus(); + } + }); async function downloadAssets(lang = "ja") { const dicts: YomitanDictEntry[] = []; @@ -88,14 +106,6 @@ function LoadingDialog() { await invoke("init_yomitan", { dicts, lang }); setMessages([]); - - // empty query warmup - await invoke("search_yomitan", { - qTerm: "", - qReading: "", - limit: 1, - offset: 0, - }); } listen("load-yomitan-dir", ({ payload }) => { diff --git a/src-react/src/pages/SearchPage.tsx b/src-react/src/pages/SearchPage.tsx index a3d0cb4..0069a31 100644 --- a/src-react/src/pages/SearchPage.tsx +++ b/src-react/src/pages/SearchPage.tsx @@ -215,6 +215,7 @@ function SearchPage() { onSearchboxChange(e.currentTarget.value)} diff --git a/src-tauri/Cargo.toml b/src-tauri/Cargo.toml index a5786b9..a8639b0 100644 --- a/src-tauri/Cargo.toml +++ b/src-tauri/Cargo.toml @@ -25,5 +25,4 @@ tauri-plugin-http = "2" anyhow = "1.0.102" tauri-plugin-fs = "2" serde_json = "1.0.149" -reqwest = { version = "0.13.2", features = ["stream"] } serde = "1.0.228" diff --git a/src-tauri/capabilities/default.json b/src-tauri/capabilities/default.json index 5ce2f18..390774c 100644 --- a/src-tauri/capabilities/default.json +++ b/src-tauri/capabilities/default.json @@ -8,26 +8,7 @@ "permissions": [ "core:default", "opener:default", - { - "identifier": "http:default", - "allow": [ - { - "url": "https://api.github.com" - } - ] - }, - "fs:allow-exists", - "fs:allow-read-dir", - "fs:allow-appdata-read", - { - "identifier": "fs:scope", - "allow": [ - "$APPDATA/**/*.zip", - "$APPDATA/yomitan/*" - ], - "deny": [ - "$APPDATA/*.db" - ] - } + "http:default", + "fs:default" ] } \ No newline at end of file diff --git a/src-tauri/gen/android/.gitignore b/src-tauri/gen/android/.gitignore index b248203..e75376a 100644 --- a/src-tauri/gen/android/.gitignore +++ b/src-tauri/gen/android/.gitignore @@ -16,4 +16,5 @@ local.properties key.properties /.tauri -/tauri.settings.gradle \ No newline at end of file +/tauri.settings.gradle +keystore.properties diff --git a/src-tauri/gen/android/app/build.gradle.kts b/src-tauri/gen/android/app/build.gradle.kts index cd453c7..8f9ba5c 100644 --- a/src-tauri/gen/android/app/build.gradle.kts +++ b/src-tauri/gen/android/app/build.gradle.kts @@ -1,4 +1,5 @@ import java.util.Properties +import java.io.FileInputStream plugins { id("com.android.application") @@ -24,6 +25,20 @@ android { versionCode = tauriProperties.getProperty("tauri.android.versionCode", "1").toInt() versionName = tauriProperties.getProperty("tauri.android.versionName", "1.0") } + signingConfigs { + create("release") { + val keystorePropertiesFile = rootProject.file("keystore.properties") + val keystoreProperties = Properties() + if (keystorePropertiesFile.exists()) { + keystoreProperties.load(FileInputStream(keystorePropertiesFile)) + } + + keyAlias = keystoreProperties["keyAlias"] as String + keyPassword = keystoreProperties["password"] as String + storeFile = file(keystoreProperties["storeFile"] as String) + storePassword = keystoreProperties["password"] as String + } + } buildTypes { getByName("debug") { manifestPlaceholders["usesCleartextTraffic"] = "true" @@ -43,6 +58,7 @@ android { .plus(getDefaultProguardFile("proguard-android-optimize.txt")) .toList().toTypedArray() ) + signingConfig = signingConfigs.getByName("release") } } kotlinOptions { diff --git a/src-tauri/resources/yomitan/.gitignore b/src-tauri/resources/yomitan/.gitignore deleted file mode 100644 index c4c4ffc..0000000 --- a/src-tauri/resources/yomitan/.gitignore +++ /dev/null @@ -1 +0,0 @@ -*.zip diff --git a/src-tauri/resources/yomitan/ja/.gitignore b/src-tauri/resources/yomitan/ja/.gitignore deleted file mode 100644 index b2dee01..0000000 --- a/src-tauri/resources/yomitan/ja/.gitignore +++ /dev/null @@ -1,4 +0,0 @@ -* -!.gitignore - -# Pixiv_*.zip => Pixiv.zip from https://github.com/MarvNC/pixiv-yomitan/releases diff --git a/src-tauri/resources/yomitan/zh/.gitignore b/src-tauri/resources/yomitan/zh/.gitignore deleted file mode 100644 index e69de29..0000000 diff --git a/src-tauri/src/command.rs b/src-tauri/src/command.rs index b0aff56..1e8d7b4 100644 --- a/src-tauri/src/command.rs +++ b/src-tauri/src/command.rs @@ -1,9 +1,9 @@ use std::{fs::File, io::Write, path::PathBuf}; use cjdic2_core::{AppService, CJDicError, SqlParam, YomitanRow, YomitanZipImportResult}; -use reqwest::Client; use serde::{Deserialize, Serialize}; use tauri::{AppHandle, Emitter, Manager}; +use tauri_plugin_http::reqwest::Client; #[derive(Deserialize)] pub struct YomitanDictEntry { @@ -155,6 +155,8 @@ where let content_length = response.content_length().unwrap_or(0); let mut file = File::create(&file_pf).map_err(|e| CJDicError::Error(e.to_string()))?; + println!("{}", content_length); + // Downloading the file in chunks let mut downloaded: u64 = 0; while let Some(chunk) = response diff --git a/src-tauri/tauri.conf.json b/src-tauri/tauri.conf.json index 4d6607a..f1d48eb 100644 --- a/src-tauri/tauri.conf.json +++ b/src-tauri/tauri.conf.json @@ -23,10 +23,6 @@ } }, "bundle": { - "resources": [ - "resources/**/*.zip", - "resources/**/manifest.json" - ], "active": true, "targets": "all", "icon": [