From 99c0b3d24a3845b2b8259e4ddce7525989ce3a55 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jan=20=C4=8Ce=C5=A1pivo?= Date: Sat, 28 Dec 2024 18:06:07 +0100 Subject: [PATCH 1/3] Use InputMethodManager#showSoftInput to show_soft_input --- android-activity/src/native_activity/mod.rs | 37 ++++++++++++++++----- 1 file changed, 29 insertions(+), 8 deletions(-) diff --git a/android-activity/src/native_activity/mod.rs b/android-activity/src/native_activity/mod.rs index 2adcd52..3f8ff72 100644 --- a/android-activity/src/native_activity/mod.rs +++ b/android-activity/src/native_activity/mod.rs @@ -351,16 +351,37 @@ impl AndroidAppInner { } } + fn jni_show_soft_input(&self, show_implicit: bool) -> Result<(), jni::errors::Error> { + let na = unsafe {jni::objects::JObject::from_raw(self.activity_as_ptr() as _)}; + let jvm = self.jvm.clone(); + let mut env = jvm.attach_current_thread()?; + let class_ctxt = env.find_class("android/content/Context")?; + let ims = env.get_static_field(class_ctxt, "INPUT_METHOD_SERVICE", "Ljava/lang/String;")?; + + let im_manager = env + .call_method(&na, "getSystemService", "(Ljava/lang/String;)Ljava/lang/Object;", &[ims.borrow()]) + .unwrap() + .l()?; + + let jni_window = env.call_method(na, "getWindow", "()Landroid/view/Window;", &[]).unwrap().l()?; + let view = env.call_method(jni_window, "getDecorView", "()Landroid/view/View;", &[]).unwrap().l()?; + + env.call_method( + im_manager, + "showSoftInput", + "(Landroid/view/View;I)Z", + &[ + jni::objects::JValue::Object(&view), + if show_implicit {(ndk_sys::ANATIVEACTIVITY_SHOW_SOFT_INPUT_IMPLICIT as i32).into()} else {0i32.into()} + ] + )?; + Ok(()) + } + // TODO: move into a trait pub fn show_soft_input(&self, show_implicit: bool) { - let na = self.native_activity(); - unsafe { - let flags = if show_implicit { - ndk_sys::ANATIVEACTIVITY_SHOW_SOFT_INPUT_IMPLICIT - } else { - 0 - }; - ndk_sys::ANativeActivity_showSoftInput(na as *mut _, flags); + if let Err(e) = self.jni_show_soft_input(show_implicit) { + error!("jni_show_soft_input: {e:?}"); } } From 0919742b4fd02f0a08e19256bb987a99ba66239c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jan=20=C4=8Ce=C5=A1pivo?= Date: Sat, 28 Dec 2024 18:24:42 +0100 Subject: [PATCH 2/3] replaced error handling with simple unwrap, it did not work at all anyway --- android-activity/src/native_activity/mod.rs | 27 +++++++-------------- 1 file changed, 9 insertions(+), 18 deletions(-) diff --git a/android-activity/src/native_activity/mod.rs b/android-activity/src/native_activity/mod.rs index 3f8ff72..868b7e9 100644 --- a/android-activity/src/native_activity/mod.rs +++ b/android-activity/src/native_activity/mod.rs @@ -351,20 +351,19 @@ impl AndroidAppInner { } } - fn jni_show_soft_input(&self, show_implicit: bool) -> Result<(), jni::errors::Error> { + // TODO: move into a trait + pub fn show_soft_input(&self, show_implicit: bool) { let na = unsafe {jni::objects::JObject::from_raw(self.activity_as_ptr() as _)}; let jvm = self.jvm.clone(); - let mut env = jvm.attach_current_thread()?; - let class_ctxt = env.find_class("android/content/Context")?; - let ims = env.get_static_field(class_ctxt, "INPUT_METHOD_SERVICE", "Ljava/lang/String;")?; + let mut env = jvm.attach_current_thread().unwrap(); + let class_ctxt = env.find_class("android/content/Context").unwrap(); + let ims = env.get_static_field(class_ctxt, "INPUT_METHOD_SERVICE", "Ljava/lang/String;").unwrap(); let im_manager = env - .call_method(&na, "getSystemService", "(Ljava/lang/String;)Ljava/lang/Object;", &[ims.borrow()]) - .unwrap() - .l()?; + .call_method(&na, "getSystemService", "(Ljava/lang/String;)Ljava/lang/Object;", &[ims.borrow()]).unwrap().l().unwrap(); - let jni_window = env.call_method(na, "getWindow", "()Landroid/view/Window;", &[]).unwrap().l()?; - let view = env.call_method(jni_window, "getDecorView", "()Landroid/view/View;", &[]).unwrap().l()?; + let jni_window = env.call_method(na, "getWindow", "()Landroid/view/Window;", &[]).unwrap().l().unwrap(); + let view = env.call_method(jni_window, "getDecorView", "()Landroid/view/View;", &[]).unwrap().l().unwrap(); env.call_method( im_manager, @@ -374,15 +373,7 @@ impl AndroidAppInner { jni::objects::JValue::Object(&view), if show_implicit {(ndk_sys::ANATIVEACTIVITY_SHOW_SOFT_INPUT_IMPLICIT as i32).into()} else {0i32.into()} ] - )?; - Ok(()) - } - - // TODO: move into a trait - pub fn show_soft_input(&self, show_implicit: bool) { - if let Err(e) = self.jni_show_soft_input(show_implicit) { - error!("jni_show_soft_input: {e:?}"); - } + ).unwrap(); } // TODO: move into a trait From d61558ccccbf26b32d7ad89f66885e1e5bcfb89a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jan=20=C4=8Ce=C5=A1pivo?= Date: Sat, 28 Dec 2024 18:32:42 +0100 Subject: [PATCH 3/3] cargo fmt --- android-activity/src/native_activity/mod.rs | 41 ++++++++++++++++----- 1 file changed, 32 insertions(+), 9 deletions(-) diff --git a/android-activity/src/native_activity/mod.rs b/android-activity/src/native_activity/mod.rs index 868b7e9..9884f55 100644 --- a/android-activity/src/native_activity/mod.rs +++ b/android-activity/src/native_activity/mod.rs @@ -353,17 +353,35 @@ impl AndroidAppInner { // TODO: move into a trait pub fn show_soft_input(&self, show_implicit: bool) { - let na = unsafe {jni::objects::JObject::from_raw(self.activity_as_ptr() as _)}; + let na = unsafe { jni::objects::JObject::from_raw(self.activity_as_ptr() as _) }; let jvm = self.jvm.clone(); let mut env = jvm.attach_current_thread().unwrap(); let class_ctxt = env.find_class("android/content/Context").unwrap(); - let ims = env.get_static_field(class_ctxt, "INPUT_METHOD_SERVICE", "Ljava/lang/String;").unwrap(); + let ims = env + .get_static_field(class_ctxt, "INPUT_METHOD_SERVICE", "Ljava/lang/String;") + .unwrap(); let im_manager = env - .call_method(&na, "getSystemService", "(Ljava/lang/String;)Ljava/lang/Object;", &[ims.borrow()]).unwrap().l().unwrap(); - - let jni_window = env.call_method(na, "getWindow", "()Landroid/view/Window;", &[]).unwrap().l().unwrap(); - let view = env.call_method(jni_window, "getDecorView", "()Landroid/view/View;", &[]).unwrap().l().unwrap(); + .call_method( + &na, + "getSystemService", + "(Ljava/lang/String;)Ljava/lang/Object;", + &[ims.borrow()], + ) + .unwrap() + .l() + .unwrap(); + + let jni_window = env + .call_method(na, "getWindow", "()Landroid/view/Window;", &[]) + .unwrap() + .l() + .unwrap(); + let view = env + .call_method(jni_window, "getDecorView", "()Landroid/view/View;", &[]) + .unwrap() + .l() + .unwrap(); env.call_method( im_manager, @@ -371,9 +389,14 @@ impl AndroidAppInner { "(Landroid/view/View;I)Z", &[ jni::objects::JValue::Object(&view), - if show_implicit {(ndk_sys::ANATIVEACTIVITY_SHOW_SOFT_INPUT_IMPLICIT as i32).into()} else {0i32.into()} - ] - ).unwrap(); + if show_implicit { + (ndk_sys::ANATIVEACTIVITY_SHOW_SOFT_INPUT_IMPLICIT as i32).into() + } else { + 0i32.into() + }, + ], + ) + .unwrap(); } // TODO: move into a trait