From d408b487cfd0681eb522c11d8692276885f3038c Mon Sep 17 00:00:00 2001 From: Alex Hart Date: Thu, 17 Sep 2026 12:38:24 -0300 Subject: [PATCH] Fix kb behavior after returning from an external app. --- .../securesms/components/InputPanel.java | 15 +++++++++------ .../conversation/v2/ChatInputController.kt | 4 +++- .../conversation/v2/ConversationFragment.kt | 6 ++++++ 3 files changed, 18 insertions(+), 7 deletions(-) diff --git a/app/src/main/java/org/thoughtcrime/securesms/components/InputPanel.java b/app/src/main/java/org/thoughtcrime/securesms/components/InputPanel.java index 676f6aaab1..f0b42bfbc3 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/components/InputPanel.java +++ b/app/src/main/java/org/thoughtcrime/securesms/components/InputPanel.java @@ -82,7 +82,6 @@ import java.util.concurrent.TimeUnit; public class InputPanel extends ConstraintLayout implements AudioRecordingHandler, - KeyboardAwareLinearLayout.OnKeyboardShownListener, EmojiEventListener, ConversationStickerSuggestionAdapter.EventListener { @@ -398,6 +397,15 @@ public class InputPanel extends ConstraintLayout return mediaKeyboard.isStickerMode(); } + /** True only while a keyboard of ours is the one on screen. */ + public void setMediaKeyboardToggleOffersIme(boolean offersIme) { + if (offersIme) { + mediaKeyboard.setToIme(); + } else { + mediaKeyboard.setToMedia(); + } + } + public View getMediaKeyboardToggleAnchorView() { return mediaKeyboard; } @@ -711,11 +719,6 @@ public class InputPanel extends ConstraintLayout return elapsedTime; } - @Override - public void onKeyboardShown() { - mediaKeyboard.setToMedia(); - } - @Override public void onKeyEvent(KeyEvent keyEvent) { composeText.dispatchKeyEvent(keyEvent); diff --git a/app/src/main/java/org/thoughtcrime/securesms/conversation/v2/ChatInputController.kt b/app/src/main/java/org/thoughtcrime/securesms/conversation/v2/ChatInputController.kt index ab48db4976..cb149a4abf 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/conversation/v2/ChatInputController.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/conversation/v2/ChatInputController.kt @@ -136,7 +136,9 @@ class ChatInputController( * @param showSoftKeyOnHide Whether the system keyboard replaces [key] when it is taken away. */ fun toggleInput(key: MediaKeyboardKey, imeTarget: EditText, showSoftKeyOnHide: Boolean = wasKeyboardVisibleBeforeToggle) { - if (controller.current == key) { + // Ours can sit behind the system keyboard rather than in place of it, where hiding it would act + // on something the user cannot see. The system keyboard goes instead. + if (controller.current == key && !isKeyboardShowing) { if (showSoftKeyOnHide) { showSoftkey(imeTarget) } else { diff --git a/app/src/main/java/org/thoughtcrime/securesms/conversation/v2/ConversationFragment.kt b/app/src/main/java/org/thoughtcrime/securesms/conversation/v2/ConversationFragment.kt index 1fc1ac1a27..af4f516d4b 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/conversation/v2/ConversationFragment.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/conversation/v2/ConversationFragment.kt @@ -5368,12 +5368,18 @@ class ConversationFragment : } override fun onKeyboardShown() { + // The toggle follows what is on screen: the system keyboard can cover one of ours, not just + // replace it. + inputPanel.setMediaKeyboardToggleOffersIme(false) + if (searchMenuItem?.isActionViewExpanded == true && searchMenuItem?.actionView?.hasFocus() == false) { searchMenuItem?.actionView?.requestFocus() } } override fun onKeyboardHidden() { + inputPanel.setMediaKeyboardToggleOffersIme(container.isInputShowing) + if (searchMenuItem?.isActionViewExpanded == true && searchMenuItem?.actionView?.hasFocus() == true) { searchMenuItem?.actionView?.clearFocus() }