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 af0786b48..11a30793a 100644 --- a/app/src/main/java/org/linphone/activities/main/MainActivity.kt +++ b/app/src/main/java/org/linphone/activities/main/MainActivity.kt @@ -130,6 +130,8 @@ class MainActivity : GenericActivity(), SnackBarActivity, NavController.OnDestin } } + private val keyboardVisibilityListeners = arrayListOf() + override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) @@ -237,13 +239,17 @@ class MainActivity : GenericActivity(), SnackBarActivity, NavController.OnDestin registerComponentCallbacks(componentCallbacks) findNavController(R.id.nav_host_fragment).addOnDestinationChangedListener(this) - binding.rootCoordinatorLayout.addKeyboardInsetListener { keyboardVisible -> + binding.rootCoordinatorLayout.setKeyboardInsetListener { keyboardVisible -> val portraitOrientation = resources.configuration.orientation != Configuration.ORIENTATION_LANDSCAPE Log.i( "[Main Activity] Keyboard is ${if (keyboardVisible) "visible" else "invisible"}, orientation is ${if (portraitOrientation) "portrait" else "landscape"}" ) shouldTabsBeVisibleDueToOrientationAndKeyboard = !portraitOrientation || !keyboardVisible updateTabsFragmentVisibility() + + for (listener in keyboardVisibilityListeners) { + listener.onKeyboardVisibilityChanged(keyboardVisible) + } } initOverlay() @@ -278,6 +284,14 @@ class MainActivity : GenericActivity(), SnackBarActivity, NavController.OnDestin updateTabsFragmentVisibility() } + fun addKeyboardVisibilityListener(listener: AppUtils.KeyboardVisibilityListener) { + keyboardVisibilityListeners.add(listener) + } + + fun removeKeyboardVisibilityListener(listener: AppUtils.KeyboardVisibilityListener) { + keyboardVisibilityListeners.remove(listener) + } + fun hideKeyboard() { currentFocus?.hideKeyboard() } 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 76269e963..ae5905ef7 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 @@ -120,6 +120,17 @@ class DetailChatRoomFragment : MasterFragment - if (keyboardVisible && chatSendingViewModel.isEmojiPickerOpen.value == true) { - Log.d( - "[Chat Room] Emoji picker is opened, closing it because keyboard is now visible" - ) - chatSendingViewModel.isEmojiPickerOpen.value = false - } - } - Compatibility.setLocusIdInContentCaptureSession(binding.root, chatRoom) isSecure = chatRoom.currentParams.isEncryptionEnabled @@ -845,6 +847,10 @@ class DetailChatRoomFragment : MasterFragment Unit) { +fun View.setKeyboardInsetListener(lambda: (visible: Boolean) -> Unit) { doOnLayout { var isKeyboardVisible = ViewCompat.getRootWindowInsets(this)?.isVisible( WindowInsetsCompat.Type.ime() @@ -81,8 +81,9 @@ fun View.addKeyboardInsetListener(lambda: (visible: Boolean) -> Unit) { lambda(isKeyboardVisible) + // See https://issuetracker.google.com/issues/281942480 ViewCompat.setOnApplyWindowInsetsListener( - this + rootView ) { view, insets -> val keyboardVisibilityChanged = ViewCompat.getRootWindowInsets(view) ?.isVisible(WindowInsetsCompat.Type.ime()) == true @@ -90,7 +91,7 @@ fun View.addKeyboardInsetListener(lambda: (visible: Boolean) -> Unit) { isKeyboardVisible = keyboardVisibilityChanged lambda(isKeyboardVisible) } - insets + ViewCompat.onApplyWindowInsets(view, insets) } } }