Fixed keyboard visibility listener for Android 14

This commit is contained in:
Sylvain Berfini 2023-06-15 15:52:37 +02:00
parent 53e9d92ea4
commit 32c8a098c5
4 changed files with 42 additions and 13 deletions

View file

@ -130,6 +130,8 @@ class MainActivity : GenericActivity(), SnackBarActivity, NavController.OnDestin
}
}
private val keyboardVisibilityListeners = arrayListOf<AppUtils.KeyboardVisibilityListener>()
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()
}

View file

@ -120,6 +120,17 @@ class DetailChatRoomFragment : MasterFragment<ChatRoomDetailFragmentBinding, Cha
}
}
private val keyboardVisibilityListener = object : AppUtils.KeyboardVisibilityListener {
override fun onKeyboardVisibilityChanged(visible: Boolean) {
if (visible && chatSendingViewModel.isEmojiPickerOpen.value == true) {
Log.d(
"[Chat Room] Emoji picker is opened, closing it because keyboard is now visible"
)
chatSendingViewModel.isEmojiPickerOpen.value = false
}
}
}
private lateinit var chatScrollListener: ChatScrollListener
override fun getLayoutId(): Int {
@ -202,15 +213,6 @@ class DetailChatRoomFragment : MasterFragment<ChatRoomDetailFragmentBinding, Cha
sharedViewModel.chatRoomFragmentOpenedEvent.value = Event(true)
}
binding.root.addKeyboardInsetListener { keyboardVisible ->
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<ChatRoomDetailFragmentBinding, Cha
"[Chat Room] Fragment resuming but viewModel lateinit property isn't initialized!"
)
}
(requireActivity() as MainActivity).addKeyboardVisibilityListener(
keyboardVisibilityListener
)
}
override fun onPause() {
@ -864,6 +870,10 @@ class DetailChatRoomFragment : MasterFragment<ChatRoomDetailFragmentBinding, Cha
// Conversation isn't visible anymore, any new message received in it will trigger a notification
coreContext.notificationsManager.currentlyDisplayedChatRoomAddress = null
(requireActivity() as MainActivity).removeKeyboardVisibilityListener(
keyboardVisibilityListener
)
super.onPause()
}

View file

@ -44,6 +44,10 @@ import org.linphone.core.tools.Log
* Various utility methods for application
*/
class AppUtils {
interface KeyboardVisibilityListener {
fun onKeyboardVisibilityChanged(visible: Boolean)
}
companion object {
private val emojiCompat: EmojiCompat?
get() = initEmojiCompat()

View file

@ -73,7 +73,7 @@ fun View.hideKeyboard() {
} catch (_: Exception) {}
}
fun View.addKeyboardInsetListener(lambda: (visible: Boolean) -> 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)
}
}
}