From a11e66f404fe644fee16d6d5bf17c0d8334fd22a Mon Sep 17 00:00:00 2001 From: Sylvain Berfini Date: Thu, 6 Apr 2023 15:35:13 +0200 Subject: [PATCH] Improved how we detect soft keyboard visibility + using that to hide emoji picker when keyboard is opened --- .../linphone/activities/main/MainActivity.kt | 6 +---- .../chat/fragments/DetailChatRoomFragment.kt | 6 +++++ .../org/linphone/utils/DataBindingUtils.kt | 25 ++++++++++++++++++- app/src/main/res/values-land/dimen.xml | 4 +++ 4 files changed, 35 insertions(+), 6 deletions(-) create mode 100644 app/src/main/res/values-land/dimen.xml diff --git a/app/src/main/java/org/linphone/activities/main/MainActivity.kt b/app/src/main/java/org/linphone/activities/main/MainActivity.kt index af2f51350..36790c307 100644 --- a/app/src/main/java/org/linphone/activities/main/MainActivity.kt +++ b/app/src/main/java/org/linphone/activities/main/MainActivity.kt @@ -30,8 +30,6 @@ import android.view.MotionEvent import android.view.View import androidx.annotation.StringRes import androidx.core.splashscreen.SplashScreen.Companion.installSplashScreen -import androidx.core.view.ViewCompat -import androidx.core.view.WindowInsetsCompat import androidx.core.view.doOnAttach import androidx.databinding.DataBindingUtil import androidx.fragment.app.FragmentContainerView @@ -205,10 +203,8 @@ class MainActivity : GenericActivity(), SnackBarActivity, NavController.OnDestin registerComponentCallbacks(componentCallbacks) findNavController(R.id.nav_host_fragment).addOnDestinationChangedListener(this) - binding.rootCoordinatorLayout.viewTreeObserver.addOnGlobalLayoutListener { + binding.rootCoordinatorLayout.addKeyboardInsetListener { keyboardVisible -> val portraitOrientation = resources.configuration.orientation != Configuration.ORIENTATION_LANDSCAPE - val keyboardVisible = ViewCompat.getRootWindowInsets(binding.rootCoordinatorLayout) - ?.isVisible(WindowInsetsCompat.Type.ime()) == true Log.d("[Tabs Fragment] Keyboard is ${if (keyboardVisible) "visible" else "invisible"}") shouldTabsBeVisibleDueToOrientationAndKeyboard = !portraitOrientation || !keyboardVisible updateTabsFragmentVisibility() diff --git a/app/src/main/java/org/linphone/activities/main/chat/fragments/DetailChatRoomFragment.kt b/app/src/main/java/org/linphone/activities/main/chat/fragments/DetailChatRoomFragment.kt index 61a280e9e..c9307db1a 100644 --- a/app/src/main/java/org/linphone/activities/main/chat/fragments/DetailChatRoomFragment.kt +++ b/app/src/main/java/org/linphone/activities/main/chat/fragments/DetailChatRoomFragment.kt @@ -190,6 +190,12 @@ class DetailChatRoomFragment : MasterFragment + if (keyboardVisible && chatSendingViewModel.isEmojiPickerOpen.value == true) { + chatSendingViewModel.isEmojiPickerOpen.value = false + } + } + Compatibility.setLocusIdInContentCaptureSession(binding.root, chatRoom) isSecure = chatRoom.currentParams.isEncryptionEnabled diff --git a/app/src/main/java/org/linphone/utils/DataBindingUtils.kt b/app/src/main/java/org/linphone/utils/DataBindingUtils.kt index 94e7454ba..5d943e499 100644 --- a/app/src/main/java/org/linphone/utils/DataBindingUtils.kt +++ b/app/src/main/java/org/linphone/utils/DataBindingUtils.kt @@ -33,6 +33,9 @@ import android.widget.SeekBar.OnSeekBarChangeListener import androidx.appcompat.content.res.AppCompatResources import androidx.constraintlayout.widget.ConstraintLayout import androidx.constraintlayout.widget.Guideline +import androidx.core.view.ViewCompat +import androidx.core.view.WindowInsetsCompat +import androidx.core.view.doOnLayout import androidx.databinding.* import androidx.emoji2.emojipicker.EmojiPickerView import androidx.emoji2.emojipicker.EmojiViewItem @@ -67,7 +70,27 @@ fun View.hideKeyboard() { val imm = context.getSystemService(Activity.INPUT_METHOD_SERVICE) as InputMethodManager imm.hideSoftInputFromWindow(windowToken, 0) - } catch (e: Exception) {} + } catch (_: Exception) {} +} + +fun View.addKeyboardInsetListener(lambda: (visible: Boolean) -> Unit) { + doOnLayout { + var isKeyboardVisible = ViewCompat.getRootWindowInsets(this)?.isVisible(WindowInsetsCompat.Type.ime()) == true + + lambda(isKeyboardVisible) + + ViewCompat.setOnApplyWindowInsetsListener( + this + ) { view, insets -> + val keyboardVisibilityChanged = ViewCompat.getRootWindowInsets(view) + ?.isVisible(WindowInsetsCompat.Type.ime()) == true + if (keyboardVisibilityChanged != isKeyboardVisible) { + isKeyboardVisible = keyboardVisibilityChanged + lambda(isKeyboardVisible) + } + insets + } + } } @BindingAdapter("android:src") diff --git a/app/src/main/res/values-land/dimen.xml b/app/src/main/res/values-land/dimen.xml new file mode 100644 index 000000000..19eaa83b7 --- /dev/null +++ b/app/src/main/res/values-land/dimen.xml @@ -0,0 +1,4 @@ + + + 240dp + \ No newline at end of file