Fixed keyboard visibility listener for Android 14
This commit is contained in:
parent
53e9d92ea4
commit
32c8a098c5
4 changed files with 42 additions and 13 deletions
|
@ -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()
|
||||
}
|
||||
|
|
|
@ -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()
|
||||
}
|
||||
|
||||
|
|
|
@ -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()
|
||||
|
|
|
@ -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)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue