From b1e8560c3f13f2674528f6ca440ba476ddbef7c2 Mon Sep 17 00:00:00 2001 From: Lucas Fernandes Nogueira Date: Wed, 24 Aug 2022 16:50:16 -0300 Subject: [PATCH] feat(android): define WebView class in kotlin (#672) --- .changes/webview-class.md | 5 +++++ build.rs | 14 ++++++++++++ src/webview/android/kotlin/RustWebView.kt | 13 +++++++++++ src/webview/android/main_pipe.rs | 27 ++++++++++------------- 4 files changed, 44 insertions(+), 15 deletions(-) create mode 100644 .changes/webview-class.md create mode 100644 src/webview/android/kotlin/RustWebView.kt diff --git a/.changes/webview-class.md b/.changes/webview-class.md new file mode 100644 index 000000000..ea391e93a --- /dev/null +++ b/.changes/webview-class.md @@ -0,0 +1,5 @@ +--- +"wry": patch +--- + +Added the `RustWebView` class on Android. diff --git a/build.rs b/build.rs index f7d4258b6..4fe992ede 100644 --- a/build.rs +++ b/build.rs @@ -50,8 +50,18 @@ fn main() { .to_string_lossy() .to_uppercase() ); + let class_init_env = format!( + "WRY_{}_CLASS_INIT", + file + .path() + .file_stem() + .unwrap() + .to_string_lossy() + .to_uppercase() + ); println!("cargo:rerun-if-env-changed={}", class_extension_env); + println!("cargo:rerun-if-env-changed={}", class_init_env); let content = fs::read_to_string(file.path()) .expect("failed to read kotlin file as string") @@ -60,6 +70,10 @@ fn main() { .replace( "{{class-extension}}", &std::env::var(&class_extension_env).unwrap_or_default(), + ) + .replace( + "{{class-init}}", + &std::env::var(&class_init_env).unwrap_or_default(), ); let mut out = String::from("THIS FILE IS AUTO-GENERATED. DO NOT MODIFY!!\n\n"); diff --git a/src/webview/android/kotlin/RustWebView.kt b/src/webview/android/kotlin/RustWebView.kt new file mode 100644 index 000000000..2687f8c4e --- /dev/null +++ b/src/webview/android/kotlin/RustWebView.kt @@ -0,0 +1,13 @@ +package {{app-domain-reversed}}.{{app-name-snake-case}} + +import android.webkit.* +import android.content.Context + +class RustWebView(context: Context): WebView(context) { + init { + this.settings.javaScriptEnabled = true + {{class-init}} + } + + {{class-extension}} +} diff --git a/src/webview/android/main_pipe.rs b/src/webview/android/main_pipe.rs index fba8a370b..e3a1f0dc4 100644 --- a/src/webview/android/main_pipe.rs +++ b/src/webview/android/main_pipe.rs @@ -38,20 +38,16 @@ impl MainPipe<'_> { match message { WebViewMessage::CreateWebView(url, initialization_scripts, devtools) => { // Create webview - let class = env.find_class("android/webkit/WebView")?; - let webview = - env.new_object(class, "(Landroid/content/Context;)V", &[activity.into()])?; - - // Enable Javascript - let settings = env - .call_method( - webview, - "getSettings", - "()Landroid/webkit/WebSettings;", - &[], - )? - .l()?; - env.call_method(settings, "setJavaScriptEnabled", "(Z)V", &[true.into()])?; + let rust_webview_class = find_my_class( + env, + activity, + format!("{}/RustWebView", PACKAGE.get().unwrap()), + )?; + let webview = env.new_object( + rust_webview_class, + "(Landroid/content/Context;)V", + &[activity.into()], + )?; // Load URL if let Ok(url) = env.new_string(url) { @@ -59,8 +55,9 @@ impl MainPipe<'_> { } // Enable devtools + #[cfg(debug_assertions)] env.call_static_method( - class, + rust_webview_class, "setWebContentsDebuggingEnabled", "(Z)V", &[devtools.into()],