diff --git a/Cargo.lock b/Cargo.lock index 0bb3bdd..88b7ca2 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -4370,6 +4370,7 @@ dependencies = [ "async-trait", "axum 0.7.9", "bytes", + "chrono", "dirs", "futures-util", "prometheus", diff --git a/android/app/src/main/java/com/wzp/ui/call/InCallScreen.kt b/android/app/src/main/java/com/wzp/ui/call/InCallScreen.kt index e8f0de2..598a0db 100644 --- a/android/app/src/main/java/com/wzp/ui/call/InCallScreen.kt +++ b/android/app/src/main/java/com/wzp/ui/call/InCallScreen.kt @@ -165,7 +165,7 @@ fun InCallScreen( color = Color.White ) Text( - text = "ENCRYPTED VOICE", + text = "ENCRYPTED VOICE \u2022 direct-call-v1", style = MaterialTheme.typography.labelSmall.copy(letterSpacing = 3.sp), color = TextDim ) diff --git a/crates/wzp-android/src/engine.rs b/crates/wzp-android/src/engine.rs index 134c019..bd993ed 100644 --- a/crates/wzp-android/src/engine.rs +++ b/crates/wzp-android/src/engine.rs @@ -272,14 +272,19 @@ impl WzpEngine { info!(fingerprint = %fp, relay = %addr, "starting signaling"); - // Create runtime for signaling (separate from call runtime) - let rt = tokio::runtime::Builder::new_multi_thread() - .worker_threads(1) - .enable_all() - .build()?; - + self.state.running.store(true, Ordering::Release); let signal_state = state.clone(); - rt.spawn(async move { + + // Spawn on a dedicated thread with sufficient stack (Android IO dispatcher stack is too small) + std::thread::Builder::new() + .name("wzp-signal".into()) + .stack_size(4 * 1024 * 1024) // 4MB stack + .spawn(move || { + let rt = tokio::runtime::Builder::new_current_thread() + .enable_all() + .build() + .expect("tokio runtime"); + rt.block_on(async move { let _ = rustls::crypto::ring::default_provider().install_default(); let bind: SocketAddr = "0.0.0.0:0".parse().unwrap(); let endpoint = match wzp_transport::create_endpoint(bind, None) { @@ -371,9 +376,9 @@ impl WzpEngine { let mut stats = signal_state.stats.lock().unwrap(); stats.state = crate::stats::CallState::Closed; - }); + }); // block_on + })?; // thread spawn - self.tokio_runtime = Some(rt); Ok(()) }