From 2bfc6c3d2e0cc6c3922d125f678ab30c00b89483 Mon Sep 17 00:00:00 2001 From: Jeffrey Hutchins Date: Wed, 7 Sep 2022 06:08:22 -0600 Subject: [PATCH] feat(android): JNI execution handle (#689) * feat(android): JNI execution handle * changefile Co-authored-by: Amr Bashir --- .changes/android-jni-handle.md | 5 +++++ src/webview/android/main_pipe.rs | 7 ++++++- src/webview/android/mod.rs | 14 ++++++++++++++ src/webview/mod.rs | 15 +++++++++++++++ 4 files changed, 40 insertions(+), 1 deletion(-) create mode 100644 .changes/android-jni-handle.md diff --git a/.changes/android-jni-handle.md b/.changes/android-jni-handle.md new file mode 100644 index 000000000..fff57b6f5 --- /dev/null +++ b/.changes/android-jni-handle.md @@ -0,0 +1,5 @@ +--- +"wry": patch +--- + +Add `WebviewExtAndroid::handle` which can be used to execute some code using JNI context. \ No newline at end of file diff --git a/src/webview/android/main_pipe.rs b/src/webview/android/main_pipe.rs index 4ebb3f28d..e79280e05 100644 --- a/src/webview/android/main_pipe.rs +++ b/src/webview/android/main_pipe.rs @@ -161,6 +161,11 @@ impl MainPipe<'_> { Err(e) => tx.send(Err(e.into())).unwrap(), } } + WebViewMessage::Jni(f) => { + if let Some(webview) = &self.webview { + f(env, activity, webview.as_obj()); + } + } } } Ok(()) @@ -188,12 +193,12 @@ fn set_background_color<'a>( Ok(()) } -#[derive(Debug)] pub enum WebViewMessage { CreateWebView(CreateWebViewAttributes), Eval(String), SetBackgroundColor(RGBA), GetWebViewVersion(Sender>), + Jni(Box), } #[derive(Debug)] diff --git a/src/webview/android/mod.rs b/src/webview/android/mod.rs index ee1f4692d..f794476f1 100644 --- a/src/webview/android/mod.rs +++ b/src/webview/android/mod.rs @@ -242,6 +242,20 @@ impl InnerWebView { } } +#[derive(Clone, Copy)] +pub struct JniHandle; + +impl JniHandle { + /// Execute jni code on the thread of the webview. + /// Provided function will be provided with the jni evironment, Android activity and WebView + pub fn exec(&self, func: F) + where + F: FnOnce(JNIEnv, JObject, JObject) + Send + 'static, + { + MainPipe::send(WebViewMessage::Jni(Box::new(func))); + } +} + pub fn platform_webview_version() -> Result { let (tx, rx) = bounded(1); MainPipe::send(WebViewMessage::GetWebViewVersion(tx)); diff --git a/src/webview/mod.rs b/src/webview/mod.rs index 8c35c07b7..d5d262d44 100644 --- a/src/webview/mod.rs +++ b/src/webview/mod.rs @@ -15,6 +15,8 @@ pub mod prelude { pub use super::android::{binding::*, setup}; } #[cfg(target_os = "android")] +pub use android::JniHandle; +#[cfg(target_os = "android")] use android::*; #[cfg(any( target_os = "linux", @@ -662,6 +664,19 @@ impl WebviewExtMacOS for WebView { } } +#[cfg(target_os = "android")] +/// Additional methods on `WebView` that are specific to Android +pub trait WebviewExtAndroid { + fn handle(&self) -> JniHandle; +} + +#[cfg(target_os = "android")] +impl WebviewExtAndroid for WebView { + fn handle(&self) -> JniHandle { + JniHandle + } +} + #[cfg(test)] mod tests { use super::*;