Ver Fonte

app: hide keyboard when opening emoji selector

darkfi há 9 meses atrás
pai
commit
149c3c7757
3 ficheiros alterados com 37 adições e 1 exclusões
  1. 10 0
      bin/app/java/MainActivity.java
  2. 13 0
      bin/app/src/android.rs
  3. 14 1
      bin/app/src/app/schema/chat.rs

+ 10 - 0
bin/app/java/MainActivity.java

@@ -9,6 +9,7 @@ import android.text.TextWatcher;
 import android.widget.EditText;
 import android.widget.EditText;
 import android.widget.TextView;
 import android.widget.TextView;
 import android.view.inputmethod.BaseInputConnection;
 import android.view.inputmethod.BaseInputConnection;
+import android.view.WindowInsets.Type;
 import java.util.HashMap;
 import java.util.HashMap;
 
 
 import autosuggest.InvisibleInputView;
 import autosuggest.InvisibleInputView;
@@ -180,6 +181,15 @@ public float getScreenDensity() {
     return getResources().getDisplayMetrics().density;
     return getResources().getDisplayMetrics().density;
 }
 }
 
 
+public boolean isImeVisible() {
+    View decorView = getWindow().getDecorView();
+    WindowInsets insets = decorView.getRootWindowInsets();
+    Insets imeInsets = insets.getInsets(WindowInsets.Type.ime());
+    if (imeInsets == null)
+        return false;
+    return insets.isVisible(Type.ime());
+}
+
 //% END
 //% END
 
 
 //% MAIN_ACTIVITY_ON_CREATE
 //% MAIN_ACTIVITY_ON_CREATE

+ 13 - 0
bin/app/src/android.rs

@@ -52,6 +52,15 @@ macro_rules! call_mainactivity_float_method {
         }
         }
     }};
     }};
 }
 }
+macro_rules! call_mainactivity_bool_method {
+    ($method:expr) => {{
+        unsafe {
+            let env = android::attach_jni_env();
+            ndk_utils::call_method!(CallBooleanMethod, env, android::ACTIVITY, $method, "()Z") !=
+                0u8
+        }
+    }};
+}
 
 
 struct GlobalData {
 struct GlobalData {
     senders: HashMap<usize, async_channel::Sender<AndroidSuggestEvent>>,
     senders: HashMap<usize, async_channel::Sender<AndroidSuggestEvent>>,
@@ -335,3 +344,7 @@ pub fn get_keyboard_height() -> usize {
 pub fn get_screen_density() -> f32 {
 pub fn get_screen_density() -> f32 {
     call_mainactivity_float_method!("getScreenDensity")
     call_mainactivity_float_method!("getScreenDensity")
 }
 }
+
+pub fn is_ime_visible() -> bool {
+    call_mainactivity_bool_method!("isImeVisible")
+}

+ 14 - 1
bin/app/src/app/schema/chat.rs

@@ -177,6 +177,14 @@ fn android_keyboard_height() -> f32 {
     unreachable!()
     unreachable!()
 }
 }
 
 
+fn is_ime_visible() -> bool {
+    #[cfg(target_os = "android")]
+    return crate::android::is_ime_visible();
+
+    #[cfg(not(target_os = "android"))]
+    false
+}
+
 pub async fn make(
 pub async fn make(
     app: &App,
     app: &App,
     window: SceneNodePtr,
     window: SceneNodePtr,
@@ -946,6 +954,7 @@ pub async fn make(
     prop.set_f32(atom, Role::App, 2, EMOJIBTN_BOX[2]).unwrap();
     prop.set_f32(atom, Role::App, 2, EMOJIBTN_BOX[2]).unwrap();
     prop.set_f32(atom, Role::App, 3, EMOJIBTN_BOX[3]).unwrap();
     prop.set_f32(atom, Role::App, 3, EMOJIBTN_BOX[3]).unwrap();
 
 
+    // Chatedit is clicked and requests keyboard. Only show if emoji picker isnt visible.
     let (slot, recvr) = Slot::new("reqkeyb");
     let (slot, recvr) = Slot::new("reqkeyb");
     chatedit_node.register("focus_request", slot).unwrap();
     chatedit_node.register("focus_request", slot).unwrap();
     let chatedit_node2 = chatedit_node.clone();
     let chatedit_node2 = chatedit_node.clone();
@@ -960,6 +969,7 @@ pub async fn make(
     });
     });
     app.tasks.lock().unwrap().push(listen_click);
     app.tasks.lock().unwrap().push(listen_click);
 
 
+    // Emoji button is clicked
     let (slot, recvr) = Slot::new("emoji_clicked");
     let (slot, recvr) = Slot::new("emoji_clicked");
     let chatedit_node2 = chatedit_node.clone();
     let chatedit_node2 = chatedit_node.clone();
     node.register("click", slot).unwrap();
     node.register("click", slot).unwrap();
@@ -988,7 +998,8 @@ pub async fn make(
             }
             }
 
 
             if emoji_btn_is_visible.get() {
             if emoji_btn_is_visible.get() {
-                chatedit_node2.call_method("focus", vec![]).await.unwrap();
+                // Open emoji panel and close IME keyboard
+                chatedit_node2.call_method("unfocus", vec![]).await.unwrap();
 
 
                 assert!(!emoji_close_is_visible.get());
                 assert!(!emoji_close_is_visible.get());
                 assert!(emoji_h_prop.get() < 0.001);
                 assert!(emoji_h_prop.get() < 0.001);
@@ -1000,6 +1011,8 @@ pub async fn make(
                 //    msleep(10).await;
                 //    msleep(10).await;
                 //}
                 //}
             } else {
             } else {
+                assert!(!is_ime_visible());
+                // Hide emoji panel and show the keyboard
                 chatedit_node2.call_method("focus", vec![]).await.unwrap();
                 chatedit_node2.call_method("focus", vec![]).await.unwrap();
 
 
                 assert!(emoji_close_is_visible.get());
                 assert!(emoji_close_is_visible.get());