Skip to content
55 changes: 36 additions & 19 deletions src-tauri/src/actions.rs
Original file line number Diff line number Diff line change
Expand Up @@ -2170,16 +2170,25 @@ impl ShortcutAction for TranscribeAction {
operation_token: operation_token.clone(),
paste_started_at: Instant::now(),
};
ah.run_on_main_thread(move || {
complete_adaptive_insertion(insertion);
})
.unwrap_or_else(|e| {
error!("Failed to run paste on main thread: {:?}", e);
finish_dictation_transaction(
&ah,
DictationTransactionTerminal::InsertionSchedulingFailed,
);
});
if matches!(
insertion.settings.paste_method,
crate::settings::PasteMethod::ExternalScript
) {
std::thread::spawn(move || {
complete_adaptive_insertion(insertion)
});
} else {
ah.run_on_main_thread(move || {
complete_adaptive_insertion(insertion);
})
.unwrap_or_else(|e| {
error!("Failed to run paste on main thread: {:?}", e);
finish_dictation_transaction(
&ah,
DictationTransactionTerminal::InsertionSchedulingFailed,
);
});
}
} else {
let processed = process_transcription_output(
&ah,
Expand Down Expand Up @@ -2258,7 +2267,11 @@ impl ShortcutAction for TranscribeAction {
let app_for_insertion = ah.clone();
let settings_for_insertion = settings.clone();
let paste_started_at = Instant::now();
ah.run_on_main_thread(move || {
let external_script = matches!(
settings_for_insertion.paste_method,
crate::settings::PasteMethod::ExternalScript
);
let insertion = move || {
complete_classic_insertion(
app_for_insertion,
Arc::clone(&hm),
Expand All @@ -2270,14 +2283,18 @@ impl ShortcutAction for TranscribeAction {
classic_context,
paste_started_at,
);
})
.unwrap_or_else(|e| {
error!("Failed to run paste on main thread: {:?}", e);
finish_dictation_transaction(
&ah,
DictationTransactionTerminal::InsertionSchedulingFailed,
);
});
};
if external_script {
std::thread::spawn(insertion);
} else {
ah.run_on_main_thread(insertion).unwrap_or_else(|e| {
error!("Failed to run paste on main thread: {:?}", e);
finish_dictation_transaction(
&ah,
DictationTransactionTerminal::InsertionSchedulingFailed,
);
});
}
}
}
Err(err) => {
Expand Down
35 changes: 11 additions & 24 deletions src-tauri/src/asr/llm_models.rs
Original file line number Diff line number Diff line change
@@ -1,7 +1,6 @@
//! Android on-device LLM cleanup model-pack metadata and filesystem helpers.

use anyhow::Result;
use futures_util::StreamExt;
use serde::{Deserialize, Serialize};
use sha2::{Digest, Sha256};
use specta::Type;
Expand Down Expand Up @@ -425,18 +424,21 @@ async fn download_component<R: Runtime>(
.metadata()
.map(|metadata| metadata.len())
.unwrap_or(0);
let client = reqwest::Client::new();
let mut request = client.get(&file.url);
let downloader = crate::download::DownloadClient::default();
let deadline = Instant::now() + downloader.total_timeout();
let mut request = downloader.get(&file.url);
if resume_from > 0 {
request = request.header("Range", format!("bytes={resume_from}-"));
}

let mut response = request.send().await?;
let mut response = downloader.send(request, cancel_flag).await?;
if resume_from > 0 && response.status() == reqwest::StatusCode::OK {
drop(response);
let _ = fs::remove_file(&partial_path);
resume_from = 0;
response = client.get(&file.url).send().await?;
response = downloader
.send(downloader.get(&file.url), cancel_flag)
.await?;
}

if !response.status().is_success() && response.status() != reqwest::StatusCode::PARTIAL_CONTENT
Expand Down Expand Up @@ -473,26 +475,11 @@ async fn download_component<R: Runtime>(

let mut last_emit = Instant::now();
let throttle = Duration::from_millis(100);
let mut stream = response.bytes_stream();

while let Some(chunk) = stream.next().await {
if cancel_flag.load(Ordering::Relaxed) {
drop(output);
emit_progress(
app,
model_id,
"cancelled",
Some(file.target_path.clone()),
downloaded,
total_size,
);
return Err(anyhow::anyhow!(
"Android LLM model download cancelled for {}",
model_id
));
}

let chunk = chunk?;
while let Some(chunk) = downloader
.next_chunk(&mut response, cancel_flag, deadline)
.await?
{
output.write_all(&chunk)?;
downloaded += chunk.len() as u64;
if last_emit.elapsed() >= throttle {
Expand Down
35 changes: 11 additions & 24 deletions src-tauri/src/asr/models.rs
Original file line number Diff line number Diff line change
@@ -1,7 +1,6 @@
//! Model pack metadata and filesystem helpers for Android ASR.

use anyhow::Result;
use futures_util::StreamExt;
use serde::{Deserialize, Serialize};
use sha2::{Digest, Sha256};
use specta::Type;
Expand Down Expand Up @@ -720,18 +719,21 @@ async fn download_component<R: Runtime>(
.metadata()
.map(|metadata| metadata.len())
.unwrap_or(0);
let client = reqwest::Client::new();
let mut request = client.get(&file.url);
let downloader = crate::download::DownloadClient::default();
let deadline = Instant::now() + downloader.total_timeout();
let mut request = downloader.get(&file.url);
if resume_from > 0 {
request = request.header("Range", format!("bytes={resume_from}-"));
}

let mut response = request.send().await?;
let mut response = downloader.send(request, cancel_flag).await?;
if resume_from > 0 && response.status() == reqwest::StatusCode::OK {
drop(response);
let _ = fs::remove_file(&partial_path);
resume_from = 0;
response = client.get(&file.url).send().await?;
response = downloader
.send(downloader.get(&file.url), cancel_flag)
.await?;
}

if !response.status().is_success() && response.status() != reqwest::StatusCode::PARTIAL_CONTENT
Expand Down Expand Up @@ -768,26 +770,11 @@ async fn download_component<R: Runtime>(

let mut last_emit = Instant::now();
let throttle = Duration::from_millis(100);
let mut stream = response.bytes_stream();

while let Some(chunk) = stream.next().await {
if cancel_flag.load(Ordering::Relaxed) {
drop(output);
emit_progress(
app,
model_id,
"cancelled",
Some(file.target_path.clone()),
downloaded,
total_size,
);
return Err(anyhow::anyhow!(
"Android ASR model download cancelled for {}",
model_id
));
}

let chunk = chunk?;
while let Some(chunk) = downloader
.next_chunk(&mut response, cancel_flag, deadline)
.await?
{
output.write_all(&chunk)?;
downloaded += chunk.len() as u64;
if last_emit.elapsed() >= throttle {
Expand Down
Loading
Loading