diff --git a/examples/api/src-tauri/Cargo.lock b/examples/api/src-tauri/Cargo.lock index 7966d0fba..86333c28c 100644 --- a/examples/api/src-tauri/Cargo.lock +++ b/examples/api/src-tauri/Cargo.lock @@ -4222,7 +4222,7 @@ dependencies = [ [[package]] name = "wry" version = "0.20.2" -source = "git+https://github.com/tauri-apps/wry?branch=dev#1b26d605d6e33f5417eb6566a7381d8feb239c8b" +source = "git+https://github.com/tauri-apps/wry?branch=dev#b4789034dc4d10ab83f6acce6b4152d79f702940" dependencies = [ "block", "cocoa", diff --git a/tooling/cli/Cargo.lock b/tooling/cli/Cargo.lock index e7b6a9261..81d4a7425 100644 --- a/tooling/cli/Cargo.lock +++ b/tooling/cli/Cargo.lock @@ -250,7 +250,7 @@ dependencies = [ [[package]] name = "cargo-mobile" version = "0.1.0" -source = "git+https://github.com/tauri-apps/cargo-mobile?branch=dev#d5b4c4dd5ac23e700f07e362b8788d80a33d21d3" +source = "git+https://github.com/tauri-apps/cargo-mobile?branch=dev#5b866af17df4e2310e084efd3550ec31f62ff984" dependencies = [ "cocoa", "colored 1.9.3", diff --git a/tooling/cli/src/mobile/android.rs b/tooling/cli/src/mobile/android.rs index 2d9aba649..440938ba5 100644 --- a/tooling/cli/src/mobile/android.rs +++ b/tooling/cli/src/mobile/android.rs @@ -7,11 +7,12 @@ use cargo_mobile::{ adb, config::{Config as AndroidConfig, Metadata as AndroidMetadata}, device::{Device, RunError}, - env::{Env, Error as EnvError}, + env::{Env, Error as AndroidEnvError}, target::{BuildError, Target}, }, config::Config, device::PromptError, + env::Error as EnvError, os, util::prompt, }; @@ -35,6 +36,8 @@ enum Error { #[error(transparent)] EnvInitFailed(EnvError), #[error(transparent)] + AndroidEnvInitFailed(AndroidEnvError), + #[error(transparent)] InitDotCargo(super::init::Error), #[error("invalid tauri configuration: {0}")] InvalidTauriConfig(String), @@ -105,6 +108,11 @@ fn with_config( f(&config, config.android(), metadata.android()) } +fn env() -> Result { + let env = super::env().map_err(Error::EnvInitFailed)?; + cargo_mobile::android::env::Env::from_env(env).map_err(Error::AndroidEnvInitFailed) +} + fn device_prompt<'a>(env: &'_ Env) -> Result, PromptError> { let device_list = adb::device_list(env).map_err(|cause| PromptError::detection_failed("Android", cause))?; diff --git a/tooling/cli/src/mobile/android/android_studio_script.rs b/tooling/cli/src/mobile/android/android_studio_script.rs index d78213941..8c37af049 100644 --- a/tooling/cli/src/mobile/android/android_studio_script.rs +++ b/tooling/cli/src/mobile/android/android_studio_script.rs @@ -1,9 +1,9 @@ -use super::{detect_target_ok, ensure_init, init_dot_cargo, with_config, Error, MobileTarget}; +use super::{detect_target_ok, ensure_init, env, init_dot_cargo, with_config, Error, MobileTarget}; use crate::Result; use clap::Parser; use cargo_mobile::{ - android::{env::Env, target::Target}, + android::target::Target, opts::{NoiseLevel, Profile}, target::{call_for_targets_with_fallback, TargetTrait}, }; @@ -37,7 +37,7 @@ pub fn command(options: Options) -> Result<()> { ensure_init(config.project_dir(), MobileTarget::Android) .map_err(|e| Error::ProjectNotInitialized(e.to_string()))?; - let env = Env::new().map_err(Error::EnvInitFailed)?; + let env = env()?; init_dot_cargo(root_conf, Some(&env)).map_err(Error::InitDotCargo)?; call_for_targets_with_fallback( diff --git a/tooling/cli/src/mobile/android/build.rs b/tooling/cli/src/mobile/android/build.rs index cca10d337..5766f5f68 100644 --- a/tooling/cli/src/mobile/android/build.rs +++ b/tooling/cli/src/mobile/android/build.rs @@ -1,4 +1,4 @@ -use super::{ensure_init, init_dot_cargo, log_finished, with_config, Error, MobileTarget}; +use super::{ensure_init, env, init_dot_cargo, log_finished, with_config, Error, MobileTarget}; use crate::{ helpers::{config::get as get_tauri_config, flock}, interface::{AppSettings, Interface, Options as InterfaceOptions}, @@ -64,7 +64,7 @@ pub fn command(options: Options) -> Result<()> { ensure_init(config.project_dir(), MobileTarget::Android) .map_err(|e| Error::ProjectNotInitialized(e.to_string()))?; - let env = Env::new().map_err(Error::EnvInitFailed)?; + let env = env()?; init_dot_cargo(root_conf, Some(&env)).map_err(Error::InitDotCargo)?; run_build(options, config, env).map_err(|e| Error::BuildFailed(format!("{:#}", e))) diff --git a/tooling/cli/src/mobile/android/dev.rs b/tooling/cli/src/mobile/android/dev.rs index 636bce926..073d1af7c 100644 --- a/tooling/cli/src/mobile/android/dev.rs +++ b/tooling/cli/src/mobile/android/dev.rs @@ -1,4 +1,4 @@ -use super::{device_prompt, ensure_init, init_dot_cargo, with_config, Error, MobileTarget}; +use super::{device_prompt, ensure_init, env, init_dot_cargo, with_config, Error, MobileTarget}; use crate::{ helpers::{config::get as get_tauri_config, flock}, interface::{AppSettings, Interface, MobileOptions, Options as InterfaceOptions}, @@ -8,10 +8,7 @@ use crate::{ use clap::Parser; use cargo_mobile::{ - android::{ - config::{Config as AndroidConfig, Metadata as AndroidMetadata}, - env::Env, - }, + android::config::{Config as AndroidConfig, Metadata as AndroidMetadata}, config::Config, opts::{NoiseLevel, Profile}, os, @@ -143,7 +140,7 @@ fn run( let build_app_bundle = metadata.asset_packs().is_some(); - let env = Env::new().map_err(Error::EnvInitFailed)?; + let env = env()?; init_dot_cargo(root_conf, Some(&env)).map_err(Error::InitDotCargo)?; device_prompt(&env) diff --git a/tooling/cli/src/mobile/ios.rs b/tooling/cli/src/mobile/ios.rs index 388e9b318..5a38dcf12 100644 --- a/tooling/cli/src/mobile/ios.rs +++ b/tooling/cli/src/mobile/ios.rs @@ -18,7 +18,7 @@ use cargo_mobile::{ use clap::{Parser, Subcommand}; use super::{ - ensure_init, env_vars, get_config, + ensure_init, env, get_config, init::{command as init_command, init_dot_cargo, Options as InitOptions}, log_finished, Target as MobileTarget, }; @@ -35,7 +35,7 @@ mod xcode_script; #[derive(Debug, thiserror::Error)] enum Error { #[error(transparent)] - EnvInitFailed(EnvError), + EnvInitFailed(#[from] EnvError), #[error(transparent)] InitDotCargo(super::init::Error), #[error("invalid tauri configuration: {0}")] @@ -116,13 +116,6 @@ fn with_config( f(&config, config.apple(), metadata.apple()) } -fn env() -> Result { - let env = Env::new() - .map_err(Error::EnvInitFailed)? - .explicit_env_vars(env_vars()); - Ok(env) -} - fn device_prompt<'a>(env: &'_ Env) -> Result, PromptError> { let device_list = ios_deploy::device_list(env).map_err(|cause| PromptError::detection_failed("iOS", cause))?; diff --git a/tooling/cli/src/mobile/mod.rs b/tooling/cli/src/mobile/mod.rs index f3ddea067..7e996ee91 100644 --- a/tooling/cli/src/mobile/mod.rs +++ b/tooling/cli/src/mobile/mod.rs @@ -15,9 +15,17 @@ use cargo_mobile::{ android::config::{Metadata as AndroidMetadata, Raw as RawAndroidConfig}, bossy, config::{app::Raw as RawAppConfig, metadata::Metadata, Config, Raw}, + env::Error as EnvError, }; use serde::{Deserialize, Serialize}; -use std::{collections::HashMap, ffi::OsString, fmt::Write, path::PathBuf, process::ExitStatus}; +use std::{ + collections::HashMap, env::set_var, ffi::OsString, fmt::Write, path::PathBuf, process::ExitStatus, +}; + +#[cfg(not(windows))] +use cargo_mobile::env::Env; +#[cfg(windows)] +use cargo_mobile::os::Env; pub mod android; mod init; @@ -110,13 +118,20 @@ fn env_vars() -> HashMap { let mut vars = HashMap::new(); for (k, v) in std::env::vars_os() { let k = k.to_string_lossy(); - if k.starts_with("TAURI") && k != "TAURI_PRIVATE_KEY" && k != "TAURI_KEY_PASSWORD" { + if (k.starts_with("TAURI") && k != "TAURI_PRIVATE_KEY" && k != "TAURI_KEY_PASSWORD") + || k.starts_with("WRY") + { vars.insert(k.into_owned(), v); } } vars } +fn env() -> Result { + let env = Env::new()?.explicit_env_vars(env_vars()); + Ok(env) +} + /// Writes CLI options to be used later on the Xcode and Android Studio build commands pub fn write_options( mut options: CliOptions, @@ -133,7 +148,10 @@ pub fn write_options( fn read_options(config: &TauriConfig, target: Target) -> crate::Result { let data = std::fs::read_to_string(options_path(&config.tauri.bundle.identifier, target))?; - let options = serde_json::from_str(&data)?; + let options: CliOptions = serde_json::from_str(&data)?; + for (k, v) in &options.vars { + set_var(k, v); + } Ok(options) } @@ -147,6 +165,17 @@ fn get_config(config: &TauriConfig) -> (Config, Metadata) { } domain.pop(); + let s = config.tauri.bundle.identifier.split('.'); + let last = s.clone().count() - 1; + let mut reverse_domain = String::new(); + for (i, w) in s.enumerate() { + if i != last { + reverse_domain.push_str(w); + reverse_domain.push('.'); + } + } + reverse_domain.pop(); + let manifest_path = tauri_dir().join("Cargo.toml"); let app_name = if let Ok(manifest) = crate::interface::manifest::read_manifest(&manifest_path) { manifest @@ -167,7 +196,7 @@ fn get_config(config: &TauriConfig) -> (Config, Metadata) { let raw = Raw { app: RawAppConfig { - name: app_name, + name: app_name.clone(), stylized_name: config.package.product_name.clone(), domain, asset_dir: None, @@ -243,6 +272,21 @@ fn get_config(config: &TauriConfig) -> (Config, Metadata) { }, }; + set_var("WRY_ANDROID_REVERSED_DOMAIN", &reverse_domain); + set_var("WRY_ANDROID_APP_NAME_SNAKE_CASE", &app_name); + set_var( + "WRY_ANDROID_KOTLIN_FILES_OUT_DIR", + config + .android() + .project_dir() + .join("app/src/main") + .join(format!( + "java/{}/{}", + config.app().reverse_domain().replace('.', "/"), + config.app().name() + )), + ); + (config, metadata) } diff --git a/tooling/cli/templates/mobile/android/app/src/main/Ipc.kt b/tooling/cli/templates/mobile/android/app/src/main/Ipc.kt deleted file mode 100644 index f2bb26f15..000000000 --- a/tooling/cli/templates/mobile/android/app/src/main/Ipc.kt +++ /dev/null @@ -1,18 +0,0 @@ -package {{reverse-domain app.domain}}.{{snake-case app.name}} - -import android.webkit.* - -class Ipc { - @JavascriptInterface - fun postMessage(message: String) { - this.ipc(message) - } - - companion object { - init { - System.loadLibrary("{{snake-case app.name}}") - } - } - - private external fun ipc(message: String) -} diff --git a/tooling/cli/templates/mobile/android/app/src/main/RustWebViewClient.kt b/tooling/cli/templates/mobile/android/app/src/main/RustWebViewClient.kt deleted file mode 100644 index b854a32de..000000000 --- a/tooling/cli/templates/mobile/android/app/src/main/RustWebViewClient.kt +++ /dev/null @@ -1,38 +0,0 @@ -package {{reverse-domain app.domain}}.{{snake-case app.name}} - -import android.graphics.Bitmap -import android.webkit.* - -class RustWebViewClient(initScripts: Array): WebViewClient() { - private val initializationScripts: Array - - init { - initializationScripts = initScripts - } - - override fun onPageStarted(view: WebView?, url: String?, favicon: Bitmap?) { - for (script in initializationScripts) { - view?.evaluateJavascript(script, null) - } - super.onPageStarted(view, url, favicon) - } - - override fun shouldOverrideUrlLoading(view: WebView?, request: WebResourceRequest?): Boolean { - return false - } - - override fun shouldInterceptRequest( - view: WebView, - request: WebResourceRequest - ): WebResourceResponse? { - return handleRequest(request) - } - - companion object { - init { - System.loadLibrary("{{snake-case app.name}}") - } - } - - private external fun handleRequest(request: WebResourceRequest): WebResourceResponse? -} diff --git a/tooling/cli/templates/mobile/android/app/src/main/TauriActivity.kt b/tooling/cli/templates/mobile/android/app/src/main/TauriActivity.kt index 84b13f949..2d1ffa69a 100644 --- a/tooling/cli/templates/mobile/android/app/src/main/TauriActivity.kt +++ b/tooling/cli/templates/mobile/android/app/src/main/TauriActivity.kt @@ -1,71 +1,6 @@ -package {{reverse-domain app.domain}}.{{snake-case app.name}} +package {{app-domain-reversed}}.{{app-name-snake-case}} import android.os.Bundle import androidx.appcompat.app.AppCompatActivity -abstract class TauriActivity : AppCompatActivity() { - override fun onCreate(savedInstanceState: Bundle?) { - super.onCreate(savedInstanceState) - create(this) - } - - override fun onStart() { - super.onStart() - start() - } - - override fun onResume() { - super.onResume() - resume() - } - - override fun onPause() { - super.onPause() - pause() - } - - override fun onStop() { - super.onStop() - stop() - } - - override fun onWindowFocusChanged(hasFocus: Boolean) { - super.onWindowFocusChanged(hasFocus) - focus(hasFocus) - } - - override fun onSaveInstanceState(outState: Bundle) { - super.onSaveInstanceState(outState) - save() - } - - override fun onDestroy() { - super.onDestroy() - destroy() - } - - override fun onLowMemory() { - super.onLowMemory() - memory() - } - - fun getAppClass(name: String): Class<*> { - return Class.forName(name) - } - - companion object { - init { - System.loadLibrary("{{snake-case app.name}}") - } - } - - private external fun create(activity: TauriActivity) - private external fun start() - private external fun resume() - private external fun pause() - private external fun stop() - private external fun save() - private external fun destroy() - private external fun memory() - private external fun focus(focus: Boolean) -} +abstract class TauriActivity : AppCompatActivity()